ohzi-core 7.0.0 → 7.0.1
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/LICENSE +1 -1
- package/README.md +9 -9
- package/build/index.module.js +1 -1
- package/build/index.module.js.map +1 -1
- package/package.json +51 -51
- package/src/.vscode/settings.json +2 -2
- package/src/BaseApplication.js +23 -23
- package/src/Browser.js +79 -79
- package/src/CameraManager.js +19 -19
- package/src/Capabilities.js +11 -11
- package/src/Configuration.js +22 -22
- package/src/CustomBezierCurve.js +44 -44
- package/src/Debug.js +260 -260
- package/src/EventManager.js +150 -150
- package/src/Graphics.js +337 -337
- package/src/Initializer.js +57 -57
- package/src/Input.js +66 -66
- package/src/KeyboardInput.js +135 -135
- package/src/OS.js +58 -58
- package/src/OScreen.js +74 -74
- package/src/OrthographicCamera.js +21 -21
- package/src/PerspectiveCamera.js +21 -21
- package/src/ReflectionPlaneContext.js +17 -17
- package/src/RenderLayers.js +28 -28
- package/src/RenderLoop.js +97 -97
- package/src/RenderOrder.js +38 -38
- package/src/ResourceContainer.js +39 -39
- package/src/SceneManager.js +44 -44
- package/src/Screen.js +54 -54
- package/src/Time.js +57 -57
- package/src/UI.js +90 -90
- package/src/action_sequencer/ActionEvent.js +15 -15
- package/src/action_sequencer/ActionInterpolator.js +23 -23
- package/src/action_sequencer/ActionSequencer.js +245 -245
- package/src/action_sequencer/NumberInterpolator.js +25 -25
- package/src/action_sequencer/VectorInterpolator.js +20 -20
- package/src/blitter_index.js +13 -13
- package/src/canvas_drawer/CanvasDrawer.js +111 -111
- package/src/canvas_drawer/MultiLineTextDrawer.js +49 -49
- package/src/canvas_drawer/SimpleTextDrawer.js +47 -47
- package/src/components/AudioClip.js +55 -55
- package/src/components/AxisHelper.js +58 -58
- package/src/components/BaseObject.js +45 -45
- package/src/components/EdgeMesh.js +151 -151
- package/src/components/GeometryEdgeVisualizer.js +45 -45
- package/src/components/Grid.js +33 -33
- package/src/components/Line.js +199 -199
- package/src/components/MultiLinePath.js +19 -19
- package/src/components/MultiLineText2D.js +62 -62
- package/src/components/ObjectAxis.js +20 -20
- package/src/components/ObjectOrientedBoundingBox.js +201 -201
- package/src/components/PlaneHelper.js +36 -36
- package/src/components/Shape2D.js +42 -42
- package/src/components/Shape3D.js +38 -38
- package/src/components/Text2D.js +39 -39
- package/src/components/UIElement.js +208 -208
- package/src/components/UpdatableMaterialMesh.js +16 -16
- package/src/components/WorldImage.js +91 -91
- package/src/components/mouse_interactors/ObjectRotator.js +61 -61
- package/src/components/sdf_text/SDFText.js +154 -154
- package/src/components/sdf_text/SDFTextBatch.js +193 -193
- package/src/components/sdf_text/TextGlyph.js +15 -15
- package/src/data_textures/CustomDataTexture.js +51 -51
- package/src/data_textures/RGBADataTexture.js +12 -12
- package/src/data_textures/RGBAFloatDataTexture.js +12 -12
- package/src/data_textures/RGBDataTexture.js +12 -12
- package/src/data_textures/RGBFloatDataTexture.js +12 -12
- package/src/editor/ManipulatorHandle.js +70 -70
- package/src/editor/ObjectEditor.js +66 -66
- package/src/editor/ObjectManipulator.js +118 -118
- package/src/editor/ObjectPicker.js +75 -75
- package/src/editor/shaders/object_picker.frag +5 -5
- package/src/editor/shaders/object_picker.vert +7 -7
- package/src/gpu_particles/GPUParticleSystem.js +87 -87
- package/src/gpu_particles/ParticleAttribute.js +83 -83
- package/src/gpu_particles/ParticlePositionAttribute.js +20 -20
- package/src/html_utilities/CSSAnimator.js +64 -64
- package/src/html_utilities/css_animator_states/Animating.js +44 -44
- package/src/html_utilities/css_animator_states/Idle.js +25 -25
- package/src/index.js +217 -217
- package/src/materials/AddMaterial.js +17 -17
- package/src/materials/AlphaFilterMaterial.js +20 -20
- package/src/materials/BaseShaderMaterial.js +19 -19
- package/src/materials/BlitMaterial.js +28 -28
- package/src/materials/BloomComposeMaterial.js +22 -22
- package/src/materials/BoxBlurMaterial.js +13 -13
- package/src/materials/ClearAlphaMaterial.js +13 -13
- package/src/materials/ClearColorMaterial.js +31 -31
- package/src/materials/ClearDepthNormalMaterial.js +13 -13
- package/src/materials/DeferredRendererComposeMaterial.js +32 -32
- package/src/materials/DepthNormalMaterial.js +28 -28
- package/src/materials/DisplayNormalTextureMaterial.js +15 -15
- package/src/materials/DualFilteringBlurMaterial.js +11 -11
- package/src/materials/FXAAMaterial.js +10 -10
- package/src/materials/GaussianBlurMaterial.js +28 -28
- package/src/materials/LuminosityHighPassMaterial.js +15 -15
- package/src/materials/MedianFilterMaterial.js +42 -42
- package/src/materials/NormalMaterial.js +17 -17
- package/src/materials/SDFScreenTextMaterial.js +31 -31
- package/src/materials/SDFTextMaterial.js +38 -38
- package/src/materials/SSAOComposeMaterial.js +11 -11
- package/src/materials/SSAOMaterial.js +65 -65
- package/src/materials/ScreenSpaceTextureMaterial.js +65 -65
- package/src/materials/UIElementMaterial.js +27 -27
- package/src/materials/UnrealBloomComposeMaterial.js +95 -95
- package/src/materials/UnrealBlurMaterial.js +17 -17
- package/src/materials/UnrealComposeMaterial.js +24 -24
- package/src/materials/ViewPositionMaterial.js +17 -17
- package/src/materials/deferred/DeferredPointLightMaterial.js +39 -39
- package/src/materials/gpu_particles/AttributeUpdateMaterial.js +33 -33
- package/src/materials/gpu_particles/BasicParticleMaterial.js +23 -23
- package/src/materials/gpu_particles/ParticleStorageMaterial.js +27 -27
- package/src/materials/gpu_particles/PositionStorageMaterial.js +10 -10
- package/src/object_pool/Pool.js +73 -73
- package/src/primitives/Arrow.js +57 -57
- package/src/primitives/Cube.js +17 -17
- package/src/primitives/HorizontalPlane.js +18 -18
- package/src/primitives/Sphere.js +15 -15
- package/src/primitives/VerticalPlane.js +17 -17
- package/src/raycast/GroupRaycaster.js +41 -41
- package/src/raycast/PlaneDragResolver.js +89 -89
- package/src/raycast/PlaneRaycastResolver.js +22 -22
- package/src/raycast/PlaneRaycaster.js +23 -23
- package/src/raycast/RaycastResolver.js +22 -22
- package/src/raycast/SurfaceDragResolver.js +77 -77
- package/src/raycast/states/BaseState.js +16 -16
- package/src/raycast/states/IdleState.js +17 -17
- package/src/raycast/states/OnRaycastEnter.js +15 -15
- package/src/raycast/states/OnRaycastExit.js +16 -16
- package/src/raycast/states/OnRaycastHover.js +25 -25
- package/src/render_mode/BaseRender.js +32 -32
- package/src/render_mode/BloomRender.js +61 -61
- package/src/render_mode/DebugNormalsRender.js +20 -20
- package/src/render_mode/DeferredRender.js +112 -112
- package/src/render_mode/NormalAORender.js +71 -71
- package/src/render_mode/NormalRender.js +36 -36
- package/src/render_mode/OutlineRender.js +154 -154
- package/src/render_mode/PlanarReflectionsRender.js +118 -118
- package/src/render_mode/TransparencyMixRender.js +143 -143
- package/src/render_mode/UnrealBloomRender.js +109 -109
- package/src/render_utilities/Blitter.js +99 -99
- package/src/render_utilities/Blurrer.js +29 -29
- package/src/render_utilities/DepthAndNormalsRenderer.js +45 -45
- package/src/render_utilities/DualFilteringBlurrer.js +56 -56
- package/src/render_utilities/GaussianBlurrer.js +146 -146
- package/src/render_utilities/MedianFilter.js +66 -66
- package/src/render_utilities/ViewPositionRenderer.js +48 -48
- package/src/resource_loader/BasisLoader.js +49 -49
- package/src/resource_loader/FontLoader.js +46 -46
- package/src/resource_loader/JSONLoader.js +30 -30
- package/src/resource_loader/OBJLoader.js +46 -46
- package/src/resource_loader/PointArrayLoader.js +70 -70
- package/src/resource_loader/RGBETextureLoader.js +46 -46
- package/src/resource_loader/VideoLoader.js +30 -30
- package/src/shaders/add/add.frag +8 -8
- package/src/shaders/anti_aliasing/fxaa.frag +71 -71
- package/src/shaders/basic_color/basic_color.frag +5 -5
- package/src/shaders/basic_color/basic_color.vert +9 -9
- package/src/shaders/basic_line/basic_line.frag +36 -36
- package/src/shaders/basic_line/basic_line.vert +36 -36
- package/src/shaders/basic_texture/basic_texture.frag +9 -9
- package/src/shaders/basic_texture/basic_texture.vert +16 -16
- package/src/shaders/bloom/bloom_compose_frag.glsl +22 -22
- package/src/shaders/bloom/cheap_bloom_compose_frag.glsl +13 -13
- package/src/shaders/box_blur/box_blur.frag +24 -24
- package/src/shaders/box_blur/compose.frag +31 -31
- package/src/shaders/clear/clear_depth_normal.frag +24 -24
- package/src/shaders/copy/copy.frag +6 -6
- package/src/shaders/copy/copy.vert +5 -5
- package/src/shaders/deferred/blit_copy.vert +11 -11
- package/src/shaders/deferred/deferred_compose.frag +59 -59
- package/src/shaders/deferred/point_light.frag +66 -66
- package/src/shaders/deferred/point_light.vert +13 -13
- package/src/shaders/depth_normals/debug_normals.frag +47 -47
- package/src/shaders/depth_normals/depth_normals.frag +30 -30
- package/src/shaders/depth_normals/depth_normals.vert +12 -12
- package/src/shaders/dual_filter_blur/alpha_filter.frag +14 -14
- package/src/shaders/dual_filter_blur/downsample.frag +21 -21
- package/src/shaders/dual_filter_blur/upsample.frag +24 -24
- package/src/shaders/edge_visualizer/edge_visualizer.frag +17 -17
- package/src/shaders/edge_visualizer/edge_visualizer.vert +15 -15
- package/src/shaders/edges/corners.frag +10 -10
- package/src/shaders/edges/corners.vert +30 -30
- package/src/shaders/edges/edges.frag +6 -6
- package/src/shaders/edges/edges.vert +27 -27
- package/src/shaders/gaussian_blur/gaussian_blur.frag +24 -24
- package/src/shaders/gaussian_blur/unreal_bloom_compose.frag +24 -24
- package/src/shaders/gpu_particles/common_utils.glsl +12 -12
- package/src/shaders/gpu_particles/generic_storage.frag +7 -7
- package/src/shaders/gpu_particles/store/store_position.vert +14 -14
- package/src/shaders/gpu_particles/update/basic_update.frag +20 -20
- package/src/shaders/gpu_particles/visualize/visualize.frag +10 -10
- package/src/shaders/gpu_particles/visualize/visualize.vert +12 -12
- package/src/shaders/grid/grid.frag +16 -16
- package/src/shaders/grid/grid.vert +9 -9
- package/src/shaders/luminosity_high_pass/luminosity_high_pass.frag +22 -22
- package/src/shaders/median_filter/median_filter.frag +134 -134
- package/src/shaders/normal/normal.frag +6 -6
- package/src/shaders/normal/normal.vert +6 -6
- package/src/shaders/sdf_text/sdf_screen_text.frag +51 -51
- package/src/shaders/sdf_text/sdf_screen_text.vert +41 -41
- package/src/shaders/sdf_text/sdf_text.frag +53 -53
- package/src/shaders/sdf_text/sdf_text.vert +41 -41
- package/src/shaders/ssao/hbao.frag +264 -264
- package/src/shaders/ssao/ssao.frag +95 -95
- package/src/shaders/ssao/ssao.vert +10 -10
- package/src/shaders/ssao/ssao_compose.frag +14 -14
- package/src/shaders/transparent_mix/copy.frag +6 -6
- package/src/shaders/transparent_mix/transparent_mix.frag +18 -18
- package/src/shaders/transparent_mix/transparent_mix.vert +7 -7
- package/src/shaders/ui/ss_texture.frag +10 -10
- package/src/shaders/ui/ss_texture.vert +31 -31
- package/src/shaders/ui/ws_texture.vert +38 -38
- package/src/shaders/ui_element/ui_element.frag +11 -11
- package/src/shaders/ui_element/ui_element.vert +32 -32
- package/src/shaders/unreal_blur/unreal_blur.frag +24 -24
- package/src/shaders/unreal_blur/unreal_compose.frag +23 -23
- package/src/shaders/write_view_position/write_view_position.frag +6 -6
- package/src/shaders/write_view_position/write_view_position.vert +8 -8
- package/src/static_batcher/BatchedMesh.js +54 -54
- package/src/static_batcher/GeometryBatch.js +312 -312
- package/src/static_batcher/GeometryBatcher.js +63 -63
- package/src/static_batcher/MeshBatcher.js +56 -56
- package/src/ui/ui_element_position/ScreenSpacePosition.js +14 -14
- package/src/ui/ui_element_position/WorldSpacePosition.js +21 -21
- package/src/ui/ui_element_state/OnIdle.js +17 -17
- package/src/ui/ui_element_state/OnMouseEnter.js +26 -26
- package/src/ui/ui_element_state/OnMouseExit.js +15 -15
- package/src/ui/ui_element_state/OnMouseHover.js +31 -31
- package/src/ui/ui_element_state/UIElementState.js +18 -18
- package/src/utilities/ArrayUtilities.js +55 -55
- package/src/utilities/CameraUtilities.js +210 -210
- package/src/utilities/EasingFunctions.js +226 -226
- package/src/utilities/FrustumPointFitter.js +255 -255
- package/src/utilities/GeometryUtilities.js +74 -74
- package/src/utilities/HTMLUtilities.js +44 -44
- package/src/utilities/ImageUtilities.js +26 -26
- package/src/utilities/MeshSampler.js +205 -205
- package/src/utilities/ModelUtilities.js +161 -161
- package/src/utilities/OMath.js +154 -154
- package/src/utilities/OrthographicFrustumPointFitter.js +47 -47
- package/src/utilities/PerspectiveFrustumPointFitter.js +251 -251
- package/src/utilities/StringUtilities.js +32 -32
- package/src/utilities/TimeUtilities.js +22 -22
- package/src/utilities/Validation.js +34 -34
- package/src/view_components/ApplicationView.js +75 -75
- package/src/view_components/ViewComponent.js +72 -72
- package/src/view_components/ViewComponentManager.js +68 -68
- package/src/view_components/ViewContext.js +14 -14
- package/src/view_components/ViewManager.js +189 -189
- package/src/view_components/ViewState.js +54 -54
- package/src/view_components/transition/ActionSequencerBuilder.js +122 -106
- package/src/view_components/transition/DrawIOAnimationSheet.js +90 -90
- package/src/view_components/transition/TransitionTable.js +54 -54
- package/src/view_components/transition/ViewStateTransitionHandler.js +96 -96
- package/types/BaseApplication.d.ts +8 -8
- package/types/Browser.d.ts +12 -12
- package/types/CameraManager.d.ts +8 -8
- package/types/Capabilities.d.ts +6 -6
- package/types/Configuration.d.ts +6 -6
- package/types/Debug.d.ts +38 -38
- package/types/EventManager.d.ts +42 -42
- package/types/Graphics.d.ts +35 -35
- package/types/Initializer.d.ts +4 -4
- package/types/Input.d.ts +170 -170
- package/types/OS.d.ts +18 -18
- package/types/OScreen.d.ts +18 -18
- package/types/OrthographicCamera.d.ts +5 -5
- package/types/PerspectiveCamera.d.ts +5 -5
- package/types/ReflectionPlaneContext.d.ts +6 -6
- package/types/RenderLayers.d.ts +6 -6
- package/types/RenderLoop.d.ts +12 -12
- package/types/ResourceContainer.d.ts +8 -8
- package/types/SceneManager.d.ts +10 -10
- package/types/Screen.d.ts +17 -17
- package/types/Time.d.ts +11 -11
- package/types/UI.d.ts +15 -15
- package/types/action_sequencer/ActionEvent.d.ts +6 -6
- package/types/action_sequencer/ActionInterpolator.d.ts +5 -5
- package/types/action_sequencer/ActionSequencer.d.ts +30 -30
- package/types/action_sequencer/NumberInterpolator.d.ts +8 -8
- package/types/action_sequencer/VectorInterpolator.d.ts +7 -7
- package/types/canvas_drawer/CanvasDrawer.d.ts +13 -13
- package/types/canvas_drawer/MultiLineTextDrawer.d.ts +5 -5
- package/types/canvas_drawer/SimpleTextDrawer.d.ts +5 -5
- package/types/components/AudioClip.d.ts +12 -12
- package/types/components/AxisHelper.d.ts +6 -6
- package/types/components/BaseObject.d.ts +5 -5
- package/types/components/EdgeMesh.d.ts +13 -13
- package/types/components/GeometryEdgeVisualizer.d.ts +4 -4
- package/types/components/Grid.d.ts +2 -2
- package/types/components/Line.d.ts +16 -16
- package/types/components/MultiLinePath.d.ts +4 -4
- package/types/components/MultiLineText2D.d.ts +10 -10
- package/types/components/ObjectAxis.d.ts +3 -3
- package/types/components/ObjectOrientedBoundingBox.d.ts +18 -18
- package/types/components/PlaneHelper.d.ts +6 -6
- package/types/components/Shape2D.d.ts +4 -4
- package/types/components/Shape3D.d.ts +3 -3
- package/types/components/Text2D.d.ts +13 -13
- package/types/components/UIElement.d.ts +52 -52
- package/types/components/UpdatableMaterialMesh.d.ts +4 -4
- package/types/components/WorldImage.d.ts +13 -13
- package/types/components/sdf_text/SDFText.d.ts +30 -30
- package/types/components/sdf_text/SDFTextBatch.d.ts +12 -12
- package/types/components/sdf_text/TextGlyph.d.ts +6 -6
- package/types/editor/ManipulatorHandle.d.ts +14 -14
- package/types/editor/ObjectEditor.d.ts +16 -16
- package/types/editor/ObjectManipulator.d.ts +19 -19
- package/types/editor/ObjectPicker.d.ts +16 -16
- package/types/gpu_particles/GPUParticleSystem.d.ts +12 -12
- package/types/gpu_particles/ParticleAttribute.d.ts +15 -15
- package/types/gpu_particles/ParticlePositionAttribute.d.ts +4 -4
- package/types/html_utilities/CSSAnimator.d.ts +30 -30
- package/types/html_utilities/css_animator_states/Animating.d.ts +8 -8
- package/types/html_utilities/css_animator_states/Idle.d.ts +6 -6
- package/types/index.d.ts +90 -90
- package/types/materials/AddMaterial.d.ts +5 -5
- package/types/materials/AlphaFilterMaterial.d.ts +6 -6
- package/types/materials/BaseShaderMaterial.d.ts +3 -3
- package/types/materials/BlitMaterial.d.ts +3 -3
- package/types/materials/BloomComposeMaterial.d.ts +7 -7
- package/types/materials/BoxBlurMaterial.d.ts +4 -4
- package/types/materials/ClearAlphaMaterial.d.ts +3 -3
- package/types/materials/ClearColorMaterial.d.ts +7 -7
- package/types/materials/ClearDepthNormalMaterial.d.ts +4 -4
- package/types/materials/DeferredRendererComposeMaterial.d.ts +7 -7
- package/types/materials/DepthNormalMaterial.d.ts +4 -4
- package/types/materials/DisplayNormalTextureMaterial.d.ts +4 -4
- package/types/materials/DualFilteringBlurMaterial.d.ts +4 -4
- package/types/materials/FXAAMaterial.d.ts +3 -3
- package/types/materials/GaussianBlurMaterial.d.ts +6 -6
- package/types/materials/LuminosityHighPassMaterial.d.ts +4 -4
- package/types/materials/MedianFilterMaterial.d.ts +6 -6
- package/types/materials/NormalMaterial.d.ts +2 -2
- package/types/materials/SDFScreenTextMaterial.d.ts +11 -11
- package/types/materials/SDFTextMaterial.d.ts +12 -12
- package/types/materials/SSAOComposeMaterial.d.ts +4 -4
- package/types/materials/SSAOMaterial.d.ts +6 -6
- package/types/materials/ScreenSpaceTextureMaterial.d.ts +7 -7
- package/types/materials/UIElementMaterial.d.ts +7 -7
- package/types/materials/UnrealBloomComposeMaterial.d.ts +17 -17
- package/types/materials/UnrealBlurMaterial.d.ts +4 -4
- package/types/materials/UnrealComposeMaterial.d.ts +4 -4
- package/types/materials/ViewPositionMaterial.d.ts +3 -3
- package/types/materials/deferred/DeferredPointLightMaterial.d.ts +10 -10
- package/types/materials/gpu_particles/ParticleStorageMaterial.d.ts +3 -3
- package/types/materials/gpu_particles/PositionStorageMaterial.d.ts +4 -4
- package/types/object_pool/Pool.d.ts +10 -10
- package/types/primitives/Arrow.d.ts +8 -8
- package/types/primitives/Cube.d.ts +3 -3
- package/types/primitives/HorizontalPlane.d.ts +3 -3
- package/types/primitives/Sphere.d.ts +3 -3
- package/types/primitives/VerticalPlane.d.ts +3 -3
- package/types/raycast/GroupRaycaster.d.ts +13 -13
- package/types/raycast/PlaneDragResolver.d.ts +14 -14
- package/types/raycast/PlaneRaycastResolver.d.ts +5 -5
- package/types/raycast/PlaneRaycaster.d.ts +7 -7
- package/types/raycast/RaycastResolver.d.ts +5 -5
- package/types/raycast/SurfaceDragResolver.d.ts +13 -13
- package/types/raycast/states/BaseState.d.ts +5 -5
- package/types/raycast/states/IdleState.d.ts +5 -5
- package/types/raycast/states/OnRaycastEnter.d.ts +5 -5
- package/types/raycast/states/OnRaycastExit.d.ts +4 -4
- package/types/raycast/states/OnRaycastHover.d.ts +4 -4
- package/types/render_mode/BaseRender.d.ts +7 -7
- package/types/render_mode/BloomRender.d.ts +10 -10
- package/types/render_mode/DebugNormalsRender.d.ts +4 -4
- package/types/render_mode/DeferredRender.d.ts +9 -9
- package/types/render_mode/NormalAORender.d.ts +16 -16
- package/types/render_mode/NormalRender.d.ts +4 -4
- package/types/render_mode/OutlineRender.d.ts +20 -20
- package/types/render_mode/PlanarReflectionsRender.d.ts +13 -13
- package/types/render_mode/TransparencyMixRender.d.ts +21 -21
- package/types/render_mode/UnrealBloomRender.d.ts +19 -19
- package/types/render_utilities/Blitter.d.ts +16 -16
- package/types/render_utilities/Blurrer.d.ts +9 -9
- package/types/render_utilities/DepthAndNormalsRenderer.d.ts +12 -12
- package/types/render_utilities/DualFilteringBlurrer.d.ts +19 -19
- package/types/render_utilities/GaussianBlurrer.d.ts +27 -27
- package/types/render_utilities/MedianFilter.d.ts +10 -10
- package/types/render_utilities/ViewPositionRenderer.d.ts +9 -9
- package/types/resource_loader/AbstractLoader.d.ts +18 -18
- package/types/resource_loader/AsyncTextureLoader.ts +6 -6
- package/types/resource_loader/AudioLoader.d.ts +8 -8
- package/types/resource_loader/BasisLoader.d.ts +6 -6
- package/types/resource_loader/CubemapLoader.d.ts +7 -7
- package/types/resource_loader/DAELoader.d.ts +6 -6
- package/types/resource_loader/DDSLoader.d.ts +6 -6
- package/types/resource_loader/FileLoader.d.ts +6 -6
- package/types/resource_loader/FontLoader.d.ts +6 -6
- package/types/resource_loader/GLTFDRACOLoader.d.ts +6 -6
- package/types/resource_loader/GLTFLoader.d.ts +5 -5
- package/types/resource_loader/HDRCubeTextureLoader.d.ts +7 -7
- package/types/resource_loader/JSONLoader.d.ts +6 -6
- package/types/resource_loader/OBJLoader.d.ts +6 -6
- package/types/resource_loader/PointArrayLoader.d.ts +7 -7
- package/types/resource_loader/RGBETextureLoader.d.ts +6 -6
- package/types/resource_loader/ResourceBatch.d.ts +13 -13
- package/types/resource_loader/SVGLoader.d.ts +6 -6
- package/types/resource_loader/TextLoader.d.ts +6 -6
- package/types/resource_loader/TextureLoader.d.ts +6 -6
- package/types/resource_loader/VideoLoader.d.ts +6 -6
- package/types/static_batcher/GeometryBatch.d.ts +37 -37
- package/types/static_batcher/GeometryBatcher.d.ts +7 -7
- package/types/ui/ui_element_position/ScreenSpacePosition.d.ts +4 -4
- package/types/ui/ui_element_position/WorldSpacePosition.d.ts +5 -5
- package/types/ui/ui_element_state/OnIdle.d.ts +5 -5
- package/types/ui/ui_element_state/OnMouseEnter.d.ts +5 -5
- package/types/ui/ui_element_state/OnMouseExit.d.ts +5 -5
- package/types/ui/ui_element_state/OnMouseHover.d.ts +5 -5
- package/types/ui/ui_element_state/UIElementState.d.ts +5 -5
- package/types/utilities/ArrayUtilities.d.ts +7 -7
- package/types/utilities/CameraUtilities.d.ts +24 -24
- package/types/utilities/EasingFunctions.d.ts +35 -35
- package/types/utilities/FrustumPointFitter.d.ts +14 -14
- package/types/utilities/GeometryUtilities.d.ts +4 -4
- package/types/utilities/HTMLUtilities.d.ts +10 -10
- package/types/utilities/ImageUtilities.d.ts +4 -4
- package/types/utilities/MeshSampler.d.ts +14 -14
- package/types/utilities/ModelUtilities.d.ts +13 -13
- package/types/utilities/OMath.d.ts +21 -21
- package/types/utilities/ObjectUtilities.d.ts +16 -16
- package/types/utilities/OrthographicFrustumPointFitter.d.ts +7 -7
- package/types/utilities/PerspectiveFrustumPointFitter.d.ts +12 -12
- package/types/utilities/StringUtilities.d.ts +5 -5
- package/types/utilities/TimeUtilities.d.ts +3 -3
- package/types/utilities/Validation.d.ts +6 -6
- package/types/view_components/ApplicationView.d.ts +20 -20
- package/types/view_components/ViewComponent.d.ts +15 -15
- package/types/view_components/ViewComponentManager.d.ts +10 -10
- package/types/view_components/ViewContext.d.ts +6 -6
- package/types/view_components/ViewManager.d.ts +24 -24
- package/types/view_components/ViewState.d.ts +15 -15
- package/types/view_components/transition/ActionSequencerBuilder.d.ts +15 -15
- package/types/view_components/transition/DrawIOAnimationSheet.d.ts +17 -17
- package/types/view_components/transition/TransitionTable.d.ts +8 -8
- package/types/view_components/transition/ViewStateTransitionHandler.d.ts +16 -16
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.module.js","sources":["../src/Browser.js","../src/utilities/Validation.js","../src/resource_loader/AbstractLoader.js","../src/utilities/OMath.js","../src/action_sequencer/ActionSequencer.js","../src/utilities/EasingFunctions.js","../src/action_sequencer/ActionInterpolator.js","../src/action_sequencer/NumberInterpolator.js","../src/view_components/ViewContext.js","../src/action_sequencer/ActionEvent.js","../src/view_components/transition/DrawIOAnimationSheet.js","../src/view_components/transition/ActionSequencerBuilder.js","../src/EventManager.js","../src/ResourceContainer.js","../src/utilities/HTMLUtilities.js","../src/view_components/transition/TransitionTable.js","../src/Time.js","../src/view_components/ViewState.js","../src/view_components/transition/ViewStateTransitionHandler.js","../src/view_components/ViewManager.js","../src/view_components/ApplicationView.js","../src/BaseApplication.js","../src/render_mode/BaseRender.js","../src/materials/BaseShaderMaterial.js","../src/materials/BlitMaterial.js","../src/CameraManager.js","../src/Capabilities.js","../src/canvas_drawer/CanvasDrawer.js","../src/Configuration.js","../src/html_utilities/css_animator_states/Idle.js","../src/html_utilities/css_animator_states/Animating.js","../src/html_utilities/CSSAnimator.js","../src/components/AxisHelper.js","../src/SceneManager.js","../src/primitives/Cube.js","../src/primitives/Sphere.js","../src/primitives/Arrow.js","../src/OScreen.js","../src/materials/ScreenSpaceTextureMaterial.js","../src/PerspectiveCamera.js","../src/Debug.js","../src/materials/ClearDepthNormalMaterial.js","../src/materials/DepthNormalMaterial.js","../src/render_utilities/DepthAndNormalsRenderer.js","../src/render_utilities/Blitter.js","../src/Graphics.js","../src/materials/NormalMaterial.js","../src/render_mode/DebugNormalsRender.js","../src/KeyboardInput.js","../src/Input.js","../src/OS.js","../src/ReflectionPlaneContext.js","../src/static_batcher/GeometryBatch.js","../src/static_batcher/GeometryBatcher.js","../src/UI.js","../src/utilities/CameraUtilities.js","../src/Initializer.js","../src/materials/SSAOMaterial.js","../src/materials/SSAOComposeMaterial.js","../src/materials/DisplayNormalTextureMaterial.js","../src/materials/BoxBlurMaterial.js","../src/render_utilities/Blurrer.js","../src/render_mode/NormalAORender.js","../src/render_mode/NormalRender.js","../src/materials/UnrealBloomComposeMaterial.js","../src/materials/AddMaterial.js","../src/materials/GaussianBlurMaterial.js","../src/materials/LuminosityHighPassMaterial.js","../src/render_utilities/GaussianBlurrer.js","../src/render_mode/UnrealBloomRender.js","../src/OrthographicCamera.js","../src/view_components/ViewComponentManager.js","../src/RenderLoop.js","../src/Screen.js","../src/canvas_drawer/SimpleTextDrawer.js","../src/view_components/ViewComponent.js","../src/primitives/HorizontalPlane.js","../src/primitives/VerticalPlane.js","../src/utilities/ArrayUtilities.js","../src/utilities/FrustumPointFitter.js","../src/utilities/GeometryUtilities.js","../src/utilities/ImageUtilities.js","../src/utilities/MeshSampler.js","../src/utilities/ModelUtilities.js","../src/utilities/ObjectUtilities.js","../src/utilities/StringUtilities.js","../src/utilities/TimeUtilities.js","../src/utilities/PerspectiveFrustumPointFitter.js","../src/utilities/OrthographicFrustumPointFitter.js","../src/components/Grid.js","../src/components/Line.js","../src/components/WorldImage.js","../src/components/Text2D.js","../src/materials/UIElementMaterial.js","../src/ui/ui_element_position/ScreenSpacePosition.js","../src/ui/ui_element_position/WorldSpacePosition.js","../src/ui/ui_element_state/UIElementState.js","../src/ui/ui_element_state/OnIdle.js","../src/ui/ui_element_state/OnMouseEnter.js","../src/ui/ui_element_state/OnMouseExit.js","../src/ui/ui_element_state/OnMouseHover.js","../src/components/UIElement.js","../src/components/UpdatableMaterialMesh.js","../src/components/sdf_text/TextGlyph.js","../src/components/sdf_text/SDFText.js","../src/materials/SDFTextMaterial.js","../src/components/sdf_text/SDFTextBatch.js","../src/action_sequencer/VectorInterpolator.js","../src/materials/MedianFilterMaterial.js","../src/render_utilities/MedianFilter.js","../src/materials/DualFilteringBlurMaterial.js","../src/materials/AlphaFilterMaterial.js","../src/render_utilities/DualFilteringBlurrer.js","../src/gpu_particles/GPUParticleSystem.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":["\r\nclass Browser\r\n{\r\n init()\r\n {\r\n this.browser_name = '';\r\n this.agent = window.navigator.userAgent.toLowerCase();\r\n\r\n switch (true)\r\n {\r\n case this.agent.indexOf('edge') > -1:\r\n this.browser_name = 'edge_ie';\r\n break;\r\n case this.agent.indexOf('edg') > -1:\r\n this.browser_name = 'edge_chromium';\r\n break;\r\n case this.agent.indexOf('opr') > -1 && !!window.opr:\r\n this.browser_name = 'opera';\r\n break;\r\n case this.agent.indexOf('chrome') > -1 && !!window.chrome:\r\n this.browser_name = 'chrome';\r\n break;\r\n case this.agent.indexOf('trident') > -1:\r\n this.browser_name = 'iexplorer';\r\n break;\r\n case this.agent.indexOf('firefox') > -1:\r\n this.browser_name = 'firefox';\r\n break;\r\n case this.agent.indexOf('safari') > -1:\r\n this.browser_name = 'safari';\r\n break;\r\n default:\r\n this.browser_name = 'other';\r\n break;\r\n }\r\n }\r\n\r\n get name()\r\n {\r\n return this.browser_name;\r\n }\r\n\r\n get is_safari()\r\n {\r\n return this.browser_name === 'safari';\r\n }\r\n\r\n get is_chrome()\r\n {\r\n return this.browser_name === 'chrome';\r\n }\r\n\r\n get is_edge()\r\n {\r\n return this.browser_name === 'edge_ie';\r\n }\r\n\r\n get is_edge_chromium()\r\n {\r\n return this.browser_name === 'edge_chromium';\r\n }\r\n\r\n get has_webm()\r\n {\r\n return this.is_chrome || this.is_firefox || this.is_edge_chromium;\r\n }\r\n\r\n get has_hvec()\r\n {\r\n return this.is_safari;\r\n }\r\n\r\n get preferred_video_extension()\r\n {\r\n return this.has_webm ? 'webm' : this.has_hvec ? 'hvec.mp4' : 'mp4';\r\n }\r\n}\r\n\r\nexport default new Browser();\r\n","export default class Validation\r\n{\r\n constructor()\r\n {}\r\n\r\n static is_int(n)\r\n {\r\n return Number(n) === n && n % 1 === 0;\r\n }\r\n\r\n static is_float(n)\r\n {\r\n return Number(n) === n && n % 1 !== 0;\r\n }\r\n\r\n static is_number(n)\r\n {\r\n return this.is_int(n) || this.is_float(n);\r\n }\r\n\r\n static is_json(str)\r\n {\r\n try\r\n {\r\n JSON.parse(str);\r\n }\r\n catch (e)\r\n {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n}\r\n","import Browser from '../Browser';\r\nimport Validation from '../utilities/Validation';\r\n\r\nexport default class AbstractLoader\r\n{\r\n constructor(resource_id, url, size = 1)\r\n {\r\n this.resource_id = resource_id;\r\n this.url = url;\r\n this.loaded_bytes = 0;\r\n this.total_bytes = size;\r\n\r\n this.has_finished = false;\r\n this.has_error = false;\r\n this.error_message = 'none';\r\n }\r\n\r\n __update_downloaded_bytes(loaded, total)\r\n {\r\n loaded = Validation.is_number(loaded) ? loaded : 1;\r\n total = Validation.is_number(total) ? total : 1;\r\n\r\n this.loaded_bytes = loaded;\r\n\r\n if (total > 0)\r\n {\r\n this.total_bytes = total;\r\n }\r\n\r\n if (this.loaded_bytes > this.total_bytes)\r\n {\r\n console.warn('Total bytes is smaller than loaded ones. Please set total bytes by hand to:', this.url);\r\n }\r\n }\r\n\r\n __loading_ended()\r\n {\r\n this.has_finished = true;\r\n }\r\n\r\n __set_error(message)\r\n {\r\n this.has_error = true;\r\n this.error_message = message;\r\n }\r\n\r\n print_error()\r\n {\r\n console.error('Error while loading ' + this.resource_id + '\\n\\t path: ' + this.url + '\\n\\t\\t' + this.error_message);\r\n }\r\n\r\n load(resource_container)\r\n {\r\n 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","import { Vector3 } from 'three';\r\n\r\nexport default class OMath\r\n{\r\n constructor()\r\n {}\r\n\r\n static linear_map(value,\r\n from_range_start_value,\r\n from_range_end_value,\r\n to_range_start_value,\r\n to_range_end_value)\r\n {\r\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;\r\n }\r\n\r\n static between(value, min, max)\r\n {\r\n return (value >= min && value <= max);\r\n }\r\n\r\n static mod(number, divisor)\r\n {\r\n return ((number % divisor) + divisor) % divisor;\r\n }\r\n\r\n static rgb_to_hex(rgb)\r\n {\r\n rgb.r = Math.round(rgb.r * 255).toString(16);\r\n rgb.g = Math.round(rgb.g * 255).toString(16);\r\n rgb.b = Math.round(rgb.b * 255).toString(16);\r\n\r\n if (rgb.r.length === 1)\r\n {\r\n rgb.r = '0' + rgb.r;\r\n }\r\n if (rgb.g.length === 1)\r\n {\r\n rgb.g = '0' + rgb.g;\r\n }\r\n if (rgb.b.length === 1)\r\n {\r\n rgb.b = '0' + rgb.b;\r\n }\r\n\r\n return '#' + rgb.r + rgb.g + rgb.b;\r\n }\r\n\r\n static project_points_on_plane(points, plane)\r\n {\r\n const projected_point = new Vector3();\r\n const points_on_plane = [];\r\n for (let i = 0; i < points.length; i++)\r\n {\r\n plane.projectPoint(points[i], projected_point);\r\n points_on_plane.push(projected_point.clone());\r\n }\r\n\r\n return points_on_plane;\r\n }\r\n\r\n static matrix4_lerp(from, to, target, t)\r\n {\r\n for (let i = 0; i < 16; i++)\r\n {\r\n target.elements[i] = this.lerp(from.elements[i], to.elements[i], t);\r\n }\r\n }\r\n\r\n static equals(x1, x2)\r\n {\r\n return Math.abs(x1 - x2) < 0.000001;\r\n }\r\n\r\n static lerp(x, y, t)\r\n {\r\n return (1 - t) * x + t * y;\r\n }\r\n\r\n static clamp(value, min, max)\r\n {\r\n return Math.max(min, Math.min(max, value));\r\n }\r\n\r\n static euclideanModulo(n, m)\r\n {\r\n return ((n % m) + m) % m;\r\n }\r\n\r\n static pingpong(x, length = 1)\r\n {\r\n return length - Math.abs(OMath.euclideanModulo(x, length * 2) - length);\r\n }\r\n\r\n static degToRad(degrees)\r\n {\r\n return degrees * (Math.PI / 180);\r\n }\r\n\r\n static radToDeg(radians)\r\n {\r\n return radians * (180 / Math.PI);\r\n }\r\n\r\n static deg_to_rad(degrees)\r\n {\r\n return degrees * (Math.PI / 180);\r\n }\r\n\r\n static rad_to_deg(radians)\r\n {\r\n return radians * (180 / Math.PI);\r\n }\r\n\r\n static perspective_divide(v)\r\n {\r\n v.x /= v.w;\r\n v.y /= v.w;\r\n v.z /= v.w;\r\n return v;\r\n }\r\n\r\n static points_average(points)\r\n {\r\n const center = points[0].clone();\r\n for (let i = 1; i < points.length; i++)\r\n {\r\n center.add(points[i]);\r\n }\r\n center.multiplyScalar(1 / points.length);\r\n return center;\r\n }\r\n\r\n static get_random_color()\r\n {\r\n const arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 'a', 'b', 'c', 'd', 'e', 'f'];\r\n\r\n let col = '#';\r\n col += arr[Math.floor(Math.random() * 16)];\r\n col += arr[Math.floor(Math.random() * 16)];\r\n\r\n col += arr[Math.floor(Math.random() * 16)];\r\n col += arr[Math.floor(Math.random() * 16)];\r\n\r\n col += arr[Math.floor(Math.random() * 16)];\r\n col += arr[Math.floor(Math.random() * 16)];\r\n return col;\r\n }\r\n\r\n static saturate(x)\r\n {\r\n return OMath.clamp(x, 0, 1);\r\n }\r\n}\r\n","\r\nimport OMath from '../utilities/OMath';\r\n\r\nexport default class ActionSequencer\r\n{\r\n constructor(context)\r\n {\r\n this.elapsed_time = -0.00001;\r\n this.playback_speed = 1;\r\n this.playing = false;\r\n\r\n this.action_events = [];\r\n this.context = context;\r\n\r\n this.initial_context = JSON.parse(JSON.stringify(context));\r\n\r\n this.tmp_t = 0;\r\n\r\n this.channels = {};\r\n\r\n const channel_names = Object.keys(context);\r\n for (let i = 0; i < channel_names.length; i++)\r\n {\r\n this.channels[channel_names[i]] = [];\r\n }\r\n\r\n this.duration = 0;\r\n }\r\n\r\n play()\r\n {\r\n this.playing = true;\r\n }\r\n\r\n stop()\r\n {\r\n this.playing = false;\r\n }\r\n\r\n reset()\r\n {\r\n this.elapsed_time = -0.00001;\r\n }\r\n\r\n skip()\r\n {\r\n const duration = this.get_duration();\r\n this.__play_clips(this.elapsed_time, duration + 0.0001);\r\n this.elapsed_time = duration;\r\n }\r\n\r\n update(delta_time)\r\n {\r\n if (this.playing)\r\n {\r\n this.__play_clips(this.elapsed_time, this.elapsed_time + delta_time * this.playback_speed);\r\n this.elapsed_time = this.elapsed_time + delta_time * this.playback_speed;\r\n }\r\n }\r\n\r\n set_progress(time)\r\n {\r\n this.elapsed_time = OMath.clamp(time, 0, this.duration);\r\n this.__play_clips(this.elapsed_time, this.elapsed_time);\r\n }\r\n\r\n set_normalized_progress(t)\r\n {\r\n this.elapsed_time = OMath.clamp(t, 0, 1) * this.duration;\r\n this.__play_clips(this.elapsed_time, this.elapsed_time);\r\n }\r\n\r\n get_progress()\r\n {\r\n return OMath.clamp(this.elapsed_time / this.get_duration(), 0, 1);\r\n }\r\n\r\n is_finished()\r\n {\r\n return this.elapsed_time > this.get_duration();\r\n }\r\n\r\n add_action_event(trigger_time, action)\r\n {\r\n this.action_events.push({\r\n trigger_time: trigger_time,\r\n action: action\r\n });\r\n\r\n this.duration = Math.max(this.duration, trigger_time);\r\n }\r\n\r\n add_action_interpolator(from, to, interpolator, use_dynamic_from_value = false)\r\n {\r\n if (use_dynamic_from_value)\r\n {\r\n const keyframes = this.channels[interpolator.attribute_name];\r\n\r\n if (keyframes === undefined)\r\n {\r\n console.error(`${interpolator.attribute_name} missing in initial state data.`);\r\n }\r\n\r\n if (keyframes.length === 0)\r\n {\r\n interpolator.from = this.initial_context[interpolator.attribute_name];\r\n }\r\n else\r\n {\r\n interpolator.from = keyframes[keyframes.length - 1].interpolator.to;\r\n }\r\n }\r\n\r\n const keyframe = {\r\n from: from,\r\n to: to,\r\n interpolator: interpolator\r\n };\r\n\r\n this.duration = Math.max(this.duration, to);\r\n this.channels[interpolator.attribute_name].push(keyframe);\r\n }\r\n\r\n get_current_target_value(name)\r\n {\r\n const keyframe = this.__get_current_keyframe(name, this.elapsed_time);\r\n\r\n if (this.elapsed_time < keyframe.from)\r\n {\r\n return keyframe.interpolator.evaluate(0);\r\n }\r\n\r\n return keyframe.interpolator.evaluate(1);\r\n }\r\n\r\n get_current_starting_value(name)\r\n {\r\n const keyframe = this.__get_current_keyframe(name, this.elapsed_time);\r\n\r\n return keyframe.interpolator.evaluate(0);\r\n }\r\n\r\n get_current_progress(name)\r\n {\r\n const keyframe = this.__get_current_keyframe(name, this.elapsed_time);\r\n const t = this.__linear_map_01(this.elapsed_time, keyframe.from, keyframe.to);\r\n\r\n return keyframe.interpolator.easing_function(t);\r\n }\r\n\r\n get_duration()\r\n {\r\n return this.duration;\r\n }\r\n\r\n __play_clips(from, to)\r\n {\r\n for (let i = 0; i < this.action_events.length; i++)\r\n {\r\n if (this.action_events[i].trigger_time > from - Number.EPSILON &&\r\n this.action_events[i].trigger_time < to + Number.EPSILON)\r\n {\r\n // console.log(\"Play event: \" + this.action_events[i].action.constructor.name + \" at \"+ this.action_events[i].trigger_time);\r\n this.action_events[i].action.trigger();\r\n }\r\n }\r\n const channel_names = Object.keys(this.initial_context);\r\n\r\n for (let i = 0; i < channel_names.length; i++)\r\n {\r\n const name = channel_names[i];\r\n const keyframe = this.__get_current_keyframe(name, from);\r\n\r\n this.context[name] = this.evaluate_keyframe(keyframe, from);\r\n }\r\n }\r\n\r\n evaluate_keyframe(keyframe, time)\r\n {\r\n this.tmp_t = this.__linear_map_01(time, keyframe.from, keyframe.to);\r\n\r\n return keyframe.interpolator.evaluate(OMath.clamp(this.tmp_t, 0, 1));\r\n }\r\n\r\n get_keyframes(channel_name)\r\n {\r\n return this.channels[channel_name];\r\n }\r\n\r\n is_channel_redefined(channel_name)\r\n {\r\n for (let i = 0; i < this.channels[channel_name].length; i++)\r\n {\r\n const keyframe = this.channels[channel_name][i];\r\n\r\n if (keyframe.interpolator.initial)\r\n {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n __linear_map_01(value,\r\n from_range_start_value,\r\n from_range_end_value)\r\n {\r\n return OMath.saturate(((value - from_range_start_value) / (from_range_end_value - from_range_start_value)) * (1 - 0) + 0);\r\n }\r\n\r\n __get_current_keyframe(channel_name, time)\r\n {\r\n let current = undefined;\r\n\r\n const keyframes = this.channels[channel_name];\r\n\r\n for (let i = 0; i < keyframes.length; i++)\r\n {\r\n const keyframe = keyframes[i];\r\n\r\n if (time >= keyframe.from && time <= keyframe.to)\r\n {\r\n current = keyframe;\r\n return current;\r\n }\r\n }\r\n\r\n let min = Infinity;\r\n\r\n for (let i = 0; i < keyframes.length; i++)\r\n {\r\n const keyframe = keyframes[i];\r\n const distance = Math.abs(keyframe.to - time);\r\n\r\n if (distance < min)\r\n {\r\n current = keyframe;\r\n min = distance;\r\n }\r\n }\r\n\r\n return current;\r\n }\r\n}\r\n","class EasingFunctions\r\n{\r\n constructor()\r\n { }\r\n\r\n linear(x)\r\n {\r\n return x;\r\n }\r\n\r\n triangular(x)\r\n {\r\n return 1 - Math.abs((x * 2) % (1 * 2) - 1);\r\n }\r\n\r\n ease_in_sine(x)\r\n {\r\n return 1 - Math.cos(x * 3.1415926 / 2);\r\n }\r\n\r\n ease_out_sine(x)\r\n {\r\n return Math.sin(x * 3.1415926 / 2);\r\n }\r\n\r\n ease_in_out_sine(x)\r\n {\r\n return -(Math.cos(3.1415926 * x) - 1) / 2;\r\n }\r\n\r\n ease_in_cubic(x)\r\n {\r\n return x * x * x;\r\n }\r\n\r\n ease_out_cubic(x)\r\n {\r\n return 1 - Math.pow(1 - x, 3);\r\n }\r\n\r\n ease_in_out_cubic(x)\r\n {\r\n return x < 0.5\r\n ? 4 * x * x * x\r\n : 1 - Math.pow(-2 * x + 2, 3) / 2;\r\n }\r\n\r\n ease_in_quad(x)\r\n {\r\n return x * x;\r\n }\r\n\r\n ease_out_quad(x)\r\n {\r\n return 1 - (1 - x) * (1 - x);\r\n }\r\n\r\n ease_in_out_quad(x)\r\n {\r\n return x < 0.5\r\n ? 2 * x * x\r\n : 1 - Math.pow(-2 * x + 2, 2) / 2;\r\n }\r\n\r\n ease_in_quart(x)\r\n {\r\n return x * x * x * x;\r\n }\r\n\r\n ease_out_quart(x)\r\n {\r\n return 1 - Math.pow(1 - x, 4);\r\n }\r\n\r\n ease_in_out_quart(x)\r\n {\r\n return x < 0.5\r\n ? 8 * x * x * x * x\r\n : 1 - Math.pow(-2 * x + 2, 4) / 2;\r\n }\r\n\r\n ease_in_quint(x)\r\n {\r\n return x * x * x * x * x;\r\n }\r\n\r\n ease_out_quint(x)\r\n {\r\n return 1 - Math.pow(1 - x, 5);\r\n }\r\n\r\n ease_in_out_quint(x)\r\n {\r\n return x < 0.5\r\n ? 16 * x * x * x * x * x\r\n : 1 - Math.pow(-2 * x + 2, 5) / 2;\r\n }\r\n\r\n ease_in_expo(x)\r\n {\r\n return x === 0 ? 0 : Math.pow(2, 10 * x - 10);\r\n }\r\n\r\n ease_out_expo(x)\r\n {\r\n return x === 1 ? 1 : 1 - Math.pow(2, -10 * x);\r\n }\r\n\r\n ease_in_out_expo(x)\r\n {\r\n return x === 0\r\n ? 0\r\n : x === 1\r\n ? 1\r\n : x < 0.5\r\n ? Math.pow(2, 20 * x - 10) / 2\r\n : (2 - Math.pow(2, -20 * x + 10)) / 2;\r\n }\r\n\r\n ease_in_circ(x)\r\n {\r\n return 1 - Math.sqrt(1 - Math.pow(x, 2));\r\n }\r\n\r\n ease_out_circ(x)\r\n {\r\n return Math.sqrt(1 - Math.pow(x - 1, 2));\r\n }\r\n\r\n ease_in_out_circ(x)\r\n {\r\n return x < 0.5\r\n ? (1 - Math.sqrt(1 - Math.pow(2 * x, 2))) / 2\r\n : (Math.sqrt(1 - Math.pow(-2 * x + 2, 2)) + 1) / 2;\r\n }\r\n\r\n ease_in_back(x)\r\n {\r\n return 2.7015 * x * x * x - 1.7015 * x * x;\r\n }\r\n\r\n ease_out_back(x)\r\n {\r\n return 1 + 2.7015 * Math.pow(x - 1, 3) + 1.7015 * Math.pow(x - 1, 2);\r\n }\r\n\r\n ease_in_out_back(x)\r\n {\r\n return x < 0.5\r\n ? (Math.pow(2 * x, 2) * ((2.5949095 + 1) * 2 * x - 2.5949095)) / 2\r\n : (Math.pow(2 * x - 2, 2) * ((2.5949095 + 1) * (x * 2 - 2) + 2.5949095) + 2) / 2;\r\n }\r\n\r\n ease_in_elastic(x)\r\n {\r\n const c4 = (2 * Math.PI) / 3;\r\n\r\n return x === 0\r\n ? 0\r\n : x === 1\r\n ? 1\r\n : -Math.pow(2, 10 * x - 10) * Math.sin((x * 10 - 10.75) * c4);\r\n }\r\n\r\n ease_out_elastic(x)\r\n {\r\n return x === 0\r\n ? 0\r\n : x === 1\r\n ? 1\r\n : Math.pow(2, -10 * x) * Math.sin((x * 10 - 0.75) * 2.0943950) + 1;\r\n }\r\n\r\n ease_in_out_elastic(x)\r\n {\r\n return x === 0\r\n ? 0\r\n : x === 1\r\n ? 1\r\n : x < 0.5\r\n ? -(Math.pow(2, 20 * x - 10) * Math.sin((20 * x - 11.125) * 1.3962633)) / 2\r\n : Math.pow(2, -20 * x + 10) * Math.sin((20 * x - 11.125) * 1.3962633) / 2 + 1;\r\n }\r\n\r\n ease_in_bounce(x)\r\n {\r\n return 1 - this.ease_out_bounce(1 - x);\r\n }\r\n\r\n ease_out_bounce(x)\r\n {\r\n const n1 = 7.5625;\r\n const d1 = 2.75;\r\n\r\n if (x < 1 / d1)\r\n {\r\n return n1 * x * x;\r\n }\r\n else if (x < 2 / d1)\r\n {\r\n return n1 * (x -= 1.5 / d1) * x + 0.75;\r\n }\r\n else if (x < 2.5 / d1)\r\n {\r\n return n1 * (x -= 2.25 / d1) * x + 0.9375;\r\n }\r\n else\r\n {\r\n return n1 * (x -= 2.625 / d1) * x + 0.984375;\r\n }\r\n }\r\n\r\n ease_in_out_bounce(x)\r\n {\r\n return x < 0.5\r\n ? (1 - this.ease_out_bounce(1 - 2 * x)) / 2\r\n : (1 + this.ease_out_bounce(2 * x - 1)) / 2;\r\n }\r\n\r\n heartbeat(t)\r\n {\r\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;\r\n }\r\n}\r\n\r\nexport default new EasingFunctions();\r\n","import EasingFunctions from '../utilities/EasingFunctions';\r\n\r\nexport default class ActionInterpolator\r\n{\r\n constructor(easing_function = 'linear')\r\n {\r\n this.easing_function = undefined;\r\n\r\n if (typeof easing_function === 'string')\r\n {\r\n this.easing_function = EasingFunctions[easing_function];\r\n }\r\n else\r\n {\r\n this.easing_function = easing_function;\r\n }\r\n }\r\n\r\n update(context, t)\r\n {\r\n\r\n }\r\n}\r\n","import ActionInterpolator from './ActionInterpolator';\r\nimport OMath from '../utilities/OMath';\r\n\r\nexport default class NumberInterpolator extends ActionInterpolator\r\n{\r\n constructor(attribute_name, from = 0, to = 1, initial = false, easing_function = 'linear')\r\n {\r\n super(easing_function);\r\n\r\n this.attribute_name = attribute_name;\r\n this.from = from;\r\n this.to = to;\r\n this.initial = initial;\r\n }\r\n\r\n update(context, t)\r\n {\r\n context[this.attribute_name] = OMath.lerp(this.from, this.to, this.easing_function(t));\r\n }\r\n\r\n evaluate(t)\r\n {\r\n return OMath.lerp(this.from, this.to, this.easing_function(t));\r\n }\r\n}\r\n","class ViewContext\r\n{\r\n constructor()\r\n {\r\n this.app = undefined;\r\n }\r\n\r\n set_app(app)\r\n {\r\n this.app = app;\r\n }\r\n}\r\n\r\nexport default new ViewContext();\r\n","import ViewContext from '../view_components/ViewContext';\r\n\r\nexport default class ActionEvent\r\n{\r\n constructor(name, method)\r\n {\r\n this.name = name;\r\n this.method = method;\r\n }\r\n\r\n trigger()\r\n {\r\n ViewContext.app[this.name][this.method]();\r\n }\r\n}\r\n","export default class DrawIOAnimationSheet\r\n{\r\n constructor()\r\n {\r\n\r\n }\r\n\r\n parse(xml_document)\r\n {\r\n const doc = new DOMParser().parseFromString(xml_document, 'text/xml');\r\n\r\n const animation_nodes = doc.querySelectorAll('mxGeometry');\r\n\r\n const animation_tracks = [];\r\n const triggers = [];\r\n\r\n for (let i = 0; i < animation_nodes.length; i++)\r\n {\r\n const node = animation_nodes[i];\r\n const parent_node = node.parentElement;\r\n const data = parent_node.getAttribute('value');\r\n\r\n const x_pos = this.get_node_x_position(node);\r\n\r\n const from = x_pos / 100;\r\n const duration = parseFloat(node.getAttribute('width')) / 100;\r\n\r\n // is trigger\r\n if (parent_node.getAttribute('style').includes('rhombus;'))\r\n {\r\n const split_data = data.split('.');\r\n const trigger_name = split_data[0];\r\n const trigger_method = split_data[1];\r\n\r\n triggers.push({\r\n name: trigger_name,\r\n method: trigger_method,\r\n at_time: from + duration * 0.5\r\n });\r\n }\r\n\r\n const valid_element = parent_node.getAttribute('style').includes('rounded=0;') &&\r\n !parent_node.getAttribute('style').includes('text;');\r\n\r\n if (valid_element && data !== '' && !data.includes(' '))\r\n {\r\n const split_data = data.split('=');\r\n\r\n const attribute_name = split_data[0];\r\n\r\n const value_data = split_data[1].split('--');\r\n const to_value = parseFloat(value_data[0]);\r\n const easing_function = value_data[1];\r\n\r\n if (split_data.length !== 2)\r\n {\r\n console.error('DrawIO data is malformed:', data);\r\n }\r\n\r\n if (value_data.length !== 2)\r\n {\r\n console.error('DrawIO data is malformed:', data);\r\n }\r\n\r\n animation_tracks.push({\r\n attribute_name: attribute_name,\r\n from_time: from,\r\n to_time: from + duration,\r\n to_value: to_value,\r\n easing_function: easing_function\r\n });\r\n }\r\n }\r\n\r\n animation_tracks.sort((a, b) =>\r\n {\r\n return a.from_time - b.from_time;\r\n });\r\n return {\r\n animation_tracks: animation_tracks,\r\n triggers: triggers\r\n };\r\n }\r\n\r\n get_node_x_position(node)\r\n {\r\n const x_pos = node.getAttribute('x');\r\n return x_pos === null ? 0 : parseFloat(x_pos);\r\n }\r\n}\r\n","import ActionSequencer from '../../action_sequencer/ActionSequencer';\r\nimport NumberInterpolator from '../../action_sequencer/NumberInterpolator';\r\nimport ActionEvent from '../../action_sequencer/ActionEvent';\r\nimport DrawIOAnimationSheet from './DrawIOAnimationSheet';\r\n\r\nexport default class ActionSequencerBuilder\r\n{\r\n constructor(initial_state_data)\r\n {\r\n this.initial_state_data = initial_state_data;\r\n }\r\n\r\n from_animation_sheet(animation_data, current_context, initial_context)\r\n {\r\n initial_context = initial_context || this.initial_state_data;\r\n const tracks = animation_data.animation_tracks;\r\n const triggers = animation_data.triggers;\r\n\r\n const initial_tracks = this.state_to_tracks(this.initial_state_data);\r\n\r\n for (let i = 0; i < initial_tracks.length; i++)\r\n {\r\n if (tracks.find(element => element.attribute_name === initial_tracks[i].attribute_name) === undefined)\r\n {\r\n tracks.push(initial_tracks[i]);\r\n }\r\n }\r\n\r\n const sequencer = new ActionSequencer(current_context);\r\n\r\n for (let i = 0; i < tracks.length; i++)\r\n {\r\n const t = tracks[i];\r\n const interpolator = new NumberInterpolator(\r\n t.attribute_name,\r\n current_context[t.attribute_name],\r\n t.to_value,\r\n t.initial,\r\n t.easing_function\r\n );\r\n\r\n sequencer.add_action_interpolator(t.from_time, t.to_time, interpolator, true);\r\n }\r\n\r\n for (let i = 0; i < triggers.length; i++)\r\n {\r\n const t = triggers[i];\r\n const action_event = new ActionEvent(t.name, t.method);\r\n sequencer.add_action_event(t.at_time, action_event);\r\n }\r\n\r\n return sequencer;\r\n }\r\n\r\n state_to_tracks(state)\r\n {\r\n const tracks = [];\r\n\r\n const keys = Object.keys(state);\r\n\r\n for (let i = 0; i < keys.length; i++)\r\n {\r\n tracks.push({\r\n attribute_name: keys[i],\r\n from_time: 0,\r\n to_time: 1,\r\n to_value: state[keys[i]],\r\n initial: true,\r\n easing_function: 'ease_in_out_cubic'\r\n });\r\n }\r\n\r\n return tracks;\r\n }\r\n\r\n from_draw_io(xml, context)\r\n {\r\n const transition_data = (new DrawIOAnimationSheet()).parse(xml);\r\n const tracks = transition_data.animation_tracks;\r\n const triggers = transition_data.triggers;\r\n const sequencer = new ActionSequencer(context);\r\n\r\n for (let i = 0; i < tracks.length; i++)\r\n {\r\n const t = tracks[i];\r\n const interpolator = new NumberInterpolator(\r\n t.attribute_name,\r\n context[t.attribute_name],\r\n t.to_value,\r\n t.initial,\r\n t.easing_function\r\n );\r\n\r\n sequencer.add_action_interpolator(t.from_time, t.to_time, interpolator, true);\r\n }\r\n\r\n for (let i = 0; i < triggers.length; i++)\r\n {\r\n const t = triggers[i];\r\n const action_event = new ActionEvent(t.name, t.method);\r\n sequencer.add_action_event(t.at_time, action_event);\r\n }\r\n\r\n return sequencer;\r\n }\r\n}\r\n","class EventManager\r\n{\r\n init()\r\n {\r\n this.queue = {};\r\n\r\n this.zoom_changed_evt = 'zoom_changed';\r\n this.store_clickd_evt = 'store_clicked';\r\n this.point_selected_evt = 'point_selected';\r\n this.config_changed = 'config_changed';\r\n\r\n this.path_substep_completed = 'path_substep_completed';\r\n this.path_completed = 'path_completed';\r\n this.go_to_store_requested_evt = 'go_to_store_requested';\r\n\r\n this.resource_loaded_evt = 'resource_loaded';\r\n this.service_clicked_evt = 'service_clicked';\r\n this.unit_pos_updated_evt = 'unit_position_updated';\r\n\r\n this.floor_changed_evt = 'floor_changed';\r\n\r\n this.on_enter_floor_navigation = 'on_enter_floor_navigation';\r\n this.on_exit_floor_navigation = 'on_exit_floor_navigation';\r\n\r\n this.on_enter_floor_selection = 'on_enter_floor_selection';\r\n this.on_exit_floor_selection = 'on_exit_floor_selection';\r\n\r\n this.on_enter_outside_navigation = 'on_enter_outside_navigation';\r\n this.on_exit_outside_navigation = 'on_exit_outside_navigation';\r\n\r\n this.step_selected_evt = 'step_selected';\r\n }\r\n\r\n fire(event, payload)\r\n {\r\n const queue = this.queue[event];\r\n\r\n if (queue === undefined)\r\n {\r\n return;\r\n }\r\n let i = queue.length;\r\n while (i--)\r\n {\r\n queue[i](payload);\r\n }\r\n }\r\n\r\n on(event, callback)\r\n {\r\n if (typeof this.queue[event] === 'undefined')\r\n {\r\n this.queue[event] = [];\r\n }\r\n\r\n this.queue[event].push(callback);\r\n }\r\n\r\n fire_zoom_changed(zoom)\r\n {\r\n this.fire(this.zoom_changed_evt, zoom);\r\n }\r\n\r\n fire_store_selected(store_id)\r\n {\r\n this.fire(this.store_clickd_evt, store_id);\r\n }\r\n\r\n fire_point_selected(hit_data)\r\n {\r\n this.fire(this.point_selected_evt, hit_data);\r\n }\r\n\r\n fire_config_changed()\r\n {\r\n this.fire(this.config_changed);\r\n }\r\n\r\n fire_path_substep_completed(step_number)\r\n {\r\n this.fire(this.path_substep_completed, step_number);\r\n }\r\n\r\n fire_path_completed()\r\n {\r\n this.fire(this.path_completed);\r\n }\r\n\r\n fire_step_selected(step_index)\r\n {\r\n this.fire(this.step_selected_evt, step_index);\r\n }\r\n\r\n fire_go_to_store_requested(store_id)\r\n {\r\n this.fire(this.go_to_store_requested_evt, store_id);\r\n }\r\n\r\n fire_resource_loaded(resource)\r\n {\r\n this.fire(this.resource_loaded_evt, resource);\r\n }\r\n\r\n fire_service_clicked(service)\r\n {\r\n this.fire(this.service_clicked_evt, service);\r\n }\r\n\r\n fire_unit_position_updated(unit_data)\r\n {\r\n this.fire(this.unit_pos_updated_evt, unit_data);\r\n }\r\n\r\n fire_floor_switched(floor_id)\r\n {\r\n this.fire(this.floor_changed_evt, floor_id);\r\n }\r\n\r\n fire_on_enter_floor_navigation(state)\r\n {\r\n this.fire(this.on_enter_floor_navigation, state);\r\n }\r\n\r\n fire_on_exit_floor_navigation(state)\r\n {\r\n this.fire(this.on_exit_floor_navigation, state);\r\n }\r\n\r\n fire_on_enter_floor_selection(state)\r\n {\r\n this.fire(this.on_enter_floor_selection, state);\r\n }\r\n\r\n fire_on_exit_floor_selection(state)\r\n {\r\n this.fire(this.on_exit_floor_selection, state);\r\n }\r\n\r\n fire_on_enter_outside_navigation(state)\r\n {\r\n this.fire(this.on_enter_outside_navigation, state);\r\n }\r\n\r\n fire_on_exit_outside_navigation(state)\r\n {\r\n this.fire(this.on_exit_outside_navigation, state);\r\n }\r\n}\r\n\r\nexport default new EventManager();\r\n","import EventManager from './EventManager';\r\n\r\nclass ResourceContainer\r\n{\r\n init()\r\n {\r\n this.resources = {};\r\n this.resources_by_url = {};\r\n }\r\n\r\n set_resource(name, url, resource)\r\n {\r\n const urls = Object.keys(this.resources_by_url);\r\n\r\n if (urls.includes(url))\r\n {\r\n this.resources[name] = this.resources_by_url[url];\r\n }\r\n else\r\n {\r\n this.resources[name] = resource;\r\n this.resources_by_url[url] = resource;\r\n }\r\n\r\n EventManager.fire_resource_loaded({ name: name, value: resource });\r\n }\r\n\r\n get_resource(name)\r\n {\r\n return this.resources[name];\r\n }\r\n\r\n get(name)\r\n {\r\n return this.resources[name];\r\n }\r\n}\r\n\r\nexport default new ResourceContainer();\r\n","export default class HTMLUtilities\r\n{\r\n static load_images(container)\r\n {\r\n const images = container.querySelectorAll('img');\r\n\r\n for (let i = 0; i < images.length; i++)\r\n {\r\n const image = images[i];\r\n\r\n if (image.dataset.src)\r\n {\r\n image.src = image.dataset.src;\r\n }\r\n }\r\n\r\n const image_objects = container.querySelectorAll('object');\r\n\r\n for (let i = 0; i < image_objects.length; i++)\r\n {\r\n const image_object = image_objects[i];\r\n\r\n if (image_object.dataset.src)\r\n {\r\n image_object.data = image_object.dataset.src;\r\n }\r\n }\r\n }\r\n\r\n static load_videos(container)\r\n {\r\n const videos = container.querySelectorAll('video');\r\n\r\n for (let i = 0; i < videos.length; i++)\r\n {\r\n const video = videos[i];\r\n\r\n if (video.dataset.src)\r\n {\r\n video.src = video.dataset.src;\r\n }\r\n }\r\n }\r\n}\r\n","import ActionSequencerBuilder from './ActionSequencerBuilder';\r\n\r\nexport default class TransitionTable\r\n{\r\n constructor()\r\n {\r\n this.transitions = [];\r\n this.initial_state_data = {};\r\n }\r\n\r\n get(from_state_name, to_state_name, current_context)\r\n {\r\n for (let i = 0; i < this.transitions.length; i++)\r\n {\r\n if (this.transitions[i].from === from_state_name && this.transitions[i].to === to_state_name)\r\n {\r\n const action_sequencer = new ActionSequencerBuilder(this.initial_state_data).from_animation_sheet(this.transitions[i].data, current_context);\r\n\r\n return action_sequencer;\r\n }\r\n }\r\n\r\n for (let i = 0; i < this.transitions.length; i++)\r\n {\r\n if (this.transitions[i].to === to_state_name)\r\n {\r\n const action_sequencer = new ActionSequencerBuilder(this.initial_state_data).from_animation_sheet(this.transitions[i].data, current_context);\r\n\r\n return action_sequencer;\r\n }\r\n }\r\n\r\n console.error('TransitionTable.get no data found for: ', from_state_name, to_state_name);\r\n return undefined;\r\n }\r\n\r\n add_transitions(transitions)\r\n {\r\n for (let i = 0; i < transitions.length; i++)\r\n {\r\n this.transitions.push(transitions[i]);\r\n }\r\n }\r\n\r\n set_transitions(transitions)\r\n {\r\n this.transitions = transitions;\r\n }\r\n\r\n set_initial_state_data(initial_state_data)\r\n {\r\n this.initial_state_data = initial_state_data;\r\n }\r\n}\r\n","import { Vector2 } from 'three';\r\nimport { Clock } from 'three';\r\n\r\nclass Time\r\n{\r\n constructor()\r\n {\r\n this.delta_buffer = [0.016, 0.016, 0.016, 0.016, 0.016, 0.016, 0.016, 0.016, 0.016, 0.016];\r\n }\r\n\r\n init()\r\n {\r\n this.___time = new Clock();\r\n this.__raw_delta_time = 0;\r\n this.__elapsed_time = 0;\r\n this.__allocated_time = new Vector2(0, 0);\r\n\r\n this.delta_time = 0.016;\r\n }\r\n\r\n get elapsed_time()\r\n {\r\n return this.__elapsed_time;\r\n }\r\n\r\n get shader_time()\r\n {\r\n this.__allocated_time.x = this.delta_time;\r\n this.__allocated_time.y = this.elapsed_time;\r\n return this.__allocated_time;\r\n }\r\n\r\n __update()\r\n {\r\n this.__raw_delta_time = this.___time.getDelta();\r\n this.__elapsed_time = this.___time.getElapsedTime();\r\n\r\n this.delta_buffer.shift();\r\n this.delta_buffer.push(this.__raw_delta_time < 0.32 ? this.__raw_delta_time : 0.032);\r\n\r\n this.__calculate_delta_time();\r\n }\r\n\r\n __calculate_delta_time()\r\n {\r\n this.delta_time = 0;\r\n\r\n for (let i = 0; i < this.delta_buffer.length; i++)\r\n {\r\n this.delta_time += this.delta_buffer[i];\r\n }\r\n\r\n this.delta_time = this.delta_time / this.delta_buffer.length;\r\n }\r\n}\r\n\r\nexport default new Time();\r\n","export default class ViewState\r\n{\r\n constructor(name)\r\n {\r\n this.name = name;\r\n }\r\n\r\n start()\r\n {\r\n }\r\n\r\n show()\r\n {\r\n }\r\n\r\n hide()\r\n {\r\n }\r\n\r\n before_enter()\r\n {\r\n }\r\n\r\n on_enter()\r\n {\r\n }\r\n\r\n update()\r\n {\r\n }\r\n\r\n update_enter_transition(global_view_data, transition_progress, action_sequencer)\r\n {\r\n // Backward compatibility. It will be removed in future releases.\r\n this.update_transition(global_view_data, transition_progress, action_sequencer);\r\n }\r\n\r\n update_exit_transition(global_view_data, transition_progress, action_sequencer)\r\n {\r\n }\r\n\r\n // Deprecated\r\n update_transition(global_view_data, transition_progress, action_sequencer)\r\n {\r\n }\r\n\r\n before_exit()\r\n {\r\n }\r\n\r\n on_exit()\r\n {\r\n }\r\n}\r\n","import Time from '../../Time';\r\nimport ViewState from '../ViewState';\r\n\r\nexport default class ViewStateTransitionHandler\r\n{\r\n constructor(transition_table)\r\n {\r\n this.last_state = new ViewState();\r\n this.current_state = new ViewState();\r\n\r\n this.initial_state_data = {};\r\n this.current_state_data = {};\r\n\r\n this.transition_table = transition_table;\r\n\r\n this.transitioning = false;\r\n }\r\n\r\n go_to_state(state, skip = false)\r\n {\r\n if (this.transitioning)\r\n {\r\n this.__exit_last_state();\r\n }\r\n\r\n this.last_state = this.current_state;\r\n this.current_state = state;\r\n\r\n this.last_state.before_exit();\r\n this.current_state.show();\r\n\r\n this.action_sequencer = this.transition_table.get(this.last_state.name, this.current_state.name, this.current_state_data);\r\n this.current_state.before_enter();\r\n\r\n this.action_sequencer.play();\r\n\r\n this.transitioning = true;\r\n\r\n if (skip)\r\n {\r\n this.action_sequencer.skip();\r\n this.update();\r\n }\r\n }\r\n\r\n update()\r\n {\r\n if (this.transitioning)\r\n {\r\n this.__update_transitions();\r\n\r\n if (this.action_sequencer.is_finished())\r\n {\r\n this.transitioning = false;\r\n\r\n this.__update_transitions();\r\n\r\n this.__exit_last_state();\r\n\r\n this.current_state.on_enter();\r\n }\r\n }\r\n else\r\n {\r\n this.current_state.update();\r\n }\r\n }\r\n\r\n set_state(state)\r\n {\r\n this.current_state = state;\r\n }\r\n\r\n set_initial_state_data(initial_state_data)\r\n {\r\n Object.assign(this.initial_state_data, initial_state_data);\r\n Object.assign(this.current_state_data, initial_state_data);\r\n }\r\n\r\n __update_transitions()\r\n {\r\n this.action_sequencer.update(Time.delta_time);\r\n this.last_state.update_exit_transition(this.current_state_data, this.action_sequencer.get_progress(), this.action_sequencer);\r\n this.current_state.update_enter_transition(this.current_state_data, this.action_sequencer.get_progress(), this.action_sequencer);\r\n }\r\n\r\n __exit_last_state()\r\n {\r\n if (this.last_state.name !== this.current_state.name)\r\n {\r\n this.last_state.hide();\r\n }\r\n\r\n this.last_state.on_exit();\r\n }\r\n}\r\n","import TransitionTable from './transition/TransitionTable';\r\nimport ViewStateTransitionHandler from './transition/ViewStateTransitionHandler';\r\n\r\nclass ViewManager\r\n{\r\n constructor()\r\n {\r\n this.views = [];\r\n\r\n this.transition_table = new TransitionTable();\r\n this.transition_handler = new ViewStateTransitionHandler(this.transition_table);\r\n\r\n this.view_change_subscribers = [];\r\n\r\n this.browser_title_suffix = '';\r\n }\r\n\r\n update()\r\n {\r\n this.transition_handler.update();\r\n\r\n this.__set_views_opacities();\r\n }\r\n\r\n go_to_view(view_name, change_url = true, skip = false)\r\n {\r\n const v = this.get(view_name);\r\n this.transition_handler.go_to_state(v, skip);\r\n\r\n if (change_url)\r\n {\r\n this.__change_browser_url(v.url);\r\n this.__change_browser_title(v.url);\r\n }\r\n\r\n this.notify_view_change(view_name);\r\n }\r\n\r\n go_to_scene(scene_name, change_url = false, skip = false)\r\n {\r\n const next_view = this.get(scene_name);\r\n const transition_view = this.get('transition');\r\n\r\n transition_view.set_next_view(next_view);\r\n this.go_to_view(transition_view.name, change_url, skip);\r\n }\r\n\r\n subscribe_to_view_change(subscriber)\r\n {\r\n this.view_change_subscribers.push(subscriber);\r\n }\r\n\r\n notify_view_change(view_name)\r\n {\r\n for (let i = 0; i < this.view_change_subscribers.length; i++)\r\n {\r\n const subscriber = this.view_change_subscribers[i];\r\n subscriber.on_view_change(view_name);\r\n }\r\n }\r\n\r\n register_view(view)\r\n {\r\n this.views.push(view);\r\n }\r\n\r\n has_view(view_name)\r\n {\r\n for (let i = 0; i < this.views.length; i++)\r\n {\r\n if (this.views[i].name === view_name)\r\n {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n add_transitions(transitions)\r\n {\r\n this.transition_table.add_transitions(transitions);\r\n }\r\n\r\n set_transitions(transitions)\r\n {\r\n this.transition_table.set_transitions(transitions);\r\n }\r\n\r\n set_view(view_name)\r\n {\r\n const view = this.get(view_name);\r\n\r\n this.transition_handler.set_state(view);\r\n }\r\n\r\n set_browser_title_suffix(title_suffix)\r\n {\r\n this.browser_title_suffix = title_suffix;\r\n }\r\n\r\n get_current_view()\r\n {\r\n return this.transition_handler.current_state;\r\n }\r\n\r\n get_view_by_name(view_name)\r\n {\r\n console.warn('DEPRECATED. Use ViewManager.get instead');\r\n this.get(view_name);\r\n }\r\n\r\n get(view_name)\r\n {\r\n for (let i = 0; i < this.views.length; i++)\r\n {\r\n if (this.views[i].name === view_name)\r\n {\r\n return this.views[i];\r\n }\r\n }\r\n console.error('[ViewManager.get] no view found for: ', view_name);\r\n return undefined;\r\n }\r\n\r\n get_view_by_url(url)\r\n {\r\n console.warn('DEPRECATED. Use ViewManager.get_by_url instead');\r\n this.get_by_url(url);\r\n }\r\n\r\n get_by_url(url)\r\n {\r\n for (let i = 0; i < this.views.length; i++)\r\n {\r\n if (this.views[i].url === url)\r\n {\r\n return this.views[i];\r\n }\r\n }\r\n console.error('[ViewManager.get_by_url] no view found for: ', url);\r\n return undefined;\r\n }\r\n\r\n set_initial_state_data(initial_state_data)\r\n {\r\n this.transition_table.set_initial_state_data(initial_state_data);\r\n this.transition_handler.set_initial_state_data(initial_state_data);\r\n }\r\n\r\n __change_browser_url(url)\r\n {\r\n window.history.pushState('', '', url);\r\n }\r\n\r\n __change_browser_title(name)\r\n {\r\n const title = this.__capitalize(name);\r\n\r\n document.title = title ? `${title} | ${this.browser_title_suffix}` : this.browser_title_suffix;\r\n }\r\n\r\n __set_views_opacities()\r\n {\r\n for (let i = 0; i < this.views.length; i++)\r\n {\r\n this.views[i].set_opacity(this.transition_handler.current_state_data);\r\n }\r\n }\r\n\r\n __capitalize(string)\r\n {\r\n let aux_string = string.toUpperCase().replace('/', '');\r\n aux_string = this.__snake_to_whitespace(aux_string);\r\n\r\n return aux_string;\r\n }\r\n\r\n __snake_to_whitespace(string)\r\n {\r\n return string.replace(\r\n /([-_][A-Z])/g,\r\n (group) => group\r\n .replace('-', ' ')\r\n .replace('_', ' ')\r\n );\r\n }\r\n}\r\n\r\nexport default new ViewManager();\r\n","import ResourceContainer from '../ResourceContainer';\r\nimport HTMLUtilities from '../utilities/HTMLUtilities';\r\nimport ViewManager from './ViewManager';\r\nimport ViewState from './ViewState';\r\n\r\nexport default class ApplicationView extends ViewState\r\n{\r\n constructor({ name, url, container })\r\n {\r\n super(name);\r\n\r\n this.container = container;\r\n this.url = url;\r\n\r\n let transition_data = ResourceContainer.get(`${name}_data`);\r\n\r\n transition_data = transition_data || {\r\n animation_tracks: [],\r\n triggers: []\r\n };\r\n\r\n const transitions = [\r\n {\r\n to: name,\r\n data: transition_data\r\n }\r\n ];\r\n\r\n ViewManager.register_view(this);\r\n ViewManager.add_transitions(transitions);\r\n }\r\n\r\n show()\r\n {\r\n this.container.classList.add('before_enter');\r\n this.container.classList.remove('before_exit');\r\n this.container.classList.remove('hidden');\r\n }\r\n\r\n on_enter()\r\n {\r\n this.container.classList.remove('before_enter');\r\n this.container.classList.remove('before_exit');\r\n this.container.classList.remove('hidden');\r\n }\r\n\r\n before_exit()\r\n {\r\n this.container.classList.add('before_exit');\r\n this.container.classList.remove('before_enter');\r\n this.container.classList.remove('hidden');\r\n }\r\n\r\n hide()\r\n {\r\n this.container.classList.add('hidden');\r\n this.container.classList.remove('before_enter');\r\n this.container.classList.remove('before_exit');\r\n }\r\n\r\n load_html_images()\r\n {\r\n HTMLUtilities.load_images(this.container);\r\n }\r\n\r\n load_html_videos()\r\n {\r\n HTMLUtilities.load_videos(this.container);\r\n }\r\n\r\n set_opacity(current_state_data)\r\n {\r\n this.container.style.opacity = current_state_data[`${this.name}_opacity`];\r\n }\r\n}\r\n","export default class BaseApplication\r\n{\r\n on_post_start()\r\n {}\r\n\r\n on_enter()\r\n {}\r\n\r\n on_exit()\r\n {}\r\n\r\n update()\r\n {}\r\n\r\n on_post_render()\r\n {}\r\n\r\n on_pre_render()\r\n {}\r\n\r\n on_frame_end()\r\n {}\r\n}\r\n","export default class BaseRender\r\n{\r\n constructor()\r\n {\r\n\r\n }\r\n\r\n render()\r\n {\r\n\r\n }\r\n\r\n on_enter(context, renderer)\r\n {\r\n\r\n }\r\n\r\n on_exit(context, renderer)\r\n {\r\n\r\n }\r\n\r\n resize()\r\n {\r\n\r\n }\r\n\r\n dispose()\r\n {\r\n\r\n }\r\n}\r\n","import basic_vert from '../shaders/basic_color/basic_color.vert';\r\nimport basic_frag from '../shaders/basic_color/basic_color.frag';\r\n\r\nimport { ShaderMaterial } from 'three';\r\nimport { Color } from 'three';\r\n\r\nexport default class BaseShaderMaterial extends ShaderMaterial\r\n{\r\n constructor(vert, frag, uniforms)\r\n {\r\n super({\r\n vertexShader: vert || basic_vert,\r\n fragmentShader: frag || basic_frag,\r\n uniforms: uniforms || {\r\n _Color: { value: new Color('#FF0000') }\r\n }\r\n });\r\n }\r\n}\r\n","import vert from '../shaders/copy/copy.vert';\r\nimport frag from '../shaders/copy/copy.frag';\r\n\r\nimport { ShaderMaterial } from 'three';\r\nimport { Vector2 } from 'three';\r\nimport { NoBlending } from 'three';\r\nimport { AlwaysDepth } from 'three';\r\n\r\nexport default class BlitMaterial extends ShaderMaterial\r\n{\r\n constructor(frag_shader, vert_shader, defines)\r\n {\r\n super({\r\n uniforms: {\r\n _MainTex: { value: null },\r\n _Resolution: { value: new Vector2(0, 0) },\r\n _TargetResolution: { value: new Vector2(0, 0) }\r\n },\r\n defines: defines || {},\r\n vertexShader: vert_shader || vert,\r\n fragmentShader: frag_shader || frag,\r\n depthWrite: false,\r\n blending: NoBlending,\r\n depthTest: false,\r\n depthFunc: AlwaysDepth\r\n });\r\n }\r\n}\r\n","class CameraManager\r\n{\r\n init()\r\n {\r\n this._current = undefined;\r\n }\r\n\r\n set current(camera)\r\n {\r\n this._current = camera;\r\n }\r\n\r\n get current()\r\n {\r\n return this._current;\r\n }\r\n}\r\n\r\nexport default new CameraManager();\r\n","class Capabilities\r\n{\r\n init()\r\n {\r\n this.max_anisotropy = 0;\r\n this.vertex_texture_sampler_available = false;\r\n this.fp_textures_available = false;\r\n }\r\n}\r\n\r\nexport default new Capabilities();\r\n","import { CanvasTexture } from 'three';\r\nimport { Vector2 } from 'three';\r\nimport { UVMapping } from 'three';\r\nimport { ClampToEdgeWrapping } from 'three';\r\nimport { NearestFilter } from 'three';\r\n\r\nexport default class CanvasDrawer\r\n{\r\n constructor(uses_dynamic_font)\r\n {\r\n this.uses_dynamic_font = uses_dynamic_font;\r\n this.__textHeight = null;\r\n\r\n this.canvas = document.createElement('canvas');\r\n this.ctx = this.canvas.getContext('2d');\r\n }\r\n\r\n getFontHeight(fontStyle = 'Arial')\r\n {\r\n if (this.__textHeight == null || this.uses_dynamic_font)\r\n {\r\n const body = document.getElementsByTagName('body')[0];\r\n const dummy = document.createElement('div');\r\n const dummyText = document.createTextNode('MÉqgOLAKTAL');\r\n dummy.appendChild(dummyText);\r\n dummy.setAttribute('style', `font:${fontStyle};position:absolute;top:0;left:0`);\r\n body.appendChild(dummy);\r\n this.__textHeight = dummy.offsetHeight;\r\n body.removeChild(dummy);\r\n }\r\n return this.__textHeight;\r\n }\r\n\r\n get_text_size(text, font = '24px Arial')\r\n {\r\n const size = new Vector2();\r\n this.ctx.font = font;\r\n size.x = Math.ceil(this.ctx.measureText(text).width);\r\n size.y = Math.ceil(this.getFontHeight(font));\r\n return size;\r\n }\r\n\r\n draw_canvas(text, ctxOptions = {})\r\n {\r\n ctxOptions.font = ctxOptions.font || '24px Arial';\r\n ctxOptions.font_color = ctxOptions.font_color || '#000000';\r\n\r\n this.__draw(text, ctxOptions, this.canvas, this.ctx);\r\n return this.canvas;\r\n }\r\n\r\n draw_on_texture(text, ctxOptions)\r\n {\r\n const canvas = this.draw_canvas(text, ctxOptions);\r\n const canvas_texture = new CanvasTexture(canvas, UVMapping,\r\n ClampToEdgeWrapping,\r\n ClampToEdgeWrapping,\r\n NearestFilter,\r\n NearestFilter);\r\n canvas_texture.generateMipMaps = false;\r\n canvas_texture.needsUpdate = true;\r\n\r\n return canvas_texture;\r\n }\r\n\r\n __draw(text, ctxOptions)\r\n {}\r\n\r\n roundRect(ctx, x, y, width, height, radius, fill, stroke)\r\n {\r\n if (typeof stroke === 'undefined')\r\n {\r\n stroke = true;\r\n }\r\n if (typeof radius === 'undefined')\r\n {\r\n radius = 5;\r\n }\r\n if (typeof radius === 'number')\r\n {\r\n radius = { tl: radius, tr: radius, br: radius, bl: radius };\r\n }\r\n else\r\n {\r\n const defaultRadius = { tl: 0, tr: 0, br: 0, bl: 0 };\r\n for (const side in defaultRadius)\r\n {\r\n radius[side] = radius[side] || defaultRadius[side];\r\n }\r\n }\r\n ctx.beginPath();\r\n ctx.moveTo(x + radius.tl, y);\r\n ctx.lineTo(x + width - radius.tr, y);\r\n ctx.quadraticCurveTo(x + width, y, x + width, y + radius.tr);\r\n ctx.lineTo(x + width, y + height - radius.br);\r\n ctx.quadraticCurveTo(x + width, y + height, x + width - radius.br, y + height);\r\n ctx.lineTo(x + radius.bl, y + height);\r\n ctx.quadraticCurveTo(x, y + height, x, y + height - radius.bl);\r\n ctx.lineTo(x, y + radius.tl);\r\n ctx.quadraticCurveTo(x, y, x + radius.tl, y);\r\n ctx.closePath();\r\n if (fill)\r\n {\r\n ctx.fill();\r\n }\r\n if (stroke)\r\n {\r\n ctx.stroke();\r\n }\r\n }\r\n}\r\n","/*\r\n\r\n A configuration class used as a singleton\r\n\r\n*/\r\n\r\nclass Configuration\r\n{\r\n init(parameters = {})\r\n {\r\n this.dpr = 1;\r\n\r\n this.app = {}; // for arbitrary use in end application\r\n }\r\n\r\n from_json(json)\r\n {\r\n\r\n }\r\n}\r\n\r\nexport default new Configuration();\r\n","export default class Idle\r\n{\r\n constructor()\r\n {\r\n }\r\n\r\n get is_animating()\r\n {\r\n return false;\r\n }\r\n\r\n on_enter(view)\r\n {\r\n\r\n }\r\n\r\n update(view)\r\n {\r\n }\r\n\r\n on_exit(view)\r\n {\r\n\r\n }\r\n}\r\n","import Time from '../../Time';\r\nimport Idle from './Idle';\r\n\r\nimport OMath from '../../utilities/OMath';\r\nexport default class Animating\r\n{\r\n constructor()\r\n {\r\n this.t = 0;\r\n this.easing_function_t = 0;\r\n }\r\n\r\n get is_animating()\r\n {\r\n return true;\r\n }\r\n\r\n on_enter(animator)\r\n {\r\n }\r\n\r\n update(animator)\r\n {\r\n this.t += Time.delta_time / animator.duration;\r\n\r\n this.easing_function_t = animator.easing_function(this.t);\r\n this.easing_function_t = OMath.clamp(this.easing_function_t, 0, 1);\r\n\r\n animator.set_property_value(OMath.lerp(animator.from, animator.to, this.easing_function_t));\r\n\r\n if (this.easing_function_t >= 0.9999)\r\n {\r\n animator.set_property_value(animator.to);\r\n\r\n animator.set_current_state(new Idle());\r\n animator.finished_callback(animator);\r\n }\r\n }\r\n\r\n on_exit(view)\r\n {\r\n\r\n }\r\n}\r\n","import Animating from './css_animator_states/Animating';\r\nimport Idle from './css_animator_states/Idle';\r\nimport EasingFunctions from '../utilities/EasingFunctions';\r\n\r\nexport default class CSSAnimator\r\n{\r\n constructor({\r\n element,\r\n css_property,\r\n from = 0,\r\n to = 1,\r\n duration = 1,\r\n value_prefix = '',\r\n value_suffix = '',\r\n easing_function = EasingFunctions.ease_in_out_cubic,\r\n finished_callback = () =>\r\n {}\r\n })\r\n {\r\n this.element = element;\r\n this.css_property = css_property;\r\n this.from = from;\r\n this.to = to;\r\n this.value_prefix = value_prefix;\r\n this.value_suffix = value_suffix;\r\n this.duration = duration;\r\n this.easing_function = easing_function;\r\n this.finished_callback = finished_callback;\r\n\r\n this.current_state = new Idle();\r\n }\r\n\r\n animate()\r\n {\r\n this.set_current_state(new Animating());\r\n }\r\n\r\n stop()\r\n {\r\n this.set_current_state(new Idle());\r\n }\r\n\r\n set_property_value(value)\r\n {\r\n this.element.style[this.css_property] = `${this.value_prefix}${value}${this.value_suffix}`;\r\n }\r\n\r\n update()\r\n {\r\n this.current_state.update(this);\r\n }\r\n\r\n get is_animating()\r\n {\r\n return this.current_state.is_animating;\r\n }\r\n\r\n set_current_state(state)\r\n {\r\n this.current_state.on_exit(this);\r\n this.current_state = state;\r\n this.current_state.on_enter(this);\r\n }\r\n}\r\n","\r\nimport { Object3D } from 'three';\r\nimport { LineBasicMaterial } from 'three';\r\nimport { AlwaysDepth } from 'three';\r\nimport { BufferGeometry } from 'three';\r\nimport { Vector3 } from 'three';\r\nimport { Line } from 'three';\r\n\r\nexport default class AxisHelper extends Object3D\r\n{\r\n constructor(scale = 1.0)\r\n {\r\n super();\r\n\r\n const blue_points = [];\r\n blue_points.push(new Vector3(0, 0, 0));\r\n blue_points.push(new Vector3(0, 0, 1000));\r\n\r\n const blue_axis_mat = new LineBasicMaterial({ color: 0x4444ff, depthFunc: AlwaysDepth });\r\n const blue_axis_geo = new BufferGeometry().setFromPoints(blue_points);\r\n const blue_axis_line = new Line(blue_axis_geo, blue_axis_mat);\r\n blue_axis_line.renderOrder = 50000;\r\n\r\n const green_points = [];\r\n green_points.push(new Vector3(0, 0, 0));\r\n green_points.push(new Vector3(0, 1000, 0));\r\n\r\n const green_axis_mat = new LineBasicMaterial({ color: 0x44ff44, depthFunc: AlwaysDepth });\r\n const green_axis_geo = new BufferGeometry().setFromPoints(green_points);\r\n const green_axis_line = new Line(green_axis_geo, green_axis_mat);\r\n green_axis_line.renderOrder = 50000;\r\n\r\n const red_points = [];\r\n red_points.push(new Vector3(0, 0, 0));\r\n red_points.push(new Vector3(1000, 0, 0));\r\n\r\n const red_axis_mat = new LineBasicMaterial({ color: 0xff4444, depthFunc: AlwaysDepth });\r\n const red_axis_geo = new BufferGeometry().setFromPoints(red_points);\r\n const red_axis_line = new Line(red_axis_geo, red_axis_mat);\r\n red_axis_line.renderOrder = 50000;\r\n\r\n this.renderOrder = 100000;\r\n\r\n this.add(blue_axis_line);\r\n this.add(green_axis_line);\r\n this.add(red_axis_line);\r\n\r\n this.scale.set(scale, scale, scale);\r\n }\r\n\r\n update()\r\n {\r\n }\r\n\r\n dispose()\r\n {\r\n }\r\n}\r\n","import { Scene } from 'three';\r\n\r\nclass SceneManager\r\n{\r\n init()\r\n {\r\n this._current = new Scene();\r\n this._current.name = 'default_scene';\r\n }\r\n\r\n add_scene(name)\r\n {\r\n\r\n }\r\n\r\n get current()\r\n {\r\n return this._current;\r\n }\r\n\r\n set current(scene)\r\n {\r\n this._current = scene;\r\n }\r\n\r\n dispose()\r\n {\r\n this.current.traverse(child =>\r\n {\r\n if (child.geometry)\r\n {\r\n child.geometry.dispose();\r\n child.material.dispose();\r\n }\r\n });\r\n\r\n while (this.current.children.length > 0)\r\n {\r\n this.current.remove(this.current.children[0]);\r\n }\r\n }\r\n}\r\n\r\nexport default new SceneManager();\r\n","\r\nimport { Vector3, Mesh } from 'three';\r\nimport { BoxGeometry } from 'three';\r\nimport { MeshBasicMaterial } from 'three';\r\n\r\nexport default class Cube extends Mesh\r\n{\r\n constructor(size, segments, color)\r\n {\r\n size = size || new Vector3(1, 1, 1);\r\n segments = segments || new Vector3(1, 1, 1);\r\n color = color || 0xff0000;\r\n const geometry = new BoxGeometry(size.x, size.y, size.z, segments.x, segments.y, segments.z);\r\n const material = new MeshBasicMaterial({ color: color });\r\n super(geometry, material);\r\n }\r\n}\r\n","import { Mesh } from 'three';\r\nimport { SphereBufferGeometry } from 'three';\r\nimport { MeshBasicMaterial } from 'three';\r\n\r\nexport default class Sphere extends Mesh\r\n{\r\n constructor(radius, color)\r\n {\r\n color = color || '#FF0000';\r\n radius = radius || 1;\r\n const geometry = new SphereBufferGeometry(radius, 64, 64);\r\n const material = new MeshBasicMaterial({ color: color });\r\n super(geometry, material);\r\n }\r\n}\r\n","import { CylinderBufferGeometry } from 'three';\r\nimport { ConeBufferGeometry } from 'three';\r\nimport { MeshBasicMaterial } from 'three';\r\nimport { Vector3, Mesh } from 'three';\r\n\r\nimport * as BufferGeometryUtils from 'three/examples/jsm/utils/BufferGeometryUtils.js';\r\n\r\nexport default class Arrow extends Mesh\r\n{\r\n constructor(color, length, dir)\r\n {\r\n color = color || '#FF0000';\r\n length = length || 1;\r\n\r\n const cone_height = 0.4;\r\n const cylinder_height = length - cone_height;\r\n const cylinder_geo = new CylinderBufferGeometry(0.01, 0.01, cylinder_height, 32);\r\n cylinder_geo.translate(0, cylinder_height / 2, 0);\r\n\r\n const cone_geometry = new ConeBufferGeometry(0.1, cone_height, 32);\r\n cone_geometry.translate(0, cylinder_height + cone_height / 2, 0);\r\n\r\n const buffer_geometry = BufferGeometryUtils.mergeBufferGeometries([cylinder_geo, cone_geometry]);\r\n buffer_geometry.rotateX(3.14 / 2);\r\n\r\n const material = new MeshBasicMaterial({ color: color });\r\n super(buffer_geometry, material);\r\n\r\n if (dir)\r\n {\r\n this.quaternion.setFromUnitVectors(new Vector3(0, 0, 1), dir);\r\n }\r\n\r\n this._dir = dir;\r\n }\r\n\r\n set dir(dir)\r\n {\r\n this.quaternion.setFromUnitVectors(new Vector3(0, 0, 1), dir);\r\n this._dir = dir;\r\n }\r\n\r\n get dir()\r\n {\r\n return this._dir;\r\n }\r\n\r\n set length(value)\r\n {\r\n this.scale.z = value;\r\n }\r\n\r\n get length()\r\n {\r\n return this.scale.z;\r\n }\r\n}\r\n","import { Vector2 } from 'three';\r\n\r\nclass OScreen\r\n{\r\n init()\r\n {\r\n this.width = 1;\r\n this.height = 1;\r\n\r\n this.position = new Vector2();\r\n\r\n this.render_width = 1;\r\n this.render_height = 1;\r\n this.width_height = new Vector2(this.width, this.height);\r\n\r\n this.dpr = 1;\r\n this.pixel_size = new Vector2(1 / this.width, 1 / this.height);\r\n }\r\n\r\n update_position(x, y)\r\n {\r\n this.position.set(x, y);\r\n }\r\n\r\n update()\r\n {\r\n this.size_changed = false;\r\n }\r\n\r\n update_size(width, height)\r\n {\r\n this.width = width;\r\n this.height = height;\r\n\r\n this.pixel_size = new Vector2(1 / this.width, 1 / this.height);\r\n\r\n this.width_height.x = width;\r\n this.width_height.y = height;\r\n\r\n this.render_width = width * this.dpr;\r\n this.render_height = height * this.dpr;\r\n\r\n this.size_changed = true;\r\n }\r\n\r\n apply_pixel_density_v2(vector2)\r\n {\r\n vector2.multiplyScalar(1 / this.dpr);\r\n\r\n return vector2;\r\n }\r\n\r\n apply_pixel_density(value)\r\n {\r\n return value * (1 / this.dpr);\r\n }\r\n\r\n get_pixel_size()\r\n {\r\n return this.pixel_size;\r\n }\r\n\r\n get aspect_ratio()\r\n {\r\n return this.width / this.height;\r\n }\r\n\r\n get portrait()\r\n {\r\n return this.width < this.height;\r\n }\r\n}\r\n\r\nexport default new OScreen();\r\n","import BaseShaderMaterial from './BaseShaderMaterial';\r\nimport { Vector2 } from 'three';\r\nexport default class ScreenSpaceTextureMaterial extends BaseShaderMaterial\r\n{\r\n constructor(x, y, w, h)\r\n {\r\n const vert = `\r\n uniform vec2 _ScreenSpacePosition;\r\n uniform vec2 _ScreenSize;\r\n uniform vec2 _TextureSize;\r\n varying vec2 vUv;\r\n void main()\r\n {\r\n vec2 pos = uv * vec2(_TextureSize.x / _ScreenSize.x, _TextureSize.y / _ScreenSize.y);\r\n pos += vec2(_ScreenSpacePosition.x / _ScreenSize.x, _ScreenSpacePosition.y / _ScreenSize.y);\r\n\r\n pos.x = pos.x * 2.0 - 1.0;\r\n pos.y = pos.y * 2.0 - 1.0;\r\n\r\n gl_Position = vec4(pos, 0.0, 1.0);\r\n vUv = uv;\r\n }\r\n `;\r\n const frag = `\r\n uniform sampler2D _MainTex;\r\n varying vec2 vUv;\r\n\r\n void main()\r\n {\r\n gl_FragColor = texture2D(_MainTex, vUv);\r\n }\r\n `;\r\n super(vert, frag, {\r\n _MainTex: { value: undefined },\r\n _ScreenSpacePosition: { value: new Vector2() },\r\n _ScreenSize: { value: new Vector2() },\r\n _TextureSize: { value: new Vector2() }\r\n });\r\n }\r\n\r\n set_position(x, y)\r\n {\r\n this.uniforms._ScreenSpacePosition.value.set(x, y);\r\n }\r\n\r\n set_texture(tex, w, h)\r\n {\r\n this.uniforms._MainTex.value = tex;\r\n this.uniforms._TextureSize.value.set(tex.image.width, tex.image.height);\r\n\r\n if (w !== undefined)\r\n {\r\n this.uniforms._TextureSize.value.x = w;\r\n }\r\n if (h !== undefined)\r\n {\r\n this.uniforms._TextureSize.value.y = h;\r\n }\r\n }\r\n\r\n set_screen_size(w, h)\r\n {\r\n this.uniforms._ScreenSize.value.set(w, h);\r\n }\r\n}\r\n","import { Color } from 'three';\r\nimport { PerspectiveCamera as THREEPerspectiveCamera } from 'three';\r\n\r\nexport default class PerspectiveCamera extends THREEPerspectiveCamera\r\n{\r\n constructor(fov, aspect, near, far)\r\n {\r\n super(fov, aspect, near, far);\r\n\r\n this.clear_color = new Color('#000000');\r\n this.clear_alpha = 1;\r\n }\r\n\r\n copy(camera)\r\n {\r\n super.copy(camera);\r\n this.clear_color.copy(camera.clear_color);\r\n this.clear_alpha = camera.clear_alpha;\r\n return this;\r\n }\r\n}\r\n","import AxisHelper from './components/AxisHelper';\r\nimport basic_color_vert from './shaders/basic_color/basic_color.vert';\r\nimport basic_color_frag from './shaders/basic_color/basic_color.frag';\r\nimport SceneManager from './SceneManager';\r\nimport Cube from './primitives/Cube';\r\nimport Sphere from './primitives/Sphere';\r\nimport Arrow from './primitives/Arrow';\r\nimport OScreen from './OScreen';\r\nimport ScreenSpaceTextureMaterial from './materials/ScreenSpaceTextureMaterial';\r\nimport { Vector3 } from 'three';\r\nimport { LineBasicMaterial } from 'three';\r\nimport { BufferGeometry } from 'three';\r\nimport { Line } from 'three';\r\nimport { PlaneGeometry } from 'three';\r\nimport { ShaderMaterial } from 'three';\r\nimport { Vector4 } from 'three';\r\nimport { Mesh } from 'three';\r\nimport { Box3 } from 'three';\r\nimport { Box3Helper } from 'three';\r\nimport { Scene } from 'three';\r\nimport { CatmullRomCurve3 } from 'three';\r\nimport { SphereGeometry } from 'three';\r\nimport { MeshBasicMaterial } from 'three';\r\nimport PerspectiveCamera from './PerspectiveCamera';\r\n\r\nclass Debug\r\n{\r\n init()\r\n {\r\n this.Vector3_one = new Vector3(1, 1, 1);\r\n this.Vector3_zero = new Vector3(0, 0, 0);\r\n this.canvas_renderer = undefined;\r\n\r\n this.display_texture_meshes = [];\r\n\r\n this.ctx = undefined;\r\n this.scene = new Scene();\r\n this.camera = new PerspectiveCamera();\r\n // this.camera.clear_alpha = 0;\r\n }\r\n\r\n draw_arrow(origin, dir, color = 0xff0000)\r\n {\r\n const arrow = new Arrow(color, dir.length(), dir.clone().normalize());\r\n arrow.position.copy(origin);\r\n SceneManager.current.add(arrow);\r\n return arrow;\r\n }\r\n\r\n draw_axis()\r\n {\r\n const axis = new AxisHelper();\r\n SceneManager.current.add(axis);\r\n return axis;\r\n }\r\n\r\n set_debug_RT(RT)\r\n {\r\n this.rt_debug = RT;\r\n }\r\n\r\n draw_rectangle(position_2d, width, height, color)\r\n {\r\n width = width || 100;\r\n height = height || 100;\r\n this.ctx.fillStyle = color || 'rgba(255, 0, 0, 1)';\r\n this.ctx.fillRect(position_2d.x - width / 2,\r\n (this.ctx.canvas.height - position_2d.y) - height / 2, width, height);\r\n }\r\n\r\n clear()\r\n {\r\n if (this.ctx)\r\n {\r\n this.ctx.clearRect(0, 0, this.ctx.canvas.width, this.ctx.canvas.height);\r\n }\r\n }\r\n\r\n draw_line_2D(from, to, color)\r\n {\r\n this.ctx.strokeStyle = color || 'rgba(255, 0, 0, 1)';\r\n this.ctx.beginPath();\r\n this.ctx.moveTo(from.x, from.y);\r\n this.ctx.lineTo(to.x, to.y);\r\n this.ctx.closePath();\r\n this.ctx.stroke();\r\n }\r\n\r\n draw_line(points, color = 0xff0000)\r\n {\r\n const material = new LineBasicMaterial({\r\n color: color\r\n });\r\n\r\n const geometry = new BufferGeometry().setFromPoints(points);\r\n\r\n const line = new Line(geometry, material);\r\n line.frustumCulled = false;\r\n SceneManager.current.add(line);\r\n return line;\r\n }\r\n\r\n draw_cube(pos, size, color)\r\n {\r\n size = size || 1;\r\n color = color || 0xff0000;\r\n pos = pos || new Vector3();\r\n\r\n const cube = new Cube(new Vector3(size, size, size), undefined, color);\r\n cube.position.copy(pos);\r\n SceneManager.current.add(cube);\r\n return cube;\r\n }\r\n\r\n draw_oriented_cube(from, to, height = 1, color = '#FF0000', depth = 0.1)\r\n {\r\n const size = from.distanceTo(to);\r\n const cube = new Cube(new Vector3(depth, height, size), undefined, color);\r\n\r\n const center = to.clone().sub(from).multiplyScalar(0.5);\r\n const forward_dir = center.clone().normalize();\r\n center.add(from);\r\n\r\n cube.position.copy(center);\r\n\r\n // let up = new Vector3(0, 1, 0);\r\n // let forward = forward_dir.clone();\r\n // let right = forward.clone().cross(up);\r\n\r\n // cube.quaternion.setFromRotationMatrix(new Matrix4().makeBasis(right,up,forward));\r\n cube.quaternion.setFromUnitVectors(new Vector3(0, 0, -1), forward_dir);\r\n\r\n SceneManager.current.add(cube);\r\n return cube;\r\n }\r\n\r\n draw_plane(width, height, color)\r\n {\r\n const geometry = new PlaneGeometry(width, height);\r\n const material = new ShaderMaterial({\r\n uniforms: {\r\n _Color: { value: new Vector4(0, 1, 0, 0.2) }\r\n },\r\n vertexShader: basic_color_vert,\r\n fragmentShader: basic_color_frag,\r\n transparent: true,\r\n depthWrite: false\r\n });\r\n\r\n const plane = new Mesh(geometry, material);\r\n plane.renderOrder = -10000;\r\n SceneManager.current.add(plane);\r\n return plane;\r\n }\r\n\r\n draw_empty_cube(pos, size, color)\r\n {\r\n size = size || 1;\r\n color = color || 0xff0000;\r\n\r\n const box = new Box3().setFromCenterAndSize(new Vector3(), new Vector3(size, size, size));\r\n const helper = new Box3Helper(box, color);\r\n helper.position.copy(pos || new Vector3());\r\n return helper;\r\n }\r\n\r\n draw_sphere(pos, size, color)\r\n {\r\n size = size || 1;\r\n color = color || 0xff0000;\r\n pos = pos || new Vector3();\r\n\r\n const sphere = new Sphere(size, color);\r\n sphere.position.copy(pos);\r\n SceneManager.current.add(sphere);\r\n return sphere;\r\n }\r\n\r\n draw_point_array(input_points, open = false, color = 0xff0000)\r\n {\r\n const catmull = new CatmullRomCurve3(input_points, open);\r\n catmull.updateArcLengths();\r\n const points = catmull.getSpacedPoints(200);\r\n const line_helper = this.draw_line(points, 0x00ff00);\r\n // line_helper.position.y = 1.5;\r\n return line_helper;\r\n }\r\n\r\n draw_sphere_helper(sphere, color)\r\n {\r\n color = color || 0xff0000;\r\n const geometry = new SphereGeometry(sphere.radius, 32, 32);\r\n const material = new MeshBasicMaterial({ color: color });\r\n const sphere_mesh = new Mesh(geometry, material);\r\n sphere_mesh.position.copy(sphere.center);\r\n SceneManager.current.add(sphere_mesh);\r\n return sphere_mesh;\r\n }\r\n\r\n draw_math_sphere(sphere)\r\n {\r\n const geometry = new SphereGeometry(sphere.radius, 32, 32);\r\n const material = new ShaderMaterial({\r\n uniforms: {\r\n _Color: { value: new Vector4(1, 0, 0, 0.2) }\r\n },\r\n vertexShader: basic_color_vert,\r\n fragmentShader: basic_color_frag,\r\n transparent: true\r\n });\r\n // var material = new MeshBasicMaterial( {color: 0xff0000, transparent = true} );\r\n const sphere1 = new Mesh(geometry, material);\r\n sphere1.position.copy(sphere.center);\r\n SceneManager.current.add(sphere1);\r\n }\r\n\r\n draw_bounding_box(bb)\r\n {\r\n const helper = new Box3Helper(bb, 0xffff00);\r\n SceneManager.current.add(helper);\r\n }\r\n\r\n draw_curve(curve, options)\r\n {\r\n const offset = new Vector3(0, 0, 0);\r\n if (options)\r\n {\r\n offset.y = options.offset || 0;\r\n }\r\n\r\n for (let i = 0; i < curve.length - 1; i++)\r\n {\r\n this.draw_line(curve[i].clone().add(offset), curve[i + 1].clone().add(offset));\r\n }\r\n }\r\n\r\n draw_texture(tex, w, h)\r\n {\r\n const mesh = new Mesh(new PlaneGeometry(1, 1), new ScreenSpaceTextureMaterial());\r\n this.display_texture_meshes.push(mesh);\r\n this.scene.add(mesh);\r\n\r\n mesh.material.set_texture(tex, w, h);\r\n return mesh;\r\n }\r\n\r\n render(graphics)\r\n {\r\n for (let i = 0; i < this.display_texture_meshes.length; i++)\r\n {\r\n this.display_texture_meshes[i].material.set_screen_size(OScreen.width, OScreen.height);\r\n }\r\n if (this.scene.children.length > 0)\r\n {\r\n graphics.render(this.scene, this.camera);\r\n }\r\n }\r\n}\r\n\r\nexport default new Debug();\r\n","import BlitMaterial from '../materials/BlitMaterial';\r\nimport frag from '../shaders/clear/clear_depth_normal.frag';\r\n\r\nimport { Vector4 } from 'three';\r\n\r\nexport default class ClearDepthNormalMaterial extends BlitMaterial\r\n{\r\n constructor(clear_depth, clear_normal)\r\n {\r\n super(frag);\r\n this.uniforms._DepthNormal = { value: new Vector4(clear_depth, clear_normal.x, clear_normal.y, clear_normal.z) };\r\n }\r\n}\r\n","import vert from '../shaders/depth_normals/depth_normals.vert';\r\nimport frag from '../shaders/depth_normals/depth_normals.frag';\r\n\r\nimport { ShaderMaterial } from 'three';\r\n\r\nexport default class DepthNormalMaterial extends ShaderMaterial\r\n{\r\n constructor()\r\n {\r\n super({\r\n uniforms: {\r\n _FarPlane: { value: 1 }\r\n },\r\n vertexShader: vert,\r\n fragmentShader: frag\r\n });\r\n }\r\n\r\n set far_plane(value)\r\n {\r\n this.uniforms._FarPlane.value = value;\r\n }\r\n\r\n get far_plane()\r\n {\r\n return this.uniforms._FarPlane.value;\r\n }\r\n}\r\n","import CameraManager from '../CameraManager';\r\nimport OScreen from '../OScreen';\r\n\r\nimport ClearDepthNormalMaterial from '../materials/ClearDepthNormalMaterial';\r\nimport DepthNormalMaterial from '../materials/DepthNormalMaterial';\r\n\r\nimport { WebGLRenderTarget } from 'three';\r\nimport { Vector3 } from 'three';\r\n\r\nexport default class DepthAndNormalsRenderer\r\n{\r\n constructor()\r\n {\r\n this.RT = new WebGLRenderTarget(OScreen.width, OScreen.height);\r\n\r\n this.clear_depth_normal_mat = new ClearDepthNormalMaterial(1, new Vector3(0, 0, 1));\r\n this.depth_normal_material = new DepthNormalMaterial();\r\n }\r\n\r\n render(graphics)\r\n {\r\n this.__resize_RT_if_necessary();\r\n\r\n graphics.clear(this.RT, undefined, true, true);\r\n\r\n graphics.blit_clear_with_material(this.RT, this.clear_depth_normal_mat);\r\n\r\n this.depth_normal_material.far_plane = CameraManager.current.far;\r\n\r\n graphics.render(undefined, undefined, this.RT, this.depth_normal_material);\r\n }\r\n\r\n __resize_RT_if_necessary()\r\n {\r\n if (this.RT.width !== OScreen.width || this.RT.height !== OScreen.height)\r\n {\r\n this.RT.setSize(OScreen.width, OScreen.height);\r\n }\r\n }\r\n\r\n get render_target()\r\n {\r\n return this.RT;\r\n }\r\n}\r\n","import BlitMaterial from '../materials/BlitMaterial';\r\n\r\nimport { Scene } from 'three';\r\nimport { Mesh } from 'three';\r\nimport { PlaneGeometry } from 'three';\r\nimport { OrthographicCamera } from 'three';\r\n\r\nexport default class Blitter\r\n{\r\n constructor(renderer)\r\n {\r\n this.renderer = renderer;\r\n this._blit_scene = new Scene();\r\n this._blit_material = new BlitMaterial();\r\n this._blit_quad = new Mesh(\r\n new PlaneGeometry(1, 1), this._blit_material);\r\n this._blit_scene.add(this._blit_quad);\r\n this._blit_camera = new OrthographicCamera(-1, 1, 1, -1, -10000, 10000);\r\n }\r\n\r\n blit(src, dst)\r\n {\r\n this._blit_quad.material = this._blit_material;\r\n\r\n const src_texture = src.isWebGLRenderTarget === true ? src.texture : src;\r\n const src_width = src.isWebGLRenderTarget === true ? src.width : src.image.width;\r\n const src_height = src.isWebGLRenderTarget === true ? src.height : src.image.height;\r\n\r\n this._blit_quad.material.uniforms._MainTex.value = src_texture;\r\n this._blit_quad.material.uniforms._Resolution.value.set(src_width, src_height);\r\n\r\n if (dst)\r\n {\r\n this._blit_quad.material.uniforms._TargetResolution.value.set(dst.width, dst.height);\r\n }\r\n else\r\n {\r\n this.renderer.getSize(this._blit_quad.material.uniforms._TargetResolution.value);\r\n }\r\n\r\n this.__render(dst);\r\n }\r\n\r\n material_pass(mat, dst)\r\n {\r\n this._blit_quad.material = mat;\r\n // this._blit_quad.material.uniforms._MainTex.value = undefined;\r\n // this._blit_quad.material.uniforms._Resolution.value.set(1, 1);\r\n\r\n this.__render(dst);\r\n }\r\n\r\n blit_with_material(src, dst, mat)\r\n {\r\n const src_texture = src.isWebGLRenderTarget === true ? src.texture : src;\r\n const src_width = src.isWebGLRenderTarget === true ? src.width : src.image.width;\r\n const src_height = src.isWebGLRenderTarget === true ? src.height : src.image.height;\r\n\r\n this._blit_quad.material = mat;\r\n this._blit_quad.material.uniforms._MainTex.value = src_texture;\r\n this._blit_quad.material.uniforms._Resolution.value.set(src_width, src_height);\r\n\r\n if (dst)\r\n {\r\n this._blit_quad.material.uniforms._TargetResolution.value.set(dst.width, dst.height);\r\n }\r\n else\r\n {\r\n this.renderer.getSize(this._blit_quad.material.uniforms._TargetResolution.value);\r\n }\r\n\r\n this.__render(dst);\r\n }\r\n\r\n blit_clear_with_material(dst_RT, mat)\r\n {\r\n this._blit_quad.material = mat;\r\n\r\n this.__render(dst_RT);\r\n }\r\n\r\n dispose()\r\n {\r\n this._blit_quad.geometry.dispose();\r\n this._blit_quad.material.dispose();\r\n }\r\n\r\n __render(RT)\r\n {\r\n RT = RT === undefined ? null : RT;\r\n\r\n const current_rt = this.renderer.getRenderTarget();\r\n\r\n this.renderer.setRenderTarget(RT === undefined ? null : RT);\r\n this.renderer.render(this._blit_scene, this._blit_camera);\r\n\r\n this.renderer.setRenderTarget(current_rt);\r\n }\r\n}\r\n","import Configuration from './Configuration';\r\nimport BaseRender from './render_mode/BaseRender';\r\nimport OScreen from './OScreen';\r\nimport CameraManager from './CameraManager';\r\nimport SceneManager from './SceneManager';\r\nimport Capabilities from './Capabilities';\r\nimport DepthAndNormalsRenderer from './render_utilities/DepthAndNormalsRenderer';\r\nimport Blitter from './render_utilities/Blitter';\r\n\r\nimport { WebGLRenderer } from 'three';\r\n\r\nclass Graphics\r\n{\r\n init(canvas, context_attributes)\r\n {\r\n this._renderer = undefined;\r\n this.blitter = undefined;\r\n this.canvas = undefined;\r\n this.no_render = undefined;\r\n this.current_render_mode = undefined;\r\n this.generateDepthNormalTexture = false;\r\n this.depth_and_normals_renderer = undefined;\r\n\r\n this.is_webgl2 = false;\r\n this.canvas_context = undefined;\r\n this.context_attributes = undefined;\r\n\r\n this.context_attributes = {\r\n alpha: true,\r\n depth: true,\r\n desynchronized: false,\r\n stencil: false,\r\n antialias: false,\r\n premultipliedAlpha: true,\r\n preserveDrawingBuffer: true,\r\n powerPreference: 'high-performance',\r\n logarithmicDepthBuffer: false,\r\n force_webgl2: true,\r\n xr_enabled: false\r\n };\r\n\r\n Object.assign(this.context_attributes, context_attributes);\r\n\r\n if (this.context_attributes.force_webgl2)\r\n {\r\n this.canvas_context = canvas.getContext('webgl2', this.context_attributes) ||\r\n canvas.getContext('webgl', this.context_attributes) ||\r\n canvas.getContext('experimental-webgl', this.context_attributes);\r\n }\r\n else\r\n {\r\n this.canvas_context = canvas.getContext('webgl', this.context_attributes) ||\r\n canvas.getContext('experimental-webgl', this.context_attributes);\r\n }\r\n\r\n this.is_webgl2 = this.canvas_context.constructor.name === 'WebGL2RenderingContext';\r\n\r\n // console.log(`Using WebGL ${this.is_webgl2 ? 2 : 1}`);\r\n\r\n this._renderer = new WebGLRenderer({\r\n canvas: canvas,\r\n context: this.canvas_context\r\n });\r\n\r\n if (this.context_attributes.xr_enabled)\r\n {\r\n this._renderer.xr.enabled = true;\r\n }\r\n\r\n this._renderer.autoClear = false;\r\n\r\n this._renderer.setPixelRatio(1);\r\n\r\n OScreen.dpr = Configuration.dpr;\r\n\r\n if (!this.is_webgl2)\r\n {\r\n this._renderer.extensions.get('ANGLE_instanced_arrays');\r\n }\r\n\r\n this.blitter = new Blitter(this._renderer);\r\n\r\n this.canvas = this._renderer.domElement;\r\n\r\n this.no_render = new BaseRender();\r\n\r\n this.current_render_mode = this.no_render;\r\n Capabilities.max_anisotropy = this._renderer.capabilities.getMaxAnisotropy();\r\n Capabilities.vertex_texture_sampler_available = this._renderer.capabilities.maxVertexTextures > 0;\r\n Capabilities.fp_textures_available = this._renderer.capabilities.floatVertexTextures;\r\n\r\n this.generateDepthNormalTexture = false;\r\n\r\n this.depth_and_normals_renderer = new DepthAndNormalsRenderer();\r\n\r\n this.resize_observer = new ResizeObserver(this.on_resize.bind(this));\r\n this.resize_observer.observe(this.canvas);\r\n }\r\n\r\n get dom_element()\r\n {\r\n return this._renderer.domElement;\r\n }\r\n\r\n get depth_normals_RT()\r\n {\r\n return this.depth_and_normals_renderer.render_target;\r\n }\r\n\r\n set_state(new_state)\r\n {\r\n // console.log('VIEWAPI - map render mode switch to: ' + new_state.constructor.name);\r\n\r\n this.current_render_mode.on_exit(this, this._renderer);\r\n this.current_render_mode = new_state;\r\n this.current_render_mode.on_enter(this, this._renderer);\r\n }\r\n\r\n update()\r\n {\r\n if (this.generateDepthNormalTexture)\r\n {\r\n this.depth_and_normals_renderer.render(this);\r\n }\r\n\r\n this.__update_current_camera();\r\n\r\n if (CameraManager.current)\r\n {\r\n this.current_render_mode.render();\r\n }\r\n\r\n OScreen.update();\r\n }\r\n\r\n __update_current_camera()\r\n {\r\n if (CameraManager.current)\r\n {\r\n CameraManager.current.aspect = OScreen.aspect_ratio;\r\n CameraManager.current.updateProjectionMatrix();\r\n CameraManager.current.updateMatrix();\r\n CameraManager.current.updateMatrixWorld(true);\r\n }\r\n }\r\n\r\n render(scene, camera, RT, override_mat)\r\n {\r\n this.__apply_override_material(scene, override_mat);\r\n\r\n this._renderer.setRenderTarget(RT === undefined ? null : RT);\r\n this._renderer.render(scene || SceneManager.current,\r\n camera || CameraManager.current);\r\n\r\n this.__apply_override_material(scene, undefined);\r\n }\r\n\r\n render_scene(scene)\r\n {\r\n if (scene.on_pre_render)\r\n {\r\n scene.on_pre_render();\r\n }\r\n\r\n if (scene.render)\r\n {\r\n scene.render();\r\n }\r\n else\r\n {\r\n this.render(scene, undefined);\r\n }\r\n\r\n if (scene.on_post_render)\r\n {\r\n scene.on_post_render();\r\n }\r\n }\r\n\r\n __apply_override_material(scene, mat)\r\n {\r\n mat = mat === undefined ? null : mat;\r\n if (scene)\r\n {\r\n scene.overrideMaterial = mat;\r\n }\r\n else\r\n {\r\n SceneManager.current.overrideMaterial = mat;\r\n }\r\n }\r\n\r\n readback_RT(RT, buffer)\r\n {\r\n this._renderer.readRenderTargetPixels(RT, 0, 0, RT.width, RT.height, buffer);\r\n }\r\n\r\n clear(RT, camera, clear_depth, clear_stencil)\r\n {\r\n this._renderer.setRenderTarget(RT === undefined ? null : RT);\r\n\r\n if (camera)\r\n {\r\n this._renderer.setClearColor(camera.clear_color, camera.clear_alpha);\r\n }\r\n\r\n this._renderer.clear(!!camera, // clear color\r\n !!clear_depth,\r\n !!clear_stencil);\r\n }\r\n\r\n on_resize(entries)\r\n {\r\n for (const entry of entries)\r\n {\r\n OScreen.dpr = Configuration.dpr;\r\n OScreen.update_position(entry.contentRect.x, entry.contentRect.y);\r\n OScreen.update_size(entry.contentRect.width, entry.contentRect.height);\r\n\r\n this.canvas.width = OScreen.render_width;\r\n this.canvas.height = OScreen.render_height;\r\n\r\n this._renderer.setViewport(0, 0, OScreen.render_width, OScreen.render_height);\r\n\r\n this.__update_current_camera();\r\n }\r\n }\r\n\r\n material_pass(mat, dst)\r\n {\r\n this.blitter.material_pass(mat, dst);\r\n }\r\n\r\n blit(src_RT, dst_RT, mat)\r\n {\r\n if (mat)\r\n {\r\n this.blitter.blit_with_material(src_RT, dst_RT, mat);\r\n }\r\n else\r\n {\r\n this.blitter.blit(src_RT, dst_RT);\r\n }\r\n }\r\n\r\n blit_clear_with_material(dst_RT, mat)\r\n {\r\n this.blitter.blit_clear_with_material(dst_RT, mat);\r\n }\r\n\r\n take_screenshot(blob_callback, width = OScreen.width, height = OScreen.height)\r\n {\r\n // const ctx = this;\r\n\r\n const old_width = OScreen.width;\r\n const old_height = OScreen.height;\r\n\r\n const new_width = width;\r\n const new_height = height;\r\n\r\n const tile_width = 1024;\r\n const tile_height = 1024;\r\n\r\n const divisions_x = parseInt(Math.ceil(new_width / tile_width));\r\n const divisions_y = parseInt(Math.ceil(new_height / tile_height));\r\n\r\n OScreen.update_size(tile_width, tile_height);\r\n const old_dpr = this._renderer.getPixelRatio();\r\n this._renderer.setPixelRatio(1);\r\n\r\n this._renderer.setSize(tile_width, tile_height, false);\r\n\r\n const canvas_2d = document.createElement('canvas');\r\n const ctx_2D = canvas_2d.getContext('2d');\r\n\r\n ctx_2D.canvas.width = new_width;\r\n ctx_2D.canvas.height = new_height;\r\n\r\n CameraManager.current.aspect = OScreen.aspect_ratio;\r\n CameraManager.current.updateMatrix();\r\n CameraManager.current.updateMatrixWorld(true);\r\n\r\n for (let x = 0; x < divisions_x; x++)\r\n {\r\n for (let y = 0; y < divisions_y; y++)\r\n {\r\n CameraManager.current.setViewOffset(new_width, new_height,\r\n OScreen.width * x, OScreen.height * y,\r\n OScreen.width, OScreen.height);\r\n this.current_render_mode.render();\r\n\r\n ctx_2D.drawImage(this._renderer.domElement, OScreen.width * x, OScreen.height * y);\r\n }\r\n }\r\n\r\n // transform the result canvas into a blob\r\n // from them the callback turns into a ULR and download it\r\n ctx_2D.canvas.toBlob(blob_callback, 'image/png;base64;');\r\n\r\n CameraManager.current.clearViewOffset();\r\n\r\n OScreen.update_size(old_width, old_height);\r\n this._renderer.setPixelRatio(old_dpr);\r\n this._renderer.setSize(old_width, old_height, false);\r\n\r\n CameraManager.current.aspect = OScreen.aspect_ratio;\r\n CameraManager.current.updateMatrix();\r\n CameraManager.current.updateMatrixWorld(true);\r\n }\r\n\r\n download_screenshot(blob)\r\n {\r\n const link = document.createElement('a');\r\n link.download = 'Snapshot.png';\r\n\r\n link.href = URL.createObjectURL(blob);\r\n link.click();\r\n\r\n link.onclick = function()\r\n {\r\n requestAnimationFrame(function()\r\n {\r\n URL.revokeObjectURL(link.href);\r\n });\r\n link.removeAttribute('href');\r\n };\r\n }\r\n\r\n dispose()\r\n {\r\n this._renderer.dispose();\r\n this.current_render_mode.dispose();\r\n this.blitter.dispose();\r\n }\r\n}\r\n\r\nexport default new Graphics();\r\n","import frag from '../shaders/normal/normal.frag';\r\nimport vert from '../shaders/normal/normal.vert';\r\n\r\nimport { ShaderMaterial } from 'three';\r\n\r\nexport default class NormalMaterial extends ShaderMaterial\r\n{\r\n constructor()\r\n {\r\n super({\r\n uniforms: {\r\n },\r\n vertexShader: vert,\r\n fragmentShader: frag\r\n });\r\n }\r\n}\r\n","import CameraManager from '../CameraManager';\r\nimport SceneManager from '../SceneManager';\r\nimport BaseRender from '../render_mode/BaseRender';\r\nimport Graphics from '../Graphics';\r\nimport NormalMaterial from '../materials/NormalMaterial';\r\n\r\nexport default class DebugNormalsRender extends BaseRender\r\n{\r\n constructor()\r\n {\r\n super();\r\n }\r\n\r\n render()\r\n {\r\n Graphics.clear(undefined, CameraManager.current, true, true);\r\n\r\n Graphics.render(SceneManager.current, CameraManager.current, undefined, new NormalMaterial());\r\n }\r\n}\r\n","export default class KeyboardInput\r\n{\r\n init(container)\r\n {\r\n this.ctrlz_pressed = false;\r\n this.ctrlz_fired = false;\r\n\r\n this.keys = {};\r\n this.keys_keys = [];\r\n this.container = container;\r\n\r\n this.container.addEventListener('keydown', this.on_key_down.bind(this), false);\r\n this.container.addEventListener('keyup', this.on_key_up.bind(this), false);\r\n }\r\n\r\n on_key_down(e)\r\n {\r\n if (e.keyCode === 90 && e.ctrlKey && !this.ctrlz_fired)\r\n {\r\n this.ctrlz_pressed = true;\r\n this.ctrlz_fired = true;\r\n }\r\n if (e.key)\r\n {\r\n this.press_key(e.key);\r\n }\r\n }\r\n\r\n on_key_up(e)\r\n {\r\n this.release_key(e.key);\r\n }\r\n\r\n clear()\r\n {\r\n this.ctrlz_pressed = false;\r\n\r\n for (let i = 0; i < this.keys_keys.length; i++)\r\n {\r\n this.keys[this.keys_keys[i]].pressed = false;\r\n this.keys[this.keys_keys[i]].released = false;\r\n }\r\n }\r\n\r\n release_key(key_name)\r\n {\r\n const key = this.keys[key_name];\r\n if (key)\r\n {\r\n key.fired = false;\r\n key.down = false;\r\n key.released = true;\r\n }\r\n }\r\n\r\n release_keys()\r\n {\r\n this.ctrlz_fired = false;\r\n\r\n for (let i = 0; i < this.keys_keys.length; i++)\r\n {\r\n this.keys[this.keys_keys[i]].fired = false;\r\n this.keys[this.keys_keys[i]].down = false;\r\n }\r\n }\r\n\r\n press_key(key_name)\r\n {\r\n const key = this.keys[key_name];\r\n if (key)\r\n {\r\n if (key.down === false)\r\n {\r\n key.pressed = true;\r\n }\r\n key.down = true;\r\n key.fired = true;\r\n }\r\n }\r\n\r\n is_key_pressed(key_name)\r\n {\r\n const key = this.keys[key_name];\r\n if (key)\r\n {\r\n return key.pressed;\r\n }\r\n return false;\r\n }\r\n\r\n is_key_down(key_name)\r\n {\r\n const key = this.keys[key_name];\r\n if (key)\r\n {\r\n return key.down;\r\n }\r\n return false;\r\n }\r\n\r\n is_key_released(key_name)\r\n {\r\n const key = this.keys[key_name];\r\n if (key)\r\n {\r\n return key.released;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n register_key(key)\r\n {\r\n this.keys[key] =\r\n {\r\n key_name: key,\r\n pressed: false,\r\n down: false,\r\n fired: false\r\n };\r\n\r\n this.keys_keys = Object.keys(this.keys);\r\n }\r\n\r\n unregister_key(key_name)\r\n {\r\n delete this.keys[key_name];\r\n }\r\n\r\n dispose()\r\n {\r\n this.container.removeEventListener('keydown', this.on_key_down.bind(this), false);\r\n this.container.removeEventListener('keyup', this.on_key_up.bind(this), false);\r\n }\r\n}\r\n","import { InputController } from 'pit-js';\r\nimport KeyboardInput from './KeyboardInput';\r\n\r\nclass Input extends InputController\r\n{\r\n constructor()\r\n {\r\n super();\r\n\r\n this.clicked = false;\r\n this.captured_NDC = { x: 0, y: 0 };\r\n this.current_NDC_delta = { x: 0, y: 0 };\r\n\r\n this.keyboard = new KeyboardInput();\r\n }\r\n\r\n init(container, keyboard_input_container)\r\n {\r\n super.init(container);\r\n\r\n this.keyboard.init(keyboard_input_container);\r\n }\r\n\r\n dispose()\r\n {\r\n super.dispose();\r\n\r\n this.keyboard.dispose();\r\n }\r\n\r\n update()\r\n {\r\n if (this.left_mouse_button_pressed)\r\n {\r\n this.captured_NDC.x = this.NDC.x;\r\n this.captured_NDC.y = this.NDC.y;\r\n }\r\n\r\n if (this.left_mouse_button_down)\r\n {\r\n this.current_NDC_delta.x += Math.abs(this.NDC_delta.x);\r\n this.current_NDC_delta.y += Math.abs(this.NDC_delta.y);\r\n }\r\n\r\n if (this.left_mouse_button_released)\r\n {\r\n if (this.current_NDC_delta.x < 0.001 || this.current_NDC_delta.y < 0.001)\r\n {\r\n this.clicked = true;\r\n }\r\n\r\n this.current_NDC_delta = { x: 0, y: 0 };\r\n }\r\n }\r\n\r\n clear()\r\n {\r\n super.clear();\r\n\r\n this.clicked = false;\r\n\r\n this.keyboard.clear();\r\n }\r\n}\r\n\r\nexport default new Input();\r\n","\r\nclass OS\r\n{\r\n init()\r\n {\r\n this.operating_systems = {\r\n ANDROID: 'android',\r\n IOS: 'ios',\r\n LINUX: 'linux',\r\n MAC: 'mac',\r\n WINDOWS: 'windows'\r\n };\r\n\r\n this.is_mobile = !!(navigator.userAgent.match(/(iPhone|iPod|iPad|Android|playbook|silk|BlackBerry|BB10|Windows Phone|Tizen|Bada|webOS|IEMobile|Opera Mini)/));\r\n this.is_ipad = !!(navigator.userAgent.match(/Mac/) && navigator.maxTouchPoints && navigator.maxTouchPoints > 2);\r\n this.is_ios = !!navigator.userAgent.match(/(iPhone|iPod|iPad)/) || this.is_ipad;\r\n\r\n this.is_android = this.get_os() === this.operating_systems.ANDROID;\r\n this.is_linux = this.get_os() === this.operating_systems.LINUX;\r\n this.is_mac = this.get_os() === this.operating_systems.MAC;\r\n this.is_windows = this.get_os() === this.operating_systems.WINDOWS;\r\n }\r\n\r\n get_os()\r\n {\r\n const userAgent = window.navigator.userAgent;\r\n const platform = window.navigator.platform;\r\n const macosPlatforms = ['Macintosh', 'MacIntel', 'MacPPC', 'Mac68K'];\r\n const windowsPlatforms = ['Win32', 'Win64', 'Windows', 'WinCE'];\r\n const iosPlatforms = ['iPhone', 'iPad', 'iPod'];\r\n let os = null;\r\n\r\n if (macosPlatforms.indexOf(platform) !== -1)\r\n {\r\n os = this.operating_systems.MAC;\r\n }\r\n else if (iosPlatforms.indexOf(platform) !== -1)\r\n {\r\n os = this.operating_systems.IOS;\r\n }\r\n else if (windowsPlatforms.indexOf(platform) !== -1)\r\n {\r\n os = this.operating_systems.WINDOWS;\r\n }\r\n else if (/Android/.test(userAgent))\r\n {\r\n os = this.operating_systems.ANDROID;\r\n }\r\n else if (!os && /Linux/.test(platform))\r\n {\r\n os = this.operating_systems.LINUX;\r\n }\r\n\r\n return os;\r\n }\r\n}\r\n\r\nexport default new OS();\r\n","import { Vector3 } from 'three';\r\n\r\nclass ReflectionPlaneContext\r\n{\r\n init()\r\n {\r\n this.target_geometry = undefined;\r\n this.target_position = new Vector3();\r\n }\r\n\r\n set_target_geometry(geometry)\r\n {\r\n this.target_geometry = geometry;\r\n }\r\n}\r\n\r\nexport default new ReflectionPlaneContext();\r\n","import { Vector2 } from 'three';\r\nimport { ShaderMaterial } from 'three';\r\nimport { Mesh } from 'three';\r\nimport { DataTexture } from 'three';\r\nimport { RGBAFormat } from 'three';\r\nimport { RGBFormat } from 'three';\r\nimport { FloatType } from 'three';\r\n\r\nexport default class GeometryBatch\r\n{\r\n constructor(geometry, batch_width)\r\n {\r\n this.geometry = geometry;\r\n\r\n this.material = undefined;\r\n this.uniforms = {};\r\n this.batch_width = batch_width;\r\n\r\n this.data_textures = [];\r\n\r\n this.object_names = undefined;\r\n\r\n this.zero_offset = new Vector2();\r\n this.write_offset = new Vector2();\r\n\r\n this.uniform_dirty_count = 0;\r\n\r\n this.tmp_uploaded_data_count = 0;\r\n }\r\n\r\n init(object_names, vert_shader, frag_shader)\r\n {\r\n this.material = new ShaderMaterial({\r\n uniforms: this.uniforms,\r\n vertexShader: vert_shader,\r\n fragmentShader: frag_shader\r\n });\r\n this.object_names = object_names;\r\n }\r\n\r\n add_global_uniform(name, data)\r\n {\r\n this.uniforms[name] = { value: data };\r\n this.material.needsUpdate = true;\r\n }\r\n\r\n set_global_uniform(name, data)\r\n {\r\n this.uniforms[name].value = data;\r\n }\r\n\r\n add_object_uniform_v3(uniform_name, default_value_v3)\r\n {\r\n const src_tex = this.__create_rgb_texture(this.batch_width);\r\n const dst_tex = this.__create_rgb_texture(this.batch_width);\r\n const one_pixel_tex = this.__create_rgb_texture(1);\r\n\r\n const new_data_tex = this.__add_data_texture(uniform_name, src_tex, dst_tex, one_pixel_tex);\r\n\r\n if (default_value_v3)\r\n {\r\n this.__flood_data_texture_rgb(new_data_tex, default_value_v3);\r\n }\r\n }\r\n\r\n add_object_uniform_v4(uniform_name, default_value_v4)\r\n {\r\n const src_tex = this.__create_rgba_texture(this.batch_width);\r\n const dst_tex = this.__create_rgba_texture(this.batch_width);\r\n const one_pixel_tex = this.__create_rgba_texture(1);\r\n\r\n const new_data_tex = this.__add_data_texture(uniform_name, src_tex, dst_tex, one_pixel_tex);\r\n\r\n if (default_value_v4)\r\n {\r\n this.__flood_data_texture_rgba(new_data_tex, default_value_v4);\r\n }\r\n }\r\n\r\n add_object_uniform_v4_float(uniform_name, default_value_v4)\r\n {\r\n const src_tex = this.__create_rgba_float_texture(this.batch_width);\r\n const dst_tex = this.__create_rgba_float_texture(this.batch_width);\r\n const one_pixel_tex = this.__create_rgba_float_texture(1);\r\n\r\n const new_data_tex = this.__add_data_texture(uniform_name, src_tex, dst_tex, one_pixel_tex);\r\n\r\n if (default_value_v4)\r\n {\r\n this.__flood_data_texture_rgba(new_data_tex, default_value_v4);\r\n }\r\n }\r\n\r\n set_object_uniform_v3(object_name, uniform_name, vector3, use_r, use_g, use_b)\r\n {\r\n const obj_index = this.__get_object_index(object_name);\r\n const data_texture = this.__get_data_texture(uniform_name);\r\n\r\n this.__set_pixel_rgb(data_texture.src, obj_index, vector3, use_r, use_g, use_b);\r\n this.__set_pixel_rgb(data_texture.one_pixel, 0, vector3, use_r, use_g, use_b);\r\n\r\n data_texture.last_accessed_index = obj_index;\r\n\r\n data_texture.dirty_count++;\r\n }\r\n\r\n set_object_uniform_v4(object_name, uniform_name, vector4, use_r, use_g, use_b, use_a)\r\n {\r\n const obj_index = this.__get_object_index(object_name);\r\n const data_texture = this.__get_data_texture(uniform_name);\r\n\r\n this.__set_pixel_rgba(data_texture.src, obj_index, vector4, use_r, use_g, use_b, use_a);\r\n this.__set_pixel_rgba(data_texture.one_pixel, 0, vector4, use_r, use_g, use_b, use_a);\r\n data_texture.last_accessed_index = obj_index;\r\n\r\n data_texture.dirty_count++;\r\n }\r\n\r\n upload_texture_data(renderer, upload_budget)\r\n {\r\n for (let i = 0; i < this.data_textures.length; i++)\r\n {\r\n if (upload_budget > 0 && this.data_textures[i].dirty_count > 0)\r\n {\r\n if (this.data_textures[i].dirty_count === 1)\r\n {\r\n this.__partial_texture_data_upload(renderer, this.data_textures[i]);\r\n }\r\n if (this.data_textures[i].dirty_count > 1)\r\n {\r\n this.__full_texture_data_upload(renderer, this.data_textures[i]);\r\n }\r\n\r\n this.data_textures[i].dirty_count = 0;\r\n\r\n upload_budget--;\r\n }\r\n }\r\n }\r\n\r\n get_uniform_dirty_count()\r\n {\r\n this.uniform_dirty_count = 0;\r\n for (let i = 0; i < this.data_textures.length; i++)\r\n {\r\n if (this.data_textures[i].dirty_count > 0)\r\n {\r\n this.uniform_dirty_count++;\r\n }\r\n }\r\n return this.uniform_dirty_count;\r\n }\r\n\r\n __full_texture_data_upload(renderer, texture_data)\r\n {\r\n // console.log(\"full texture update of\"+ texture_data.name);\r\n texture_data.dst.needsUpdate = true;\r\n renderer.copyTextureToTexture(\r\n this.zero_offset,\r\n texture_data.src,\r\n texture_data.dst\r\n );\r\n }\r\n\r\n __partial_texture_data_upload(renderer, texture_data)\r\n {\r\n // console.log(\"partial texture update\"+ texture_data.name);\r\n const index = texture_data.last_accessed_index;\r\n if (index === -1)\r\n {\r\n return;\r\n }\r\n\r\n this.write_offset.y = Math.floor(index / this.batch_width);\r\n this.write_offset.x = index - this.batch_width * this.write_offset.y;\r\n renderer.copyTextureToTexture(\r\n this.write_offset,\r\n texture_data.one_pixel,\r\n texture_data.dst\r\n );\r\n }\r\n\r\n get_mesh()\r\n {\r\n return new Mesh(this.geometry, this.material);\r\n }\r\n\r\n __set_pixel_rgb(data_texture, index, vector3, use_r, use_g, use_b)\r\n {\r\n if (use_r)\r\n {\r\n data_texture.image.data[index * 3 + 0] = vector3.x;\r\n }\r\n if (use_g)\r\n {\r\n data_texture.image.data[index * 3 + 1] = vector3.y;\r\n }\r\n if (use_b)\r\n {\r\n data_texture.image.data[index * 3 + 2] = vector3.z;\r\n }\r\n }\r\n\r\n __set_pixel_rgba(data_texture, index, vector4, use_r, use_g, use_b, use_a)\r\n {\r\n if (use_r)\r\n {\r\n data_texture.image.data[index * 4 + 0] = vector4.x;\r\n }\r\n if (use_g)\r\n {\r\n data_texture.image.data[index * 4 + 1] = vector4.y;\r\n }\r\n if (use_b)\r\n {\r\n data_texture.image.data[index * 4 + 2] = vector4.z;\r\n }\r\n if (use_a)\r\n {\r\n data_texture.image.data[index * 4 + 3] = vector4.w;\r\n }\r\n }\r\n\r\n __flood_data_texture_rgb(data_texture, v3)\r\n {\r\n for (let i = 0; i < this.batch_width * this.batch_width; i++)\r\n {\r\n this.__set_pixel_rgb(data_texture.src, i, v3, true, true, true);\r\n data_texture.dirty_count++;\r\n }\r\n }\r\n\r\n __flood_data_texture_rgba(data_texture, v4)\r\n {\r\n for (let i = 0; i < this.batch_width * this.batch_width; i++)\r\n {\r\n this.__set_pixel_rgba(data_texture.src, i, v4, true, true, true, true);\r\n data_texture.dirty_count++;\r\n }\r\n }\r\n\r\n __create_rgb_texture(width)\r\n {\r\n const data = new Uint8Array(3 * width * width);\r\n return new DataTexture(data, width, width, RGBFormat);\r\n }\r\n\r\n __create_rgba_texture(width)\r\n {\r\n const data = new Uint8Array(4 * width * width);\r\n return new DataTexture(data, width, width, RGBAFormat);\r\n }\r\n\r\n __create_rgba_float_texture(width)\r\n {\r\n const data = new Float32Array(4 * width * width);\r\n return new DataTexture(data, width, width, RGBAFormat, FloatType);\r\n }\r\n\r\n __get_data_texture(uniform_name)\r\n {\r\n for (let i = 0; i < this.data_textures.length; i++)\r\n {\r\n if (this.data_textures[i].name === uniform_name)\r\n {\r\n return this.data_textures[i];\r\n }\r\n }\r\n console.error('Data texture ' + uniform_name + ' does not exist');\r\n return undefined;\r\n }\r\n\r\n __get_object_index(name)\r\n {\r\n for (let i = 0; i < this.object_names.length; i++)\r\n {\r\n if (this.object_names[i] === name)\r\n {\r\n return i;\r\n }\r\n }\r\n console.error('the name ' + name + ' is not contained in this batch');\r\n return undefined;\r\n }\r\n\r\n __add_data_texture(uniform_name, src_texture, dst_texture, one_pixel_text)\r\n {\r\n dst_texture.needsUpdate = true;\r\n\r\n this.data_textures.push({\r\n name: uniform_name,\r\n src: src_texture,\r\n dst: dst_texture,\r\n one_pixel: one_pixel_text,\r\n last_accessed_index: -1,\r\n dirty_count: 0\r\n });\r\n\r\n this.uniforms[uniform_name] = { value: dst_texture };\r\n return this.data_textures[this.data_textures.length - 1];\r\n }\r\n\r\n dispose()\r\n {\r\n for (let i = 0; i < this.data_textures.length; i++)\r\n {\r\n this.data_textures[i].src.dispose();\r\n this.data_textures[i].dst.dispose();\r\n this.data_textures[i].one_pixel.dispose();\r\n }\r\n }\r\n}\r\n","import GeometryBatch from './GeometryBatch';\r\n\r\nimport * as BufferGeometryUtils from 'three/examples/jsm/utils/BufferGeometryUtils.js';\r\n\r\nimport { BufferAttribute } from 'three';\r\nimport OMath from '../utilities/OMath';\r\n\r\nclass GeometryBatcher\r\n{\r\n init()\r\n {\r\n this.batches = [];\r\n }\r\n\r\n batch(buffer_geometries)\r\n {\r\n const attr_accessor_uvs = [];\r\n const texture_width = OMath.ceilPowerOfTwo(Math.sqrt(buffer_geometries.length));\r\n // console.log(\"Store count: \" + buffer_geometries.length + \", Texture size: \" +texture_width);\r\n\r\n this.__init_uv_array(attr_accessor_uvs, texture_width);\r\n\r\n let uv_index = 0;\r\n\r\n for (let i = 0; i < buffer_geometries.length; i++)\r\n {\r\n const vertex_count = buffer_geometries[i].getAttribute('position').count;\r\n const y = Math.floor(i / texture_width);\r\n const x = i - texture_width * y;\r\n for (let count = 0; count < vertex_count; count++)\r\n {\r\n attr_accessor_uvs[uv_index] = (x / texture_width) + 0.5 / texture_width;\r\n attr_accessor_uvs[uv_index + 1] = (y / texture_width) + 0.5 / texture_width;\r\n uv_index += 2;\r\n }\r\n }\r\n\r\n const buffer_attribute = new BufferAttribute(new Float32Array(attr_accessor_uvs), 2);\r\n const buffer_geometry = BufferGeometryUtils.mergeBufferGeometries(buffer_geometries);\r\n buffer_geometry.setAttribute('attr_accessor_uv', buffer_attribute);\r\n\r\n this.batches.push(new GeometryBatch(buffer_geometry, texture_width));\r\n return this.batches[this.batches.length - 1];\r\n }\r\n\r\n upload_texture_data(renderer)\r\n {\r\n for (let i = 0; i < this.batches.length; i++)\r\n {\r\n this.batches[i].upload_texture_data(renderer, 1);\r\n }\r\n }\r\n\r\n __init_uv_array(uvs, texture_width)\r\n {\r\n for (let i = 0; i < texture_width * texture_width * 2; i++)\r\n {\r\n uvs.push(0);\r\n }\r\n }\r\n}\r\n\r\nexport default new GeometryBatcher();\r\n","import Input from './Input';\r\nimport CameraManager from './CameraManager';\r\nimport Graphics from './Graphics';\r\n\r\nimport { Vector2 } from 'three';\r\nimport { Scene } from 'three';\r\nimport { OrthographicCamera } from 'three';\r\n\r\nclass UI\r\n{\r\n init()\r\n {\r\n this.ui_elements = [];\r\n this._tmp_normalized_pos = new Vector2();\r\n this.ss_scene = new Scene();\r\n this.ss_scene.matrixWorldAutoUpdate = false;\r\n this.ss_scene.frustumCulled = false;\r\n\r\n this.ws_scene = new Scene();\r\n this.ws_scene.matrixWorldAutoUpdate = false;\r\n this.ws_scene.frustumCulled = false;\r\n\r\n this.ss_camera = new OrthographicCamera(-1, 1, 1, -1, -100, 100);\r\n }\r\n\r\n delete_element(elem)\r\n {\r\n const index = this.ui_elements.indexOf(elem);\r\n if (index > -1)\r\n {\r\n this.ui_elements.splice(index, 1);\r\n }\r\n\r\n this.ss_scene.remove(elem);\r\n this.ws_scene.remove(elem);\r\n\r\n elem.dispose();\r\n }\r\n\r\n add_screen_space_element(elem)\r\n {\r\n this.ui_elements.push(elem);\r\n this.ss_scene.add(elem);\r\n\r\n elem.set_screen_space_coordinate_system();\r\n }\r\n\r\n add_world_space_element(elem)\r\n {\r\n this.ui_elements.push(elem);\r\n this.ws_scene.add(elem);\r\n\r\n elem.set_world_space_coordinate_system();\r\n }\r\n\r\n update()\r\n {\r\n // this.ss_camera.left = -OScreen.width / 2;\r\n // this.ss_camera.right = OScreen.width / 2;\r\n // this.ss_camera.top = OScreen.top / 2;\r\n // this.ss_camera.right = -OScreen.bottom / 2;\r\n this.ss_camera.updateProjectionMatrix();\r\n\r\n this._tmp_normalized_pos.copy(Input.NDC);\r\n for (let i = 0; i < this.ui_elements.length; i++)\r\n {\r\n this.ui_elements[i].update_state(this._tmp_normalized_pos);\r\n }\r\n }\r\n\r\n render(renderer)\r\n {\r\n // renderer.render_ui(this.scene);\r\n if (this.ss_scene.children.length > 0)\r\n {\r\n Graphics.render(this.ss_scene, this.ss_camera);\r\n }\r\n if (this.ws_scene.children.length > 0)\r\n {\r\n Graphics.render(this.ws_scene, CameraManager.current);\r\n }\r\n }\r\n\r\n clear()\r\n {\r\n this.current_clicked_element = undefined;\r\n }\r\n}\r\n\r\nexport default new UI();\r\n","import CameraManager from '../CameraManager';\r\nimport Input from '../Input';\r\nimport OMath from '../utilities/OMath';\r\nimport OScreen from '../OScreen';\r\n\r\nimport { Vector3 } from 'three';\r\nimport { Matrix4 } from 'three';\r\nimport { Plane } from 'three';\r\nimport { Ray } from 'three';\r\nimport { Sphere } from 'three';\r\nimport { Box3 } from 'three';\r\n\r\nclass CameraUtilities\r\n{\r\n init()\r\n {\r\n this.tmp_mat = new Matrix4();\r\n this.plane = new Plane();\r\n this.ray = new Ray();\r\n\r\n this.tmp_size = new Vector3();\r\n this.tmp_unproj = new Vector3();\r\n }\r\n\r\n get_up_dir(camera)\r\n {\r\n camera = camera || CameraManager.current;\r\n const tmp_vec = new Vector3();\r\n\r\n tmp_vec.set(0, 1, 0);\r\n tmp_vec.applyQuaternion(camera.quaternion);\r\n\r\n return tmp_vec;\r\n }\r\n\r\n get_forward_dir(camera)\r\n {\r\n camera = camera || CameraManager.current;\r\n const tmp_vec = new Vector3();\r\n\r\n tmp_vec.set(0, 0, -1);\r\n tmp_vec.applyQuaternion(camera.quaternion);\r\n\r\n return tmp_vec;\r\n }\r\n\r\n get_right_dir(camera)\r\n {\r\n camera = camera || CameraManager.current;\r\n const tmp_vec = new Vector3();\r\n\r\n tmp_vec.set(1, 0, 0);\r\n tmp_vec.applyQuaternion(camera.quaternion);\r\n return tmp_vec;\r\n }\r\n\r\n unproject_mouse_position(NDC, camera)\r\n {\r\n camera = camera || CameraManager.current;\r\n const tmp_vec = new Vector3();\r\n\r\n const v_fov = (camera.fov / 2) * Math.PI / 180;\r\n const h_fov = (2 * Math.atan(Math.tan(v_fov) * camera.aspect)) / 2;\r\n\r\n const distV = Math.tan(v_fov) * camera.far;\r\n const distH = Math.tan(h_fov) * camera.far;\r\n\r\n tmp_vec.set(distH * NDC.x, distV * NDC.y, -camera.far).normalize();\r\n\r\n return tmp_vec.applyQuaternion(camera.quaternion);\r\n }\r\n\r\n get_plane_intersection(plane_position, plane_normal, NDC, camera)\r\n {\r\n camera = camera || CameraManager.current;\r\n NDC = NDC || Input.NDC;\r\n\r\n const tmp_vec = new Vector3();\r\n\r\n this.plane.setFromNormalAndCoplanarPoint(plane_normal || this.get_forward_dir(camera), plane_position);\r\n if (camera.isPerspectiveCamera)\r\n {\r\n this.ray.set(camera.position, this.unproject_mouse_position(NDC, camera));\r\n }\r\n else\r\n {\r\n this.tmp_unproj.set(NDC.x, NDC.y, 1).unproject(camera);\r\n this.ray.set(camera.position, this.tmp_unproj);\r\n }\r\n\r\n this.ray.intersectPlane(this.plane, tmp_vec);\r\n return tmp_vec;\r\n }\r\n\r\n fit_points_on_camera(points, zoom_scale = 1)\r\n {\r\n const points_sphere = new Sphere().setFromPoints(points);\r\n const world_space_center = points_sphere.center;\r\n const camera_forward = this.get_forward_dir(CameraManager.current).clone();\r\n\r\n const plane = new Plane().setFromNormalAndCoplanarPoint(camera_forward, world_space_center);\r\n\r\n const points_on_plane = OMath.project_points_on_plane(points, plane);\r\n\r\n const projected_points_center = new Vector3();\r\n let box = new Box3().setFromPoints(points_on_plane);\r\n box.getCenter(projected_points_center);\r\n\r\n const up = new Vector3(0, 1, 0).applyQuaternion(CameraManager.current.quaternion);\r\n const right = up.clone().cross(camera_forward).normalize();\r\n const mat = new Matrix4().set(right.x, up.x, camera_forward.x, world_space_center.x,\r\n right.y, up.y, camera_forward.y, world_space_center.y,\r\n right.z, up.z, camera_forward.z, world_space_center.z,\r\n 0, 0, 0, 1);\r\n\r\n const inverse_mat = new Matrix4().getInverse(mat);\r\n for (let i = 0; i < points_on_plane.length; i++)\r\n {\r\n points_on_plane[i].applyMatrix4(inverse_mat);\r\n }\r\n\r\n const size = new Vector3();\r\n box = new Box3().setFromPoints(points_on_plane);\r\n box.getSize(size);\r\n size.multiplyScalar(zoom_scale);\r\n const projected_center = new Vector3();\r\n box.getCenter(projected_center);\r\n\r\n return {\r\n position: projected_points_center,\r\n zoom: this.get_zoom_to_fit_rect(size.x / 2, size.y / 2)\r\n };\r\n }\r\n\r\n get_zoom_to_fit_rect(width, height)\r\n {\r\n const v_fov = (CameraManager.current.fov / 2) * Math.PI / 180;\r\n const h_fov = (2 * Math.atan(Math.tan(v_fov) * CameraManager.current.aspect)) / 2;\r\n\r\n const distV = height / Math.tan(v_fov);\r\n const distH = width / Math.tan(h_fov);\r\n\r\n return Math.max(Math.abs(distH), Math.abs(distV));\r\n }\r\n\r\n get_zoom_to_fit_box(bb, camera)\r\n {\r\n if (camera.isOrthographicCamera)\r\n {\r\n bb.getSize(this.tmp_size);\r\n\r\n const obj_x = this.tmp_size.x;\r\n const obj_y = this.tmp_size.y;\r\n const object_aspect = obj_x / obj_y;\r\n if (OScreen.aspect_ratio / object_aspect > 1)\r\n {\r\n return OScreen.height / obj_y;\r\n }\r\n else\r\n {\r\n return OScreen.width / obj_x;\r\n }\r\n }\r\n else\r\n {\r\n // return this.fit_points_on_camera([bb.min, bb.max], 1).zoom;\r\n const size = new Vector3();\r\n bb.getSize(size);\r\n return this.get_zoom_to_fit_rect(size.x, size.y);\r\n }\r\n }\r\n\r\n get_html_screen_pos(object, camera)\r\n {\r\n camera = camera || CameraManager.current;\r\n const tmp_vec = new Vector3();\r\n\r\n object.getWorldPosition(tmp_vec);\r\n tmp_vec.project(camera);\r\n\r\n tmp_vec.x = (tmp_vec.x * 0.5 + 0.5) * (OScreen.width);\r\n tmp_vec.y = (1 - (tmp_vec.y * 0.5 + 0.5)) * OScreen.height;\r\n return tmp_vec;\r\n }\r\n\r\n world_pos_to_screen(pos, camera)\r\n {\r\n camera = camera || CameraManager.current;\r\n const tmp_vec = new Vector3();\r\n\r\n tmp_vec.copy(pos);\r\n tmp_vec.project(camera);\r\n\r\n tmp_vec.x = (tmp_vec.x * 0.5 + 0.5) * (OScreen.width);\r\n tmp_vec.y = (1 - (tmp_vec.y * 0.5 + 0.5)) * OScreen.height;\r\n return tmp_vec;\r\n }\r\n\r\n update_projection(camera)\r\n {\r\n camera.left = -OScreen.width / 2;\r\n camera.right = OScreen.width / 2;\r\n camera.top = OScreen.height / 2;\r\n camera.bottom = -OScreen.height / 2;\r\n camera.aspect = OScreen.aspect_ratio;\r\n camera.updateProjectionMatrix(true);\r\n }\r\n}\r\n\r\nexport default new CameraUtilities();\r\n","import Browser from './Browser';\r\nimport CameraManager from './CameraManager';\r\nimport Capabilities from './Capabilities';\r\nimport Configuration from './Configuration';\r\nimport Debug from './Debug';\r\nimport EventManager from './EventManager';\r\nimport Graphics from './Graphics';\r\nimport Input from './Input';\r\nimport OS from './OS';\r\nimport OScreen from './OScreen';\r\nimport ReflectionPlaneContext from './ReflectionPlaneContext';\r\nimport ResourceContainer from './ResourceContainer';\r\nimport SceneManager from './SceneManager';\r\nimport GeometryBatcher from './static_batcher/GeometryBatcher';\r\nimport Time from './Time';\r\nimport UI from './UI';\r\nimport CameraUtilities from './utilities/CameraUtilities';\r\n\r\nclass Initializer\r\n{\r\n constructor()\r\n {\r\n }\r\n\r\n init(canvas, app_container, context_attributes, keyboard_input_container = document)\r\n {\r\n CameraManager.init();\r\n CameraUtilities.init();\r\n Capabilities.init();\r\n Configuration.init();\r\n EventManager.init();\r\n GeometryBatcher.init();\r\n Input.init(app_container, keyboard_input_container);\r\n OS.init();\r\n Browser.init();\r\n ReflectionPlaneContext.init();\r\n ResourceContainer.init();\r\n SceneManager.init();\r\n OScreen.init();\r\n Time.init();\r\n UI.init();\r\n\r\n Graphics.init(canvas, context_attributes);\r\n Debug.init();\r\n }\r\n\r\n dispose(render_loop)\r\n {\r\n Graphics.dispose();\r\n Input.dispose();\r\n SceneManager.dispose();\r\n\r\n render_loop.dispose();\r\n }\r\n}\r\n\r\nexport default new Initializer();\r\n","import BlitMaterial from '../materials/BlitMaterial';\r\nimport frag from '../shaders/ssao/ssao.frag';\r\nimport vert from '../shaders/ssao/ssao.vert';\r\n\r\nimport { Matrix4 } from 'three';\r\nimport { Vector3 } from 'three';\r\nimport { DataTexture } from 'three';\r\nimport { RGBFormat } from 'three';\r\nimport { RepeatWrapping } from 'three';\r\nimport OMath from '../utilities/OMath';\r\nexport default class SSAOMaterial extends BlitMaterial\r\n{\r\n constructor()\r\n {\r\n super(frag, vert);\r\n\r\n this.uniforms._InverseProjMatrix = { value: new Matrix4() };\r\n this.uniforms._ProjectionMatrix = { value: new Matrix4() };\r\n\r\n this.uniforms._Bias = { value: 0.0125 };\r\n this.uniforms._Radius = { value: 0.3 };\r\n this.uniforms._FarPlane = { value: 100 };\r\n\r\n this.uniforms._SampleKernel = { value: this.__get_sample_kernel() };\r\n this.uniforms._RandomRotation = { value: this.__get_rotation_kernel() };\r\n }\r\n\r\n __get_sample_kernel()\r\n {\r\n const sample_kernel = [];\r\n const kernel_size = 64;\r\n\r\n for (let i = 0; i < kernel_size; i++)\r\n {\r\n const dir = new Vector3(Math.random() * 2 - 1,\r\n Math.random() * 2 - 1,\r\n Math.random());\r\n dir.normalize();\r\n let scale = i / kernel_size;\r\n scale = OMath.lerp(0.1, 1.0, scale * scale);\r\n dir.multiplyScalar(scale);\r\n\r\n sample_kernel.push(dir);\r\n }\r\n return sample_kernel;\r\n }\r\n\r\n __get_rotation_kernel()\r\n {\r\n const rotation_kernel = new Uint8Array(3 * 16);\r\n for (let i = 0; i < 16; i++)\r\n {\r\n rotation_kernel[i * 3 + 1] = Math.floor(Math.random() * 255);\r\n rotation_kernel[i * 3 + 2] = Math.floor(Math.random() * 255);\r\n rotation_kernel[i * 3 + 3] = 0;\r\n }\r\n\r\n const rotation_texture = new DataTexture(rotation_kernel, 4, 4, RGBFormat);\r\n rotation_texture.wrapS = RepeatWrapping;\r\n rotation_texture.wrapT = RepeatWrapping;\r\n\r\n rotation_texture.needsUpdate = true;\r\n return rotation_texture;\r\n }\r\n}\r\n","import BlitMaterial from '../materials/BlitMaterial';\r\nimport frag from '../shaders/ssao/ssao_compose.frag';\r\n\r\nexport default class SSAOComposeMaterial extends BlitMaterial\r\n{\r\n constructor()\r\n {\r\n super(frag);\r\n this.uniforms._AO = { value: undefined };\r\n }\r\n}\r\n","import BlitMaterial from '../materials/BlitMaterial';\r\nimport frag from '../shaders/depth_normals/debug_normals.frag';\r\nimport depth_normals_vert from '../shaders/ssao/ssao.vert';\r\n\r\nimport { Matrix4 } from 'three';\r\n\r\nexport default class DisplayNormalTextureMaterial extends BlitMaterial\r\n{\r\n constructor()\r\n {\r\n super(frag, depth_normals_vert);\r\n this.uniforms._FarPlane = { value: 1 };\r\n this.uniforms._InverseProjMatrix = { value: new Matrix4() };\r\n }\r\n}\r\n","import BlitMaterial from '../materials/BlitMaterial';\r\nimport frag from '../shaders/box_blur/box_blur.frag';\r\n\r\nimport { Vector2 } from 'three';\r\n\r\nexport default class BoxBlurMaterial extends BlitMaterial\r\n{\r\n constructor()\r\n {\r\n super(frag);\r\n this.uniforms._SampleDir = { value: new Vector2() };\r\n }\r\n}\r\n","import BoxBlurMaterial from '../materials/BoxBlurMaterial';\r\nimport Graphics from '../Graphics';\r\n\r\nimport { WebGLRenderTarget } from 'three';\r\n\r\nexport default class Blurrer\r\n{\r\n constructor(renderer)\r\n {\r\n this.RT1 = new WebGLRenderTarget(1, 1);\r\n this.RT2 = new WebGLRenderTarget(1, 1);\r\n this.box_blur_mat = new BoxBlurMaterial();\r\n }\r\n\r\n blur(RT)\r\n {\r\n if (RT.width !== this.RT1.width || RT.height !== this.RT1.height)\r\n {\r\n this.RT1.setSize(RT.width, RT.height);\r\n this.RT2.setSize(RT.width, RT.height);\r\n }\r\n\r\n this.box_blur_mat.uniforms._SampleDir.value.set(1, 0);\r\n Graphics.blit(RT, this.RT1, this.box_blur_mat);\r\n this.box_blur_mat.uniforms._SampleDir.value.set(0, 1);\r\n Graphics.blit(this.RT1, RT, this.box_blur_mat);\r\n // return this.RT2;\r\n }\r\n}\r\n","import CameraManager from '../CameraManager';\r\nimport SceneManager from '../SceneManager';\r\nimport OScreen from '../OScreen';\r\nimport BaseRender from '../render_mode/BaseRender';\r\nimport Configuration from '../Configuration';\r\nimport SSAOMaterial from '../materials/SSAOMaterial';\r\nimport SSAOComposeMaterial from '../materials/SSAOComposeMaterial';\r\nimport DisplayNormalTextureMaterial from '../materials/DisplayNormalTextureMaterial';\r\nimport Blurrer from '../render_utilities/Blurrer';\r\nimport Graphics from '../Graphics';\r\n\r\nimport { WebGLRenderTarget } from 'three';\r\n\r\nexport default class NormalAORender extends BaseRender\r\n{\r\n constructor()\r\n {\r\n super();\r\n\r\n this.ssao_mat = new SSAOMaterial();\r\n this.ssao_compose_mat = new SSAOComposeMaterial();\r\n this.debug_normals = new DisplayNormalTextureMaterial();\r\n\r\n this.ssaa = Configuration.use_ssaa ? 2 : 1;\r\n\r\n this.main_RT = new WebGLRenderTarget(OScreen.width * this.ssaa, OScreen.height * this.ssaa);\r\n\r\n this.SSAO_RT = new WebGLRenderTarget(OScreen.width, OScreen.height);\r\n\r\n this.blurrer = new Blurrer();\r\n Graphics.generateDepthNormalTexture = true;\r\n }\r\n\r\n render()\r\n {\r\n this.__check_RT_size();\r\n\r\n Graphics.clear(this.main_RT, CameraManager.current, true, false);\r\n Graphics.render(SceneManager.current, CameraManager.current, this.main_RT);\r\n\r\n this.__update_uniforms();\r\n\r\n Graphics.blit(Graphics.depth_normals_RT, this.SSAO_RT, this.ssao_mat);\r\n\r\n // // BLUR\r\n this.blurrer.blur(this.SSAO_RT);\r\n Graphics.blit(this.SSAO_RT, undefined);\r\n\r\n // // COMPOSE\r\n this.ssao_compose_mat.uniforms._AO.value = this.SSAO_RT.texture;\r\n Graphics.blit(this.main_RT, undefined, this.ssao_compose_mat);\r\n\r\n // Graphics.blit(this.SSAO_RT, undefined);\r\n }\r\n\r\n __update_uniforms()\r\n {\r\n this.ssao_mat.uniforms._InverseProjMatrix.value.getInverse(CameraManager.current.projectionMatrix);\r\n this.ssao_mat.uniforms._ProjectionMatrix.value.copy(CameraManager.current.projectionMatrix);\r\n this.ssao_mat.uniforms._FarPlane.value = CameraManager.current.far;\r\n }\r\n\r\n __check_RT_size()\r\n {\r\n if (this.main_RT.width !== OScreen.width * this.ssaa || this.main_RT.height !== OScreen.height * this.ssaa)\r\n {\r\n this.main_RT.setSize(OScreen.width * this.ssaa, OScreen.height * this.ssaa);\r\n this.SSAO_RT.setSize(OScreen.width, OScreen.height);\r\n }\r\n }\r\n}\r\n","import CameraManager from '../CameraManager';\r\nimport SceneManager from '../SceneManager';\r\nimport BaseRender from '../render_mode/BaseRender';\r\nimport Graphics from '../Graphics';\r\n\r\nexport default class NormalRender extends BaseRender\r\n{\r\n constructor()\r\n {\r\n super();\r\n }\r\n\r\n render()\r\n {\r\n Graphics.clear(undefined, CameraManager.current, true, true);\r\n\r\n if (SceneManager.current.on_pre_render)\r\n {\r\n SceneManager.current.on_pre_render();\r\n }\r\n\r\n if (SceneManager.current.render)\r\n {\r\n SceneManager.current.render();\r\n }\r\n else\r\n {\r\n Graphics.render(SceneManager.current, CameraManager.current);\r\n }\r\n\r\n if (SceneManager.current.on_post_render)\r\n {\r\n SceneManager.current.on_post_render();\r\n }\r\n }\r\n}\r\n","import BlitMaterial from './BlitMaterial';\r\nimport frag from '../shaders/gaussian_blur/unreal_bloom_compose.frag';\r\nimport { Color } from 'three';\r\nexport default class UnrealBloomComposeMaterial extends BlitMaterial\r\n{\r\n constructor(nMips)\r\n {\r\n super(frag, undefined, {\r\n NUM_MIPS: nMips\r\n });\r\n this.uniforms._MainTex = { value: undefined };\r\n this.uniforms._BlurredTex = { value: undefined };\r\n this.uniforms._BloomStrength = { value: 1 };\r\n\r\n this.uniforms.blurTexture1 = { value: null };\r\n this.uniforms.blurTexture2 = { value: null };\r\n this.uniforms.blurTexture3 = { value: null };\r\n this.uniforms.blurTexture4 = { value: null };\r\n this.uniforms.blurTexture5 = { value: null };\r\n\r\n this.uniforms.bloomStrength = { value: 1.0 };\r\n this.uniforms.bloomFactors = { value: [1.0, 0.8, 0.6, 0.4, 0.2] };\r\n this.uniforms.bloomRadius = { value: 0.0 };\r\n\r\n const bloomTintColors = [\r\n new Color('#FFFFFF'),\r\n new Color('#FFFFFF'),\r\n new Color('#FFFFFF'),\r\n new Color('#FFFFFF'),\r\n new Color('#FFFFFF')\r\n ];\r\n\r\n this.uniforms.bloomTintColors = { value: bloomTintColors };\r\n }\r\n\r\n set_RT_0(rt)\r\n {\r\n this.uniforms.blurTexture1.value = rt;\r\n }\r\n\r\n set_RT_1(rt)\r\n {\r\n this.uniforms.blurTexture2.value = rt;\r\n }\r\n\r\n set_RT_2(rt)\r\n {\r\n this.uniforms.blurTexture3.value = rt;\r\n }\r\n\r\n set_RT_3(rt)\r\n {\r\n this.uniforms.blurTexture4.value = rt;\r\n }\r\n\r\n set_RT_4(rt)\r\n {\r\n this.uniforms.blurTexture5.value = rt;\r\n }\r\n\r\n set_bloom_strength(value)\r\n {\r\n this.uniforms.bloomStrength.value = value;\r\n }\r\n\r\n set_bloom_radius(value)\r\n {\r\n this.uniforms.bloomRadius.value = value;\r\n }\r\n\r\n set_tint_color_0(col_string)\r\n {\r\n this.uniforms.bloomTintColors.value[0].set(col_string);\r\n }\r\n\r\n set_tint_color_1(col_string)\r\n {\r\n this.uniforms.bloomTintColors.value[1].set(col_string);\r\n }\r\n\r\n set_tint_color_2(col_string)\r\n {\r\n this.uniforms.bloomTintColors.value[2].set(col_string);\r\n }\r\n\r\n set_tint_color_3(col_string)\r\n {\r\n this.uniforms.bloomTintColors.value[3].set(col_string);\r\n }\r\n\r\n set_tint_color_4(col_string)\r\n {\r\n this.uniforms.bloomTintColors.value[4].set(col_string);\r\n }\r\n}\r\n","import BlitMaterial from './BlitMaterial';\r\nimport frag from '../shaders/add/add.frag';\r\n\r\nexport default class AddMaterial extends BlitMaterial\r\n{\r\n constructor(nMips)\r\n {\r\n super(frag);\r\n\r\n this.uniforms._SecondTex = { value: undefined };\r\n }\r\n\r\n set_add_texture(tex)\r\n {\r\n this.uniforms._SecondTex.value = tex;\r\n }\r\n}\r\n","import BlitMaterial from './BlitMaterial';\r\nimport frag from '../shaders/gaussian_blur/gaussian_blur.frag';\r\nimport { Vector2 } from 'three';\r\n\r\nexport default class GaussianBlurMaterial extends BlitMaterial\r\n{\r\n constructor(kernel_radius)\r\n {\r\n super(frag, undefined, {\r\n KERNEL_RADIUS: kernel_radius,\r\n SIGMA: kernel_radius\r\n });\r\n\r\n this.uniforms.texSize = { value: new Vector2(0.5, 0.5) };\r\n this.uniforms.direction = { value: new Vector2(0.5, 0.5) };\r\n }\r\n\r\n set_size(w, h)\r\n {\r\n this.uniforms.texSize.value.x = w;\r\n this.uniforms.texSize.value.y = h;\r\n }\r\n\r\n set_direction(x, y)\r\n {\r\n this.uniforms.direction.value.set(x, y);\r\n }\r\n}\r\n","import BlitMaterial from './BlitMaterial';\r\nimport frag from '../shaders/luminosity_high_pass/luminosity_high_pass.frag';\r\nimport { Color } from 'three';\r\nexport default class LuminosityHighPassMaterial extends BlitMaterial\r\n{\r\n constructor(kernel_radius)\r\n {\r\n super(frag);\r\n\r\n this.uniforms.luminosityThreshold = { value: 0.23 };\r\n this.uniforms.smoothWidth = { value: 0.01 };\r\n this.uniforms.defaultColor = { value: new Color('#000000') };\r\n this.uniforms.defaultOpacity = { value: 0.0 };\r\n }\r\n}\r\n","import GaussianBlurMaterial from '../materials/GaussianBlurMaterial';\r\nimport LuminosityHighPassMaterial from '../materials/LuminosityHighPassMaterial';\r\nimport Graphics from '../Graphics';\r\n\r\nimport { WebGLRenderTarget, LinearFilter, RGBAFormat } from 'three';\r\n\r\nexport default class GaussianBlurrer\r\n{\r\n constructor(nMips = 5)\r\n {\r\n this.current_width = 1;\r\n this.current_height = 1;\r\n\r\n this.separableBlurMaterials = [];\r\n this.renderTargetsHorizontal = [];\r\n this.renderTargetsVertical = [];\r\n\r\n this.nMips = nMips;\r\n this.kernelSizeArray = [3, 5, 7, 9, 11];\r\n this.rt_pars = { minFilter: LinearFilter, magFilter: LinearFilter, format: RGBAFormat };\r\n\r\n this.renderTargetBright = new WebGLRenderTarget(1, 1, this.rt_pars);\r\n this.renderTargetBright.texture.generateMipmaps = false;\r\n\r\n this.init_materials();\r\n this.init_RT();\r\n\r\n this.luminosity_high_pass_mat = new LuminosityHighPassMaterial();\r\n }\r\n\r\n blur(RT, use_luminosity_high_pass)\r\n {\r\n this.resize_RT(RT.width, RT.height);\r\n\r\n if (use_luminosity_high_pass)\r\n {\r\n Graphics.blit(RT, this.renderTargetBright, this.luminosity_high_pass_mat);\r\n }\r\n else\r\n {\r\n Graphics.blit(RT, this.renderTargetBright);\r\n }\r\n\r\n let inputRenderTarget = this.renderTargetBright;\r\n\r\n for (let i = 0; i < this.nMips; i++)\r\n {\r\n const mat = this.separableBlurMaterials[i];\r\n\r\n mat.set_direction(1, 0);\r\n Graphics.blit(inputRenderTarget, this.renderTargetsHorizontal[i], mat);\r\n\r\n mat.set_direction(0, 1);\r\n Graphics.blit(this.renderTargetsHorizontal[i], this.renderTargetsVertical[i], mat);\r\n\r\n inputRenderTarget = this.renderTargetsVertical[i];\r\n }\r\n }\r\n\r\n get_blurred_texture()\r\n {\r\n return this.renderTargetsHorizontal[0].texture;\r\n }\r\n\r\n get_blurred_RT()\r\n {\r\n return this.renderTargetsHorizontal[0];\r\n }\r\n\r\n init_RT()\r\n {\r\n this.dispose_RT();\r\n\r\n this.renderTargetBright.setSize(1, 1);\r\n\r\n for (let i = 0; i < this.nMips; i++)\r\n {\r\n const hor = new WebGLRenderTarget(1, 1, this.rt_pars);\r\n const ver = new WebGLRenderTarget(1, 1, this.rt_pars);\r\n\r\n hor.texture.generateMipmaps = false;\r\n ver.texture.generateMipmaps = false;\r\n\r\n this.renderTargetsHorizontal.push(hor);\r\n this.renderTargetsVertical.push(ver);\r\n }\r\n }\r\n\r\n resize_RT(texture_width, texture_height)\r\n {\r\n if (this.current_width === texture_width && this.current_height === texture_height)\r\n {\r\n return;\r\n }\r\n\r\n this.current_width = texture_width;\r\n this.current_height = texture_height;\r\n\r\n let width = Math.round(texture_width / 2);\r\n let height = Math.round(texture_height / 2);\r\n\r\n this.renderTargetBright.setSize(width, height);\r\n\r\n for (let i = 0; i < this.nMips; i++)\r\n {\r\n this.renderTargetsVertical[i].setSize(width, height);\r\n this.renderTargetsHorizontal[i].setSize(width, height);\r\n this.separableBlurMaterials[i].set_size(width, height);\r\n\r\n width = Math.round(width / 2);\r\n height = Math.round(height / 2);\r\n }\r\n }\r\n\r\n init_materials(texture_width, texture_height)\r\n {\r\n this.dispose_materials();\r\n\r\n for (let i = 0; i < this.nMips; i++)\r\n {\r\n this.separableBlurMaterials.push(new GaussianBlurMaterial(this.kernelSizeArray[i]));\r\n }\r\n }\r\n\r\n dispose_materials()\r\n {\r\n for (let i = 0; i < this.separableBlurMaterials.length; i++)\r\n {\r\n this.separableBlurMaterials[i].dispose();\r\n }\r\n this.separableBlurMaterials.length = 0;\r\n }\r\n\r\n dispose_RT()\r\n {\r\n for (let i = 0; i < this.renderTargetsVertical.length; i++)\r\n {\r\n this.renderTargetsHorizontal[i].dispose();\r\n this.renderTargetsVertical[i].dispose();\r\n }\r\n this.renderTargetBright.dispose();\r\n\r\n this.renderTargetsHorizontal.length = 0;\r\n this.renderTargetsVertical.length = 0;\r\n }\r\n}\r\n","import OScreen from '../OScreen';\r\nimport BaseRender from '../render_mode/BaseRender';\r\nimport UnrealBloomComposeMaterial from '../materials/UnrealBloomComposeMaterial';\r\nimport AddMaterial from '../materials/AddMaterial';\r\n\r\nimport { WebGLRenderTarget } from 'three';\r\n\r\nimport GaussianBlurrer from '../render_utilities/GaussianBlurrer';\r\nimport Graphics from '../Graphics';\r\nimport CameraManager from '../CameraManager';\r\nimport SceneManager from '../SceneManager';\r\n\r\nexport default class UnrealBloomRender extends BaseRender\r\n{\r\n constructor()\r\n {\r\n super();\r\n\r\n this.bloom_compose_mat = undefined;\r\n\r\n this.main_RT = undefined;\r\n this.blur_RT = undefined;\r\n this.blurrer = undefined;\r\n\r\n this.add_mat = new AddMaterial();\r\n }\r\n\r\n on_enter()\r\n {\r\n this.blurrer = new GaussianBlurrer();\r\n this.main_RT = new WebGLRenderTarget(OScreen.render_width, OScreen.render_height);\r\n this.blur_RT = new WebGLRenderTarget(OScreen.render_width, OScreen.render_height);\r\n\r\n this.bloom_compose_mat = new UnrealBloomComposeMaterial(5);\r\n this.blurrer = new GaussianBlurrer(5);\r\n\r\n this.bloom_compose_mat.set_RT_0(this.blurrer.renderTargetsVertical[0].texture);\r\n this.bloom_compose_mat.set_RT_1(this.blurrer.renderTargetsVertical[1].texture);\r\n this.bloom_compose_mat.set_RT_2(this.blurrer.renderTargetsVertical[2].texture);\r\n this.bloom_compose_mat.set_RT_3(this.blurrer.renderTargetsVertical[3].texture);\r\n this.bloom_compose_mat.set_RT_4(this.blurrer.renderTargetsVertical[4].texture);\r\n\r\n this.bloom_compose_mat.set_bloom_strength(1);\r\n this.bloom_compose_mat.set_bloom_radius(1);\r\n\r\n this.add_mat.set_add_texture(this.blurrer.renderTargetsHorizontal[0].texture);\r\n }\r\n\r\n set_bloom_strength(val)\r\n {\r\n this.bloom_compose_mat.set_bloom_strength(val);\r\n }\r\n\r\n set_bloom_radius(val)\r\n {\r\n this.bloom_compose_mat.set_bloom_radius(val);\r\n }\r\n\r\n set_tint_color_0(col_string)\r\n {\r\n this.bloom_compose_mat.set_tint_color_0(col_string);\r\n }\r\n\r\n set_tint_color_1(col_string)\r\n {\r\n this.bloom_compose_mat.set_tint_color_1(col_string);\r\n }\r\n\r\n set_tint_color_2(col_string)\r\n {\r\n this.bloom_compose_mat.set_tint_color_2(col_string);\r\n }\r\n\r\n set_tint_color_3(col_string)\r\n {\r\n this.bloom_compose_mat.set_tint_color_3(col_string);\r\n }\r\n\r\n set_tint_color_4(col_string)\r\n {\r\n this.bloom_compose_mat.set_tint_color_4(col_string);\r\n }\r\n\r\n render()\r\n {\r\n this.__check_RT_size();\r\n\r\n Graphics.clear(this.main_RT, CameraManager.current, true, false);\r\n Graphics.render(SceneManager.current, CameraManager.current, this.main_RT);\r\n\r\n // // BLUR\r\n this.blurrer.blur(this.main_RT, true);\r\n\r\n // Blur compose\r\n Graphics.material_pass(this.bloom_compose_mat, this.blurrer.renderTargetsHorizontal[0]);\r\n\r\n // Additive blend\r\n Graphics.blit(this.main_RT, undefined, this.add_mat);\r\n }\r\n\r\n __check_RT_size()\r\n {\r\n if (this.main_RT.width !== OScreen.render_width || this.main_RT.height !== OScreen.render_height)\r\n {\r\n this.main_RT.setSize(OScreen.render_width, OScreen.render_height);\r\n this.blur_RT.setSize(OScreen.render_width, OScreen.render_height);\r\n }\r\n }\r\n}\r\n","import { Color } from 'three';\r\nimport { OrthographicCamera as THREEOrthographicCamera } from 'three';\r\n\r\nexport default class OrthographicCamera extends THREEOrthographicCamera\r\n{\r\n constructor(left, right, top, bottom, near, far)\r\n {\r\n super(left, right, top, bottom, near, far);\r\n\r\n this.clear_color = new Color('#000000');\r\n this.clear_alpha = 1;\r\n }\r\n\r\n copy(camera)\r\n {\r\n super.copy(camera);\r\n this.clear_color.copy(camera.clear_color);\r\n this.clear_alpha = camera.clear_alpha;\r\n return this;\r\n }\r\n}\r\n","import ViewManager from './ViewManager';\r\n\r\nclass ViewComponentManager\r\n{\r\n constructor()\r\n {\r\n this.components = [];\r\n this.enabled_components = new Set();\r\n }\r\n\r\n update()\r\n {\r\n this.__set_components_opacities();\r\n\r\n for (const component of this.enabled_components)\r\n {\r\n component.update(ViewManager.transition_handler.current_state_data);\r\n }\r\n }\r\n\r\n register_component(component)\r\n {\r\n this.components.push(component);\r\n }\r\n\r\n enable_component(component)\r\n {\r\n // const component_to_enable = this.get_component_by_name(component_name);\r\n\r\n this.enabled_components.add(component);\r\n }\r\n\r\n disable_component(component)\r\n {\r\n // const component_to_disable = this.get_component_by_name(component_name);\r\n\r\n this.enabled_components.delete(component);\r\n }\r\n\r\n get_component_by_name(component_name)\r\n {\r\n console.warn('DEPRECATED. Use ViewComponentManager.get instead');\r\n this.get(component_name);\r\n }\r\n\r\n get(component_name)\r\n {\r\n for (let i = 0; i < this.components.length; i++)\r\n {\r\n if (this.components[i].name === component_name)\r\n {\r\n return this.components[i];\r\n }\r\n }\r\n console.error('[ViewComponentManager.get] no component found for: ', component_name);\r\n return undefined;\r\n }\r\n\r\n __set_components_opacities()\r\n {\r\n for (let i = 0; i < this.components.length; i++)\r\n {\r\n this.components[i].set_opacity(ViewManager.transition_handler.current_state_data);\r\n }\r\n }\r\n}\r\n\r\nexport default new ViewComponentManager();\r\n","import Time from './Time';\r\nimport Input from './Input';\r\nimport UI from './UI';\r\nimport Debug from './Debug';\r\nimport BaseApplication from './BaseApplication';\r\nimport ViewManager from './view_components/ViewManager';\r\nimport ViewComponentManager from './view_components/ViewComponentManager';\r\n\r\nexport default class RenderLoop\r\n{\r\n constructor(target_application, graphics)\r\n {\r\n target_application = target_application || new BaseApplication();\r\n\r\n this.target_application = target_application;\r\n this.graphics = graphics;\r\n\r\n this.is_running = false;\r\n this.frames_passed = 0;\r\n }\r\n\r\n update()\r\n {\r\n if (!this.is_running)\r\n {\r\n return;\r\n }\r\n Time.__update();\r\n\r\n // ###### START CYCLE ######\r\n if (this.frames_passed === 1)\r\n {\r\n this.target_application.on_post_start();\r\n }\r\n\r\n Input.update();\r\n\r\n this.target_application.update();\r\n ViewManager.update();\r\n ViewComponentManager.update();\r\n\r\n this.target_application.on_pre_render();\r\n\r\n this.graphics.update(); // render scene\r\n UI.update(); // update after new camera matrix has been calculated\r\n UI.render(this.graphics); // render ui layer on top\r\n this.target_application.on_post_render();\r\n\r\n Debug.render(this.graphics); // render debug layer\r\n\r\n // ###### END CYCLE #######\r\n\r\n this.target_application.on_frame_end();\r\n this.frames_passed++;\r\n\r\n Input.clear();\r\n UI.clear();\r\n Debug.clear();\r\n }\r\n\r\n start()\r\n {\r\n if (this.is_running) return; // sanity check\r\n\r\n if (this.frames_passed === 0)\r\n {\r\n this.target_application.on_enter();\r\n }\r\n\r\n this.is_running = true;\r\n\r\n this.graphics._renderer.setAnimationLoop(this.update.bind(this));\r\n }\r\n\r\n stop()\r\n {\r\n if (this.is_running === false) return; // sanity check\r\n\r\n this.is_running = false;\r\n this.target_application.on_exit();\r\n\r\n this.graphics._renderer.setAnimationLoop(null);\r\n }\r\n\r\n set_state(new_state)\r\n {\r\n this.target_application.on_exit(this);\r\n this.target_application = new_state;\r\n this.target_application.on_enter(this);\r\n }\r\n\r\n dispose()\r\n {\r\n this.stop();\r\n this.frames_passed = 0;\r\n }\r\n}\r\n","import OScreen from './OScreen';\r\n\r\nclass Screen\r\n{\r\n init()\r\n {\r\n console.warn('Screen Singleton is deprecated. Please use OScreen.');\r\n OScreen.init();\r\n }\r\n\r\n update_position(x, y)\r\n {\r\n console.warn('Screen Singleton is deprecated. Please use OScreen.');\r\n OScreen.update_position(x, y);\r\n }\r\n\r\n update()\r\n {\r\n console.warn('Screen Singleton is deprecated. Please use OScreen.');\r\n OScreen.update();\r\n }\r\n\r\n update_size(width, height)\r\n {\r\n console.warn('Screen Singleton is deprecated. Please use OScreen.');\r\n OScreen.update_size(width, height);\r\n }\r\n\r\n apply_pixel_density_v2(vector2)\r\n {\r\n console.warn('Screen Singleton is deprecated. Please use OScreen.');\r\n return OScreen.apply_pixel_density_v2(vector2);\r\n }\r\n\r\n apply_pixel_density(value)\r\n {\r\n console.warn('Screen Singleton is deprecated. Please use OScreen.');\r\n return OScreen.apply_pixel_density(value);\r\n }\r\n\r\n get_pixel_size()\r\n {\r\n console.warn('Screen Singleton is deprecated. Please use OScreen.');\r\n return OScreen.get_pixel_size();\r\n }\r\n\r\n get aspect_ratio()\r\n {\r\n console.warn('Screen Singleton is deprecated. Please use OScreen.');\r\n return OScreen.aspect_ratio;\r\n }\r\n}\r\n\r\nexport default new Screen();\r\n","\r\nimport CanvasDrawer from './CanvasDrawer';\r\n\r\nimport { Vector2 } from 'three';\r\n\r\nexport default class SimpleTextDrawer extends CanvasDrawer\r\n{\r\n constructor()\r\n {\r\n super();\r\n this.text_margin = new Vector2(2, 0);\r\n }\r\n\r\n __draw(text, ctxOptions, canvas, ctx)\r\n {\r\n ctx.font = ctxOptions.font;\r\n\r\n const text_size = this.get_text_size(text, ctxOptions.font);\r\n // canvas.width = Math.ceilPowerOfTwo(text_size.x+this.text_margin.x*2);\r\n // canvas.height = Math.ceilPowerOfTwo(text_size.y+ this.text_margin.y*2);\r\n canvas.width = Math.ceil(text_size.x + this.text_margin.x * 2);\r\n canvas.height = Math.ceil(text_size.y + this.text_margin.y * 2);\r\n ctx.clearRect(0, 0, canvas.width, canvas.height);\r\n\r\n // turn this on for debugging\r\n ctx.globalAlpha = 0.0;\r\n ctx.fillStyle = ctxOptions.font_color || '#000000';\r\n ctx.fillRect(0, 0, canvas.width, canvas.height);\r\n ctx.globalAlpha = 1;\r\n\r\n ctx.globalAlpha = 1;\r\n\r\n ctx.font = ctxOptions.font;\r\n ctx.fillStyle = ctxOptions.font_color || '#000000';\r\n ctx.textBaseline = 'middle';\r\n\r\n ctx.textAlign = ctxOptions.textAlign || 'center';\r\n if (ctx.textAlign === 'center')\r\n {\r\n ctx.fillText(text, canvas.width / 2, canvas.height / 2);\r\n }\r\n else\r\n {\r\n ctx.fillText(text, 0, canvas.height / 2);\r\n }\r\n }\r\n}\r\n","import HTMLUtilities from '../utilities/HTMLUtilities';\r\nimport ViewComponentManager from './ViewComponentManager';\r\n\r\nexport default class ViewComponent\r\n{\r\n constructor({ name, container })\r\n {\r\n this.name = name;\r\n this.container = container;\r\n this.hidden = true;\r\n\r\n ViewComponentManager.register_component(this);\r\n }\r\n\r\n start()\r\n {\r\n }\r\n\r\n on_enter()\r\n {\r\n this.container.classList.remove('hidden');\r\n ViewComponentManager.enable_component(this);\r\n\r\n this.hidden = false;\r\n }\r\n\r\n update()\r\n {\r\n }\r\n\r\n on_exit()\r\n {\r\n this.container.classList.add('hidden');\r\n ViewComponentManager.disable_component(this);\r\n\r\n this.hidden = true;\r\n }\r\n\r\n set_opacity(current_state_data)\r\n {\r\n this.container.style.opacity = current_state_data[`${this.name}_opacity`];\r\n this.toggle_hidden();\r\n }\r\n\r\n toggle_hidden()\r\n {\r\n if (this.container.style.opacity > 0.001)\r\n {\r\n if (this.hidden)\r\n {\r\n this.on_enter();\r\n }\r\n }\r\n else\r\n {\r\n if (!this.hidden)\r\n {\r\n this.on_exit();\r\n }\r\n }\r\n }\r\n\r\n load_html_images()\r\n {\r\n HTMLUtilities.load_images(this.container);\r\n }\r\n\r\n load_html_videos()\r\n {\r\n HTMLUtilities.load_videos(this.container);\r\n }\r\n}\r\n","import { Mesh } from 'three';\r\nimport { MeshBasicMaterial } from 'three';\r\nimport { PlaneGeometry } from 'three';\r\n\r\nexport default class HorizontalPlane extends Mesh\r\n{\r\n constructor(width, height, color, material)\r\n {\r\n width = width || 1;\r\n height = height || 1;\r\n color = color || '#FF0000';\r\n material = material || new MeshBasicMaterial({ color: color });\r\n\r\n const geometry = new PlaneGeometry(width, height);\r\n geometry.rotateX(-3.14 / 2);\r\n super(geometry, material);\r\n }\r\n}\r\n","import { Mesh } from 'three';\r\nimport { PlaneGeometry } from 'three';\r\nimport { MeshBasicMaterial } from 'three';\r\n\r\nexport default class VerticalPlane extends Mesh\r\n{\r\n constructor(width, height, color, material)\r\n {\r\n width = width || 1;\r\n height = height || 1;\r\n color = color || '#FF0000';\r\n material = material || new MeshBasicMaterial({ color: color });\r\n\r\n const geometry = new PlaneGeometry(width, height);\r\n super(geometry, material);\r\n }\r\n}\r\n","export default class ArrayUtilities\r\n{\r\n constructor()\r\n {}\r\n\r\n static merge_from_to(source, target)\r\n {\r\n target.push.apply(target, source);\r\n }\r\n\r\n static expand_vec3_array(array, size)\r\n {\r\n const items_left_count = size - array.length;\r\n\r\n for (let i = 0; i < items_left_count; i++)\r\n {\r\n array.push(array[i].clone());\r\n }\r\n }\r\n\r\n static remove_elem(array, elem)\r\n {\r\n const index = array.indexOf(elem);\r\n if (index > -1)\r\n {\r\n array.splice(index, 1);\r\n }\r\n }\r\n\r\n static get_closest_point(points, target)\r\n {\r\n let closest_point = points[0];\r\n let closest_distance = closest_point.distanceTo(target);\r\n for (let i = 1; i < points.length; i++)\r\n {\r\n if (points[i].distanceTo(target) < closest_distance)\r\n {\r\n closest_point = points[i];\r\n closest_distance = points[i].distanceTo(target);\r\n }\r\n }\r\n return closest_point;\r\n }\r\n\r\n static object_values_to_array(obj)\r\n {\r\n const ids = Object.keys(obj);\r\n const arr = [];\r\n for (let i = 0; i < ids.length; i++)\r\n {\r\n arr.push(obj[ids[i]]);\r\n }\r\n return arr;\r\n }\r\n}\r\n","import { Line3, Plane, Quaternion, Sphere, Vector3 } from 'three';\r\n\r\nexport default class FrustumPointFitter\r\n{\r\n constructor()\r\n {\r\n this.sphere = new Sphere();\r\n }\r\n\r\n fit_points(points, camera_quaternion, vertical_fov, aspect)\r\n {\r\n this.sphere.setFromPoints(points);\r\n\r\n const v_fov = Math.degToRad(vertical_fov / 2);\r\n const h_fov = (2 * Math.atan(Math.tan(v_fov) * aspect)) / 2;\r\n\r\n const up_plane_normal = this.get_up_plane_normal(camera_quaternion, v_fov);\r\n const down_plane_normal = this.get_down_plane_normal(camera_quaternion, v_fov);\r\n const left_plane_normal = this.get_left_plane_normal(camera_quaternion, h_fov);\r\n const right_plane_normal = this.get_right_plane_normal(camera_quaternion, h_fov);\r\n\r\n const camera_forward_dir = new Vector3(0, 0, -1).applyQuaternion(camera_quaternion);\r\n\r\n const sphere_center = this.sphere.center.clone();\r\n\r\n const pull_back_distance = this.get_distance_to_fit_rect(this.sphere.radius * 2, this.sphere.radius * 2, vertical_fov, aspect);\r\n const far_pos = sphere_center.clone().add(camera_forward_dir.clone().multiplyScalar(pull_back_distance * -1));\r\n\r\n const up_plane = new Plane().setFromNormalAndCoplanarPoint(up_plane_normal, far_pos);\r\n const down_plane = new Plane().setFromNormalAndCoplanarPoint(down_plane_normal, far_pos);\r\n\r\n const left_plane = new Plane().setFromNormalAndCoplanarPoint(left_plane_normal, far_pos);\r\n const right_plane = new Plane().setFromNormalAndCoplanarPoint(right_plane_normal, far_pos);\r\n\r\n this.apply_center_correction_to_pos(far_pos, points, camera_quaternion, up_plane, down_plane, left_plane, right_plane);\r\n\r\n up_plane.setFromNormalAndCoplanarPoint(up_plane_normal, far_pos);\r\n down_plane.setFromNormalAndCoplanarPoint(down_plane_normal, far_pos);\r\n\r\n left_plane.setFromNormalAndCoplanarPoint(left_plane_normal, far_pos);\r\n right_plane.setFromNormalAndCoplanarPoint(right_plane_normal, far_pos);\r\n\r\n let closest_distance = Infinity;\r\n\r\n const inverse_dir = camera_forward_dir.clone().multiplyScalar(pull_back_distance * -2);\r\n for (let i = 0; i < points.length; i++)\r\n {\r\n const line = new Line3(points[i].clone(), points[i].clone().add(inverse_dir));\r\n\r\n const up_line_intersection = new Vector3();\r\n const down_line_intersection = new Vector3();\r\n\r\n const left_line_intersection = new Vector3();\r\n const right_line_intersection = new Vector3();\r\n\r\n up_plane.intersectLine(line, up_line_intersection);\r\n down_plane.intersectLine(line, down_line_intersection);\r\n\r\n left_plane.intersectLine(line, left_line_intersection);\r\n right_plane.intersectLine(line, right_line_intersection);\r\n\r\n if (up_line_intersection.length() < 0.0001)\r\n {\r\n console.log('up intersection not found', i);\r\n }\r\n if (down_line_intersection.length() < 0.0001)\r\n {\r\n console.log('down intersection not found', i);\r\n }\r\n if (left_line_intersection.length() < 0.0001)\r\n {\r\n console.log('left intersection not found', i);\r\n }\r\n if (right_line_intersection.length() < 0.0001)\r\n {\r\n console.log('right intersection not found', i);\r\n }\r\n\r\n const new_up_distance = points[i].clone().sub(up_line_intersection).length();\r\n const new_down_distance = points[i].clone().sub(down_line_intersection).length();\r\n\r\n const new_left_distance = points[i].clone().sub(left_line_intersection).length();\r\n const new_right_distance = points[i].clone().sub(right_line_intersection).length();\r\n\r\n const vertical_min = Math.min(new_up_distance, new_down_distance);\r\n const horizontal_min = Math.min(new_left_distance, new_right_distance);\r\n\r\n const min = Math.min(vertical_min, horizontal_min);\r\n\r\n if (min < closest_distance)\r\n {\r\n closest_distance = min;\r\n }\r\n }\r\n\r\n const forward_correction = camera_forward_dir.clone().multiplyScalar(closest_distance);\r\n const closest_position = far_pos.clone().add(forward_correction);\r\n\r\n return closest_position;\r\n }\r\n\r\n apply_center_correction_to_pos(target_pos, points, camera_quaternion, up_plane, down_plane, left_plane, right_plane)\r\n {\r\n const vertical_offset = this.get_vertical_correction(points, down_plane, up_plane, camera_quaternion);\r\n const horizontal_offset = this.get_hozirontal_correction(points, left_plane, right_plane, camera_quaternion);\r\n\r\n target_pos.add(vertical_offset);\r\n target_pos.add(horizontal_offset);\r\n }\r\n\r\n get_vertical_correction(points, down_plane, up_plane, camera_quaternion)\r\n {\r\n let closest_distance_to_up_plane = Infinity;\r\n let closest_distance_to_down_plane = Infinity;\r\n let closest_up_point = undefined;\r\n let closest_down_point = undefined;\r\n\r\n const up_dir = new Vector3(0, 1, 0).applyQuaternion(camera_quaternion);\r\n for (let i = 0; i < points.length; i++)\r\n {\r\n const down_line = new Line3(points[i].clone(), points[i].clone().add(up_dir.clone().multiplyScalar(-5000000)));\r\n const up_line = new Line3(points[i].clone(), points[i].clone().add(up_dir.clone().multiplyScalar(5000000)));\r\n\r\n const down_line_intersection = new Vector3();\r\n const up_line_intersection = new Vector3();\r\n\r\n down_plane.intersectLine(down_line, down_line_intersection);\r\n up_plane.intersectLine(up_line, up_line_intersection);\r\n\r\n const down_dist = down_line_intersection.distanceTo(points[i]);\r\n const up_dist = up_line_intersection.distanceTo(points[i]);\r\n\r\n if (up_line_intersection.length() < 0.0001)\r\n {\r\n console.log('vertical up intersection not found', i);\r\n }\r\n if (down_line_intersection.length() < 0.0001)\r\n {\r\n console.log('vertical down intersection not found', i);\r\n }\r\n\r\n if (down_dist < closest_distance_to_down_plane)\r\n {\r\n closest_distance_to_down_plane = down_dist;\r\n closest_down_point = points[i];\r\n }\r\n if (up_dist < closest_distance_to_up_plane)\r\n {\r\n closest_distance_to_up_plane = up_dist;\r\n closest_up_point = points[i];\r\n }\r\n }\r\n\r\n console.log(closest_up_point, closest_down_point);\r\n\r\n const correction = (closest_distance_to_up_plane - closest_distance_to_down_plane) / 2;\r\n\r\n // console.log(\"vertical_correction\", correction)\r\n return up_dir.clone().multiplyScalar(-correction);\r\n }\r\n\r\n get_hozirontal_correction(points, left_plane, right_plane, camera_quaternion)\r\n {\r\n let closest_distance_to_right_plane = Infinity;\r\n let closest_distance_to_left_plane = Infinity;\r\n let closest_right_point = undefined;\r\n let closest_left_point = undefined;\r\n\r\n const right_dir = new Vector3(1, 0, 0).applyQuaternion(camera_quaternion);\r\n\r\n for (let i = 0; i < points.length; i++)\r\n {\r\n const left_line = new Line3(points[i].clone(), points[i].clone().add(right_dir.clone().multiplyScalar(-5000000)));\r\n const right_line = new Line3(points[i].clone(), points[i].clone().add(right_dir.clone().multiplyScalar(5000000)));\r\n\r\n const left_line_intersection = new Vector3();\r\n const right_line_intersection = new Vector3();\r\n\r\n left_plane.intersectLine(left_line, left_line_intersection);\r\n right_plane.intersectLine(right_line, right_line_intersection);\r\n\r\n const left_dist = left_line_intersection.distanceTo(points[i]);\r\n const right_dist = right_line_intersection.distanceTo(points[i]);\r\n\r\n if (left_line_intersection.length() < 0.0001)\r\n {\r\n console.log('left intersection not found', i);\r\n }\r\n if (right_line_intersection.length() < 0.0001)\r\n {\r\n console.log('right intersection not found', i);\r\n }\r\n\r\n if (left_dist < closest_distance_to_left_plane)\r\n {\r\n closest_distance_to_left_plane = left_dist;\r\n closest_left_point = points[i];\r\n }\r\n if (right_dist < closest_distance_to_right_plane)\r\n {\r\n closest_distance_to_right_plane = right_dist;\r\n closest_right_point = points[i];\r\n }\r\n }\r\n\r\n const correction = (closest_distance_to_right_plane - closest_distance_to_left_plane) / 2;\r\n // console.log(\"horizontal_correction\", correction)\r\n\r\n console.log(closest_right_point, closest_left_point);\r\n\r\n return right_dir.clone().multiplyScalar(-correction);\r\n }\r\n\r\n get_up_plane_normal(camera_quaternion, v_fov)\r\n {\r\n const up_plane_normal = new Vector3(0, -1, 0);\r\n up_plane_normal.applyQuaternion(new Quaternion().setFromAxisAngle(new Vector3(1, 0, 0), v_fov));\r\n up_plane_normal.applyQuaternion(camera_quaternion);\r\n return up_plane_normal;\r\n }\r\n\r\n get_down_plane_normal(camera_quaternion, v_fov)\r\n {\r\n const down_plane_normal = new Vector3(0, 1, 0);\r\n down_plane_normal.applyQuaternion(new Quaternion().setFromAxisAngle(new Vector3(1, 0, 0), -v_fov));\r\n down_plane_normal.applyQuaternion(camera_quaternion);\r\n return down_plane_normal;\r\n }\r\n\r\n get_left_plane_normal(camera_quaternion, h_fov)\r\n {\r\n const left_plane_normal = new Vector3(1, 0, 0);\r\n left_plane_normal.applyQuaternion(new Quaternion().setFromAxisAngle(new Vector3(0, 1, 0), h_fov));\r\n left_plane_normal.applyQuaternion(camera_quaternion);\r\n return left_plane_normal;\r\n }\r\n\r\n get_right_plane_normal(camera_quaternion, h_fov)\r\n {\r\n const right_plane_normal = new Vector3(-1, 0, 0);\r\n right_plane_normal.applyQuaternion(new Quaternion().setFromAxisAngle(new Vector3(0, 1, 0), -h_fov));\r\n right_plane_normal.applyQuaternion(camera_quaternion);\r\n return right_plane_normal;\r\n }\r\n\r\n get_distance_to_fit_rect(width, height, vertical_fov, aspect)\r\n {\r\n const v_fov = (vertical_fov / 2) * Math.PI / 180;\r\n const h_fov = (2 * Math.atan(Math.tan(v_fov) * aspect)) / 2;\r\n\r\n const distV = height / Math.tan(v_fov);\r\n const distH = width / Math.tan(h_fov);\r\n return Math.max(Math.abs(distH), Math.abs(distV));\r\n }\r\n}\r\n","import { BufferAttribute } from 'three';\r\nimport { BufferGeometry } from 'three';\r\n\r\nexport default class GeometryUtilities\r\n{\r\n static convert_to_non_indexed_geometry(geometry_buffer)\r\n {\r\n const indices = geometry_buffer.index;\r\n const positions = geometry_buffer.getAttribute('position');\r\n\r\n const bar_coordinates = [];\r\n const vertices = [];\r\n\r\n for (let i = 0; i < indices.count; i += 3)\r\n {\r\n // VERTEX 1\r\n vertices.push(positions.getX(indices.array[i + 0]));\r\n vertices.push(positions.getY(indices.array[i + 0]));\r\n vertices.push(positions.getZ(indices.array[i + 0]));\r\n\r\n bar_coordinates.push(1);\r\n bar_coordinates.push(0);\r\n bar_coordinates.push(0);\r\n\r\n // VERTEX 2\r\n\r\n vertices.push(positions.getX(indices.array[i + 1]));\r\n vertices.push(positions.getY(indices.array[i + 1]));\r\n vertices.push(positions.getZ(indices.array[i + 1]));\r\n\r\n bar_coordinates.push(0);\r\n bar_coordinates.push(1);\r\n bar_coordinates.push(0);\r\n\r\n // VERTEX 3\r\n\r\n vertices.push(positions.getX(indices.array[i + 2]));\r\n vertices.push(positions.getY(indices.array[i + 2]));\r\n vertices.push(positions.getZ(indices.array[i + 2]));\r\n\r\n bar_coordinates.push(0);\r\n bar_coordinates.push(0);\r\n bar_coordinates.push(1);\r\n }\r\n\r\n const geometry = new BufferGeometry();\r\n // geometry.setAttribute('barycentric', new BufferAttribute( new Float32Array(bar_coordinates), 3 ));\r\n geometry.setAttribute('position', new BufferAttribute(new Float32Array(vertices), 3));\r\n GeometryUtilities.add_barycentric_attribute(geometry);\r\n return geometry;\r\n }\r\n\r\n static add_barycentric_attribute(non_indexed_geometry_buffer)\r\n {\r\n const bar_coordinates = [];\r\n const positions = non_indexed_geometry_buffer.getAttribute('position');\r\n\r\n for (let i = 0; i < positions.count; i += 3)\r\n {\r\n bar_coordinates.push(1);\r\n bar_coordinates.push(0);\r\n bar_coordinates.push(0);\r\n\r\n bar_coordinates.push(0);\r\n bar_coordinates.push(1);\r\n bar_coordinates.push(0);\r\n\r\n bar_coordinates.push(0);\r\n bar_coordinates.push(0);\r\n bar_coordinates.push(1);\r\n }\r\n non_indexed_geometry_buffer.setAttribute('barycentric', new BufferAttribute(new Float32Array(bar_coordinates), 3));\r\n }\r\n}\r\n","import { Vector4 } from 'three';\r\n\r\nexport default class ImageUtilities\r\n{\r\n constructor()\r\n { }\r\n\r\n static get_image_data(image)\r\n {\r\n const canvas = document.createElement('canvas');\r\n canvas.width = image.width;\r\n canvas.height = image.height;\r\n\r\n const context = canvas.getContext('2d');\r\n context.drawImage(image, 0, 0);\r\n\r\n return context.getImageData(0, 0, image.width, image.height);\r\n }\r\n\r\n static get_pixel(imagedata, x, y)\r\n {\r\n const position = (x + imagedata.width * y) * 4;\r\n const data = imagedata.data;\r\n return new Vector4(data[position + 0], data[position + 1], data[position + 2], data[position + 3]);\r\n }\r\n}\r\n","import { Vector3 } from 'three';\r\nimport { Vector2 } from 'three';\r\nclass MeshSampler\r\n{\r\n constructor()\r\n {\r\n\r\n }\r\n\r\n sample(buffer_geometry, sample_count)\r\n {\r\n const face_areas = [];\r\n\r\n let min_area = 99999999;\r\n\r\n const vertices = buffer_geometry.getAttribute('position');\r\n const normals = buffer_geometry.getAttribute('normal');\r\n const tangents = buffer_geometry.getAttribute('tangent');\r\n const uvs = buffer_geometry.getAttribute('uv');\r\n const indices = buffer_geometry.index;\r\n\r\n const faces = [];\r\n\r\n for (let i = 0; i < indices.count; i += 3)\r\n {\r\n const index_0 = indices.array[i + 0];\r\n const index_1 = indices.array[i + 1];\r\n const index_2 = indices.array[i + 2];\r\n\r\n const v1 = new Vector3();\r\n v1.x = vertices.getX(index_0);\r\n v1.y = vertices.getY(index_0);\r\n v1.z = vertices.getZ(index_0);\r\n\r\n const v2 = new Vector3();\r\n v2.x = vertices.getX(index_1);\r\n v2.y = vertices.getY(index_1);\r\n v2.z = vertices.getZ(index_1);\r\n\r\n const v3 = new Vector3();\r\n v3.x = vertices.getX(index_2);\r\n v3.y = vertices.getY(index_2);\r\n v3.z = vertices.getZ(index_2);\r\n\r\n const face = {\r\n a: v1,\r\n b: v2,\r\n c: v3\r\n };\r\n\r\n if (normals)\r\n {\r\n const n1 = new Vector3();\r\n n1.x = normals.getX(index_0);\r\n n1.y = normals.getY(index_0);\r\n n1.z = normals.getZ(index_0);\r\n\r\n const n2 = new Vector3();\r\n n2.x = normals.getX(index_1);\r\n n2.y = normals.getY(index_1);\r\n n2.z = normals.getZ(index_1);\r\n\r\n const n3 = new Vector3();\r\n n3.x = normals.getX(index_2);\r\n n3.y = normals.getY(index_2);\r\n n3.z = normals.getZ(index_2);\r\n\r\n const normal = n1.clone().add(n2).add(n3).normalize();\r\n face.normal = normal;\r\n }\r\n\r\n if (tangents)\r\n {\r\n const n1 = new Vector3();\r\n n1.x = tangents.getX(index_0);\r\n n1.y = tangents.getY(index_0);\r\n n1.z = tangents.getZ(index_0);\r\n\r\n const n2 = new Vector3();\r\n n2.x = tangents.getX(index_1);\r\n n2.y = tangents.getY(index_1);\r\n n2.z = tangents.getZ(index_1);\r\n\r\n const n3 = new Vector3();\r\n n3.x = tangents.getX(index_2);\r\n n3.y = tangents.getY(index_2);\r\n n3.z = tangents.getZ(index_2);\r\n\r\n const tangent = n1.clone().add(n2).add(n3).normalize();\r\n face.tangent = tangent;\r\n }\r\n if (uvs)\r\n {\r\n const uv_a = new Vector2();\r\n uv_a.x = uvs.getX(index_0);\r\n uv_a.y = uvs.getY(index_0);\r\n\r\n const uv_b = new Vector2();\r\n uv_b.x = uvs.getX(index_1);\r\n uv_b.y = uvs.getY(index_1);\r\n\r\n const uv_c = new Vector2();\r\n uv_c.x = uvs.getX(index_2);\r\n uv_c.y = uvs.getY(index_2);\r\n\r\n face.uv_a = uv_a;\r\n face.uv_b = uv_b;\r\n face.uv_c = uv_c;\r\n }\r\n\r\n faces.push(face);\r\n\r\n const area = this.get_face_area(face);\r\n min_area = Math.min(area, min_area);\r\n face_areas.push(area);\r\n }\r\n\r\n const normalized_faces_array = this.get_uniform_face_distribution(face_areas, min_area, faces);\r\n const selected_faces = this.select_random_faces(normalized_faces_array, sample_count);\r\n const sampled_data = this.sample_data_from_faces(selected_faces);\r\n return sampled_data;\r\n }\r\n\r\n sample_data_from_faces(faces)\r\n {\r\n const sampled_points = [];\r\n const sampled_normals = [];\r\n const sampled_tangents = [];\r\n const sampled_uvs = [];\r\n\r\n for (let i = 0; i < faces.length; i++)\r\n {\r\n const face = faces[i];\r\n\r\n const w1 = Math.random();\r\n const w2 = Math.random();\r\n\r\n sampled_points.push(this.sample_point_in_face(w1, w2, face.a, face.b, face.c).clone());\r\n if (face.normal)\r\n {\r\n sampled_normals.push(face.normal.clone());\r\n }\r\n if (face.tangent)\r\n {\r\n sampled_tangents.push(face.tangent.clone());\r\n }\r\n if (face.uv_a)\r\n {\r\n sampled_uvs.push(this.sample_point_in_face(w1, w2, face.uv_a, face.uv_b, face.uv_c).clone());\r\n }\r\n }\r\n return { points: sampled_points, normals: sampled_normals, tangents: sampled_tangents, uvs: sampled_uvs };\r\n }\r\n\r\n select_random_faces(faces, amount)\r\n {\r\n const selected_faces = [];\r\n for (let i = 0; i < amount; i++)\r\n {\r\n const random = Math.floor(Math.random() * faces.length);\r\n const selected_face = faces[random];\r\n\r\n selected_faces.push(selected_face);\r\n }\r\n\r\n return selected_faces;\r\n }\r\n\r\n get_uniform_face_distribution(face_areas, minimum_area, faces)\r\n {\r\n const extended_triangle_indices = [];\r\n for (let i = 0; i < face_areas.length; i++)\r\n {\r\n face_areas[i] /= minimum_area;\r\n const repetitions_needed = Math.floor(Math.round(face_areas[i]));\r\n for (let j = 0; j < repetitions_needed; j++)\r\n {\r\n extended_triangle_indices.push(faces[i]);\r\n }\r\n }\r\n return extended_triangle_indices;\r\n }\r\n\r\n get_face_area(face)\r\n {\r\n const vec1 = face.b.clone().sub(face.a);\r\n const vec2 = face.c.clone().sub(face.a);\r\n return vec1.cross(vec2).length() / 2;\r\n }\r\n\r\n sample_point_in_face(w1, w2, v1, v2, v3)\r\n {\r\n if (w1 + w2 > 1)\r\n {\r\n w1 = 1.0 - w1;\r\n w2 = 1.0 - w2;\r\n }\r\n\r\n const w3 = 1.0 - (w1 + w2);\r\n\r\n return v1.clone().multiplyScalar(w1).add(v2.clone().multiplyScalar(w2)).add(v3.clone().multiplyScalar(w3));\r\n }\r\n}\r\n\r\nexport default new MeshSampler();\r\n","import { Mesh } from 'three';\r\nimport { BufferGeometry } from 'three';\r\nimport { Skeleton } from 'three';\r\n\r\nclass ModelUtilities\r\n{\r\n get_mesh(scene, result_callback)\r\n {\r\n scene.traverse((child) =>\r\n {\r\n if (child instanceof Mesh)\r\n {\r\n if (child.geometry)\r\n {\r\n child.geometry = new BufferGeometry().fromGeometry(child.geometry);\r\n }\r\n result_callback(child);\r\n }\r\n });\r\n }\r\n\r\n get_geometries(scene)\r\n {\r\n const geometries = [];\r\n\r\n this.get_mesh(scene, (child) =>\r\n {\r\n geometries.push(child.geometry);\r\n });\r\n return geometries;\r\n }\r\n\r\n assign_material(scene, material, name)\r\n {\r\n scene.traverse((child) =>\r\n {\r\n if (child instanceof Mesh)\r\n {\r\n // assign to all if no name is given\r\n if (name === undefined)\r\n {\r\n child.material = material;\r\n }\r\n else\r\n {\r\n // if name is given, assign only to that\r\n if (child.name === name)\r\n {\r\n child.material = material;\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n clone_animated_gltf(gltf)\r\n {\r\n const clone = {\r\n animations: gltf.animations,\r\n scene: gltf.scene.clone(true)\r\n };\r\n\r\n const skinnedMeshes = {};\r\n\r\n gltf.scene.traverse(node =>\r\n {\r\n if (node.isSkinnedMesh)\r\n {\r\n skinnedMeshes[node.name] = node;\r\n }\r\n });\r\n\r\n const cloneBones = {};\r\n const cloneSkinnedMeshes = {};\r\n\r\n clone.scene.traverse(node =>\r\n {\r\n if (node.isBone)\r\n {\r\n cloneBones[node.name] = node;\r\n }\r\n\r\n if (node.isSkinnedMesh)\r\n {\r\n cloneSkinnedMeshes[node.name] = node;\r\n }\r\n });\r\n\r\n for (const name in skinnedMeshes)\r\n {\r\n const skinnedMesh = skinnedMeshes[name];\r\n const skeleton = skinnedMesh.skeleton;\r\n const cloneSkinnedMesh = cloneSkinnedMeshes[name];\r\n\r\n const orderedCloneBones = [];\r\n\r\n for (let i = 0; i < skeleton.bones.length; ++i)\r\n {\r\n const cloneBone = cloneBones[skeleton.bones[i].name];\r\n orderedCloneBones.push(cloneBone);\r\n }\r\n\r\n cloneSkinnedMesh.bind(\r\n new Skeleton(orderedCloneBones, skeleton.boneInverses),\r\n cloneSkinnedMesh.matrixWorld);\r\n }\r\n\r\n return clone;\r\n }\r\n\r\n set_shadow_config(scene, cast, receive)\r\n {\r\n scene.traverse((child) =>\r\n {\r\n if (child instanceof Mesh)\r\n {\r\n child.castShadow = cast;\r\n child.receiveShadow = receive;\r\n }\r\n });\r\n }\r\n\r\n __find_object(scene, object_name, result_callback)\r\n {\r\n scene.traverse((obj) =>\r\n {\r\n if (obj.name === object_name)\r\n {\r\n result_callback(obj);\r\n }\r\n });\r\n }\r\n\r\n get_object(scene, object_name)\r\n {\r\n let object = undefined;\r\n scene.traverse((obj) =>\r\n {\r\n if (obj.name === object_name)\r\n {\r\n object = obj;\r\n }\r\n });\r\n return object;\r\n }\r\n\r\n get_object_by_type(scene, object_type)\r\n {\r\n let object = undefined;\r\n scene.traverse((obj) =>\r\n {\r\n if (obj.constructor.name === object_type)\r\n {\r\n object = obj;\r\n }\r\n });\r\n return object;\r\n }\r\n}\r\n\r\nexport default new ModelUtilities();\r\n","export default 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","export default class StringUtilities\r\n{\r\n constructor()\r\n {}\r\n\r\n static capitalize(string)\r\n {\r\n const words = string.split(' ');\r\n\r\n for (let i = 0; i < words.length; i++)\r\n {\r\n words[i] = words[i][0].toUpperCase() + words[i].substr(1);\r\n }\r\n\r\n return words.join(' ');\r\n }\r\n\r\n static capitalize_first_letter(string)\r\n {\r\n return string.charAt(0).toUpperCase() + string.slice(1);\r\n }\r\n\r\n static snake_to_camelcase(string)\r\n {\r\n return string.replace(\r\n /([-_][a-z])/g,\r\n (group) => group.toUpperCase()\r\n .replace('-', '')\r\n .replace('_', '')\r\n );\r\n }\r\n}\r\n","export default class TimeUtilities\r\n{\r\n constructor()\r\n {}\r\n\r\n // Converts a time string (00:00:00.45) into miliseconds\r\n time_str_to_ms(time_str)\r\n {\r\n time_str = time_str.split(':');\r\n\r\n let hours = Number(time_str[0]);\r\n hours = hours * 60 * 60 * 1000;\r\n\r\n let minutes = Number(time_str[1]);\r\n minutes = minutes * 60 * 1000;\r\n\r\n let seconds = Number(time_str[2]);\r\n seconds = seconds * 1000;\r\n\r\n return hours + minutes + seconds;\r\n }\r\n}\r\n","import { Vector3, Plane, Quaternion, Sphere, Line3 } from 'three';\r\nimport OMath from './OMath';\r\nexport default class PerspectiveFrustumPointFitter\r\n{\r\n constructor()\r\n {\r\n this.sphere = new Sphere();\r\n }\r\n\r\n fit_points(points, camera_quaternion, vertical_fov, aspect)\r\n {\r\n this.sphere.setFromPoints(points);\r\n\r\n const v_fov = OMath.degToRad(vertical_fov / 2);\r\n const h_fov = (2 * Math.atan(Math.tan(v_fov) * aspect)) / 2;\r\n\r\n const up_plane_normal = this.get_up_plane_normal(camera_quaternion, v_fov);\r\n const down_plane_normal = this.get_down_plane_normal(camera_quaternion, v_fov);\r\n const left_plane_normal = this.get_left_plane_normal(camera_quaternion, h_fov);\r\n const right_plane_normal = this.get_right_plane_normal(camera_quaternion, h_fov);\r\n\r\n const camera_forward_dir = new Vector3(0, 0, -1).applyQuaternion(camera_quaternion);\r\n\r\n const sphere_center = this.sphere.center.clone();\r\n\r\n const pull_back_distance = this.get_distance_to_fit_rect(this.sphere.radius * 2, this.sphere.radius * 2, vertical_fov, aspect);\r\n const far_pos = sphere_center.clone().add(camera_forward_dir.clone().multiplyScalar(pull_back_distance * -1));\r\n\r\n const up_plane = new Plane().setFromNormalAndCoplanarPoint(up_plane_normal, far_pos);\r\n const down_plane = new Plane().setFromNormalAndCoplanarPoint(down_plane_normal, far_pos);\r\n\r\n const left_plane = new Plane().setFromNormalAndCoplanarPoint(left_plane_normal, far_pos);\r\n const right_plane = new Plane().setFromNormalAndCoplanarPoint(right_plane_normal, far_pos);\r\n\r\n this.apply_center_correction_to_pos(far_pos, points, camera_quaternion, up_plane, down_plane, left_plane, right_plane);\r\n\r\n up_plane.setFromNormalAndCoplanarPoint(up_plane_normal, far_pos);\r\n down_plane.setFromNormalAndCoplanarPoint(down_plane_normal, far_pos);\r\n\r\n left_plane.setFromNormalAndCoplanarPoint(left_plane_normal, far_pos);\r\n right_plane.setFromNormalAndCoplanarPoint(right_plane_normal, far_pos);\r\n\r\n let closest_distance = Infinity;\r\n\r\n const inverse_dir = camera_forward_dir.clone().multiplyScalar(pull_back_distance * -2);\r\n for (let i = 0; i < points.length; i++)\r\n {\r\n const line = new Line3(points[i].clone(), points[i].clone().add(inverse_dir));\r\n\r\n const up_line_intersection = new Vector3();\r\n const down_line_intersection = new Vector3();\r\n\r\n const left_line_intersection = new Vector3();\r\n const right_line_intersection = new Vector3();\r\n\r\n up_plane.intersectLine(line, up_line_intersection);\r\n down_plane.intersectLine(line, down_line_intersection);\r\n\r\n left_plane.intersectLine(line, left_line_intersection);\r\n right_plane.intersectLine(line, right_line_intersection);\r\n\r\n if (up_line_intersection.length() < 0.0001)\r\n {\r\n console.log('up intersection not found', i);\r\n }\r\n if (down_line_intersection.length() < 0.0001)\r\n {\r\n console.log('down intersection not found', i);\r\n }\r\n if (left_line_intersection.length() < 0.0001)\r\n {\r\n console.log('left intersection not found', i);\r\n }\r\n if (right_line_intersection.length() < 0.0001)\r\n {\r\n console.log('right intersection not found', i);\r\n }\r\n\r\n const new_up_distance = points[i].clone().sub(up_line_intersection).length();\r\n const new_down_distance = points[i].clone().sub(down_line_intersection).length();\r\n\r\n const new_left_distance = points[i].clone().sub(left_line_intersection).length();\r\n const new_right_distance = points[i].clone().sub(right_line_intersection).length();\r\n\r\n const vertical_min = Math.min(new_up_distance, new_down_distance);\r\n const horizontal_min = Math.min(new_left_distance, new_right_distance);\r\n\r\n const min = Math.min(vertical_min, horizontal_min);\r\n\r\n if (min < closest_distance)\r\n {\r\n closest_distance = min;\r\n }\r\n }\r\n\r\n const forward_correction = camera_forward_dir.clone().multiplyScalar(closest_distance);\r\n const closest_position = far_pos.clone().add(forward_correction);\r\n\r\n return closest_position;\r\n }\r\n\r\n apply_center_correction_to_pos(target_pos, points, camera_quaternion, up_plane, down_plane, left_plane, right_plane)\r\n {\r\n const vertical_offset = this.get_vertical_correction(points, down_plane, up_plane, camera_quaternion);\r\n const horizontal_offset = this.get_horizontal_correction(points, left_plane, right_plane, camera_quaternion);\r\n\r\n target_pos.add(vertical_offset);\r\n target_pos.add(horizontal_offset);\r\n }\r\n\r\n get_vertical_correction(points, down_plane, up_plane, camera_quaternion)\r\n {\r\n let closest_distance_to_up_plane = Infinity;\r\n let closest_distance_to_down_plane = Infinity;\r\n // let closest_up_point = undefined;\r\n // let closest_down_point = undefined;\r\n\r\n const up_dir = new Vector3(0, 1, 0).applyQuaternion(camera_quaternion);\r\n for (let i = 0; i < points.length; i++)\r\n {\r\n const down_line = new Line3(points[i].clone(), points[i].clone().add(up_dir.clone().multiplyScalar(-5000000)));\r\n const up_line = new Line3(points[i].clone(), points[i].clone().add(up_dir.clone().multiplyScalar(5000000)));\r\n\r\n const down_line_intersection = new Vector3();\r\n const up_line_intersection = new Vector3();\r\n\r\n down_plane.intersectLine(down_line, down_line_intersection);\r\n up_plane.intersectLine(up_line, up_line_intersection);\r\n\r\n const down_dist = down_line_intersection.distanceTo(points[i]);\r\n const up_dist = up_line_intersection.distanceTo(points[i]);\r\n\r\n if (up_line_intersection.length() < 0.0001)\r\n {\r\n console.log('vertical up intersection not found', i);\r\n }\r\n if (down_line_intersection.length() < 0.0001)\r\n {\r\n console.log('vertical down intersection not found', i);\r\n }\r\n\r\n if (down_dist < closest_distance_to_down_plane)\r\n {\r\n closest_distance_to_down_plane = down_dist;\r\n // closest_down_point = points[i];\r\n }\r\n if (up_dist < closest_distance_to_up_plane)\r\n {\r\n closest_distance_to_up_plane = up_dist;\r\n // closest_up_point = points[i];\r\n }\r\n }\r\n\r\n const correction = (closest_distance_to_up_plane - closest_distance_to_down_plane) / 2;\r\n\r\n // console.log(\"vertical_correction\", correction)\r\n return up_dir.clone().multiplyScalar(-correction);\r\n }\r\n\r\n get_horizontal_correction(points, left_plane, right_plane, camera_quaternion)\r\n {\r\n let closest_distance_to_right_plane = Infinity;\r\n let closest_distance_to_left_plane = Infinity;\r\n // let closest_right_point = undefined;\r\n // let closest_left_point = undefined;\r\n\r\n const right_dir = new Vector3(1, 0, 0).applyQuaternion(camera_quaternion);\r\n\r\n for (let i = 0; i < points.length; i++)\r\n {\r\n const left_line = new Line3(points[i].clone(), points[i].clone().add(right_dir.clone().multiplyScalar(-5000000)));\r\n const right_line = new Line3(points[i].clone(), points[i].clone().add(right_dir.clone().multiplyScalar(5000000)));\r\n\r\n const left_line_intersection = new Vector3();\r\n const right_line_intersection = new Vector3();\r\n\r\n left_plane.intersectLine(left_line, left_line_intersection);\r\n right_plane.intersectLine(right_line, right_line_intersection);\r\n\r\n const left_dist = left_line_intersection.distanceTo(points[i]);\r\n const right_dist = right_line_intersection.distanceTo(points[i]);\r\n\r\n if (left_line_intersection.length() < 0.0001)\r\n {\r\n console.log('left intersection not found', i);\r\n }\r\n if (right_line_intersection.length() < 0.0001)\r\n {\r\n console.log('right intersection not found', i);\r\n }\r\n\r\n if (left_dist < closest_distance_to_left_plane)\r\n {\r\n closest_distance_to_left_plane = left_dist;\r\n // closest_left_point = points[i];\r\n }\r\n if (right_dist < closest_distance_to_right_plane)\r\n {\r\n closest_distance_to_right_plane = right_dist;\r\n // closest_right_point = points[i];\r\n }\r\n }\r\n\r\n const correction = (closest_distance_to_right_plane - closest_distance_to_left_plane) / 2;\r\n // console.log(\"horizontal_correction\", correction)\r\n\r\n return right_dir.clone().multiplyScalar(-correction);\r\n }\r\n\r\n get_up_plane_normal(camera_quaternion, v_fov)\r\n {\r\n const up_plane_normal = new Vector3(0, -1, 0);\r\n up_plane_normal.applyQuaternion(new Quaternion().setFromAxisAngle(new Vector3(1, 0, 0), v_fov));\r\n up_plane_normal.applyQuaternion(camera_quaternion);\r\n return up_plane_normal;\r\n }\r\n\r\n get_down_plane_normal(camera_quaternion, v_fov)\r\n {\r\n const down_plane_normal = new Vector3(0, 1, 0);\r\n down_plane_normal.applyQuaternion(new Quaternion().setFromAxisAngle(new Vector3(1, 0, 0), -v_fov));\r\n down_plane_normal.applyQuaternion(camera_quaternion);\r\n return down_plane_normal;\r\n }\r\n\r\n get_left_plane_normal(camera_quaternion, h_fov)\r\n {\r\n const left_plane_normal = new Vector3(1, 0, 0);\r\n left_plane_normal.applyQuaternion(new Quaternion().setFromAxisAngle(new Vector3(0, 1, 0), h_fov));\r\n left_plane_normal.applyQuaternion(camera_quaternion);\r\n return left_plane_normal;\r\n }\r\n\r\n get_right_plane_normal(camera_quaternion, h_fov)\r\n {\r\n const right_plane_normal = new Vector3(-1, 0, 0);\r\n right_plane_normal.applyQuaternion(new Quaternion().setFromAxisAngle(new Vector3(0, 1, 0), -h_fov));\r\n right_plane_normal.applyQuaternion(camera_quaternion);\r\n return right_plane_normal;\r\n }\r\n\r\n get_distance_to_fit_rect(width, height, vertical_fov, aspect)\r\n {\r\n const v_fov = (vertical_fov / 2) * Math.PI / 180;\r\n const h_fov = (2 * Math.atan(Math.tan(v_fov) * aspect)) / 2;\r\n\r\n const distV = height / Math.tan(v_fov);\r\n const distH = width / Math.tan(h_fov);\r\n return Math.max(Math.abs(distH), Math.abs(distV));\r\n }\r\n}\r\n","import { Vector3, Box3 } from 'three';\r\n\r\nexport default class OrthographicFrustumPointFitter\r\n{\r\n constructor()\r\n {\r\n\r\n }\r\n\r\n fit_points(points, camera_quaternion, vertical_fov, aspect)\r\n {\r\n const inverse_camera_quat = camera_quaternion.clone().inverse();\r\n\r\n const inverted_points = [];\r\n\r\n for (let i = 0; i < points.length; i++)\r\n {\r\n inverted_points.push(points[i].clone().applyQuaternion(inverse_camera_quat));\r\n }\r\n\r\n const box = new Box3().setFromPoints(inverted_points);\r\n const size = new Vector3();\r\n box.getSize(size);\r\n\r\n const distance = this.get_distance_to_fit_rect(size.x / 2, size.y / 2, vertical_fov, aspect);\r\n\r\n const center = new Vector3();\r\n box.getCenter(center);\r\n\r\n center.applyQuaternion(camera_quaternion);\r\n\r\n return {\r\n center: center,\r\n distance_to_center: distance\r\n };\r\n }\r\n\r\n get_distance_to_fit_rect(width, height, vertical_fov, aspect)\r\n {\r\n const v_fov = (vertical_fov / 2) * Math.PI / 180;\r\n const h_fov = (2 * Math.atan(Math.tan(v_fov) * aspect)) / 2;\r\n\r\n const distV = height / Math.tan(v_fov);\r\n const distH = width / Math.tan(h_fov);\r\n return Math.max(Math.abs(distH), Math.abs(distV));\r\n }\r\n}\r\n","import grid_frag from '../shaders/grid/grid.frag';\r\nimport grid_vert from '../shaders/grid/grid.vert';\r\nimport GeometryUtilities from '../utilities/GeometryUtilities';\r\n\r\nimport { Mesh } from 'three';\r\nimport { ShaderMaterial } from 'three';\r\nimport { Color } from 'three';\r\nimport { PlaneGeometry } from 'three';\r\n\r\nexport default class Grid extends Mesh\r\n{\r\n constructor()\r\n {\r\n const material = new ShaderMaterial({\r\n uniforms: {\r\n _Color: { value: new Color('#919191') }\r\n },\r\n vertexShader: grid_vert,\r\n fragmentShader: grid_frag,\r\n extensions: { derivatives: true },\r\n transparent: true,\r\n depthWrite: false\r\n });\r\n\r\n const plane_geometry = new PlaneGeometry(100, 100, 100, 100);\r\n\r\n const non_indexed_geometry = GeometryUtilities.convert_to_non_indexed_geometry(plane_geometry);\r\n\r\n super(non_indexed_geometry, material);\r\n\r\n this.rotation.x = -3.14 / 2;\r\n }\r\n}\r\n","import line_vs from '../shaders/basic_line/basic_line.vert';\r\nimport line_fs from '../shaders/basic_line/basic_line.frag';\r\n\r\nimport { Mesh } from 'three';\r\nimport { BufferAttribute } from 'three';\r\nimport { BufferGeometry } from 'three';\r\nimport { ShaderMaterial } from 'three';\r\nimport { Color } from 'three';\r\n\r\nexport default class Line extends Mesh\r\n{\r\n constructor(points)\r\n {\r\n const geometry = new BufferGeometry();\r\n geometry.setAttribute('position', new BufferAttribute(new Float32Array([]), 3));\r\n geometry.setAttribute('next_position', new BufferAttribute(new Float32Array([]), 3));\r\n geometry.setAttribute('previous_position', new BufferAttribute(new Float32Array([]), 3));\r\n geometry.setAttribute('orientation', new BufferAttribute(new Float32Array([]), 1));\r\n geometry.setAttribute('coverage', new BufferAttribute(new Float32Array([]), 1));\r\n\r\n const material = new ShaderMaterial({\r\n uniforms: {\r\n _Thickness: { value: 0.2 },\r\n _Length: { value: 0 },\r\n _ElapsedTime: { value: 0 },\r\n _Color: { value: new Color('#FF0000') }\r\n },\r\n vertexShader: line_vs,\r\n fragmentShader: line_fs,\r\n transparent: true,\r\n depthWrite: false,\r\n extensions: { derivatives: true }\r\n\r\n });\r\n\r\n super(geometry, material);\r\n\r\n if (points)\r\n {\r\n this.setup(points);\r\n }\r\n }\r\n\r\n setup(points)\r\n {\r\n const vertices = [];\r\n const next_position = [];\r\n const previous_position = [];\r\n const orientation = [];\r\n const coverage = [];\r\n let accumulated_length = 0;\r\n\r\n for (let i = 0; i < points.length; i++)\r\n {\r\n vertices.push(points[i].x);\r\n vertices.push(points[i].y);\r\n vertices.push(points[i].z);\r\n orientation.push(1);\r\n\r\n vertices.push(points[i].x);\r\n vertices.push(points[i].y);\r\n vertices.push(points[i].z);\r\n orientation.push(-1);\r\n\r\n const next_point = this.__get_next_position(points, i);\r\n next_position.push(next_point.x);\r\n next_position.push(next_point.y);\r\n next_position.push(next_point.z);\r\n\r\n next_position.push(next_point.x);\r\n next_position.push(next_point.y);\r\n next_position.push(next_point.z);\r\n\r\n const previous_point = this.__get_previous_position(points, i);\r\n previous_position.push(previous_point.x);\r\n previous_position.push(previous_point.y);\r\n previous_position.push(previous_point.z);\r\n\r\n previous_position.push(previous_point.x);\r\n previous_position.push(previous_point.y);\r\n previous_position.push(previous_point.z);\r\n\r\n coverage.push(accumulated_length);\r\n coverage.push(accumulated_length);\r\n\r\n if (i < points.length - 1)\r\n {\r\n accumulated_length += points[i].distanceTo(next_point);\r\n }\r\n }\r\n const vertexList = new Float32Array(vertices);\r\n const nextPositionList = new Float32Array(next_position);\r\n const previousPositionList = new Float32Array(previous_position);\r\n const orientationList = new Float32Array(orientation);\r\n const coverageList = new Float32Array(coverage);\r\n\r\n const indices = [];\r\n for (let i = 0; i < ((vertexList.length / 3) - 2) / 2; i++)\r\n {\r\n const index = (i * 2) + 1;\r\n indices.push(index);\r\n indices.push(index + 1);\r\n indices.push(index - 1);\r\n\r\n indices.push(index);\r\n indices.push(index + 2);\r\n indices.push(index + 1);\r\n }\r\n\r\n this.geometry.setIndex(indices);\r\n this.geometry.getAttribute('position').copy(new BufferAttribute(vertexList, 3));\r\n this.geometry.getAttribute('next_position').copy(new BufferAttribute(nextPositionList, 3));\r\n this.geometry.getAttribute('previous_position').copy(new BufferAttribute(previousPositionList, 3));\r\n this.geometry.getAttribute('orientation').copy(new BufferAttribute(orientationList, 1));\r\n this.geometry.getAttribute('coverage').copy(new BufferAttribute(coverageList, 1));\r\n\r\n this.geometry.getAttribute('position').needsUpdate = true;\r\n this.geometry.getAttribute('next_position').needsUpdate = true;\r\n this.geometry.getAttribute('previous_position').needsUpdate = true;\r\n this.geometry.getAttribute('orientation').needsUpdate = true;\r\n this.geometry.getAttribute('coverage').needsUpdate = true;\r\n\r\n this.material.uniforms._Length.value = accumulated_length;\r\n this._length = accumulated_length;\r\n }\r\n\r\n set thickness(value)\r\n {\r\n this.material.uniforms._Thickness.value = value;\r\n }\r\n\r\n get thickness()\r\n {\r\n return this.material.uniforms._Thickness.value;\r\n }\r\n\r\n __get_previous_position(points, i)\r\n {\r\n if (i === 0)\r\n {\r\n return points[1].clone().sub(points[0]).multiplyScalar(-1).add(points[0]);\r\n }\r\n else\r\n {\r\n return points[i - 1];\r\n }\r\n }\r\n\r\n __get_next_position(points, i)\r\n {\r\n if (i === points.length - 1)\r\n {\r\n return points[points.length - 2].clone().sub(points[points.length - 1]).multiplyScalar(-1).add(points[points.length - 1]);\r\n }\r\n else\r\n {\r\n return points[i + 1];\r\n }\r\n }\r\n\r\n update()\r\n {\r\n }\r\n\r\n distance()\r\n {\r\n return this.accumulated_length;\r\n }\r\n\r\n total_length()\r\n {\r\n return this.accumulated_length;\r\n }\r\n\r\n dispose()\r\n {\r\n this.geometry.dispose();\r\n this.material.dispose();\r\n if (this.parent)\r\n {\r\n this.parent.remove(this);\r\n }\r\n }\r\n\r\n set color(col)\r\n {\r\n this.material.uniforms._Color.value.set(col);\r\n }\r\n\r\n get color()\r\n {\r\n return this.material.uniforms._Color.value;\r\n }\r\n\r\n copy_color(col)\r\n {\r\n this.material.uniforms._Color.value.copy(col);\r\n }\r\n}\r\n","import basic_texture_vert from '../shaders/basic_texture/basic_texture.vert';\r\nimport basic_texture_frag from '../shaders/basic_texture/basic_texture.frag';\r\n\r\nimport { Mesh } from 'three';\r\nimport { Vector2 } from 'three';\r\nimport { ShaderMaterial } from 'three';\r\nimport { DoubleSide } from 'three';\r\nimport { PlaneGeometry } from 'three';\r\nimport { Vector3 } from 'three';\r\n\r\nexport default class WorldImage extends Mesh\r\n{\r\n constructor(texture, pivot)\r\n {\r\n pivot = pivot || new Vector2(0, 0);\r\n const material = new ShaderMaterial({\r\n uniforms: {\r\n _MainTex: { value: texture },\r\n _ScreenAligned: { value: 0 },\r\n _Scale: { value: 1 },\r\n _Opacity: { value: 1 }\r\n },\r\n vertexShader: basic_texture_vert,\r\n fragmentShader: basic_texture_frag,\r\n transparent: true,\r\n depthWrite: false,\r\n side: DoubleSide\r\n });\r\n const geometry = new PlaneGeometry(1, 1, 1);\r\n geometry.translate(-pivot.x / 2, -pivot.y / 2, 0);\r\n const current_scale = texture.image.width / texture.image.height;\r\n geometry.scale(current_scale, 1, 1);\r\n super(geometry, material);\r\n this.current_scale = current_scale;\r\n this.geometry.computeBoundingBox();\r\n\r\n this.tmp_bb_size = new Vector3();\r\n this.geometry.boundingBox.getSize(this.tmp_bb_size);\r\n }\r\n\r\n update_texture()\r\n {\r\n this.material.uniforms._MainTex.value.needsUpdate = true;\r\n const img = this.material.uniforms._MainTex.value.image;\r\n\r\n this.geometry.scale(1 / this.current_scale, 1, 1);\r\n this.current_scale = img.width / img.height;\r\n this.geometry.scale(this.current_scale, 1, 1);\r\n this.geometry.computeBoundingBox();\r\n this.geometry.boundingBox.getSize(this.tmp_bb_size);\r\n }\r\n\r\n get size()\r\n {\r\n return this.tmp_bb_size.clone().multiplyScalar(this.scale.x);\r\n }\r\n\r\n set size(value)\r\n {\r\n this.scale.set(value, value, value);\r\n this.material.uniforms._Scale.value = value;\r\n }\r\n\r\n set screen_aligned(boolean)\r\n {\r\n this.material.uniforms._ScreenAligned.value = boolean === true ? 1 : 0;\r\n }\r\n\r\n get screen_aligned()\r\n {\r\n return this.material.uniforms._ScreenAligned.value === 1;\r\n }\r\n\r\n set opacity(opacity)\r\n {\r\n this.material.uniforms._Opacity.value = opacity;\r\n }\r\n\r\n get opacity()\r\n {\r\n return this.material.uniforms._Opacity.value;\r\n }\r\n\r\n dispose()\r\n {\r\n this.geometry.dispose();\r\n this.parent.remove(this);\r\n this.material.uniforms._MainTex.value.dispose();\r\n this.material.dispose();\r\n }\r\n}\r\n","import WorldImage from './WorldImage';\r\nimport SimpleTextDrawer from '../canvas_drawer/SimpleTextDrawer';\r\n\r\nimport { LinearMipMapLinearFilter } from 'three';\r\nimport { LinearFilter } from 'three';\r\n\r\nexport default class Text2D extends WorldImage\r\n{\r\n constructor(text, font, color, pivot, is_static)\r\n {\r\n const simple_text_drawer = new SimpleTextDrawer(is_static);\r\n\r\n const draw_settings = {\r\n font: font,\r\n font_color: color || '#000000'\r\n };\r\n const canvas_texture = simple_text_drawer.draw_on_texture(text, draw_settings);\r\n\r\n canvas_texture.minFilter = LinearMipMapLinearFilter;\r\n canvas_texture.minFilter = LinearFilter;\r\n canvas_texture.needsUpdate = true;\r\n super(canvas_texture, pivot);\r\n\r\n this.simple_text_drawer = simple_text_drawer;\r\n this.canvas_texture = canvas_texture;\r\n this.draw_settings = draw_settings;\r\n }\r\n\r\n set text(value)\r\n {\r\n this.simple_text_drawer.draw_canvas(value, this.draw_settings);\r\n this.update_texture();\r\n }\r\n\r\n get text()\r\n {\r\n return 'not implemented';\r\n }\r\n}\r\n","import vert from '../shaders/ui_element/ui_element.vert';\r\nimport frag from '../shaders/ui_element/ui_element.frag';\r\nimport BaseShaderMaterial from '../materials/BaseShaderMaterial';\r\n\r\nimport { Vector2 } from 'three';\r\nimport { Vector3 } from 'three';\r\n\r\nimport OScreen from '../OScreen';\r\n\r\nexport default class UIElementMaterial extends BaseShaderMaterial\r\n{\r\n constructor(intensity = 1)\r\n {\r\n super(vert, frag, {\r\n _MainTex: { value: undefined },\r\n _ScreenSize: { value: new Vector2(OScreen.width, OScreen.height) },\r\n _TextureSize: { value: new Vector2() },\r\n _PixelOffset: { value: new Vector2(0, 0) },\r\n _NDC: { value: new Vector3() },\r\n _PivotPoint: { value: new Vector2() },\r\n _DepthOffset: { value: 0 }\r\n });\r\n this.transparent = true;\r\n this.depthWrite = false;\r\n this.depthTest = false;\r\n }\r\n}\r\n","import { Vector2 } from 'three';\r\n\r\nexport default class ScreenSpacePosition\r\n{\r\n constructor()\r\n {\r\n this.tmp_vec = new Vector2();\r\n }\r\n\r\n get_pos_NDC(position)\r\n {\r\n return this.tmp_vec.set(position.x, position.y);\r\n }\r\n}\r\n","import CameraManager from '../../CameraManager';\r\n\r\nimport { Vector2 } from 'three';\r\nimport { Vector3 } from 'three';\r\n\r\nexport default class WorldSpacePosition\r\n{\r\n constructor()\r\n {\r\n this.tmp_vec3 = new Vector3();\r\n this.tmp_vec2 = new Vector2();\r\n }\r\n\r\n get_pos_NDC(position)\r\n {\r\n this.tmp_vec3.copy(position);\r\n this.tmp_vec3.project(CameraManager.current);\r\n\r\n return this.tmp_vec2.set(this.tmp_vec3.x, this.tmp_vec3.y);\r\n }\r\n}\r\n","export default class UIElementState\r\n{\r\n constructor()\r\n {\r\n\r\n }\r\n\r\n update(ui_element, normalized_mouse_position)\r\n {\r\n\r\n }\r\n\r\n on_enter(ui_element)\r\n {}\r\n\r\n on_exit(ui_element)\r\n {}\r\n}\r\n","import UIElementState from './UIElementState';\r\n\r\nexport default class OnIdle extends UIElementState\r\n{\r\n constructor()\r\n {\r\n super();\r\n }\r\n\r\n update(ui_element, normalized_mouse_position)\r\n {\r\n if (ui_element.is_mouse_over(normalized_mouse_position))\r\n {\r\n ui_element.set_state(ui_element._on_enter_state);\r\n }\r\n }\r\n}\r\n","import UIElementState from './UIElementState';\r\n\r\nexport default class OnMouseEnter extends UIElementState\r\n{\r\n constructor()\r\n {\r\n super();\r\n }\r\n\r\n on_enter(ui_element)\r\n {\r\n ui_element.on_mouse_enter();\r\n }\r\n\r\n update(ui_element, normalized_mouse_position)\r\n {\r\n if (ui_element.is_mouse_over(normalized_mouse_position))\r\n {\r\n ui_element.set_state(ui_element._on_hover_state);\r\n }\r\n else\r\n {\r\n ui_element.set_state(ui_element._on_exit_state);\r\n }\r\n }\r\n}\r\n","import UIElementState from './UIElementState';\r\n\r\nexport default class OnMouseExit extends UIElementState\r\n{\r\n constructor()\r\n {\r\n super();\r\n }\r\n\r\n on_enter(ui_element)\r\n {\r\n ui_element.on_mouse_exit();\r\n ui_element.set_state(ui_element._on_idle_state);\r\n }\r\n}\r\n","import UIElementState from './UIElementState';\r\n\r\nexport default class OnMouseHover extends UIElementState\r\n{\r\n constructor()\r\n {\r\n super();\r\n }\r\n\r\n on_enter(ui_element)\r\n {\r\n this.__trigger_on_hover(ui_element);\r\n }\r\n\r\n update(ui_element, normalized_mouse_position)\r\n {\r\n if (ui_element.is_mouse_over(normalized_mouse_position))\r\n {\r\n this.__trigger_on_hover(ui_element);\r\n }\r\n else\r\n {\r\n ui_element.set_state(ui_element._on_exit_state);\r\n }\r\n }\r\n\r\n __trigger_on_hover(ui_element)\r\n {\r\n ui_element.on_mouse_hover();\r\n }\r\n}\r\n","\r\nimport OScreen from '../OScreen';\r\n\r\nimport UIElementMaterial from '../materials/UIElementMaterial';\r\n\r\nimport ScreenSpacePosition from '../ui/ui_element_position/ScreenSpacePosition';\r\nimport WorldSpacePosition from '../ui/ui_element_position/WorldSpacePosition';\r\n\r\nimport OnIdle from '../ui/ui_element_state/OnIdle';\r\nimport OnMouseEnter from '../ui/ui_element_state/OnMouseEnter';\r\nimport OnMouseExit from '../ui/ui_element_state/OnMouseExit';\r\nimport OnMouseHover from '../ui/ui_element_state/OnMouseHover';\r\n\r\nimport { Mesh } from 'three';\r\nimport { PlaneGeometry } from 'three';\r\nimport { Vector2 } from 'three';\r\nimport { Vector3 } from 'three';\r\nimport { NearestFilter } from 'three';\r\nimport { Box2 } from 'three';\r\n\r\nexport default class UIElement extends Mesh\r\n{\r\n constructor(vert, frag)\r\n {\r\n super(new PlaneGeometry(1, 1), new UIElementMaterial());\r\n\r\n this.is_clickable = false;\r\n\r\n this.position_strategy = new WorldSpacePosition();\r\n this.current_state = new OnIdle();\r\n\r\n this._position = new Vector3();\r\n\r\n this._on_idle_state = new OnIdle();\r\n this._on_enter_state = new OnMouseEnter();\r\n this._on_exit_state = new OnMouseExit();\r\n this._on_hover_state = new OnMouseHover();\r\n\r\n this.on_enter = undefined;\r\n this.on_exit = undefined;\r\n this.on_hover = undefined;\r\n\r\n this.mouse_pos_tmp = new Vector2();\r\n this.cached_NDC_position = new Vector2();\r\n this.screen_pos_tmp = new Vector2();\r\n\r\n this.texture_size = new Vector2(1, 1);\r\n\r\n this.frustumCulled = false;\r\n this.matrixAutoUpdate = false;\r\n this.renderOrder = 0;\r\n\r\n this.size = 1;\r\n this.pixel_offset = new Vector2();\r\n }\r\n\r\n set_render_order(value)\r\n {\r\n this.renderOrder = value;\r\n }\r\n\r\n get pivot_point()\r\n {\r\n return this.material.uniforms._PivotPoint.value;\r\n }\r\n\r\n set_pixel_offset(offset)\r\n {\r\n this.pixel_offset.copy(offset);\r\n this.material.uniforms._PixelOffset.value.copy(offset);\r\n }\r\n\r\n set_state(new_state)\r\n {\r\n this.current_state.on_exit(this);\r\n this.current_state = new_state;\r\n this.current_state.on_enter(this);\r\n }\r\n\r\n get position()\r\n {\r\n return this._position;\r\n }\r\n\r\n set use_depth(boolean)\r\n {\r\n this.material.depthTest = boolean;\r\n }\r\n\r\n get use_depth()\r\n {\r\n return this.material.depthTest;\r\n }\r\n\r\n set depth_offset(value)\r\n {\r\n this.material.uniforms._DepthOffset.value = value;\r\n }\r\n\r\n get depth_offset()\r\n {\r\n return this.material.uniforms._DepthOffset.value;\r\n }\r\n\r\n clear_state()\r\n {\r\n this.visible = false;\r\n }\r\n\r\n set_world_space_coordinate_system()\r\n {\r\n this.position_strategy = new WorldSpacePosition();\r\n }\r\n\r\n set_screen_space_coordinate_system()\r\n {\r\n this.position_strategy = new ScreenSpacePosition();\r\n }\r\n\r\n set_texture(texture)\r\n {\r\n texture.minFilter = NearestFilter;\r\n texture.magFilter = NearestFilter;\r\n texture.needsUpdate = true;\r\n\r\n this.texture_size.set(texture.image.width, texture.image.height);\r\n\r\n this.material.uniforms._MainTex.value = texture;\r\n this.get_size(this.material.uniforms._TextureSize.value);\r\n this.visible = true;\r\n }\r\n\r\n update_state(normalized_mouse_pos)\r\n {\r\n this.material.uniforms._ScreenSize.value.set(OScreen.width, OScreen.height);\r\n this.get_size(this.material.uniforms._TextureSize.value);\r\n\r\n this.cached_NDC_position.copy(this.position_strategy.get_pos_NDC(this.position));\r\n this.material.uniforms._NDC.value.copy(this.position);\r\n this.current_state.update(this, normalized_mouse_pos);\r\n }\r\n\r\n is_mouse_over(normalized_mouse_pos)\r\n {\r\n this.screen_pos_tmp.copy(this.cached_NDC_position);\r\n this.to_screen_position(this.screen_pos_tmp);\r\n this.screen_pos_tmp.x += this.pixel_offset.x;\r\n this.screen_pos_tmp.y += this.pixel_offset.y;\r\n\r\n const rect = new Box2().setFromCenterAndSize(this.screen_pos_tmp, this.get_size());\r\n\r\n this.mouse_pos_tmp.copy(normalized_mouse_pos);\r\n this.to_screen_position(this.mouse_pos_tmp);\r\n\r\n return rect.containsPoint(this.mouse_pos_tmp);\r\n }\r\n\r\n to_screen_position(projected_pos)\r\n {\r\n projected_pos.x = (projected_pos.x * 0.5 + 0.5) * OScreen.width + this.pixel_offset.x;\r\n projected_pos.y = (projected_pos.y * 0.5 + 0.5) * OScreen.height + this.pixel_offset.y;\r\n }\r\n\r\n get_screen_space_position()\r\n {\r\n const pos = this.cached_NDC_position.clone();\r\n this.to_screen_position(pos);\r\n return pos;\r\n }\r\n\r\n set_screen_space_position(screen_pos)\r\n {\r\n this.position.x = (screen_pos.x / OScreen.width) * 2 - 1;\r\n this.position.y = (screen_pos.y / OScreen.height) * 2 - 1;\r\n }\r\n\r\n dispose()\r\n {\r\n if (this.material.uniforms._MainTex.value)\r\n {\r\n this.material.uniforms._MainTex.value.dispose();\r\n }\r\n // OScreen.remove_screen_material(this.material);\r\n this.geometry.dispose();\r\n this.material.dispose();\r\n }\r\n\r\n get_size(vector2)\r\n {\r\n if (vector2)\r\n {\r\n return vector2.copy(this.texture_size).multiplyScalar(this.size / OScreen.dpr);\r\n }\r\n else\r\n {\r\n return new Vector2().copy(this.texture_size).multiplyScalar(this.size / OScreen.dpr);\r\n }\r\n }\r\n\r\n on_mouse_enter()\r\n {}\r\n\r\n on_mouse_exit()\r\n {}\r\n\r\n on_mouse_hover()\r\n {}\r\n}\r\n","import { Mesh } from 'three';\r\n\r\nexport default class UpdatableMaterialMesh extends Mesh\r\n{\r\n constructor(geometry, material)\r\n {\r\n super(geometry, material);\r\n\r\n const self = this;\r\n\r\n this.onBeforeRender = () =>\r\n {\r\n self.material.update();\r\n };\r\n }\r\n}\r\n","import { Vector2, Vector4 } from 'three';\r\n\r\nexport default class TextGlyph\r\n{\r\n constructor(offset, plane_bounds, atlas_bounds)\r\n {\r\n const width = plane_bounds.right - plane_bounds.left;\r\n const height = plane_bounds.top - plane_bounds.bottom;\r\n\r\n this.scale = new Vector2(width, height);\r\n this.position = new Vector2(offset + plane_bounds.left, plane_bounds.bottom);\r\n\r\n this.atlas_bounds = new Vector4(atlas_bounds.left, atlas_bounds.right, atlas_bounds.top, atlas_bounds.bottom);\r\n }\r\n}\r\n","import { Vector3, Quaternion, Matrix4, Color, Box2, Vector2 } from 'three';\r\nimport TextGlyph from './TextGlyph';\r\n\r\nexport default class SDFText\r\n{\r\n constructor(glyph_layout, text = '')\r\n {\r\n this.glyph_layout = glyph_layout;\r\n\r\n this.glyphs = [];\r\n\r\n this.glyph_is_dirty = true;\r\n this.matrix_is_dirty = true;\r\n this.color_is_dirty = true;\r\n\r\n this.position = new Vector3();\r\n this.quaternion = new Quaternion();\r\n this.scale = new Vector3(1, 1, 1);\r\n this.matrix = new Matrix4();\r\n\r\n this.color = new Color('#FFFFFF');\r\n\r\n this.pivot_point = new Vector2();\r\n this.__opacity = 1;\r\n\r\n this.__text = text;\r\n\r\n this.__generate_glyphs(text);\r\n }\r\n\r\n set text(value)\r\n {\r\n this.__text = value;\r\n this.__generate_glyphs(value);\r\n this.matrix_is_dirty = true;\r\n }\r\n\r\n get text()\r\n {\r\n return this.__text;\r\n }\r\n\r\n update_matrix()\r\n {\r\n this.matrix.compose(this.position, this.quaternion, this.scale);\r\n this.matrix_is_dirty = false;\r\n this.glyph_is_dirty = true;\r\n }\r\n\r\n clear_glyph_dirty()\r\n {\r\n this.glyph_is_dirty = false;\r\n }\r\n\r\n clear_color_dirty()\r\n {\r\n this.color_is_dirty = false;\r\n }\r\n\r\n set_rotation(orientation = 0, tilt = 0) // 0..360, -90..0..90\r\n {\r\n const new_orientation = new Quaternion().setFromAxisAngle(new Vector3(0, 1, 0), (orientation / 360) * Math.PI * 2);\r\n const new_tilt = new Quaternion().setFromAxisAngle(new Vector3(1, 0, 0), (-tilt / 360) * Math.PI * 2);\r\n\r\n this.quaternion.copy(new_orientation.multiply(new_tilt));\r\n this.matrix_is_dirty = true;\r\n }\r\n\r\n set_position(pos)\r\n {\r\n this.position.copy(pos);\r\n this.matrix_is_dirty = true;\r\n }\r\n\r\n set_size(size)\r\n {\r\n this.scale.set(size, size, size);\r\n this.matrix_is_dirty = true;\r\n }\r\n\r\n set_color(col)\r\n {\r\n this.color.set(col);\r\n this.color_is_dirty = true;\r\n }\r\n\r\n set_pivot(pivot)\r\n {\r\n this.pivot_point.copy(pivot);\r\n this.update_glyphs();\r\n }\r\n\r\n set opacity(op)\r\n {\r\n this.__opacity = op;\r\n this.color_is_dirty = true;\r\n }\r\n\r\n get opacity()\r\n {\r\n return this.__opacity;\r\n }\r\n\r\n update_glyphs()\r\n {\r\n this.__generate_glyphs(this.text);\r\n }\r\n\r\n __generate_glyphs(text)\r\n {\r\n let cursor = 0;\r\n\r\n this.glyphs.length = 0;\r\n\r\n for (let i = 0; i < text.length; i++)\r\n {\r\n const unicode = text.charCodeAt(i);\r\n const glyph = this.glyph_layout.find(element => element.unicode === unicode);\r\n if (glyph)\r\n {\r\n if (glyph.planeBounds)\r\n {\r\n const text_glyph = new TextGlyph(cursor, glyph.planeBounds, glyph.atlasBounds);\r\n this.glyphs.push(text_glyph);\r\n }\r\n cursor += glyph.advance;\r\n }\r\n }\r\n\r\n const box2 = new Box2();\r\n const first_glyph = this.glyphs[0];\r\n box2.setFromCenterAndSize(first_glyph.position.clone().add(new Vector2(first_glyph.scale.x / 2, first_glyph.scale.y / 2)), first_glyph.scale);\r\n\r\n for (let i = 1; i < this.glyphs.length; i++)\r\n {\r\n const g = this.glyphs[i];\r\n const box = new Box2().setFromCenterAndSize(g.position.clone().add(new Vector2(g.scale.x / 2, g.scale.y / 2)), g.scale);\r\n box2.union(box);\r\n }\r\n\r\n const box2_size = new Vector2();\r\n box2.getSize(box2_size);\r\n for (let i = 0; i < this.glyphs.length; i++)\r\n {\r\n this.glyphs[i].position.x -= box2_size.x / 2;\r\n this.glyphs[i].position.y -= box2_size.y / 2;\r\n\r\n this.glyphs[i].position.x += (box2_size.x / 2) * this.pivot_point.x;\r\n this.glyphs[i].position.y += (box2_size.y / 2) * this.pivot_point.y;\r\n }\r\n\r\n this.glyph_is_dirty = true;\r\n }\r\n}\r\n","import BaseShaderMaterial from './BaseShaderMaterial';\r\nimport frag from '../shaders/sdf_text/sdf_text.frag';\r\nimport vert from '../shaders/sdf_text/sdf_text.vert';\r\n\r\nimport { Vector2, DoubleSide, LinearFilter } from 'three';\r\nimport OMath from '../utilities/OMath';\r\n\r\nexport default class SDFTextMaterial extends BaseShaderMaterial\r\n{\r\n constructor(texture)\r\n {\r\n super(vert, frag, {\r\n _Texture: { value: texture },\r\n _Boldness: { value: 0.5 },\r\n _AtlasSize: { value: new Vector2(1, 1) }\r\n });\r\n\r\n this.transparent = true;\r\n this.extensions = {\r\n derivatives: true\r\n };\r\n this.depthWrite = false;\r\n this.side = DoubleSide;\r\n texture.minFilter = LinearFilter;\r\n texture.magFilter = LinearFilter;\r\n texture.generateMipMaps = false;\r\n }\r\n\r\n set_atlas_size(size)\r\n {\r\n this.uniforms._AtlasSize.value.copy(size);\r\n }\r\n\r\n set_boldness(value)\r\n {\r\n this.uniforms._Boldness.value = OMath.lerp(0.5, 0.2, value);\r\n }\r\n}\r\n","import SDFText from './SDFText';\r\nimport SDFTextMaterial from '../../materials/SDFTextMaterial';\r\nimport ArrayUtilities from '../../utilities/ArrayUtilities';\r\n\r\nimport {\r\n PlaneGeometry,\r\n Mesh,\r\n Vector2,\r\n InstancedBufferGeometry,\r\n InstancedBufferAttribute,\r\n Float32BufferAttribute,\r\n DynamicDrawUsage\r\n} from 'three';\r\n\r\nexport default class SDFTextBatch extends Mesh\r\n{\r\n constructor(font_layout, atlas_texture)\r\n {\r\n const max_allocations = 2000;\r\n\r\n const instanced_geometry = new InstancedBufferGeometry();\r\n instanced_geometry.instanceCount = 0;\r\n\r\n const geometry = new PlaneGeometry(1, 1);\r\n geometry.translate(0.5, 0.5, 0);\r\n instanced_geometry.setAttribute('position', new Float32BufferAttribute(geometry.getAttribute('position').array, 3));\r\n instanced_geometry.setAttribute('uv', new Float32BufferAttribute(geometry.getAttribute('uv').array, 2));\r\n instanced_geometry.index = geometry.index;\r\n\r\n const transformsCol0 = new InstancedBufferAttribute(new Float32Array(max_allocations * 4), 4, false);\r\n const transformsCol1 = new InstancedBufferAttribute(new Float32Array(max_allocations * 4), 4, false);\r\n const transformsCol2 = new InstancedBufferAttribute(new Float32Array(max_allocations * 4), 4, false);\r\n const transformsCol3 = new InstancedBufferAttribute(new Float32Array(max_allocations * 4), 4, false);\r\n\r\n const glyph_bounds = new InstancedBufferAttribute(new Float32Array(max_allocations * 4), 4, false);\r\n const plane_bounds = new InstancedBufferAttribute(new Float32Array(max_allocations * 4), 4, false);\r\n\r\n const color = new InstancedBufferAttribute(new Float32Array(max_allocations * 4), 4, false);\r\n\r\n transformsCol0.usage = DynamicDrawUsage;\r\n transformsCol1.usage = DynamicDrawUsage;\r\n transformsCol2.usage = DynamicDrawUsage;\r\n transformsCol3.usage = DynamicDrawUsage;\r\n glyph_bounds.usage = DynamicDrawUsage;\r\n plane_bounds.usage = DynamicDrawUsage;\r\n color.usage = DynamicDrawUsage;\r\n\r\n instanced_geometry.setAttribute('transformsCol0', transformsCol0);\r\n instanced_geometry.setAttribute('transformsCol1', transformsCol1);\r\n instanced_geometry.setAttribute('transformsCol2', transformsCol2);\r\n instanced_geometry.setAttribute('transformsCol3', transformsCol3);\r\n\r\n instanced_geometry.setAttribute('glyph_bounds', glyph_bounds);\r\n instanced_geometry.setAttribute('plane_bounds', plane_bounds);\r\n instanced_geometry.setAttribute('color', color);\r\n\r\n super(instanced_geometry, new SDFTextMaterial(atlas_texture));\r\n\r\n this.text_elements = [];\r\n this.font_layout = font_layout;\r\n\r\n this.material.set_atlas_size(new Vector2(font_layout.atlas.width, font_layout.atlas.height));\r\n\r\n this.frustumCulled = false;\r\n }\r\n\r\n set_boldness(value)\r\n {\r\n this.material.set_boldness(value);\r\n }\r\n\r\n add_text(text_str)\r\n {\r\n const elem = new SDFText(this.font_layout.glyphs, text_str);\r\n this.text_elements.push(elem);\r\n return elem;\r\n }\r\n\r\n remove_text(text_elem)\r\n {\r\n ArrayUtilities.remove_elem(this.text_elements, text_elem);\r\n this.update(true);\r\n }\r\n\r\n update(force_update)\r\n {\r\n const glyph_bounds_atr = this.geometry.getAttribute('glyph_bounds');\r\n const plane_bounds_atr = this.geometry.getAttribute('plane_bounds');\r\n\r\n const transformsCol0 = this.geometry.getAttribute('transformsCol0');\r\n const transformsCol1 = this.geometry.getAttribute('transformsCol1');\r\n const transformsCol2 = this.geometry.getAttribute('transformsCol2');\r\n const transformsCol3 = this.geometry.getAttribute('transformsCol3');\r\n\r\n const color_atr = this.geometry.getAttribute('color');\r\n\r\n let matrix_needs_update = force_update === true;\r\n let glyph_needs_update = force_update === true;\r\n let color_needs_update = force_update === true;\r\n\r\n let glyph_count = 0;\r\n for (let i = 0; i < this.text_elements.length; i++)\r\n {\r\n const text = this.text_elements[i];\r\n\r\n if (text.matrix_is_dirty)\r\n {\r\n matrix_needs_update = true;\r\n text.update_matrix();\r\n }\r\n\r\n if (text.glyph_is_dirty)\r\n {\r\n glyph_needs_update = true;\r\n text.clear_glyph_dirty();\r\n }\r\n\r\n if (text.color_is_dirty)\r\n {\r\n color_needs_update = true;\r\n text.clear_color_dirty();\r\n }\r\n\r\n const matrix = text.matrix;\r\n const color = text.color;\r\n const opacity = text.opacity;\r\n\r\n for (let glyph_i = 0; glyph_i < text.glyphs.length; glyph_i++)\r\n {\r\n const glyph = text.glyphs[glyph_i];\r\n\r\n const buffer_i = glyph_count;\r\n\r\n glyph_bounds_atr.setXYZW(buffer_i, glyph.atlas_bounds.x, glyph.atlas_bounds.y, glyph.atlas_bounds.z, glyph.atlas_bounds.w);\r\n plane_bounds_atr.setXYZW(buffer_i, glyph.position.x, glyph.position.y, glyph.scale.x, glyph.scale.y);\r\n\r\n transformsCol0.setXYZW(buffer_i, matrix.elements[0],\r\n matrix.elements[1],\r\n matrix.elements[2],\r\n matrix.elements[3]);\r\n\r\n transformsCol1.setXYZW(buffer_i, matrix.elements[4],\r\n matrix.elements[5],\r\n matrix.elements[6],\r\n matrix.elements[7]);\r\n\r\n transformsCol2.setXYZW(buffer_i, matrix.elements[8],\r\n matrix.elements[9],\r\n matrix.elements[10],\r\n matrix.elements[11]);\r\n\r\n transformsCol3.setXYZW(buffer_i, matrix.elements[12],\r\n matrix.elements[13],\r\n matrix.elements[14],\r\n matrix.elements[15]);\r\n\r\n color_atr.setXYZW(buffer_i, color.r, color.g, color.b, opacity);\r\n\r\n glyph_count++;\r\n }\r\n }\r\n\r\n this.geometry.instanceCount = glyph_count;\r\n\r\n if (glyph_count > this.max_allocations)\r\n {\r\n console.error('SDFTextBatch exceeded maximum glyph allocations(max/current): ', this.max_allocations, glyph_count, this);\r\n }\r\n\r\n if (matrix_needs_update)\r\n {\r\n transformsCol0.needsUpdate = true;\r\n transformsCol1.needsUpdate = true;\r\n transformsCol2.needsUpdate = true;\r\n transformsCol3.needsUpdate = true;\r\n }\r\n if (glyph_needs_update)\r\n {\r\n glyph_bounds_atr.needsUpdate = true;\r\n plane_bounds_atr.needsUpdate = true;\r\n }\r\n if (color_needs_update)\r\n {\r\n color_atr.needsUpdate = true;\r\n }\r\n }\r\n\r\n dispose()\r\n {\r\n this.geometry.dispose();\r\n this.material.dispose();\r\n }\r\n}\r\n","import ActionInterpolator from './ActionInterpolator';\r\n\r\nexport default class VectorInterpolator extends ActionInterpolator\r\n{\r\n constructor(attribute_name, from = 0, to = 1, easing_function = 'linear')\r\n {\r\n super(easing_function);\r\n\r\n this.attribute_name = attribute_name;\r\n this.from = from;\r\n this.to = to;\r\n }\r\n\r\n update(context, t)\r\n {\r\n const tmp = this.from.clone();\r\n tmp.lerp(this.to, this.easing_function(t));\r\n context[this.attribute_name].copy(tmp);\r\n }\r\n}\r\n","import BlitMaterial from '../materials/BlitMaterial';\r\nimport frag from '../shaders/median_filter/median_filter.frag';\r\n\r\nimport { Vector2 } from 'three';\r\n\r\nexport default class MedianFilterMaterial extends BlitMaterial\r\n{\r\n constructor()\r\n {\r\n super(frag, undefined, {\r\n kernel3x3: true\r\n });\r\n\r\n this.uniforms._SourceTex = { value: undefined };\r\n this.uniforms._SourceTexSize = { value: new Vector2(1, 1) };\r\n }\r\n\r\n set_texture(tex)\r\n {\r\n this.uniforms._SourceTex.value = tex;\r\n\r\n const size = this.get_size(tex);\r\n this.uniforms._SourceTexSize.value.copy(size);\r\n }\r\n\r\n get_size(tex)\r\n {\r\n if (tex.isVideoTexture)\r\n {\r\n return new Vector2(Math.max(1, tex.image.videoWidth), Math.max(1, tex.image.videoHeight));\r\n }\r\n if (tex.isWebGLRenderTarget)\r\n {\r\n return new Vector2(tex.width, tex.height);\r\n }\r\n if (tex.isTexture)\r\n {\r\n return new Vector2(tex.image.width, tex.image.height);\r\n }\r\n return new Vector2(1, 1);\r\n }\r\n}\r\n","import MedianFilterMaterial from '../materials/MedianFilterMaterial';\r\nimport Graphics from '../Graphics';\r\n\r\nimport { WebGLRenderTarget, Vector2, RGBAFormat, FloatType, NearestFilter } from 'three';\r\n\r\nexport default class MedianFilter\r\n{\r\n constructor(renderer)\r\n {\r\n this.RT = new WebGLRenderTarget(1, 1, {\r\n type: FloatType,\r\n format: RGBAFormat,\r\n minFilter: NearestFilter,\r\n magFilter: NearestFilter\r\n });\r\n this.RT1 = new WebGLRenderTarget(1, 1, {\r\n type: FloatType,\r\n format: RGBAFormat,\r\n minFilter: NearestFilter,\r\n magFilter: NearestFilter\r\n });\r\n\r\n this.median_filter_mat = new MedianFilterMaterial();\r\n }\r\n\r\n filter(texture)\r\n {\r\n const tex_size = this.get_size(texture);\r\n if (tex_size.x !== this.RT.width || tex_size.y !== this.RT.height)\r\n {\r\n this.RT.setSize(tex_size.x, tex_size.y);\r\n this.RT1.setSize(tex_size.x, tex_size.y);\r\n }\r\n\r\n this.median_filter_mat.set_texture(texture);\r\n Graphics.material_pass(this.median_filter_mat, this.RT);\r\n\r\n for (let i = 0; i < 0; i++)\r\n {\r\n this.median_filter_mat.set_texture(this.RT.texture);\r\n Graphics.material_pass(this.median_filter_mat, this.RT1);\r\n\r\n this.median_filter_mat.set_texture(this.RT1.texture);\r\n Graphics.material_pass(this.median_filter_mat, this.RT);\r\n }\r\n\r\n return this.RT;\r\n }\r\n\r\n get_size(tex)\r\n {\r\n if (tex.isVideoTexture)\r\n {\r\n return new Vector2(Math.max(1, tex.image.videoWidth), Math.max(1, tex.image.videoHeight));\r\n }\r\n if (tex.isWebGLRenderTarget)\r\n {\r\n return new Vector2(tex.width, tex.height);\r\n }\r\n if (tex.isTexture)\r\n {\r\n return new Vector2(tex.image.width, tex.image.height);\r\n }\r\n return new Vector2(1, 1);\r\n }\r\n}\r\n","import BlitMaterial from './BlitMaterial';\r\nimport downsample_frag from '../shaders/dual_filter_blur/downsample.frag';\r\nimport upsample_frag from '../shaders/dual_filter_blur/upsample.frag';\r\n\r\nexport default class DualFilteringBlurMaterial extends BlitMaterial\r\n{\r\n constructor(upsample)\r\n {\r\n super(upsample ? upsample_frag : downsample_frag);\r\n }\r\n}\r\n","import BlitMaterial from './BlitMaterial';\r\nimport frag from '../shaders/dual_filter_blur/alpha_filter.frag';\r\n\r\nexport default class AlphaFilterMaterial extends BlitMaterial\r\n{\r\n constructor(use_alpha_mask, upsample)\r\n {\r\n super(frag);\r\n }\r\n\r\n set offset(value)\r\n {\r\n this.uniforms._Offset.value = value;\r\n }\r\n\r\n get offset()\r\n {\r\n return this.uniforms._Offset.value;\r\n }\r\n}\r\n","import DualFilteringBlurMaterial from '../materials/DualFilteringBlurMaterial';\r\nimport AlphaFilterMaterial from '../materials/AlphaFilterMaterial';\r\nimport Graphics from '../Graphics';\r\nimport { WebGLRenderTarget } from 'three';\r\nexport default class DualFilteringBlurrer\r\n{\r\n constructor(use_alpha_mask)\r\n {\r\n this.current_width = 1;\r\n this.current_height = 1;\r\n this.RT0 = new WebGLRenderTarget(1, 1);\r\n this.RT1 = new WebGLRenderTarget(1, 1);\r\n this.RT2 = new WebGLRenderTarget(1, 1);\r\n this.RT3 = new WebGLRenderTarget(1, 1);\r\n this.RT4 = new WebGLRenderTarget(1, 1);\r\n\r\n this.upscale_blur_mat = new DualFilteringBlurMaterial(true);\r\n this.downscale_blur_mat = new DualFilteringBlurMaterial(false);\r\n\r\n this.alpha_filter_mat = new AlphaFilterMaterial();\r\n }\r\n\r\n blur(RT)\r\n {\r\n this.check_RT_resize(RT.width, RT.height);\r\n Graphics.blit(RT, this.RT1, this.alpha_filter_mat);\r\n\r\n // Graphics.blit(this.RT0, this.RT1, this.downscale_blur_mat);\r\n Graphics.blit(this.RT1, this.RT2, this.downscale_blur_mat);\r\n Graphics.blit(this.RT2, this.RT3, this.downscale_blur_mat);\r\n Graphics.blit(this.RT3, this.RT4, this.downscale_blur_mat);\r\n\r\n // Graphics.blit(this.RT4, this.RT3, this.upscale_blur_mat);\r\n // Graphics.blit(this.RT3, this.RT4, this.upscale_blur_mat);\r\n Graphics.blit(this.RT4, this.RT3, this.upscale_blur_mat);\r\n Graphics.blit(this.RT3, this.RT2, this.upscale_blur_mat);\r\n Graphics.blit(this.RT2, RT, this.upscale_blur_mat);\r\n // Graphics.blit(this.RT1, RT, this.upscale_blur_mat);\r\n\r\n // return this.RT2;\r\n }\r\n\r\n check_RT_resize(width, height)\r\n {\r\n if (this.current_width !== width || this.current_height !== height)\r\n {\r\n this.current_width = width;\r\n this.current_height = height;\r\n this.RT0.setSize(this.current_width / 2, this.current_height / 2);\r\n this.RT1.setSize(this.current_width / 2, this.current_height / 2);\r\n this.RT2.setSize(this.current_width / 4, this.current_height / 4);\r\n this.RT3.setSize(this.current_width / 8, this.current_height / 8);\r\n this.RT4.setSize(this.current_width / 16, this.current_height / 16);\r\n }\r\n }\r\n}\r\n","import { Object3D } from 'three';\r\nimport { BufferAttribute } from 'three';\r\nimport { Points } from 'three';\r\n\r\nexport default class GPUParticleSystem extends Object3D\r\n{\r\n constructor()\r\n {\r\n super();\r\n this.attributes = [];\r\n\r\n this.particles = undefined;\r\n }\r\n\r\n set_from_geometry(geometry, material, init_attribute_uvs)\r\n {\r\n // let position = new ParticlePositionAttribute(\"_Position\");\r\n if (init_attribute_uvs && geometry.getAttribute('storage_uv') === undefined)\r\n {\r\n const uv_storage_attr = this.build_uv_storage_attribute(geometry.getAttribute('position').count);\r\n geometry.setAttribute('storage_uv', uv_storage_attr);\r\n }\r\n // position.init_from_geometry(geometry);\r\n // this.attributes.push(position);\r\n\r\n // material.uniforms._Position.value = position.read.texture;\r\n\r\n const points = new Points(geometry, material);\r\n points.frustumCulled = false;\r\n this.particles = points;\r\n\r\n this.add(points);\r\n }\r\n\r\n add_texture_attribute(buffer_attribute)\r\n {\r\n\r\n }\r\n\r\n add_attribute(name, buffer_attribute)\r\n {\r\n\r\n }\r\n\r\n build_uv_storage_attribute(particle_count)\r\n {\r\n const resolution = this.calculate_resolution(particle_count);\r\n const uvs = new Float32Array(particle_count * 2);\r\n for (let i = 0, j = 0; i < particle_count * 2; i += 2, j++)\r\n {\r\n uvs[i] = ((j % resolution) / resolution) + (0.5 / resolution);\r\n uvs[i + 1] = (Math.floor(j / resolution) / resolution) + (0.5 / resolution);\r\n }\r\n\r\n return new BufferAttribute(uvs, 2);\r\n }\r\n\r\n calculate_resolution(particle_count)\r\n {\r\n return Math.ceil(Math.sqrt(particle_count));\r\n }\r\n\r\n update()\r\n {\r\n for (let i = 0; i < this.attributes.length; i++)\r\n {\r\n this.attributes[i].update();\r\n }\r\n }\r\n\r\n set_attribute_update_material(attribute_name, mat)\r\n {\r\n for (let i = 0; i < this.attributes.length; i++)\r\n {\r\n if (this.attributes[i].name === attribute_name)\r\n {\r\n this.attributes[i].update_material = mat;\r\n }\r\n }\r\n }\r\n\r\n dispose()\r\n {\r\n this.particles.geometry.dispose();\r\n this.particles.material.dispose();\r\n }\r\n}\r\n","import { DataTexture } from 'three';\r\n\r\nexport default class CustomDataTexture extends DataTexture\r\n{\r\n constructor(data, width, height, format, type)\r\n {\r\n super(data, width, height, format, type);\r\n this.multiplier = 1;\r\n }\r\n\r\n set_rgba(index, r, g, b, a)\r\n {\r\n this.data[index * 3 + 0] = r * this.multiplier;\r\n this.data[index * 3 + 1] = g * this.multiplier;\r\n this.data[index * 3 + 2] = b * this.multiplier;\r\n this.data[index * 3 + 3] = a * this.multiplier;\r\n this.needsUpdate = true;\r\n }\r\n\r\n set_rgb(index, r, g, b)\r\n {\r\n this.data[index * 3 + 0] = r * this.multiplier;\r\n this.data[index * 3 + 1] = g * this.multiplier;\r\n this.data[index * 3 + 2] = b * this.multiplier;\r\n this.needsUpdate = true;\r\n }\r\n\r\n set_r(index, value)\r\n {\r\n this.data[index * 3 + 0] = value * this.multiplier;\r\n this.needsUpdate = true;\r\n }\r\n\r\n set_g(index, value)\r\n {\r\n this.data[index * 3 + 1] = value * this.multiplier;\r\n this.needsUpdate = true;\r\n }\r\n\r\n set_b(index, value)\r\n {\r\n this.data[index * 3 + 2] = value * this.multiplier;\r\n this.needsUpdate = true;\r\n }\r\n\r\n set_a(index, value)\r\n {\r\n this.data[index * 3 + 2] = value * this.multiplier;\r\n this.needsUpdate = true;\r\n }\r\n}\r\n","import CustomDataTexture from './CustomDataTexture';\r\nimport { RGBFormat } from 'three';\r\n\r\nexport default class RGBDataTexture extends CustomDataTexture\r\n{\r\n constructor(width, height)\r\n {\r\n const data = new Uint8Array(width * height * 3);\r\n super(data, width, height, RGBFormat);\r\n this.multiplier = 255;\r\n }\r\n}\r\n","import CustomDataTexture from './CustomDataTexture';\r\nimport { RGBAFormat } from 'three';\r\n\r\nexport default class RGBADataTexture extends CustomDataTexture\r\n{\r\n constructor(width, height)\r\n {\r\n const data = new Uint8Array(width * height * 4);\r\n super(data, width, height, RGBAFormat);\r\n this.multiplier = 255;\r\n }\r\n}\r\n","import CustomDataTexture from './CustomDataTexture';\r\nimport { FloatType } from 'three';\r\nimport { RGBFormat } from 'three';\r\n\r\nexport default class RGBFloatDataTexture extends CustomDataTexture\r\n{\r\n constructor(width, height)\r\n {\r\n const data = new Float32Array(width * height * 3);\r\n super(data, width, height, RGBFormat, FloatType);\r\n }\r\n}\r\n","import CustomDataTexture from './CustomDataTexture';\r\nimport { FloatType } from 'three';\r\nimport { RGBAFormat } from 'three';\r\n\r\nexport default class RGBAFloatDataTexture extends CustomDataTexture\r\n{\r\n constructor(width, height)\r\n {\r\n const data = new Float32Array(width * height * 4);\r\n super(data, width, height, RGBAFormat, FloatType);\r\n }\r\n}\r\n","import { Mesh } from 'three';\r\nimport RGBDataTexture from '../data_textures/RGBDataTexture';\r\nimport RGBADataTexture from '../data_textures/RGBADataTexture';\r\nimport RGBFloatDataTexture from '../data_textures/RGBFloatDataTexture';\r\nimport RGBAFloatDataTexture from '../data_textures/RGBAFloatDataTexture';\r\n\r\nexport default class BatchedMesh extends Mesh\r\n{\r\n constructor(id_table, geometry, material, max_texture_width)\r\n {\r\n super(geometry, material);\r\n\r\n this.id_table = id_table;\r\n this.batched_count = Object.keys(id_table).length;\r\n this.max_texture_width = max_texture_width;\r\n this.batch_width = this.batched_count % max_texture_width;\r\n this.batch_height = Math.ceil(this.batched_count / max_texture_width);\r\n }\r\n\r\n attach_rgb_texture(uniform_name)\r\n {\r\n this.material.uniforms[uniform_name].value = new RGBDataTexture(this.batch_width, this.batch_height);\r\n }\r\n\r\n attach_rgba_texture(uniform_name)\r\n {\r\n this.material.uniforms[uniform_name].value = new RGBADataTexture(this.batch_width, this.batch_height);\r\n }\r\n\r\n attach_rgb_float_texture(uniform_name)\r\n {\r\n this.material.uniforms[uniform_name].value = new RGBFloatDataTexture(this.batch_width, this.batch_height);\r\n }\r\n\r\n attach_rgba_float_texture(uniform_name)\r\n {\r\n this.material.uniforms[uniform_name].value = new RGBAFloatDataTexture(this.batch_width, this.batch_height);\r\n }\r\n\r\n get_mesh_index(name)\r\n {\r\n return this.id_table[name];\r\n }\r\n\r\n set_rgb_value(uniform_name, mesh_name, r, g, b)\r\n {\r\n this.material.uniforms[uniform_name].set_rgb(this.get_mesh_index(mesh_name), r, g, b);\r\n }\r\n\r\n set_rgba_value(uniform_name, mesh_name, r, g, b, a)\r\n {\r\n this.material.uniforms[uniform_name].set_rgba(this.get_mesh_index(mesh_name), r, g, b, a);\r\n }\r\n}\r\n","import BatchedMesh from './BatchedMesh';\r\n\r\nimport * as BufferGeometryUtils from 'three/examples/jsm/utils/BufferGeometryUtils.js';\r\n\r\nimport { BufferAttribute } from 'three';\r\n\r\nexport default class MeshBatcher\r\n{\r\n batch(meshes, material)\r\n {\r\n const max_texture_width = 2048;\r\n // let texture_width = meshes.length % max_texture_width;\r\n // let texture_height = Math.ceil(meshes.length / max_texture_width);\r\n\r\n // console.log(\"Store count: \" + buffer_geometries.length + \", Texture size: \" +texture_width);\r\n\r\n const geometries = [];\r\n const id_table = {};\r\n\r\n const attr_mesh_id = [];\r\n\r\n for (let i = 0; i < meshes.length; i++)\r\n {\r\n const mesh = meshes[i];\r\n const vertex_count = mesh.geometry.getAttribute('position').count;\r\n\r\n for (let count = 0; count < vertex_count; count++)\r\n {\r\n attr_mesh_id.push(i);\r\n }\r\n\r\n geometries.push(mesh.geometry);\r\n\r\n if (id_table[mesh.name] === undefined)\r\n {\r\n id_table[mesh.name] = i;\r\n }\r\n else\r\n {\r\n console.error('Mesh name is duplicated when trying to merge meshes. Non-unique id error.', mesh.name, id_table);\r\n }\r\n }\r\n\r\n const buffer_geometry = BufferGeometryUtils.mergeBufferGeometries(geometries);\r\n\r\n const buffer_attribute = new BufferAttribute(new Float32Array(attr_mesh_id), 1);\r\n buffer_geometry.setAttribute('mesh_id', buffer_attribute);\r\n\r\n return this.create_batched_mesh(id_table, buffer_geometry, material, max_texture_width);\r\n }\r\n\r\n create_batched_mesh(id_table, buffer_geometry, material, max_texture_width)\r\n {\r\n return new BatchedMesh(id_table, buffer_geometry, material, max_texture_width);\r\n }\r\n}\r\n","import { Audio as TAudio } from 'three';\r\nimport { PositionalAudio as TPositionalAudio } from 'three';\r\n\r\nexport default class AudioClip\r\n{\r\n constructor(buffer, loop = true, volume = 1, positional = false)\r\n {\r\n this.buffer = buffer;\r\n this.loop = loop;\r\n this.volume = volume;\r\n this.positional = positional;\r\n\r\n this.audio = undefined;\r\n }\r\n\r\n init(audio_listener)\r\n {\r\n if (this.positional)\r\n {\r\n this.audio = new TPositionalAudio(audio_listener);\r\n }\r\n else\r\n {\r\n this.audio = new TAudio(audio_listener);\r\n }\r\n\r\n this.audio.setBuffer(this.buffer);\r\n this.audio.setLoop(this.loop);\r\n\r\n // This prevents undesired volume at the beginning of playing\r\n this.audio.gain.gain.value = 0;\r\n\r\n this.audio.setVolume(this.loop ? 0 : this.volume);\r\n }\r\n\r\n play()\r\n {\r\n this.audio.play();\r\n }\r\n\r\n pause()\r\n {\r\n this.audio.pause();\r\n }\r\n\r\n stop()\r\n {\r\n this.audio.stop();\r\n }\r\n\r\n get is_playing()\r\n {\r\n return this.audio.isPlaying;\r\n }\r\n}\r\n","import { AbstractLoader } from 'ohzi-core';\r\n\r\nimport { AudioContext } from 'three';\r\nimport AudioClip from '../components/AudioClip';\r\n\r\nexport default class 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","import AbstractLoader from './AbstractLoader';\r\n\r\n// import { sRGBEncoding } from 'three';\r\n\r\nexport default class BasisLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, loader, size)\r\n {\r\n super(resource_id, url, size);\r\n\r\n this.loader = 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, (basis) =>\r\n {\r\n // basis.encoding = sRGBEncoding;\r\n\r\n resource_container.set_resource(this.resource_id, this.url, basis);\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","import AbstractLoader from './AbstractLoader';\r\n\r\nimport { CubeTextureLoader as THREECubeTextureLoader } from 'three';\r\n\r\nexport default class CubemapLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n this.loader = new THREECubeTextureLoader();\r\n this.loader.setPath(url + '/');\r\n this.urls = [\r\n 'px.png',\r\n 'nx.png',\r\n 'py.png',\r\n 'ny.png',\r\n 'pz.png',\r\n 'nz.png'\r\n ];\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n 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","import AbstractLoader from './AbstractLoader';\r\n\r\nimport * as THREEColladaLoader from 'three/examples/jsm/loaders/ColladaLoader.js';\r\n\r\nexport default class DAELoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n this.loader = new THREEColladaLoader.ColladaLoader();\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n 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","import AbstractLoader from './AbstractLoader';\r\n\r\nimport { FileLoader as THREEFileLoader } from 'three';\r\n\r\nexport default class FileLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n this.loader = new THREEFileLoader();\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n 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","import AbstractLoader from './AbstractLoader';\r\n\r\nimport { FontLoader as TFontLoader } from 'three/examples/jsm/loaders/FontLoader.js';\r\n\r\nexport default class FontLoader 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 TFontLoader();\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, (font) =>\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, font);\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 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","import AbstractLoader from './AbstractLoader';\r\n\r\nimport * as THREEGLTFLoader from 'three/examples/jsm/loaders/GLTFLoader.js';\r\n\r\nexport default class GLTFLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n this.loader = new THREEGLTFLoader.GLTFLoader();\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n 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","import AbstractLoader from './AbstractLoader';\r\n\r\nimport * as THREEGLTFLoader from 'three/examples/jsm/loaders/GLTFLoader.js';\r\n\r\nexport default class 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 THREEGLTFLoader.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","import AbstractLoader from './AbstractLoader';\r\n\r\nimport * as THREEHDRCubeTextureLoader from 'three/examples/jsm/loaders/HDRCubeTextureLoader.js';\r\nimport { UnsignedByteType } from 'three';\r\n\r\nexport default class HDRCubeTextureLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n this.loader = new THREEHDRCubeTextureLoader.HDRCubeTextureLoader();\r\n this.url_suffix = ['/px.hdr', '/nx.hdr', '/py.hdr', '/ny.hdr', '/pz.hdr', '/nz.hdr'];\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n 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","import AbstractLoader from './AbstractLoader';\r\n\r\nexport default class JSONLoader 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.json().then((json) =>\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, json);\r\n\r\n this.__update_downloaded_bytes(1, 1);\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","import AbstractLoader from './AbstractLoader';\r\n\r\nimport * as THREEOBJLoader from 'three/examples/jsm/loaders/OBJLoader.js';\r\n\r\nexport default class OBJLoader 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 THREEOBJLoader.OBJLoader();\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, (obj) =>\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, obj);\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 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","import AbstractLoader from './AbstractLoader';\r\n\r\nimport { Vector3 as THREEVector3 } from 'three';\r\nimport { FileLoader as THREEFileLoader } from 'three';\r\n\r\nexport default class PointArrayLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n this.loader = new THREEFileLoader();\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n this.loader.load(this.url, (text) =>\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, this.parse_path(text));\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 parse_path(raw_data)\r\n {\r\n const string_array = raw_data.split('\\n');\r\n\r\n if (string_array[string_array.length - 1] === '')\r\n {\r\n string_array.pop();\r\n }\r\n\r\n const positions = [];\r\n\r\n for (let i = 0; i < string_array.length; i += 3)\r\n {\r\n const x = parseFloat(string_array[i + 0]);\r\n const y = parseFloat(string_array[i + 1]);\r\n const z = parseFloat(string_array[i + 2]);\r\n positions.push(new THREEVector3(x, y, z));\r\n }\r\n return positions;\r\n // let curve = new THREE.CatmullRomCurve3(positions);\r\n // return curve.getPoints(100);\r\n }\r\n}\r\n","import AbstractLoader from './AbstractLoader';\r\n\r\nimport * as THREERGBELoader from 'three/examples/jsm/loaders/RGBELoader.js';\r\n\r\nexport default class RGBETextureLoader 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 THREERGBELoader.RGBELoader();\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, (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","import AbstractLoader from './AbstractLoader';\r\n\r\nimport { FileLoader as THREEFileLoader } from 'three';\r\n\r\nexport default class TextLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n this.loader = new THREEFileLoader();\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n 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","import AbstractLoader from './AbstractLoader';\r\n\r\nimport { Texture } from 'three';\r\n\r\nexport default class AsyncTextureLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n const texture = new Texture();\r\n const image = new Image();\r\n\r\n image.src = this.url;\r\n\r\n image.onload = () =>\r\n {\r\n texture.image = image;\r\n texture.needsUpdate = true;\r\n\r\n resource_container.set_resource(this.resource_id, this.url, texture);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n };\r\n\r\n image.onerror = () =>\r\n {\r\n console.error('Error loading texture. Maybe the resource is not an image?', this.url, this.original_url);\r\n };\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n}\r\n","import AbstractLoader from './AbstractLoader';\r\n\r\nimport { Texture } from 'three';\r\n\r\nexport default class TextureLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n }\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","import AbstractLoader from './AbstractLoader';\r\n\r\nexport default class VideoLoader 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 resource_container.set_resource(this.resource_id, this.url, URL.createObjectURL(blob));\r\n\r\n this.__update_downloaded_bytes(1, 1);\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","import ResourceContainer from '../ResourceContainer';\r\n\r\nexport default class ResourceBatch\r\n{\r\n constructor(batch_name)\r\n {\r\n this.resource_loaders = [];\r\n this.batch_name = batch_name || 'unnamed batch';\r\n }\r\n\r\n add_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"],"names":["Browser$1","init","this","browser_name","agent","window","navigator","userAgent","toLowerCase","indexOf","opr","chrome","name","is_safari","is_chrome","is_edge","is_edge_chromium","has_webm","is_firefox","has_hvec","preferred_video_extension","Validation","constructor","static","n","Number","is_int","is_float","str","JSON","parse","e","AbstractLoader","resource_id","url","size","loaded_bytes","total_bytes","has_finished","has_error","error_message","__update_downloaded_bytes","loaded","total","is_number","console","warn","__loading_ended","__set_error","message","print_error","error","load","resource_container","undefined","resources_by_url","cache","Browser","fetch","method","mode","credentials","redirect","then","on_progress","bind","catch","__on_error","set_resource","async","response","response_clone","clone","reader","body","getReader","contentLength","headers","get","receivedLength","done","value","read","length","on_preloaded_finished","data","OMath","from_range_start_value","from_range_end_value","to_range_start_value","to_range_end_value","min","max","number","divisor","rgb","r","Math","round","toString","g","b","points","plane","projected_point","Vector3","points_on_plane","i","projectPoint","push","from","to","target","t","elements","lerp","x1","x2","abs","x","y","m","euclideanModulo","degrees","PI","radians","v","w","z","center","add","multiplyScalar","arr","col","floor","random","clamp","ActionSequencer","context","elapsed_time","playback_speed","playing","action_events","initial_context","stringify","tmp_t","channels","channel_names","Object","keys","duration","play","stop","reset","skip","get_duration","__play_clips","update","delta_time","set_progress","time","set_normalized_progress","get_progress","is_finished","add_action_event","trigger_time","action","add_action_interpolator","interpolator","use_dynamic_from_value","keyframes","attribute_name","keyframe","get_current_target_value","__get_current_keyframe","evaluate","get_current_starting_value","get_current_progress","__linear_map_01","easing_function","EPSILON","trigger","evaluate_keyframe","get_keyframes","channel_name","is_channel_redefined","initial","saturate","current","Infinity","distance","EasingFunctions$1","linear","triangular","ease_in_sine","cos","ease_out_sine","sin","ease_in_out_sine","ease_in_cubic","ease_out_cubic","pow","ease_in_out_cubic","ease_in_quad","ease_out_quad","ease_in_out_quad","ease_in_quart","ease_out_quart","ease_in_out_quart","ease_in_quint","ease_out_quint","ease_in_out_quint","ease_in_expo","ease_out_expo","ease_in_out_expo","ease_in_circ","sqrt","ease_out_circ","ease_in_out_circ","ease_in_back","ease_out_back","ease_in_out_back","ease_in_elastic","c4","ease_out_elastic","ease_in_out_elastic","ease_in_bounce","ease_out_bounce","n1","d1","ease_in_out_bounce","heartbeat","sign","ActionInterpolator","EasingFunctions","NumberInterpolator","super","ViewContext$1","app","set_app","ActionEvent","ViewContext","DrawIOAnimationSheet","xml_document","animation_nodes","DOMParser","parseFromString","querySelectorAll","animation_tracks","triggers","node","parent_node","parentElement","getAttribute","get_node_x_position","parseFloat","includes","split_data","split","trigger_name","trigger_method","at_time","value_data","to_value","from_time","to_time","sort","a","x_pos","ActionSequencerBuilder","initial_state_data","from_animation_sheet","animation_data","current_context","tracks","initial_tracks","state_to_tracks","find","element","sequencer","action_event","state","from_draw_io","xml","transition_data","EventManager$1","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","ResourceContainer$1","resources","EventManager","get_resource","HTMLUtilities","container","images","image","dataset","src","image_objects","image_object","videos","video","TransitionTable","transitions","from_state_name","to_state_name","add_transitions","set_transitions","set_initial_state_data","Time$1","delta_buffer","___time","Clock","__raw_delta_time","__elapsed_time","__allocated_time","Vector2","shader_time","__update","getDelta","getElapsedTime","shift","__calculate_delta_time","ViewState","start","show","hide","before_enter","on_enter","update_enter_transition","global_view_data","transition_progress","action_sequencer","update_transition","update_exit_transition","before_exit","on_exit","ViewStateTransitionHandler","transition_table","last_state","current_state","current_state_data","transitioning","go_to_state","__exit_last_state","__update_transitions","set_state","assign","Time","ViewManager$1","views","transition_handler","view_change_subscribers","browser_title_suffix","__set_views_opacities","go_to_view","view_name","change_url","__change_browser_url","__change_browser_title","notify_view_change","go_to_scene","scene_name","next_view","transition_view","set_next_view","subscribe_to_view_change","subscriber","on_view_change","register_view","view","has_view","set_view","set_browser_title_suffix","title_suffix","get_current_view","get_view_by_name","get_view_by_url","get_by_url","history","pushState","title","__capitalize","document","set_opacity","string","aux_string","toUpperCase","replace","__snake_to_whitespace","group","ApplicationView","ResourceContainer","ViewManager","classList","remove","load_html_images","load_images","load_html_videos","load_videos","style","opacity","BaseApplication","on_post_start","on_post_render","on_pre_render","on_frame_end","BaseRender","render","renderer","resize","dispose","BaseShaderMaterial","ShaderMaterial","vert","frag","uniforms","vertexShader","basic_vert","fragmentShader","basic_frag","_Color","Color","BlitMaterial","frag_shader","vert_shader","defines","_MainTex","_Resolution","_TargetResolution","depthWrite","blending","NoBlending","depthTest","depthFunc","AlwaysDepth","CameraManager$1","_current","camera","Capabilities$1","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$1","parameters","dpr","from_json","json","Idle","is_animating","Animating","easing_function_t","animator","set_property_value","set_current_state","finished_callback","CSSAnimator","css_property","value_prefix","value_suffix","animate","AxisHelper","Object3D","scale","blue_points","blue_axis_mat","LineBasicMaterial","color","blue_axis_geo","BufferGeometry","setFromPoints","blue_axis_line","Line","renderOrder","green_points","green_axis_mat","green_axis_geo","green_axis_line","red_points","red_axis_mat","red_axis_geo","red_axis_line","set","SceneManager$1","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$1","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","tex","set_screen_size","PerspectiveCamera","THREEPerspectiveCamera","fov","aspect","near","far","clear_color","clear_alpha","copy","Debug$1","Vector3_one","Vector3_zero","canvas_renderer","display_texture_meshes","draw_arrow","origin","arrow","normalize","SceneManager","draw_axis","axis","set_debug_RT","RT","rt_debug","draw_rectangle","position_2d","fillStyle","fillRect","clear","clearRect","draw_line_2D","strokeStyle","draw_line","line","frustumCulled","draw_cube","pos","cube","draw_oriented_cube","depth","distanceTo","sub","forward_dir","draw_plane","PlaneGeometry","Vector4","basic_color_vert","basic_color_frag","transparent","draw_empty_cube","box","Box3","setFromCenterAndSize","helper","Box3Helper","draw_sphere","sphere","draw_point_array","input_points","open","catmull","CatmullRomCurve3","updateArcLengths","getSpacedPoints","draw_sphere_helper","SphereGeometry","sphere_mesh","draw_math_sphere","sphere1","draw_bounding_box","bb","draw_curve","curve","options","offset","draw_texture","mesh","graphics","OScreen","ClearDepthNormalMaterial","clear_depth","clear_normal","_DepthNormal","DepthNormalMaterial","_FarPlane","far_plane","DepthAndNormalsRenderer","WebGLRenderTarget","clear_depth_normal_mat","depth_normal_material","__resize_RT_if_necessary","blit_clear_with_material","CameraManager","setSize","render_target","Blitter","_blit_scene","_blit_material","_blit_quad","_blit_camera","OrthographicCamera","blit","dst","src_texture","isWebGLRenderTarget","texture","src_width","src_height","getSize","__render","material_pass","mat","blit_with_material","dst_RT","current_rt","getRenderTarget","setRenderTarget","Graphics$1","context_attributes","_renderer","blitter","no_render","current_render_mode","generateDepthNormalTexture","depth_and_normals_renderer","is_webgl2","canvas_context","alpha","desynchronized","stencil","antialias","premultipliedAlpha","preserveDrawingBuffer","powerPreference","logarithmicDepthBuffer","force_webgl2","xr_enabled","WebGLRenderer","xr","enabled","autoClear","setPixelRatio","Configuration","extensions","domElement","Capabilities","capabilities","getMaxAnisotropy","maxVertexTextures","floatVertexTextures","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","NormalMaterial","DebugNormalsRender","Graphics","KeyboardInput","ctrlz_pressed","ctrlz_fired","keys_keys","addEventListener","on_key_down","on_key_up","keyCode","ctrlKey","key","press_key","release_key","pressed","released","key_name","fired","down","release_keys","is_key_pressed","is_key_down","is_key_released","register_key","unregister_key","removeEventListener","Input$1","InputController","clicked","captured_NDC","current_NDC_delta","keyboard","keyboard_input_container","left_mouse_button_pressed","NDC","left_mouse_button_down","NDC_delta","left_mouse_button_released","OS$1","operating_systems","ANDROID","IOS","LINUX","MAC","WINDOWS","is_mobile","match","is_ipad","maxTouchPoints","is_ios","is_android","get_os","is_linux","is_mac","is_windows","platform","os","test","ReflectionPlaneContext$1","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","RGBAFormat","Float32Array","FloatType","dst_texture","one_pixel_text","GeometryBatcher$1","batches","batch","buffer_geometries","attr_accessor_uvs","texture_width","ceilPowerOfTwo","__init_uv_array","uv_index","vertex_count","count","buffer_attribute","BufferAttribute","uvs","UI$1","ui_elements","_tmp_normalized_pos","ss_scene","matrixWorldAutoUpdate","ws_scene","ss_camera","delete_element","elem","splice","add_screen_space_element","set_screen_space_coordinate_system","add_world_space_element","set_world_space_coordinate_system","Input","update_state","current_clicked_element","CameraUtilities$1","tmp_mat","Matrix4","Plane","ray","Ray","tmp_size","tmp_unproj","get_up_dir","tmp_vec","applyQuaternion","get_forward_dir","get_right_dir","unproject_mouse_position","v_fov","h_fov","atan","tan","distV","distH","get_plane_intersection","plane_position","plane_normal","setFromNormalAndCoplanarPoint","isPerspectiveCamera","unproject","intersectPlane","fit_points_on_camera","zoom_scale","world_space_center","camera_forward","project_points_on_plane","projected_points_center","getCenter","up","right","cross","inverse_mat","getInverse","applyMatrix4","projected_center","get_zoom_to_fit_rect","get_zoom_to_fit_box","isOrthographicCamera","obj_x","obj_y","object_aspect","get_html_screen_pos","object","getWorldPosition","project","world_pos_to_screen","update_projection","left","top","bottom","Initializer$1","app_container","CameraUtilities","GeometryBatcher","OS","ReflectionPlaneContext","UI","Debug","render_loop","SSAOMaterial","_InverseProjMatrix","_ProjectionMatrix","_Bias","_Radius","_SampleKernel","__get_sample_kernel","_RandomRotation","__get_rotation_kernel","sample_kernel","rotation_kernel","rotation_texture","wrapS","RepeatWrapping","wrapT","SSAOComposeMaterial","_AO","DisplayNormalTextureMaterial","depth_normals_vert","BoxBlurMaterial","_SampleDir","Blurrer","RT1","RT2","box_blur_mat","blur","NormalAORender","ssao_mat","ssao_compose_mat","debug_normals","ssaa","use_ssaa","main_RT","SSAO_RT","blurrer","__check_RT_size","__update_uniforms","projectionMatrix","NormalRender","UnrealBloomComposeMaterial","nMips","NUM_MIPS","_BlurredTex","_BloomStrength","blurTexture1","blurTexture2","blurTexture3","blurTexture4","blurTexture5","bloomStrength","bloomFactors","bloomRadius","bloomTintColors","set_RT_0","rt","set_RT_1","set_RT_2","set_RT_3","set_RT_4","set_bloom_strength","set_bloom_radius","set_tint_color_0","col_string","set_tint_color_1","set_tint_color_2","set_tint_color_3","set_tint_color_4","AddMaterial","_SecondTex","set_add_texture","GaussianBlurMaterial","kernel_radius","KERNEL_RADIUS","SIGMA","texSize","direction","set_size","set_direction","LuminosityHighPassMaterial","luminosityThreshold","smoothWidth","defaultColor","defaultOpacity","GaussianBlurrer","current_width","current_height","separableBlurMaterials","renderTargetsHorizontal","renderTargetsVertical","kernelSizeArray","rt_pars","minFilter","LinearFilter","magFilter","format","renderTargetBright","generateMipmaps","init_materials","init_RT","luminosity_high_pass_mat","use_luminosity_high_pass","resize_RT","inputRenderTarget","get_blurred_texture","get_blurred_RT","dispose_RT","hor","ver","texture_height","dispose_materials","UnrealBloomRender","bloom_compose_mat","blur_RT","add_mat","val","THREEOrthographicCamera","ViewComponentManager$1","components","enabled_components","Set","__set_components_opacities","component","register_component","enable_component","disable_component","delete","get_component_by_name","component_name","RenderLoop","target_application","is_running","frames_passed","ViewComponentManager","setAnimationLoop","Screen$1","SimpleTextDrawer","text_margin","text_size","globalAlpha","textBaseline","textAlign","fillText","ViewComponent","hidden","toggle_hidden","HorizontalPlane","VerticalPlane","ArrayUtilities","source","apply","array","items_left_count","closest_point","closest_distance","obj","ids","FrustumPointFitter","fit_points","camera_quaternion","vertical_fov","degToRad","up_plane_normal","get_up_plane_normal","down_plane_normal","get_down_plane_normal","left_plane_normal","get_left_plane_normal","right_plane_normal","get_right_plane_normal","camera_forward_dir","sphere_center","pull_back_distance","get_distance_to_fit_rect","far_pos","up_plane","down_plane","left_plane","right_plane","apply_center_correction_to_pos","inverse_dir","Line3","up_line_intersection","down_line_intersection","left_line_intersection","right_line_intersection","intersectLine","log","new_up_distance","new_down_distance","new_left_distance","new_right_distance","vertical_min","horizontal_min","forward_correction","target_pos","vertical_offset","get_vertical_correction","horizontal_offset","get_hozirontal_correction","closest_up_point","closest_down_point","closest_distance_to_up_plane","closest_distance_to_down_plane","up_dir","down_line","up_line","down_dist","up_dist","correction","closest_right_point","closest_left_point","closest_distance_to_right_plane","closest_distance_to_left_plane","right_dir","left_line","right_line","left_dist","right_dist","Quaternion","setFromAxisAngle","GeometryUtilities","geometry_buffer","indices","positions","vertices","getX","getY","getZ","add_barycentric_attribute","non_indexed_geometry_buffer","bar_coordinates","ImageUtilities","getImageData","imagedata","MeshSampler$1","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","ModelUtilities$1","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","words","substr","join","charAt","slice","TimeUtilities","time_str_to_ms","time_str","hours","minutes","seconds","PerspectiveFrustumPointFitter","get_horizontal_correction","OrthographicFrustumPointFitter","inverse_camera_quat","inverse","inverted_points","distance_to_center","Grid","derivatives","plane_geometry","convert_to_non_indexed_geometry","rotation","_Thickness","_Length","_ElapsedTime","setup","next_position","previous_position","orientation","coverage","accumulated_length","next_point","__get_next_position","previous_point","__get_previous_position","vertexList","nextPositionList","previousPositionList","orientationList","coverageList","setIndex","_length","thickness","total_length","parent","copy_color","WorldImage","pivot","_ScreenAligned","_Scale","_Opacity","DoubleSide","current_scale","computeBoundingBox","tmp_bb_size","boundingBox","update_texture","img","screen_aligned","boolean","Text2D","is_static","simple_text_drawer","draw_settings","LinearMipMapLinearFilter","UIElementMaterial","intensity","_PixelOffset","_NDC","_PivotPoint","_DepthOffset","ScreenSpacePosition","get_pos_NDC","WorldSpacePosition","tmp_vec3","tmp_vec2","UIElementState","ui_element","normalized_mouse_position","OnIdle","is_mouse_over","_on_enter_state","OnMouseEnter","on_mouse_enter","_on_hover_state","_on_exit_state","OnMouseExit","on_mouse_exit","_on_idle_state","OnMouseHover","__trigger_on_hover","on_mouse_hover","UIElement","is_clickable","position_strategy","_position","on_hover","mouse_pos_tmp","cached_NDC_position","screen_pos_tmp","texture_size","matrixAutoUpdate","pixel_offset","set_render_order","pivot_point","set_pixel_offset","use_depth","depth_offset","clear_state","visible","get_size","normalized_mouse_pos","to_screen_position","rect","Box2","containsPoint","projected_pos","get_screen_space_position","set_screen_space_position","screen_pos","UpdatableMaterialMesh","self","onBeforeRender","TextGlyph","plane_bounds","atlas_bounds","SDFText","glyph_layout","glyphs","glyph_is_dirty","matrix_is_dirty","color_is_dirty","matrix","__opacity","__text","__generate_glyphs","update_matrix","compose","clear_glyph_dirty","clear_color_dirty","set_rotation","tilt","new_orientation","new_tilt","multiply","set_color","set_pivot","update_glyphs","op","cursor","unicode","charCodeAt","glyph","planeBounds","text_glyph","atlasBounds","advance","box2","first_glyph","union","box2_size","SDFTextMaterial","_Texture","_Boldness","_AtlasSize","set_atlas_size","set_boldness","SDFTextBatch","font_layout","atlas_texture","instanced_geometry","InstancedBufferGeometry","instanceCount","Float32BufferAttribute","transformsCol0","InstancedBufferAttribute","max_allocations","transformsCol1","transformsCol2","transformsCol3","glyph_bounds","usage","DynamicDrawUsage","text_elements","atlas","add_text","text_str","remove_text","text_elem","remove_elem","force_update","glyph_bounds_atr","plane_bounds_atr","color_atr","matrix_needs_update","glyph_needs_update","color_needs_update","glyph_count","glyph_i","buffer_i","setXYZW","VectorInterpolator","tmp","MedianFilterMaterial","kernel3x3","_SourceTex","_SourceTexSize","isVideoTexture","videoWidth","videoHeight","isTexture","MedianFilter","type","median_filter_mat","filter","tex_size","DualFilteringBlurMaterial","upsample","AlphaFilterMaterial","use_alpha_mask","_Offset","DualFilteringBlurrer","RT0","RT3","RT4","upscale_blur_mat","downscale_blur_mat","alpha_filter_mat","check_RT_resize","GPUParticleSystem","particles","set_from_geometry","init_attribute_uvs","uv_storage_attr","build_uv_storage_attribute","Points","add_texture_attribute","add_attribute","particle_count","resolution","calculate_resolution","set_attribute_update_material","update_material","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","THREECubeTextureLoader","setPath","urls","DAELoader","THREEColladaLoader","ColladaLoader","FileLoader","THREEFileLoader","file","FontLoader","TFontLoader","GLTFLoader","THREEGLTFLoader","GLTFDRACOLoader","setDRACOLoader","HDRCubeTextureLoader","THREEHDRCubeTextureLoader","url_suffix","setDataType","UnsignedByteType","hdr","JSONLoader","OBJLoader","THREEOBJLoader","PointArrayLoader","parse_path","raw_data","string_array","pop","THREEVector3","RGBETextureLoader","THREERGBELoader","RGBELoader","TextLoader","AsyncTextureLoader","Texture","Image","onload","onerror","original_url","TextureLoader","VideoLoader","ResourceBatch","batch_name","resource_loaders","add_loader","loading_finished","finished","has_errors","print_errors","get_loaded_bytes","get_total_bytes"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.module.js","sources":["../src/Browser.js","../src/utilities/Validation.js","../src/resource_loader/AbstractLoader.js","../src/utilities/OMath.js","../src/action_sequencer/ActionSequencer.js","../src/utilities/EasingFunctions.js","../src/action_sequencer/ActionInterpolator.js","../src/action_sequencer/NumberInterpolator.js","../src/view_components/ViewContext.js","../src/action_sequencer/ActionEvent.js","../src/view_components/transition/DrawIOAnimationSheet.js","../src/view_components/transition/ActionSequencerBuilder.js","../src/EventManager.js","../src/ResourceContainer.js","../src/utilities/HTMLUtilities.js","../src/view_components/transition/TransitionTable.js","../src/Time.js","../src/view_components/ViewState.js","../src/view_components/transition/ViewStateTransitionHandler.js","../src/view_components/ViewManager.js","../src/view_components/ApplicationView.js","../src/BaseApplication.js","../src/render_mode/BaseRender.js","../src/materials/BaseShaderMaterial.js","../src/materials/BlitMaterial.js","../src/CameraManager.js","../src/Capabilities.js","../src/canvas_drawer/CanvasDrawer.js","../src/Configuration.js","../src/html_utilities/css_animator_states/Idle.js","../src/html_utilities/css_animator_states/Animating.js","../src/html_utilities/CSSAnimator.js","../src/components/AxisHelper.js","../src/SceneManager.js","../src/primitives/Cube.js","../src/primitives/Sphere.js","../src/primitives/Arrow.js","../src/OScreen.js","../src/materials/ScreenSpaceTextureMaterial.js","../src/PerspectiveCamera.js","../src/Debug.js","../src/materials/ClearDepthNormalMaterial.js","../src/materials/DepthNormalMaterial.js","../src/render_utilities/DepthAndNormalsRenderer.js","../src/render_utilities/Blitter.js","../src/Graphics.js","../src/materials/NormalMaterial.js","../src/render_mode/DebugNormalsRender.js","../src/KeyboardInput.js","../src/Input.js","../src/OS.js","../src/ReflectionPlaneContext.js","../src/static_batcher/GeometryBatch.js","../src/static_batcher/GeometryBatcher.js","../src/UI.js","../src/utilities/CameraUtilities.js","../src/Initializer.js","../src/materials/SSAOMaterial.js","../src/materials/SSAOComposeMaterial.js","../src/materials/DisplayNormalTextureMaterial.js","../src/materials/BoxBlurMaterial.js","../src/render_utilities/Blurrer.js","../src/render_mode/NormalAORender.js","../src/render_mode/NormalRender.js","../src/materials/UnrealBloomComposeMaterial.js","../src/materials/AddMaterial.js","../src/materials/GaussianBlurMaterial.js","../src/materials/LuminosityHighPassMaterial.js","../src/render_utilities/GaussianBlurrer.js","../src/render_mode/UnrealBloomRender.js","../src/OrthographicCamera.js","../src/view_components/ViewComponentManager.js","../src/RenderLoop.js","../src/Screen.js","../src/canvas_drawer/SimpleTextDrawer.js","../src/view_components/ViewComponent.js","../src/primitives/HorizontalPlane.js","../src/primitives/VerticalPlane.js","../src/utilities/ArrayUtilities.js","../src/utilities/FrustumPointFitter.js","../src/utilities/GeometryUtilities.js","../src/utilities/ImageUtilities.js","../src/utilities/MeshSampler.js","../src/utilities/ModelUtilities.js","../src/utilities/ObjectUtilities.js","../src/utilities/StringUtilities.js","../src/utilities/TimeUtilities.js","../src/utilities/PerspectiveFrustumPointFitter.js","../src/utilities/OrthographicFrustumPointFitter.js","../src/components/Grid.js","../src/components/Line.js","../src/components/WorldImage.js","../src/components/Text2D.js","../src/materials/UIElementMaterial.js","../src/ui/ui_element_position/ScreenSpacePosition.js","../src/ui/ui_element_position/WorldSpacePosition.js","../src/ui/ui_element_state/UIElementState.js","../src/ui/ui_element_state/OnIdle.js","../src/ui/ui_element_state/OnMouseEnter.js","../src/ui/ui_element_state/OnMouseExit.js","../src/ui/ui_element_state/OnMouseHover.js","../src/components/UIElement.js","../src/components/UpdatableMaterialMesh.js","../src/components/sdf_text/TextGlyph.js","../src/components/sdf_text/SDFText.js","../src/materials/SDFTextMaterial.js","../src/components/sdf_text/SDFTextBatch.js","../src/action_sequencer/VectorInterpolator.js","../src/materials/MedianFilterMaterial.js","../src/render_utilities/MedianFilter.js","../src/materials/DualFilteringBlurMaterial.js","../src/materials/AlphaFilterMaterial.js","../src/render_utilities/DualFilteringBlurrer.js","../src/gpu_particles/GPUParticleSystem.js","../src/data_textures/CustomDataTexture.js","../src/data_textures/RGBDataTexture.js","../src/data_textures/RGBADataTexture.js","../src/data_textures/RGBFloatDataTexture.js","../src/data_textures/RGBAFloatDataTexture.js","../src/static_batcher/BatchedMesh.js","../src/static_batcher/MeshBatcher.js","../src/components/AudioClip.js","../src/resource_loader/AudioLoader.js","../src/resource_loader/BasisLoader.js","../src/resource_loader/CubemapLoader.js","../src/resource_loader/DAELoader.js","../src/resource_loader/FileLoader.js","../src/resource_loader/FontLoader.js","../src/resource_loader/GLTFLoader.js","../src/resource_loader/GLTFDRACOLoader.js","../src/resource_loader/HDRCubeTextureLoader.js","../src/resource_loader/JSONLoader.js","../src/resource_loader/OBJLoader.js","../src/resource_loader/PointArrayLoader.js","../src/resource_loader/RGBETextureLoader.js","../src/resource_loader/TextLoader.js","../src/resource_loader/AsyncTextureLoader.js","../src/resource_loader/TextureLoader.js","../src/resource_loader/VideoLoader.js","../src/resource_loader/ResourceBatch.js"],"sourcesContent":["\nclass Browser\n{\n init()\n {\n this.browser_name = '';\n this.agent = window.navigator.userAgent.toLowerCase();\n\n switch (true)\n {\n case this.agent.indexOf('edge') > -1:\n this.browser_name = 'edge_ie';\n break;\n case this.agent.indexOf('edg') > -1:\n this.browser_name = 'edge_chromium';\n break;\n case this.agent.indexOf('opr') > -1 && !!window.opr:\n this.browser_name = 'opera';\n break;\n case this.agent.indexOf('chrome') > -1 && !!window.chrome:\n this.browser_name = 'chrome';\n break;\n case this.agent.indexOf('trident') > -1:\n this.browser_name = 'iexplorer';\n break;\n case this.agent.indexOf('firefox') > -1:\n this.browser_name = 'firefox';\n break;\n case this.agent.indexOf('safari') > -1:\n this.browser_name = 'safari';\n break;\n default:\n this.browser_name = 'other';\n break;\n }\n }\n\n get name()\n {\n return this.browser_name;\n }\n\n get is_safari()\n {\n return this.browser_name === 'safari';\n }\n\n get is_chrome()\n {\n return this.browser_name === 'chrome';\n }\n\n get is_edge()\n {\n return this.browser_name === 'edge_ie';\n }\n\n get is_edge_chromium()\n {\n return this.browser_name === 'edge_chromium';\n }\n\n get has_webm()\n {\n return this.is_chrome || this.is_firefox || this.is_edge_chromium;\n }\n\n get has_hvec()\n {\n return this.is_safari;\n }\n\n get preferred_video_extension()\n {\n return this.has_webm ? 'webm' : this.has_hvec ? 'hvec.mp4' : 'mp4';\n }\n}\n\nexport default new Browser();\n","export default class Validation\n{\n constructor()\n {}\n\n static is_int(n)\n {\n return Number(n) === n && n % 1 === 0;\n }\n\n static is_float(n)\n {\n return Number(n) === n && n % 1 !== 0;\n }\n\n static is_number(n)\n {\n return this.is_int(n) || this.is_float(n);\n }\n\n static is_json(str)\n {\n try\n {\n JSON.parse(str);\n }\n catch (e)\n {\n return false;\n }\n\n return true;\n }\n}\n","import Browser from '../Browser';\r\nimport Validation from '../utilities/Validation';\r\n\r\nexport default class AbstractLoader\r\n{\r\n constructor(resource_id, url, size = 1)\r\n {\r\n this.resource_id = resource_id;\r\n this.url = url;\r\n this.loaded_bytes = 0;\r\n this.total_bytes = size;\r\n\r\n this.has_finished = false;\r\n this.has_error = false;\r\n this.error_message = 'none';\r\n }\r\n\r\n __update_downloaded_bytes(loaded, total)\r\n {\r\n loaded = Validation.is_number(loaded) ? loaded : 1;\r\n total = Validation.is_number(total) ? total : 1;\r\n\r\n this.loaded_bytes = loaded;\r\n\r\n if (total > 0)\r\n {\r\n this.total_bytes = total;\r\n }\r\n\r\n if (this.loaded_bytes > this.total_bytes)\r\n {\r\n console.warn('Total bytes is smaller than loaded ones. Please set total bytes by hand to:', this.url);\r\n }\r\n }\r\n\r\n __loading_ended()\r\n {\r\n this.has_finished = true;\r\n }\r\n\r\n __set_error(message)\r\n {\r\n this.has_error = true;\r\n this.error_message = message;\r\n }\r\n\r\n print_error()\r\n {\r\n console.error('Error while loading ' + this.resource_id + '\\n\\t path: ' + this.url + '\\n\\t\\t' + this.error_message);\r\n }\r\n\r\n load(resource_container)\r\n {\r\n 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","import { Vector3 } from 'three';\n\nexport default class 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","\nimport OMath from '../utilities/OMath';\n\nexport default class ActionSequencer\n{\n constructor(context)\n {\n this.elapsed_time = -0.00001;\n this.playback_speed = 1;\n this.playing = false;\n\n this.action_events = [];\n this.context = context;\n\n this.initial_context = JSON.parse(JSON.stringify(context));\n\n this.tmp_t = 0;\n\n this.channels = {};\n\n const channel_names = Object.keys(context);\n for (let i = 0; i < channel_names.length; i++)\n {\n this.channels[channel_names[i]] = [];\n }\n\n this.duration = 0;\n }\n\n play()\n {\n this.playing = true;\n }\n\n stop()\n {\n this.playing = false;\n }\n\n reset()\n {\n this.elapsed_time = -0.00001;\n }\n\n skip()\n {\n const duration = this.get_duration();\n this.__play_clips(this.elapsed_time, duration + 0.0001);\n this.elapsed_time = duration;\n }\n\n update(delta_time)\n {\n if (this.playing)\n {\n this.__play_clips(this.elapsed_time, this.elapsed_time + delta_time * this.playback_speed);\n this.elapsed_time = this.elapsed_time + delta_time * this.playback_speed;\n }\n }\n\n set_progress(time)\n {\n this.elapsed_time = OMath.clamp(time, 0, this.duration);\n this.__play_clips(this.elapsed_time, this.elapsed_time);\n }\n\n set_normalized_progress(t)\n {\n this.elapsed_time = OMath.clamp(t, 0, 1) * this.duration;\n this.__play_clips(this.elapsed_time, this.elapsed_time);\n }\n\n get_progress()\n {\n return OMath.clamp(this.elapsed_time / this.get_duration(), 0, 1);\n }\n\n is_finished()\n {\n return this.elapsed_time > this.get_duration();\n }\n\n add_action_event(trigger_time, action)\n {\n this.action_events.push({\n trigger_time: trigger_time,\n action: action\n });\n\n this.duration = Math.max(this.duration, trigger_time);\n }\n\n add_action_interpolator(from, to, interpolator, use_dynamic_from_value = false)\n {\n if (use_dynamic_from_value)\n {\n const keyframes = this.channels[interpolator.attribute_name];\n\n if (keyframes === undefined)\n {\n console.error(`${interpolator.attribute_name} missing in initial state data.`);\n }\n\n if (keyframes.length === 0)\n {\n interpolator.from = this.initial_context[interpolator.attribute_name];\n }\n else\n {\n interpolator.from = keyframes[keyframes.length - 1].interpolator.to;\n }\n }\n\n const keyframe = {\n from: from,\n to: to,\n interpolator: interpolator\n };\n\n this.duration = Math.max(this.duration, to);\n this.channels[interpolator.attribute_name].push(keyframe);\n }\n\n get_current_target_value(name)\n {\n const keyframe = this.__get_current_keyframe(name, this.elapsed_time);\n\n if (this.elapsed_time < keyframe.from)\n {\n return keyframe.interpolator.evaluate(0);\n }\n\n return keyframe.interpolator.evaluate(1);\n }\n\n get_current_starting_value(name)\n {\n const keyframe = this.__get_current_keyframe(name, this.elapsed_time);\n\n return keyframe.interpolator.evaluate(0);\n }\n\n get_current_progress(name)\n {\n const keyframe = this.__get_current_keyframe(name, this.elapsed_time);\n const t = this.__linear_map_01(this.elapsed_time, keyframe.from, keyframe.to);\n\n return keyframe.interpolator.easing_function(t);\n }\n\n get_duration()\n {\n return this.duration;\n }\n\n __play_clips(from, to)\n {\n for (let i = 0; i < this.action_events.length; i++)\n {\n if (this.action_events[i].trigger_time > from - Number.EPSILON &&\n this.action_events[i].trigger_time < to + Number.EPSILON)\n {\n // console.log(\"Play event: \" + this.action_events[i].action.constructor.name + \" at \"+ this.action_events[i].trigger_time);\n this.action_events[i].action.trigger();\n }\n }\n const channel_names = Object.keys(this.initial_context);\n\n for (let i = 0; i < channel_names.length; i++)\n {\n const name = channel_names[i];\n const keyframe = this.__get_current_keyframe(name, from);\n\n this.context[name] = this.evaluate_keyframe(keyframe, from);\n }\n }\n\n evaluate_keyframe(keyframe, time)\n {\n this.tmp_t = this.__linear_map_01(time, keyframe.from, keyframe.to);\n\n return keyframe.interpolator.evaluate(OMath.clamp(this.tmp_t, 0, 1));\n }\n\n get_keyframes(channel_name)\n {\n return this.channels[channel_name];\n }\n\n is_channel_redefined(channel_name)\n {\n for (let i = 0; i < this.channels[channel_name].length; i++)\n {\n const keyframe = this.channels[channel_name][i];\n\n if (keyframe.interpolator.initial)\n {\n return false;\n }\n }\n\n return true;\n }\n\n __linear_map_01(value,\n from_range_start_value,\n from_range_end_value)\n {\n return OMath.saturate(((value - from_range_start_value) / (from_range_end_value - from_range_start_value)) * (1 - 0) + 0);\n }\n\n __get_current_keyframe(channel_name, time)\n {\n let current = undefined;\n\n const keyframes = this.channels[channel_name];\n\n for (let i = 0; i < keyframes.length; i++)\n {\n const keyframe = keyframes[i];\n\n if (time >= keyframe.from && time <= keyframe.to)\n {\n current = keyframe;\n return current;\n }\n }\n\n let min = Infinity;\n\n for (let i = 0; i < keyframes.length; i++)\n {\n const keyframe = keyframes[i];\n const distance = Math.abs(keyframe.to - time);\n\n if (distance < min)\n {\n current = keyframe;\n min = distance;\n }\n }\n\n return current;\n }\n}\n","class EasingFunctions\n{\n constructor()\n { }\n\n linear(x)\n {\n return x;\n }\n\n triangular(x)\n {\n return 1 - Math.abs((x * 2) % (1 * 2) - 1);\n }\n\n ease_in_sine(x)\n {\n return 1 - Math.cos(x * 3.1415926 / 2);\n }\n\n ease_out_sine(x)\n {\n return Math.sin(x * 3.1415926 / 2);\n }\n\n ease_in_out_sine(x)\n {\n return -(Math.cos(3.1415926 * x) - 1) / 2;\n }\n\n ease_in_cubic(x)\n {\n return x * x * x;\n }\n\n ease_out_cubic(x)\n {\n return 1 - Math.pow(1 - x, 3);\n }\n\n ease_in_out_cubic(x)\n {\n return x < 0.5\n ? 4 * x * x * x\n : 1 - Math.pow(-2 * x + 2, 3) / 2;\n }\n\n ease_in_quad(x)\n {\n return x * x;\n }\n\n ease_out_quad(x)\n {\n return 1 - (1 - x) * (1 - x);\n }\n\n ease_in_out_quad(x)\n {\n return x < 0.5\n ? 2 * x * x\n : 1 - Math.pow(-2 * x + 2, 2) / 2;\n }\n\n ease_in_quart(x)\n {\n return x * x * x * x;\n }\n\n ease_out_quart(x)\n {\n return 1 - Math.pow(1 - x, 4);\n }\n\n ease_in_out_quart(x)\n {\n return x < 0.5\n ? 8 * x * x * x * x\n : 1 - Math.pow(-2 * x + 2, 4) / 2;\n }\n\n ease_in_quint(x)\n {\n return x * x * x * x * x;\n }\n\n ease_out_quint(x)\n {\n return 1 - Math.pow(1 - x, 5);\n }\n\n ease_in_out_quint(x)\n {\n return x < 0.5\n ? 16 * x * x * x * x * x\n : 1 - Math.pow(-2 * x + 2, 5) / 2;\n }\n\n ease_in_expo(x)\n {\n return x === 0 ? 0 : Math.pow(2, 10 * x - 10);\n }\n\n ease_out_expo(x)\n {\n return x === 1 ? 1 : 1 - Math.pow(2, -10 * x);\n }\n\n ease_in_out_expo(x)\n {\n return x === 0\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 ease_in_circ(x)\n {\n return 1 - Math.sqrt(1 - Math.pow(x, 2));\n }\n\n ease_out_circ(x)\n {\n return Math.sqrt(1 - Math.pow(x - 1, 2));\n }\n\n ease_in_out_circ(x)\n {\n return x < 0.5\n ? (1 - Math.sqrt(1 - Math.pow(2 * x, 2))) / 2\n : (Math.sqrt(1 - Math.pow(-2 * x + 2, 2)) + 1) / 2;\n }\n\n ease_in_back(x)\n {\n return 2.7015 * x * x * x - 1.7015 * x * x;\n }\n\n ease_out_back(x)\n {\n return 1 + 2.7015 * Math.pow(x - 1, 3) + 1.7015 * Math.pow(x - 1, 2);\n }\n\n ease_in_out_back(x)\n {\n return x < 0.5\n ? (Math.pow(2 * x, 2) * ((2.5949095 + 1) * 2 * x - 2.5949095)) / 2\n : (Math.pow(2 * x - 2, 2) * ((2.5949095 + 1) * (x * 2 - 2) + 2.5949095) + 2) / 2;\n }\n\n ease_in_elastic(x)\n {\n const c4 = (2 * Math.PI) / 3;\n\n return x === 0\n ? 0\n : x === 1\n ? 1\n : -Math.pow(2, 10 * x - 10) * Math.sin((x * 10 - 10.75) * c4);\n }\n\n ease_out_elastic(x)\n {\n return x === 0\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 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 ease_in_bounce(x)\n {\n return 1 - this.ease_out_bounce(1 - x);\n }\n\n ease_out_bounce(x)\n {\n const n1 = 7.5625;\n const d1 = 2.75;\n\n if (x < 1 / d1)\n {\n return n1 * x * x;\n }\n else if (x < 2 / d1)\n {\n return n1 * (x -= 1.5 / d1) * x + 0.75;\n }\n else if (x < 2.5 / d1)\n {\n return n1 * (x -= 2.25 / d1) * x + 0.9375;\n }\n else\n {\n return n1 * (x -= 2.625 / d1) * x + 0.984375;\n }\n }\n\n ease_in_out_bounce(x)\n {\n return x < 0.5\n ? (1 - this.ease_out_bounce(1 - 2 * x)) / 2\n : (1 + this.ease_out_bounce(2 * x - 1)) / 2;\n }\n\n heartbeat(t)\n {\n return 1.0 - Math.pow(Math.abs(Math.sin(t + 1.0)), 63.0) * Math.sign(Math.sin(t)) * Math.sin(t + 1.5 + 1.0) * 0.8;\n }\n}\n\nexport default new EasingFunctions();\n","import EasingFunctions from '../utilities/EasingFunctions';\n\nexport default class ActionInterpolator\n{\n constructor(easing_function = 'linear')\n {\n this.easing_function = undefined;\n\n if (typeof easing_function === 'string')\n {\n this.easing_function = EasingFunctions[easing_function];\n }\n else\n {\n this.easing_function = easing_function;\n }\n }\n\n update(context, t)\n {\n\n }\n}\n","import ActionInterpolator from './ActionInterpolator';\nimport OMath from '../utilities/OMath';\n\nexport default class 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","class ViewContext\n{\n constructor()\n {\n this.app = undefined;\n }\n\n set_app(app)\n {\n this.app = app;\n }\n}\n\nexport default new ViewContext();\n","import ViewContext from '../view_components/ViewContext';\n\nexport default class ActionEvent\n{\n constructor(name, method)\n {\n this.name = name;\n this.method = method;\n }\n\n trigger()\n {\n ViewContext.app[this.name][this.method]();\n }\n}\n","export default class DrawIOAnimationSheet\n{\n constructor()\n {\n\n }\n\n parse(xml_document)\n {\n 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","import ActionSequencer from '../../action_sequencer/ActionSequencer';\nimport NumberInterpolator from '../../action_sequencer/NumberInterpolator';\nimport ActionEvent from '../../action_sequencer/ActionEvent';\nimport DrawIOAnimationSheet from './DrawIOAnimationSheet';\n\nexport default class ActionSequencerBuilder\n{\n constructor(initial_state_data)\n {\n this.initial_state_data = initial_state_data;\n }\n\n from_animation_sheet(animation_data, current_context, initial_context)\n {\n initial_context = initial_context || this.initial_state_data;\n const tracks = animation_data.animation_tracks;\n const triggers = animation_data.triggers;\n\n const initial_tracks = this.state_to_tracks(this.initial_state_data, this.get_longest_time(animation_data.animation_tracks));\n\n for (let i = 0; i < initial_tracks.length; i++)\n {\n if (tracks.find(element => element.attribute_name === initial_tracks[i].attribute_name) === undefined)\n {\n tracks.push(initial_tracks[i]);\n }\n }\n\n const sequencer = new ActionSequencer(current_context);\n\n for (let i = 0; i < tracks.length; i++)\n {\n const t = tracks[i];\n const interpolator = new NumberInterpolator(\n t.attribute_name,\n current_context[t.attribute_name],\n t.to_value,\n t.initial,\n t.easing_function\n );\n\n sequencer.add_action_interpolator(t.from_time, t.to_time, interpolator, true);\n }\n\n for (let i = 0; i < triggers.length; i++)\n {\n const t = triggers[i];\n const action_event = new ActionEvent(t.name, t.method);\n sequencer.add_action_event(t.at_time, action_event);\n }\n\n return sequencer;\n }\n\n state_to_tracks(state, longest_time)\n {\n const tracks = [];\n\n const keys = Object.keys(state);\n\n for (let i = 0; i < keys.length; i++)\n {\n tracks.push({\n attribute_name: keys[i],\n from_time: 0,\n to_time: longest_time < 1 ? longest_time : 1,\n to_value: state[keys[i]],\n initial: true,\n easing_function: 'ease_in_out_cubic'\n });\n }\n\n return tracks;\n }\n\n from_draw_io(xml, context)\n {\n const transition_data = (new DrawIOAnimationSheet()).parse(xml);\n const tracks = transition_data.animation_tracks;\n const triggers = transition_data.triggers;\n const sequencer = new ActionSequencer(context);\n\n for (let i = 0; i < tracks.length; i++)\n {\n const t = tracks[i];\n const interpolator = new NumberInterpolator(\n t.attribute_name,\n context[t.attribute_name],\n t.to_value,\n t.initial,\n t.easing_function\n );\n\n sequencer.add_action_interpolator(t.from_time, t.to_time, interpolator, true);\n }\n\n for (let i = 0; i < triggers.length; i++)\n {\n const t = triggers[i];\n const action_event = new ActionEvent(t.name, t.method);\n sequencer.add_action_event(t.at_time, action_event);\n }\n\n return sequencer;\n }\n\n get_longest_time(tracks)\n {\n let longest_time = -1;\n\n for (let i = 0; i < tracks.length; i++)\n {\n const track = tracks[i];\n\n const track_time = track.to_time;\n\n longest_time = track_time > longest_time ? track_time : longest_time;\n }\n\n return longest_time;\n }\n}\n","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\nexport default new EventManager();\n","import EventManager from './EventManager';\n\nclass ResourceContainer\n{\n init()\n {\n this.resources = {};\n this.resources_by_url = {};\n }\n\n set_resource(name, url, resource)\n {\n const urls = Object.keys(this.resources_by_url);\n\n if (urls.includes(url))\n {\n this.resources[name] = this.resources_by_url[url];\n }\n else\n {\n this.resources[name] = resource;\n this.resources_by_url[url] = resource;\n }\n\n EventManager.fire_resource_loaded({ name: name, value: resource });\n }\n\n get_resource(name)\n {\n return this.resources[name];\n }\n\n get(name)\n {\n return this.resources[name];\n }\n}\n\nexport default new ResourceContainer();\n","export default 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","import ActionSequencerBuilder from './ActionSequencerBuilder';\n\nexport default class TransitionTable\n{\n constructor()\n {\n this.transitions = [];\n this.initial_state_data = {};\n }\n\n get(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.initial_state_data).from_animation_sheet(this.transitions[i].data, current_context);\n\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)\n {\n const action_sequencer = new ActionSequencerBuilder(this.initial_state_data).from_animation_sheet(this.transitions[i].data, current_context);\n\n return action_sequencer;\n }\n }\n\n console.error('TransitionTable.get no data found for: ', 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_initial_state_data(initial_state_data)\n {\n this.initial_state_data = initial_state_data;\n }\n}\n","import { Vector2 } from 'three';\nimport { Clock } from 'three';\n\nclass Time\n{\n constructor()\n {\n this.delta_buffer = [0.016, 0.016, 0.016, 0.016, 0.016, 0.016, 0.016, 0.016, 0.016, 0.016];\n }\n\n init()\n {\n this.___time = new Clock();\n this.__raw_delta_time = 0;\n this.__elapsed_time = 0;\n this.__allocated_time = new Vector2(0, 0);\n\n this.delta_time = 0.016;\n }\n\n get elapsed_time()\n {\n return this.__elapsed_time;\n }\n\n get shader_time()\n {\n this.__allocated_time.x = this.delta_time;\n this.__allocated_time.y = this.elapsed_time;\n return this.__allocated_time;\n }\n\n __update()\n {\n this.__raw_delta_time = this.___time.getDelta();\n this.__elapsed_time = this.___time.getElapsedTime();\n\n this.delta_buffer.shift();\n this.delta_buffer.push(this.__raw_delta_time < 0.32 ? this.__raw_delta_time : 0.032);\n\n this.__calculate_delta_time();\n }\n\n __calculate_delta_time()\n {\n this.delta_time = 0;\n\n for (let i = 0; i < this.delta_buffer.length; i++)\n {\n this.delta_time += this.delta_buffer[i];\n }\n\n this.delta_time = this.delta_time / this.delta_buffer.length;\n }\n}\n\nexport default new Time();\n","export default class ViewState\n{\n constructor(name)\n {\n this.name = name;\n }\n\n start()\n {\n }\n\n show()\n {\n }\n\n hide()\n {\n }\n\n before_enter()\n {\n }\n\n on_enter()\n {\n }\n\n update()\n {\n }\n\n update_enter_transition(global_view_data, transition_progress, action_sequencer)\n {\n // Backward compatibility. It will be removed in future releases.\n this.update_transition(global_view_data, transition_progress, action_sequencer);\n }\n\n update_exit_transition(global_view_data, transition_progress, action_sequencer)\n {\n }\n\n // Deprecated\n update_transition(global_view_data, transition_progress, action_sequencer)\n {\n }\n\n before_exit()\n {\n }\n\n on_exit()\n {\n }\n}\n","import Time from '../../Time';\nimport ViewState from '../ViewState';\n\nexport default class ViewStateTransitionHandler\n{\n constructor(transition_table)\n {\n this.last_state = new ViewState();\n this.current_state = new ViewState();\n\n this.initial_state_data = {};\n this.current_state_data = {};\n\n this.transition_table = transition_table;\n\n this.transitioning = false;\n }\n\n go_to_state(state, skip = false)\n {\n 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_initial_state_data(initial_state_data)\n {\n Object.assign(this.initial_state_data, initial_state_data);\n Object.assign(this.current_state_data, initial_state_data);\n }\n\n __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","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_initial_state_data(initial_state_data)\n {\n this.transition_table.set_initial_state_data(initial_state_data);\n this.transition_handler.set_initial_state_data(initial_state_data);\n }\n\n __change_browser_url(url)\n {\n window.history.pushState('', '', url);\n }\n\n __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\nexport default new ViewManager();\n","import ResourceContainer from '../ResourceContainer';\nimport HTMLUtilities from '../utilities/HTMLUtilities';\nimport ViewManager from './ViewManager';\nimport ViewState from './ViewState';\n\nexport default class ApplicationView extends ViewState\n{\n constructor({ name, url, container })\n {\n super(name);\n\n this.container = container;\n this.url = url;\n\n let transition_data = 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","export default class BaseApplication\n{\n on_post_start()\n {}\n\n on_enter()\n {}\n\n on_exit()\n {}\n\n update()\n {}\n\n on_post_render()\n {}\n\n on_pre_render()\n {}\n\n on_frame_end()\n {}\n}\n","export default class BaseRender\n{\n constructor()\n {\n\n }\n\n render()\n {\n\n }\n\n on_enter(context, renderer)\n {\n\n }\n\n on_exit(context, renderer)\n {\n\n }\n\n resize()\n {\n\n }\n\n dispose()\n {\n\n }\n}\n","import basic_vert from '../shaders/basic_color/basic_color.vert';\nimport basic_frag from '../shaders/basic_color/basic_color.frag';\n\nimport { ShaderMaterial } from 'three';\nimport { Color } from 'three';\n\nexport default class BaseShaderMaterial extends ShaderMaterial\n{\n constructor(vert, frag, uniforms)\n {\n super({\n vertexShader: vert || basic_vert,\n fragmentShader: frag || basic_frag,\n uniforms: uniforms || {\n _Color: { value: new Color('#FF0000') }\n }\n });\n }\n}\n","import vert from '../shaders/copy/copy.vert';\nimport frag from '../shaders/copy/copy.frag';\n\nimport { ShaderMaterial } from 'three';\nimport { Vector2 } from 'three';\nimport { NoBlending } from 'three';\nimport { AlwaysDepth } from 'three';\n\nexport default class BlitMaterial extends ShaderMaterial\n{\n constructor(frag_shader, vert_shader, defines)\n {\n super({\n uniforms: {\n _MainTex: { value: null },\n _Resolution: { value: new Vector2(0, 0) },\n _TargetResolution: { value: new Vector2(0, 0) }\n },\n defines: defines || {},\n vertexShader: vert_shader || vert,\n fragmentShader: frag_shader || frag,\n depthWrite: false,\n blending: NoBlending,\n depthTest: false,\n depthFunc: AlwaysDepth\n });\n }\n}\n","class CameraManager\n{\n init()\n {\n this._current = undefined;\n }\n\n set current(camera)\n {\n this._current = camera;\n }\n\n get current()\n {\n return this._current;\n }\n}\n\nexport default new CameraManager();\n","class Capabilities\n{\n init()\n {\n this.max_anisotropy = 0;\n this.vertex_texture_sampler_available = false;\n this.fp_textures_available = false;\n }\n}\n\nexport default new Capabilities();\n","import { CanvasTexture } from 'three';\nimport { Vector2 } from 'three';\nimport { UVMapping } from 'three';\nimport { ClampToEdgeWrapping } from 'three';\nimport { NearestFilter } from 'three';\n\nexport default class CanvasDrawer\n{\n constructor(uses_dynamic_font)\n {\n this.uses_dynamic_font = uses_dynamic_font;\n this.__textHeight = null;\n\n this.canvas = document.createElement('canvas');\n this.ctx = this.canvas.getContext('2d');\n }\n\n getFontHeight(fontStyle = 'Arial')\n {\n if (this.__textHeight == null || this.uses_dynamic_font)\n {\n 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","/*\n\n A configuration class used as a singleton\n\n*/\n\nclass Configuration\n{\n init(parameters = {})\n {\n this.dpr = 1;\n\n this.app = {}; // for arbitrary use in end application\n }\n\n from_json(json)\n {\n\n }\n}\n\nexport default new Configuration();\n","export default class Idle\n{\n constructor()\n {\n }\n\n get is_animating()\n {\n return false;\n }\n\n on_enter(view)\n {\n\n }\n\n update(view)\n {\n }\n\n on_exit(view)\n {\n\n }\n}\n","import Time from '../../Time';\nimport Idle from './Idle';\n\nimport OMath from '../../utilities/OMath';\nexport default class Animating\n{\n constructor()\n {\n this.t = 0;\n this.easing_function_t = 0;\n }\n\n get is_animating()\n {\n return true;\n }\n\n on_enter(animator)\n {\n }\n\n update(animator)\n {\n this.t += Time.delta_time / animator.duration;\n\n this.easing_function_t = animator.easing_function(this.t);\n this.easing_function_t = 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","import Animating from './css_animator_states/Animating';\nimport Idle from './css_animator_states/Idle';\nimport EasingFunctions from '../utilities/EasingFunctions';\n\nexport default class CSSAnimator\n{\n constructor({\n element,\n css_property,\n from = 0,\n to = 1,\n duration = 1,\n value_prefix = '',\n value_suffix = '',\n easing_function = EasingFunctions.ease_in_out_cubic,\n finished_callback = () =>\n {}\n })\n {\n this.element = element;\n this.css_property = css_property;\n this.from = from;\n this.to = to;\n this.value_prefix = value_prefix;\n this.value_suffix = value_suffix;\n this.duration = duration;\n this.easing_function = easing_function;\n this.finished_callback = finished_callback;\n\n this.current_state = new Idle();\n }\n\n animate()\n {\n this.set_current_state(new Animating());\n }\n\n stop()\n {\n this.set_current_state(new Idle());\n }\n\n set_property_value(value)\n {\n this.element.style[this.css_property] = `${this.value_prefix}${value}${this.value_suffix}`;\n }\n\n update()\n {\n this.current_state.update(this);\n }\n\n get is_animating()\n {\n return this.current_state.is_animating;\n }\n\n set_current_state(state)\n {\n this.current_state.on_exit(this);\n this.current_state = state;\n this.current_state.on_enter(this);\n }\n}\n","\nimport { Object3D } from 'three';\nimport { LineBasicMaterial } from 'three';\nimport { AlwaysDepth } from 'three';\nimport { BufferGeometry } from 'three';\nimport { Vector3 } from 'three';\nimport { Line } from 'three';\n\nexport default class AxisHelper extends Object3D\n{\n constructor(scale = 1.0)\n {\n super();\n\n const blue_points = [];\n blue_points.push(new Vector3(0, 0, 0));\n blue_points.push(new Vector3(0, 0, 1000));\n\n const blue_axis_mat = new LineBasicMaterial({ color: 0x4444ff, depthFunc: AlwaysDepth });\n const blue_axis_geo = new BufferGeometry().setFromPoints(blue_points);\n const blue_axis_line = new Line(blue_axis_geo, blue_axis_mat);\n blue_axis_line.renderOrder = 50000;\n\n const green_points = [];\n green_points.push(new Vector3(0, 0, 0));\n green_points.push(new Vector3(0, 1000, 0));\n\n const green_axis_mat = new LineBasicMaterial({ color: 0x44ff44, depthFunc: AlwaysDepth });\n const green_axis_geo = new BufferGeometry().setFromPoints(green_points);\n const green_axis_line = new Line(green_axis_geo, green_axis_mat);\n green_axis_line.renderOrder = 50000;\n\n const red_points = [];\n red_points.push(new Vector3(0, 0, 0));\n red_points.push(new Vector3(1000, 0, 0));\n\n const red_axis_mat = new LineBasicMaterial({ color: 0xff4444, depthFunc: AlwaysDepth });\n const red_axis_geo = new BufferGeometry().setFromPoints(red_points);\n const red_axis_line = new Line(red_axis_geo, red_axis_mat);\n red_axis_line.renderOrder = 50000;\n\n this.renderOrder = 100000;\n\n this.add(blue_axis_line);\n this.add(green_axis_line);\n this.add(red_axis_line);\n\n this.scale.set(scale, scale, scale);\n }\n\n update()\n {\n }\n\n dispose()\n {\n }\n}\n","import { Scene } from 'three';\n\nclass SceneManager\n{\n init()\n {\n this._current = new Scene();\n this._current.name = 'default_scene';\n }\n\n add_scene(name)\n {\n\n }\n\n get current()\n {\n return this._current;\n }\n\n set current(scene)\n {\n this._current = scene;\n }\n\n dispose()\n {\n this.current.traverse(child =>\n {\n if (child.geometry)\n {\n child.geometry.dispose();\n child.material.dispose();\n }\n });\n\n while (this.current.children.length > 0)\n {\n this.current.remove(this.current.children[0]);\n }\n }\n}\n\nexport default new SceneManager();\n","\nimport { Vector3, Mesh } from 'three';\nimport { BoxGeometry } from 'three';\nimport { MeshBasicMaterial } from 'three';\n\nexport default class Cube extends Mesh\n{\n constructor(size, segments, color)\n {\n size = size || new Vector3(1, 1, 1);\n segments = segments || new Vector3(1, 1, 1);\n color = color || 0xff0000;\n 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","import { Mesh } from 'three';\nimport { SphereBufferGeometry } from 'three';\nimport { MeshBasicMaterial } from 'three';\n\nexport default class Sphere extends Mesh\n{\n constructor(radius, color)\n {\n color = color || '#FF0000';\n radius = radius || 1;\n const geometry = new SphereBufferGeometry(radius, 64, 64);\n const material = new MeshBasicMaterial({ color: color });\n super(geometry, material);\n }\n}\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\nexport default class 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","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\nexport default new OScreen();\n","import BaseShaderMaterial from './BaseShaderMaterial';\nimport { Vector2 } from 'three';\nexport default class 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","import { Color } from 'three';\nimport { PerspectiveCamera as THREEPerspectiveCamera } from 'three';\n\nexport default class PerspectiveCamera extends THREEPerspectiveCamera\n{\n constructor(fov, aspect, near, far)\n {\n super(fov, aspect, near, far);\n\n this.clear_color = new Color('#000000');\n this.clear_alpha = 1;\n }\n\n 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","import AxisHelper from './components/AxisHelper';\nimport basic_color_vert from './shaders/basic_color/basic_color.vert';\nimport basic_color_frag from './shaders/basic_color/basic_color.frag';\nimport SceneManager from './SceneManager';\nimport Cube from './primitives/Cube';\nimport Sphere from './primitives/Sphere';\nimport Arrow from './primitives/Arrow';\nimport OScreen from './OScreen';\nimport ScreenSpaceTextureMaterial from './materials/ScreenSpaceTextureMaterial';\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';\nimport PerspectiveCamera from './PerspectiveCamera';\n\nclass Debug\n{\n init()\n {\n this.Vector3_one = new Vector3(1, 1, 1);\n this.Vector3_zero = new Vector3(0, 0, 0);\n this.canvas_renderer = undefined;\n\n this.display_texture_meshes = [];\n\n this.ctx = undefined;\n this.scene = new Scene();\n this.camera = new PerspectiveCamera();\n // this.camera.clear_alpha = 0;\n }\n\n draw_arrow(origin, dir, color = 0xff0000)\n {\n const arrow = new Arrow(color, dir.length(), dir.clone().normalize());\n arrow.position.copy(origin);\n SceneManager.current.add(arrow);\n return arrow;\n }\n\n draw_axis()\n {\n const axis = new AxisHelper();\n SceneManager.current.add(axis);\n return axis;\n }\n\n set_debug_RT(RT)\n {\n this.rt_debug = RT;\n }\n\n draw_rectangle(position_2d, width, height, color)\n {\n width = width || 100;\n height = height || 100;\n this.ctx.fillStyle = color || 'rgba(255, 0, 0, 1)';\n this.ctx.fillRect(position_2d.x - width / 2,\n (this.ctx.canvas.height - position_2d.y) - height / 2, width, height);\n }\n\n clear()\n {\n if (this.ctx)\n {\n this.ctx.clearRect(0, 0, this.ctx.canvas.width, this.ctx.canvas.height);\n }\n }\n\n draw_line_2D(from, to, color)\n {\n this.ctx.strokeStyle = color || 'rgba(255, 0, 0, 1)';\n this.ctx.beginPath();\n this.ctx.moveTo(from.x, from.y);\n this.ctx.lineTo(to.x, to.y);\n this.ctx.closePath();\n this.ctx.stroke();\n }\n\n draw_line(points, color = 0xff0000)\n {\n const material = new LineBasicMaterial({\n color: color\n });\n\n const geometry = new BufferGeometry().setFromPoints(points);\n\n const line = new Line(geometry, material);\n line.frustumCulled = false;\n SceneManager.current.add(line);\n return line;\n }\n\n draw_cube(pos, size, color)\n {\n size = size || 1;\n color = color || 0xff0000;\n pos = pos || new Vector3();\n\n const cube = new Cube(new Vector3(size, size, size), undefined, color);\n cube.position.copy(pos);\n SceneManager.current.add(cube);\n return cube;\n }\n\n draw_oriented_cube(from, to, height = 1, color = '#FF0000', depth = 0.1)\n {\n const size = from.distanceTo(to);\n const cube = new Cube(new Vector3(depth, height, size), undefined, color);\n\n const center = to.clone().sub(from).multiplyScalar(0.5);\n const forward_dir = center.clone().normalize();\n center.add(from);\n\n cube.position.copy(center);\n\n // let up = new Vector3(0, 1, 0);\n // let forward = forward_dir.clone();\n // let right = forward.clone().cross(up);\n\n // cube.quaternion.setFromRotationMatrix(new Matrix4().makeBasis(right,up,forward));\n cube.quaternion.setFromUnitVectors(new Vector3(0, 0, -1), forward_dir);\n\n SceneManager.current.add(cube);\n return cube;\n }\n\n draw_plane(width, height, color)\n {\n const geometry = new PlaneGeometry(width, height);\n const material = new ShaderMaterial({\n uniforms: {\n _Color: { value: new Vector4(0, 1, 0, 0.2) }\n },\n vertexShader: basic_color_vert,\n fragmentShader: basic_color_frag,\n transparent: true,\n depthWrite: false\n });\n\n const plane = new Mesh(geometry, material);\n plane.renderOrder = -10000;\n SceneManager.current.add(plane);\n return plane;\n }\n\n draw_empty_cube(pos, size, color)\n {\n size = size || 1;\n color = color || 0xff0000;\n\n const box = new Box3().setFromCenterAndSize(new Vector3(), new Vector3(size, size, size));\n const helper = new Box3Helper(box, color);\n helper.position.copy(pos || new Vector3());\n return helper;\n }\n\n draw_sphere(pos, size, color)\n {\n size = size || 1;\n color = color || 0xff0000;\n pos = pos || new Vector3();\n\n const sphere = new Sphere(size, color);\n sphere.position.copy(pos);\n SceneManager.current.add(sphere);\n return sphere;\n }\n\n draw_point_array(input_points, open = false, color = 0xff0000)\n {\n const catmull = new CatmullRomCurve3(input_points, open);\n catmull.updateArcLengths();\n const points = catmull.getSpacedPoints(200);\n const line_helper = this.draw_line(points, 0x00ff00);\n // line_helper.position.y = 1.5;\n return line_helper;\n }\n\n draw_sphere_helper(sphere, color)\n {\n color = color || 0xff0000;\n const geometry = new SphereGeometry(sphere.radius, 32, 32);\n const material = new MeshBasicMaterial({ color: color });\n const sphere_mesh = new Mesh(geometry, material);\n sphere_mesh.position.copy(sphere.center);\n SceneManager.current.add(sphere_mesh);\n return sphere_mesh;\n }\n\n draw_math_sphere(sphere)\n {\n const geometry = new SphereGeometry(sphere.radius, 32, 32);\n const material = new ShaderMaterial({\n uniforms: {\n _Color: { value: new Vector4(1, 0, 0, 0.2) }\n },\n vertexShader: basic_color_vert,\n fragmentShader: basic_color_frag,\n transparent: true\n });\n // var material = new MeshBasicMaterial( {color: 0xff0000, transparent = true} );\n const sphere1 = new Mesh(geometry, material);\n sphere1.position.copy(sphere.center);\n SceneManager.current.add(sphere1);\n }\n\n draw_bounding_box(bb)\n {\n const helper = new Box3Helper(bb, 0xffff00);\n SceneManager.current.add(helper);\n }\n\n draw_curve(curve, options)\n {\n const offset = new Vector3(0, 0, 0);\n if (options)\n {\n offset.y = options.offset || 0;\n }\n\n for (let i = 0; i < curve.length - 1; i++)\n {\n this.draw_line(curve[i].clone().add(offset), curve[i + 1].clone().add(offset));\n }\n }\n\n draw_texture(tex, w, h)\n {\n const mesh = new Mesh(new PlaneGeometry(1, 1), new ScreenSpaceTextureMaterial());\n this.display_texture_meshes.push(mesh);\n this.scene.add(mesh);\n\n mesh.material.set_texture(tex, w, h);\n return mesh;\n }\n\n render(graphics)\n {\n for (let i = 0; i < this.display_texture_meshes.length; i++)\n {\n this.display_texture_meshes[i].material.set_screen_size(OScreen.width, OScreen.height);\n }\n if (this.scene.children.length > 0)\n {\n graphics.render(this.scene, this.camera);\n }\n }\n}\n\nexport default new Debug();\n","import BlitMaterial from '../materials/BlitMaterial';\nimport frag from '../shaders/clear/clear_depth_normal.frag';\n\nimport { Vector4 } from 'three';\n\nexport default class ClearDepthNormalMaterial extends BlitMaterial\n{\n constructor(clear_depth, clear_normal)\n {\n super(frag);\n this.uniforms._DepthNormal = { value: new Vector4(clear_depth, clear_normal.x, clear_normal.y, clear_normal.z) };\n }\n}\n","import vert from '../shaders/depth_normals/depth_normals.vert';\nimport frag from '../shaders/depth_normals/depth_normals.frag';\n\nimport { ShaderMaterial } from 'three';\n\nexport default class DepthNormalMaterial extends ShaderMaterial\n{\n constructor()\n {\n super({\n uniforms: {\n _FarPlane: { value: 1 }\n },\n vertexShader: vert,\n fragmentShader: frag\n });\n }\n\n set far_plane(value)\n {\n this.uniforms._FarPlane.value = value;\n }\n\n get far_plane()\n {\n return this.uniforms._FarPlane.value;\n }\n}\n","import CameraManager from '../CameraManager';\nimport OScreen from '../OScreen';\n\nimport ClearDepthNormalMaterial from '../materials/ClearDepthNormalMaterial';\nimport DepthNormalMaterial from '../materials/DepthNormalMaterial';\n\nimport { WebGLRenderTarget } from 'three';\nimport { Vector3 } from 'three';\n\nexport default class DepthAndNormalsRenderer\n{\n constructor()\n {\n this.RT = new WebGLRenderTarget(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","import BlitMaterial from '../materials/BlitMaterial';\n\nimport { Scene } from 'three';\nimport { Mesh } from 'three';\nimport { PlaneGeometry } from 'three';\nimport { OrthographicCamera } from 'three';\n\nexport default class Blitter\n{\n constructor(renderer)\n {\n this.renderer = renderer;\n this._blit_scene = new Scene();\n this._blit_material = new BlitMaterial();\n this._blit_quad = new Mesh(\n new 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","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 { WebGLRenderer } from 'three';\n\nclass Graphics\n{\n init(canvas, context_attributes)\n {\n this._renderer = undefined;\n this.blitter = undefined;\n this.canvas = undefined;\n this.no_render = undefined;\n this.current_render_mode = undefined;\n this.generateDepthNormalTexture = false;\n this.depth_and_normals_renderer = undefined;\n\n this.is_webgl2 = false;\n this.canvas_context = undefined;\n this.context_attributes = undefined;\n\n this.context_attributes = {\n alpha: true,\n depth: true,\n desynchronized: false,\n stencil: false,\n antialias: false,\n premultipliedAlpha: true,\n preserveDrawingBuffer: true,\n powerPreference: 'high-performance',\n logarithmicDepthBuffer: false,\n force_webgl2: true,\n xr_enabled: false\n };\n\n Object.assign(this.context_attributes, context_attributes);\n\n if (this.context_attributes.force_webgl2)\n {\n this.canvas_context = canvas.getContext('webgl2', this.context_attributes) ||\n canvas.getContext('webgl', this.context_attributes) ||\n canvas.getContext('experimental-webgl', this.context_attributes);\n }\n else\n {\n this.canvas_context = canvas.getContext('webgl', this.context_attributes) ||\n canvas.getContext('experimental-webgl', this.context_attributes);\n }\n\n this.is_webgl2 = this.canvas_context.constructor.name === 'WebGL2RenderingContext';\n\n // console.log(`Using WebGL ${this.is_webgl2 ? 2 : 1}`);\n\n this._renderer = new WebGLRenderer({\n canvas: canvas,\n context: this.canvas_context\n });\n\n if (this.context_attributes.xr_enabled)\n {\n this._renderer.xr.enabled = true;\n }\n\n this._renderer.autoClear = false;\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._renderer.capabilities.floatVertexTextures;\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\nexport default new Graphics();\n","import frag from '../shaders/normal/normal.frag';\nimport vert from '../shaders/normal/normal.vert';\n\nimport { ShaderMaterial } from 'three';\n\nexport default class NormalMaterial extends ShaderMaterial\n{\n constructor()\n {\n super({\n uniforms: {\n },\n vertexShader: vert,\n fragmentShader: frag\n });\n }\n}\n","import CameraManager from '../CameraManager';\nimport SceneManager from '../SceneManager';\nimport BaseRender from '../render_mode/BaseRender';\nimport Graphics from '../Graphics';\nimport NormalMaterial from '../materials/NormalMaterial';\n\nexport default class DebugNormalsRender extends BaseRender\n{\n constructor()\n {\n super();\n }\n\n render()\n {\n Graphics.clear(undefined, CameraManager.current, true, true);\n\n Graphics.render(SceneManager.current, CameraManager.current, undefined, new NormalMaterial());\n }\n}\n","export default class KeyboardInput\n{\n init(container)\n {\n this.ctrlz_pressed = false;\n this.ctrlz_fired = false;\n\n this.keys = {};\n this.keys_keys = [];\n this.container = container;\n\n this.container.addEventListener('keydown', this.on_key_down.bind(this), false);\n this.container.addEventListener('keyup', this.on_key_up.bind(this), false);\n }\n\n on_key_down(e)\n {\n if (e.keyCode === 90 && e.ctrlKey && !this.ctrlz_fired)\n {\n this.ctrlz_pressed = true;\n this.ctrlz_fired = true;\n }\n if (e.key)\n {\n this.press_key(e.key);\n }\n }\n\n on_key_up(e)\n {\n this.release_key(e.key);\n }\n\n clear()\n {\n this.ctrlz_pressed = false;\n\n for (let i = 0; i < this.keys_keys.length; i++)\n {\n this.keys[this.keys_keys[i]].pressed = false;\n this.keys[this.keys_keys[i]].released = false;\n }\n }\n\n release_key(key_name)\n {\n const key = this.keys[key_name];\n if (key)\n {\n key.fired = false;\n key.down = false;\n key.released = true;\n }\n }\n\n release_keys()\n {\n this.ctrlz_fired = false;\n\n for (let i = 0; i < this.keys_keys.length; i++)\n {\n this.keys[this.keys_keys[i]].fired = false;\n this.keys[this.keys_keys[i]].down = false;\n }\n }\n\n press_key(key_name)\n {\n const key = this.keys[key_name];\n if (key)\n {\n if (key.down === false)\n {\n key.pressed = true;\n }\n key.down = true;\n key.fired = true;\n }\n }\n\n is_key_pressed(key_name)\n {\n const key = this.keys[key_name];\n if (key)\n {\n return key.pressed;\n }\n return false;\n }\n\n is_key_down(key_name)\n {\n const key = this.keys[key_name];\n if (key)\n {\n return key.down;\n }\n return false;\n }\n\n is_key_released(key_name)\n {\n const key = this.keys[key_name];\n if (key)\n {\n return key.released;\n }\n\n return false;\n }\n\n register_key(key)\n {\n this.keys[key] =\n {\n key_name: key,\n pressed: false,\n down: false,\n fired: false\n };\n\n this.keys_keys = Object.keys(this.keys);\n }\n\n unregister_key(key_name)\n {\n delete this.keys[key_name];\n }\n\n dispose()\n {\n this.container.removeEventListener('keydown', this.on_key_down.bind(this), false);\n this.container.removeEventListener('keyup', this.on_key_up.bind(this), false);\n }\n}\n","import { InputController } from 'pit-js';\nimport KeyboardInput from './KeyboardInput';\n\nclass Input extends InputController\n{\n constructor()\n {\n super();\n\n this.clicked = false;\n this.captured_NDC = { x: 0, y: 0 };\n this.current_NDC_delta = { x: 0, y: 0 };\n\n this.keyboard = new KeyboardInput();\n }\n\n init(container, keyboard_input_container)\n {\n super.init(container);\n\n this.keyboard.init(keyboard_input_container);\n }\n\n dispose()\n {\n super.dispose();\n\n this.keyboard.dispose();\n }\n\n update()\n {\n if (this.left_mouse_button_pressed)\n {\n this.captured_NDC.x = this.NDC.x;\n this.captured_NDC.y = this.NDC.y;\n }\n\n if (this.left_mouse_button_down)\n {\n this.current_NDC_delta.x += Math.abs(this.NDC_delta.x);\n this.current_NDC_delta.y += Math.abs(this.NDC_delta.y);\n }\n\n if (this.left_mouse_button_released)\n {\n if (this.current_NDC_delta.x < 0.001 || this.current_NDC_delta.y < 0.001)\n {\n this.clicked = true;\n }\n\n this.current_NDC_delta = { x: 0, y: 0 };\n }\n }\n\n clear()\n {\n super.clear();\n\n this.clicked = false;\n\n this.keyboard.clear();\n }\n}\n\nexport default new Input();\n","\nclass OS\n{\n init()\n {\n this.operating_systems = {\n ANDROID: 'android',\n IOS: 'ios',\n LINUX: 'linux',\n MAC: 'mac',\n WINDOWS: 'windows'\n };\n\n this.is_mobile = !!(navigator.userAgent.match(/(iPhone|iPod|iPad|Android|playbook|silk|BlackBerry|BB10|Windows Phone|Tizen|Bada|webOS|IEMobile|Opera Mini)/));\n this.is_ipad = !!(navigator.userAgent.match(/Mac/) && navigator.maxTouchPoints && navigator.maxTouchPoints > 2);\n this.is_ios = !!navigator.userAgent.match(/(iPhone|iPod|iPad)/) || this.is_ipad;\n\n this.is_android = this.get_os() === this.operating_systems.ANDROID;\n this.is_linux = this.get_os() === this.operating_systems.LINUX;\n this.is_mac = this.get_os() === this.operating_systems.MAC;\n this.is_windows = this.get_os() === this.operating_systems.WINDOWS;\n }\n\n get_os()\n {\n const userAgent = window.navigator.userAgent;\n const platform = window.navigator.platform;\n const macosPlatforms = ['Macintosh', 'MacIntel', 'MacPPC', 'Mac68K'];\n const windowsPlatforms = ['Win32', 'Win64', 'Windows', 'WinCE'];\n const iosPlatforms = ['iPhone', 'iPad', 'iPod'];\n let os = null;\n\n if (macosPlatforms.indexOf(platform) !== -1)\n {\n os = this.operating_systems.MAC;\n }\n else if (iosPlatforms.indexOf(platform) !== -1)\n {\n os = this.operating_systems.IOS;\n }\n else if (windowsPlatforms.indexOf(platform) !== -1)\n {\n os = this.operating_systems.WINDOWS;\n }\n else if (/Android/.test(userAgent))\n {\n os = this.operating_systems.ANDROID;\n }\n else if (!os && /Linux/.test(platform))\n {\n os = this.operating_systems.LINUX;\n }\n\n return os;\n }\n}\n\nexport default new 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\nexport default new ReflectionPlaneContext();\n","import { Vector2 } from 'three';\nimport { ShaderMaterial } from 'three';\nimport { Mesh } from 'three';\nimport { DataTexture } from 'three';\nimport { RGBAFormat } from 'three';\nimport { RGBFormat } from 'three';\nimport { FloatType } from 'three';\n\nexport default class GeometryBatch\n{\n constructor(geometry, batch_width)\n {\n this.geometry = geometry;\n\n this.material = undefined;\n this.uniforms = {};\n this.batch_width = batch_width;\n\n this.data_textures = [];\n\n this.object_names = undefined;\n\n this.zero_offset = new Vector2();\n this.write_offset = new Vector2();\n\n this.uniform_dirty_count = 0;\n\n this.tmp_uploaded_data_count = 0;\n }\n\n init(object_names, vert_shader, frag_shader)\n {\n this.material = new ShaderMaterial({\n uniforms: this.uniforms,\n vertexShader: vert_shader,\n fragmentShader: frag_shader\n });\n this.object_names = object_names;\n }\n\n add_global_uniform(name, data)\n {\n this.uniforms[name] = { value: data };\n this.material.needsUpdate = true;\n }\n\n set_global_uniform(name, data)\n {\n this.uniforms[name].value = data;\n }\n\n add_object_uniform_v3(uniform_name, default_value_v3)\n {\n 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","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\nexport default new GeometryBatcher();\n","import Input from './Input';\nimport CameraManager from './CameraManager';\nimport Graphics from './Graphics';\n\nimport { Vector2 } from 'three';\nimport { Scene } from 'three';\nimport { OrthographicCamera } from 'three';\n\nclass UI\n{\n init()\n {\n this.ui_elements = [];\n this._tmp_normalized_pos = new Vector2();\n this.ss_scene = new Scene();\n this.ss_scene.matrixWorldAutoUpdate = false;\n this.ss_scene.frustumCulled = false;\n\n this.ws_scene = new Scene();\n this.ws_scene.matrixWorldAutoUpdate = false;\n this.ws_scene.frustumCulled = false;\n\n this.ss_camera = new OrthographicCamera(-1, 1, 1, -1, -100, 100);\n }\n\n delete_element(elem)\n {\n const index = this.ui_elements.indexOf(elem);\n if (index > -1)\n {\n this.ui_elements.splice(index, 1);\n }\n\n this.ss_scene.remove(elem);\n this.ws_scene.remove(elem);\n\n elem.dispose();\n }\n\n add_screen_space_element(elem)\n {\n this.ui_elements.push(elem);\n this.ss_scene.add(elem);\n\n elem.set_screen_space_coordinate_system();\n }\n\n add_world_space_element(elem)\n {\n this.ui_elements.push(elem);\n this.ws_scene.add(elem);\n\n elem.set_world_space_coordinate_system();\n }\n\n update()\n {\n // this.ss_camera.left = -OScreen.width / 2;\n // this.ss_camera.right = OScreen.width / 2;\n // this.ss_camera.top = OScreen.top / 2;\n // this.ss_camera.right = -OScreen.bottom / 2;\n this.ss_camera.updateProjectionMatrix();\n\n this._tmp_normalized_pos.copy(Input.NDC);\n for (let i = 0; i < this.ui_elements.length; i++)\n {\n this.ui_elements[i].update_state(this._tmp_normalized_pos);\n }\n }\n\n render(renderer)\n {\n // renderer.render_ui(this.scene);\n if (this.ss_scene.children.length > 0)\n {\n Graphics.render(this.ss_scene, this.ss_camera);\n }\n if (this.ws_scene.children.length > 0)\n {\n Graphics.render(this.ws_scene, CameraManager.current);\n }\n }\n\n clear()\n {\n this.current_clicked_element = undefined;\n }\n}\n\nexport default new UI();\n","import CameraManager from '../CameraManager';\nimport Input from '../Input';\nimport OMath from '../utilities/OMath';\nimport OScreen from '../OScreen';\n\nimport { Vector3 } from 'three';\nimport { Matrix4 } from 'three';\nimport { Plane } from 'three';\nimport { Ray } from 'three';\nimport { Sphere } from 'three';\nimport { Box3 } from 'three';\n\nclass CameraUtilities\n{\n init()\n {\n this.tmp_mat = new Matrix4();\n this.plane = new Plane();\n this.ray = new Ray();\n\n this.tmp_size = new Vector3();\n this.tmp_unproj = new Vector3();\n }\n\n get_up_dir(camera)\n {\n camera = camera || CameraManager.current;\n const tmp_vec = new Vector3();\n\n tmp_vec.set(0, 1, 0);\n tmp_vec.applyQuaternion(camera.quaternion);\n\n return tmp_vec;\n }\n\n get_forward_dir(camera)\n {\n camera = camera || CameraManager.current;\n const tmp_vec = new Vector3();\n\n tmp_vec.set(0, 0, -1);\n tmp_vec.applyQuaternion(camera.quaternion);\n\n return tmp_vec;\n }\n\n get_right_dir(camera)\n {\n camera = camera || CameraManager.current;\n const tmp_vec = new Vector3();\n\n tmp_vec.set(1, 0, 0);\n tmp_vec.applyQuaternion(camera.quaternion);\n return tmp_vec;\n }\n\n unproject_mouse_position(NDC, camera)\n {\n camera = camera || CameraManager.current;\n const tmp_vec = new Vector3();\n\n const v_fov = (camera.fov / 2) * Math.PI / 180;\n const h_fov = (2 * Math.atan(Math.tan(v_fov) * camera.aspect)) / 2;\n\n const distV = Math.tan(v_fov) * camera.far;\n const distH = Math.tan(h_fov) * camera.far;\n\n tmp_vec.set(distH * NDC.x, distV * NDC.y, -camera.far).normalize();\n\n return tmp_vec.applyQuaternion(camera.quaternion);\n }\n\n get_plane_intersection(plane_position, plane_normal, NDC, camera)\n {\n camera = camera || CameraManager.current;\n NDC = NDC || Input.NDC;\n\n const tmp_vec = new Vector3();\n\n this.plane.setFromNormalAndCoplanarPoint(plane_normal || this.get_forward_dir(camera), plane_position);\n if (camera.isPerspectiveCamera)\n {\n this.ray.set(camera.position, this.unproject_mouse_position(NDC, camera));\n }\n else\n {\n this.tmp_unproj.set(NDC.x, NDC.y, 1).unproject(camera);\n this.ray.set(camera.position, this.tmp_unproj);\n }\n\n this.ray.intersectPlane(this.plane, tmp_vec);\n return tmp_vec;\n }\n\n fit_points_on_camera(points, zoom_scale = 1)\n {\n const points_sphere = new Sphere().setFromPoints(points);\n const world_space_center = points_sphere.center;\n const camera_forward = this.get_forward_dir(CameraManager.current).clone();\n\n const plane = new Plane().setFromNormalAndCoplanarPoint(camera_forward, world_space_center);\n\n const points_on_plane = OMath.project_points_on_plane(points, plane);\n\n const projected_points_center = new Vector3();\n let box = new Box3().setFromPoints(points_on_plane);\n box.getCenter(projected_points_center);\n\n const up = new Vector3(0, 1, 0).applyQuaternion(CameraManager.current.quaternion);\n const right = up.clone().cross(camera_forward).normalize();\n const mat = new Matrix4().set(right.x, up.x, camera_forward.x, world_space_center.x,\n right.y, up.y, camera_forward.y, world_space_center.y,\n right.z, up.z, camera_forward.z, world_space_center.z,\n 0, 0, 0, 1);\n\n const inverse_mat = new Matrix4().getInverse(mat);\n for (let i = 0; i < points_on_plane.length; i++)\n {\n points_on_plane[i].applyMatrix4(inverse_mat);\n }\n\n const size = new Vector3();\n box = new Box3().setFromPoints(points_on_plane);\n box.getSize(size);\n size.multiplyScalar(zoom_scale);\n const projected_center = new Vector3();\n box.getCenter(projected_center);\n\n return {\n position: projected_points_center,\n zoom: this.get_zoom_to_fit_rect(size.x / 2, size.y / 2)\n };\n }\n\n get_zoom_to_fit_rect(width, height)\n {\n const v_fov = (CameraManager.current.fov / 2) * Math.PI / 180;\n const h_fov = (2 * Math.atan(Math.tan(v_fov) * CameraManager.current.aspect)) / 2;\n\n const distV = height / Math.tan(v_fov);\n const distH = width / Math.tan(h_fov);\n\n return Math.max(Math.abs(distH), Math.abs(distV));\n }\n\n get_zoom_to_fit_box(bb, camera)\n {\n if (camera.isOrthographicCamera)\n {\n bb.getSize(this.tmp_size);\n\n const obj_x = this.tmp_size.x;\n const obj_y = this.tmp_size.y;\n const object_aspect = obj_x / obj_y;\n if (OScreen.aspect_ratio / object_aspect > 1)\n {\n return OScreen.height / obj_y;\n }\n else\n {\n return OScreen.width / obj_x;\n }\n }\n else\n {\n // return this.fit_points_on_camera([bb.min, bb.max], 1).zoom;\n const size = new Vector3();\n bb.getSize(size);\n return this.get_zoom_to_fit_rect(size.x, size.y);\n }\n }\n\n get_html_screen_pos(object, camera)\n {\n camera = camera || CameraManager.current;\n const tmp_vec = new Vector3();\n\n object.getWorldPosition(tmp_vec);\n tmp_vec.project(camera);\n\n tmp_vec.x = (tmp_vec.x * 0.5 + 0.5) * (OScreen.width);\n tmp_vec.y = (1 - (tmp_vec.y * 0.5 + 0.5)) * OScreen.height;\n return tmp_vec;\n }\n\n world_pos_to_screen(pos, camera)\n {\n camera = camera || CameraManager.current;\n const tmp_vec = new Vector3();\n\n tmp_vec.copy(pos);\n tmp_vec.project(camera);\n\n tmp_vec.x = (tmp_vec.x * 0.5 + 0.5) * (OScreen.width);\n tmp_vec.y = (1 - (tmp_vec.y * 0.5 + 0.5)) * OScreen.height;\n return tmp_vec;\n }\n\n update_projection(camera)\n {\n camera.left = -OScreen.width / 2;\n camera.right = OScreen.width / 2;\n camera.top = OScreen.height / 2;\n camera.bottom = -OScreen.height / 2;\n camera.aspect = OScreen.aspect_ratio;\n camera.updateProjectionMatrix(true);\n }\n}\n\nexport default new CameraUtilities();\n","import Browser from './Browser';\nimport CameraManager from './CameraManager';\nimport Capabilities from './Capabilities';\nimport Configuration from './Configuration';\nimport Debug from './Debug';\nimport EventManager from './EventManager';\nimport Graphics from './Graphics';\nimport Input from './Input';\nimport OS from './OS';\nimport OScreen from './OScreen';\nimport ReflectionPlaneContext from './ReflectionPlaneContext';\nimport ResourceContainer from './ResourceContainer';\nimport SceneManager from './SceneManager';\nimport GeometryBatcher from './static_batcher/GeometryBatcher';\nimport Time from './Time';\nimport UI from './UI';\nimport CameraUtilities from './utilities/CameraUtilities';\n\nclass Initializer\n{\n constructor()\n {\n }\n\n init(canvas, app_container, context_attributes, keyboard_input_container = document)\n {\n CameraManager.init();\n CameraUtilities.init();\n Capabilities.init();\n Configuration.init();\n EventManager.init();\n GeometryBatcher.init();\n Input.init(app_container, keyboard_input_container);\n OS.init();\n Browser.init();\n ReflectionPlaneContext.init();\n ResourceContainer.init();\n SceneManager.init();\n OScreen.init();\n Time.init();\n UI.init();\n\n Graphics.init(canvas, context_attributes);\n Debug.init();\n }\n\n dispose(render_loop)\n {\n Graphics.dispose();\n Input.dispose();\n SceneManager.dispose();\n\n render_loop.dispose();\n }\n}\n\nexport default new Initializer();\n","import BlitMaterial from '../materials/BlitMaterial';\nimport frag from '../shaders/ssao/ssao.frag';\nimport vert from '../shaders/ssao/ssao.vert';\n\nimport { Matrix4 } from 'three';\nimport { Vector3 } from 'three';\nimport { DataTexture } from 'three';\nimport { RGBFormat } from 'three';\nimport { RepeatWrapping } from 'three';\nimport OMath from '../utilities/OMath';\nexport default class SSAOMaterial extends BlitMaterial\n{\n constructor()\n {\n super(frag, vert);\n\n this.uniforms._InverseProjMatrix = { value: new Matrix4() };\n this.uniforms._ProjectionMatrix = { value: new Matrix4() };\n\n this.uniforms._Bias = { value: 0.0125 };\n this.uniforms._Radius = { value: 0.3 };\n this.uniforms._FarPlane = { value: 100 };\n\n this.uniforms._SampleKernel = { value: this.__get_sample_kernel() };\n this.uniforms._RandomRotation = { value: this.__get_rotation_kernel() };\n }\n\n __get_sample_kernel()\n {\n 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","import BlitMaterial from '../materials/BlitMaterial';\nimport frag from '../shaders/ssao/ssao_compose.frag';\n\nexport default class SSAOComposeMaterial extends BlitMaterial\n{\n constructor()\n {\n super(frag);\n this.uniforms._AO = { value: undefined };\n }\n}\n","import BlitMaterial from '../materials/BlitMaterial';\nimport frag from '../shaders/depth_normals/debug_normals.frag';\nimport depth_normals_vert from '../shaders/ssao/ssao.vert';\n\nimport { Matrix4 } from 'three';\n\nexport default class DisplayNormalTextureMaterial extends BlitMaterial\n{\n constructor()\n {\n super(frag, depth_normals_vert);\n this.uniforms._FarPlane = { value: 1 };\n this.uniforms._InverseProjMatrix = { value: new Matrix4() };\n }\n}\n","import BlitMaterial from '../materials/BlitMaterial';\nimport frag from '../shaders/box_blur/box_blur.frag';\n\nimport { Vector2 } from 'three';\n\nexport default class BoxBlurMaterial extends BlitMaterial\n{\n constructor()\n {\n super(frag);\n this.uniforms._SampleDir = { value: new Vector2() };\n }\n}\n","import BoxBlurMaterial from '../materials/BoxBlurMaterial';\nimport Graphics from '../Graphics';\n\nimport { WebGLRenderTarget } from 'three';\n\nexport default class Blurrer\n{\n constructor(renderer)\n {\n this.RT1 = new WebGLRenderTarget(1, 1);\n this.RT2 = new WebGLRenderTarget(1, 1);\n this.box_blur_mat = new BoxBlurMaterial();\n }\n\n blur(RT)\n {\n if (RT.width !== this.RT1.width || RT.height !== this.RT1.height)\n {\n this.RT1.setSize(RT.width, RT.height);\n this.RT2.setSize(RT.width, RT.height);\n }\n\n this.box_blur_mat.uniforms._SampleDir.value.set(1, 0);\n Graphics.blit(RT, this.RT1, this.box_blur_mat);\n this.box_blur_mat.uniforms._SampleDir.value.set(0, 1);\n Graphics.blit(this.RT1, RT, this.box_blur_mat);\n // return this.RT2;\n }\n}\n","import CameraManager from '../CameraManager';\nimport SceneManager from '../SceneManager';\nimport 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\nexport default class NormalAORender extends BaseRender\n{\n constructor()\n {\n super();\n\n this.ssao_mat = new SSAOMaterial();\n this.ssao_compose_mat = new SSAOComposeMaterial();\n this.debug_normals = new DisplayNormalTextureMaterial();\n\n this.ssaa = Configuration.use_ssaa ? 2 : 1;\n\n this.main_RT = new WebGLRenderTarget(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","import CameraManager from '../CameraManager';\nimport SceneManager from '../SceneManager';\nimport BaseRender from '../render_mode/BaseRender';\nimport Graphics from '../Graphics';\n\nexport default class NormalRender extends BaseRender\n{\n constructor()\n {\n super();\n }\n\n render()\n {\n Graphics.clear(undefined, CameraManager.current, true, true);\n\n if (SceneManager.current.on_pre_render)\n {\n SceneManager.current.on_pre_render();\n }\n\n if (SceneManager.current.render)\n {\n SceneManager.current.render();\n }\n else\n {\n Graphics.render(SceneManager.current, CameraManager.current);\n }\n\n if (SceneManager.current.on_post_render)\n {\n SceneManager.current.on_post_render();\n }\n }\n}\n","import BlitMaterial from './BlitMaterial';\nimport frag from '../shaders/gaussian_blur/unreal_bloom_compose.frag';\nimport { Color } from 'three';\nexport default class UnrealBloomComposeMaterial extends BlitMaterial\n{\n constructor(nMips)\n {\n super(frag, undefined, {\n NUM_MIPS: nMips\n });\n this.uniforms._MainTex = { value: undefined };\n this.uniforms._BlurredTex = { value: undefined };\n this.uniforms._BloomStrength = { value: 1 };\n\n this.uniforms.blurTexture1 = { value: null };\n this.uniforms.blurTexture2 = { value: null };\n this.uniforms.blurTexture3 = { value: null };\n this.uniforms.blurTexture4 = { value: null };\n this.uniforms.blurTexture5 = { value: null };\n\n this.uniforms.bloomStrength = { value: 1.0 };\n this.uniforms.bloomFactors = { value: [1.0, 0.8, 0.6, 0.4, 0.2] };\n this.uniforms.bloomRadius = { value: 0.0 };\n\n 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","import BlitMaterial from './BlitMaterial';\nimport frag from '../shaders/add/add.frag';\n\nexport default class AddMaterial extends BlitMaterial\n{\n constructor(nMips)\n {\n super(frag);\n\n this.uniforms._SecondTex = { value: undefined };\n }\n\n set_add_texture(tex)\n {\n this.uniforms._SecondTex.value = tex;\n }\n}\n","import BlitMaterial from './BlitMaterial';\nimport frag from '../shaders/gaussian_blur/gaussian_blur.frag';\nimport { Vector2 } from 'three';\n\nexport default class GaussianBlurMaterial extends BlitMaterial\n{\n constructor(kernel_radius)\n {\n super(frag, undefined, {\n KERNEL_RADIUS: kernel_radius,\n SIGMA: kernel_radius\n });\n\n this.uniforms.texSize = { value: new Vector2(0.5, 0.5) };\n this.uniforms.direction = { value: new Vector2(0.5, 0.5) };\n }\n\n set_size(w, h)\n {\n this.uniforms.texSize.value.x = w;\n this.uniforms.texSize.value.y = h;\n }\n\n set_direction(x, y)\n {\n this.uniforms.direction.value.set(x, y);\n }\n}\n","import BlitMaterial from './BlitMaterial';\nimport frag from '../shaders/luminosity_high_pass/luminosity_high_pass.frag';\nimport { Color } from 'three';\nexport default class LuminosityHighPassMaterial extends BlitMaterial\n{\n constructor(kernel_radius)\n {\n super(frag);\n\n this.uniforms.luminosityThreshold = { value: 0.23 };\n this.uniforms.smoothWidth = { value: 0.01 };\n this.uniforms.defaultColor = { value: new Color('#000000') };\n this.uniforms.defaultOpacity = { value: 0.0 };\n }\n}\n","import GaussianBlurMaterial from '../materials/GaussianBlurMaterial';\nimport LuminosityHighPassMaterial from '../materials/LuminosityHighPassMaterial';\nimport Graphics from '../Graphics';\n\nimport { WebGLRenderTarget, LinearFilter, RGBAFormat } from 'three';\n\nexport default class GaussianBlurrer\n{\n constructor(nMips = 5)\n {\n this.current_width = 1;\n this.current_height = 1;\n\n this.separableBlurMaterials = [];\n this.renderTargetsHorizontal = [];\n this.renderTargetsVertical = [];\n\n this.nMips = nMips;\n this.kernelSizeArray = [3, 5, 7, 9, 11];\n this.rt_pars = { minFilter: LinearFilter, magFilter: LinearFilter, format: RGBAFormat };\n\n this.renderTargetBright = new WebGLRenderTarget(1, 1, this.rt_pars);\n this.renderTargetBright.texture.generateMipmaps = false;\n\n this.init_materials();\n this.init_RT();\n\n this.luminosity_high_pass_mat = new LuminosityHighPassMaterial();\n }\n\n blur(RT, use_luminosity_high_pass)\n {\n this.resize_RT(RT.width, RT.height);\n\n if (use_luminosity_high_pass)\n {\n Graphics.blit(RT, this.renderTargetBright, this.luminosity_high_pass_mat);\n }\n else\n {\n Graphics.blit(RT, this.renderTargetBright);\n }\n\n let inputRenderTarget = this.renderTargetBright;\n\n for (let i = 0; i < this.nMips; i++)\n {\n 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","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\nexport default class UnrealBloomRender extends BaseRender\n{\n constructor()\n {\n super();\n\n this.bloom_compose_mat = undefined;\n\n this.main_RT = undefined;\n this.blur_RT = undefined;\n this.blurrer = undefined;\n\n this.add_mat = new AddMaterial();\n }\n\n on_enter()\n {\n this.blurrer = new GaussianBlurrer();\n this.main_RT = new WebGLRenderTarget(OScreen.render_width, OScreen.render_height);\n this.blur_RT = new WebGLRenderTarget(OScreen.render_width, OScreen.render_height);\n\n this.bloom_compose_mat = new UnrealBloomComposeMaterial(5);\n this.blurrer = new GaussianBlurrer(5);\n\n this.bloom_compose_mat.set_RT_0(this.blurrer.renderTargetsVertical[0].texture);\n this.bloom_compose_mat.set_RT_1(this.blurrer.renderTargetsVertical[1].texture);\n this.bloom_compose_mat.set_RT_2(this.blurrer.renderTargetsVertical[2].texture);\n this.bloom_compose_mat.set_RT_3(this.blurrer.renderTargetsVertical[3].texture);\n this.bloom_compose_mat.set_RT_4(this.blurrer.renderTargetsVertical[4].texture);\n\n this.bloom_compose_mat.set_bloom_strength(1);\n this.bloom_compose_mat.set_bloom_radius(1);\n\n this.add_mat.set_add_texture(this.blurrer.renderTargetsHorizontal[0].texture);\n }\n\n set_bloom_strength(val)\n {\n this.bloom_compose_mat.set_bloom_strength(val);\n }\n\n set_bloom_radius(val)\n {\n this.bloom_compose_mat.set_bloom_radius(val);\n }\n\n set_tint_color_0(col_string)\n {\n this.bloom_compose_mat.set_tint_color_0(col_string);\n }\n\n set_tint_color_1(col_string)\n {\n this.bloom_compose_mat.set_tint_color_1(col_string);\n }\n\n set_tint_color_2(col_string)\n {\n this.bloom_compose_mat.set_tint_color_2(col_string);\n }\n\n set_tint_color_3(col_string)\n {\n this.bloom_compose_mat.set_tint_color_3(col_string);\n }\n\n set_tint_color_4(col_string)\n {\n this.bloom_compose_mat.set_tint_color_4(col_string);\n }\n\n render()\n {\n this.__check_RT_size();\n\n Graphics.clear(this.main_RT, CameraManager.current, true, false);\n Graphics.render(SceneManager.current, CameraManager.current, this.main_RT);\n\n // // BLUR\n this.blurrer.blur(this.main_RT, true);\n\n // Blur compose\n Graphics.material_pass(this.bloom_compose_mat, this.blurrer.renderTargetsHorizontal[0]);\n\n // Additive blend\n Graphics.blit(this.main_RT, undefined, this.add_mat);\n }\n\n __check_RT_size()\n {\n if (this.main_RT.width !== OScreen.render_width || this.main_RT.height !== OScreen.render_height)\n {\n this.main_RT.setSize(OScreen.render_width, OScreen.render_height);\n this.blur_RT.setSize(OScreen.render_width, OScreen.render_height);\n }\n }\n}\n","import { Color } from 'three';\nimport { OrthographicCamera as THREEOrthographicCamera } from 'three';\n\nexport default class OrthographicCamera extends THREEOrthographicCamera\n{\n constructor(left, right, top, bottom, near, far)\n {\n super(left, right, top, bottom, near, far);\n\n this.clear_color = new Color('#000000');\n this.clear_alpha = 1;\n }\n\n 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","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\nexport default new ViewComponentManager();\n","import Time from './Time';\nimport Input from './Input';\nimport UI from './UI';\nimport Debug from './Debug';\nimport BaseApplication from './BaseApplication';\nimport ViewManager from './view_components/ViewManager';\nimport ViewComponentManager from './view_components/ViewComponentManager';\n\nexport default class RenderLoop\n{\n constructor(target_application, graphics)\n {\n target_application = target_application || new BaseApplication();\n\n this.target_application = target_application;\n this.graphics = graphics;\n\n this.is_running = false;\n this.frames_passed = 0;\n }\n\n update()\n {\n if (!this.is_running)\n {\n return;\n }\n Time.__update();\n\n // ###### START CYCLE ######\n if (this.frames_passed === 1)\n {\n this.target_application.on_post_start();\n }\n\n Input.update();\n\n this.target_application.update();\n ViewManager.update();\n ViewComponentManager.update();\n\n this.target_application.on_pre_render();\n\n this.graphics.update(); // render scene\n UI.update(); // update after new camera matrix has been calculated\n UI.render(this.graphics); // render ui layer on top\n this.target_application.on_post_render();\n\n Debug.render(this.graphics); // render debug layer\n\n // ###### END CYCLE #######\n\n this.target_application.on_frame_end();\n this.frames_passed++;\n\n Input.clear();\n UI.clear();\n Debug.clear();\n }\n\n start()\n {\n if (this.is_running) return; // sanity check\n\n if (this.frames_passed === 0)\n {\n this.target_application.on_enter();\n }\n\n this.is_running = true;\n\n this.graphics._renderer.setAnimationLoop(this.update.bind(this));\n }\n\n stop()\n {\n if (this.is_running === false) return; // sanity check\n\n this.is_running = false;\n this.target_application.on_exit();\n\n this.graphics._renderer.setAnimationLoop(null);\n }\n\n set_state(new_state)\n {\n this.target_application.on_exit(this);\n this.target_application = new_state;\n this.target_application.on_enter(this);\n }\n\n dispose()\n {\n this.stop();\n this.frames_passed = 0;\n }\n}\n","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\nexport default new Screen();\n","\nimport CanvasDrawer from './CanvasDrawer';\n\nimport { Vector2 } from 'three';\n\nexport default class SimpleTextDrawer extends CanvasDrawer\n{\n constructor()\n {\n super();\n this.text_margin = new Vector2(2, 0);\n }\n\n __draw(text, ctxOptions, canvas, ctx)\n {\n ctx.font = ctxOptions.font;\n\n 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","import HTMLUtilities from '../utilities/HTMLUtilities';\nimport ViewComponentManager from './ViewComponentManager';\n\nexport default class 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","import { Mesh } from 'three';\nimport { MeshBasicMaterial } from 'three';\nimport { PlaneGeometry } from 'three';\n\nexport default class HorizontalPlane extends Mesh\n{\n constructor(width, height, color, material)\n {\n width = width || 1;\n height = height || 1;\n color = color || '#FF0000';\n material = material || new MeshBasicMaterial({ color: color });\n\n const geometry = new PlaneGeometry(width, height);\n geometry.rotateX(-3.14 / 2);\n super(geometry, material);\n }\n}\n","import { Mesh } from 'three';\nimport { PlaneGeometry } from 'three';\nimport { MeshBasicMaterial } from 'three';\n\nexport default class VerticalPlane extends Mesh\n{\n constructor(width, height, color, material)\n {\n width = width || 1;\n height = height || 1;\n color = color || '#FF0000';\n material = material || new MeshBasicMaterial({ color: color });\n\n const geometry = new PlaneGeometry(width, height);\n super(geometry, material);\n }\n}\n","export default class ArrayUtilities\n{\n constructor()\n {}\n\n static merge_from_to(source, target)\n {\n target.push.apply(target, source);\n }\n\n static expand_vec3_array(array, size)\n {\n 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","import { Line3, Plane, Quaternion, Sphere, Vector3 } from 'three';\n\nexport default class FrustumPointFitter\n{\n constructor()\n {\n this.sphere = new Sphere();\n }\n\n fit_points(points, camera_quaternion, vertical_fov, aspect)\n {\n this.sphere.setFromPoints(points);\n\n 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","import { BufferAttribute } from 'three';\nimport { BufferGeometry } from 'three';\n\nexport default class GeometryUtilities\n{\n static convert_to_non_indexed_geometry(geometry_buffer)\n {\n 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","import { Vector4 } from 'three';\n\nexport default class 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","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\nexport default new MeshSampler();\n","import { Mesh } from 'three';\nimport { BufferGeometry } from 'three';\nimport { Skeleton } from 'three';\n\nclass ModelUtilities\n{\n get_mesh(scene, result_callback)\n {\n scene.traverse((child) =>\n {\n if (child instanceof Mesh)\n {\n if (child.geometry)\n {\n child.geometry = new BufferGeometry().fromGeometry(child.geometry);\n }\n result_callback(child);\n }\n });\n }\n\n get_geometries(scene)\n {\n 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\nexport default new ModelUtilities();\n","export default 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","export default class StringUtilities\n{\n constructor()\n {}\n\n static capitalize(string)\n {\n const words = string.split(' ');\n\n for (let i = 0; i < words.length; i++)\n {\n words[i] = words[i][0].toUpperCase() + words[i].substr(1);\n }\n\n return words.join(' ');\n }\n\n static capitalize_first_letter(string)\n {\n return string.charAt(0).toUpperCase() + string.slice(1);\n }\n\n static snake_to_camelcase(string)\n {\n return string.replace(\n /([-_][a-z])/g,\n (group) => group.toUpperCase()\n .replace('-', '')\n .replace('_', '')\n );\n }\n}\n","export default class TimeUtilities\n{\n constructor()\n {}\n\n // Converts a time string (00:00:00.45) into miliseconds\n time_str_to_ms(time_str)\n {\n time_str = time_str.split(':');\n\n let hours = Number(time_str[0]);\n hours = hours * 60 * 60 * 1000;\n\n let minutes = Number(time_str[1]);\n minutes = minutes * 60 * 1000;\n\n let seconds = Number(time_str[2]);\n seconds = seconds * 1000;\n\n return hours + minutes + seconds;\n }\n}\n","import { Vector3, Plane, Quaternion, Sphere, Line3 } from 'three';\nimport OMath from './OMath';\nexport default class PerspectiveFrustumPointFitter\n{\n constructor()\n {\n this.sphere = new Sphere();\n }\n\n fit_points(points, camera_quaternion, vertical_fov, aspect)\n {\n this.sphere.setFromPoints(points);\n\n 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","import { Vector3, Box3 } from 'three';\n\nexport default class OrthographicFrustumPointFitter\n{\n constructor()\n {\n\n }\n\n fit_points(points, camera_quaternion, vertical_fov, aspect)\n {\n 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","import grid_frag from '../shaders/grid/grid.frag';\nimport grid_vert from '../shaders/grid/grid.vert';\nimport GeometryUtilities from '../utilities/GeometryUtilities';\n\nimport { Mesh } from 'three';\nimport { ShaderMaterial } from 'three';\nimport { Color } from 'three';\nimport { PlaneGeometry } from 'three';\n\nexport default class 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","import line_vs from '../shaders/basic_line/basic_line.vert';\nimport line_fs from '../shaders/basic_line/basic_line.frag';\n\nimport { Mesh } from 'three';\nimport { BufferAttribute } from 'three';\nimport { BufferGeometry } from 'three';\nimport { ShaderMaterial } from 'three';\nimport { Color } from 'three';\n\nexport default class Line extends Mesh\n{\n constructor(points)\n {\n 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","import basic_texture_vert from '../shaders/basic_texture/basic_texture.vert';\nimport basic_texture_frag from '../shaders/basic_texture/basic_texture.frag';\n\nimport { Mesh } from 'three';\nimport { Vector2 } from 'three';\nimport { ShaderMaterial } from 'three';\nimport { DoubleSide } from 'three';\nimport { PlaneGeometry } from 'three';\nimport { Vector3 } from 'three';\n\nexport default class WorldImage extends Mesh\n{\n constructor(texture, pivot)\n {\n pivot = pivot || new Vector2(0, 0);\n 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","import WorldImage from './WorldImage';\nimport SimpleTextDrawer from '../canvas_drawer/SimpleTextDrawer';\n\nimport { LinearMipMapLinearFilter } from 'three';\nimport { LinearFilter } from 'three';\n\nexport default class Text2D extends WorldImage\n{\n constructor(text, font, color, pivot, is_static)\n {\n 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","import vert from '../shaders/ui_element/ui_element.vert';\nimport frag from '../shaders/ui_element/ui_element.frag';\nimport BaseShaderMaterial from '../materials/BaseShaderMaterial';\n\nimport { Vector2 } from 'three';\nimport { Vector3 } from 'three';\n\nimport OScreen from '../OScreen';\n\nexport default class UIElementMaterial extends BaseShaderMaterial\n{\n constructor(intensity = 1)\n {\n super(vert, frag, {\n _MainTex: { value: undefined },\n _ScreenSize: { value: new Vector2(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","import { Vector2 } from 'three';\n\nexport default class ScreenSpacePosition\n{\n constructor()\n {\n this.tmp_vec = new Vector2();\n }\n\n get_pos_NDC(position)\n {\n return this.tmp_vec.set(position.x, position.y);\n }\n}\n","import CameraManager from '../../CameraManager';\n\nimport { Vector2 } from 'three';\nimport { Vector3 } from 'three';\n\nexport default class WorldSpacePosition\n{\n constructor()\n {\n this.tmp_vec3 = new Vector3();\n this.tmp_vec2 = new Vector2();\n }\n\n get_pos_NDC(position)\n {\n this.tmp_vec3.copy(position);\n this.tmp_vec3.project(CameraManager.current);\n\n return this.tmp_vec2.set(this.tmp_vec3.x, this.tmp_vec3.y);\n }\n}\n","export default class UIElementState\n{\n constructor()\n {\n\n }\n\n update(ui_element, normalized_mouse_position)\n {\n\n }\n\n on_enter(ui_element)\n {}\n\n on_exit(ui_element)\n {}\n}\n","import UIElementState from './UIElementState';\n\nexport default class OnIdle extends UIElementState\n{\n constructor()\n {\n super();\n }\n\n update(ui_element, normalized_mouse_position)\n {\n if (ui_element.is_mouse_over(normalized_mouse_position))\n {\n ui_element.set_state(ui_element._on_enter_state);\n }\n }\n}\n","import UIElementState from './UIElementState';\n\nexport default class OnMouseEnter extends UIElementState\n{\n constructor()\n {\n super();\n }\n\n on_enter(ui_element)\n {\n ui_element.on_mouse_enter();\n }\n\n update(ui_element, normalized_mouse_position)\n {\n if (ui_element.is_mouse_over(normalized_mouse_position))\n {\n ui_element.set_state(ui_element._on_hover_state);\n }\n else\n {\n ui_element.set_state(ui_element._on_exit_state);\n }\n }\n}\n","import UIElementState from './UIElementState';\n\nexport default class OnMouseExit extends UIElementState\n{\n constructor()\n {\n super();\n }\n\n on_enter(ui_element)\n {\n ui_element.on_mouse_exit();\n ui_element.set_state(ui_element._on_idle_state);\n }\n}\n","import UIElementState from './UIElementState';\n\nexport default class OnMouseHover extends UIElementState\n{\n constructor()\n {\n super();\n }\n\n on_enter(ui_element)\n {\n this.__trigger_on_hover(ui_element);\n }\n\n update(ui_element, normalized_mouse_position)\n {\n if (ui_element.is_mouse_over(normalized_mouse_position))\n {\n this.__trigger_on_hover(ui_element);\n }\n else\n {\n ui_element.set_state(ui_element._on_exit_state);\n }\n }\n\n __trigger_on_hover(ui_element)\n {\n ui_element.on_mouse_hover();\n }\n}\n","\nimport 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\nexport default class UIElement extends Mesh\n{\n constructor(vert, frag)\n {\n super(new PlaneGeometry(1, 1), new UIElementMaterial());\n\n this.is_clickable = false;\n\n this.position_strategy = new WorldSpacePosition();\n this.current_state = new OnIdle();\n\n this._position = new Vector3();\n\n this._on_idle_state = new OnIdle();\n this._on_enter_state = new OnMouseEnter();\n this._on_exit_state = new OnMouseExit();\n this._on_hover_state = new OnMouseHover();\n\n this.on_enter = undefined;\n this.on_exit = undefined;\n this.on_hover = undefined;\n\n this.mouse_pos_tmp = new Vector2();\n this.cached_NDC_position = new Vector2();\n this.screen_pos_tmp = new Vector2();\n\n this.texture_size = new Vector2(1, 1);\n\n this.frustumCulled = false;\n this.matrixAutoUpdate = false;\n this.renderOrder = 0;\n\n this.size = 1;\n this.pixel_offset = new Vector2();\n }\n\n set_render_order(value)\n {\n this.renderOrder = value;\n }\n\n get pivot_point()\n {\n return this.material.uniforms._PivotPoint.value;\n }\n\n set_pixel_offset(offset)\n {\n this.pixel_offset.copy(offset);\n this.material.uniforms._PixelOffset.value.copy(offset);\n }\n\n set_state(new_state)\n {\n this.current_state.on_exit(this);\n this.current_state = new_state;\n this.current_state.on_enter(this);\n }\n\n get position()\n {\n return this._position;\n }\n\n set use_depth(boolean)\n {\n this.material.depthTest = boolean;\n }\n\n get use_depth()\n {\n return this.material.depthTest;\n }\n\n set depth_offset(value)\n {\n this.material.uniforms._DepthOffset.value = value;\n }\n\n get depth_offset()\n {\n return this.material.uniforms._DepthOffset.value;\n }\n\n clear_state()\n {\n this.visible = false;\n }\n\n set_world_space_coordinate_system()\n {\n this.position_strategy = new WorldSpacePosition();\n }\n\n set_screen_space_coordinate_system()\n {\n this.position_strategy = new ScreenSpacePosition();\n }\n\n set_texture(texture)\n {\n texture.minFilter = NearestFilter;\n texture.magFilter = NearestFilter;\n texture.needsUpdate = true;\n\n this.texture_size.set(texture.image.width, texture.image.height);\n\n this.material.uniforms._MainTex.value = texture;\n this.get_size(this.material.uniforms._TextureSize.value);\n this.visible = true;\n }\n\n update_state(normalized_mouse_pos)\n {\n this.material.uniforms._ScreenSize.value.set(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","import { Mesh } from 'three';\n\nexport default class 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","import { Vector2, Vector4 } from 'three';\n\nexport default class 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","import { Vector3, Quaternion, Matrix4, Color, Box2, Vector2 } from 'three';\nimport TextGlyph from './TextGlyph';\n\nexport default class SDFText\n{\n constructor(glyph_layout, text = '')\n {\n this.glyph_layout = glyph_layout;\n\n this.glyphs = [];\n\n this.glyph_is_dirty = true;\n this.matrix_is_dirty = true;\n this.color_is_dirty = true;\n\n this.position = new Vector3();\n this.quaternion = new Quaternion();\n this.scale = new Vector3(1, 1, 1);\n this.matrix = new Matrix4();\n\n this.color = new Color('#FFFFFF');\n\n this.pivot_point = new Vector2();\n this.__opacity = 1;\n\n this.__text = text;\n\n this.__generate_glyphs(text);\n }\n\n set text(value)\n {\n this.__text = value;\n this.__generate_glyphs(value);\n this.matrix_is_dirty = true;\n }\n\n get text()\n {\n return this.__text;\n }\n\n update_matrix()\n {\n this.matrix.compose(this.position, this.quaternion, this.scale);\n this.matrix_is_dirty = false;\n this.glyph_is_dirty = true;\n }\n\n clear_glyph_dirty()\n {\n this.glyph_is_dirty = false;\n }\n\n clear_color_dirty()\n {\n this.color_is_dirty = false;\n }\n\n set_rotation(orientation = 0, tilt = 0) // 0..360, -90..0..90\n {\n 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","import BaseShaderMaterial from './BaseShaderMaterial';\nimport frag from '../shaders/sdf_text/sdf_text.frag';\nimport vert from '../shaders/sdf_text/sdf_text.vert';\n\nimport { Vector2, DoubleSide, LinearFilter } from 'three';\nimport OMath from '../utilities/OMath';\n\nexport default class SDFTextMaterial extends BaseShaderMaterial\n{\n constructor(texture)\n {\n super(vert, frag, {\n _Texture: { value: texture },\n _Boldness: { value: 0.5 },\n _AtlasSize: { value: new Vector2(1, 1) }\n });\n\n this.transparent = true;\n this.extensions = {\n derivatives: true\n };\n this.depthWrite = false;\n this.side = DoubleSide;\n texture.minFilter = LinearFilter;\n texture.magFilter = LinearFilter;\n texture.generateMipMaps = false;\n }\n\n set_atlas_size(size)\n {\n this.uniforms._AtlasSize.value.copy(size);\n }\n\n set_boldness(value)\n {\n this.uniforms._Boldness.value = OMath.lerp(0.5, 0.2, value);\n }\n}\n","import SDFText from './SDFText';\nimport SDFTextMaterial from '../../materials/SDFTextMaterial';\nimport ArrayUtilities from '../../utilities/ArrayUtilities';\n\nimport {\n PlaneGeometry,\n Mesh,\n Vector2,\n InstancedBufferGeometry,\n InstancedBufferAttribute,\n Float32BufferAttribute,\n DynamicDrawUsage\n} from 'three';\n\nexport default class SDFTextBatch extends Mesh\n{\n constructor(font_layout, atlas_texture)\n {\n 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","import ActionInterpolator from './ActionInterpolator';\n\nexport default class VectorInterpolator extends ActionInterpolator\n{\n constructor(attribute_name, from = 0, to = 1, easing_function = 'linear')\n {\n super(easing_function);\n\n this.attribute_name = attribute_name;\n this.from = from;\n this.to = to;\n }\n\n update(context, t)\n {\n const tmp = this.from.clone();\n tmp.lerp(this.to, this.easing_function(t));\n context[this.attribute_name].copy(tmp);\n }\n}\n","import BlitMaterial from '../materials/BlitMaterial';\nimport frag from '../shaders/median_filter/median_filter.frag';\n\nimport { Vector2 } from 'three';\n\nexport default class MedianFilterMaterial extends BlitMaterial\n{\n constructor()\n {\n super(frag, undefined, {\n kernel3x3: true\n });\n\n this.uniforms._SourceTex = { value: undefined };\n this.uniforms._SourceTexSize = { value: new Vector2(1, 1) };\n }\n\n set_texture(tex)\n {\n this.uniforms._SourceTex.value = tex;\n\n 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","import MedianFilterMaterial from '../materials/MedianFilterMaterial';\nimport Graphics from '../Graphics';\n\nimport { WebGLRenderTarget, Vector2, RGBAFormat, FloatType, NearestFilter } from 'three';\n\nexport default class MedianFilter\n{\n constructor(renderer)\n {\n this.RT = new WebGLRenderTarget(1, 1, {\n type: FloatType,\n format: RGBAFormat,\n minFilter: NearestFilter,\n magFilter: NearestFilter\n });\n this.RT1 = new WebGLRenderTarget(1, 1, {\n type: FloatType,\n format: RGBAFormat,\n minFilter: NearestFilter,\n magFilter: NearestFilter\n });\n\n this.median_filter_mat = new MedianFilterMaterial();\n }\n\n filter(texture)\n {\n 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","import BlitMaterial from './BlitMaterial';\nimport downsample_frag from '../shaders/dual_filter_blur/downsample.frag';\nimport upsample_frag from '../shaders/dual_filter_blur/upsample.frag';\n\nexport default class DualFilteringBlurMaterial extends BlitMaterial\n{\n constructor(upsample)\n {\n super(upsample ? upsample_frag : downsample_frag);\n }\n}\n","import BlitMaterial from './BlitMaterial';\nimport frag from '../shaders/dual_filter_blur/alpha_filter.frag';\n\nexport default class AlphaFilterMaterial extends BlitMaterial\n{\n constructor(use_alpha_mask, upsample)\n {\n super(frag);\n }\n\n set offset(value)\n {\n this.uniforms._Offset.value = value;\n }\n\n get offset()\n {\n return this.uniforms._Offset.value;\n }\n}\n","import DualFilteringBlurMaterial from '../materials/DualFilteringBlurMaterial';\nimport AlphaFilterMaterial from '../materials/AlphaFilterMaterial';\nimport Graphics from '../Graphics';\nimport { WebGLRenderTarget } from 'three';\nexport default class DualFilteringBlurrer\n{\n constructor(use_alpha_mask)\n {\n this.current_width = 1;\n this.current_height = 1;\n this.RT0 = new WebGLRenderTarget(1, 1);\n this.RT1 = new WebGLRenderTarget(1, 1);\n this.RT2 = new WebGLRenderTarget(1, 1);\n this.RT3 = new WebGLRenderTarget(1, 1);\n this.RT4 = new WebGLRenderTarget(1, 1);\n\n this.upscale_blur_mat = new DualFilteringBlurMaterial(true);\n this.downscale_blur_mat = new DualFilteringBlurMaterial(false);\n\n this.alpha_filter_mat = new AlphaFilterMaterial();\n }\n\n blur(RT)\n {\n this.check_RT_resize(RT.width, RT.height);\n Graphics.blit(RT, this.RT1, this.alpha_filter_mat);\n\n // Graphics.blit(this.RT0, this.RT1, this.downscale_blur_mat);\n Graphics.blit(this.RT1, this.RT2, this.downscale_blur_mat);\n Graphics.blit(this.RT2, this.RT3, this.downscale_blur_mat);\n Graphics.blit(this.RT3, this.RT4, this.downscale_blur_mat);\n\n // Graphics.blit(this.RT4, this.RT3, this.upscale_blur_mat);\n // Graphics.blit(this.RT3, this.RT4, this.upscale_blur_mat);\n Graphics.blit(this.RT4, this.RT3, this.upscale_blur_mat);\n Graphics.blit(this.RT3, this.RT2, this.upscale_blur_mat);\n Graphics.blit(this.RT2, RT, this.upscale_blur_mat);\n // Graphics.blit(this.RT1, RT, this.upscale_blur_mat);\n\n // return this.RT2;\n }\n\n check_RT_resize(width, height)\n {\n if (this.current_width !== width || this.current_height !== height)\n {\n this.current_width = width;\n this.current_height = height;\n this.RT0.setSize(this.current_width / 2, this.current_height / 2);\n this.RT1.setSize(this.current_width / 2, this.current_height / 2);\n this.RT2.setSize(this.current_width / 4, this.current_height / 4);\n this.RT3.setSize(this.current_width / 8, this.current_height / 8);\n this.RT4.setSize(this.current_width / 16, this.current_height / 16);\n }\n }\n}\n","import { Object3D } from 'three';\nimport { BufferAttribute } from 'three';\nimport { Points } from 'three';\n\nexport default class GPUParticleSystem extends Object3D\n{\n constructor()\n {\n super();\n this.attributes = [];\n\n this.particles = undefined;\n }\n\n set_from_geometry(geometry, material, init_attribute_uvs)\n {\n // let position = new ParticlePositionAttribute(\"_Position\");\n if (init_attribute_uvs && geometry.getAttribute('storage_uv') === undefined)\n {\n const uv_storage_attr = this.build_uv_storage_attribute(geometry.getAttribute('position').count);\n geometry.setAttribute('storage_uv', uv_storage_attr);\n }\n // position.init_from_geometry(geometry);\n // this.attributes.push(position);\n\n // material.uniforms._Position.value = position.read.texture;\n\n const points = new Points(geometry, material);\n points.frustumCulled = false;\n this.particles = points;\n\n this.add(points);\n }\n\n add_texture_attribute(buffer_attribute)\n {\n\n }\n\n add_attribute(name, buffer_attribute)\n {\n\n }\n\n build_uv_storage_attribute(particle_count)\n {\n const resolution = this.calculate_resolution(particle_count);\n const uvs = new Float32Array(particle_count * 2);\n for (let i = 0, j = 0; i < particle_count * 2; i += 2, j++)\n {\n uvs[i] = ((j % resolution) / resolution) + (0.5 / resolution);\n uvs[i + 1] = (Math.floor(j / resolution) / resolution) + (0.5 / resolution);\n }\n\n return new BufferAttribute(uvs, 2);\n }\n\n calculate_resolution(particle_count)\n {\n return Math.ceil(Math.sqrt(particle_count));\n }\n\n update()\n {\n for (let i = 0; i < this.attributes.length; i++)\n {\n this.attributes[i].update();\n }\n }\n\n set_attribute_update_material(attribute_name, mat)\n {\n for (let i = 0; i < this.attributes.length; i++)\n {\n if (this.attributes[i].name === attribute_name)\n {\n this.attributes[i].update_material = mat;\n }\n }\n }\n\n dispose()\n {\n this.particles.geometry.dispose();\n this.particles.material.dispose();\n }\n}\n","import { DataTexture } from 'three';\n\nexport default class 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","import CustomDataTexture from './CustomDataTexture';\nimport { RGBFormat } from 'three';\n\nexport default class 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","import CustomDataTexture from './CustomDataTexture';\nimport { RGBAFormat } from 'three';\n\nexport default class 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","import CustomDataTexture from './CustomDataTexture';\nimport { FloatType } from 'three';\nimport { RGBFormat } from 'three';\n\nexport default class 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","import CustomDataTexture from './CustomDataTexture';\nimport { FloatType } from 'three';\nimport { RGBAFormat } from 'three';\n\nexport default class 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","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\nexport default class 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","import BatchedMesh from './BatchedMesh';\n\nimport * as BufferGeometryUtils from 'three/examples/jsm/utils/BufferGeometryUtils.js';\n\nimport { BufferAttribute } from 'three';\n\nexport default class 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","import { Audio as TAudio } from 'three';\nimport { PositionalAudio as TPositionalAudio } from 'three';\n\nexport default class 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","import { AbstractLoader } from 'ohzi-core';\r\n\r\nimport { AudioContext } from 'three';\r\nimport AudioClip from '../components/AudioClip';\r\n\r\nexport default class 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","import AbstractLoader from './AbstractLoader';\n\n// import { sRGBEncoding } from 'three';\n\nexport default class 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","import AbstractLoader from './AbstractLoader';\r\n\r\nimport { CubeTextureLoader as THREECubeTextureLoader } from 'three';\r\n\r\nexport default class CubemapLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n this.loader = new THREECubeTextureLoader();\r\n this.loader.setPath(url + '/');\r\n this.urls = [\r\n 'px.png',\r\n 'nx.png',\r\n 'py.png',\r\n 'ny.png',\r\n 'pz.png',\r\n 'nz.png'\r\n ];\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n 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","import AbstractLoader from './AbstractLoader';\r\n\r\nimport * as THREEColladaLoader from 'three/examples/jsm/loaders/ColladaLoader.js';\r\n\r\nexport default class DAELoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n this.loader = new THREEColladaLoader.ColladaLoader();\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n 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","import AbstractLoader from './AbstractLoader';\r\n\r\nimport { FileLoader as THREEFileLoader } from 'three';\r\n\r\nexport default class FileLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n this.loader = new THREEFileLoader();\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n 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","import AbstractLoader from './AbstractLoader';\n\nimport { FontLoader as TFontLoader } from 'three/examples/jsm/loaders/FontLoader.js';\n\nexport default class FontLoader extends AbstractLoader\n{\n constructor(resource_id, url, size)\n {\n super(resource_id, url, size);\n this.loader = new TFontLoader();\n }\n\n on_preloaded_finished(resource_container)\n {\n 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","import AbstractLoader from './AbstractLoader';\r\n\r\nimport * as THREEGLTFLoader from 'three/examples/jsm/loaders/GLTFLoader.js';\r\n\r\nexport default class GLTFLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n this.loader = new THREEGLTFLoader.GLTFLoader();\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n 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","import AbstractLoader from './AbstractLoader';\r\n\r\nimport * as THREEGLTFLoader from 'three/examples/jsm/loaders/GLTFLoader.js';\r\n\r\nexport default class 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 THREEGLTFLoader.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","import AbstractLoader from './AbstractLoader';\r\n\r\nimport * as THREEHDRCubeTextureLoader from 'three/examples/jsm/loaders/HDRCubeTextureLoader.js';\r\nimport { UnsignedByteType } from 'three';\r\n\r\nexport default class HDRCubeTextureLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n this.loader = new THREEHDRCubeTextureLoader.HDRCubeTextureLoader();\r\n this.url_suffix = ['/px.hdr', '/nx.hdr', '/py.hdr', '/ny.hdr', '/pz.hdr', '/nz.hdr'];\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n 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","import AbstractLoader from './AbstractLoader';\n\nexport default class 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","import AbstractLoader from './AbstractLoader';\n\nimport * as THREEOBJLoader from 'three/examples/jsm/loaders/OBJLoader.js';\n\nexport default class OBJLoader extends AbstractLoader\n{\n constructor(resource_id, url, size)\n {\n super(resource_id, url, size);\n this.loader = new THREEOBJLoader.OBJLoader();\n }\n\n on_preloaded_finished(resource_container)\n {\n 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","import AbstractLoader from './AbstractLoader';\n\nimport { Vector3 as THREEVector3 } from 'three';\nimport { FileLoader as THREEFileLoader } from 'three';\n\nexport default class PointArrayLoader extends AbstractLoader\n{\n constructor(resource_id, url, size)\n {\n super(resource_id, url, size);\n this.loader = new THREEFileLoader();\n }\n\n on_preloaded_finished(resource_container)\n {\n 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 THREEVector3(x, y, z));\n }\n return positions;\n // let curve = new THREE.CatmullRomCurve3(positions);\n // return curve.getPoints(100);\n }\n}\n","import AbstractLoader from './AbstractLoader';\n\nimport * as THREERGBELoader from 'three/examples/jsm/loaders/RGBELoader.js';\n\nexport default class RGBETextureLoader extends AbstractLoader\n{\n constructor(resource_id, url, size)\n {\n super(resource_id, url, size);\n this.loader = new THREERGBELoader.RGBELoader();\n }\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","import AbstractLoader from './AbstractLoader';\r\n\r\nimport { FileLoader as THREEFileLoader } from 'three';\r\n\r\nexport default class TextLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n this.loader = new THREEFileLoader();\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n 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","import AbstractLoader from './AbstractLoader';\r\n\r\nimport { Texture } from 'three';\r\n\r\nexport default class AsyncTextureLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n const texture = new Texture();\r\n const image = new Image();\r\n\r\n image.src = this.url;\r\n\r\n image.onload = () =>\r\n {\r\n texture.image = image;\r\n texture.needsUpdate = true;\r\n\r\n resource_container.set_resource(this.resource_id, this.url, texture);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n };\r\n\r\n image.onerror = () =>\r\n {\r\n console.error('Error loading texture. Maybe the resource is not an image?', this.url, this.original_url);\r\n };\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n}\r\n","import AbstractLoader from './AbstractLoader';\r\n\r\nimport { Texture } from 'three';\r\n\r\nexport default class TextureLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n }\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","import AbstractLoader from './AbstractLoader';\n\nexport default class 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","import ResourceContainer from '../ResourceContainer';\r\n\r\nexport default class ResourceBatch\r\n{\r\n constructor(batch_name)\r\n {\r\n this.resource_loaders = [];\r\n this.batch_name = batch_name || 'unnamed batch';\r\n }\r\n\r\n add_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"],"names":["[object Object]","this","browser_name","agent","window","navigator","userAgent","toLowerCase","indexOf","opr","chrome","name","is_safari","is_chrome","is_edge","is_edge_chromium","has_webm","is_firefox","has_hvec","preferred_video_extension","Validation","n","Number","is_int","is_float","str","JSON","parse","e","AbstractLoader","resource_id","url","size","loaded_bytes","total_bytes","has_finished","has_error","error_message","loaded","total","is_number","console","warn","message","error","resource_container","undefined","resources_by_url","cache","Browser","fetch","method","mode","credentials","redirect","then","on_progress","bind","catch","__on_error","set_resource","__update_downloaded_bytes","__loading_ended","response","response_clone","clone","reader","body","getReader","contentLength","headers","get","receivedLength","done","value","read","length","on_preloaded_finished","data","OMath","from_range_start_value","from_range_end_value","to_range_start_value","to_range_end_value","min","max","number","divisor","rgb","r","Math","round","toString","g","b","points","plane","projected_point","Vector3","points_on_plane","i","projectPoint","push","from","to","target","t","elements","lerp","x1","x2","abs","x","y","m","euclideanModulo","degrees","PI","radians","v","w","z","center","add","multiplyScalar","arr","col","floor","random","clamp","ActionSequencer","context","elapsed_time","playback_speed","playing","action_events","initial_context","stringify","tmp_t","channels","channel_names","Object","keys","duration","get_duration","__play_clips","delta_time","time","trigger_time","action","interpolator","use_dynamic_from_value","keyframes","attribute_name","keyframe","__get_current_keyframe","evaluate","__linear_map_01","easing_function","EPSILON","trigger","evaluate_keyframe","channel_name","initial","saturate","current","Infinity","distance","cos","sin","pow","sqrt","c4","ease_out_bounce","n1","d1","sign","ActionInterpolator","EasingFunctions","NumberInterpolator","super","app","ActionEvent","ViewContext","DrawIOAnimationSheet","xml_document","animation_nodes","DOMParser","parseFromString","querySelectorAll","animation_tracks","triggers","node","parent_node","parentElement","getAttribute","get_node_x_position","parseFloat","includes","split_data","split","trigger_name","trigger_method","at_time","value_data","to_value","from_time","to_time","sort","a","x_pos","ActionSequencerBuilder","initial_state_data","animation_data","current_context","tracks","initial_tracks","state_to_tracks","get_longest_time","find","element","sequencer","add_action_interpolator","action_event","add_action_event","state","longest_time","xml","transition_data","track_time","queue","zoom_changed_evt","store_clickd_evt","point_selected_evt","config_changed","path_substep_completed","path_completed","go_to_store_requested_evt","resource_loaded_evt","service_clicked_evt","unit_pos_updated_evt","floor_changed_evt","on_enter_floor_navigation","on_exit_floor_navigation","on_enter_floor_selection","on_exit_floor_selection","on_enter_outside_navigation","on_exit_outside_navigation","step_selected_evt","event","payload","callback","zoom","fire","store_id","hit_data","step_number","step_index","resource","service","unit_data","floor_id","resources","EventManager","fire_resource_loaded","HTMLUtilities","container","images","image","dataset","src","image_objects","image_object","videos","video","TransitionTable","transitions","from_state_name","to_state_name","from_animation_sheet","delta_buffer","___time","Clock","__raw_delta_time","__elapsed_time","__allocated_time","Vector2","shader_time","getDelta","getElapsedTime","shift","__calculate_delta_time","ViewState","global_view_data","transition_progress","action_sequencer","update_transition","ViewStateTransitionHandler","transition_table","last_state","current_state","current_state_data","transitioning","skip","__exit_last_state","before_exit","show","before_enter","play","update","__update_transitions","is_finished","on_enter","assign","Time","update_exit_transition","get_progress","update_enter_transition","hide","on_exit","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_initial_state_data","history","pushState","title","__capitalize","document","set_opacity","string","aux_string","toUpperCase","replace","__snake_to_whitespace","group","ApplicationView","ResourceContainer","ViewManager","register_view","classList","remove","load_images","load_videos","style","opacity","BaseApplication","BaseRender","renderer","BaseShaderMaterial","ShaderMaterial","vert","frag","uniforms","vertexShader","basic_vert","fragmentShader","basic_frag","_Color","Color","BlitMaterial","frag_shader","vert_shader","defines","_MainTex","_Resolution","_TargetResolution","depthWrite","blending","NoBlending","depthTest","depthFunc","AlwaysDepth","_current","camera","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","parameters","dpr","json","Idle","is_animating","Animating","easing_function_t","animator","set_property_value","set_current_state","finished_callback","CSSAnimator","css_property","value_prefix","value_suffix","ease_in_out_cubic","AxisHelper","Object3D","scale","blue_points","blue_axis_mat","LineBasicMaterial","color","blue_axis_geo","BufferGeometry","setFromPoints","blue_axis_line","Line","renderOrder","green_points","green_axis_mat","green_axis_geo","green_axis_line","red_points","red_axis_mat","red_axis_geo","red_axis_line","set","Scene","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","position","render_width","render_height","width_height","pixel_size","size_changed","vector2","aspect_ratio","portrait","ScreenSpaceTextureMaterial","h","_ScreenSpacePosition","_ScreenSize","_TextureSize","tex","PerspectiveCamera","THREEPerspectiveCamera","fov","aspect","near","far","clear_color","clear_alpha","copy","Vector3_one","Vector3_zero","canvas_renderer","display_texture_meshes","origin","arrow","normalize","SceneManager","axis","RT","rt_debug","position_2d","fillStyle","fillRect","clearRect","strokeStyle","line","frustumCulled","pos","cube","depth","distanceTo","sub","forward_dir","PlaneGeometry","Vector4","basic_color_vert","basic_color_frag","transparent","box","Box3","setFromCenterAndSize","helper","Box3Helper","sphere","input_points","open","catmull","CatmullRomCurve3","updateArcLengths","getSpacedPoints","draw_line","SphereGeometry","sphere_mesh","sphere1","bb","curve","options","offset","mesh","set_texture","graphics","set_screen_size","OScreen","render","ClearDepthNormalMaterial","clear_depth","clear_normal","_DepthNormal","DepthNormalMaterial","_FarPlane","far_plane","DepthAndNormalsRenderer","WebGLRenderTarget","clear_depth_normal_mat","depth_normal_material","__resize_RT_if_necessary","clear","blit_clear_with_material","CameraManager","setSize","render_target","Blitter","_blit_scene","_blit_material","_blit_quad","_blit_camera","OrthographicCamera","dst","src_texture","isWebGLRenderTarget","texture","src_width","src_height","getSize","__render","mat","dst_RT","current_rt","getRenderTarget","setRenderTarget","context_attributes","_renderer","blitter","no_render","current_render_mode","generateDepthNormalTexture","depth_and_normals_renderer","is_webgl2","canvas_context","alpha","desynchronized","stencil","antialias","premultipliedAlpha","preserveDrawingBuffer","powerPreference","logarithmicDepthBuffer","force_webgl2","xr_enabled","constructor","WebGLRenderer","xr","enabled","autoClear","setPixelRatio","Configuration","extensions","domElement","Capabilities","capabilities","getMaxAnisotropy","maxVertexTextures","floatVertexTextures","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","NormalMaterial","DebugNormalsRender","Graphics","KeyboardInput","ctrlz_pressed","ctrlz_fired","keys_keys","addEventListener","on_key_down","on_key_up","keyCode","ctrlKey","key","press_key","release_key","pressed","released","key_name","fired","down","removeEventListener","InputController","clicked","captured_NDC","current_NDC_delta","keyboard","keyboard_input_container","init","left_mouse_button_pressed","NDC","left_mouse_button_down","NDC_delta","left_mouse_button_released","operating_systems","ANDROID","IOS","LINUX","MAC","WINDOWS","is_mobile","match","is_ipad","maxTouchPoints","is_ios","is_android","get_os","is_linux","is_mac","is_windows","platform","os","test","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","RGBAFormat","Float32Array","FloatType","dst_texture","one_pixel_text","batches","buffer_geometries","attr_accessor_uvs","texture_width","ceilPowerOfTwo","__init_uv_array","uv_index","vertex_count","count","buffer_attribute","BufferAttribute","upload_texture_data","uvs","ui_elements","_tmp_normalized_pos","ss_scene","matrixWorldAutoUpdate","ws_scene","ss_camera","elem","splice","set_screen_space_coordinate_system","set_world_space_coordinate_system","Input","update_state","current_clicked_element","tmp_mat","Matrix4","Plane","ray","Ray","tmp_size","tmp_unproj","tmp_vec","applyQuaternion","v_fov","h_fov","atan","tan","distV","distH","plane_position","plane_normal","setFromNormalAndCoplanarPoint","get_forward_dir","isPerspectiveCamera","unproject_mouse_position","unproject","intersectPlane","zoom_scale","world_space_center","camera_forward","project_points_on_plane","projected_points_center","getCenter","up","right","cross","inverse_mat","getInverse","applyMatrix4","projected_center","get_zoom_to_fit_rect","isOrthographicCamera","obj_x","obj_y","object_aspect","object","getWorldPosition","project","left","top","bottom","app_container","CameraUtilities","GeometryBatcher","OS","ReflectionPlaneContext","UI","Debug","render_loop","SSAOMaterial","_InverseProjMatrix","_ProjectionMatrix","_Bias","_Radius","_SampleKernel","__get_sample_kernel","_RandomRotation","__get_rotation_kernel","sample_kernel","rotation_kernel","rotation_texture","wrapS","RepeatWrapping","wrapT","SSAOComposeMaterial","_AO","DisplayNormalTextureMaterial","depth_normals_vert","BoxBlurMaterial","_SampleDir","Blurrer","RT1","RT2","box_blur_mat","NormalAORender","ssao_mat","ssao_compose_mat","debug_normals","ssaa","use_ssaa","main_RT","SSAO_RT","blurrer","__check_RT_size","__update_uniforms","blur","projectionMatrix","NormalRender","UnrealBloomComposeMaterial","nMips","NUM_MIPS","_BlurredTex","_BloomStrength","blurTexture1","blurTexture2","blurTexture3","blurTexture4","blurTexture5","bloomStrength","bloomFactors","bloomRadius","bloomTintColors","rt","col_string","AddMaterial","_SecondTex","GaussianBlurMaterial","kernel_radius","KERNEL_RADIUS","SIGMA","texSize","direction","LuminosityHighPassMaterial","luminosityThreshold","smoothWidth","defaultColor","defaultOpacity","GaussianBlurrer","current_width","current_height","separableBlurMaterials","renderTargetsHorizontal","renderTargetsVertical","kernelSizeArray","rt_pars","minFilter","LinearFilter","magFilter","format","renderTargetBright","generateMipmaps","init_materials","init_RT","luminosity_high_pass_mat","use_luminosity_high_pass","resize_RT","inputRenderTarget","set_direction","dispose_RT","hor","ver","texture_height","set_size","dispose_materials","UnrealBloomRender","bloom_compose_mat","blur_RT","add_mat","set_RT_0","set_RT_1","set_RT_2","set_RT_3","set_RT_4","set_bloom_strength","set_bloom_radius","set_add_texture","val","set_tint_color_0","set_tint_color_1","set_tint_color_2","set_tint_color_3","set_tint_color_4","THREEOrthographicCamera","components","enabled_components","Set","__set_components_opacities","component","delete","component_name","RenderLoop","target_application","is_running","frames_passed","__update","on_post_start","ViewComponentManager","on_frame_end","setAnimationLoop","stop","apply_pixel_density_v2","apply_pixel_density","get_pixel_size","SimpleTextDrawer","text_margin","text_size","get_text_size","globalAlpha","textBaseline","textAlign","fillText","ViewComponent","hidden","register_component","enable_component","disable_component","toggle_hidden","HorizontalPlane","VerticalPlane","ArrayUtilities","source","apply","array","items_left_count","closest_point","closest_distance","obj","ids","FrustumPointFitter","camera_quaternion","vertical_fov","degToRad","up_plane_normal","get_up_plane_normal","down_plane_normal","get_down_plane_normal","left_plane_normal","get_left_plane_normal","right_plane_normal","get_right_plane_normal","camera_forward_dir","sphere_center","pull_back_distance","get_distance_to_fit_rect","far_pos","up_plane","down_plane","left_plane","right_plane","apply_center_correction_to_pos","inverse_dir","Line3","up_line_intersection","down_line_intersection","left_line_intersection","right_line_intersection","intersectLine","log","new_up_distance","new_down_distance","new_left_distance","new_right_distance","vertical_min","horizontal_min","forward_correction","target_pos","vertical_offset","get_vertical_correction","horizontal_offset","get_hozirontal_correction","closest_up_point","closest_down_point","closest_distance_to_up_plane","closest_distance_to_down_plane","up_dir","down_line","up_line","down_dist","up_dist","correction","closest_right_point","closest_left_point","closest_distance_to_right_plane","closest_distance_to_left_plane","right_dir","left_line","right_line","left_dist","right_dist","Quaternion","setFromAxisAngle","GeometryUtilities","geometry_buffer","indices","positions","vertices","getX","getY","getZ","add_barycentric_attribute","non_indexed_geometry_buffer","bar_coordinates","ImageUtilities","getImageData","imagedata","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","result_callback","fromGeometry","geometries","get_mesh","gltf","animations","skinnedMeshes","isSkinnedMesh","cloneBones","cloneSkinnedMeshes","isBone","skeleton","cloneSkinnedMesh","orderedCloneBones","bones","cloneBone","Skeleton","boneInverses","matrixWorld","cast","receive","castShadow","receiveShadow","object_type","ObjectUtilities","item","Array","isArray","sources","is_object","merge_deep","nodeType","attributes","attribute","nodeName","nodeValue","hasChildNodes","childNodes","xml_to_json","old","StringUtilities","words","substr","join","charAt","slice","TimeUtilities","time_str","hours","minutes","seconds","PerspectiveFrustumPointFitter","get_horizontal_correction","OrthographicFrustumPointFitter","inverse_camera_quat","inverse","inverted_points","distance_to_center","Grid","derivatives","plane_geometry","convert_to_non_indexed_geometry","rotation","_Thickness","_Length","_ElapsedTime","setup","next_position","previous_position","orientation","coverage","accumulated_length","next_point","__get_next_position","previous_point","__get_previous_position","vertexList","nextPositionList","previousPositionList","orientationList","coverageList","setIndex","_length","thickness","parent","WorldImage","pivot","_ScreenAligned","_Scale","_Opacity","DoubleSide","current_scale","computeBoundingBox","tmp_bb_size","boundingBox","img","screen_aligned","boolean","Text2D","is_static","simple_text_drawer","draw_settings","draw_on_texture","LinearMipMapLinearFilter","update_texture","UIElementMaterial","intensity","_PixelOffset","_NDC","_PivotPoint","_DepthOffset","ScreenSpacePosition","WorldSpacePosition","tmp_vec3","tmp_vec2","UIElementState","ui_element","normalized_mouse_position","OnIdle","is_mouse_over","_on_enter_state","OnMouseEnter","on_mouse_enter","_on_hover_state","_on_exit_state","OnMouseExit","on_mouse_exit","_on_idle_state","OnMouseHover","__trigger_on_hover","on_mouse_hover","UIElement","is_clickable","position_strategy","_position","on_hover","mouse_pos_tmp","cached_NDC_position","screen_pos_tmp","texture_size","matrixAutoUpdate","pixel_offset","pivot_point","use_depth","depth_offset","visible","get_size","normalized_mouse_pos","get_pos_NDC","to_screen_position","rect","Box2","containsPoint","projected_pos","screen_pos","UpdatableMaterialMesh","self","onBeforeRender","TextGlyph","plane_bounds","atlas_bounds","SDFText","glyph_layout","glyphs","glyph_is_dirty","matrix_is_dirty","color_is_dirty","matrix","__opacity","__text","__generate_glyphs","compose","tilt","new_orientation","new_tilt","multiply","update_glyphs","op","cursor","unicode","charCodeAt","glyph","planeBounds","text_glyph","atlasBounds","advance","box2","first_glyph","union","box2_size","SDFTextMaterial","_Texture","_Boldness","_AtlasSize","SDFTextBatch","font_layout","atlas_texture","instanced_geometry","InstancedBufferGeometry","instanceCount","Float32BufferAttribute","transformsCol0","InstancedBufferAttribute","max_allocations","transformsCol1","transformsCol2","transformsCol3","glyph_bounds","usage","DynamicDrawUsage","text_elements","set_atlas_size","atlas","set_boldness","text_str","text_elem","remove_elem","force_update","glyph_bounds_atr","plane_bounds_atr","color_atr","matrix_needs_update","glyph_needs_update","color_needs_update","glyph_count","update_matrix","clear_glyph_dirty","clear_color_dirty","glyph_i","buffer_i","setXYZW","VectorInterpolator","tmp","MedianFilterMaterial","kernel3x3","_SourceTex","_SourceTexSize","isVideoTexture","videoWidth","videoHeight","isTexture","MedianFilter","type","median_filter_mat","tex_size","DualFilteringBlurMaterial","upsample","AlphaFilterMaterial","use_alpha_mask","_Offset","DualFilteringBlurrer","RT0","RT3","RT4","upscale_blur_mat","downscale_blur_mat","alpha_filter_mat","check_RT_resize","GPUParticleSystem","particles","init_attribute_uvs","uv_storage_attr","build_uv_storage_attribute","Points","particle_count","resolution","calculate_resolution","update_material","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","THREECubeTextureLoader","setPath","urls","DAELoader","THREEColladaLoader","ColladaLoader","FileLoader","THREEFileLoader","file","FontLoader","TFontLoader","GLTFLoader","THREEGLTFLoader","GLTFDRACOLoader","setDRACOLoader","HDRCubeTextureLoader","THREEHDRCubeTextureLoader","url_suffix","setDataType","UnsignedByteType","hdr","JSONLoader","OBJLoader","THREEOBJLoader","PointArrayLoader","parse_path","raw_data","string_array","pop","THREEVector3","RGBETextureLoader","THREERGBELoader","RGBELoader","TextLoader","AsyncTextureLoader","Texture","Image","onload","onerror","original_url","TextureLoader","VideoLoader","ResourceBatch","batch_name","resource_loaders","loading_finished","finished","has_errors","print_error","get_loaded_bytes","get_total_bytes"],"mappings":"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"}
|