From 88ad250c85c6a0c011791c5e5d2631c62dfd6faa Mon Sep 17 00:00:00 2001 From: Jonathas Costa Date: Thu, 10 Jan 2019 14:17:29 -0500 Subject: [PATCH 01/39] Copied changes from old HDR branch to new one. --- include/openspace/rendering/abufferrenderer.h | 12 + .../openspace/rendering/framebufferrenderer.h | 45 +- include/openspace/rendering/renderengine.h | 20 + include/openspace/rendering/renderer.h | 6 + .../shaders/atmosphere_deferred_fs.glsl | 14 +- modules/base/shaders/renderabletrail_fs.glsl | 3 + shaders/fragment.glsl | 1 + shaders/framebuffer/bloomFilter.frag | 75 +++ shaders/framebuffer/bloomFilter.vert | 35 ++ shaders/framebuffer/bloomResolveFilter.frag | 43 ++ shaders/framebuffer/bloomResolveFilter.vert | 35 ++ shaders/framebuffer/computeAveLum.frag | 51 ++ shaders/framebuffer/computeAveLum.vert | 31 ++ shaders/framebuffer/hdrAndFiltering.frag | 120 +++++ shaders/framebuffer/hdrAndFiltering.vert | 33 ++ shaders/framebuffer/renderframebuffer.frag | 18 + shaders/hdr.glsl | 68 ++- src/rendering/abufferrenderer.cpp | 28 + src/rendering/framebufferrenderer.cpp | 483 ++++++++++++++++-- src/rendering/renderengine.cpp | 99 ++++ 20 files changed, 1158 insertions(+), 62 deletions(-) create mode 100644 shaders/framebuffer/bloomFilter.frag create mode 100644 shaders/framebuffer/bloomFilter.vert create mode 100644 shaders/framebuffer/bloomResolveFilter.frag create mode 100644 shaders/framebuffer/bloomResolveFilter.vert create mode 100644 shaders/framebuffer/computeAveLum.frag create mode 100644 shaders/framebuffer/computeAveLum.vert create mode 100644 shaders/framebuffer/hdrAndFiltering.frag create mode 100644 shaders/framebuffer/hdrAndFiltering.vert diff --git a/include/openspace/rendering/abufferrenderer.h b/include/openspace/rendering/abufferrenderer.h index ae799eb4b3..b669ccade5 100644 --- a/include/openspace/rendering/abufferrenderer.h +++ b/include/openspace/rendering/abufferrenderer.h @@ -65,6 +65,12 @@ public: void setHDRExposure(float hdrExposure) override; void setHDRBackground(float hdrBackground) override; void setGamma(float gamma) override; + void setMaxWhite(float maxWhite) override; + void setToneMapOperator(int tmOp) override; + void setBloomThreMin(float minV) override; + void setBloomThreMax(float maxV) override; + void setBloomOrigFactor(float origFactor) override; + void setBloomNewFactor(float newFactor) override; float hdrBackground() const override; int nAaSamples() const override; @@ -135,7 +141,13 @@ private: float _hdrExposure = 0.4f; float _hdrBackground = 2.8f; float _gamma = 2.2f; + float _maxWhite = 1.f; float _blackoutFactor; + float _bloomThresholdMin = 0.0; + float _bloomThresholdMax = 1.0; + float _bloomOrigFactor = 1.0; + float _bloomNewFactor = 1.0; + int _toneMapOperator = 0; std::vector _mSAAPattern; diff --git a/include/openspace/rendering/framebufferrenderer.h b/include/openspace/rendering/framebufferrenderer.h index 2334b2d47b..72fb72a57b 100644 --- a/include/openspace/rendering/framebufferrenderer.h +++ b/include/openspace/rendering/framebufferrenderer.h @@ -76,7 +76,9 @@ public: void updateResolution(); void updateRaycastData(); void updateDeferredcastData(); - void updateHDRData(); + void updateHDRAndFiltering(); + void updateAveLum(); + void updateBloomConfig(); void updateMSAASamplingPattern(); void setResolution(glm::ivec2 res) override; @@ -84,6 +86,12 @@ public: void setHDRExposure(float hdrExposure) override; void setHDRBackground(float hdrBackground) override; void setGamma(float gamma) override; + void setMaxWhite(float maxWhite) override; + void setToneMapOperator(int tmOp) override; + void setBloomThreMin(float minV) override; + void setBloomThreMax(float maxV) override; + void setBloomOrigFactor(float origFactor) override; + void setBloomNewFactor(float newFactor) override; float hdrBackground() const override; int nAaSamples() const override; @@ -105,6 +113,11 @@ public: virtual void deferredcastersChanged(Deferredcaster& deferredcaster, DeferredcasterListener::IsAttached isAttached) override; +private: + float computeBufferAveLuminance(); + float computeBufferAveLuminanceGPU(); + void applyBloomFilter(); + private: std::map _raycastData; RaycasterProgObjMap _exitPrograms; @@ -113,14 +126,26 @@ private: std::map _deferredcastData; DeferredcasterProgObjMap _deferredcastPrograms; - std::unique_ptr _hdrBackGroundProgram; + + std::unique_ptr _hdrFilteringProgram; + std::unique_ptr _aveLumProgram; + std::unique_ptr _bloomProgram; + std::unique_ptr _bloomResolveProgram; std::unique_ptr _resolveProgram; UniformCache(mainColorTexture, blackoutFactor, nAaSamples) _uniformCache; + + UniformCache(deferredResultsTexture, blackoutFactor, backgroundConstant, + backgroundExposure, gamma, toneMapOperator, aveLum, maxWhite) + _hdrUniformCache; + + UniformCache(renderedImage, bloomImage, bloomThresholdMin, bloomThresholdMax, + bloomOrigFactor, bloomNewFactor) _bloomUniformCache; GLuint _screenQuad; GLuint _vertexPositionBuffer; GLuint _mainColorTexture; + GLuint _mainFilterTexture; GLuint _mainPositionTexture; GLuint _mainNormalTexture; GLuint _mainDepthTexture; @@ -128,8 +153,14 @@ private: GLuint _mainFramebuffer; GLuint _exitDepthTexture; GLuint _exitFramebuffer; - GLuint _deferredFramebuffer; - GLuint _deferredColorTexture; + GLuint _hdrFilteringFramebuffer; + GLuint _hdrFilteringTexture; + + GLuint _bloomFilterFBO[3]; + GLuint _bloomTexture[3]; + + GLuint _computeAveLumFBO; + GLuint _computeAveLumTexture; bool _dirtyDeferredcastData; bool _dirtyRaycastData; @@ -141,6 +172,12 @@ private: float _hdrExposure = 0.4f; float _hdrBackground = 2.8f; float _gamma = 2.2f; + float _maxWhite = 1.0f; + float _bloomThresholdMin = 0.0; + float _bloomThresholdMax = 1.0; + float _bloomOrigFactor = 1.0; + float _bloomNewFactor = 1.0; + int _toneMapOperator = 0; std::vector _mSAAPattern; diff --git a/include/openspace/rendering/renderengine.h b/include/openspace/rendering/renderengine.h index 6254e51615..6078c45500 100644 --- a/include/openspace/rendering/renderengine.h +++ b/include/openspace/rendering/renderengine.h @@ -64,6 +64,20 @@ public: Invalid }; + enum class ToneMapOperators { + EXPONENTIAL = 0, + LINEAR, + SIMPLE_REINHARD, + LUM_BASED_REINHARD, + WHITE_PRESERVING, + ROM_BIN_DA_HOUSE, + FILMIC, + UNCHARTED, + COSTA, + ADAPTIVE, + GLOBAL + }; + RenderEngine(); ~RenderEngine(); @@ -193,6 +207,12 @@ private: properties::FloatProperty _hdrExposure; properties::FloatProperty _hdrBackground; properties::FloatProperty _gamma; + properties::FloatProperty _maxWhite; + properties::FloatProperty _bloomThreshouldMin; + properties::FloatProperty _bloomThreshouldMax; + properties::FloatProperty _bloomOrigColorFactor; + properties::FloatProperty _bloomNewColorFactor; + properties::OptionProperty _toneMapOperator; uint64_t _frameNumber = 0; diff --git a/include/openspace/rendering/renderer.h b/include/openspace/rendering/renderer.h index 8ae5130954..0eaac41734 100644 --- a/include/openspace/rendering/renderer.h +++ b/include/openspace/rendering/renderer.h @@ -53,6 +53,12 @@ public: virtual void setHDRExposure(float hdrExposure) = 0; virtual void setHDRBackground(float hdrBackground) = 0; virtual void setGamma(float gamma) = 0; + virtual void setMaxWhite(float maxWhite) = 0; + virtual void setToneMapOperator(int tmOp) = 0; + virtual void setBloomThreMin(float minV) = 0; + virtual void setBloomThreMax(float maxV) = 0; + virtual void setBloomOrigFactor(float origFactor) = 0; + virtual void setBloomNewFactor(float newFactor) = 0; virtual float hdrBackground() const = 0; virtual int nAaSamples() const = 0; diff --git a/modules/atmosphere/shaders/atmosphere_deferred_fs.glsl b/modules/atmosphere/shaders/atmosphere_deferred_fs.glsl index f3de0b64b2..cf3d8bc928 100644 --- a/modules/atmosphere/shaders/atmosphere_deferred_fs.glsl +++ b/modules/atmosphere/shaders/atmosphere_deferred_fs.glsl @@ -633,7 +633,8 @@ void main() { if (position.xyz != vec3(0.0) && (pixelDepth < offset)) { // ATM Occluded - Something in fron of ATM. - atmosphereFinalColor += vec4(HDR(color.xyz * backgroundConstant, atmExposure), color.a); + //atmosphereFinalColor += vec4(HDR(color.xyz * backgroundConstant, atmExposure), color.a); + atmosphereFinalColor += vec4(color.xyz * backgroundConstant, color.a); } else { // Following paper nomenclature double t = offset; @@ -682,13 +683,15 @@ void main() { } // Final Color of ATM plus terrain: - vec4 finalRadiance = vec4(HDR(inscatterColor + groundColorV + sunColorV, atmExposure), 1.0); - + //vec4 finalRadiance = vec4(HDR(inscatterColor + groundColorV + sunColorV, atmExposure), 1.0); + vec4 finalRadiance = vec4(inscatterColor + groundColorV + sunColorV, 1.0); + atmosphereFinalColor += finalRadiance; } } else { // no intersection - atmosphereFinalColor += vec4(HDR(color.xyz * backgroundConstant, atmExposure), color.a); + //atmosphereFinalColor += vec4(HDR(color.xyz * backgroundConstant, atmExposure), color.a); + atmosphereFinalColor += vec4(color.xyz * backgroundConstant, color.a); } } @@ -704,7 +707,8 @@ void main() { bColor += texelFetch(mainColorTexture, fragCoords, f); } bColor /= float(nAaSamples); - renderTarget = vec4(HDR(bColor.xyz * backgroundConstant, atmExposure), bColor.a); + //renderTarget = vec4(HDR(bColor.xyz * backgroundConstant, atmExposure), bColor.a); + renderTarget = vec4(bColor.xyz * backgroundConstant, bColor.a); } else { discard; diff --git a/modules/base/shaders/renderabletrail_fs.glsl b/modules/base/shaders/renderabletrail_fs.glsl index df8778fe70..cb55366fe4 100644 --- a/modules/base/shaders/renderabletrail_fs.glsl +++ b/modules/base/shaders/renderabletrail_fs.glsl @@ -71,5 +71,8 @@ Fragment getFragment() { // There is no normal here frag.gNormal = vec4(0.0, 0.0, -1.0, 1.0); + // Bloom filter + frag.filterFlag = 1; + return frag; } diff --git a/shaders/fragment.glsl b/shaders/fragment.glsl index 97755f6734..3cdb665ce8 100644 --- a/shaders/fragment.glsl +++ b/shaders/fragment.glsl @@ -32,6 +32,7 @@ struct Fragment { vec4 color; vec4 gPosition; vec4 gNormal; + uint filterFlag; float depth; uint blend; bool forceFboRendering; diff --git a/shaders/framebuffer/bloomFilter.frag b/shaders/framebuffer/bloomFilter.frag new file mode 100644 index 0000000000..56b4b795fd --- /dev/null +++ b/shaders/framebuffer/bloomFilter.frag @@ -0,0 +1,75 @@ +/***************************************************************************************** + * * + * OpenSpace * + * * + * Copyright (c) 2014-2018 * + * * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this * + * software and associated documentation files (the "Software"), to deal in the Software * + * without restriction, including without limitation the rights to use, copy, modify, * + * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to * + * permit persons to whom the Software is furnished to do so, subject to the following * + * conditions: * + * * + * The above copyright notice and this permission notice shall be included in all copies * + * or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, * + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A * + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT * + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF * + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + ****************************************************************************************/ + +#version __CONTEXT__ + +layout (location = 0) out vec4 finalColor; + +uniform int pass; +uniform sampler2DMS filterImage; +uniform sampler2D filterFirstPass; + +// Gaussian Weights from OpenGL SuperBible 7 ed. +const float weights[] = float[](0.0024499299678342, + 0.0043538453346397, + 0.0073599963704157, + 0.0118349786570722, + 0.0181026699707781, + 0.0263392293891488, + 0.0364543006660986, + 0.0479932050577658, + 0.0601029809166942, + 0.0715974486241365, + 0.0811305381519717, + 0.0874493212267511, + 0.0896631113333857, + 0.0874493212267511, + 0.0811305381519717, + 0.0715974486241365, + 0.0601029809166942, + 0.0479932050577658, + 0.0364543006660986, + 0.0263392293891488, + 0.0181026699707781, + 0.0118349786570722, + 0.0073599963704157, + 0.0043538453346397, + 0.0024499299678342); + +void main(void) +{ + vec4 color = vec4(0.0); + // Transpose the image so the filter can be applied on X and Y + ivec2 P = ivec2(gl_FragCoord.yx) - ivec2(0, weights.length() >> 1); + + for (int i = 0; i < weights.length(); i++) + { + if (pass == 1) + color += vec4(texelFetch(filterImage, P + ivec2(0, i), 0).rgb, 1.0) * weights[i]; + else if (pass == 2) + color += vec4(texelFetch(filterFirstPass, P + ivec2(0, i), 0).rgb, 1.0) * weights[i]; + } + + finalColor = vec4(color.rgb, 1.0); +} diff --git a/shaders/framebuffer/bloomFilter.vert b/shaders/framebuffer/bloomFilter.vert new file mode 100644 index 0000000000..818a0d62af --- /dev/null +++ b/shaders/framebuffer/bloomFilter.vert @@ -0,0 +1,35 @@ +/***************************************************************************************** + * * + * OpenSpace * + * * + * Copyright (c) 2014-2018 * + * * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this * + * software and associated documentation files (the "Software"), to deal in the Software * + * without restriction, including without limitation the rights to use, copy, modify, * + * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to * + * permit persons to whom the Software is furnished to do so, subject to the following * + * conditions: * + * * + * The above copyright notice and this permission notice shall be included in all copies * + * or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, * + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A * + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT * + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF * + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + ****************************************************************************************/ + +#version __CONTEXT__ + +void main(void) +{ + const vec4 vertices[] = vec4[](vec4(-1.0, -1.0, 0.5, 1.0), + vec4( 1.0, -1.0, 0.5, 1.0), + vec4(-1.0, 1.0, 0.5, 1.0), + vec4( 1.0, 1.0, 0.5, 1.0)); + + gl_Position = vertices[gl_VertexID]; +} \ No newline at end of file diff --git a/shaders/framebuffer/bloomResolveFilter.frag b/shaders/framebuffer/bloomResolveFilter.frag new file mode 100644 index 0000000000..fdbc368507 --- /dev/null +++ b/shaders/framebuffer/bloomResolveFilter.frag @@ -0,0 +1,43 @@ +/***************************************************************************************** + * * + * OpenSpace * + * * + * Copyright (c) 2014-2018 * + * * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this * + * software and associated documentation files (the "Software"), to deal in the Software * + * without restriction, including without limitation the rights to use, copy, modify, * + * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to * + * permit persons to whom the Software is furnished to do so, subject to the following * + * conditions: * + * * + * The above copyright notice and this permission notice shall be included in all copies * + * or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, * + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A * + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT * + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF * + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + ****************************************************************************************/ + +#version __CONTEXT__ + +layout (location = 0) out vec4 finalColor; + +uniform float bloomOrigFactor; +uniform float bloomNewFactor; +uniform sampler2D renderedImage; +uniform sampler2D bloomImage; + +void main(void) +{ + vec4 color = vec4(0.0); + + color += texelFetch(renderedImage, ivec2(gl_FragCoord.xy), 0) * bloomOrigFactor; + float alpha = color.a; + color += texelFetch(bloomImage, ivec2(gl_FragCoord.xy), 0) * bloomNewFactor; + + finalColor = vec4(color.rgb, alpha); +} diff --git a/shaders/framebuffer/bloomResolveFilter.vert b/shaders/framebuffer/bloomResolveFilter.vert new file mode 100644 index 0000000000..818a0d62af --- /dev/null +++ b/shaders/framebuffer/bloomResolveFilter.vert @@ -0,0 +1,35 @@ +/***************************************************************************************** + * * + * OpenSpace * + * * + * Copyright (c) 2014-2018 * + * * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this * + * software and associated documentation files (the "Software"), to deal in the Software * + * without restriction, including without limitation the rights to use, copy, modify, * + * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to * + * permit persons to whom the Software is furnished to do so, subject to the following * + * conditions: * + * * + * The above copyright notice and this permission notice shall be included in all copies * + * or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, * + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A * + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT * + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF * + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + ****************************************************************************************/ + +#version __CONTEXT__ + +void main(void) +{ + const vec4 vertices[] = vec4[](vec4(-1.0, -1.0, 0.5, 1.0), + vec4( 1.0, -1.0, 0.5, 1.0), + vec4(-1.0, 1.0, 0.5, 1.0), + vec4( 1.0, 1.0, 0.5, 1.0)); + + gl_Position = vertices[gl_VertexID]; +} \ No newline at end of file diff --git a/shaders/framebuffer/computeAveLum.frag b/shaders/framebuffer/computeAveLum.frag new file mode 100644 index 0000000000..faa3bde1f8 --- /dev/null +++ b/shaders/framebuffer/computeAveLum.frag @@ -0,0 +1,51 @@ +/***************************************************************************************** + * * + * OpenSpace * + * * + * Copyright (c) 2014-2018 * + * * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this * + * software and associated documentation files (the "Software"), to deal in the Software * + * without restriction, including without limitation the rights to use, copy, modify, * + * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to * + * permit persons to whom the Software is furnished to do so, subject to the following * + * conditions: * + * * + * The above copyright notice and this permission notice shall be included in all copies * + * or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, * + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A * + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT * + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF * + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + ****************************************************************************************/ + +#version __CONTEXT__ + +layout (location = 0) out vec4 finalColor; + +uniform int bufferWidth; +uniform int bufferHeight; +uniform sampler2D hdrTexture; + +in vec2 texCoord; + +void main() { + vec4 color = vec4(0.0); + float fH = float(bufferHeight); + float fW = float(bufferWidth); + + float sum = 0.f; + for (int i = 0; i < bufferHeight; ++i) { + for (int j = 0; j < bufferWidth; ++j) { + vec2 texCoord = vec2(float(i) / fH, float(j) / fW); + vec4 tmpColor = texture(hdrTexture, texCoord); + float lum = dot(tmpColor.xyz, vec3(0.2126f, 0.7152f, 0.0722f)); + sum += log(lum + 0.00001); + } + } + + finalColor = vec4(vec3(exp(sum / (fH * fW))), 1.0); +} \ No newline at end of file diff --git a/shaders/framebuffer/computeAveLum.vert b/shaders/framebuffer/computeAveLum.vert new file mode 100644 index 0000000000..4927e34304 --- /dev/null +++ b/shaders/framebuffer/computeAveLum.vert @@ -0,0 +1,31 @@ +/***************************************************************************************** + * * + * OpenSpace * + * * + * Copyright (c) 2014-2018 * + * * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this * + * software and associated documentation files (the "Software"), to deal in the Software * + * without restriction, including without limitation the rights to use, copy, modify, * + * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to * + * permit persons to whom the Software is furnished to do so, subject to the following * + * conditions: * + * * + * The above copyright notice and this permission notice shall be included in all copies * + * or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, * + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A * + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT * + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF * + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + ****************************************************************************************/ + +#version __CONTEXT__ + +layout(location = 0) in vec4 position; + +void main() { + gl_Position = position; +} diff --git a/shaders/framebuffer/hdrAndFiltering.frag b/shaders/framebuffer/hdrAndFiltering.frag new file mode 100644 index 0000000000..26ab41b9bc --- /dev/null +++ b/shaders/framebuffer/hdrAndFiltering.frag @@ -0,0 +1,120 @@ +/***************************************************************************************** + * * + * OpenSpace * + * * + * Copyright (c) 2014-2018 * + * * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this * + * software and associated documentation files (the "Software"), to deal in the Software * + * without restriction, including without limitation the rights to use, copy, modify, * + * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to * + * permit persons to whom the Software is furnished to do so, subject to the following * + * conditions: * + * * + * The above copyright notice and this permission notice shall be included in all copies * + * or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, * + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A * + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT * + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF * + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + ****************************************************************************************/ + +#version __CONTEXT__ + +#include "hdr.glsl" + +layout (location = 0) out vec4 finalColor; + +uniform float backgroundConstant; +uniform float backgroundExposure; +uniform float blackoutFactor; +uniform float gamma; +uniform float maxWhite; +uniform float aveLum; +uniform int toneMapOperator; + +uniform sampler2D deferredResultsTexture; + +in vec2 texCoord; + +vec4 adaptiveToneMap() { + int i; + float lum[25]; + vec2 tex_scale = vec2(1.0) / textureSize(deferredResultsTexture, 0); + + for (i = 0; i < 25; i++) + { + vec2 tc = (gl_FragCoord.xy + 3.5 * vec2(i % 5 - 2, i / 5 - 2)); + vec3 col = texture(deferredResultsTexture, tc * tex_scale).rgb; + lum[i] = dot(col, vec3(0.3, 0.59, 0.11)); + } + + // Calculate weighted color of region + vec3 vColor = texelFetch(deferredResultsTexture, ivec2(gl_FragCoord.xy), 0).rgb; + + float kernelLuminance = ( + (1.0 * (lum[0] + lum[4] + lum[20] + lum[24])) + + (4.0 * (lum[1] + lum[3] + lum[5] + lum[9] + + lum[15] + lum[19] + lum[21] + lum[23])) + + (7.0 * (lum[2] + lum[10] + lum[14] + lum[22])) + + (16.0 * (lum[6] + lum[8] + lum[16] + lum[18])) + + (26.0 * (lum[7] + lum[11] + lum[13] + lum[17])) + + (41.0 * lum[12]) + ) / 273.0; + + // Compute the corresponding exposure + float exposure = sqrt(8.0 / (kernelLuminance + 0.25)); + + // Apply the exposure to this texel + vec4 fColor; + fColor.rgb = 1.0 - exp2(-vColor * exposure); + fColor.a = 1.0f; + + return fColor; +} + + +void main() { + vec4 color = vec4(0.0); + color = texture(deferredResultsTexture, texCoord); + //color = texelFetch(deferredResultsTexture, ivec2(gl_FragCoord.xy), 0); + color.a *= blackoutFactor; + + if (toneMapOperator == EXPONENTIAL) { + vec3 tColor = exponentialToneMapping(color.rgb, backgroundExposure, gamma); + finalColor = vec4(tColor, color.a); + } else if (toneMapOperator == LINEAR) { + vec3 tColor = linearToneMapping(color.rgb, backgroundExposure); + finalColor = vec4(gammaCorrection(tColor, gamma), color.a); + } else if (toneMapOperator == SIMPLE_REINHARD) { + vec3 tColor = simpleReinhardToneMapping(color.rgb, backgroundExposure); + finalColor = vec4(gammaCorrection(tColor, gamma), color.a); + } else if (toneMapOperator == LUM_BASED_REINHARD) { + vec3 tColor = lumaBasedReinhardToneMapping(color.rgb, backgroundExposure); + finalColor = vec4(gammaCorrection(tColor, gamma), color.a); + } else if (toneMapOperator == WHITE_PRESERVING) { + vec3 tColor = whitePreservingLumaBasedReinhardToneMapping(color.rgb, backgroundExposure, maxWhite); + finalColor = vec4(gammaCorrection(tColor, gamma), color.a); + } else if (toneMapOperator == ROM_BIN_DA_HOUSE) { + vec3 tColor = RomBinDaHouseToneMapping(color.rgb, backgroundExposure); + finalColor = vec4(gammaCorrection(tColor, gamma), color.a); + } else if (toneMapOperator == FILMIC) { + vec3 tColor = filmicToneMapping(color.rgb, backgroundExposure); + finalColor = vec4(gammaCorrection(tColor, gamma), color.a); + } else if (toneMapOperator == UNCHARTED) { + vec3 tColor = Uncharted2ToneMapping(color.rgb, backgroundExposure); + finalColor = vec4(gammaCorrection(tColor, gamma), color.a); + } else if (toneMapOperator == COSTA) { + vec3 tColor = jToneMapping(color.rgb, backgroundExposure); + finalColor = vec4(gammaCorrection(tColor, gamma), color.a); + } else if (toneMapOperator == ADAPTIVE) { + vec3 tColor = vec3(adaptiveToneMap()); + finalColor = vec4(gammaCorrection(tColor, gamma), color.a); + } else if (toneMapOperator == GLOBAL) { + vec3 tColor = globalToneMappingOperatorRTR(color.rgb, backgroundExposure, maxWhite, aveLum); + finalColor = vec4(gammaCorrection(tColor, gamma), color.a); + } +} \ No newline at end of file diff --git a/shaders/framebuffer/hdrAndFiltering.vert b/shaders/framebuffer/hdrAndFiltering.vert new file mode 100644 index 0000000000..06506ba824 --- /dev/null +++ b/shaders/framebuffer/hdrAndFiltering.vert @@ -0,0 +1,33 @@ +/***************************************************************************************** + * * + * OpenSpace * + * * + * Copyright (c) 2014-2018 * + * * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this * + * software and associated documentation files (the "Software"), to deal in the Software * + * without restriction, including without limitation the rights to use, copy, modify, * + * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to * + * permit persons to whom the Software is furnished to do so, subject to the following * + * conditions: * + * * + * The above copyright notice and this permission notice shall be included in all copies * + * or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, * + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A * + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT * + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF * + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + ****************************************************************************************/ + +#version __CONTEXT__ + +layout(location = 0) in vec4 position; +out vec2 texCoord; + +void main() { + texCoord = 0.5 + position.xy * 0.5; + gl_Position = position; +} diff --git a/shaders/framebuffer/renderframebuffer.frag b/shaders/framebuffer/renderframebuffer.frag index 4ec538c538..8cf3617358 100644 --- a/shaders/framebuffer/renderframebuffer.frag +++ b/shaders/framebuffer/renderframebuffer.frag @@ -28,11 +28,29 @@ layout(location = 0) out vec4 _out_color_; layout(location = 1) out vec4 gPosition; layout(location = 2) out vec4 gNormal; +layout(location = 3) out vec4 filterBuffer; void main() { Fragment f = getFragment(); _out_color_ = f.color; gPosition = f.gPosition; gNormal = f.gNormal; + + bool automaticBloom = false; + if (automaticBloom) { + // Extract luminance + float Y = dot(f.color.rgb, vec3(0.299, 0.587, 0.144)); + + // Apply Bloom on the bloom threshold range values + //vec4 bColor = f.color * 4.0 * smoothstep(bloom_thresh_min, bloom_thresh_max, Y); + //filterBuffer = bColor + filterBuffer = vec4(f.filterFlag); + } else { + if (f.filterFlag == 1) + filterBuffer = f.color; + else + filterBuffer = vec4(0); + } + gl_FragDepth = normalizeFloat(f.depth); } diff --git a/shaders/hdr.glsl b/shaders/hdr.glsl index cb282bed8f..e3c1384d73 100644 --- a/shaders/hdr.glsl +++ b/shaders/hdr.glsl @@ -21,10 +21,51 @@ * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * ****************************************************************************************/ - -uniform float gamma; -vec3 exponentialToneMapping(vec3 color, float exposure) { +#define EXPONENTIAL 0 +#define LINEAR 1 +#define SIMPLE_REINHARD 2 +#define LUM_BASED_REINHARD 3 +#define WHITE_PRESERVING 4 +#define ROM_BIN_DA_HOUSE 5 +#define FILMIC 6 +#define UNCHARTED 7 +#define COSTA 8 +#define ADAPTIVE 9 +#define GLOBAL 10 + +const mat3 rgb2xyz = mat3( + 0.4124564, 0.2126729, 0.0193339, + 0.3575761, 0.7151522, 0.1191920, + 0.1804375, 0.0721750, 0.9503041 ); + +const mat3 xyz2rgb = mat3( + 3.2404542, -0.9692660, 0.0556434, + -1.5371385, 1.8760108, -0.2040259, + -0.4985314, 0.0415560, 1.0572252 ); + +vec3 globalToneMappingOperatorRTR(vec3 color, float exposure, float maxWhite, float aveLum) { + // Convert color to XYZ + vec3 xyzCol = rgb2xyz * color; + + // Convert from XYZ to xyY + float xyzSum = xyzCol.x + xyzCol.y + xyzCol.z; + vec3 xyYCol = vec3( xyzCol.x / xyzSum, xyzCol.y / xyzSum, xyzCol.y); + + // Apply the tone mapping operation to the luminance (xyYCol.z or xyzCol.y) + float L = (exposure * xyYCol.z) / aveLum; + L = (L * ( 1 + L / (maxWhite * maxWhite) )) / ( 1 + L ); + + // Using the new luminance, convert back to XYZ + xyzCol.x = (L * xyYCol.x) / (xyYCol.y); + xyzCol.y = L; + xyzCol.z = (L * (1 - xyYCol.x - xyYCol.y))/xyYCol.y; + + // Convert back to RGB and send to output buffer + return xyz2rgb * xyzCol; +} + +vec3 exponentialToneMapping(vec3 color, float exposure, float gamma) { color *= exposure; color.r = color.r < 1.413 ? pow(color.r * 0.38317, 1.0 / gamma) : 1.0 - exp(-color.r); @@ -37,14 +78,12 @@ vec3 exponentialToneMapping(vec3 color, float exposure) { vec3 linearToneMapping(vec3 color, float exposure) { float tExposure = 0.08f; color = clamp(tExposure * color, 0.f, 1.f); - color = pow(color, vec3(1.f / gamma)); return color; } vec3 simpleReinhardToneMapping(vec3 color, float exposure) { - float tExposure = 1.5f; + float tExposure = exposure; color *= tExposure/(1.f + color / tExposure); - color = pow(color, vec3(1.f / gamma)); return color; } @@ -52,23 +91,19 @@ vec3 lumaBasedReinhardToneMapping(vec3 color, float exposure) { float luma = dot(color, vec3(0.2126f, 0.7152f, 0.0722f)); float toneMappedLuma = luma / (1.f + luma); color *= toneMappedLuma / luma; - color = pow(color, vec3(1.f / gamma)); return color; } -vec3 whitePreservingLumaBasedReinhardToneMapping(vec3 color, float exposure) { - float white = 4.f; +vec3 whitePreservingLumaBasedReinhardToneMapping(vec3 color, float exposure, float maxWhite) { //float luma = dot(color, vec3(0.2126f, 0.7152f, 0.0722f)); float luma = dot(color, vec3(0.4126f, 0.9152f, 0.2722f)); - float toneMappedLuma = luma * (1.f + luma / (white * white)) / (1.f + luma); + float toneMappedLuma = luma * (1.f + luma / (maxWhite * maxWhite)) / (1.f + luma); color *= toneMappedLuma / luma; - color = pow(color, vec3(1.f / gamma)); return color; } vec3 RomBinDaHouseToneMapping(vec3 color, float exposure) { color = exp( -1.f / ( 2.72f * color + 0.15f ) ); - color = pow(color, vec3(1.7f / gamma)); return color; } @@ -92,7 +127,6 @@ vec3 Uncharted2ToneMapping(vec3 color, float exposure) { color = ((color * (A * color + C * B) + D * E) / (color * (A * color + B) + D * F)) - E / F; float white = ((W * (A * W + C * B) + D * E) / (W * (A * W + B) + D * F)) - E / F; color /= white; - color = pow(color, vec3(1.0f / gamma)); return color; } @@ -100,6 +134,10 @@ vec3 jToneMapping(vec3 color, float exposure) { return 1.0 - exp(-exposure * color); } +vec3 gammaCorrection(vec3 color, float gamma) { + return pow(color, vec3(1.0f / gamma)); +} + vec3 HDR(vec3 color, float exposure) { //return exponentialToneMapping(color, exposure); //return linearToneMapping(color, exposure); @@ -107,7 +145,7 @@ vec3 HDR(vec3 color, float exposure) { //return lumaBasedReinhardToneMapping(color, exposure); //return whitePreservingLumaBasedReinhardToneMapping(color, exposure); //return RomBinDaHouseToneMapping(color, exposure); - //return filmicToneMapping(color, exposure); + return filmicToneMapping(color, exposure); //return Uncharted2ToneMapping(color, exposure); - return jToneMapping(color, exposure); + //return jToneMapping(color, exposure); } diff --git a/src/rendering/abufferrenderer.cpp b/src/rendering/abufferrenderer.cpp index a3c56fb98d..c511015d86 100644 --- a/src/rendering/abufferrenderer.cpp +++ b/src/rendering/abufferrenderer.cpp @@ -727,6 +727,34 @@ void ABufferRenderer::setGamma(float gamma) { } } +void ABufferRenderer::setMaxWhite(float maxWhite) { + _maxWhite = maxWhite; +} + +void ABufferRenderer::setToneMapOperator(int tmOp) { + _toneMapOperator = tmpOp; +}; + +void ABufferRenderer::setToneMapOperator(int tmOp) { + _toneMapOperator = tmOp; +} + +void ABufferRenderer::setBloomThreMin(float minV) { + _bloomThresholdMin = minV; +} + +void ABufferRenderer::setBloomThreMax(float maxV) { + _bloomThresholdMax = maxV; +} + +void ABufferRenderer::setBloomOrigFactor(float origFactor) { + _bloomOrigFactor = origFactor; +} + +void ABufferRenderer::setBloomNewFactor(float newFactor) { + _bloomNewFactor = newFactor; +} + float ABufferRenderer::hdrBackground() const { return _hdrBackground; } diff --git a/src/rendering/framebufferrenderer.cpp b/src/rendering/framebufferrenderer.cpp index 7b5502cc3b..15063a28c9 100644 --- a/src/rendering/framebufferrenderer.cpp +++ b/src/rendering/framebufferrenderer.cpp @@ -55,6 +55,16 @@ namespace { "mainColorTexture", "blackoutFactor", "nAaSamples" }; + constexpr const std::array HDRUniformNames = { + "deferredResultsTexture", "blackoutFactor", "backgroundConstant", + "backgroundExposure", "gamma", "toneMapOperator", "aveLum", "maxWhite" + }; + + constexpr const std::array BLoomUniformNames = { + "renderedImage", "bloomImage", "bloomThresholdMin", "bloomThresholdMax", + "bloomOrigFactor", "bloomNewFactor" + }; + constexpr const char* ExitFragmentShaderPath = "${SHADERS}/framebuffer/exitframebuffer.frag"; constexpr const char* RaycastFragmentShaderPath = @@ -127,6 +137,7 @@ void FramebufferRenderer::initialize() { // Main framebuffer glGenTextures(1, &_mainColorTexture); glGenTextures(1, &_mainDepthTexture); + glGenTextures(1, &_mainFilterTexture); glGenFramebuffers(1, &_mainFramebuffer); // Exit framebuffer @@ -134,16 +145,27 @@ void FramebufferRenderer::initialize() { glGenTextures(1, &_exitDepthTexture); glGenFramebuffers(1, &_exitFramebuffer); - // Deferred framebuffer - glGenTextures(1, &_deferredColorTexture); + // Deferred textures glGenTextures(1, &_mainPositionTexture); glGenTextures(1, &_mainNormalTexture); - glGenFramebuffers(1, &_deferredFramebuffer); + // HDR / Filtering Framebuffer + glGenFramebuffers(1, &_hdrFilteringFramebuffer); + glGenTextures(1, &_hdrFilteringTexture); + + // Compute Average Luminosity + glGenTextures(1, &_computeAveLumTexture); + glGenFramebuffers(1, &_computeAveLumFBO); + + // Bloom Filter + glGenFramebuffers(3, _bloomFilterFBO); + glGenTextures(3, _bloomTexture); + updateResolution(); updateRendererData(); - updateRaycastData(); + updateRaycastData(); + // Builds Main Framebuffer glBindFramebuffer(GL_FRAMEBUFFER, _mainFramebuffer); glFramebufferTexture2D( GL_FRAMEBUFFER, @@ -152,7 +174,6 @@ void FramebufferRenderer::initialize() { _mainColorTexture, 0 ); - // G-buffer glFramebufferTexture2D( GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, @@ -167,6 +188,13 @@ void FramebufferRenderer::initialize() { _mainNormalTexture, 0 ); + glFramebufferTexture2D( + GL_FRAMEBUFFER, + GL_COLOR_ATTACHMENT3, + GL_TEXTURE_2D_MULTISAMPLE, + _mainFilterTexture, + 0 + ); glFramebufferTexture2D( GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, @@ -180,6 +208,7 @@ void FramebufferRenderer::initialize() { LERROR("Main framebuffer is not complete"); } + // Builds Exit Framebuffer glBindFramebuffer(GL_FRAMEBUFFER, _exitFramebuffer); glFramebufferTexture2D( GL_FRAMEBUFFER, @@ -201,23 +230,59 @@ void FramebufferRenderer::initialize() { LERROR("Exit framebuffer is not complete"); } - glBindFramebuffer(GL_FRAMEBUFFER, _deferredFramebuffer); + // Builds HDR/Filtering Framebuffer + glBindFramebuffer(GL_FRAMEBUFFER, _hdrFilteringFramebuffer); glFramebufferTexture2D( GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, - _deferredColorTexture, + _hdrFilteringTexture, 0 ); status = glCheckFramebufferStatus(GL_FRAMEBUFFER); if (status != GL_FRAMEBUFFER_COMPLETE) { - LERROR("Deferred framebuffer is not complete"); + LERROR("HDR/Filtering framebuffer is not complete"); + } + + // Buids Average Lum FBO + glBindFramebuffer(GL_FRAMEBUFFER, _computeAveLumFBO); + glFramebufferTexture2D( + GL_FRAMEBUFFER, + GL_COLOR_ATTACHMENT0, + GL_TEXTURE_2D, + _computeAveLumTexture, + 0 + ); + + status = glCheckFramebufferStatus(GL_FRAMEBUFFER); + if (status != GL_FRAMEBUFFER_COMPLETE) { + LERROR("Average Luminosity framebuffer is not complete"); + } + + // Builds Bloom Filter FBOs + //const GLenum buffers[] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1 }; + const GLenum buffers[] = { GL_COLOR_ATTACHMENT0 }; + for (int i = 0; i < 3; i++) + { + glBindFramebuffer(GL_FRAMEBUFFER, _bloomFilterFBO[i]); + glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, _bloomTexture[i], 0); + glDrawBuffers(1, buffers); + } + + status = glCheckFramebufferStatus(GL_FRAMEBUFFER); + if (status != GL_FRAMEBUFFER_COMPLETE) { + LERROR("Bloom framebuffer is not complete"); } // JCC: Moved to here to avoid NVidia: "Program/shader state performance warning" - updateHDRData(); + // Builds HDR and Filtering programs + updateHDRAndFiltering(); + updateAveLum(); + updateBloomConfig(); + // Builds deferred casters programs updateDeferredcastData(); + _dirtyMsaaSamplingPattern = true; glBindFramebuffer(GL_FRAMEBUFFER, defaultFbo); @@ -228,8 +293,21 @@ void FramebufferRenderer::initialize() { absPath("${SHADERS}/framebuffer/resolveframebuffer.frag") ); - ghoul::opengl::updateUniformLocations(*_resolveProgram, _uniformCache, UniformNames); - + ghoul::opengl::updateUniformLocations( + *_resolveProgram, + _uniformCache, + UniformNames + ); + ghoul::opengl::updateUniformLocations( + *_hdrFilteringProgram, + _hdrUniformCache, + HDRUniformNames + ); + ghoul::opengl::updateUniformLocations( + *_bloomResolveProgram, + _bloomUniformCache, + BLoomUniformNames + ); global::raycasterManager.addListener(*this); global::deferredcasterManager.addListener(*this); } @@ -239,15 +317,18 @@ void FramebufferRenderer::deinitialize() { glDeleteFramebuffers(1, &_mainFramebuffer); glDeleteFramebuffers(1, &_exitFramebuffer); - glDeleteFramebuffers(1, &_deferredFramebuffer); + glDeleteFramebuffers(1, &_hdrFilteringFramebuffer); + glDeleteFramebuffers(1, &_computeAveLumFBO); + glDeleteFramebuffers(3, _bloomFilterFBO); glDeleteTextures(1, &_mainColorTexture); glDeleteTextures(1, &_mainDepthTexture); - // DEBUG: deferred g-buffer - glDeleteTextures(1, &_deferredColorTexture); + glDeleteTextures(1, &_hdrFilteringTexture); glDeleteTextures(1, &_mainPositionTexture); glDeleteTextures(1, &_mainNormalTexture); + glDeleteTextures(1, &_computeAveLumTexture); + glDeleteTextures(3, _bloomTexture); glDeleteTextures(1, &_exitColorTexture); glDeleteTextures(1, &_exitDepthTexture); @@ -271,6 +352,155 @@ void FramebufferRenderer::deferredcastersChanged(Deferredcaster&, _dirtyDeferredcastData = true; } +float FramebufferRenderer::computeBufferAveLuminance() { + unsigned int texDimension = _resolution.x * _resolution.y; + + std::unique_ptr texData(new GLfloat[texDimension * 3]); + + ghoul::opengl::TextureUnit hdrTextureUnit; + hdrTextureUnit.activate(); + glBindTexture(GL_TEXTURE_2D, _hdrFilteringTexture); + + glGetTexImage(GL_TEXTURE_2D, 0, GL_RGB, GL_FLOAT, texData.get()); + + float sum = 0.0f; + + for (unsigned int i = 0; i < texDimension; i++) { + float lum = glm::dot( + glm::vec3(texData[i * 3 + 0], texData[i * 3 + 1], texData[i * 3 + 2]), + glm::vec3(0.2126f, 0.7152f, 0.0722f) + ); + sum += logf(lum + 0.00001f); + } + + return expf(sum / texDimension); +} + +float FramebufferRenderer::computeBufferAveLuminanceGPU() { + // Capture standard fbo + GLint defaultFbo; + glGetIntegerv(GL_FRAMEBUFFER_BINDING, &defaultFbo); + + glBindFramebuffer(GL_FRAMEBUFFER, _computeAveLumFBO); + GLenum textureBuffers[1] = { GL_COLOR_ATTACHMENT0 }; + glDrawBuffers(1, textureBuffers); + glClear(GL_COLOR_BUFFER_BIT); + + glViewport(0, 0, 1, 1); + + _aveLumProgram->activate(); + + //float averageLuminaceInFB = computeBufferAveLuminance(); + //std::cout << "=== Average Lum on CPU = " << averageLuminaceInFB << " ===" << std::endl; + + ghoul::opengl::TextureUnit hdrTextureUnit; + hdrTextureUnit.activate(); + glBindTexture(GL_TEXTURE_2D, _hdrFilteringTexture); + _aveLumProgram->setUniform("hdrTexture", hdrTextureUnit); + _aveLumProgram->setUniform("bufferWidth", _resolution.x); + _aveLumProgram->setUniform("bufferHeight", _resolution.y); + + glBindVertexArray(_screenQuad); + glDrawArrays(GL_TRIANGLES, 0, 6); + glBindVertexArray(0); + + _aveLumProgram->deactivate(); + + std::vector gpuAveLum; + saveTextureToMemory(GL_COLOR_ATTACHMENT0, 1, 1, gpuAveLum); + + //std::cout << "=== Average Lum on GPU = " << gpuAveLum[0] << " ===" << std::endl; + + glBindFramebuffer(GL_FRAMEBUFFER, defaultFbo); + glViewport(0, 0, _resolution.x, _resolution.y); + + return static_cast(gpuAveLum[0]); +} + +void FramebufferRenderer::applyBloomFilter() { + GLint defaultFbo; + glGetIntegerv(GL_FRAMEBUFFER_BINDING, &defaultFbo); + + GLuint vao; + glGenVertexArrays(1, &vao); + + glBindFramebuffer(GL_FRAMEBUFFER, _bloomFilterFBO[0]); + glClear(GL_COLOR_BUFFER_BIT); + glViewport(0, 0, _resolution.y, _resolution.x); + glBindVertexArray(vao); + + _bloomProgram->activate(); + + { + ghoul::opengl::TextureUnit filterTextureUnit; + filterTextureUnit.activate(); + glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _mainFilterTexture); + _bloomProgram->setUniform("pass", 1); + _bloomProgram->setUniform("filterImage", filterTextureUnit); + ghoul::opengl::TextureUnit dummyTextureUnit; + dummyTextureUnit.activate(); + glBindTexture(GL_TEXTURE_2D, _bloomTexture[0]); + _bloomProgram->setUniform("filterFirstPass", dummyTextureUnit); + glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); + } + + glBindFramebuffer(GL_FRAMEBUFFER, _bloomFilterFBO[1]); + glViewport(0, 0, _resolution.x, _resolution.y); + glClear(GL_COLOR_BUFFER_BIT); + glBindVertexArray(vao); + + { + ghoul::opengl::TextureUnit filterTextureUnit; + filterTextureUnit.activate(); + glBindTexture(GL_TEXTURE_2D, _bloomTexture[0]); + _bloomProgram->setUniform("pass", 2); + _bloomProgram->setUniform("filterFirstPass", filterTextureUnit); + ghoul::opengl::TextureUnit dummyTextureUnit; + _bloomProgram->setUniform("filterImage", dummyTextureUnit); + + + glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); + } + + _bloomProgram->deactivate(); + + glBindFramebuffer(GL_FRAMEBUFFER, _bloomFilterFBO[2]); + glViewport(0, 0, _resolution.x, _resolution.y); + glClear(GL_COLOR_BUFFER_BIT); + + _bloomResolveProgram->activate(); + + { + ghoul::opengl::TextureUnit deferredResultsTextureUnit; + deferredResultsTextureUnit.activate(); + glBindTexture(GL_TEXTURE_2D, _hdrFilteringTexture); + _bloomResolveProgram->setUniform( + _bloomUniformCache.renderedImage, + deferredResultsTextureUnit + ); + + ghoul::opengl::TextureUnit bloomTextureUnit; + bloomTextureUnit.activate(); + glBindTexture(GL_TEXTURE_2D, _bloomTexture[1]); + _bloomResolveProgram->setUniform(_bloomUniformCache.bloomImage, bloomTextureUnit); + + _bloomResolveProgram->setUniform( + _bloomUniformCache.bloomOrigFactor, + _bloomOrigFactor + ); + _bloomResolveProgram->setUniform( + _bloomUniformCache.bloomNewFactor, + _bloomNewFactor + ); + + glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); + } + + _bloomResolveProgram->deactivate(); + + glBindFramebuffer(GL_FRAMEBUFFER, defaultFbo); +} + void FramebufferRenderer::update() { if (_dirtyMsaaSamplingPattern) { updateMSAASamplingPattern(); @@ -289,12 +519,6 @@ void FramebufferRenderer::update() { updateDeferredcastData(); } - // If the resolve dictionary changed (or a file changed on disk) - // then rebuild the resolve program. - if (_hdrBackGroundProgram && _hdrBackGroundProgram->isDirty()) { - _hdrBackGroundProgram->rebuildFromFile(); - } - if (_resolveProgram->isDirty()) { _resolveProgram->rebuildFromFile(); @@ -303,6 +527,34 @@ void FramebufferRenderer::update() { _uniformCache, UniformNames ); + + } + + if (_aveLumProgram->isDirty()) { + _aveLumProgram->rebuildFromFile(); + } + + if (_bloomProgram->isDirty()) { + _bloomProgram->rebuildFromFile(); + } + + if (_bloomResolveProgram->isDirty()) { + _bloomResolveProgram->rebuildFromFile(); + ghoul::opengl::updateUniformLocations( + *_bloomResolveProgram, + _bloomUniformCache, + BLoomUniformNames + ); + } + + if (_hdrFilteringProgram->isDirty()) { + _hdrFilteringProgram->rebuildFromFile(); + + ghoul::opengl::updateUniformLocations( + *_hdrFilteringProgram, + _hdrUniformCache, + HDRUniformNames + ); } using K = VolumeRaycaster*; @@ -362,14 +614,25 @@ void FramebufferRenderer::updateResolution() { glTexImage2DMultisample( GL_TEXTURE_2D_MULTISAMPLE, _nAaSamples, - GL_RGBA, + GL_RGBA32F, _resolution.x, _resolution.y, true ); - // G-buffer - glBindTexture(GL_TEXTURE_2D, _deferredColorTexture); + glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _mainFilterTexture); + + glTexImage2DMultisample( + GL_TEXTURE_2D_MULTISAMPLE, + _nAaSamples, + GL_RGBA32F, + _resolution.x, + _resolution.y, + true + ); + + // HDR / Filtering + glBindTexture(GL_TEXTURE_2D, _hdrFilteringTexture); glTexImage2D( GL_TEXTURE_2D, @@ -386,6 +649,36 @@ void FramebufferRenderer::updateResolution() { glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + // Average Luminosity Computation Texture + glBindTexture(GL_TEXTURE_2D, _computeAveLumTexture); + glTexImage2D( + GL_TEXTURE_2D, + 0, + GL_RGBA32F, + 1, + 1, + 0, + GL_RGBA, + GL_FLOAT, + nullptr + ); + + // Bloom Filter + for (int i = 0; i < 3; i++) + { + glBindTexture(GL_TEXTURE_2D, _bloomTexture[i]); + glTexStorage2D( + GL_TEXTURE_2D, + 1, + GL_RGBA16F, + i ? _resolution.x : _resolution.y, + i ? _resolution.y : _resolution.x + ); + } + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _mainPositionTexture); glTexImage2DMultisample( @@ -422,7 +715,7 @@ void FramebufferRenderer::updateResolution() { glTexImage2D( GL_TEXTURE_2D, 0, - GL_RGBA16, + GL_RGBA16F, _resolution.x, _resolution.y, 0, @@ -577,15 +870,45 @@ void FramebufferRenderer::updateDeferredcastData() { _dirtyDeferredcastData = false; } -void FramebufferRenderer::updateHDRData() { - _hdrBackGroundProgram = ghoul::opengl::ProgramObject::Build( - "HDR Background Control", - absPath("${SHADERS}/framebuffer/hdrBackground.vert"), - absPath("${SHADERS}/framebuffer/hdrBackground.frag") +void FramebufferRenderer::updateAveLum() { + _aveLumProgram = ghoul::opengl::ProgramObject::Build( + "Computes Average Luminace on GPU", + absPath("${SHADERS}/framebuffer/computeAveLum.vert"), + absPath("${SHADERS}/framebuffer/computeAveLum.frag") ); using IgnoreError = ghoul::opengl::ProgramObject::IgnoreError; - _hdrBackGroundProgram->setIgnoreSubroutineUniformLocationError(IgnoreError::Yes); - _hdrBackGroundProgram->setIgnoreUniformLocationError(IgnoreError::Yes); + //_aveLumProgram->setIgnoreSubroutineUniformLocationError(IgnoreError::Yes); + //_aveLumProgram->setIgnoreUniformLocationError(IgnoreError::Yes); +} + +void FramebufferRenderer::updateBloomConfig() { + _bloomProgram = ghoul::opengl::ProgramObject::Build( + "Appies the Bloom Filter", + absPath("${SHADERS}/framebuffer/bloomFilter.vert"), + absPath("${SHADERS}/framebuffer/bloomFilter.frag") + ); + using IgnoreError = ghoul::opengl::ProgramObject::IgnoreError; + //_bloomProgram->setIgnoreSubroutineUniformLocationError(IgnoreError::Yes); + //_bloomProgram->setIgnoreUniformLocationError(IgnoreError::Yes); + + _bloomResolveProgram = ghoul::opengl::ProgramObject::Build( + "Adds bloom to final image", + absPath("${SHADERS}/framebuffer/bloomResolveFilter.vert"), + absPath("${SHADERS}/framebuffer/bloomResolveFilter.frag") + ); + //_bloomResolveProgram->setIgnoreSubroutineUniformLocationError(IgnoreError::Yes); + //_bloomResolveProgram->setIgnoreUniformLocationError(IgnoreError::Yes); +} + +void FramebufferRenderer::updateHDRAndFiltering() { + _hdrFilteringProgram = ghoul::opengl::ProgramObject::Build( + "HDR and Filtering Program", + absPath("${SHADERS}/framebuffer/hdrAndFiltering.vert"), + absPath("${SHADERS}/framebuffer/hdrAndfiltering.frag") + ); + using IgnoreError = ghoul::opengl::ProgramObject::IgnoreError; + //_hdrFilteringProgram->setIgnoreSubroutineUniformLocationError(IgnoreError::Yes); + //_hdrFilteringProgram->setIgnoreUniformLocationError(IgnoreError::Yes); } void FramebufferRenderer::updateMSAASamplingPattern() { @@ -921,9 +1244,7 @@ void FramebufferRenderer::render(Scene* scene, Camera* camera, float blackoutFac if (!scene || !camera) { return; - } - - glEnable(GL_DEPTH_TEST); + } // Capture standard fbo GLint defaultFbo; @@ -932,18 +1253,20 @@ void FramebufferRenderer::render(Scene* scene, Camera* camera, float blackoutFac glBindFramebuffer(GL_FRAMEBUFFER, _mainFramebuffer); glEnable(GL_DEPTH_TEST); - // deferred g-buffer - GLenum textureBuffers[3] = { + // deferred g-buffer plus filter + GLenum textureBuffers[4] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2, + GL_COLOR_ATTACHMENT3 }; - glDrawBuffers(3, textureBuffers); + glDrawBuffers(4, textureBuffers); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glEnablei(GL_BLEND, 0); glDisablei(GL_BLEND, 1); glDisablei(GL_BLEND, 2); + glDisablei(GL_BLEND, 3); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); Time time = global::timeManager.time(); @@ -977,9 +1300,11 @@ void FramebufferRenderer::render(Scene* scene, Camera* camera, float blackoutFac performRaycasterTasks(tasks.raycasterTasks); } - glBindFramebuffer(GL_FRAMEBUFFER, defaultFbo); + //glBindFramebuffer(GL_FRAMEBUFFER, defaultFbo); + glBindFramebuffer(GL_FRAMEBUFFER, _hdrFilteringFramebuffer); GLenum dBuffer[1] = { GL_COLOR_ATTACHMENT0 }; glDrawBuffers(1, dBuffer); + glClear(GL_COLOR_BUFFER_BIT); { std::unique_ptr perfInternal; @@ -991,6 +1316,7 @@ void FramebufferRenderer::render(Scene* scene, Camera* camera, float blackoutFac performDeferredTasks(tasks.deferredcasterTasks); } + /* if (tasks.deferredcasterTasks.empty()) { glBindFramebuffer(GL_FRAMEBUFFER, defaultFbo); _resolveProgram->activate(); @@ -1008,6 +1334,62 @@ void FramebufferRenderer::render(Scene* scene, Camera* camera, float blackoutFac _resolveProgram->deactivate(); } + */ + + // DEBUG - JCC + { + glDisable(GL_DEPTH_TEST); + + applyBloomFilter(); + + float averageLuminaceInFB = 0.0; + if (_toneMapOperator == + static_cast(openspace::RenderEngine::ToneMapOperators::GLOBAL) + ) + { + averageLuminaceInFB = computeBufferAveLuminanceGPU(); + if (std::isnan(averageLuminaceInFB)) { + averageLuminaceInFB = 1000.0; + } + } + + //float averageLuminaceInFB = 0.5; + + glBindFramebuffer(GL_FRAMEBUFFER, defaultFbo); + glViewport(0, 0, _resolution.x, _resolution.y); + _hdrFilteringProgram->activate(); + + // No Bloom + /*ghoul::opengl::TextureUnit deferredResultsTextureUnit; + deferredResultsTextureUnit.activate(); + glBindTexture(GL_TEXTURE_2D, _hdrFilteringTexture); + _hdrFilteringProgram->setUniform(_hdrUniformCache.deferredResultsTexture, + deferredResultsTextureUnit);*/ + + // Bloom Enabled + ghoul::opengl::TextureUnit bloomResultsTextureUnit; + bloomResultsTextureUnit.activate(); + glBindTexture(GL_TEXTURE_2D, _bloomTexture[2]); + _hdrFilteringProgram->setUniform(_hdrUniformCache.deferredResultsTexture, + bloomResultsTextureUnit); + + _hdrFilteringProgram->setUniform(_hdrUniformCache.blackoutFactor, blackoutFactor); + _hdrFilteringProgram->setUniform(_hdrUniformCache.backgroundConstant, + _hdrBackground); + _hdrFilteringProgram->setUniform(_hdrUniformCache.backgroundExposure, _hdrExposure); + _hdrFilteringProgram->setUniform(_hdrUniformCache.gamma, _gamma); + _hdrFilteringProgram->setUniform(_hdrUniformCache.toneMapOperator, _toneMapOperator); + _hdrFilteringProgram->setUniform(_hdrUniformCache.aveLum, averageLuminaceInFB); + _hdrFilteringProgram->setUniform(_hdrUniformCache.maxWhite, _maxWhite); + + glBindVertexArray(_screenQuad); + glDrawArrays(GL_TRIANGLES, 0, 6); + glBindVertexArray(0); + + _hdrFilteringProgram->deactivate(); + } + + //glBindFramebuffer(GL_FRAMEBUFFER, defaultFbo); } void FramebufferRenderer::performRaycasterTasks(const std::vector& tasks) { @@ -1222,6 +1604,31 @@ void FramebufferRenderer::setGamma(float gamma) { _gamma = gamma; } +void FramebufferRenderer::setMaxWhite(float maxWhite) { + ghoul_assert(gamma > 0.f, "Max White value must be greater than zero"); + _maxWhite = maxWhite; +} + +void FramebufferRenderer::setToneMapOperator(int tmOp) { + _toneMapOperator = tmOp; +} + +void FramebufferRenderer::setBloomThreMin(float minV) { + _bloomThresholdMin = minV; +} + +void FramebufferRenderer::setBloomThreMax(float maxV) { + _bloomThresholdMax = maxV; +} + +void FramebufferRenderer::setBloomOrigFactor(float origFactor) { + _bloomOrigFactor = origFactor; +} + +void FramebufferRenderer::setBloomNewFactor(float newFactor) { + _bloomNewFactor = newFactor; +} + float FramebufferRenderer::hdrBackground() const { return _hdrBackground; } diff --git a/src/rendering/renderengine.cpp b/src/rendering/renderengine.cpp index 0ee89eff7d..47ea110852 100644 --- a/src/rendering/renderengine.cpp +++ b/src/rendering/renderengine.cpp @@ -195,6 +195,43 @@ namespace { "Gamma, is the nonlinear operation used to encode and decode luminance or " "tristimulus values in the image." }; + + constexpr openspace::properties::Property::PropertyInfo MaxWhiteInfo = { + "MaxWhite", + "Max White Value", + "Max value for white color [0.01-10.0] to be used by tone mapping operators." + }; + + constexpr openspace::properties::Property::PropertyInfo BloomThreshouldMinInfo = { + "BloomThreshouldMin", + "Bloom Threshould Min Value", + "Min value a pixel must have to be bloomed." + }; + + constexpr openspace::properties::Property::PropertyInfo BloomThreshouldMaxInfo = { + "BloomThreshouldMax", + "Bloom Threshould Max Value", + "Max value a pixel must have to be bloomed." + }; + + constexpr openspace::properties::Property::PropertyInfo BloomOrigColorFactorInfo = { + "BloomOrigColorFactor", + "Bloom Original Color Factor Value", + "Bloom Original Color Factor Value." + }; + + constexpr openspace::properties::Property::PropertyInfo BloomNewColorFactorInfo = { + "BloomNewColorFactor", + "Bloom New Color Factor Value", + "Bloom New Color Factor Value." + }; + + constexpr openspace::properties::Property::PropertyInfo ToneMapOperatorInfo = { + "ToneMapOperator", + "ToneMap Operator", + "ToneMap Operator is the method used to tranform the pixels using a HDR to" + "pixels using a LDR distribution." + }; } // namespace @@ -216,6 +253,12 @@ RenderEngine::RenderEngine() , _hdrExposure(HDRExposureInfo, 0.4f, 0.01f, 10.0f) , _hdrBackground(BackgroundExposureInfo, 2.8f, 0.01f, 10.0f) , _gamma(GammaInfo, 2.2f, 0.01f, 10.0f) + , _bloomThreshouldMin(BloomThreshouldMinInfo, 0.5, 0.0, 100.0) + , _bloomThreshouldMax(BloomThreshouldMaxInfo, 1.0, 0.0, 100.0) + , _bloomOrigColorFactor(BloomOrigColorFactorInfo, 1.0, 0.0, 100.0) + , _bloomNewColorFactor(BloomNewColorFactorInfo, 1.0, 0.0, 100.0) + , _maxWhite(MaxWhiteInfo, 4.f, 0.001f, 10000.0f) + , _toneMapOperator(ToneMapOperatorInfo, properties::OptionProperty::DisplayType::Dropdown) { _doPerformanceMeasurements.onChange([this](){ global::performanceManager.setEnabled(_doPerformanceMeasurements); @@ -255,6 +298,62 @@ RenderEngine::RenderEngine() }); addProperty(_gamma); + _maxWhite.onChange([this]() { + if (_renderer) { + _renderer->setMaxWhite(_maxWhite); + } + }); + addProperty(_maxWhite); + + _toneMapOperator.addOption(static_cast(ToneMapOperators::EXPONENTIAL), "Exponential"); + _toneMapOperator.addOption(static_cast(ToneMapOperators::LINEAR), "Linear"); + _toneMapOperator.addOption(static_cast(ToneMapOperators::SIMPLE_REINHARD), "Simple Reinhard"); + _toneMapOperator.addOption(static_cast(ToneMapOperators::LUM_BASED_REINHARD), "Lum based Reinhard"); + _toneMapOperator.addOption(static_cast(ToneMapOperators::WHITE_PRESERVING), "White Preserving"); + _toneMapOperator.addOption(static_cast(ToneMapOperators::ROM_BIN_DA_HOUSE), "RomBin da House"); + _toneMapOperator.addOption(static_cast(ToneMapOperators::FILMIC), "Filmic"); + _toneMapOperator.addOption(static_cast(ToneMapOperators::UNCHARTED), "Uncharted 2"); + _toneMapOperator.addOption(static_cast(ToneMapOperators::COSTA), "Costa"); + _toneMapOperator.addOption(static_cast(ToneMapOperators::ADAPTIVE), "Adaptive"); + _toneMapOperator.addOption(static_cast(ToneMapOperators::GLOBAL), "Global"); + _toneMapOperator.set(8); + + _toneMapOperator.onChange([this]() { + if (_renderer) { + _renderer->setToneMapOperator(_toneMapOperator); + } + }); + + addProperty(_toneMapOperator); + + addProperty(_bloomThreshouldMin); + _bloomThreshouldMin.onChange([this]() { + if (_renderer) { + _renderer->setBloomThreMin(_bloomThreshouldMin); + } + }); + + addProperty(_bloomThreshouldMax); + _bloomThreshouldMax.onChange([this]() { + if (_renderer) { + _renderer->setBloomThreMax(_bloomThreshouldMax); + } + }); + + addProperty(_bloomOrigColorFactor); + _bloomOrigColorFactor.onChange([this]() { + if (_renderer) { + _renderer->setBloomOrigFactor(_bloomOrigColorFactor); + } + }); + + addProperty(_bloomNewColorFactor); + _bloomNewColorFactor.onChange([this]() { + if (_renderer) { + _renderer->setBloomNewFactor(_bloomNewColorFactor); + } + }); + addProperty(_applyWarping); _takeScreenshot.onChange([this](){ From 74220828bcc1e097767ed978581ac6ecc3f89fd3 Mon Sep 17 00:00:00 2001 From: Jonathas Costa Date: Fri, 11 Jan 2019 15:21:24 -0500 Subject: [PATCH 02/39] More control over bloom filter. --- include/openspace/rendering/abufferrenderer.h | 3 + .../openspace/rendering/framebufferrenderer.h | 3 + include/openspace/rendering/renderengine.h | 1 + include/openspace/rendering/renderer.h | 2 + shaders/framebuffer/bloomFilter.frag | 11 +- shaders/framebuffer/bloomResolveFilter.frag | 2 +- src/rendering/abufferrenderer.cpp | 4 + src/rendering/framebufferrenderer.cpp | 132 +++++++++++++++--- src/rendering/renderengine.cpp | 17 ++- 9 files changed, 147 insertions(+), 28 deletions(-) diff --git a/include/openspace/rendering/abufferrenderer.h b/include/openspace/rendering/abufferrenderer.h index b669ccade5..bcf8d12204 100644 --- a/include/openspace/rendering/abufferrenderer.h +++ b/include/openspace/rendering/abufferrenderer.h @@ -72,6 +72,8 @@ public: void setBloomOrigFactor(float origFactor) override; void setBloomNewFactor(float newFactor) override; + void enableBloom(bool enable) override; + float hdrBackground() const override; int nAaSamples() const override; const std::vector& mSSAPattern() const override; @@ -143,6 +145,7 @@ private: float _gamma = 2.2f; float _maxWhite = 1.f; float _blackoutFactor; + bool _bloomEnabled = false; float _bloomThresholdMin = 0.0; float _bloomThresholdMax = 1.0; float _bloomOrigFactor = 1.0; diff --git a/include/openspace/rendering/framebufferrenderer.h b/include/openspace/rendering/framebufferrenderer.h index 72fb72a57b..32a40913fd 100644 --- a/include/openspace/rendering/framebufferrenderer.h +++ b/include/openspace/rendering/framebufferrenderer.h @@ -93,6 +93,8 @@ public: void setBloomOrigFactor(float origFactor) override; void setBloomNewFactor(float newFactor) override; + void enableBloom(bool enable) override; + float hdrBackground() const override; int nAaSamples() const override; const std::vector& mSSAPattern() const override; @@ -173,6 +175,7 @@ private: float _hdrBackground = 2.8f; float _gamma = 2.2f; float _maxWhite = 1.0f; + bool _bloomEnabled = false; float _bloomThresholdMin = 0.0; float _bloomThresholdMax = 1.0; float _bloomOrigFactor = 1.0; diff --git a/include/openspace/rendering/renderengine.h b/include/openspace/rendering/renderengine.h index 6078c45500..6ae532abd8 100644 --- a/include/openspace/rendering/renderengine.h +++ b/include/openspace/rendering/renderengine.h @@ -208,6 +208,7 @@ private: properties::FloatProperty _hdrBackground; properties::FloatProperty _gamma; properties::FloatProperty _maxWhite; + properties::BoolProperty _enableBloom; properties::FloatProperty _bloomThreshouldMin; properties::FloatProperty _bloomThreshouldMax; properties::FloatProperty _bloomOrigColorFactor; diff --git a/include/openspace/rendering/renderer.h b/include/openspace/rendering/renderer.h index 0eaac41734..a6a62f8d82 100644 --- a/include/openspace/rendering/renderer.h +++ b/include/openspace/rendering/renderer.h @@ -60,6 +60,8 @@ public: virtual void setBloomOrigFactor(float origFactor) = 0; virtual void setBloomNewFactor(float newFactor) = 0; + virtual void enableBloom(bool enable) = 0; + virtual float hdrBackground() const = 0; virtual int nAaSamples() const = 0; virtual const std::vector& mSSAPattern() const = 0; diff --git a/shaders/framebuffer/bloomFilter.frag b/shaders/framebuffer/bloomFilter.frag index 56b4b795fd..e964803a07 100644 --- a/shaders/framebuffer/bloomFilter.frag +++ b/shaders/framebuffer/bloomFilter.frag @@ -26,7 +26,7 @@ layout (location = 0) out vec4 finalColor; -uniform int pass; +uniform int filterStep; uniform sampler2DMS filterImage; uniform sampler2D filterFirstPass; @@ -62,13 +62,16 @@ void main(void) vec4 color = vec4(0.0); // Transpose the image so the filter can be applied on X and Y ivec2 P = ivec2(gl_FragCoord.yx) - ivec2(0, weights.length() >> 1); - + float origAlpha = 1.0; + for (int i = 0; i < weights.length(); i++) { - if (pass == 1) + if (filterStep == 1) { color += vec4(texelFetch(filterImage, P + ivec2(0, i), 0).rgb, 1.0) * weights[i]; - else if (pass == 2) + origAlpha = color.a; + } else if (filterStep == 2) { color += vec4(texelFetch(filterFirstPass, P + ivec2(0, i), 0).rgb, 1.0) * weights[i]; + } } finalColor = vec4(color.rgb, 1.0); diff --git a/shaders/framebuffer/bloomResolveFilter.frag b/shaders/framebuffer/bloomResolveFilter.frag index fdbc368507..ddc3b73327 100644 --- a/shaders/framebuffer/bloomResolveFilter.frag +++ b/shaders/framebuffer/bloomResolveFilter.frag @@ -38,6 +38,6 @@ void main(void) color += texelFetch(renderedImage, ivec2(gl_FragCoord.xy), 0) * bloomOrigFactor; float alpha = color.a; color += texelFetch(bloomImage, ivec2(gl_FragCoord.xy), 0) * bloomNewFactor; - + finalColor = vec4(color.rgb, alpha); } diff --git a/src/rendering/abufferrenderer.cpp b/src/rendering/abufferrenderer.cpp index c511015d86..f1005a0b35 100644 --- a/src/rendering/abufferrenderer.cpp +++ b/src/rendering/abufferrenderer.cpp @@ -755,6 +755,10 @@ void ABufferRenderer::setBloomNewFactor(float newFactor) { _bloomNewFactor = newFactor; } +void ABufferRenderer::enableBloom(bool enable) { + _bloomEnabled = enable; +} + float ABufferRenderer::hdrBackground() const { return _hdrBackground; } diff --git a/src/rendering/framebufferrenderer.cpp b/src/rendering/framebufferrenderer.cpp index 15063a28c9..f22e52fe73 100644 --- a/src/rendering/framebufferrenderer.cpp +++ b/src/rendering/framebufferrenderer.cpp @@ -266,7 +266,13 @@ void FramebufferRenderer::initialize() { for (int i = 0; i < 3; i++) { glBindFramebuffer(GL_FRAMEBUFFER, _bloomFilterFBO[i]); - glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, _bloomTexture[i], 0); + glFramebufferTexture2D( + GL_FRAMEBUFFER, + GL_COLOR_ATTACHMENT0, + GL_TEXTURE_2D, + _bloomTexture[i], + 0 + ); glDrawBuffers(1, buffers); } @@ -425,46 +431,67 @@ void FramebufferRenderer::applyBloomFilter() { glGenVertexArrays(1, &vao); glBindFramebuffer(GL_FRAMEBUFFER, _bloomFilterFBO[0]); + GLenum textureBuffer[] = { + GL_COLOR_ATTACHMENT0 + }; + glDrawBuffers(1, textureBuffer); glClear(GL_COLOR_BUFFER_BIT); glViewport(0, 0, _resolution.y, _resolution.x); glBindVertexArray(vao); - _bloomProgram->activate(); + _bloomProgram->activate(); { ghoul::opengl::TextureUnit filterTextureUnit; filterTextureUnit.activate(); + // The filter texture where the gaussian filter will be applied glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _mainFilterTexture); - _bloomProgram->setUniform("pass", 1); + _bloomProgram->setUniform("filterStep", 1); _bloomProgram->setUniform("filterImage", filterTextureUnit); + + // Making OpenGL happy... ghoul::opengl::TextureUnit dummyTextureUnit; dummyTextureUnit.activate(); glBindTexture(GL_TEXTURE_2D, _bloomTexture[0]); _bloomProgram->setUniform("filterFirstPass", dummyTextureUnit); + glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); + glFlush(); } + + _bloomProgram->deactivate(); glBindFramebuffer(GL_FRAMEBUFFER, _bloomFilterFBO[1]); + glDrawBuffers(1, textureBuffer); glViewport(0, 0, _resolution.x, _resolution.y); glClear(GL_COLOR_BUFFER_BIT); glBindVertexArray(vao); + _bloomProgram->activate(); + { ghoul::opengl::TextureUnit filterTextureUnit; filterTextureUnit.activate(); + // The results of the previous pass is passed to this pass glBindTexture(GL_TEXTURE_2D, _bloomTexture[0]); - _bloomProgram->setUniform("pass", 2); + _bloomProgram->setUniform("filterStep", 2); _bloomProgram->setUniform("filterFirstPass", filterTextureUnit); + + // Making OpenGL happy... ghoul::opengl::TextureUnit dummyTextureUnit; + dummyTextureUnit.activate(); + glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _mainFilterTexture); _bloomProgram->setUniform("filterImage", dummyTextureUnit); - glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); + + glFlush(); } _bloomProgram->deactivate(); glBindFramebuffer(GL_FRAMEBUFFER, _bloomFilterFBO[2]); + glDrawBuffers(1, textureBuffer); glViewport(0, 0, _resolution.x, _resolution.y); glClear(GL_COLOR_BUFFER_BIT); @@ -473,6 +500,7 @@ void FramebufferRenderer::applyBloomFilter() { { ghoul::opengl::TextureUnit deferredResultsTextureUnit; deferredResultsTextureUnit.activate(); + // Original buffer will be summed to the bloom result glBindTexture(GL_TEXTURE_2D, _hdrFilteringTexture); _bloomResolveProgram->setUniform( _bloomUniformCache.renderedImage, @@ -481,6 +509,7 @@ void FramebufferRenderer::applyBloomFilter() { ghoul::opengl::TextureUnit bloomTextureUnit; bloomTextureUnit.activate(); + // Results of the second pass are added to the original buffer glBindTexture(GL_TEXTURE_2D, _bloomTexture[1]); _bloomResolveProgram->setUniform(_bloomUniformCache.bloomImage, bloomTextureUnit); @@ -493,10 +522,12 @@ void FramebufferRenderer::applyBloomFilter() { _bloomNewFactor ); + // Write the results to the _bloomDilterFBO[2] texture glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); + glFlush(); } - _bloomResolveProgram->deactivate(); + _bloomResolveProgram->deactivate(); glBindFramebuffer(GL_FRAMEBUFFER, defaultFbo); } @@ -527,7 +558,6 @@ void FramebufferRenderer::update() { _uniformCache, UniformNames ); - } if (_aveLumProgram->isDirty()) { @@ -663,10 +693,24 @@ void FramebufferRenderer::updateResolution() { nullptr ); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + // Bloom Filter for (int i = 0; i < 3; i++) { glBindTexture(GL_TEXTURE_2D, _bloomTexture[i]); + /*glTexImage2D( + GL_TEXTURE_2D, + 0, + GL_RGBA16F, + i ? _resolution.x : _resolution.y, + i ? _resolution.y : _resolution.x, + 0, + GL_RGBA, + GL_FLOAT, + nullptr + );*/ glTexStorage2D( GL_TEXTURE_2D, 1, @@ -676,8 +720,44 @@ void FramebufferRenderer::updateResolution() { ); } - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + /*glBindTexture(GL_TEXTURE_2D, _bloomTexture[0]); + glTexImage2D( + GL_TEXTURE_2D, + 0, + GL_RGBA32F, + _resolution.y, + _resolution.x, + 0, + GL_RGBA, + GL_FLOAT, + nullptr + ); + + glBindTexture(GL_TEXTURE_2D, _bloomTexture[1]); + glTexImage2D( + GL_TEXTURE_2D, + 0, + GL_RGBA32F, + _resolution.x, + _resolution.y, + 0, + GL_RGBA, + GL_FLOAT, + nullptr + ); + + glBindTexture(GL_TEXTURE_2D, _bloomTexture[2]); + glTexImage2D( + GL_TEXTURE_2D, + 0, + GL_RGBA32F, + _resolution.x, + _resolution.y, + 0, + GL_RGBA, + GL_FLOAT, + nullptr + );*/ glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _mainPositionTexture); @@ -1340,6 +1420,7 @@ void FramebufferRenderer::render(Scene* scene, Camera* camera, float blackoutFac { glDisable(GL_DEPTH_TEST); + // Results of the DeferredTasks as entry for the bloom filter applyBloomFilter(); float averageLuminaceInFB = 0.0; @@ -1359,20 +1440,23 @@ void FramebufferRenderer::render(Scene* scene, Camera* camera, float blackoutFac glViewport(0, 0, _resolution.x, _resolution.y); _hdrFilteringProgram->activate(); - // No Bloom - /*ghoul::opengl::TextureUnit deferredResultsTextureUnit; - deferredResultsTextureUnit.activate(); - glBindTexture(GL_TEXTURE_2D, _hdrFilteringTexture); - _hdrFilteringProgram->setUniform(_hdrUniformCache.deferredResultsTexture, - deferredResultsTextureUnit);*/ - - // Bloom Enabled - ghoul::opengl::TextureUnit bloomResultsTextureUnit; - bloomResultsTextureUnit.activate(); - glBindTexture(GL_TEXTURE_2D, _bloomTexture[2]); - _hdrFilteringProgram->setUniform(_hdrUniformCache.deferredResultsTexture, - bloomResultsTextureUnit); + ghoul::opengl::TextureUnit hdrFeedingTextureUnit; + hdrFeedingTextureUnit.activate(); + if (_bloomEnabled) { + // Bloom Enabled + glBindTexture(GL_TEXTURE_2D, _bloomTexture[2]); + } + else { + // No Bloom + glBindTexture(GL_TEXTURE_2D, _hdrFilteringTexture); + } + _hdrFilteringProgram->setUniform( + _hdrUniformCache.deferredResultsTexture, + hdrFeedingTextureUnit + ); + + _hdrFilteringProgram->setUniform(_hdrUniformCache.blackoutFactor, blackoutFactor); _hdrFilteringProgram->setUniform(_hdrUniformCache.backgroundConstant, _hdrBackground); @@ -1629,6 +1713,10 @@ void FramebufferRenderer::setBloomNewFactor(float newFactor) { _bloomNewFactor = newFactor; } +void FramebufferRenderer::enableBloom(bool enable) { + _bloomEnabled = enable; +} + float FramebufferRenderer::hdrBackground() const { return _hdrBackground; } diff --git a/src/rendering/renderengine.cpp b/src/rendering/renderengine.cpp index 47ea110852..5595e0e1b0 100644 --- a/src/rendering/renderengine.cpp +++ b/src/rendering/renderengine.cpp @@ -232,6 +232,12 @@ namespace { "ToneMap Operator is the method used to tranform the pixels using a HDR to" "pixels using a LDR distribution." }; + + constexpr openspace::properties::Property::PropertyInfo EnableBloomInfo = { + "EnableBloom", + "Enable/Disable Bloom", + "Enable/Disable Bloom." + }; } // namespace @@ -253,11 +259,12 @@ RenderEngine::RenderEngine() , _hdrExposure(HDRExposureInfo, 0.4f, 0.01f, 10.0f) , _hdrBackground(BackgroundExposureInfo, 2.8f, 0.01f, 10.0f) , _gamma(GammaInfo, 2.2f, 0.01f, 10.0f) + , _maxWhite(MaxWhiteInfo, 4.f, 0.001f, 10000.0f) + , _enableBloom(EnableBloomInfo, false) , _bloomThreshouldMin(BloomThreshouldMinInfo, 0.5, 0.0, 100.0) , _bloomThreshouldMax(BloomThreshouldMaxInfo, 1.0, 0.0, 100.0) , _bloomOrigColorFactor(BloomOrigColorFactorInfo, 1.0, 0.0, 100.0) , _bloomNewColorFactor(BloomNewColorFactorInfo, 1.0, 0.0, 100.0) - , _maxWhite(MaxWhiteInfo, 4.f, 0.001f, 10000.0f) , _toneMapOperator(ToneMapOperatorInfo, properties::OptionProperty::DisplayType::Dropdown) { _doPerformanceMeasurements.onChange([this](){ @@ -326,6 +333,14 @@ RenderEngine::RenderEngine() addProperty(_toneMapOperator); + _enableBloom.onChange([this]() { + if (_renderer) { + _renderer->enableBloom(_enableBloom); + } + }); + + addProperty(_enableBloom); + addProperty(_bloomThreshouldMin); _bloomThreshouldMin.onChange([this]() { if (_renderer) { From a49fcb3e539665d4c7ab796d2ff8e651c5726916 Mon Sep 17 00:00:00 2001 From: Jonathas Costa Date: Mon, 14 Jan 2019 14:30:51 -0500 Subject: [PATCH 03/39] Fixed texture scale for HDR. --- .../shaders/atmosphere_deferred_fs.glsl | 3 +- src/rendering/framebufferrenderer.cpp | 63 +++---------------- 2 files changed, 12 insertions(+), 54 deletions(-) diff --git a/modules/atmosphere/shaders/atmosphere_deferred_fs.glsl b/modules/atmosphere/shaders/atmosphere_deferred_fs.glsl index cf3d8bc928..927240acc5 100644 --- a/modules/atmosphere/shaders/atmosphere_deferred_fs.glsl +++ b/modules/atmosphere/shaders/atmosphere_deferred_fs.glsl @@ -708,7 +708,8 @@ void main() { } bColor /= float(nAaSamples); //renderTarget = vec4(HDR(bColor.xyz * backgroundConstant, atmExposure), bColor.a); - renderTarget = vec4(bColor.xyz * backgroundConstant, bColor.a); + //renderTarget = vec4(bColor.xyz * backgroundConstant, bColor.a); + renderTarget = vec4(bColor.xyz , bColor.a); } else { discard; diff --git a/src/rendering/framebufferrenderer.cpp b/src/rendering/framebufferrenderer.cpp index f22e52fe73..7a04b6d325 100644 --- a/src/rendering/framebufferrenderer.cpp +++ b/src/rendering/framebufferrenderer.cpp @@ -274,11 +274,11 @@ void FramebufferRenderer::initialize() { 0 ); glDrawBuffers(1, buffers); - } - - status = glCheckFramebufferStatus(GL_FRAMEBUFFER); - if (status != GL_FRAMEBUFFER_COMPLETE) { - LERROR("Bloom framebuffer is not complete"); + + status = glCheckFramebufferStatus(GL_FRAMEBUFFER); + if (status != GL_FRAMEBUFFER_COMPLETE) { + LERROR(fmt::format("Bloom framebuffer {} is not complete", i)); + } } // JCC: Moved to here to avoid NVidia: "Program/shader state performance warning" @@ -452,7 +452,7 @@ void FramebufferRenderer::applyBloomFilter() { // Making OpenGL happy... ghoul::opengl::TextureUnit dummyTextureUnit; dummyTextureUnit.activate(); - glBindTexture(GL_TEXTURE_2D, _bloomTexture[0]); + glBindTexture(GL_TEXTURE_2D, _bloomTexture[2]); _bloomProgram->setUniform("filterFirstPass", dummyTextureUnit); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); @@ -700,7 +700,7 @@ void FramebufferRenderer::updateResolution() { for (int i = 0; i < 3; i++) { glBindTexture(GL_TEXTURE_2D, _bloomTexture[i]); - /*glTexImage2D( + glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA16F, @@ -710,55 +710,12 @@ void FramebufferRenderer::updateResolution() { GL_RGBA, GL_FLOAT, nullptr - );*/ - glTexStorage2D( - GL_TEXTURE_2D, - 1, - GL_RGBA16F, - i ? _resolution.x : _resolution.y, - i ? _resolution.y : _resolution.x ); + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); } - /*glBindTexture(GL_TEXTURE_2D, _bloomTexture[0]); - glTexImage2D( - GL_TEXTURE_2D, - 0, - GL_RGBA32F, - _resolution.y, - _resolution.x, - 0, - GL_RGBA, - GL_FLOAT, - nullptr - ); - - glBindTexture(GL_TEXTURE_2D, _bloomTexture[1]); - glTexImage2D( - GL_TEXTURE_2D, - 0, - GL_RGBA32F, - _resolution.x, - _resolution.y, - 0, - GL_RGBA, - GL_FLOAT, - nullptr - ); - - glBindTexture(GL_TEXTURE_2D, _bloomTexture[2]); - glTexImage2D( - GL_TEXTURE_2D, - 0, - GL_RGBA32F, - _resolution.x, - _resolution.y, - 0, - GL_RGBA, - GL_FLOAT, - nullptr - );*/ - glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _mainPositionTexture); glTexImage2DMultisample( From 3fea974f9348c1d32729186a45a8aa721e935fa2 Mon Sep 17 00:00:00 2001 From: Jonathas Costa Date: Tue, 5 Feb 2019 11:31:56 -0500 Subject: [PATCH 04/39] Added new tone mapping operator and enblead back the background color control. --- include/openspace/rendering/renderengine.h | 3 ++- modules/atmosphere/shaders/atmosphere_deferred_fs.glsl | 4 ++-- shaders/framebuffer/hdrAndFiltering.frag | 3 +++ shaders/hdr.glsl | 5 +++++ src/rendering/renderengine.cpp | 1 + 5 files changed, 13 insertions(+), 3 deletions(-) diff --git a/include/openspace/rendering/renderengine.h b/include/openspace/rendering/renderengine.h index 6ae532abd8..239a5faa18 100644 --- a/include/openspace/rendering/renderengine.h +++ b/include/openspace/rendering/renderengine.h @@ -75,7 +75,8 @@ public: UNCHARTED, COSTA, ADAPTIVE, - GLOBAL + GLOBAL, + PHOTOGRAPHIC_REINHARD }; RenderEngine(); diff --git a/modules/atmosphere/shaders/atmosphere_deferred_fs.glsl b/modules/atmosphere/shaders/atmosphere_deferred_fs.glsl index 927240acc5..deb258f12c 100644 --- a/modules/atmosphere/shaders/atmosphere_deferred_fs.glsl +++ b/modules/atmosphere/shaders/atmosphere_deferred_fs.glsl @@ -708,8 +708,8 @@ void main() { } bColor /= float(nAaSamples); //renderTarget = vec4(HDR(bColor.xyz * backgroundConstant, atmExposure), bColor.a); - //renderTarget = vec4(bColor.xyz * backgroundConstant, bColor.a); - renderTarget = vec4(bColor.xyz , bColor.a); + renderTarget = vec4(bColor.xyz * backgroundConstant, bColor.a); + //renderTarget = vec4(bColor.xyz , bColor.a); } else { discard; diff --git a/shaders/framebuffer/hdrAndFiltering.frag b/shaders/framebuffer/hdrAndFiltering.frag index 26ab41b9bc..64e3a5b993 100644 --- a/shaders/framebuffer/hdrAndFiltering.frag +++ b/shaders/framebuffer/hdrAndFiltering.frag @@ -116,5 +116,8 @@ void main() { } else if (toneMapOperator == GLOBAL) { vec3 tColor = globalToneMappingOperatorRTR(color.rgb, backgroundExposure, maxWhite, aveLum); finalColor = vec4(gammaCorrection(tColor, gamma), color.a); + } else if (toneMapOperator == PHOTOGRAPHIC_REINHARD) { + vec3 tColor = photographicReinhardToneMapping(color.rgb, backgroundExposure); + finalColor = vec4(gammaCorrection(tColor, gamma), color.a); } } \ No newline at end of file diff --git a/shaders/hdr.glsl b/shaders/hdr.glsl index e3c1384d73..5902c7a846 100644 --- a/shaders/hdr.glsl +++ b/shaders/hdr.glsl @@ -33,6 +33,7 @@ #define COSTA 8 #define ADAPTIVE 9 #define GLOBAL 10 +#define PHOTOGRAPHIC_REINHARD 11 const mat3 rgb2xyz = mat3( 0.4124564, 0.2126729, 0.0193339, @@ -94,6 +95,10 @@ vec3 lumaBasedReinhardToneMapping(vec3 color, float exposure) { return color; } +vec3 photographicReinhardToneMapping(vec3 color, float exposure) { + return color / (color + vec3(1.0)); +} + vec3 whitePreservingLumaBasedReinhardToneMapping(vec3 color, float exposure, float maxWhite) { //float luma = dot(color, vec3(0.2126f, 0.7152f, 0.0722f)); float luma = dot(color, vec3(0.4126f, 0.9152f, 0.2722f)); diff --git a/src/rendering/renderengine.cpp b/src/rendering/renderengine.cpp index 5595e0e1b0..3fe10c6a2b 100644 --- a/src/rendering/renderengine.cpp +++ b/src/rendering/renderengine.cpp @@ -323,6 +323,7 @@ RenderEngine::RenderEngine() _toneMapOperator.addOption(static_cast(ToneMapOperators::COSTA), "Costa"); _toneMapOperator.addOption(static_cast(ToneMapOperators::ADAPTIVE), "Adaptive"); _toneMapOperator.addOption(static_cast(ToneMapOperators::GLOBAL), "Global"); + _toneMapOperator.addOption(static_cast(ToneMapOperators::PHOTOGRAPHIC_REINHARD), "Photographic Reinhard"); _toneMapOperator.set(8); _toneMapOperator.onChange([this]() { From f7d2f065d1cf202e4458d5d5bab727a94a10b0fc Mon Sep 17 00:00:00 2001 From: Jonathas Costa Date: Fri, 15 Feb 2019 11:42:15 -0500 Subject: [PATCH 05/39] Added faster TMO by mipmapping. Added image control, histogram, etc. --- include/openspace/rendering/abufferrenderer.h | 2 + .../openspace/rendering/framebufferrenderer.h | 42 +- include/openspace/rendering/renderengine.h | 23 +- include/openspace/rendering/renderer.h | 10 +- openspace.cfg | 2 +- shaders/framebuffer/computeAveLum.frag | 2 +- shaders/framebuffer/computeHistogram_fs.glsl | 35 ++ shaders/framebuffer/computeHistogram_vs.glsl | 63 +++ shaders/framebuffer/computeTMO_fs.glsl | 82 ++++ shaders/framebuffer/computeTMO_vs.glsl | 33 ++ shaders/framebuffer/hdrAndFiltering.frag | 20 +- shaders/hdr.glsl | 132 ++++++- src/rendering/abufferrenderer.cpp | 4 + src/rendering/framebufferrenderer.cpp | 361 +++++++++++++++++- src/rendering/renderengine.cpp | 161 +++++++- 15 files changed, 931 insertions(+), 41 deletions(-) create mode 100644 shaders/framebuffer/computeHistogram_fs.glsl create mode 100644 shaders/framebuffer/computeHistogram_vs.glsl create mode 100644 shaders/framebuffer/computeTMO_fs.glsl create mode 100644 shaders/framebuffer/computeTMO_vs.glsl diff --git a/include/openspace/rendering/abufferrenderer.h b/include/openspace/rendering/abufferrenderer.h index bcf8d12204..51179398c3 100644 --- a/include/openspace/rendering/abufferrenderer.h +++ b/include/openspace/rendering/abufferrenderer.h @@ -73,6 +73,7 @@ public: void setBloomNewFactor(float newFactor) override; void enableBloom(bool enable) override; + void enableHistogram(bool enable) override; float hdrBackground() const override; int nAaSamples() const override; @@ -151,6 +152,7 @@ private: float _bloomOrigFactor = 1.0; float _bloomNewFactor = 1.0; int _toneMapOperator = 0; + bool _histogramEnabled = false; std::vector _mSAAPattern; diff --git a/include/openspace/rendering/framebufferrenderer.h b/include/openspace/rendering/framebufferrenderer.h index 32a40913fd..57f20c2ca1 100644 --- a/include/openspace/rendering/framebufferrenderer.h +++ b/include/openspace/rendering/framebufferrenderer.h @@ -79,6 +79,8 @@ public: void updateHDRAndFiltering(); void updateAveLum(); void updateBloomConfig(); + void updateHistogramConfig(); + void updateTMOViaMipMappingConfig(); void updateMSAASamplingPattern(); void setResolution(glm::ivec2 res) override; @@ -92,8 +94,16 @@ public: void setBloomThreMax(float maxV) override; void setBloomOrigFactor(float origFactor) override; void setBloomNewFactor(float newFactor) override; + void setKey(float key); + void setYwhite(float white); + void setTmoSaturation(float sat); + void setHue(float hue); + void setValue(float value); + void setSaturation(float sat); + void setLightness(float lightness); void enableBloom(bool enable) override; + void enableHistogram(bool enable) override; float hdrBackground() const override; int nAaSamples() const override; @@ -119,6 +129,8 @@ private: float computeBufferAveLuminance(); float computeBufferAveLuminanceGPU(); void applyBloomFilter(); + void computeImageHistogram(); + void computeMipMappingFromHDRBuffer(GLuint oglImageBuffer); private: std::map _raycastData; @@ -133,17 +145,26 @@ private: std::unique_ptr _aveLumProgram; std::unique_ptr _bloomProgram; std::unique_ptr _bloomResolveProgram; + std::unique_ptr _histoProgram; + std::unique_ptr _histoApplyProgram; + std::unique_ptr _tmoProgram; std::unique_ptr _resolveProgram; UniformCache(mainColorTexture, blackoutFactor, nAaSamples) _uniformCache; UniformCache(deferredResultsTexture, blackoutFactor, backgroundConstant, - backgroundExposure, gamma, toneMapOperator, aveLum, maxWhite) + backgroundExposure, gamma, toneMapOperator, aveLum, maxWhite, + Hue, Saturation, Value, Lightness) _hdrUniformCache; UniformCache(renderedImage, bloomImage, bloomThresholdMin, bloomThresholdMax, bloomOrigFactor, bloomNewFactor) _bloomUniformCache; + UniformCache(renderedImage, maxWhite, imageWidth, + imageHeight) _histoUniformCache; + + UniformCache(hdrSampler, key, Ywhite, sat) _tmoUniformCache; + GLuint _screenQuad; GLuint _vertexPositionBuffer; GLuint _mainColorTexture; @@ -157,6 +178,10 @@ private: GLuint _exitFramebuffer; GLuint _hdrFilteringFramebuffer; GLuint _hdrFilteringTexture; + GLuint _histoFramebuffer; + GLuint _histoTexture; + GLuint _histoVao; + GLuint _histoVbo; GLuint _bloomFilterFBO[3]; GLuint _bloomTexture[3]; @@ -164,6 +189,11 @@ private: GLuint _computeAveLumFBO; GLuint _computeAveLumTexture; + // New TMO via mipmapping + GLuint _tmoTexture; + GLuint _tmoFramebuffer; + GLuint _tmoHdrSampler; + bool _dirtyDeferredcastData; bool _dirtyRaycastData; bool _dirtyResolution; @@ -181,8 +211,18 @@ private: float _bloomOrigFactor = 1.0; float _bloomNewFactor = 1.0; int _toneMapOperator = 0; + bool _histogramEnabled = false; + int _numberOfBins = 1024; // JCC TODO: Add a parameter control for this. + float _tmoKey = 0.18f; + float _tmoYwhite = 1e6f; + float _tmoSaturation = 1.0f; + float _hue = 1.f; + float _saturation = 1.f; + float _value = 1.f; + float _lightness = 1.f; std::vector _mSAAPattern; + std::vector _histoPoints; ghoul::Dictionary _rendererData; }; diff --git a/include/openspace/rendering/renderengine.h b/include/openspace/rendering/renderengine.h index 239a5faa18..20d06223c2 100644 --- a/include/openspace/rendering/renderengine.h +++ b/include/openspace/rendering/renderengine.h @@ -205,16 +205,31 @@ private: float _currentFadeTime = 0.f; int _fadeDirection = 0; properties::IntProperty _nAaSamples; - properties::FloatProperty _hdrExposure; - properties::FloatProperty _hdrBackground; - properties::FloatProperty _gamma; - properties::FloatProperty _maxWhite; + + + properties::PropertyOwner _bloomOwner; properties::BoolProperty _enableBloom; properties::FloatProperty _bloomThreshouldMin; properties::FloatProperty _bloomThreshouldMax; properties::FloatProperty _bloomOrigColorFactor; properties::FloatProperty _bloomNewColorFactor; + + properties::PropertyOwner _tmoOwner; + properties::FloatProperty _hdrExposure; + properties::FloatProperty _hdrBackground; + properties::FloatProperty _maxWhite; properties::OptionProperty _toneMapOperator; + properties::FloatProperty _tmoKey; + properties::FloatProperty _tmoYwhite; + properties::FloatProperty _tmoSaturation; + + properties::PropertyOwner _imageOwner; + properties::FloatProperty _gamma; + properties::FloatProperty _hue; + properties::FloatProperty _saturation; + properties::FloatProperty _value; + properties::FloatProperty _lightness; + uint64_t _frameNumber = 0; diff --git a/include/openspace/rendering/renderer.h b/include/openspace/rendering/renderer.h index a6a62f8d82..29dc9a0d55 100644 --- a/include/openspace/rendering/renderer.h +++ b/include/openspace/rendering/renderer.h @@ -59,8 +59,16 @@ public: virtual void setBloomThreMax(float maxV) = 0; virtual void setBloomOrigFactor(float origFactor) = 0; virtual void setBloomNewFactor(float newFactor) = 0; - + virtual void setKey(float key) = 0; + virtual void setYwhite(float white) = 0; + virtual void setTmoSaturation(float sat) = 0; + virtual void setHue(float hue) = 0; + virtual void setValue(float value) = 0; + virtual void setSaturation(float sat) = 0; + virtual void setLightness(float lightness) = 0; + virtual void enableBloom(bool enable) = 0; + virtual void enableHistogram(bool enable) = 0; virtual float hdrBackground() const = 0; virtual int nAaSamples() const = 0; diff --git a/openspace.cfg b/openspace.cfg index 58e0446fca..d311247fea 100644 --- a/openspace.cfg +++ b/openspace.cfg @@ -162,7 +162,7 @@ LoadingScreen = { ShowNodeNames = true, ShowProgressbar = false } -CheckOpenGLState = false +CheckOpenGLState = true LogEachOpenGLCall = false ShutdownCountdown = 3 diff --git a/shaders/framebuffer/computeAveLum.frag b/shaders/framebuffer/computeAveLum.frag index faa3bde1f8..a4b4cc2f50 100644 --- a/shaders/framebuffer/computeAveLum.frag +++ b/shaders/framebuffer/computeAveLum.frag @@ -43,7 +43,7 @@ void main() { vec2 texCoord = vec2(float(i) / fH, float(j) / fW); vec4 tmpColor = texture(hdrTexture, texCoord); float lum = dot(tmpColor.xyz, vec3(0.2126f, 0.7152f, 0.0722f)); - sum += log(lum + 0.00001); + sum += log(lum + 0.00001); // 0.00001 to avoid log(0) from black pixels } } diff --git a/shaders/framebuffer/computeHistogram_fs.glsl b/shaders/framebuffer/computeHistogram_fs.glsl new file mode 100644 index 0000000000..066da34759 --- /dev/null +++ b/shaders/framebuffer/computeHistogram_fs.glsl @@ -0,0 +1,35 @@ +/***************************************************************************************** + * * + * OpenSpace * + * * + * Copyright (c) 2014-2018 * + * * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this * + * software and associated documentation files (the "Software"), to deal in the Software * + * without restriction, including without limitation the rights to use, copy, modify, * + * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to * + * permit persons to whom the Software is furnished to do so, subject to the following * + * conditions: * + * * + * The above copyright notice and this permission notice shall be included in all copies * + * or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, * + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A * + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT * + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF * + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + ****************************************************************************************/ + +#version __CONTEXT__ + +layout (location = 0) out vec4 finalColor; + +in vec3 pColor; + +void main() +{ + //finalColor = vec4(1.0, 0.0, 0.0, 1.0); + finalColor = vec4(pColor, 1.0); +} \ No newline at end of file diff --git a/shaders/framebuffer/computeHistogram_vs.glsl b/shaders/framebuffer/computeHistogram_vs.glsl new file mode 100644 index 0000000000..e03b268311 --- /dev/null +++ b/shaders/framebuffer/computeHistogram_vs.glsl @@ -0,0 +1,63 @@ +/***************************************************************************************** + * * + * OpenSpace * + * * + * Copyright (c) 2014-2018 * + * * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this * + * software and associated documentation files (the "Software"), to deal in the Software * + * without restriction, including without limitation the rights to use, copy, modify, * + * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to * + * permit persons to whom the Software is furnished to do so, subject to the following * + * conditions: * + * * + * The above copyright notice and this permission notice shall be included in all copies * + * or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, * + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A * + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT * + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF * + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + ****************************************************************************************/ + +#version __CONTEXT__ + +layout(location = 0) in vec4 pixelCoord; + +uniform float maxWhite; +//uniform int numberOfPixels; +//uniform int numberOfBins; +uniform float imageWidth; +uniform float imageHeight; + +uniform sampler2D renderedImage; + +flat out vec3 pColor; + +void main() +{ + vec2 texCoord; + texCoord.x = float(int(pixelCoord.x / imageWidth)) / imageWidth; + texCoord.y = float(int(pixelCoord.x) % int(imageWidth)) / imageHeight; + vec3 pixelColor = texture(renderedImage, texCoord).xyz; + pColor = pixelColor; + float pixelLuminosity = dot(pixelColor, vec3(0.2126f, 0.7152f, 0.0722f)); + + //gl_Position = vec4(-1.0 + (2.0 * pixelLuminosity / maxWhite), 0.0, 0.0, 1.0); + + //gl_Position = vec4(2.0 * texCoord - vec2(1.0), 0.0, 1.0); + + //gl_Position = vec4(0.5, 2.0 * texCoord.y - 1.0, 0.0, 1.0); + + //gl_Position = vec4(-1.0 + (pixelLuminosity * 0.0078125), -1.0, 0.0, 1.0); + + //gl_Position = vec4(0.5, -1.0 + (pixelLuminosity * 0.0078125), 0.0, 1.0); + + //gl_Position = vec4(0.0, -1.0 + (2.0 * pixelLuminosity / maxWhite), 0.0, 1.0); + + gl_Position = vec4((2.0 * pixelLuminosity / maxWhite) - 1.0, 2.0 * texCoord.y - 1.0, 0.0, 1.0); + + gl_PointSize = 1.0; +} \ No newline at end of file diff --git a/shaders/framebuffer/computeTMO_fs.glsl b/shaders/framebuffer/computeTMO_fs.glsl new file mode 100644 index 0000000000..d8b2fc16b6 --- /dev/null +++ b/shaders/framebuffer/computeTMO_fs.glsl @@ -0,0 +1,82 @@ +/***************************************************************************************** + * * + * OpenSpace * + * * + * Copyright (c) 2014-2018 * + * * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this * + * software and associated documentation files (the "Software"), to deal in the Software * + * without restriction, including without limitation the rights to use, copy, modify, * + * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to * + * permit persons to whom the Software is furnished to do so, subject to the following * + * conditions: * + * * + * The above copyright notice and this permission notice shall be included in all copies * + * or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, * + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A * + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT * + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF * + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + ****************************************************************************************/ + +#version __CONTEXT__ + +#include "hdr.glsl" + +layout (location = 0) out vec4 finalColor; + +uniform float key; +uniform float Ywhite; +uniform float sat; + +uniform sampler2D hdrSampler; + +in vec2 texCoord; + +vec3 toneMapGlobal(vec3 hdrColor, float logAvgLum) { + vec3 XYZ = srgbToXYZ(hdrColor); + + float Y = (key / logAvgLum) * XYZ.y; + float Yd = (Y * (1.0 + Y/(Ywhite * Ywhite))) / (1.0 + Y); + + return pow(hdrColor / XYZ.y, vec3(sat)) * Yd; +} + +vec3 toneMapLocal(vec3 hdrColor, float logAvgLum) { + vec3 XYZ = srgbToXYZ(hdrColor); + + float Y = (key / logAvgLum) * XYZ.y; + float LocalAdaptation; + float factor = key / logAvgLum; + float epsilon = 0.05; + float phi = 8.0; + float scale[7] = float[7](1, 2, 4, 8, 16, 32, 64); + + for (int i = 0; i < 7; ++i) { + float V1 = exp(texture(hdrSampler, texCoord, i).a) * factor; + float V2 = exp(texture(hdrSampler, texCoord, i+1).a) * factor; + + if ( abs(V1-V2) / ((key * pow(2, phi) / (scale[i] * scale[i])) + V1) + > epsilon ) { + LocalAdaptation = V1; + break; + } else { + LocalAdaptation = V2; + } + } + + float Yd = Y / (1.0 + LocalAdaptation); + + return pow(hdrColor / XYZ.y, vec3(sat)) * Yd; +} + +void main() { + vec3 hdrColor = texture(hdrSampler, texCoord).rgb; + + float logAvgLum = exp(texture(hdrSampler, texCoord, 20).a); + + finalColor.rgb = toneMapGlobal(hdrColor, logAvgLum); +} diff --git a/shaders/framebuffer/computeTMO_vs.glsl b/shaders/framebuffer/computeTMO_vs.glsl new file mode 100644 index 0000000000..2ddb63b462 --- /dev/null +++ b/shaders/framebuffer/computeTMO_vs.glsl @@ -0,0 +1,33 @@ +/***************************************************************************************** + * * + * OpenSpace * + * * + * Copyright (c) 2014-2018 * + * * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this * + * software and associated documentation files (the "Software"), to deal in the Software * + * without restriction, including without limitation the rights to use, copy, modify, * + * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to * + * permit persons to whom the Software is furnished to do so, subject to the following * + * conditions: * + * * + * The above copyright notice and this permission notice shall be included in all copies * + * or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, * + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A * + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT * + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF * + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + ****************************************************************************************/ + +#version __CONTEXT__ + +layout(location = 0) in vec4 position; +out vec2 texCoord; + +void main() { + texCoord = 0.5 + position.xy * 0.5; + gl_Position = position; +} \ No newline at end of file diff --git a/shaders/framebuffer/hdrAndFiltering.frag b/shaders/framebuffer/hdrAndFiltering.frag index 64e3a5b993..e61bf0a9c3 100644 --- a/shaders/framebuffer/hdrAndFiltering.frag +++ b/shaders/framebuffer/hdrAndFiltering.frag @@ -34,6 +34,10 @@ uniform float blackoutFactor; uniform float gamma; uniform float maxWhite; uniform float aveLum; +uniform float Hue; +uniform float Saturation; +uniform float Value; +uniform float Lightness; uniform int toneMapOperator; uniform sampler2D deferredResultsTexture; @@ -85,7 +89,13 @@ void main() { if (toneMapOperator == EXPONENTIAL) { vec3 tColor = exponentialToneMapping(color.rgb, backgroundExposure, gamma); - finalColor = vec4(tColor, color.a); + vec3 hslColor = rgb2hsl(tColor); + hslColor.x *= Hue; + hslColor.y *= Saturation; + hslColor.z *= Lightness; + + finalColor = vec4(hsl2rgb(hslColor), color.a); + } else if (toneMapOperator == LINEAR) { vec3 tColor = linearToneMapping(color.rgb, backgroundExposure); finalColor = vec4(gammaCorrection(tColor, gamma), color.a); @@ -109,7 +119,13 @@ void main() { finalColor = vec4(gammaCorrection(tColor, gamma), color.a); } else if (toneMapOperator == COSTA) { vec3 tColor = jToneMapping(color.rgb, backgroundExposure); - finalColor = vec4(gammaCorrection(tColor, gamma), color.a); + vec3 hsvColor = rgb2hsv(tColor); + hsvColor.x *= Hue; + hsvColor.y *= Saturation; + hsvColor.z *= Value; + + finalColor = vec4(gammaCorrection(hsv2rgb(hsvColor), gamma), color.a); + } else if (toneMapOperator == ADAPTIVE) { vec3 tColor = vec3(adaptiveToneMap()); finalColor = vec4(gammaCorrection(tColor, gamma), color.a); diff --git a/shaders/hdr.glsl b/shaders/hdr.glsl index 5902c7a846..1e9728182f 100644 --- a/shaders/hdr.glsl +++ b/shaders/hdr.glsl @@ -35,19 +35,130 @@ #define GLOBAL 10 #define PHOTOGRAPHIC_REINHARD 11 -const mat3 rgb2xyz = mat3( - 0.4124564, 0.2126729, 0.0193339, - 0.3575761, 0.7151522, 0.1191920, - 0.1804375, 0.0721750, 0.9503041 ); +const float HCV_EPSILON = 1e-10; +const float HSL_EPSILON = 1e-10; +const float HCY_EPSILON = 1e-10; -const mat3 xyz2rgb = mat3( - 3.2404542, -0.9692660, 0.0556434, - -1.5371385, 1.8760108, -0.2040259, - -0.4985314, 0.0415560, 1.0572252 ); +// White given by D65 +const mat3 RGB2XYZ = mat3( + vec3(0.4124, 0.2126, 0.0193), + vec3(0.3576, 0.7152, 0.1192), + vec3(0.1805, 0.0722, 0.9505) + ); + +const mat3 XYZ2RGB = mat3( + vec3(3.2406, -0.9689, 0.0557), + vec3(-1.5372, 1.8758, -0.2040), + vec3(-0.4986, 0.0415, 1.0570) + ); + +// Gamma correction for linear RGB to sRGB +// See wiki: https://en.wikipedia.org/wiki/SRGB#The_sRGB_transfer_function_.28.22gamma.22.29 +float gammaF(const float u) { + if (u < 0.0031308) { + return 12.92 * u; + } else { + return 1.055 * pow(u, 1.0/2.4) - 0.055; + } +} + +float invgammaF(const float u) { + if (u < 0.04045) { + return u / 12.92; + } else { + return pow((u+0.055)/1.055, 2.4); + } +} + +vec3 rgbToSRGB(const vec3 rgb) { + return vec3(gammaF(rgb.r), gammaF(rgb.g), gammaF(rgb.b)); +} + +vec3 srgbToRGB(const vec3 srgb) { + return vec3(invgammaF(srgb.r), invgammaF(srgb.g), invgammaF(srgb.b)); +} + +vec3 srgbToXYZ(const vec3 srgb) { + //return RGB2XYZ * srgb; + vec3 rgb = srgbToRGB(srgb); + return RGB2XYZ * rgb; +} + +vec3 XYZToSRGB(const vec3 XYZ) { + vec3 rgb = XYZ2RGB * XYZ; + return rgbToSRGB(rgb); +} + +// HSV code taken from http://lolengine.net/blog/2013/07/27/rgb-to-hsv-in-glsl. +vec3 rgb2hsv(const vec3 c) +{ + vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0); + vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g)); + vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r)); + + float d = q.x - min(q.w, q.y); + float e = 1.0e-10; + return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); +} + +// All components are in the range [0…1], including hue. +vec3 hsv2rgb(const vec3 c) +{ + vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); + vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www); + return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); +} + +// Code to convert from rgb to hsl is licensed by: +/* +GLSL Color Space Utility Functions +(c) 2015 tobspr +------------------------------------------------------------------------------- +The MIT License (MIT) +Copyright (c) 2015 + +See top of the file for full license terms. +*/ + +// Converts from pure Hue to linear RGB +vec3 hue2rgb(float hue) +{ + float R = abs(hue * 6 - 3) - 1; + float G = 2 - abs(hue * 6 - 2); + float B = 2 - abs(hue * 6 - 4); + return clamp(vec3(R,G,B), 0, 1); +} +// Converts a value from linear RGB to HCV (Hue, Chroma, Value) +vec3 rgb2hcv(vec3 rgb) +{ + // Based on work by Sam Hocevar and Emil Persson + vec4 P = (rgb.g < rgb.b) ? vec4(rgb.bg, -1.0, 2.0/3.0) : vec4(rgb.gb, 0.0, -1.0/3.0); + vec4 Q = (rgb.r < P.x) ? vec4(P.xyw, rgb.r) : vec4(rgb.r, P.yzx); + float C = Q.x - min(Q.w, Q.y); + float H = abs((Q.w - Q.y) / (6 * C + HCV_EPSILON) + Q.z); + return vec3(H, C, Q.x); +} + +// Converts from HSL to linear RGB +vec3 hsl2rgb(vec3 hsl) +{ + vec3 rgb = hue2rgb(hsl.x); + float C = (1 - abs(2 * hsl.z - 1)) * hsl.y; + return (rgb - 0.5) * C + hsl.z; +} + +// Converts from linear rgb to HSL +vec3 rgb2hsl(vec3 rgb) +{ + vec3 HCV = rgb2hcv(rgb); + float L = HCV.z - HCV.y * 0.5; + float S = HCV.y / (1 - abs(L * 2 - 1) + HSL_EPSILON); + return vec3(HCV.x, S, L); +} vec3 globalToneMappingOperatorRTR(vec3 color, float exposure, float maxWhite, float aveLum) { // Convert color to XYZ - vec3 xyzCol = rgb2xyz * color; + vec3 xyzCol = RGB2XYZ * color; // Convert from XYZ to xyY float xyzSum = xyzCol.x + xyzCol.y + xyzCol.z; @@ -63,7 +174,7 @@ vec3 globalToneMappingOperatorRTR(vec3 color, float exposure, float maxWhite, fl xyzCol.z = (L * (1 - xyYCol.x - xyYCol.y))/xyYCol.y; // Convert back to RGB and send to output buffer - return xyz2rgb * xyzCol; + return XYZ2RGB * xyzCol; } vec3 exponentialToneMapping(vec3 color, float exposure, float gamma) { @@ -89,6 +200,7 @@ vec3 simpleReinhardToneMapping(vec3 color, float exposure) { } vec3 lumaBasedReinhardToneMapping(vec3 color, float exposure) { + float luma = dot(color, vec3(0.2126f, 0.7152f, 0.0722f)); float toneMappedLuma = luma / (1.f + luma); color *= toneMappedLuma / luma; diff --git a/src/rendering/abufferrenderer.cpp b/src/rendering/abufferrenderer.cpp index f1005a0b35..6290738fdf 100644 --- a/src/rendering/abufferrenderer.cpp +++ b/src/rendering/abufferrenderer.cpp @@ -759,6 +759,10 @@ void ABufferRenderer::enableBloom(bool enable) { _bloomEnabled = enable; } +void ABufferRenderer::enableHistogram(bool enable) { + _histogramEnabled = enable; +} + float ABufferRenderer::hdrBackground() const { return _hdrBackground; } diff --git a/src/rendering/framebufferrenderer.cpp b/src/rendering/framebufferrenderer.cpp index 7a04b6d325..fcac8371a1 100644 --- a/src/rendering/framebufferrenderer.cpp +++ b/src/rendering/framebufferrenderer.cpp @@ -55,16 +55,25 @@ namespace { "mainColorTexture", "blackoutFactor", "nAaSamples" }; - constexpr const std::array HDRUniformNames = { + constexpr const std::array HDRUniformNames = { "deferredResultsTexture", "blackoutFactor", "backgroundConstant", - "backgroundExposure", "gamma", "toneMapOperator", "aveLum", "maxWhite" + "backgroundExposure", "gamma", "toneMapOperator", "aveLum", "maxWhite", + "Hue", "Saturation", "Value", "Lightness" }; - constexpr const std::array BLoomUniformNames = { + constexpr const std::array BloomUniformNames = { "renderedImage", "bloomImage", "bloomThresholdMin", "bloomThresholdMax", "bloomOrigFactor", "bloomNewFactor" }; + constexpr const std::array HistoUniformNames = { + "renderedImage", "maxWhite", "imageWidth", "imageHeight" + }; + + constexpr const std::array TMOUniformNames = { + "hdrSampler", "key", "Ywhite", "sat" + }; + constexpr const char* ExitFragmentShaderPath = "${SHADERS}/framebuffer/exitframebuffer.frag"; constexpr const char* RaycastFragmentShaderPath = @@ -160,7 +169,20 @@ void FramebufferRenderer::initialize() { // Bloom Filter glGenFramebuffers(3, _bloomFilterFBO); glGenTextures(3, _bloomTexture); - + + // Histogram + glGenFramebuffers(1, &_histoFramebuffer); + glGenTextures(1, &_histoTexture); + glGenVertexArrays(1, &_histoVao); + glBindVertexArray(_histoVao); + glGenBuffers(1, &_histoVbo); + + // TMO via mipmapping + glGenFramebuffers(1, &_tmoFramebuffer); + glGenTextures(1, &_tmoTexture); + glGenSamplers(1, &_tmoHdrSampler); + glSamplerParameteri(_tmoHdrSampler, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST); + updateResolution(); updateRendererData(); updateRaycastData(); @@ -281,13 +303,45 @@ void FramebufferRenderer::initialize() { } } + // Builds Histogram FBO + glBindFramebuffer(GL_FRAMEBUFFER, _histoFramebuffer); + glFramebufferTexture2D( + GL_FRAMEBUFFER, + GL_COLOR_ATTACHMENT0, + GL_TEXTURE_2D, + _histoTexture, + 0 + ); + + status = glCheckFramebufferStatus(GL_FRAMEBUFFER); + if (status != GL_FRAMEBUFFER_COMPLETE) { + LERROR("Histogram framebuffer is not complete"); + } + + // Buids TMO via mipmapping FBO + glBindFramebuffer(GL_FRAMEBUFFER, _tmoFramebuffer); + glFramebufferTexture2D( + GL_FRAMEBUFFER, + GL_COLOR_ATTACHMENT0, + GL_TEXTURE_2D, + _tmoTexture, + 0 + ); + + status = glCheckFramebufferStatus(GL_FRAMEBUFFER); + if (status != GL_FRAMEBUFFER_COMPLETE) { + LERROR("Histogram framebuffer is not complete"); + } + // JCC: Moved to here to avoid NVidia: "Program/shader state performance warning" // Builds HDR and Filtering programs updateHDRAndFiltering(); updateAveLum(); updateBloomConfig(); + updateHistogramConfig(); // Builds deferred casters programs updateDeferredcastData(); + updateTMOViaMipMappingConfig(); _dirtyMsaaSamplingPattern = true; @@ -312,8 +366,27 @@ void FramebufferRenderer::initialize() { ghoul::opengl::updateUniformLocations( *_bloomResolveProgram, _bloomUniformCache, - BLoomUniformNames + BloomUniformNames ); + + ghoul::opengl::updateUniformLocations( + *_histoProgram, + _histoUniformCache, + HistoUniformNames + ); + + // /*ghoul::opengl::updateUniformLocations( + // *_histoApplyProgram, + // _histoApplyUniformCache, + // HistoApplyUniformNames + // );*/ + + ghoul::opengl::updateUniformLocations( + *_tmoProgram, + _tmoUniformCache, + TMOUniformNames + ); + global::raycasterManager.addListener(*this); global::deferredcasterManager.addListener(*this); } @@ -326,6 +399,8 @@ void FramebufferRenderer::deinitialize() { glDeleteFramebuffers(1, &_hdrFilteringFramebuffer); glDeleteFramebuffers(1, &_computeAveLumFBO); glDeleteFramebuffers(3, _bloomFilterFBO); + glDeleteFramebuffers(1, &_histoFramebuffer); + glDeleteFramebuffers(1, &_tmoFramebuffer); glDeleteTextures(1, &_mainColorTexture); glDeleteTextures(1, &_mainDepthTexture); @@ -335,6 +410,8 @@ void FramebufferRenderer::deinitialize() { glDeleteTextures(1, &_mainNormalTexture); glDeleteTextures(1, &_computeAveLumTexture); glDeleteTextures(3, _bloomTexture); + glDeleteTextures(1, &_histoTexture); + glDeleteTextures(1, &_tmoTexture); glDeleteTextures(1, &_exitColorTexture); glDeleteTextures(1, &_exitDepthTexture); @@ -342,6 +419,8 @@ void FramebufferRenderer::deinitialize() { glDeleteBuffers(1, &_vertexPositionBuffer); glDeleteVertexArrays(1, &_screenQuad); + glDeleteSamplers(1, &_tmoHdrSampler); + global::raycasterManager.removeListener(*this); global::deferredcasterManager.removeListener(*this); } @@ -532,6 +611,114 @@ void FramebufferRenderer::applyBloomFilter() { glBindFramebuffer(GL_FRAMEBUFFER, defaultFbo); } +void FramebufferRenderer::computeImageHistogram() { + glBindFramebuffer(GL_FRAMEBUFFER, _histoFramebuffer); + GLenum textureBuffer[] = { + GL_COLOR_ATTACHMENT0 + }; + glDrawBuffers(1, textureBuffer); + + glClearColor(0.0, 0.0, 0.0, 1.0); + glClear(GL_COLOR_BUFFER_BIT); + glViewport(0, 0, _resolution.x, _resolution.y); + + GLboolean depthTestEnabled = glIsEnabled(GL_DEPTH_TEST); + + glDisable(GL_DEPTH_TEST); + + // Saving Blending State + GLboolean blendEnabled = glIsEnabled(GL_BLEND); + GLenum blendEquationRGB; + GLenum blendEquationAlpha; + GLenum blendDestAlpha; + GLenum blendDestRGB; + GLenum blendSrcAlpha; + GLenum blendSrcRGB; + + glGetIntegerv(GL_BLEND_EQUATION_RGB, &blendEquationRGB); + glGetIntegerv(GL_BLEND_EQUATION_ALPHA, &blendEquationAlpha); + glGetIntegerv(GL_BLEND_DST_ALPHA, &blendDestAlpha); + glGetIntegerv(GL_BLEND_DST_RGB, &blendDestRGB); + glGetIntegerv(GL_BLEND_SRC_ALPHA, &blendSrcAlpha); + glGetIntegerv(GL_BLEND_SRC_RGB, &blendSrcRGB); + + // Changing blending functions for histogram computation + glBlendEquation(GL_FUNC_ADD); + glBlendFunc(GL_ONE, GL_ONE); + glEnable(GL_BLEND); + + glBindVertexArray(_histoVao); + + _histoProgram->activate(); + + ghoul::opengl::TextureUnit renderedImage; + renderedImage.activate(); + glBindTexture(GL_TEXTURE_2D, _hdrFilteringTexture); + _histoProgram->setUniform(_histoUniformCache.renderedImage, renderedImage); + _histoProgram->setUniform(_histoUniformCache.imageWidth, static_cast(_resolution.x)); + _histoProgram->setUniform(_histoUniformCache.imageHeight, static_cast(_resolution.y)); + _histoProgram->setUniform(_histoUniformCache.maxWhite, _maxWhite); + + glDrawArrays(GL_POINTS, 0, _resolution.x * _resolution.y); + + glFlush(); + + _histoProgram->deactivate(); + + // Testing + std::vector gpuHistogram; + saveTextureToMemory(GL_COLOR_ATTACHMENT0, _numberOfBins, 1, gpuHistogram); + + + // Restores blending state + if (!blendEnabled) { + glDisable(GL_BLEND); + } + else { + glBlendEquationSeparate(blendEquationRGB, blendEquationAlpha); + glBlendFuncSeparate(blendSrcRGB, blendDestRGB, blendSrcAlpha, blendDestAlpha); + } + + // Restores Depth test state + if (depthTestEnabled) { + glEnable(GL_DEPTH_TEST); + } +} + +void FramebufferRenderer::computeMipMappingFromHDRBuffer(GLuint oglImageBuffer) { + ghoul::opengl::TextureUnit samplerUnit; + glBindSampler(samplerUnit, _tmoHdrSampler); + samplerUnit.activate(); + glBindTexture(GL_TEXTURE_2D, oglImageBuffer); + + glGenerateMipmap(GL_TEXTURE_2D); + + _tmoProgram->setUniform(_tmoUniformCache.hdrSampler, samplerUnit); + _tmoProgram->setUniform(_tmoUniformCache.key, _tmoKey); + _tmoProgram->setUniform(_tmoUniformCache.Ywhite, _tmoYwhite); + _tmoProgram->setUniform(_tmoUniformCache.sat, _tmoSaturation); + + glBindFramebuffer(GL_FRAMEBUFFER, _tmoFramebuffer); + GLenum textureBuffer[] = { + GL_COLOR_ATTACHMENT0 + }; + glDrawBuffers(1, textureBuffer); + + glClearColor(0.0, 0.0, 0.0, 1.0); + glClear(GL_COLOR_BUFFER_BIT); + glViewport(0, 0, _resolution.x, _resolution.y); + + glBindVertexArray(_screenQuad); + + _tmoProgram->activate(); + + glDrawArrays(GL_TRIANGLES, 0, 6); + + _tmoProgram->deactivate(); + + glBindVertexArray(0); +} + void FramebufferRenderer::update() { if (_dirtyMsaaSamplingPattern) { updateMSAASamplingPattern(); @@ -552,7 +739,6 @@ void FramebufferRenderer::update() { if (_resolveProgram->isDirty()) { _resolveProgram->rebuildFromFile(); - ghoul::opengl::updateUniformLocations( *_resolveProgram, _uniformCache, @@ -573,10 +759,28 @@ void FramebufferRenderer::update() { ghoul::opengl::updateUniformLocations( *_bloomResolveProgram, _bloomUniformCache, - BLoomUniformNames + BloomUniformNames ); } + if (_histoProgram->isDirty()) { + _histoProgram->rebuildFromFile(); + ghoul::opengl::updateUniformLocations( + *_histoProgram, + _histoUniformCache, + HistoUniformNames + ); + } + + //if (_histoApplyProgram->isDirty()) { + // _histoApplyProgram->rebuildFromFile(); + // /*ghoul::opengl::updateUniformLocations( + // *_histoApplyProgram, + // _histoApplyUniformCache, + // HistoApplyUniformNames + // );*/ + //} + if (_hdrFilteringProgram->isDirty()) { _hdrFilteringProgram->rebuildFromFile(); @@ -587,6 +791,15 @@ void FramebufferRenderer::update() { ); } + if (_tmoProgram->isDirty()) { + _tmoProgram->rebuildFromFile(); + ghoul::opengl::updateUniformLocations( + *_tmoProgram, + _tmoUniformCache, + TMOUniformNames + ); + } + using K = VolumeRaycaster*; using V = std::unique_ptr; for (const std::pair& program : _exitPrograms) { @@ -716,8 +929,63 @@ void FramebufferRenderer::updateResolution() { glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); } - glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _mainPositionTexture); + // Histogram Texture + glBindTexture(GL_TEXTURE_2D, _histoTexture); + glTexImage2D( + GL_TEXTURE_2D, + 0, + GL_RGBA32F, + _numberOfBins, + 1, + 0, + GL_RGBA, + GL_FLOAT, + nullptr + ); + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glBindVertexArray(_histoVao); + glBindBuffer(GL_ARRAY_BUFFER, _histoVbo); + + _histoPoints.clear(); + _histoPoints.reserve(_resolution.x * _resolution.y); + for (int i = 0; i < _resolution.x * _resolution.y; ++i) { + _histoPoints.push_back(i); + } + + glBufferData( + GL_ARRAY_BUFFER, + sizeof(float) * _histoPoints.size(), + _histoPoints.data(), + GL_DYNAMIC_DRAW + ); + + glEnableVertexAttribArray(0); + glVertexAttribPointer(0, 1, GL_FLOAT, GL_FALSE, 0, nullptr); + + glBindVertexArray(0); + + // TMO via mipmapping + glBindTexture(GL_TEXTURE_2D, _tmoTexture); + glTexImage2D( + GL_TEXTURE_2D, + 0, + GL_SRGB8, + _resolution.x, + _resolution.y, + 0, + GL_RGB, + GL_UNSIGNED_BYTE, + nullptr + ); + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + + // G-Buffer main position + glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _mainPositionTexture); glTexImage2DMultisample( GL_TEXTURE_2D_MULTISAMPLE, _nAaSamples, @@ -937,6 +1205,36 @@ void FramebufferRenderer::updateBloomConfig() { //_bloomResolveProgram->setIgnoreUniformLocationError(IgnoreError::Yes); } +void FramebufferRenderer::updateHistogramConfig() { + _histoProgram = ghoul::opengl::ProgramObject::Build( + "Computes Histogram from Image", + absPath("${SHADERS}/framebuffer/computeHistogram_vs.glsl"), + absPath("${SHADERS}/framebuffer/computeHistogram_fs.glsl") + ); + using IgnoreError = ghoul::opengl::ProgramObject::IgnoreError; + //_histoProgram->setIgnoreSubroutineUniformLocationError(IgnoreError::Yes); + //_histoProgram->setIgnoreUniformLocationError(IgnoreError::Yes); + + /*_histoApplyProgram = ghoul::opengl::ProgramObject::Build( + "Applies histogram on the image", + absPath("${SHADERS}/framebuffer/applyHistogram.vert"), + absPath("${SHADERS}/framebuffer/applyHistogram.frag") + );*/ + //_histoApplyProgram->setIgnoreSubroutineUniformLocationError(IgnoreError::Yes); + //_histoApplyProgram->setIgnoreUniformLocationError(IgnoreError::Yes); +} + +void FramebufferRenderer::updateTMOViaMipMappingConfig() { + _tmoProgram = ghoul::opengl::ProgramObject::Build( + "Computes TMO via MipMapping", + absPath("${SHADERS}/framebuffer/computeTMO_vs.glsl"), + absPath("${SHADERS}/framebuffer/computeTMO_fs.glsl") + ); + using IgnoreError = ghoul::opengl::ProgramObject::IgnoreError; + //_tmoProgram ->setIgnoreSubroutineUniformLocationError(IgnoreError::Yes); + //_tmoProgram ->setIgnoreUniformLocationError(IgnoreError::Yes); +} + void FramebufferRenderer::updateHDRAndFiltering() { _hdrFilteringProgram = ghoul::opengl::ProgramObject::Build( "HDR and Filtering Program", @@ -1422,12 +1720,27 @@ void FramebufferRenderer::render(Scene* scene, Camera* camera, float blackoutFac _hdrFilteringProgram->setUniform(_hdrUniformCache.toneMapOperator, _toneMapOperator); _hdrFilteringProgram->setUniform(_hdrUniformCache.aveLum, averageLuminaceInFB); _hdrFilteringProgram->setUniform(_hdrUniformCache.maxWhite, _maxWhite); + _hdrFilteringProgram->setUniform(_hdrUniformCache.Hue, _hue); + _hdrFilteringProgram->setUniform(_hdrUniformCache.Saturation, _saturation); + _hdrFilteringProgram->setUniform(_hdrUniformCache.Value, _value); + _hdrFilteringProgram->setUniform(_hdrUniformCache.Lightness, _lightness); glBindVertexArray(_screenQuad); glDrawArrays(GL_TRIANGLES, 0, 6); glBindVertexArray(0); _hdrFilteringProgram->deactivate(); + + //================================ + // Adjusting color and brightness + //================================ + + // Histogram Equalization + computeImageHistogram(); + + computeMipMappingFromHDRBuffer(_hdrFilteringTexture); + + glBindFramebuffer(GL_FRAMEBUFFER, defaultFbo); } //glBindFramebuffer(GL_FRAMEBUFFER, defaultFbo); @@ -1670,10 +1983,42 @@ void FramebufferRenderer::setBloomNewFactor(float newFactor) { _bloomNewFactor = newFactor; } +void FramebufferRenderer::setKey(float key) { + _tmoKey = key; +} + +void FramebufferRenderer::setYwhite(float white) { + _tmoYwhite = white; +} + +void FramebufferRenderer::setTmoSaturation(float sat) { + _tmoSaturation = sat; +} + +void FramebufferRenderer::setHue(float hue) { + _hue = hue; +} + +void FramebufferRenderer::setValue(float value) { + _value = value; +} + +void FramebufferRenderer::setSaturation(float sat) { + _saturation = sat; +} + +void FramebufferRenderer::setLightness(float lightness) { + _lightness = lightness; +} + void FramebufferRenderer::enableBloom(bool enable) { _bloomEnabled = enable; } +void FramebufferRenderer::enableHistogram(bool enable) { + _histogramEnabled = enable; +} + float FramebufferRenderer::hdrBackground() const { return _hdrBackground; } diff --git a/src/rendering/renderengine.cpp b/src/rendering/renderengine.cpp index 3fe10c6a2b..e0b97cebf6 100644 --- a/src/rendering/renderengine.cpp +++ b/src/rendering/renderengine.cpp @@ -189,6 +189,24 @@ namespace { "equivalent of an electronic image sensor for the background image." }; + constexpr openspace::properties::Property::PropertyInfo TMOSaturationInfo = { + "TMOSaturation", + "TMO Saturation", + "TMO Saturation" + }; + + constexpr openspace::properties::Property::PropertyInfo TMOYWhiteInfo = { + "TMOYWhite", + "Ywhite", + "Ywhite" + }; + + constexpr openspace::properties::Property::PropertyInfo TMOKeyInfo = { + "TMOKey", + "Key", + "Key" + }; + constexpr openspace::properties::Property::PropertyInfo GammaInfo = { "Gamma", "Gamma Correction", @@ -238,6 +256,48 @@ namespace { "Enable/Disable Bloom", "Enable/Disable Bloom." }; + + constexpr openspace::properties::Property::PropertyInfo HueInfo = { + "Hue", + "Hue", + "Hue" + }; + + constexpr openspace::properties::Property::PropertyInfo SaturationInfo = { + "Saturation", + "Saturation", + "Saturation" + }; + + constexpr openspace::properties::Property::PropertyInfo ValueInfo = { + "Value", + "Value", + "Value" + }; + + constexpr openspace::properties::Property::PropertyInfo LightnessInfo = { + "Lightness", + "Lightness", + "Lightness" + }; + + openspace::properties::PropertyOwner::PropertyOwnerInfo BloomInfo = { + "BloomOp", + "Bloom Options", + "" + }; + + openspace::properties::PropertyOwner::PropertyOwnerInfo TMOInfo = { + "ToneMappingOp", + "Tone Mapping Options", + "" + }; + + openspace::properties::PropertyOwner::PropertyOwnerInfo ImageInfo = { + "ImageOp", + "Rendered Image Options", + "" + }; } // namespace @@ -255,17 +315,28 @@ RenderEngine::RenderEngine() , _showFrameNumber(ShowFrameNumberInfo, false) , _disableMasterRendering(DisableMasterInfo, false) , _disableSceneTranslationOnMaster(DisableTranslationInfo, false) - , _nAaSamples(AaSamplesInfo, 4, 1, 8) - , _hdrExposure(HDRExposureInfo, 0.4f, 0.01f, 10.0f) - , _hdrBackground(BackgroundExposureInfo, 2.8f, 0.01f, 10.0f) - , _gamma(GammaInfo, 2.2f, 0.01f, 10.0f) - , _maxWhite(MaxWhiteInfo, 4.f, 0.001f, 10000.0f) + , _nAaSamples(AaSamplesInfo, 4, 1, 8) + , _bloomOwner(BloomInfo) , _enableBloom(EnableBloomInfo, false) , _bloomThreshouldMin(BloomThreshouldMinInfo, 0.5, 0.0, 100.0) , _bloomThreshouldMax(BloomThreshouldMaxInfo, 1.0, 0.0, 100.0) , _bloomOrigColorFactor(BloomOrigColorFactorInfo, 1.0, 0.0, 100.0) , _bloomNewColorFactor(BloomNewColorFactorInfo, 1.0, 0.0, 100.0) + , _tmoOwner(TMOInfo) + , _hdrExposure(HDRExposureInfo, 0.4f, 0.01f, 10.0f) + , _hdrBackground(BackgroundExposureInfo, 2.8f, 0.01f, 10.0f) + , _maxWhite(MaxWhiteInfo, 4.f, 0.001f, 10000.0f) , _toneMapOperator(ToneMapOperatorInfo, properties::OptionProperty::DisplayType::Dropdown) + , _tmoKey(TMOKeyInfo, 0.18f, 0.0f, 1.0f) + , _tmoYwhite(TMOYWhiteInfo, 1e6f, 0.0f, 1e10f) + , _tmoSaturation(TMOSaturationInfo, 1.f, 0.0f, 1.0f) + , _imageOwner(ImageInfo) + , _gamma(GammaInfo, 2.2f, 0.01f, 10.0f) + , _hue(HueInfo, 1.f, 0.0f, 10.0f) + , _saturation(SaturationInfo, 1.f, 0.0f, 10.0f) + , _value(ValueInfo, 1.f, 0.0f, 10.0f) + , _lightness(LightnessInfo, 1.f, 0.0f, 10.0f) + { _doPerformanceMeasurements.onChange([this](){ global::performanceManager.setEnabled(_doPerformanceMeasurements); @@ -284,6 +355,7 @@ RenderEngine::RenderEngine() }); addProperty(_nAaSamples); + _hdrExposure.onChange([this]() { if (_renderer) { _renderer->setHDRExposure(_hdrExposure); @@ -298,20 +370,14 @@ RenderEngine::RenderEngine() }); addProperty(_hdrBackground); - _gamma.onChange([this]() { - if (_renderer) { - _renderer->setGamma(_gamma); - } - }); - addProperty(_gamma); - _maxWhite.onChange([this]() { if (_renderer) { _renderer->setMaxWhite(_maxWhite); } }); + addProperty(_maxWhite); - + _toneMapOperator.addOption(static_cast(ToneMapOperators::EXPONENTIAL), "Exponential"); _toneMapOperator.addOption(static_cast(ToneMapOperators::LINEAR), "Linear"); _toneMapOperator.addOption(static_cast(ToneMapOperators::SIMPLE_REINHARD), "Simple Reinhard"); @@ -333,6 +399,73 @@ RenderEngine::RenderEngine() }); addProperty(_toneMapOperator); + + _tmoKey.onChange([this]() { + if (_renderer) { + _renderer->setKey(_tmoKey); + } + }); + + addProperty(_tmoKey); + + _tmoYwhite.onChange([this]() { + if (_renderer) { + _renderer->setYwhite(_tmoYwhite); + } + }); + + addProperty(_tmoYwhite); + + _tmoSaturation.onChange([this]() { + if (_renderer) { + _renderer->setTmoSaturation(_tmoSaturation); + } + }); + + addProperty(_tmoSaturation); + + //this->addPropertySubOwner(_tmoOwner); + + + _gamma.onChange([this]() { + if (_renderer) { + _renderer->setGamma(_gamma); + } + }); + addProperty(_gamma); + + _hue.onChange([this]() { + if (_renderer) { + _renderer->setHue(_hue); + } + }); + + addProperty(_hue); + + _saturation.onChange([this]() { + if (_renderer) { + _renderer->setSaturation(_saturation); + } + }); + + addProperty(_saturation); + + _value.onChange([this]() { + if (_renderer) { + _renderer->setValue(_value); + } + }); + + addProperty(_value); + + _lightness.onChange([this]() { + if (_renderer) { + _renderer->setLightness(_lightness); + } + }); + addProperty(_lightness); + + //this->addPropertySubOwner(_imageOwner); _enableBloom.onChange([this]() { if (_renderer) { @@ -369,6 +502,8 @@ RenderEngine::RenderEngine() _renderer->setBloomNewFactor(_bloomNewColorFactor); } }); + + //this->addPropertySubOwner(_bloomOwner); addProperty(_applyWarping); From def560d943b022ce639b2ac49456c7778bb37de7 Mon Sep 17 00:00:00 2001 From: Jonathas Costa Date: Tue, 19 Feb 2019 16:57:44 -0500 Subject: [PATCH 06/39] Clean up hdr code and added better controls. Disabled histogram and global/local operators. --- .../openspace/rendering/framebufferrenderer.h | 20 ++--- include/openspace/rendering/renderengine.h | 8 +- include/openspace/rendering/renderer.h | 5 +- shaders/framebuffer/hdrAndFiltering.frag | 73 +++++++++---------- shaders/hdr.glsl | 49 +++++-------- src/rendering/framebufferrenderer.cpp | 68 +++++++++-------- src/rendering/renderengine.cpp | 35 +++++++-- 7 files changed, 137 insertions(+), 121 deletions(-) diff --git a/include/openspace/rendering/framebufferrenderer.h b/include/openspace/rendering/framebufferrenderer.h index 57f20c2ca1..1c7b8e0e6c 100644 --- a/include/openspace/rendering/framebufferrenderer.h +++ b/include/openspace/rendering/framebufferrenderer.h @@ -94,13 +94,14 @@ public: void setBloomThreMax(float maxV) override; void setBloomOrigFactor(float origFactor) override; void setBloomNewFactor(float newFactor) override; - void setKey(float key); - void setYwhite(float white); - void setTmoSaturation(float sat); - void setHue(float hue); - void setValue(float value); - void setSaturation(float sat); - void setLightness(float lightness); + void setKey(float key) override; + void setYwhite(float white) override; + void setTmoSaturation(float sat) override; + void setHue(float hue) override; + void setValue(float value) override; + void setSaturation(float sat) override; + void setLightness(float lightness) override; + void setColorSpace(unsigned int colorspace) override; void enableBloom(bool enable) override; void enableHistogram(bool enable) override; @@ -153,8 +154,8 @@ private: UniformCache(mainColorTexture, blackoutFactor, nAaSamples) _uniformCache; UniformCache(deferredResultsTexture, blackoutFactor, backgroundConstant, - backgroundExposure, gamma, toneMapOperator, aveLum, maxWhite, - Hue, Saturation, Value, Lightness) + hdrExposure, gamma, toneMapOperator, aveLum, maxWhite, + Hue, Saturation, Value, Lightness, colorSpace) _hdrUniformCache; UniformCache(renderedImage, bloomImage, bloomThresholdMin, bloomThresholdMax, @@ -220,6 +221,7 @@ private: float _saturation = 1.f; float _value = 1.f; float _lightness = 1.f; + unsigned int _colorSpace = 1; std::vector _mSAAPattern; std::vector _histoPoints; diff --git a/include/openspace/rendering/renderengine.h b/include/openspace/rendering/renderengine.h index 20d06223c2..6fbac7e43b 100644 --- a/include/openspace/rendering/renderengine.h +++ b/include/openspace/rendering/renderengine.h @@ -79,6 +79,11 @@ public: PHOTOGRAPHIC_REINHARD }; + enum class COLORSPACE { + HSV = 0, + HSL + }; + RenderEngine(); ~RenderEngine(); @@ -230,7 +235,8 @@ private: properties::FloatProperty _value; properties::FloatProperty _lightness; - + properties::OptionProperty _colorSpace; + uint64_t _frameNumber = 0; std::vector _programs; diff --git a/include/openspace/rendering/renderer.h b/include/openspace/rendering/renderer.h index 29dc9a0d55..87c84b6131 100644 --- a/include/openspace/rendering/renderer.h +++ b/include/openspace/rendering/renderer.h @@ -41,7 +41,7 @@ class RenderableVolume; class Camera; class Scene; -class Renderer { +class Renderer { public: virtual ~Renderer() = default; @@ -66,7 +66,8 @@ public: virtual void setValue(float value) = 0; virtual void setSaturation(float sat) = 0; virtual void setLightness(float lightness) = 0; - + virtual void setColorSpace(unsigned int colorspace) = 0; + virtual void enableBloom(bool enable) = 0; virtual void enableHistogram(bool enable) = 0; diff --git a/shaders/framebuffer/hdrAndFiltering.frag b/shaders/framebuffer/hdrAndFiltering.frag index e61bf0a9c3..781cd11b74 100644 --- a/shaders/framebuffer/hdrAndFiltering.frag +++ b/shaders/framebuffer/hdrAndFiltering.frag @@ -26,10 +26,13 @@ #include "hdr.glsl" +#define HSV_COLOR 0u +#define HSL_COLOR 1u + layout (location = 0) out vec4 finalColor; uniform float backgroundConstant; -uniform float backgroundExposure; +uniform float hdrExposure; uniform float blackoutFactor; uniform float gamma; uniform float maxWhite; @@ -39,6 +42,7 @@ uniform float Saturation; uniform float Value; uniform float Lightness; uniform int toneMapOperator; +uniform uint colorSpace; uniform sampler2D deferredResultsTexture; @@ -87,53 +91,46 @@ void main() { //color = texelFetch(deferredResultsTexture, ivec2(gl_FragCoord.xy), 0); color.a *= blackoutFactor; + vec3 tColor = vec3(0.0); if (toneMapOperator == EXPONENTIAL) { - vec3 tColor = exponentialToneMapping(color.rgb, backgroundExposure, gamma); - vec3 hslColor = rgb2hsl(tColor); + tColor = exponentialToneMapping(color.rgb, hdrExposure, gamma); + } else if (toneMapOperator == LINEAR) { + tColor = linearToneMapping(color.rgb, hdrExposure); + } else if (toneMapOperator == SIMPLE_REINHARD) { + tColor = simpleReinhardToneMapping(color.rgb, hdrExposure); + } else if (toneMapOperator == LUM_BASED_REINHARD) { + tColor = lumaBasedReinhardToneMapping(color.rgb); + } else if (toneMapOperator == WHITE_PRESERVING) { + tColor = whitePreservingLumaBasedReinhardToneMapping(color.rgb, maxWhite); + } else if (toneMapOperator == ROM_BIN_DA_HOUSE) { + tColor = RomBinDaHouseToneMapping(color.rgb); + } else if (toneMapOperator == FILMIC) { + tColor = filmicToneMapping(color.rgb); + } else if (toneMapOperator == UNCHARTED) { + tColor = Uncharted2ToneMapping(color.rgb, hdrExposure); + } else if (toneMapOperator == COSTA) { + tColor = jToneMapping(color.rgb, hdrExposure); + } else if (toneMapOperator == ADAPTIVE) { + tColor = vec3(adaptiveToneMap()); + } else if (toneMapOperator == GLOBAL) { + tColor = globalToneMappingOperatorRTR(color.rgb, hdrExposure, maxWhite, aveLum); + } else if (toneMapOperator == PHOTOGRAPHIC_REINHARD) { + tColor = photographicReinhardToneMapping(color.rgb); + } + + if (colorSpace == HSL_COLOR) { + vec3 hslColor = rgb2hsl(tColor); hslColor.x *= Hue; hslColor.y *= Saturation; hslColor.z *= Lightness; - finalColor = vec4(hsl2rgb(hslColor), color.a); - - } else if (toneMapOperator == LINEAR) { - vec3 tColor = linearToneMapping(color.rgb, backgroundExposure); - finalColor = vec4(gammaCorrection(tColor, gamma), color.a); - } else if (toneMapOperator == SIMPLE_REINHARD) { - vec3 tColor = simpleReinhardToneMapping(color.rgb, backgroundExposure); - finalColor = vec4(gammaCorrection(tColor, gamma), color.a); - } else if (toneMapOperator == LUM_BASED_REINHARD) { - vec3 tColor = lumaBasedReinhardToneMapping(color.rgb, backgroundExposure); - finalColor = vec4(gammaCorrection(tColor, gamma), color.a); - } else if (toneMapOperator == WHITE_PRESERVING) { - vec3 tColor = whitePreservingLumaBasedReinhardToneMapping(color.rgb, backgroundExposure, maxWhite); - finalColor = vec4(gammaCorrection(tColor, gamma), color.a); - } else if (toneMapOperator == ROM_BIN_DA_HOUSE) { - vec3 tColor = RomBinDaHouseToneMapping(color.rgb, backgroundExposure); - finalColor = vec4(gammaCorrection(tColor, gamma), color.a); - } else if (toneMapOperator == FILMIC) { - vec3 tColor = filmicToneMapping(color.rgb, backgroundExposure); - finalColor = vec4(gammaCorrection(tColor, gamma), color.a); - } else if (toneMapOperator == UNCHARTED) { - vec3 tColor = Uncharted2ToneMapping(color.rgb, backgroundExposure); - finalColor = vec4(gammaCorrection(tColor, gamma), color.a); - } else if (toneMapOperator == COSTA) { - vec3 tColor = jToneMapping(color.rgb, backgroundExposure); + finalColor = vec4(gammaCorrection(hsl2rgb(hslColor), gamma), color.a); + } else if (colorSpace == HSV_COLOR) { vec3 hsvColor = rgb2hsv(tColor); hsvColor.x *= Hue; hsvColor.y *= Saturation; hsvColor.z *= Value; finalColor = vec4(gammaCorrection(hsv2rgb(hsvColor), gamma), color.a); - - } else if (toneMapOperator == ADAPTIVE) { - vec3 tColor = vec3(adaptiveToneMap()); - finalColor = vec4(gammaCorrection(tColor, gamma), color.a); - } else if (toneMapOperator == GLOBAL) { - vec3 tColor = globalToneMappingOperatorRTR(color.rgb, backgroundExposure, maxWhite, aveLum); - finalColor = vec4(gammaCorrection(tColor, gamma), color.a); - } else if (toneMapOperator == PHOTOGRAPHIC_REINHARD) { - vec3 tColor = photographicReinhardToneMapping(color.rgb, backgroundExposure); - finalColor = vec4(gammaCorrection(tColor, gamma), color.a); } } \ No newline at end of file diff --git a/shaders/hdr.glsl b/shaders/hdr.glsl index 1e9728182f..9eceebc5f1 100644 --- a/shaders/hdr.glsl +++ b/shaders/hdr.glsl @@ -54,7 +54,7 @@ const mat3 XYZ2RGB = mat3( // Gamma correction for linear RGB to sRGB // See wiki: https://en.wikipedia.org/wiki/SRGB#The_sRGB_transfer_function_.28.22gamma.22.29 -float gammaF(const float u) { +const float gammaF(const float u) { if (u < 0.0031308) { return 12.92 * u; } else { @@ -156,7 +156,7 @@ vec3 rgb2hsl(vec3 rgb) return vec3(HCV.x, S, L); } -vec3 globalToneMappingOperatorRTR(vec3 color, float exposure, float maxWhite, float aveLum) { +vec3 globalToneMappingOperatorRTR(vec3 color, const float exposure, const float maxWhite, const float aveLum) { // Convert color to XYZ vec3 xyzCol = RGB2XYZ * color; @@ -177,7 +177,7 @@ vec3 globalToneMappingOperatorRTR(vec3 color, float exposure, float maxWhite, fl return XYZ2RGB * xyzCol; } -vec3 exponentialToneMapping(vec3 color, float exposure, float gamma) { +vec3 exponentialToneMapping(vec3 color, const float exposure, const float gamma) { color *= exposure; color.r = color.r < 1.413 ? pow(color.r * 0.38317, 1.0 / gamma) : 1.0 - exp(-color.r); @@ -187,19 +187,17 @@ vec3 exponentialToneMapping(vec3 color, float exposure, float gamma) { return color; } -vec3 linearToneMapping(vec3 color, float exposure) { - float tExposure = 0.08f; - color = clamp(tExposure * color, 0.f, 1.f); +vec3 linearToneMapping(vec3 color, const float exposure) { + color = clamp(exposure * color, 0.f, 1.f); return color; } -vec3 simpleReinhardToneMapping(vec3 color, float exposure) { - float tExposure = exposure; - color *= tExposure/(1.f + color / tExposure); +vec3 simpleReinhardToneMapping(vec3 color, const float exposure) { + color *= exposure/(1.f + color / exposure); return color; } -vec3 lumaBasedReinhardToneMapping(vec3 color, float exposure) { +vec3 lumaBasedReinhardToneMapping(vec3 color) { float luma = dot(color, vec3(0.2126f, 0.7152f, 0.0722f)); float toneMappedLuma = luma / (1.f + luma); @@ -207,11 +205,11 @@ vec3 lumaBasedReinhardToneMapping(vec3 color, float exposure) { return color; } -vec3 photographicReinhardToneMapping(vec3 color, float exposure) { +vec3 photographicReinhardToneMapping(vec3 color) { return color / (color + vec3(1.0)); } -vec3 whitePreservingLumaBasedReinhardToneMapping(vec3 color, float exposure, float maxWhite) { +vec3 whitePreservingLumaBasedReinhardToneMapping(vec3 color, const float maxWhite) { //float luma = dot(color, vec3(0.2126f, 0.7152f, 0.0722f)); float luma = dot(color, vec3(0.4126f, 0.9152f, 0.2722f)); float toneMappedLuma = luma * (1.f + luma / (maxWhite * maxWhite)) / (1.f + luma); @@ -219,19 +217,19 @@ vec3 whitePreservingLumaBasedReinhardToneMapping(vec3 color, float exposure, flo return color; } -vec3 RomBinDaHouseToneMapping(vec3 color, float exposure) { +vec3 RomBinDaHouseToneMapping(vec3 color) { color = exp( -1.f / ( 2.72f * color + 0.15f ) ); return color; } -vec3 filmicToneMapping(vec3 color, float exposure) +vec3 filmicToneMapping(vec3 color) { color = max(vec3(0.f), color - vec3(0.04f)); color = (color * (6.2f * color + 0.5f)) / (color * (6.2f * color + 20.f) + 0.06f); return color; } -vec3 Uncharted2ToneMapping(vec3 color, float exposure) { +vec3 Uncharted2ToneMapping(vec3 color, const float exposure) { float A = 0.15f; float B = 0.5f; float C = 0.1f; @@ -239,30 +237,17 @@ vec3 Uncharted2ToneMapping(vec3 color, float exposure) { float E = 0.02f; float F = 0.3f; float W = 11.2f; - float tExposure = 0.4f; - color *= tExposure; + color *= exposure; color = ((color * (A * color + C * B) + D * E) / (color * (A * color + B) + D * F)) - E / F; float white = ((W * (A * W + C * B) + D * E) / (W * (A * W + B) + D * F)) - E / F; color /= white; return color; } -vec3 jToneMapping(vec3 color, float exposure) { +vec3 jToneMapping(vec3 color, const float exposure) { return 1.0 - exp(-exposure * color); } -vec3 gammaCorrection(vec3 color, float gamma) { +vec3 gammaCorrection(vec3 color, const float gamma) { return pow(color, vec3(1.0f / gamma)); -} - -vec3 HDR(vec3 color, float exposure) { - //return exponentialToneMapping(color, exposure); - //return linearToneMapping(color, exposure); - //return simpleReinhardToneMapping(color, exposure); - //return lumaBasedReinhardToneMapping(color, exposure); - //return whitePreservingLumaBasedReinhardToneMapping(color, exposure); - //return RomBinDaHouseToneMapping(color, exposure); - return filmicToneMapping(color, exposure); - //return Uncharted2ToneMapping(color, exposure); - //return jToneMapping(color, exposure); -} +} \ No newline at end of file diff --git a/src/rendering/framebufferrenderer.cpp b/src/rendering/framebufferrenderer.cpp index fcac8371a1..3b5e7f8c48 100644 --- a/src/rendering/framebufferrenderer.cpp +++ b/src/rendering/framebufferrenderer.cpp @@ -55,10 +55,10 @@ namespace { "mainColorTexture", "blackoutFactor", "nAaSamples" }; - constexpr const std::array HDRUniformNames = { + constexpr const std::array HDRUniformNames = { "deferredResultsTexture", "blackoutFactor", "backgroundConstant", - "backgroundExposure", "gamma", "toneMapOperator", "aveLum", "maxWhite", - "Hue", "Saturation", "Value", "Lightness" + "hdrExposure", "gamma", "toneMapOperator", "aveLum", "maxWhite", + "Hue", "Saturation", "Value", "Lightness", "colorSpace" }; constexpr const std::array BloomUniformNames = { @@ -1651,9 +1651,9 @@ void FramebufferRenderer::render(Scene* scene, Camera* camera, float blackoutFac performDeferredTasks(tasks.deferredcasterTasks); } - /* + if (tasks.deferredcasterTasks.empty()) { - glBindFramebuffer(GL_FRAMEBUFFER, defaultFbo); + //glBindFramebuffer(GL_FRAMEBUFFER, defaultFbo); _resolveProgram->activate(); ghoul::opengl::TextureUnit mainColorTextureUnit; @@ -1669,27 +1669,27 @@ void FramebufferRenderer::render(Scene* scene, Camera* camera, float blackoutFac _resolveProgram->deactivate(); } - */ + // DEBUG - JCC { glDisable(GL_DEPTH_TEST); - // Results of the DeferredTasks as entry for the bloom filter - applyBloomFilter(); + //// Results of the DeferredTasks as entry for the bloom filter + //applyBloomFilter(); float averageLuminaceInFB = 0.0; - if (_toneMapOperator == - static_cast(openspace::RenderEngine::ToneMapOperators::GLOBAL) - ) - { - averageLuminaceInFB = computeBufferAveLuminanceGPU(); - if (std::isnan(averageLuminaceInFB)) { - averageLuminaceInFB = 1000.0; - } - } - - //float averageLuminaceInFB = 0.5; + //if (_toneMapOperator == + // static_cast(openspace::RenderEngine::ToneMapOperators::GLOBAL) + // ) + //{ + // averageLuminaceInFB = computeBufferAveLuminanceGPU(); + // if (std::isnan(averageLuminaceInFB)) { + // averageLuminaceInFB = 1000.0; + // } + //} + // + ////float averageLuminaceInFB = 0.5; glBindFramebuffer(GL_FRAMEBUFFER, defaultFbo); glViewport(0, 0, _resolution.x, _resolution.y); @@ -1697,14 +1697,14 @@ void FramebufferRenderer::render(Scene* scene, Camera* camera, float blackoutFac ghoul::opengl::TextureUnit hdrFeedingTextureUnit; hdrFeedingTextureUnit.activate(); - if (_bloomEnabled) { - // Bloom Enabled - glBindTexture(GL_TEXTURE_2D, _bloomTexture[2]); - } - else { + //if (_bloomEnabled) { + // // Bloom Enabled + // glBindTexture(GL_TEXTURE_2D, _bloomTexture[2]); + //} + //else { // No Bloom glBindTexture(GL_TEXTURE_2D, _hdrFilteringTexture); - } + /*}*/ _hdrFilteringProgram->setUniform( _hdrUniformCache.deferredResultsTexture, @@ -1715,7 +1715,7 @@ void FramebufferRenderer::render(Scene* scene, Camera* camera, float blackoutFac _hdrFilteringProgram->setUniform(_hdrUniformCache.blackoutFactor, blackoutFactor); _hdrFilteringProgram->setUniform(_hdrUniformCache.backgroundConstant, _hdrBackground); - _hdrFilteringProgram->setUniform(_hdrUniformCache.backgroundExposure, _hdrExposure); + _hdrFilteringProgram->setUniform(_hdrUniformCache.hdrExposure, _hdrExposure); _hdrFilteringProgram->setUniform(_hdrUniformCache.gamma, _gamma); _hdrFilteringProgram->setUniform(_hdrUniformCache.toneMapOperator, _toneMapOperator); _hdrFilteringProgram->setUniform(_hdrUniformCache.aveLum, averageLuminaceInFB); @@ -1724,6 +1724,8 @@ void FramebufferRenderer::render(Scene* scene, Camera* camera, float blackoutFac _hdrFilteringProgram->setUniform(_hdrUniformCache.Saturation, _saturation); _hdrFilteringProgram->setUniform(_hdrUniformCache.Value, _value); _hdrFilteringProgram->setUniform(_hdrUniformCache.Lightness, _lightness); + _hdrFilteringProgram->setUniform(_hdrUniformCache.colorSpace, _colorSpace); + glBindVertexArray(_screenQuad); glDrawArrays(GL_TRIANGLES, 0, 6); @@ -1734,13 +1736,13 @@ void FramebufferRenderer::render(Scene* scene, Camera* camera, float blackoutFac //================================ // Adjusting color and brightness //================================ - - // Histogram Equalization - computeImageHistogram(); + // + //// Histogram Equalization + //computeImageHistogram(); - computeMipMappingFromHDRBuffer(_hdrFilteringTexture); + //computeMipMappingFromHDRBuffer(_hdrFilteringTexture); - glBindFramebuffer(GL_FRAMEBUFFER, defaultFbo); + //glBindFramebuffer(GL_FRAMEBUFFER, defaultFbo); } //glBindFramebuffer(GL_FRAMEBUFFER, defaultFbo); @@ -2011,6 +2013,10 @@ void FramebufferRenderer::setLightness(float lightness) { _lightness = lightness; } +void FramebufferRenderer::setColorSpace(unsigned int colorspace) { + _colorSpace = colorspace; +} + void FramebufferRenderer::enableBloom(bool enable) { _bloomEnabled = enable; } diff --git a/src/rendering/renderengine.cpp b/src/rendering/renderengine.cpp index e0b97cebf6..134a8b8e8a 100644 --- a/src/rendering/renderengine.cpp +++ b/src/rendering/renderengine.cpp @@ -297,7 +297,13 @@ namespace { "ImageOp", "Rendered Image Options", "" - }; + }; + + constexpr openspace::properties::Property::PropertyInfo ColorSpaceInfo = { + "ColorSpace", + "Color Space", + "Sets the color space for image adjusts." + }; } // namespace @@ -323,19 +329,20 @@ RenderEngine::RenderEngine() , _bloomOrigColorFactor(BloomOrigColorFactorInfo, 1.0, 0.0, 100.0) , _bloomNewColorFactor(BloomNewColorFactorInfo, 1.0, 0.0, 100.0) , _tmoOwner(TMOInfo) - , _hdrExposure(HDRExposureInfo, 0.4f, 0.01f, 10.0f) + , _hdrExposure(HDRExposureInfo, 0.4f, 0.01f, 4.0f) , _hdrBackground(BackgroundExposureInfo, 2.8f, 0.01f, 10.0f) - , _maxWhite(MaxWhiteInfo, 4.f, 0.001f, 10000.0f) + , _maxWhite(MaxWhiteInfo, 4.f, 0.001f, 100.0f) , _toneMapOperator(ToneMapOperatorInfo, properties::OptionProperty::DisplayType::Dropdown) , _tmoKey(TMOKeyInfo, 0.18f, 0.0f, 1.0f) , _tmoYwhite(TMOYWhiteInfo, 1e6f, 0.0f, 1e10f) , _tmoSaturation(TMOSaturationInfo, 1.f, 0.0f, 1.0f) , _imageOwner(ImageInfo) - , _gamma(GammaInfo, 2.2f, 0.01f, 10.0f) - , _hue(HueInfo, 1.f, 0.0f, 10.0f) - , _saturation(SaturationInfo, 1.f, 0.0f, 10.0f) - , _value(ValueInfo, 1.f, 0.0f, 10.0f) - , _lightness(LightnessInfo, 1.f, 0.0f, 10.0f) + , _gamma(GammaInfo, 2.2f, 0.01f, 5.0f) + , _hue(HueInfo, 1.f, 0.0f, 5.0f) + , _saturation(SaturationInfo, 1.f, 0.0f, 5.0f) + , _value(ValueInfo, 1.f, 0.0f, 5.0f) + , _lightness(LightnessInfo, 1.f, 0.0f, 5.0f) + , _colorSpace(ColorSpaceInfo, properties::OptionProperty::DisplayType::Dropdown) { _doPerformanceMeasurements.onChange([this](){ @@ -434,6 +441,18 @@ RenderEngine::RenderEngine() }); addProperty(_gamma); + _colorSpace.addOption(static_cast(COLORSPACE::HSV), "HSV"); + _colorSpace.addOption(static_cast(COLORSPACE::HSL), "HSL"); + _colorSpace.set(1); + + _colorSpace.onChange([this]() { + if (_renderer) { + _renderer->setColorSpace(_colorSpace); + } + }); + + addProperty(_colorSpace); + _hue.onChange([this]() { if (_renderer) { _renderer->setHue(_hue); From 3f90e0eb30f50d9305d090a4dfea8dc64b33108c Mon Sep 17 00:00:00 2001 From: Jonathas Costa Date: Thu, 21 Feb 2019 17:01:11 -0500 Subject: [PATCH 07/39] Improved speed. Fixed bloom. Enabled mipmap based tmo again. --- data/assets/default.scene | 6 ++ include/openspace/rendering/abufferrenderer.h | 18 ++++ include/openspace/rendering/renderengine.h | 5 +- shaders/hdr.glsl | 2 + src/rendering/abufferrenderer.cpp | 32 ++++++ src/rendering/framebufferrenderer.cpp | 97 ++++++++++--------- src/rendering/renderengine.cpp | 1 + 7 files changed, 115 insertions(+), 46 deletions(-) diff --git a/data/assets/default.scene b/data/assets/default.scene index acab28d799..4404ab037b 100644 --- a/data/assets/default.scene +++ b/data/assets/default.scene @@ -102,10 +102,16 @@ asset.onInitialize(function () }) openspace.globebrowsing.goToGeo(58.5877, 16.1924, 20000000) + + -- HDR / Image options: + openspace.setPropertyValueSingle('RenderEngine.Gamma', 1.8); + + end) asset.onDeinitialize(function () sceneHelper.unbindKeys(Keybindings) openspace.removeVirtualProperty("*Trail.Renderable.Enabled") + end) diff --git a/include/openspace/rendering/abufferrenderer.h b/include/openspace/rendering/abufferrenderer.h index 51179398c3..cc0403e607 100644 --- a/include/openspace/rendering/abufferrenderer.h +++ b/include/openspace/rendering/abufferrenderer.h @@ -71,7 +71,16 @@ public: void setBloomThreMax(float maxV) override; void setBloomOrigFactor(float origFactor) override; void setBloomNewFactor(float newFactor) override; + void setKey(float key) override; + void setYwhite(float white) override; + void setTmoSaturation(float sat) override; + void setHue(float hue) override; + void setValue(float value) override; + void setSaturation(float sat) override; + void setLightness(float lightness) override; + void setColorSpace(unsigned int colorspace) override; + void enableBloom(bool enable) override; void enableHistogram(bool enable) override; @@ -153,6 +162,15 @@ private: float _bloomNewFactor = 1.0; int _toneMapOperator = 0; bool _histogramEnabled = false; + int _numberOfBins = 1024; // JCC TODO: Add a parameter control for this. + float _tmoKey = 0.18f; + float _tmoYwhite = 1e6f; + float _tmoSaturation = 1.0f; + float _hue = 1.f; + float _saturation = 1.f; + float _value = 1.f; + float _lightness = 1.f; + unsigned int _colorSpace = 1; std::vector _mSAAPattern; diff --git a/include/openspace/rendering/renderengine.h b/include/openspace/rendering/renderengine.h index 6fbac7e43b..ea9ef56e48 100644 --- a/include/openspace/rendering/renderengine.h +++ b/include/openspace/rendering/renderengine.h @@ -64,6 +64,8 @@ public: Invalid }; + // The next enum should be synchronized with the + // defines in hdr.glsl file. enum class ToneMapOperators { EXPONENTIAL = 0, LINEAR, @@ -76,7 +78,8 @@ public: COSTA, ADAPTIVE, GLOBAL, - PHOTOGRAPHIC_REINHARD + PHOTOGRAPHIC_REINHARD, + MIPMAPPING }; enum class COLORSPACE { diff --git a/shaders/hdr.glsl b/shaders/hdr.glsl index 9eceebc5f1..7b9b25bd0f 100644 --- a/shaders/hdr.glsl +++ b/shaders/hdr.glsl @@ -22,6 +22,7 @@ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * ****************************************************************************************/ +// The next defines must being synchronized with the enum defined in file renderengine.h #define EXPONENTIAL 0 #define LINEAR 1 #define SIMPLE_REINHARD 2 @@ -34,6 +35,7 @@ #define ADAPTIVE 9 #define GLOBAL 10 #define PHOTOGRAPHIC_REINHARD 11 +#define MIPMAPPING 12 const float HCV_EPSILON = 1e-10; const float HSL_EPSILON = 1e-10; diff --git a/src/rendering/abufferrenderer.cpp b/src/rendering/abufferrenderer.cpp index 6290738fdf..a627480d59 100644 --- a/src/rendering/abufferrenderer.cpp +++ b/src/rendering/abufferrenderer.cpp @@ -755,6 +755,38 @@ void ABufferRenderer::setBloomNewFactor(float newFactor) { _bloomNewFactor = newFactor; } +void ABufferRenderer::setKey(float key) { + _tmoKey = key; +} + +void ABufferRenderer::setYwhite(float white) { + _tmoYwhite = white; +} + +void ABufferRenderer::setTmoSaturation(float sat) { + _tmoSaturation = sat; +} + +void ABufferRenderer::setHue(float hue) { + _hue = hue; +} + +void ABufferRenderer::setValue(float value) { + _value = value; +} + +void ABufferRenderer::setSaturation(float sat) { + _saturation = sat; +} + +void ABufferRenderer::setLightness(float lightness) { + _lightness = lightness; +} + +void ABufferRenderer::setColorSpace(unsigned int colorspace) { + _colorSpace = colorspace; +} + void ABufferRenderer::enableBloom(bool enable) { _bloomEnabled = enable; } diff --git a/src/rendering/framebufferrenderer.cpp b/src/rendering/framebufferrenderer.cpp index 3b5e7f8c48..f015a3bb9c 100644 --- a/src/rendering/framebufferrenderer.cpp +++ b/src/rendering/framebufferrenderer.cpp @@ -698,7 +698,7 @@ void FramebufferRenderer::computeMipMappingFromHDRBuffer(GLuint oglImageBuffer) _tmoProgram->setUniform(_tmoUniformCache.Ywhite, _tmoYwhite); _tmoProgram->setUniform(_tmoUniformCache.sat, _tmoSaturation); - glBindFramebuffer(GL_FRAMEBUFFER, _tmoFramebuffer); + /*glBindFramebuffer(GL_FRAMEBUFFER, _tmoFramebuffer); GLenum textureBuffer[] = { GL_COLOR_ATTACHMENT0 }; @@ -706,16 +706,14 @@ void FramebufferRenderer::computeMipMappingFromHDRBuffer(GLuint oglImageBuffer) glClearColor(0.0, 0.0, 0.0, 1.0); glClear(GL_COLOR_BUFFER_BIT); - glViewport(0, 0, _resolution.x, _resolution.y); + glViewport(0, 0, _resolution.x, _resolution.y);*/ glBindVertexArray(_screenQuad); _tmoProgram->activate(); glDrawArrays(GL_TRIANGLES, 0, 6); - _tmoProgram->deactivate(); - glBindVertexArray(0); } @@ -1671,50 +1669,61 @@ void FramebufferRenderer::render(Scene* scene, Camera* camera, float blackoutFac } - // DEBUG - JCC - { - glDisable(GL_DEPTH_TEST); + // Disabling depth test for filtering and hdr + glDisable(GL_DEPTH_TEST); - //// Results of the DeferredTasks as entry for the bloom filter - //applyBloomFilter(); + if (_bloomEnabled) { + // Results of the DeferredTasks as entry for the bloom filter + applyBloomFilter(); + } - float averageLuminaceInFB = 0.0; - //if (_toneMapOperator == - // static_cast(openspace::RenderEngine::ToneMapOperators::GLOBAL) - // ) - //{ - // averageLuminaceInFB = computeBufferAveLuminanceGPU(); - // if (std::isnan(averageLuminaceInFB)) { - // averageLuminaceInFB = 1000.0; - // } - //} - // - ////float averageLuminaceInFB = 0.5; + float averageLuminaceInFB = 0.0; + //if (_toneMapOperator == + // static_cast(openspace::RenderEngine::ToneMapOperators::GLOBAL) + // ) + //{ + // averageLuminaceInFB = computeBufferAveLuminanceGPU(); + // if (std::isnan(averageLuminaceInFB)) { + // averageLuminaceInFB = 1000.0; + // } + //} + // + ////float averageLuminaceInFB = 0.5; - glBindFramebuffer(GL_FRAMEBUFFER, defaultFbo); - glViewport(0, 0, _resolution.x, _resolution.y); + glBindFramebuffer(GL_FRAMEBUFFER, defaultFbo); + glViewport(0, 0, _resolution.x, _resolution.y); + + if (_toneMapOperator == + static_cast(openspace::RenderEngine::ToneMapOperators::MIPMAPPING)) { + + if (_bloomEnabled) { + computeMipMappingFromHDRBuffer(_bloomTexture[2]); + } + else { + computeMipMappingFromHDRBuffer(_hdrFilteringTexture); + } + } + else { _hdrFilteringProgram->activate(); ghoul::opengl::TextureUnit hdrFeedingTextureUnit; hdrFeedingTextureUnit.activate(); - //if (_bloomEnabled) { - // // Bloom Enabled - // glBindTexture(GL_TEXTURE_2D, _bloomTexture[2]); - //} - //else { - // No Bloom + if (_bloomEnabled) { + glBindTexture(GL_TEXTURE_2D, _bloomTexture[2]); + } + else { glBindTexture(GL_TEXTURE_2D, _hdrFilteringTexture); - /*}*/ + } _hdrFilteringProgram->setUniform( _hdrUniformCache.deferredResultsTexture, hdrFeedingTextureUnit ); - - + + _hdrFilteringProgram->setUniform(_hdrUniformCache.blackoutFactor, blackoutFactor); - _hdrFilteringProgram->setUniform(_hdrUniformCache.backgroundConstant, - _hdrBackground); + _hdrFilteringProgram->setUniform(_hdrUniformCache.backgroundConstant, + _hdrBackground); _hdrFilteringProgram->setUniform(_hdrUniformCache.hdrExposure, _hdrExposure); _hdrFilteringProgram->setUniform(_hdrUniformCache.gamma, _gamma); _hdrFilteringProgram->setUniform(_hdrUniformCache.toneMapOperator, _toneMapOperator); @@ -1732,19 +1741,17 @@ void FramebufferRenderer::render(Scene* scene, Camera* camera, float blackoutFac glBindVertexArray(0); _hdrFilteringProgram->deactivate(); - - //================================ - // Adjusting color and brightness - //================================ - // - //// Histogram Equalization - //computeImageHistogram(); - - //computeMipMappingFromHDRBuffer(_hdrFilteringTexture); - - //glBindFramebuffer(GL_FRAMEBUFFER, defaultFbo); } + + //================================ + // Adjusting color and brightness + //================================ + // + //// Histogram Equalization + //computeImageHistogram(); + + //glBindFramebuffer(GL_FRAMEBUFFER, defaultFbo); } diff --git a/src/rendering/renderengine.cpp b/src/rendering/renderengine.cpp index 134a8b8e8a..33ceafcc39 100644 --- a/src/rendering/renderengine.cpp +++ b/src/rendering/renderengine.cpp @@ -397,6 +397,7 @@ RenderEngine::RenderEngine() _toneMapOperator.addOption(static_cast(ToneMapOperators::ADAPTIVE), "Adaptive"); _toneMapOperator.addOption(static_cast(ToneMapOperators::GLOBAL), "Global"); _toneMapOperator.addOption(static_cast(ToneMapOperators::PHOTOGRAPHIC_REINHARD), "Photographic Reinhard"); + _toneMapOperator.addOption(static_cast(ToneMapOperators::MIPMAPPING), "MipMapping Global/Local Reinhard"); _toneMapOperator.set(8); _toneMapOperator.onChange([this]() { From 05021973365a0a30cd598691c17e67a9ad11ddae Mon Sep 17 00:00:00 2001 From: Jonathas Costa Date: Mon, 25 Feb 2019 10:02:25 -0500 Subject: [PATCH 08/39] Improved memory consumption and performance. Added default parameters. --- data/assets/default.scene | 9 +++++-- .../openspace/rendering/framebufferrenderer.h | 2 +- include/openspace/rendering/renderengine.h | 24 +++++++++---------- .../shaders/atmosphere_deferred_fs.glsl | 16 ++++++++----- shaders/framebuffer/hdrAndFiltering.frag | 2 +- src/rendering/framebufferrenderer.cpp | 6 ++--- 6 files changed, 34 insertions(+), 25 deletions(-) diff --git a/data/assets/default.scene b/data/assets/default.scene index 4e53b0a0a7..90777c2e39 100644 --- a/data/assets/default.scene +++ b/data/assets/default.scene @@ -104,8 +104,13 @@ asset.onInitialize(function () openspace.globebrowsing.goToGeo(58.5877, 16.1924, 20000000) -- HDR / Image options: - openspace.setPropertyValueSingle('RenderEngine.Gamma', 1.8); - + openspace.setPropertyValueSingle('RenderEngine.Gamma', 0.47); + openspace.setPropertyValueSingle('RenderEngine.HDRExposure', 0.47); + openspace.setPropertyValueSingle('RenderEngine.Background Exposure', 7.85); + openspace.setPropertyValueSingle('RenderEngine.ToneMapOperator', 8); + openspace.setPropertyValueSingle('RenderEngine.Lightness', 0.995); + openspace.setPropertyValueSingle('RenderEngine.BloomNewColorFactor', 9.0); + --openspace.setPropertyValueSingle('RenderEngine.', ); end) diff --git a/include/openspace/rendering/framebufferrenderer.h b/include/openspace/rendering/framebufferrenderer.h index 1c7b8e0e6c..1f2694fea6 100644 --- a/include/openspace/rendering/framebufferrenderer.h +++ b/include/openspace/rendering/framebufferrenderer.h @@ -211,7 +211,7 @@ private: float _bloomThresholdMax = 1.0; float _bloomOrigFactor = 1.0; float _bloomNewFactor = 1.0; - int _toneMapOperator = 0; + int _toneMapOperator = 8; // JCC TODO: temporarilly set to 8 because setProperty seems not to be working for OptionProperty bool _histogramEnabled = false; int _numberOfBins = 1024; // JCC TODO: Add a parameter control for this. float _tmoKey = 0.18f; diff --git a/include/openspace/rendering/renderengine.h b/include/openspace/rendering/renderengine.h index ea9ef56e48..3c8dfe318f 100644 --- a/include/openspace/rendering/renderengine.h +++ b/include/openspace/rendering/renderengine.h @@ -68,18 +68,18 @@ public: // defines in hdr.glsl file. enum class ToneMapOperators { EXPONENTIAL = 0, - LINEAR, - SIMPLE_REINHARD, - LUM_BASED_REINHARD, - WHITE_PRESERVING, - ROM_BIN_DA_HOUSE, - FILMIC, - UNCHARTED, - COSTA, - ADAPTIVE, - GLOBAL, - PHOTOGRAPHIC_REINHARD, - MIPMAPPING + LINEAR, //1 + SIMPLE_REINHARD, //2 + LUM_BASED_REINHARD, //3 + WHITE_PRESERVING, //4 + ROM_BIN_DA_HOUSE, //5 + FILMIC, //6 + UNCHARTED, //7 + COSTA, //8 + ADAPTIVE, //8 + GLOBAL, //9 + PHOTOGRAPHIC_REINHARD, //10 + MIPMAPPING //11 }; enum class COLORSPACE { diff --git a/modules/atmosphere/shaders/atmosphere_deferred_fs.glsl b/modules/atmosphere/shaders/atmosphere_deferred_fs.glsl index deb258f12c..451aa7405f 100644 --- a/modules/atmosphere/shaders/atmosphere_deferred_fs.glsl +++ b/modules/atmosphere/shaders/atmosphere_deferred_fs.glsl @@ -422,6 +422,7 @@ vec3 inscatterRadiance(inout vec3 x, inout float t, inout float irradianceFactor // we can change it on the fly with no precomputations) // return radiance * sunRadiance; vec3 finalScatteringRadiance = radiance * sunIntensity; + if (groundHit) { return finalScatteringRadiance; } else { @@ -542,6 +543,7 @@ void main() { if (cullAtmosphere == 0) { vec4 atmosphereFinalColor = vec4(0.0f); + vec4 backgroundFinalColor = vec4(0.0f); int nSamples = 1; // First we determine if the pixel is complex (different fragments on it) @@ -691,14 +693,18 @@ void main() { } else { // no intersection //atmosphereFinalColor += vec4(HDR(color.xyz * backgroundConstant, atmExposure), color.a); - atmosphereFinalColor += vec4(color.xyz * backgroundConstant, color.a); + //atmosphereFinalColor += vec4(color.xyz * backgroundConstant, color.a); + //backgroundFinalColor += color; + discard; } } - renderTarget = atmosphereFinalColor / float(nSamples); + renderTarget = atmosphereFinalColor / float(nSamples); - // if (complex) - // renderTarget = vec4(1.0, 0.0, 0.0, 1.0); + // renderTarget = vec4( + // (atmosphereFinalColor.xyz + (backgroundFinalColor.xyz * backgroundConstant)) / float(nSamples), + // (atmosphereFinalColor.a + backgroundFinalColor.a) / float(nSamples) + // ); } else { // culling if (firstPaint) { @@ -714,8 +720,6 @@ void main() { else { discard; } - //renderTarget = vec4(1.0, 0.0, 0.0, 1.0); - } } diff --git a/shaders/framebuffer/hdrAndFiltering.frag b/shaders/framebuffer/hdrAndFiltering.frag index 781cd11b74..afa8de682f 100644 --- a/shaders/framebuffer/hdrAndFiltering.frag +++ b/shaders/framebuffer/hdrAndFiltering.frag @@ -119,7 +119,7 @@ void main() { } if (colorSpace == HSL_COLOR) { - vec3 hslColor = rgb2hsl(tColor); + vec3 hslColor = rgb2hsl(tColor); hslColor.x *= Hue; hslColor.y *= Saturation; hslColor.z *= Lightness; diff --git a/src/rendering/framebufferrenderer.cpp b/src/rendering/framebufferrenderer.cpp index f015a3bb9c..008289dfcc 100644 --- a/src/rendering/framebufferrenderer.cpp +++ b/src/rendering/framebufferrenderer.cpp @@ -855,7 +855,7 @@ void FramebufferRenderer::updateResolution() { glTexImage2DMultisample( GL_TEXTURE_2D_MULTISAMPLE, _nAaSamples, - GL_RGBA32F, + GL_RGBA16F, _resolution.x, _resolution.y, true @@ -866,7 +866,7 @@ void FramebufferRenderer::updateResolution() { glTexImage2DMultisample( GL_TEXTURE_2D_MULTISAMPLE, _nAaSamples, - GL_RGBA32F, + GL_RGBA16F, _resolution.x, _resolution.y, true @@ -878,7 +878,7 @@ void FramebufferRenderer::updateResolution() { glTexImage2D( GL_TEXTURE_2D, 0, - GL_RGBA32F, + GL_RGBA16F, _resolution.x, _resolution.y, 0, From 26e55cab90828e3b30e445cb80032a228a7f472f Mon Sep 17 00:00:00 2001 From: Jonathas Costa Date: Tue, 26 Feb 2019 15:47:08 -0500 Subject: [PATCH 09/39] Fixing tmo by mipmapping. --- shaders/framebuffer/computeTMO_fs.glsl | 5 +++- src/rendering/framebufferrenderer.cpp | 34 ++++++++++++++------------ 2 files changed, 22 insertions(+), 17 deletions(-) diff --git a/shaders/framebuffer/computeTMO_fs.glsl b/shaders/framebuffer/computeTMO_fs.glsl index d8b2fc16b6..3a0e6c0db6 100644 --- a/shaders/framebuffer/computeTMO_fs.glsl +++ b/shaders/framebuffer/computeTMO_fs.glsl @@ -78,5 +78,8 @@ void main() { float logAvgLum = exp(texture(hdrSampler, texCoord, 20).a); - finalColor.rgb = toneMapGlobal(hdrColor, logAvgLum); + //finalColor.rgb = toneMapGlobal(hdrColor, logAvgLum); + + finalColor = vec4(toneMapGlobal(hdrColor, logAvgLum), 1.0); + finalColor = vec4(1.0, 0.0, 0.0, 1.0); } diff --git a/src/rendering/framebufferrenderer.cpp b/src/rendering/framebufferrenderer.cpp index 008289dfcc..df763044e3 100644 --- a/src/rendering/framebufferrenderer.cpp +++ b/src/rendering/framebufferrenderer.cpp @@ -686,18 +686,7 @@ void FramebufferRenderer::computeImageHistogram() { } void FramebufferRenderer::computeMipMappingFromHDRBuffer(GLuint oglImageBuffer) { - ghoul::opengl::TextureUnit samplerUnit; - glBindSampler(samplerUnit, _tmoHdrSampler); - samplerUnit.activate(); - glBindTexture(GL_TEXTURE_2D, oglImageBuffer); - - glGenerateMipmap(GL_TEXTURE_2D); - - _tmoProgram->setUniform(_tmoUniformCache.hdrSampler, samplerUnit); - _tmoProgram->setUniform(_tmoUniformCache.key, _tmoKey); - _tmoProgram->setUniform(_tmoUniformCache.Ywhite, _tmoYwhite); - _tmoProgram->setUniform(_tmoUniformCache.sat, _tmoSaturation); - + glEnable(GL_FRAMEBUFFER_SRGB); /*glBindFramebuffer(GL_FRAMEBUFFER, _tmoFramebuffer); GLenum textureBuffer[] = { GL_COLOR_ATTACHMENT0 @@ -708,13 +697,27 @@ void FramebufferRenderer::computeMipMappingFromHDRBuffer(GLuint oglImageBuffer) glClear(GL_COLOR_BUFFER_BIT); glViewport(0, 0, _resolution.x, _resolution.y);*/ - glBindVertexArray(_screenQuad); + ghoul::opengl::TextureUnit samplerUnit; + samplerUnit.activate(); + glBindTexture(GL_TEXTURE_2D, oglImageBuffer); + glBindSampler(samplerUnit.operator GLint(), _tmoHdrSampler); + + glGenerateMipmap(GL_TEXTURE_2D); _tmoProgram->activate(); + _tmoProgram->setUniform(_tmoUniformCache.hdrSampler, samplerUnit); + _tmoProgram->setUniform(_tmoUniformCache.key, _tmoKey); + _tmoProgram->setUniform(_tmoUniformCache.Ywhite, _tmoYwhite); + _tmoProgram->setUniform(_tmoUniformCache.sat, _tmoSaturation); + + glBindVertexArray(_screenQuad); glDrawArrays(GL_TRIANGLES, 0, 6); + _tmoProgram->deactivate(); + glBindVertexArray(0); + glBindSampler(oglImageBuffer, 0); } void FramebufferRenderer::update() { @@ -878,7 +881,7 @@ void FramebufferRenderer::updateResolution() { glTexImage2D( GL_TEXTURE_2D, 0, - GL_RGBA16F, + GL_RGBA32F, _resolution.x, _resolution.y, 0, @@ -1695,13 +1698,12 @@ void FramebufferRenderer::render(Scene* scene, Camera* camera, float blackoutFac if (_toneMapOperator == static_cast(openspace::RenderEngine::ToneMapOperators::MIPMAPPING)) { - if (_bloomEnabled) { computeMipMappingFromHDRBuffer(_bloomTexture[2]); } else { computeMipMappingFromHDRBuffer(_hdrFilteringTexture); - } + } } else { _hdrFilteringProgram->activate(); From 5fc11c9df2c83e43983150f7ad66c1dd9bac3207 Mon Sep 17 00:00:00 2001 From: Jonathas Costa Date: Wed, 19 Jun 2019 20:14:34 -0400 Subject: [PATCH 10/39] Version with no NVidia hdr (removed now), transparency back to previous and LDR to HDR in Colors. Fix compilation for testing. (JCC: Add back changes before clean up). --- data/assets/default.scene | 10 +-- data/assets/scene/solarsystem/sun/glare.asset | 3 +- include/openspace/rendering/abufferrenderer.h | 2 - .../openspace/rendering/framebufferrenderer.h | 27 +++--- include/openspace/rendering/renderengine.h | 26 +++++- include/openspace/rendering/renderer.h | 2 - .../rendering/atmospheredeferredcaster.cpp | 2 +- .../rendering/renderableatmosphere.cpp | 2 +- .../shaders/atmosphere_deferred_fs.glsl | 19 +++-- shaders/hdr.glsl | 10 +-- src/rendering/abufferrenderer.cpp | 13 --- src/rendering/framebufferrenderer.cpp | 84 +++++++++++-------- src/rendering/renderengine.cpp | 31 +++---- 13 files changed, 125 insertions(+), 106 deletions(-) diff --git a/data/assets/default.scene b/data/assets/default.scene index 90777c2e39..43b026795b 100644 --- a/data/assets/default.scene +++ b/data/assets/default.scene @@ -104,12 +104,12 @@ asset.onInitialize(function () openspace.globebrowsing.goToGeo(58.5877, 16.1924, 20000000) -- HDR / Image options: - openspace.setPropertyValueSingle('RenderEngine.Gamma', 0.47); - openspace.setPropertyValueSingle('RenderEngine.HDRExposure', 0.47); - openspace.setPropertyValueSingle('RenderEngine.Background Exposure', 7.85); + openspace.setPropertyValueSingle('RenderEngine.Gamma', 0.86); + openspace.setPropertyValueSingle('RenderEngine.HDRExposure', 1.68); openspace.setPropertyValueSingle('RenderEngine.ToneMapOperator', 8); - openspace.setPropertyValueSingle('RenderEngine.Lightness', 0.995); - openspace.setPropertyValueSingle('RenderEngine.BloomNewColorFactor', 9.0); + openspace.setPropertyValueSingle('RenderEngine.Lightness', 1.1); + openspace.setPropertyValueSingle('RenderEngine.Saturation', 1.45); + openspace.setPropertyValueSingle('RenderEngine.BloomNewColorFactor', 6.0); --openspace.setPropertyValueSingle('RenderEngine.', ); end) diff --git a/data/assets/scene/solarsystem/sun/glare.asset b/data/assets/scene/solarsystem/sun/glare.asset index 14e3af3264..c39860e4ca 100644 --- a/data/assets/scene/solarsystem/sun/glare.asset +++ b/data/assets/scene/solarsystem/sun/glare.asset @@ -14,7 +14,8 @@ local SunGlare = { Origin = "Center", Billboard = true, Texture = textures .. "/halo.png", - BlendMode = "Additive" + BlendMode = "Additive", + Opacity = 0.65 }, Transform = { Translation = { diff --git a/include/openspace/rendering/abufferrenderer.h b/include/openspace/rendering/abufferrenderer.h index cc0403e607..7191f5fca1 100644 --- a/include/openspace/rendering/abufferrenderer.h +++ b/include/openspace/rendering/abufferrenderer.h @@ -63,7 +63,6 @@ public: void setResolution(glm::ivec2 res) override; void setNAaSamples(int nAaSamples) override; void setHDRExposure(float hdrExposure) override; - void setHDRBackground(float hdrBackground) override; void setGamma(float gamma) override; void setMaxWhite(float maxWhite) override; void setToneMapOperator(int tmOp) override; @@ -84,7 +83,6 @@ public: void enableBloom(bool enable) override; void enableHistogram(bool enable) override; - float hdrBackground() const override; int nAaSamples() const override; const std::vector& mSSAPattern() const override; diff --git a/include/openspace/rendering/framebufferrenderer.h b/include/openspace/rendering/framebufferrenderer.h index 1f2694fea6..ab34cb1001 100644 --- a/include/openspace/rendering/framebufferrenderer.h +++ b/include/openspace/rendering/framebufferrenderer.h @@ -26,6 +26,7 @@ #define __OPENSPACE_CORE___FRAMEBUFFERRENDERER___H__ #include +#include #include #include @@ -86,7 +87,6 @@ public: void setResolution(glm::ivec2 res) override; void setNAaSamples(int nAaSamples) override; void setHDRExposure(float hdrExposure) override; - void setHDRBackground(float hdrBackground) override; void setGamma(float gamma) override; void setMaxWhite(float maxWhite) override; void setToneMapOperator(int tmOp) override; @@ -106,7 +106,6 @@ public: void enableBloom(bool enable) override; void enableHistogram(bool enable) override; - float hdrBackground() const override; int nAaSamples() const override; const std::vector& mSSAPattern() const override; @@ -153,16 +152,14 @@ private: std::unique_ptr _resolveProgram; UniformCache(mainColorTexture, blackoutFactor, nAaSamples) _uniformCache; - UniformCache(deferredResultsTexture, blackoutFactor, backgroundConstant, - hdrExposure, gamma, toneMapOperator, aveLum, maxWhite, - Hue, Saturation, Value, Lightness, colorSpace) - _hdrUniformCache; + UniformCache(deferredResultsTexture, blackoutFactor, hdrExposure, gamma, + toneMapOperator, aveLum, maxWhite, Hue, Saturation, Value, + Lightness, colorSpace) _hdrUniformCache; UniformCache(renderedImage, bloomImage, bloomThresholdMin, bloomThresholdMax, - bloomOrigFactor, bloomNewFactor) _bloomUniformCache; + bloomOrigFactor, bloomNewFactor) _bloomUniformCache; - UniformCache(renderedImage, maxWhite, imageWidth, - imageHeight) _histoUniformCache; + UniformCache(renderedImage, maxWhite, imageWidth, imageHeight) _histoUniformCache; UniformCache(hdrSampler, key, Ywhite, sat) _tmoUniformCache; @@ -202,9 +199,8 @@ private: glm::ivec2 _resolution = glm::ivec2(0); int _nAaSamples; - float _hdrExposure = 0.4f; - float _hdrBackground = 2.8f; - float _gamma = 2.2f; + float _hdrExposure = 1.68f; + float _gamma = 0.86f; float _maxWhite = 1.0f; bool _bloomEnabled = false; float _bloomThresholdMin = 0.0; @@ -218,15 +214,18 @@ private: float _tmoYwhite = 1e6f; float _tmoSaturation = 1.0f; float _hue = 1.f; - float _saturation = 1.f; + float _saturation = 1.45f; float _value = 1.f; - float _lightness = 1.f; + float _lightness = 1.1f; unsigned int _colorSpace = 1; std::vector _mSAAPattern; std::vector _histoPoints; ghoul::Dictionary _rendererData; + + // Capture Default OpenSpace GL State + RenderEngine::GLDefaultState _osDefaultGLState; }; } // namespace openspace diff --git a/include/openspace/rendering/renderengine.h b/include/openspace/rendering/renderengine.h index 3c8dfe318f..a85fcaacf7 100644 --- a/include/openspace/rendering/renderengine.h +++ b/include/openspace/rendering/renderengine.h @@ -33,6 +33,8 @@ #include #include +#include + namespace ghoul { class Dictionary; class SharedMemory; @@ -87,6 +89,23 @@ public: HSL }; + struct GLDefaultState { + GLboolean blendEnabled; + GLboolean blend0Enabled; + GLboolean blend1Enabled; + GLboolean blend2Enabled; + GLboolean blend3Enabled; + GLboolean cullFaceEnabled; + GLboolean depthTestEnabled; + GLint defaultFBO; + GLenum blendEquationRGB; + GLenum blendEquationAlpha; + GLenum blendDestAlpha; + GLenum blendDestRGB; + GLenum blendSrcAlpha; + GLenum blendSrcRGB; + }; + RenderEngine(); ~RenderEngine(); @@ -169,6 +188,10 @@ public: */ static scripting::LuaLibrary luaLibrary(); + const RenderEngine::GLDefaultState& glDefaultState() const; + void setGLDefaultState(RenderEngine::GLDefaultState glDS); + + // Temporary fade functionality void startFading(int direction, float fadeDuration); @@ -188,6 +211,8 @@ private: Camera* _camera = nullptr; Scene* _scene = nullptr; + GLDefaultState _glDefaultState; + properties::BoolProperty _doPerformanceMeasurements; std::unique_ptr _renderer; @@ -224,7 +249,6 @@ private: properties::PropertyOwner _tmoOwner; properties::FloatProperty _hdrExposure; - properties::FloatProperty _hdrBackground; properties::FloatProperty _maxWhite; properties::OptionProperty _toneMapOperator; properties::FloatProperty _tmoKey; diff --git a/include/openspace/rendering/renderer.h b/include/openspace/rendering/renderer.h index 87c84b6131..2d31303f34 100644 --- a/include/openspace/rendering/renderer.h +++ b/include/openspace/rendering/renderer.h @@ -51,7 +51,6 @@ public: virtual void setResolution(glm::ivec2 res) = 0; virtual void setNAaSamples(int nAaSamples) = 0; virtual void setHDRExposure(float hdrExposure) = 0; - virtual void setHDRBackground(float hdrBackground) = 0; virtual void setGamma(float gamma) = 0; virtual void setMaxWhite(float maxWhite) = 0; virtual void setToneMapOperator(int tmOp) = 0; @@ -71,7 +70,6 @@ public: virtual void enableBloom(bool enable) = 0; virtual void enableHistogram(bool enable) = 0; - virtual float hdrBackground() const = 0; virtual int nAaSamples() const = 0; virtual const std::vector& mSSAPattern() const = 0; diff --git a/modules/atmosphere/rendering/atmospheredeferredcaster.cpp b/modules/atmosphere/rendering/atmospheredeferredcaster.cpp index 8ae5ff6d1e..f24dcf1ccb 100644 --- a/modules/atmosphere/rendering/atmospheredeferredcaster.cpp +++ b/modules/atmosphere/rendering/atmospheredeferredcaster.cpp @@ -147,7 +147,7 @@ AtmosphereDeferredcaster::AtmosphereDeferredcaster() , _ozoneHeightScale(0.f) , _mieHeightScale(0.f) , _miePhaseConstant(0.f) - , _sunRadianceIntensity(50.0f) + , _sunRadianceIntensity(5.f) , _rayleighScatteringCoeff(glm::vec3(0.f)) , _ozoneExtinctionCoeff(glm::vec3(0.f)) , _mieScatteringCoeff(glm::vec3(0.f)) diff --git a/modules/atmosphere/rendering/renderableatmosphere.cpp b/modules/atmosphere/rendering/renderableatmosphere.cpp index 6bae40f3aa..a4062f0aeb 100644 --- a/modules/atmosphere/rendering/renderableatmosphere.cpp +++ b/modules/atmosphere/rendering/renderableatmosphere.cpp @@ -265,7 +265,7 @@ RenderableAtmosphere::RenderableAtmosphere(const ghoul::Dictionary& dictionary) , _ozoneHeightScale(0.f) , _mieHeightScale(0.f) , _miePhaseConstant(0.f) - , _sunRadianceIntensity(50.f) + , _sunRadianceIntensity(5.f) , _mieExtinctionCoeff(glm::vec3(0.f)) , _rayleighScatteringCoeff(glm::vec3(0.f)) , _ozoneExtinctionCoeff(glm::vec3(0.f)) diff --git a/modules/atmosphere/shaders/atmosphere_deferred_fs.glsl b/modules/atmosphere/shaders/atmosphere_deferred_fs.glsl index 451aa7405f..e133522f54 100644 --- a/modules/atmosphere/shaders/atmosphere_deferred_fs.glsl +++ b/modules/atmosphere/shaders/atmosphere_deferred_fs.glsl @@ -73,8 +73,6 @@ uniform int cullAtmosphere; // The following uniforms are // set into the current Renderer -// Background exposure hack -uniform float backgroundConstant; uniform bool firstPaint; uniform float atmExposure; @@ -426,7 +424,8 @@ vec3 inscatterRadiance(inout vec3 x, inout float t, inout float irradianceFactor if (groundHit) { return finalScatteringRadiance; } else { - return ((r-Rg) * invRtMinusRg)*spaceColor.rgb * backgroundConstant + finalScatteringRadiance; + //return ((r-Rg) * invRtMinusRg)*spaceColor.rgb + finalScatteringRadiance; + return attenuation * spaceColor.rgb + finalScatteringRadiance; } } @@ -568,8 +567,7 @@ void main() { for (int i = 0; i < nSamples; i++) { // Color from G-Buffer //vec4 color = texelFetch(mainColorTexture, fragCoords, i); - vec4 color = colorArray[i]; - + vec4 color = vec4(-log2(vec3(1.0) - colorArray[i].rgb), colorArray[i].a); // Ray in object space dRay ray; dvec4 planetPositionObjectCoords = dvec4(0.0); @@ -633,10 +631,10 @@ void main() { pixelDepth *= 0.001; positionObjectsCoords.xyz *= 0.001; - if (position.xyz != vec3(0.0) && (pixelDepth < offset)) { + if (dot(position.xyz, vec3(1.0)) > 0.0 && (pixelDepth < offset)) { // ATM Occluded - Something in fron of ATM. //atmosphereFinalColor += vec4(HDR(color.xyz * backgroundConstant, atmExposure), color.a); - atmosphereFinalColor += vec4(color.xyz * backgroundConstant, color.a); + atmosphereFinalColor += vec4(color.xyz, color.a); } else { // Following paper nomenclature double t = offset; @@ -714,10 +712,13 @@ void main() { } bColor /= float(nAaSamples); //renderTarget = vec4(HDR(bColor.xyz * backgroundConstant, atmExposure), bColor.a); - renderTarget = vec4(bColor.xyz * backgroundConstant, bColor.a); - //renderTarget = vec4(bColor.xyz , bColor.a); + //renderTarget = vec4(bColor.xyz * backgroundConstant, bColor.a); + renderTarget = vec4(-log2(vec3(1.0) - bColor.rgb), bColor.a); + //renderTarget = bColor; + } else { + //renderTarget = vec4(vec3(1.0, 0.0, 0.0), 1.0); discard; } } diff --git a/shaders/hdr.glsl b/shaders/hdr.glsl index 7b9b25bd0f..bb6390998f 100644 --- a/shaders/hdr.glsl +++ b/shaders/hdr.glsl @@ -182,9 +182,9 @@ vec3 globalToneMappingOperatorRTR(vec3 color, const float exposure, const float vec3 exponentialToneMapping(vec3 color, const float exposure, const float gamma) { color *= exposure; - color.r = color.r < 1.413 ? pow(color.r * 0.38317, 1.0 / gamma) : 1.0 - exp(-color.r); - color.g = color.g < 1.413 ? pow(color.g * 0.38317, 1.0 / gamma) : 1.0 - exp(-color.g); - color.b = color.b < 1.413 ? pow(color.b * 0.38317, 1.0 / gamma) : 1.0 - exp(-color.b); + color.r = color.r < 1.413 ? pow(color.r * 0.38317, 1.0 / gamma) : 1.0 - exp2(-exposure * color.r); + color.g = color.g < 1.413 ? pow(color.g * 0.38317, 1.0 / gamma) : 1.0 - exp2(-exposure * color.g); + color.b = color.b < 1.413 ? pow(color.b * 0.38317, 1.0 / gamma) : 1.0 - exp2(-exposure * color.b); return color; } @@ -220,7 +220,7 @@ vec3 whitePreservingLumaBasedReinhardToneMapping(vec3 color, const float maxWhit } vec3 RomBinDaHouseToneMapping(vec3 color) { - color = exp( -1.f / ( 2.72f * color + 0.15f ) ); + color = exp2( -1.f / ( 2.72f * color + 0.15f ) ); return color; } @@ -247,7 +247,7 @@ vec3 Uncharted2ToneMapping(vec3 color, const float exposure) { } vec3 jToneMapping(vec3 color, const float exposure) { - return 1.0 - exp(-exposure * color); + return 1.0 - exp2(-exposure * color); } vec3 gammaCorrection(vec3 color, const float gamma) { diff --git a/src/rendering/abufferrenderer.cpp b/src/rendering/abufferrenderer.cpp index a627480d59..3e8f28a529 100644 --- a/src/rendering/abufferrenderer.cpp +++ b/src/rendering/abufferrenderer.cpp @@ -710,15 +710,6 @@ void ABufferRenderer::setHDRExposure(float hdrExposure) { } } -void ABufferRenderer::setHDRBackground(float hdrBackground) { - _hdrBackground = hdrBackground; - if (_hdrBackground < 0.f) { - LERROR("HDR Background constant must be greater than zero."); - _hdrBackground = 1.0; - } -} - - void ABufferRenderer::setGamma(float gamma) { _gamma = gamma; if (_gamma < 0.f) { @@ -795,10 +786,6 @@ void ABufferRenderer::enableHistogram(bool enable) { _histogramEnabled = enable; } -float ABufferRenderer::hdrBackground() const { - return _hdrBackground; -} - int ABufferRenderer::nAaSamples() const { return _nAaSamples; } diff --git a/src/rendering/framebufferrenderer.cpp b/src/rendering/framebufferrenderer.cpp index df763044e3..71cf00da87 100644 --- a/src/rendering/framebufferrenderer.cpp +++ b/src/rendering/framebufferrenderer.cpp @@ -55,10 +55,10 @@ namespace { "mainColorTexture", "blackoutFactor", "nAaSamples" }; - constexpr const std::array HDRUniformNames = { - "deferredResultsTexture", "blackoutFactor", "backgroundConstant", - "hdrExposure", "gamma", "toneMapOperator", "aveLum", "maxWhite", - "Hue", "Saturation", "Value", "Lightness", "colorSpace" + constexpr const std::array HDRUniformNames = { + "deferredResultsTexture", "blackoutFactor", "hdrExposure", "gamma", + "toneMapOperator", "aveLum", "maxWhite", "Hue", "Saturation", "Value", + "Lightness", "colorSpace" }; constexpr const std::array BloomUniformNames = { @@ -147,6 +147,9 @@ void FramebufferRenderer::initialize() { glGenTextures(1, &_mainColorTexture); glGenTextures(1, &_mainDepthTexture); glGenTextures(1, &_mainFilterTexture); + // Deferred textures used in Main framebuffer + glGenTextures(1, &_mainPositionTexture); + glGenTextures(1, &_mainNormalTexture); glGenFramebuffers(1, &_mainFramebuffer); // Exit framebuffer @@ -154,10 +157,6 @@ void FramebufferRenderer::initialize() { glGenTextures(1, &_exitDepthTexture); glGenFramebuffers(1, &_exitFramebuffer); - // Deferred textures - glGenTextures(1, &_mainPositionTexture); - glGenTextures(1, &_mainNormalTexture); - // HDR / Filtering Framebuffer glGenFramebuffers(1, &_hdrFilteringFramebuffer); glGenTextures(1, &_hdrFilteringTexture); @@ -389,6 +388,16 @@ void FramebufferRenderer::initialize() { global::raycasterManager.addListener(*this); global::deferredcasterManager.addListener(*this); + + // Default GL State for Blending + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glGetIntegerv(GL_BLEND_EQUATION_RGB, &_osDefaultGLState.blendEquationRGB); + glGetIntegerv(GL_BLEND_EQUATION_ALPHA, &_osDefaultGLState.blendEquationAlpha); + glGetIntegerv(GL_BLEND_DST_ALPHA, &_osDefaultGLState.blendDestAlpha); + glGetIntegerv(GL_BLEND_DST_RGB, &_osDefaultGLState.blendDestRGB); + glGetIntegerv(GL_BLEND_SRC_ALPHA, &_osDefaultGLState.blendSrcAlpha); + glGetIntegerv(GL_BLEND_SRC_RGB, &_osDefaultGLState.blendSrcRGB); + } void FramebufferRenderer::deinitialize() { @@ -881,7 +890,7 @@ void FramebufferRenderer::updateResolution() { glTexImage2D( GL_TEXTURE_2D, 0, - GL_RGBA32F, + GL_RGBA16F, _resolution.x, _resolution.y, 0, @@ -1583,11 +1592,37 @@ void FramebufferRenderer::render(Scene* scene, Camera* camera, float blackoutFac } // Capture standard fbo - GLint defaultFbo; - glGetIntegerv(GL_FRAMEBUFFER_BINDING, &defaultFbo); - + glGetIntegerv(GL_FRAMEBUFFER_BINDING, &_osDefaultGLState.defaultFBO); + + glEnablei(GL_BLEND, 0); + glDisablei(GL_BLEND, 1); + glDisablei(GL_BLEND, 2); + glDisablei(GL_BLEND, 3); + + _osDefaultGLState.blendEnabled = true; + _osDefaultGLState.blend0Enabled = true; + _osDefaultGLState.blend1Enabled = false; + _osDefaultGLState.blend2Enabled = false; + _osDefaultGLState.blend3Enabled = false; + + glBlendEquationSeparate( + _osDefaultGLState.blendEquationRGB, + _osDefaultGLState.blendEquationAlpha + ); + glBlendFuncSeparate( + _osDefaultGLState.blendSrcRGB, + _osDefaultGLState.blendDestRGB, + _osDefaultGLState.blendSrcAlpha, + _osDefaultGLState.blendDestAlpha + ); + glBindFramebuffer(GL_FRAMEBUFFER, _mainFramebuffer); glEnable(GL_DEPTH_TEST); + _osDefaultGLState.depthTestEnabled = true; + + // Update the default OS GL state to the RenderEngine to be + // available to all renderables + global::renderEngine.setGLDefaultState(_osDefaultGLState); // deferred g-buffer plus filter GLenum textureBuffers[4] = { @@ -1598,13 +1633,7 @@ void FramebufferRenderer::render(Scene* scene, Camera* camera, float blackoutFac }; glDrawBuffers(4, textureBuffers); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - glEnablei(GL_BLEND, 0); - glDisablei(GL_BLEND, 1); - glDisablei(GL_BLEND, 2); - glDisablei(GL_BLEND, 3); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - + Time time = global::timeManager.time(); RenderData data = { @@ -1693,7 +1722,7 @@ void FramebufferRenderer::render(Scene* scene, Camera* camera, float blackoutFac // ////float averageLuminaceInFB = 0.5; - glBindFramebuffer(GL_FRAMEBUFFER, defaultFbo); + glBindFramebuffer(GL_FRAMEBUFFER, _osDefaultGLState.defaultFBO); glViewport(0, 0, _resolution.x, _resolution.y); if (_toneMapOperator == @@ -1724,8 +1753,6 @@ void FramebufferRenderer::render(Scene* scene, Camera* camera, float blackoutFac _hdrFilteringProgram->setUniform(_hdrUniformCache.blackoutFactor, blackoutFactor); - _hdrFilteringProgram->setUniform(_hdrUniformCache.backgroundConstant, - _hdrBackground); _hdrFilteringProgram->setUniform(_hdrUniformCache.hdrExposure, _hdrExposure); _hdrFilteringProgram->setUniform(_hdrUniformCache.gamma, _gamma); _hdrFilteringProgram->setUniform(_hdrUniformCache.toneMapOperator, _toneMapOperator); @@ -1890,13 +1917,13 @@ void FramebufferRenderer::performDeferredTasks( ); deferredcastProgram->setUniform("nAaSamples", _nAaSamples); + // 48 = 16 samples * 3 coords deferredcastProgram->setUniform("msaaSamplePatter", &_mSAAPattern[0], 48); deferredcastProgram->setUniform("firstPaint", firstPaint); deferredcastProgram->setUniform("atmExposure", _hdrExposure); - deferredcastProgram->setUniform("backgroundConstant", _hdrBackground); - + deferredcaster->preRaycast( deferredcasterTask.renderData, _deferredcastData[deferredcaster], @@ -1959,11 +1986,6 @@ void FramebufferRenderer::setHDRExposure(float hdrExposure) { _hdrExposure = hdrExposure; } -void FramebufferRenderer::setHDRBackground(float hdrBackground) { - ghoul_assert(hdrBackground > 0.f, "HDR Background must be greater than zero"); - _hdrBackground = hdrBackground; -} - void FramebufferRenderer::setGamma(float gamma) { ghoul_assert(gamma > 0.f, "Gamma value must be greater than zero"); _gamma = gamma; @@ -2034,10 +2056,6 @@ void FramebufferRenderer::enableHistogram(bool enable) { _histogramEnabled = enable; } -float FramebufferRenderer::hdrBackground() const { - return _hdrBackground; -} - int FramebufferRenderer::nAaSamples() const { return _nAaSamples; } diff --git a/src/rendering/renderengine.cpp b/src/rendering/renderengine.cpp index 33ceafcc39..2eb1ee8d3b 100644 --- a/src/rendering/renderengine.cpp +++ b/src/rendering/renderengine.cpp @@ -182,13 +182,6 @@ namespace { "equivalent of an electronic image sensor." }; - constexpr openspace::properties::Property::PropertyInfo BackgroundExposureInfo = { - "Background Exposure", - "BackgroundExposure", - "This value determines the amount of light per unit area reaching the " - "equivalent of an electronic image sensor for the background image." - }; - constexpr openspace::properties::Property::PropertyInfo TMOSaturationInfo = { "TMOSaturation", "TMO Saturation", @@ -329,19 +322,18 @@ RenderEngine::RenderEngine() , _bloomOrigColorFactor(BloomOrigColorFactorInfo, 1.0, 0.0, 100.0) , _bloomNewColorFactor(BloomNewColorFactorInfo, 1.0, 0.0, 100.0) , _tmoOwner(TMOInfo) - , _hdrExposure(HDRExposureInfo, 0.4f, 0.01f, 4.0f) - , _hdrBackground(BackgroundExposureInfo, 2.8f, 0.01f, 10.0f) + , _hdrExposure(HDRExposureInfo, 1.68f, 0.01f, 10.0f) , _maxWhite(MaxWhiteInfo, 4.f, 0.001f, 100.0f) , _toneMapOperator(ToneMapOperatorInfo, properties::OptionProperty::DisplayType::Dropdown) , _tmoKey(TMOKeyInfo, 0.18f, 0.0f, 1.0f) , _tmoYwhite(TMOYWhiteInfo, 1e6f, 0.0f, 1e10f) , _tmoSaturation(TMOSaturationInfo, 1.f, 0.0f, 1.0f) , _imageOwner(ImageInfo) - , _gamma(GammaInfo, 2.2f, 0.01f, 5.0f) + , _gamma(GammaInfo, 0.86f, 0.01f, 5.0f) , _hue(HueInfo, 1.f, 0.0f, 5.0f) - , _saturation(SaturationInfo, 1.f, 0.0f, 5.0f) + , _saturation(SaturationInfo, 1.45f, 0.0f, 5.0f) , _value(ValueInfo, 1.f, 0.0f, 5.0f) - , _lightness(LightnessInfo, 1.f, 0.0f, 5.0f) + , _lightness(LightnessInfo, 1.1f, 0.0f, 5.0f) , _colorSpace(ColorSpaceInfo, properties::OptionProperty::DisplayType::Dropdown) { @@ -370,13 +362,6 @@ RenderEngine::RenderEngine() }); addProperty(_hdrExposure); - _hdrBackground.onChange([this]() { - if (_renderer) { - _renderer->setHDRBackground(_hdrBackground); - } - }); - addProperty(_hdrBackground); - _maxWhite.onChange([this]() { if (_renderer) { _renderer->setMaxWhite(_maxWhite); @@ -1217,6 +1202,14 @@ scripting::LuaLibrary RenderEngine::luaLibrary() { }; } +const RenderEngine::GLDefaultState& RenderEngine::glDefaultState() const { + return _glDefaultState; +} + +void RenderEngine::setGLDefaultState(RenderEngine::GLDefaultState glDS) { + _glDefaultState = std::move(glDS); +} + void RenderEngine::addScreenSpaceRenderable(std::unique_ptr s) { s->initialize(); s->initializeGL(); From f3e972790bcd074ad44e66df28994019d88caeaa Mon Sep 17 00:00:00 2001 From: Jonathas Costa Date: Thu, 27 Jun 2019 22:00:19 -0400 Subject: [PATCH 11/39] Fixed bloom. Improved performance. --- .../scene/digitaluniverse/milkyway.asset | 3 +- .../openspace/rendering/framebufferrenderer.h | 28 ++++++++- include/openspace/rendering/renderengine.h | 1 + shaders/framebuffer/bloomFilter.frag | 11 +++- shaders/framebuffer/renderframebuffer.frag | 11 ++-- src/rendering/framebufferrenderer.cpp | 63 ++++++++++--------- src/rendering/renderengine.cpp | 15 +++++ 7 files changed, 93 insertions(+), 39 deletions(-) diff --git a/data/assets/scene/digitaluniverse/milkyway.asset b/data/assets/scene/digitaluniverse/milkyway.asset index dff01194a4..83ee5c6f92 100644 --- a/data/assets/scene/digitaluniverse/milkyway.asset +++ b/data/assets/scene/digitaluniverse/milkyway.asset @@ -40,7 +40,8 @@ local sphere = { Orientation = "Inside", UseAdditiveBlending = true, MirrorTexture = true, - FadeOutThreshold = 0.025 + FadeOutThreshold = 0.025, + Background = true }, GUI = { Name = "Milky Way Sphere", diff --git a/include/openspace/rendering/framebufferrenderer.h b/include/openspace/rendering/framebufferrenderer.h index 2f7ef6d3b3..9918edb7b5 100644 --- a/include/openspace/rendering/framebufferrenderer.h +++ b/include/openspace/rendering/framebufferrenderer.h @@ -59,6 +59,29 @@ struct UpdateStructures; class FramebufferRenderer : public Renderer, public RaycasterListener, public DeferredcasterListener { +private: + inline static const GLenum ColorAttachment0Array[1] = { + GL_COLOR_ATTACHMENT0 + }; + + inline static const GLenum ColorAttachment01Array[2] = { + GL_COLOR_ATTACHMENT0, + GL_COLOR_ATTACHMENT1 + }; + + inline static const GLenum ColorAttachment012Array[3] = { + GL_COLOR_ATTACHMENT0, + GL_COLOR_ATTACHMENT1, + GL_COLOR_ATTACHMENT2 + }; + + inline static const GLenum ColorAttachment0123Array[4] = { + GL_COLOR_ATTACHMENT0, + GL_COLOR_ATTACHMENT1, + GL_COLOR_ATTACHMENT2, + GL_COLOR_ATTACHMENT3 + }; + public: typedef std::map< VolumeRaycaster*, @@ -157,8 +180,8 @@ private: toneMapOperator, aveLum, maxWhite, Hue, Saturation, Value, Lightness, colorSpace) _hdrUniformCache; - UniformCache(renderedImage, bloomImage, bloomThresholdMin, bloomThresholdMax, - bloomOrigFactor, bloomNewFactor) _bloomUniformCache; + UniformCache(renderedImage, bloomImage, bloomOrigFactor, bloomNewFactor) + _bloomUniformCache; UniformCache(renderedImage, maxWhite, imageWidth, imageHeight) _histoUniformCache; @@ -182,6 +205,7 @@ private: GLuint _histoVao; GLuint _histoVbo; + GLuint _bloomVAO = 0u; GLuint _bloomFilterFBO[3]; GLuint _bloomTexture[3]; diff --git a/include/openspace/rendering/renderengine.h b/include/openspace/rendering/renderengine.h index 4ff80c325e..8dd8d41f33 100644 --- a/include/openspace/rendering/renderengine.h +++ b/include/openspace/rendering/renderengine.h @@ -242,6 +242,7 @@ private: properties::PropertyOwner _bloomOwner; properties::BoolProperty _enableBloom; + properties::BoolProperty _automaticBloom; properties::FloatProperty _bloomThreshouldMin; properties::FloatProperty _bloomThreshouldMax; properties::FloatProperty _bloomOrigColorFactor; diff --git a/shaders/framebuffer/bloomFilter.frag b/shaders/framebuffer/bloomFilter.frag index e964803a07..e0830c77e9 100644 --- a/shaders/framebuffer/bloomFilter.frag +++ b/shaders/framebuffer/bloomFilter.frag @@ -26,6 +26,7 @@ layout (location = 0) out vec4 finalColor; +uniform int numberOfSamples; uniform int filterStep; uniform sampler2DMS filterImage; uniform sampler2D filterFirstPass; @@ -67,10 +68,16 @@ void main(void) for (int i = 0; i < weights.length(); i++) { if (filterStep == 1) { - color += vec4(texelFetch(filterImage, P + ivec2(0, i), 0).rgb, 1.0) * weights[i]; + vec4 tmpColor = vec4(0.0); + for (int s = 0; s < numberOfSamples; ++s) { + tmpColor += vec4(texelFetch(filterImage, P + ivec2(0, i), 0).rgb, s) * weights[i]; + } + tmpColor /= numberOfSamples; + color += tmpColor; + //color += vec4(texelFetch(filterImage, P + ivec2(0, i), 0).rgb, 1) * weights[i]; origAlpha = color.a; } else if (filterStep == 2) { - color += vec4(texelFetch(filterFirstPass, P + ivec2(0, i), 0).rgb, 1.0) * weights[i]; + color += vec4(texelFetch(filterFirstPass, P + ivec2(0, i), 0).rgb, 0) * weights[i]; } } diff --git a/shaders/framebuffer/renderframebuffer.frag b/shaders/framebuffer/renderframebuffer.frag index 3b4728ee5b..2da88e1da5 100644 --- a/shaders/framebuffer/renderframebuffer.frag +++ b/shaders/framebuffer/renderframebuffer.frag @@ -30,21 +30,24 @@ layout(location = 1) out vec4 gPosition; layout(location = 2) out vec4 gNormal; layout(location = 3) out vec4 filterBuffer; +uniform bool automaticBloom; +uniform float bloom_thresh_min; +uniform float bloom_thresh_max; + void main() { Fragment f = getFragment(); _out_color_ = f.color; gPosition = f.gPosition; gNormal = f.gNormal; - bool automaticBloom = false; if (automaticBloom) { // Extract luminance float Y = dot(f.color.rgb, vec3(0.299, 0.587, 0.144)); // Apply Bloom on the bloom threshold range values - //vec4 bColor = f.color * 4.0 * smoothstep(bloom_thresh_min, bloom_thresh_max, Y); - //filterBuffer = bColor - filterBuffer = vec4(f.filterFlag); + vec3 bColor = f.color.rgb * 4.0 * smoothstep(bloom_thresh_min, bloom_thresh_max, Y); + + filterBuffer = vec4(bColor, f.color.a); } else { if (f.filterFlag == 1) filterBuffer = f.color; diff --git a/src/rendering/framebufferrenderer.cpp b/src/rendering/framebufferrenderer.cpp index 457241c8da..1aa4c4c90e 100644 --- a/src/rendering/framebufferrenderer.cpp +++ b/src/rendering/framebufferrenderer.cpp @@ -61,9 +61,8 @@ namespace { "Lightness", "colorSpace" }; - constexpr const std::array BloomUniformNames = { - "renderedImage", "bloomImage", "bloomThresholdMin", "bloomThresholdMax", - "bloomOrigFactor", "bloomNewFactor" + constexpr const std::array BloomUniformNames = { + "renderedImage", "bloomImage", "bloomOrigFactor", "bloomNewFactor" }; constexpr const std::array HistoUniformNames = { @@ -512,23 +511,20 @@ float FramebufferRenderer::computeBufferAveLuminanceGPU() { } void FramebufferRenderer::applyBloomFilter() { - GLint defaultFbo; - glGetIntegerv(GL_FRAMEBUFFER_BINDING, &defaultFbo); - - GLuint vao; - glGenVertexArrays(1, &vao); + + if (!_bloomVAO) { + glGenVertexArrays(1, &_bloomVAO); + } glBindFramebuffer(GL_FRAMEBUFFER, _bloomFilterFBO[0]); - GLenum textureBuffer[] = { - GL_COLOR_ATTACHMENT0 - }; - glDrawBuffers(1, textureBuffer); + glDrawBuffers(1, ColorAttachment0Array); glClear(GL_COLOR_BUFFER_BIT); glViewport(0, 0, _resolution.y, _resolution.x); - glBindVertexArray(vao); + glBindVertexArray(_bloomVAO); _bloomProgram->activate(); + // First blurring pass (vertical) { ghoul::opengl::TextureUnit filterTextureUnit; filterTextureUnit.activate(); @@ -536,6 +532,7 @@ void FramebufferRenderer::applyBloomFilter() { glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _mainFilterTexture); _bloomProgram->setUniform("filterStep", 1); _bloomProgram->setUniform("filterImage", filterTextureUnit); + _bloomProgram->setUniform("numberOfSamples", _nAaSamples); // Making OpenGL happy... ghoul::opengl::TextureUnit dummyTextureUnit; @@ -550,13 +547,14 @@ void FramebufferRenderer::applyBloomFilter() { _bloomProgram->deactivate(); glBindFramebuffer(GL_FRAMEBUFFER, _bloomFilterFBO[1]); - glDrawBuffers(1, textureBuffer); + glDrawBuffers(1, ColorAttachment0Array); glViewport(0, 0, _resolution.x, _resolution.y); glClear(GL_COLOR_BUFFER_BIT); - glBindVertexArray(vao); + glBindVertexArray(_bloomVAO); _bloomProgram->activate(); + // Second blurring pass (horizontal) { ghoul::opengl::TextureUnit filterTextureUnit; filterTextureUnit.activate(); @@ -564,6 +562,7 @@ void FramebufferRenderer::applyBloomFilter() { glBindTexture(GL_TEXTURE_2D, _bloomTexture[0]); _bloomProgram->setUniform("filterStep", 2); _bloomProgram->setUniform("filterFirstPass", filterTextureUnit); + _bloomProgram->setUniform("numberOfSamples", _nAaSamples); // Making OpenGL happy... ghoul::opengl::TextureUnit dummyTextureUnit; @@ -579,12 +578,16 @@ void FramebufferRenderer::applyBloomFilter() { _bloomProgram->deactivate(); glBindFramebuffer(GL_FRAMEBUFFER, _bloomFilterFBO[2]); - glDrawBuffers(1, textureBuffer); + glDrawBuffers(1, ColorAttachment0Array); glViewport(0, 0, _resolution.x, _resolution.y); glClear(GL_COLOR_BUFFER_BIT); _bloomResolveProgram->activate(); + // Adding the result of the blurring processes to the + // hdrFilteringTexture and saving the result in + // the _bloomTexture[2] texture (JCC: That can be + // done by blending operation (ONE)) { ghoul::opengl::TextureUnit deferredResultsTextureUnit; deferredResultsTextureUnit.activate(); @@ -617,7 +620,7 @@ void FramebufferRenderer::applyBloomFilter() { _bloomResolveProgram->deactivate(); - glBindFramebuffer(GL_FRAMEBUFFER, defaultFbo); + glBindFramebuffer(GL_FRAMEBUFFER, _osDefaultGLState.defaultFBO); } void FramebufferRenderer::computeImageHistogram() { @@ -935,8 +938,8 @@ void FramebufferRenderer::updateResolution() { nullptr ); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); } // Histogram Texture @@ -1526,7 +1529,7 @@ void FramebufferRenderer::updateMSAASamplingPattern() { nOneStripProgram->activate(); ghoul::opengl::TextureUnit pixelSizeTextureUnit; - pixelSizeTextureUnit.activate(); + pixelSizeTextureUnit.activate (); glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, pixelSizeTexture); nOneStripProgram->setUniform("pixelSizeTexture", pixelSizeTextureUnit); @@ -1625,13 +1628,7 @@ void FramebufferRenderer::render(Scene* scene, Camera* camera, float blackoutFac global::renderEngine.setGLDefaultState(_osDefaultGLState); // deferred g-buffer plus filter - GLenum textureBuffers[4] = { - GL_COLOR_ATTACHMENT0, - GL_COLOR_ATTACHMENT1, - GL_COLOR_ATTACHMENT2, - GL_COLOR_ATTACHMENT3 - }; - glDrawBuffers(4, textureBuffers); + glDrawBuffers(4, ColorAttachment0123Array); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); Time time = global::timeManager.time(); @@ -1654,6 +1651,7 @@ void FramebufferRenderer::render(Scene* scene, Camera* camera, float blackoutFac data.renderBinMask = static_cast(Renderable::RenderBin::Overlay); scene->render(data, tasks); + // Run Volume Tasks { std::unique_ptr perfInternal; if (doPerformanceMeasurements) { @@ -1664,12 +1662,12 @@ void FramebufferRenderer::render(Scene* scene, Camera* camera, float blackoutFac performRaycasterTasks(tasks.raycasterTasks); } - //glBindFramebuffer(GL_FRAMEBUFFER, defaultFbo); + // Binds the final Framebuffer which will contain the results of the TMOs glBindFramebuffer(GL_FRAMEBUFFER, _hdrFilteringFramebuffer); - GLenum dBuffer[1] = { GL_COLOR_ATTACHMENT0 }; - glDrawBuffers(1, dBuffer); + glDrawBuffers(1, ColorAttachment0Array); glClear(GL_COLOR_BUFFER_BIT); + // Run Deferred Tasks (resolve step is executed together with these tasks) { std::unique_ptr perfInternal; if (doPerformanceMeasurements) { @@ -1681,6 +1679,8 @@ void FramebufferRenderer::render(Scene* scene, Camera* camera, float blackoutFac } + // If no Deferred Task are prensent, the resolve step + // is executed in a separated step if (tasks.deferredcasterTasks.empty()) { //glBindFramebuffer(GL_FRAMEBUFFER, defaultFbo); _resolveProgram->activate(); @@ -1721,6 +1721,9 @@ void FramebufferRenderer::render(Scene* scene, Camera* camera, float blackoutFac // ////float averageLuminaceInFB = 0.5; + + // When applying the TMO, the result is saved to the default FBO to be displayed + // by the Operating System glBindFramebuffer(GL_FRAMEBUFFER, _osDefaultGLState.defaultFBO); glViewport(0, 0, _resolution.x, _resolution.y); diff --git a/src/rendering/renderengine.cpp b/src/rendering/renderengine.cpp index 142c99fc15..38cc738e4f 100644 --- a/src/rendering/renderengine.cpp +++ b/src/rendering/renderengine.cpp @@ -265,6 +265,12 @@ namespace { "Enable/Disable Bloom." }; + constexpr openspace::properties::Property::PropertyInfo AutomaticBloomInfo = { + "AutomaticBloom", + "Enable/Disable Automatic Bloom", + "Enable/Disable Automatic Bloom." + }; + constexpr openspace::properties::Property::PropertyInfo HueInfo = { "Hue", "Hue", @@ -347,6 +353,7 @@ RenderEngine::RenderEngine() , _nAaSamples(AaSamplesInfo, 4, 1, 8) , _bloomOwner(BloomInfo) , _enableBloom(EnableBloomInfo, false) + , _automaticBloom(AutomaticBloomInfo, false) , _bloomThreshouldMin(BloomThreshouldMinInfo, 0.5, 0.0, 100.0) , _bloomThreshouldMax(BloomThreshouldMaxInfo, 1.0, 0.0, 100.0) , _bloomOrigColorFactor(BloomOrigColorFactorInfo, 1.0, 0.0, 100.0) @@ -528,6 +535,14 @@ RenderEngine::RenderEngine() addProperty(_enableBloom); + _automaticBloom.onChange([this]() { + if (_renderer && _automaticBloom) { + _renderer->enableBloom(true); + _enableBloom = true; + } + }); + addProperty(_automaticBloom); + addProperty(_bloomThreshouldMin); _bloomThreshouldMin.onChange([this]() { if (_renderer) { From db1dc5b1bbb40f686942908f3cd8aed479762de3 Mon Sep 17 00:00:00 2001 From: Jonathas Costa Date: Tue, 2 Jul 2019 21:44:46 -0400 Subject: [PATCH 12/39] Changed ATM to ping pong. Geometry queue had a bad performance. --- .../openspace/rendering/framebufferrenderer.h | 81 ++- src/rendering/framebufferrenderer.cpp | 574 +++++++++++------- 2 files changed, 409 insertions(+), 246 deletions(-) diff --git a/include/openspace/rendering/framebufferrenderer.h b/include/openspace/rendering/framebufferrenderer.h index 9918edb7b5..f5b90f3b36 100644 --- a/include/openspace/rendering/framebufferrenderer.h +++ b/include/openspace/rendering/framebufferrenderer.h @@ -64,6 +64,10 @@ private: GL_COLOR_ATTACHMENT0 }; + inline static const GLenum ColorAttachment1Array[1] = { + GL_COLOR_ATTACHMENT1 + }; + inline static const GLenum ColorAttachment01Array[2] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1 @@ -82,6 +86,49 @@ private: GL_COLOR_ATTACHMENT3 }; + typedef struct { + GLuint _mainColorTexture; + GLuint _mainFilterTexture; + GLuint _mainPositionTexture; + GLuint _mainNormalTexture; + GLuint _mainDepthTexture; + GLuint _mainFramebuffer; + } GBuffers; + + typedef struct { + GLuint framebuffer; + GLuint colorTexture[2]; + } PingPongBuffers; + + typedef struct { + GLuint _histoVao; + GLuint _histoVbo; + GLuint _histoTexture; + GLuint _histoFramebuffer; + } HistoBuffers; + + typedef struct { + GLuint _bloomVAO = 0u; + GLuint _bloomFilterFBO[3]; + GLuint _bloomTexture[3]; + } BloomBuffers; + + typedef struct { + GLuint _hdrFilteringFramebuffer; + GLuint _hdrFilteringTexture; + } HDRBuffers; + + typedef struct { + GLuint _computeAveLumFBO; + GLuint _computeAveLumTexture; + } AverageLumBuffers; + + typedef struct { + GLuint _tmoTexture; + GLuint _tmoFramebuffer; + GLuint _tmoHdrSampler; + } MipMappingTMOBuffers; + public: typedef std::map< VolumeRaycaster*, @@ -150,6 +197,10 @@ public: DeferredcasterListener::IsAttached isAttached) override; private: + void captureAndSetOpenGLDefaultState(); + void resolveMSAA(float blackoutFactor); + void applyTMO(float blackoutFactor); + float computeBufferAveLuminance(); float computeBufferAveLuminanceGPU(); void applyBloomFilter(); @@ -189,33 +240,19 @@ private: GLuint _screenQuad; GLuint _vertexPositionBuffer; - GLuint _mainColorTexture; - GLuint _mainFilterTexture; - GLuint _mainPositionTexture; - GLuint _mainNormalTexture; - GLuint _mainDepthTexture; GLuint _exitColorTexture; - GLuint _mainFramebuffer; GLuint _exitDepthTexture; GLuint _exitFramebuffer; - GLuint _hdrFilteringFramebuffer; - GLuint _hdrFilteringTexture; - GLuint _histoFramebuffer; - GLuint _histoTexture; - GLuint _histoVao; - GLuint _histoVbo; - GLuint _bloomVAO = 0u; - GLuint _bloomFilterFBO[3]; - GLuint _bloomTexture[3]; + GBuffers _gBuffers; + PingPongBuffers _pingPongBuffers; + HistoBuffers _histoBuffers; + BloomBuffers _bloomBuffers; + HDRBuffers _hdrBuffers; + AverageLumBuffers _aLumBuffers; + MipMappingTMOBuffers _mMappingTMOBuffers; - GLuint _computeAveLumFBO; - GLuint _computeAveLumTexture; - - // New TMO via mipmapping - GLuint _tmoTexture; - GLuint _tmoFramebuffer; - GLuint _tmoHdrSampler; + unsigned int _pingPongIndex = 0u; bool _dirtyDeferredcastData; bool _dirtyRaycastData; diff --git a/src/rendering/framebufferrenderer.cpp b/src/rendering/framebufferrenderer.cpp index 1aa4c4c90e..7998fedcd5 100644 --- a/src/rendering/framebufferrenderer.cpp +++ b/src/rendering/framebufferrenderer.cpp @@ -142,84 +142,96 @@ void FramebufferRenderer::initialize() { GLint defaultFbo; glGetIntegerv(GL_FRAMEBUFFER_BINDING, &defaultFbo); - // Main framebuffer - glGenTextures(1, &_mainColorTexture); - glGenTextures(1, &_mainDepthTexture); - glGenTextures(1, &_mainFilterTexture); - // Deferred textures used in Main framebuffer - glGenTextures(1, &_mainPositionTexture); - glGenTextures(1, &_mainNormalTexture); - glGenFramebuffers(1, &_mainFramebuffer); + // GBuffers + glGenTextures(1, &_gBuffers._mainColorTexture); + glGenTextures(1, &_gBuffers._mainDepthTexture); + glGenTextures(1, &_gBuffers._mainFilterTexture); + glGenTextures(1, &_gBuffers._mainPositionTexture); + glGenTextures(1, &_gBuffers._mainNormalTexture); + glGenFramebuffers(1, &_gBuffers._mainFramebuffer); + // PingPong Buffers + // The first pingpong buffer shares the color texture with the renderbuffer: + _pingPongBuffers.colorTexture[0] = _gBuffers._mainColorTexture; + glGenTextures(1, &_pingPongBuffers.colorTexture[1]); + glGenFramebuffers(1, &_pingPongBuffers.framebuffer); + // Exit framebuffer glGenTextures(1, &_exitColorTexture); glGenTextures(1, &_exitDepthTexture); glGenFramebuffers(1, &_exitFramebuffer); - // HDR / Filtering Framebuffer - glGenFramebuffers(1, &_hdrFilteringFramebuffer); - glGenTextures(1, &_hdrFilteringTexture); + // HDR / Filtering Buffers + glGenFramebuffers(1, &_hdrBuffers._hdrFilteringFramebuffer); + glGenTextures(1, &_hdrBuffers._hdrFilteringTexture); - // Compute Average Luminosity - glGenTextures(1, &_computeAveLumTexture); - glGenFramebuffers(1, &_computeAveLumFBO); + // Compute Average Luminosity Buffers + glGenTextures(1, &_aLumBuffers._computeAveLumTexture); + glGenFramebuffers(1, &_aLumBuffers._computeAveLumFBO); - // Bloom Filter - glGenFramebuffers(3, _bloomFilterFBO); - glGenTextures(3, _bloomTexture); + // Bloom Buffers + glGenFramebuffers(3, _bloomBuffers._bloomFilterFBO); + glGenTextures(3, _bloomBuffers._bloomTexture); - // Histogram - glGenFramebuffers(1, &_histoFramebuffer); - glGenTextures(1, &_histoTexture); - glGenVertexArrays(1, &_histoVao); - glBindVertexArray(_histoVao); - glGenBuffers(1, &_histoVbo); + // Histogram Buffers + glGenFramebuffers(1, &_histoBuffers._histoFramebuffer); + glGenTextures(1, &_histoBuffers._histoTexture); + glGenVertexArrays(1, &_histoBuffers._histoVao); + glBindVertexArray(_histoBuffers._histoVao); + glGenBuffers(1, &_histoBuffers._histoVbo); - // TMO via mipmapping - glGenFramebuffers(1, &_tmoFramebuffer); - glGenTextures(1, &_tmoTexture); - glGenSamplers(1, &_tmoHdrSampler); - glSamplerParameteri(_tmoHdrSampler, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST); + // TMO via mipmapping Buffers + glGenFramebuffers(1, &_mMappingTMOBuffers._tmoFramebuffer); + glGenTextures(1, &_mMappingTMOBuffers._tmoTexture); + glGenSamplers(1, &_mMappingTMOBuffers._tmoHdrSampler); + glSamplerParameteri( + _mMappingTMOBuffers._tmoHdrSampler, + GL_TEXTURE_MIN_FILTER, + GL_LINEAR_MIPMAP_NEAREST + ); updateResolution(); updateRendererData(); - updateRaycastData(); + updateRaycastData(); - // Builds Main Framebuffer - glBindFramebuffer(GL_FRAMEBUFFER, _mainFramebuffer); + //==============================// + //===== Building Buffers =====// + //==============================// + + glBindFramebuffer(GL_FRAMEBUFFER, _gBuffers._mainFramebuffer); glFramebufferTexture2D( GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE, - _mainColorTexture, + _gBuffers._mainColorTexture, 0 ); glFramebufferTexture2D( GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D_MULTISAMPLE, - _mainPositionTexture, + _gBuffers._mainPositionTexture, 0 ); glFramebufferTexture2D( GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT2, GL_TEXTURE_2D_MULTISAMPLE, - _mainNormalTexture, + _gBuffers._mainNormalTexture, 0 ); glFramebufferTexture2D( GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT3, GL_TEXTURE_2D_MULTISAMPLE, - _mainFilterTexture, + _gBuffers._mainFilterTexture, 0 ); glFramebufferTexture2D( GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D_MULTISAMPLE, - _mainDepthTexture, + _gBuffers._mainDepthTexture, 0 ); @@ -228,6 +240,34 @@ void FramebufferRenderer::initialize() { LERROR("Main framebuffer is not complete"); } + glBindFramebuffer(GL_FRAMEBUFFER, _pingPongBuffers.framebuffer); + glFramebufferTexture2D( + GL_FRAMEBUFFER, + GL_COLOR_ATTACHMENT0, + GL_TEXTURE_2D_MULTISAMPLE, + _pingPongBuffers.colorTexture[0], + 0 + ); + glFramebufferTexture2D( + GL_FRAMEBUFFER, + GL_COLOR_ATTACHMENT1, + GL_TEXTURE_2D_MULTISAMPLE, + _pingPongBuffers.colorTexture[1], + 0 + ); + glFramebufferTexture2D( + GL_FRAMEBUFFER, + GL_DEPTH_ATTACHMENT, + GL_TEXTURE_2D_MULTISAMPLE, + _gBuffers._mainDepthTexture, + 0 + ); + + status = glCheckFramebufferStatus(GL_FRAMEBUFFER); + if (status != GL_FRAMEBUFFER_COMPLETE) { + LERROR("Ping pong buffer is not complete"); + } + // Builds Exit Framebuffer glBindFramebuffer(GL_FRAMEBUFFER, _exitFramebuffer); glFramebufferTexture2D( @@ -251,12 +291,12 @@ void FramebufferRenderer::initialize() { } // Builds HDR/Filtering Framebuffer - glBindFramebuffer(GL_FRAMEBUFFER, _hdrFilteringFramebuffer); + glBindFramebuffer(GL_FRAMEBUFFER, _hdrBuffers._hdrFilteringFramebuffer); glFramebufferTexture2D( GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, - _hdrFilteringTexture, + _hdrBuffers._hdrFilteringTexture, 0 ); @@ -266,12 +306,12 @@ void FramebufferRenderer::initialize() { } // Buids Average Lum FBO - glBindFramebuffer(GL_FRAMEBUFFER, _computeAveLumFBO); + glBindFramebuffer(GL_FRAMEBUFFER, _aLumBuffers._computeAveLumFBO); glFramebufferTexture2D( GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, - _computeAveLumTexture, + _aLumBuffers._computeAveLumTexture, 0 ); @@ -285,12 +325,12 @@ void FramebufferRenderer::initialize() { const GLenum buffers[] = { GL_COLOR_ATTACHMENT0 }; for (int i = 0; i < 3; i++) { - glBindFramebuffer(GL_FRAMEBUFFER, _bloomFilterFBO[i]); + glBindFramebuffer(GL_FRAMEBUFFER, _bloomBuffers._bloomFilterFBO[i]); glFramebufferTexture2D( GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, - _bloomTexture[i], + _bloomBuffers._bloomTexture[i], 0 ); glDrawBuffers(1, buffers); @@ -302,12 +342,12 @@ void FramebufferRenderer::initialize() { } // Builds Histogram FBO - glBindFramebuffer(GL_FRAMEBUFFER, _histoFramebuffer); + glBindFramebuffer(GL_FRAMEBUFFER, _histoBuffers._histoFramebuffer); glFramebufferTexture2D( GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, - _histoTexture, + _histoBuffers._histoTexture, 0 ); @@ -317,12 +357,12 @@ void FramebufferRenderer::initialize() { } // Buids TMO via mipmapping FBO - glBindFramebuffer(GL_FRAMEBUFFER, _tmoFramebuffer); + glBindFramebuffer(GL_FRAMEBUFFER, _mMappingTMOBuffers._tmoFramebuffer); glFramebufferTexture2D( GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, - _tmoTexture, + _mMappingTMOBuffers._tmoTexture, 0 ); @@ -402,24 +442,27 @@ void FramebufferRenderer::initialize() { void FramebufferRenderer::deinitialize() { LINFO("Deinitializing FramebufferRenderer"); - glDeleteFramebuffers(1, &_mainFramebuffer); + glDeleteFramebuffers(1, &_gBuffers._mainFramebuffer); glDeleteFramebuffers(1, &_exitFramebuffer); - glDeleteFramebuffers(1, &_hdrFilteringFramebuffer); - glDeleteFramebuffers(1, &_computeAveLumFBO); - glDeleteFramebuffers(3, _bloomFilterFBO); - glDeleteFramebuffers(1, &_histoFramebuffer); - glDeleteFramebuffers(1, &_tmoFramebuffer); + glDeleteFramebuffers(1, &_hdrBuffers._hdrFilteringFramebuffer); + glDeleteFramebuffers(1, &_aLumBuffers._computeAveLumFBO); + glDeleteFramebuffers(3, _bloomBuffers._bloomFilterFBO); + glDeleteFramebuffers(1, &_histoBuffers._histoFramebuffer); + glDeleteFramebuffers(1, &_mMappingTMOBuffers._tmoFramebuffer); + glDeleteFramebuffers(1, &_pingPongBuffers.framebuffer); - glDeleteTextures(1, &_mainColorTexture); - glDeleteTextures(1, &_mainDepthTexture); + glDeleteTextures(1, &_gBuffers._mainColorTexture); + glDeleteTextures(1, &_gBuffers._mainDepthTexture); - glDeleteTextures(1, &_hdrFilteringTexture); - glDeleteTextures(1, &_mainPositionTexture); - glDeleteTextures(1, &_mainNormalTexture); - glDeleteTextures(1, &_computeAveLumTexture); - glDeleteTextures(3, _bloomTexture); - glDeleteTextures(1, &_histoTexture); - glDeleteTextures(1, &_tmoTexture); + glDeleteTextures(1, &_hdrBuffers._hdrFilteringTexture); + glDeleteTextures(1, &_gBuffers._mainPositionTexture); + glDeleteTextures(1, &_gBuffers._mainNormalTexture); + glDeleteTextures(1, &_aLumBuffers._computeAveLumTexture); + glDeleteTextures(3, _bloomBuffers._bloomTexture); + glDeleteTextures(1, &_histoBuffers._histoTexture); + glDeleteTextures(1, &_mMappingTMOBuffers._tmoTexture); + + glDeleteTextures(1, &_pingPongBuffers.colorTexture[1]); glDeleteTextures(1, &_exitColorTexture); glDeleteTextures(1, &_exitDepthTexture); @@ -427,7 +470,7 @@ void FramebufferRenderer::deinitialize() { glDeleteBuffers(1, &_vertexPositionBuffer); glDeleteVertexArrays(1, &_screenQuad); - glDeleteSamplers(1, &_tmoHdrSampler); + glDeleteSamplers(1, &_mMappingTMOBuffers._tmoHdrSampler); global::raycasterManager.removeListener(*this); global::deferredcasterManager.removeListener(*this); @@ -445,6 +488,135 @@ void FramebufferRenderer::deferredcastersChanged(Deferredcaster&, _dirtyDeferredcastData = true; } +void FramebufferRenderer::captureAndSetOpenGLDefaultState() { + // Capture standard fbo + glGetIntegerv(GL_FRAMEBUFFER_BINDING, &_osDefaultGLState.defaultFBO); + + glEnablei(GL_BLEND, 0); + glDisablei(GL_BLEND, 1); + glDisablei(GL_BLEND, 2); + glDisablei(GL_BLEND, 3); + + _osDefaultGLState.blendEnabled = true; + _osDefaultGLState.blend0Enabled = true; + _osDefaultGLState.blend1Enabled = false; + _osDefaultGLState.blend2Enabled = false; + _osDefaultGLState.blend3Enabled = false; + + glBlendEquationSeparate( + _osDefaultGLState.blendEquationRGB, + _osDefaultGLState.blendEquationAlpha + ); + glBlendFuncSeparate( + _osDefaultGLState.blendSrcRGB, + _osDefaultGLState.blendDestRGB, + _osDefaultGLState.blendSrcAlpha, + _osDefaultGLState.blendDestAlpha + ); + + glEnable(GL_DEPTH_TEST); + _osDefaultGLState.depthTestEnabled = true; + + // Update the default OS GL state to the RenderEngine to be + // available to all renderables + global::renderEngine.setGLDefaultState(_osDefaultGLState); +} + +void FramebufferRenderer::resolveMSAA(float blackoutFactor) { + _resolveProgram->activate(); + + ghoul::opengl::TextureUnit mainColorTextureUnit; + mainColorTextureUnit.activate(); + + //glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _gBuffers._mainColorTexture); + glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _pingPongBuffers.colorTexture[_pingPongIndex]); + _resolveProgram->setUniform(_uniformCache.mainColorTexture, mainColorTextureUnit); + _resolveProgram->setUniform(_uniformCache.blackoutFactor, blackoutFactor); + _resolveProgram->setUniform(_uniformCache.nAaSamples, _nAaSamples); + glBindVertexArray(_screenQuad); + glDrawArrays(GL_TRIANGLES, 0, 6); + glBindVertexArray(0); + + _resolveProgram->deactivate(); +} + +void FramebufferRenderer::applyTMO(float blackoutFactor) { + const bool doPerformanceMeasurements = global::performanceManager.isEnabled(); + float averageLuminaceInFB = 0.0; + if (_toneMapOperator == + static_cast(openspace::RenderEngine::ToneMapOperators::GLOBAL)) { + std::unique_ptr perfInternal; + if (doPerformanceMeasurements) { + perfInternal = std::make_unique( + "FramebufferRenderer::render::TMO_GLOBAL" + ); + } + averageLuminaceInFB = computeBufferAveLuminanceGPU(); + if (std::isnan(averageLuminaceInFB)) { + averageLuminaceInFB = 1000.0; + } + } + else if ( + _toneMapOperator == + static_cast(openspace::RenderEngine::ToneMapOperators::MIPMAPPING)) { + std::unique_ptr perfInternal; + if (doPerformanceMeasurements) { + perfInternal = std::make_unique( + "FramebufferRenderer::render::TMO_Mipmapping" + ); + } + if (_bloomEnabled) { + computeMipMappingFromHDRBuffer(_bloomBuffers._bloomTexture[2]); + } + else { + computeMipMappingFromHDRBuffer(_hdrBuffers._hdrFilteringTexture); + } + } + else { + std::unique_ptr perfInternal; + if (doPerformanceMeasurements) { + perfInternal = std::make_unique( + "FramebufferRenderer::render::TMO" + ); + } + _hdrFilteringProgram->activate(); + + ghoul::opengl::TextureUnit hdrFeedingTextureUnit; + hdrFeedingTextureUnit.activate(); + if (_bloomEnabled) { + glBindTexture(GL_TEXTURE_2D, _bloomBuffers._bloomTexture[2]); + } + else { + glBindTexture(GL_TEXTURE_2D, _hdrBuffers._hdrFilteringTexture); + } + + _hdrFilteringProgram->setUniform( + _hdrUniformCache.deferredResultsTexture, + hdrFeedingTextureUnit + ); + + + _hdrFilteringProgram->setUniform(_hdrUniformCache.blackoutFactor, blackoutFactor); + _hdrFilteringProgram->setUniform(_hdrUniformCache.hdrExposure, _hdrExposure); + _hdrFilteringProgram->setUniform(_hdrUniformCache.gamma, _gamma); + _hdrFilteringProgram->setUniform(_hdrUniformCache.toneMapOperator, _toneMapOperator); + _hdrFilteringProgram->setUniform(_hdrUniformCache.aveLum, averageLuminaceInFB); + _hdrFilteringProgram->setUniform(_hdrUniformCache.maxWhite, _maxWhite); + _hdrFilteringProgram->setUniform(_hdrUniformCache.Hue, _hue); + _hdrFilteringProgram->setUniform(_hdrUniformCache.Saturation, _saturation); + _hdrFilteringProgram->setUniform(_hdrUniformCache.Value, _value); + _hdrFilteringProgram->setUniform(_hdrUniformCache.Lightness, _lightness); + _hdrFilteringProgram->setUniform(_hdrUniformCache.colorSpace, _colorSpace); + + + glBindVertexArray(_screenQuad); + glDrawArrays(GL_TRIANGLES, 0, 6); + glBindVertexArray(0); + + _hdrFilteringProgram->deactivate(); + } +} + float FramebufferRenderer::computeBufferAveLuminance() { unsigned int texDimension = _resolution.x * _resolution.y; @@ -452,8 +624,8 @@ float FramebufferRenderer::computeBufferAveLuminance() { ghoul::opengl::TextureUnit hdrTextureUnit; hdrTextureUnit.activate(); - glBindTexture(GL_TEXTURE_2D, _hdrFilteringTexture); - + glBindTexture(GL_TEXTURE_2D, _hdrBuffers._hdrFilteringTexture); + glClampColor(GL_CLAMP_READ_COLOR, GL_FALSE); glGetTexImage(GL_TEXTURE_2D, 0, GL_RGB, GL_FLOAT, texData.get()); float sum = 0.0f; @@ -474,7 +646,7 @@ float FramebufferRenderer::computeBufferAveLuminanceGPU() { GLint defaultFbo; glGetIntegerv(GL_FRAMEBUFFER_BINDING, &defaultFbo); - glBindFramebuffer(GL_FRAMEBUFFER, _computeAveLumFBO); + glBindFramebuffer(GL_FRAMEBUFFER, _aLumBuffers._computeAveLumFBO); GLenum textureBuffers[1] = { GL_COLOR_ATTACHMENT0 }; glDrawBuffers(1, textureBuffers); glClear(GL_COLOR_BUFFER_BIT); @@ -488,7 +660,7 @@ float FramebufferRenderer::computeBufferAveLuminanceGPU() { ghoul::opengl::TextureUnit hdrTextureUnit; hdrTextureUnit.activate(); - glBindTexture(GL_TEXTURE_2D, _hdrFilteringTexture); + glBindTexture(GL_TEXTURE_2D, _hdrBuffers._hdrFilteringTexture); _aveLumProgram->setUniform("hdrTexture", hdrTextureUnit); _aveLumProgram->setUniform("bufferWidth", _resolution.x); _aveLumProgram->setUniform("bufferHeight", _resolution.y); @@ -512,15 +684,15 @@ float FramebufferRenderer::computeBufferAveLuminanceGPU() { void FramebufferRenderer::applyBloomFilter() { - if (!_bloomVAO) { - glGenVertexArrays(1, &_bloomVAO); + if (!_bloomBuffers._bloomVAO) { + glGenVertexArrays(1, &_bloomBuffers._bloomVAO); } - glBindFramebuffer(GL_FRAMEBUFFER, _bloomFilterFBO[0]); + glBindFramebuffer(GL_FRAMEBUFFER, _bloomBuffers._bloomFilterFBO[0]); glDrawBuffers(1, ColorAttachment0Array); glClear(GL_COLOR_BUFFER_BIT); glViewport(0, 0, _resolution.y, _resolution.x); - glBindVertexArray(_bloomVAO); + glBindVertexArray(_bloomBuffers._bloomVAO); _bloomProgram->activate(); @@ -529,7 +701,8 @@ void FramebufferRenderer::applyBloomFilter() { ghoul::opengl::TextureUnit filterTextureUnit; filterTextureUnit.activate(); // The filter texture where the gaussian filter will be applied - glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _mainFilterTexture); + glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _gBuffers._mainFilterTexture); + _bloomProgram->setUniform("filterStep", 1); _bloomProgram->setUniform("filterImage", filterTextureUnit); _bloomProgram->setUniform("numberOfSamples", _nAaSamples); @@ -537,7 +710,7 @@ void FramebufferRenderer::applyBloomFilter() { // Making OpenGL happy... ghoul::opengl::TextureUnit dummyTextureUnit; dummyTextureUnit.activate(); - glBindTexture(GL_TEXTURE_2D, _bloomTexture[2]); + glBindTexture(GL_TEXTURE_2D, _bloomBuffers._bloomTexture[2]); _bloomProgram->setUniform("filterFirstPass", dummyTextureUnit); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); @@ -546,11 +719,11 @@ void FramebufferRenderer::applyBloomFilter() { _bloomProgram->deactivate(); - glBindFramebuffer(GL_FRAMEBUFFER, _bloomFilterFBO[1]); + glBindFramebuffer(GL_FRAMEBUFFER, _bloomBuffers._bloomFilterFBO[1]); glDrawBuffers(1, ColorAttachment0Array); glViewport(0, 0, _resolution.x, _resolution.y); glClear(GL_COLOR_BUFFER_BIT); - glBindVertexArray(_bloomVAO); + glBindVertexArray(_bloomBuffers._bloomVAO); _bloomProgram->activate(); @@ -559,7 +732,7 @@ void FramebufferRenderer::applyBloomFilter() { ghoul::opengl::TextureUnit filterTextureUnit; filterTextureUnit.activate(); // The results of the previous pass is passed to this pass - glBindTexture(GL_TEXTURE_2D, _bloomTexture[0]); + glBindTexture(GL_TEXTURE_2D, _bloomBuffers._bloomTexture[0]); _bloomProgram->setUniform("filterStep", 2); _bloomProgram->setUniform("filterFirstPass", filterTextureUnit); _bloomProgram->setUniform("numberOfSamples", _nAaSamples); @@ -567,7 +740,7 @@ void FramebufferRenderer::applyBloomFilter() { // Making OpenGL happy... ghoul::opengl::TextureUnit dummyTextureUnit; dummyTextureUnit.activate(); - glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _mainFilterTexture); + glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _gBuffers._mainFilterTexture); _bloomProgram->setUniform("filterImage", dummyTextureUnit); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); @@ -577,7 +750,7 @@ void FramebufferRenderer::applyBloomFilter() { _bloomProgram->deactivate(); - glBindFramebuffer(GL_FRAMEBUFFER, _bloomFilterFBO[2]); + glBindFramebuffer(GL_FRAMEBUFFER, _bloomBuffers._bloomFilterFBO[2]); glDrawBuffers(1, ColorAttachment0Array); glViewport(0, 0, _resolution.x, _resolution.y); glClear(GL_COLOR_BUFFER_BIT); @@ -586,13 +759,13 @@ void FramebufferRenderer::applyBloomFilter() { // Adding the result of the blurring processes to the // hdrFilteringTexture and saving the result in - // the _bloomTexture[2] texture (JCC: That can be + // the _bloomBuffers._bloomTexture[2] texture (JCC: That can be // done by blending operation (ONE)) { ghoul::opengl::TextureUnit deferredResultsTextureUnit; deferredResultsTextureUnit.activate(); // Original buffer will be summed to the bloom result - glBindTexture(GL_TEXTURE_2D, _hdrFilteringTexture); + glBindTexture(GL_TEXTURE_2D, _hdrBuffers._hdrFilteringTexture); _bloomResolveProgram->setUniform( _bloomUniformCache.renderedImage, deferredResultsTextureUnit @@ -601,7 +774,7 @@ void FramebufferRenderer::applyBloomFilter() { ghoul::opengl::TextureUnit bloomTextureUnit; bloomTextureUnit.activate(); // Results of the second pass are added to the original buffer - glBindTexture(GL_TEXTURE_2D, _bloomTexture[1]); + glBindTexture(GL_TEXTURE_2D, _bloomBuffers._bloomTexture[1]); _bloomResolveProgram->setUniform(_bloomUniformCache.bloomImage, bloomTextureUnit); _bloomResolveProgram->setUniform( @@ -619,12 +792,10 @@ void FramebufferRenderer::applyBloomFilter() { } _bloomResolveProgram->deactivate(); - - glBindFramebuffer(GL_FRAMEBUFFER, _osDefaultGLState.defaultFBO); } void FramebufferRenderer::computeImageHistogram() { - glBindFramebuffer(GL_FRAMEBUFFER, _histoFramebuffer); + glBindFramebuffer(GL_FRAMEBUFFER, _histoBuffers._histoFramebuffer); GLenum textureBuffer[] = { GL_COLOR_ATTACHMENT0 }; @@ -659,13 +830,13 @@ void FramebufferRenderer::computeImageHistogram() { glBlendFunc(GL_ONE, GL_ONE); glEnable(GL_BLEND); - glBindVertexArray(_histoVao); + glBindVertexArray(_histoBuffers._histoVao); _histoProgram->activate(); ghoul::opengl::TextureUnit renderedImage; renderedImage.activate(); - glBindTexture(GL_TEXTURE_2D, _hdrFilteringTexture); + glBindTexture(GL_TEXTURE_2D, _hdrBuffers._hdrFilteringTexture); _histoProgram->setUniform(_histoUniformCache.renderedImage, renderedImage); _histoProgram->setUniform(_histoUniformCache.imageWidth, static_cast(_resolution.x)); _histoProgram->setUniform(_histoUniformCache.imageHeight, static_cast(_resolution.y)); @@ -699,7 +870,7 @@ void FramebufferRenderer::computeImageHistogram() { void FramebufferRenderer::computeMipMappingFromHDRBuffer(GLuint oglImageBuffer) { glEnable(GL_FRAMEBUFFER_SRGB); - /*glBindFramebuffer(GL_FRAMEBUFFER, _tmoFramebuffer); + /*glBindFramebuffer(GL_FRAMEBUFFER, _mMappingTMOBuffers._tmoFramebuffer); GLenum textureBuffer[] = { GL_COLOR_ATTACHMENT0 }; @@ -712,7 +883,7 @@ void FramebufferRenderer::computeMipMappingFromHDRBuffer(GLuint oglImageBuffer) ghoul::opengl::TextureUnit samplerUnit; samplerUnit.activate(); glBindTexture(GL_TEXTURE_2D, oglImageBuffer); - glBindSampler(samplerUnit.operator GLint(), _tmoHdrSampler); + glBindSampler(samplerUnit.operator GLint(), _mMappingTMOBuffers._tmoHdrSampler); glGenerateMipmap(GL_TEXTURE_2D); @@ -865,8 +1036,7 @@ void FramebufferRenderer::update() { } void FramebufferRenderer::updateResolution() { - glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _mainColorTexture); - + glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _gBuffers._mainColorTexture); glTexImage2DMultisample( GL_TEXTURE_2D_MULTISAMPLE, _nAaSamples, @@ -876,8 +1046,7 @@ void FramebufferRenderer::updateResolution() { true ); - glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _mainFilterTexture); - + glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _gBuffers._mainFilterTexture); glTexImage2DMultisample( GL_TEXTURE_2D_MULTISAMPLE, _nAaSamples, @@ -887,8 +1056,19 @@ void FramebufferRenderer::updateResolution() { true ); + glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _pingPongBuffers.colorTexture[1]); + glTexImage2DMultisample( + GL_TEXTURE_2D_MULTISAMPLE, + _nAaSamples, + GL_RGBA16F, + _resolution.x, + _resolution.y, + true + ); + + // HDR / Filtering - glBindTexture(GL_TEXTURE_2D, _hdrFilteringTexture); + glBindTexture(GL_TEXTURE_2D, _hdrBuffers._hdrFilteringTexture); glTexImage2D( GL_TEXTURE_2D, @@ -906,7 +1086,7 @@ void FramebufferRenderer::updateResolution() { glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); // Average Luminosity Computation Texture - glBindTexture(GL_TEXTURE_2D, _computeAveLumTexture); + glBindTexture(GL_TEXTURE_2D, _aLumBuffers._computeAveLumTexture); glTexImage2D( GL_TEXTURE_2D, 0, @@ -925,7 +1105,7 @@ void FramebufferRenderer::updateResolution() { // Bloom Filter for (int i = 0; i < 3; i++) { - glBindTexture(GL_TEXTURE_2D, _bloomTexture[i]); + glBindTexture(GL_TEXTURE_2D, _bloomBuffers._bloomTexture[i]); glTexImage2D( GL_TEXTURE_2D, 0, @@ -943,7 +1123,7 @@ void FramebufferRenderer::updateResolution() { } // Histogram Texture - glBindTexture(GL_TEXTURE_2D, _histoTexture); + glBindTexture(GL_TEXTURE_2D, _histoBuffers._histoTexture); glTexImage2D( GL_TEXTURE_2D, 0, @@ -959,8 +1139,8 @@ void FramebufferRenderer::updateResolution() { glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glBindVertexArray(_histoVao); - glBindBuffer(GL_ARRAY_BUFFER, _histoVbo); + glBindVertexArray(_histoBuffers._histoVao); + glBindBuffer(GL_ARRAY_BUFFER, _histoBuffers._histoVbo); _histoPoints.clear(); _histoPoints.reserve(_resolution.x * _resolution.y); @@ -981,7 +1161,7 @@ void FramebufferRenderer::updateResolution() { glBindVertexArray(0); // TMO via mipmapping - glBindTexture(GL_TEXTURE_2D, _tmoTexture); + glBindTexture(GL_TEXTURE_2D, _mMappingTMOBuffers._tmoTexture); glTexImage2D( GL_TEXTURE_2D, 0, @@ -998,7 +1178,7 @@ void FramebufferRenderer::updateResolution() { glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); // G-Buffer main position - glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _mainPositionTexture); + glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _gBuffers._mainPositionTexture); glTexImage2DMultisample( GL_TEXTURE_2D_MULTISAMPLE, _nAaSamples, @@ -1008,7 +1188,7 @@ void FramebufferRenderer::updateResolution() { true ); - glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _mainNormalTexture); + glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _gBuffers._mainNormalTexture); glTexImage2DMultisample( GL_TEXTURE_2D_MULTISAMPLE, @@ -1019,7 +1199,7 @@ void FramebufferRenderer::updateResolution() { true ); - glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _mainDepthTexture); + glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _gBuffers._mainDepthTexture); glTexImage2DMultisample( GL_TEXTURE_2D_MULTISAMPLE, _nAaSamples, @@ -1529,7 +1709,7 @@ void FramebufferRenderer::updateMSAASamplingPattern() { nOneStripProgram->activate(); ghoul::opengl::TextureUnit pixelSizeTextureUnit; - pixelSizeTextureUnit.activate (); + pixelSizeTextureUnit.activate(); glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, pixelSizeTexture); nOneStripProgram->setUniform("pixelSizeTexture", pixelSizeTextureUnit); @@ -1594,40 +1774,12 @@ void FramebufferRenderer::render(Scene* scene, Camera* camera, float blackoutFac return; } - // Capture standard fbo - glGetIntegerv(GL_FRAMEBUFFER_BINDING, &_osDefaultGLState.defaultFBO); - - glEnablei(GL_BLEND, 0); - glDisablei(GL_BLEND, 1); - glDisablei(GL_BLEND, 2); - glDisablei(GL_BLEND, 3); - - _osDefaultGLState.blendEnabled = true; - _osDefaultGLState.blend0Enabled = true; - _osDefaultGLState.blend1Enabled = false; - _osDefaultGLState.blend2Enabled = false; - _osDefaultGLState.blend3Enabled = false; - - glBlendEquationSeparate( - _osDefaultGLState.blendEquationRGB, - _osDefaultGLState.blendEquationAlpha - ); - glBlendFuncSeparate( - _osDefaultGLState.blendSrcRGB, - _osDefaultGLState.blendDestRGB, - _osDefaultGLState.blendSrcAlpha, - _osDefaultGLState.blendDestAlpha - ); - - glBindFramebuffer(GL_FRAMEBUFFER, _mainFramebuffer); - glEnable(GL_DEPTH_TEST); - _osDefaultGLState.depthTestEnabled = true; - - // Update the default OS GL state to the RenderEngine to be + // Capture and Update the default OS GL state to the RenderEngine to be // available to all renderables - global::renderEngine.setGLDefaultState(_osDefaultGLState); + captureAndSetOpenGLDefaultState(); // deferred g-buffer plus filter + glBindFramebuffer(GL_FRAMEBUFFER, _gBuffers._mainFramebuffer); glDrawBuffers(4, ColorAttachment0123Array); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); @@ -1662,10 +1814,17 @@ void FramebufferRenderer::render(Scene* scene, Camera* camera, float blackoutFac performRaycasterTasks(tasks.raycasterTasks); } - // Binds the final Framebuffer which will contain the results of the TMOs - glBindFramebuffer(GL_FRAMEBUFFER, _hdrFilteringFramebuffer); - glDrawBuffers(1, ColorAttachment0Array); - glClear(GL_COLOR_BUFFER_BIT); + //// Binds the final Framebuffer which will contain the results of the TMOs + //glBindFramebuffer(GL_FRAMEBUFFER, _hdrBuffers._hdrFilteringFramebuffer); + //glDrawBuffers(1, ColorAttachment0Array); + //glClear(GL_COLOR_BUFFER_BIT); + + glBindFramebuffer(GL_FRAMEBUFFER, _pingPongBuffers.framebuffer); + glDrawBuffers(1, &ColorAttachment01Array[_pingPongIndex]); + glEnablei(GL_BLEND, 0); + glDisablei(GL_BLEND, 1); + glDisablei(GL_BLEND, 2); + glDisablei(GL_BLEND, 3); // Run Deferred Tasks (resolve step is executed together with these tasks) { @@ -1682,108 +1841,64 @@ void FramebufferRenderer::render(Scene* scene, Camera* camera, float blackoutFac // If no Deferred Task are prensent, the resolve step // is executed in a separated step if (tasks.deferredcasterTasks.empty()) { - //glBindFramebuffer(GL_FRAMEBUFFER, defaultFbo); - _resolveProgram->activate(); - - ghoul::opengl::TextureUnit mainColorTextureUnit; - mainColorTextureUnit.activate(); - - glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _mainColorTexture); - _resolveProgram->setUniform(_uniformCache.mainColorTexture, mainColorTextureUnit); - _resolveProgram->setUniform(_uniformCache.blackoutFactor, blackoutFactor); - _resolveProgram->setUniform(_uniformCache.nAaSamples, _nAaSamples); - glBindVertexArray(_screenQuad); - glDrawArrays(GL_TRIANGLES, 0, 6); - glBindVertexArray(0); - - _resolveProgram->deactivate(); + resolveMSAA(blackoutFactor); } - // Disabling depth test for filtering and hdr glDisable(GL_DEPTH_TEST); if (_bloomEnabled) { + std::unique_ptr perfInternal; + if (doPerformanceMeasurements) { + perfInternal = std::make_unique( + "FramebufferRenderer::render::applyBloomFilter" + ); + } + + // JCC: PRECISO AJUSTAR A ENTRADA DO BLOOM PARA A NOVA PING PONG. // Results of the DeferredTasks as entry for the bloom filter applyBloomFilter(); } - float averageLuminaceInFB = 0.0; - //if (_toneMapOperator == - // static_cast(openspace::RenderEngine::ToneMapOperators::GLOBAL) - // ) - //{ - // averageLuminaceInFB = computeBufferAveLuminanceGPU(); - // if (std::isnan(averageLuminaceInFB)) { - // averageLuminaceInFB = 1000.0; - // } - //} - // - ////float averageLuminaceInFB = 0.5; - - // When applying the TMO, the result is saved to the default FBO to be displayed // by the Operating System glBindFramebuffer(GL_FRAMEBUFFER, _osDefaultGLState.defaultFBO); glViewport(0, 0, _resolution.x, _resolution.y); + + // JCC: AQUI -> PRECISO FAZER UM RESOLVE COM HDR JUNTO PARA ECONOMIZAR TEMPO + // - if (_toneMapOperator == - static_cast(openspace::RenderEngine::ToneMapOperators::MIPMAPPING)) { - if (_bloomEnabled) { - computeMipMappingFromHDRBuffer(_bloomTexture[2]); - } - else { - computeMipMappingFromHDRBuffer(_hdrFilteringTexture); - } - } - else { - _hdrFilteringProgram->activate(); - - ghoul::opengl::TextureUnit hdrFeedingTextureUnit; - hdrFeedingTextureUnit.activate(); - if (_bloomEnabled) { - glBindTexture(GL_TEXTURE_2D, _bloomTexture[2]); - } - else { - glBindTexture(GL_TEXTURE_2D, _hdrFilteringTexture); - } - - _hdrFilteringProgram->setUniform( - _hdrUniformCache.deferredResultsTexture, - hdrFeedingTextureUnit - ); - - - _hdrFilteringProgram->setUniform(_hdrUniformCache.blackoutFactor, blackoutFactor); - _hdrFilteringProgram->setUniform(_hdrUniformCache.hdrExposure, _hdrExposure); - _hdrFilteringProgram->setUniform(_hdrUniformCache.gamma, _gamma); - _hdrFilteringProgram->setUniform(_hdrUniformCache.toneMapOperator, _toneMapOperator); - _hdrFilteringProgram->setUniform(_hdrUniformCache.aveLum, averageLuminaceInFB); - _hdrFilteringProgram->setUniform(_hdrUniformCache.maxWhite, _maxWhite); - _hdrFilteringProgram->setUniform(_hdrUniformCache.Hue, _hue); - _hdrFilteringProgram->setUniform(_hdrUniformCache.Saturation, _saturation); - _hdrFilteringProgram->setUniform(_hdrUniformCache.Value, _value); - _hdrFilteringProgram->setUniform(_hdrUniformCache.Lightness, _lightness); - _hdrFilteringProgram->setUniform(_hdrUniformCache.colorSpace, _colorSpace); - - - glBindVertexArray(_screenQuad); - glDrawArrays(GL_TRIANGLES, 0, 6); - glBindVertexArray(0); - - _hdrFilteringProgram->deactivate(); - } - + // Apply the selected TMO on the results + applyTMO(blackoutFactor); + // JCC: ADJUST HERE SO THE HDR IS TOGETHER WITH THE RESOLVE: + // As a last step, copy the rendering to the final default framebuffer. + /*_resolveProgram->activate(); + + ghoul::opengl::TextureUnit mainColorTextureUnit; + mainColorTextureUnit.activate(); + + glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _pingPongBuffers[_pingPongIndex].colorTexture); + _resolveProgram->setUniform(_uniformCache.mainColorTexture, mainColorTextureUnit); + _resolveProgram->setUniform(_uniformCache.blackoutFactor, blackoutFactor); + _resolveProgram->setUniform(_uniformCache.nAaSamples, _nAaSamples); + _resolveProgram->setUniform(_uniformCache.exposure, _hdrExposure); + _resolveProgram->setUniform(_uniformCache.gamma, _gamma); + _resolveProgram->setUniform(_uniformCache.nAaSamples, _nAaSamples); + + glBindVertexArray(_screenQuad); + glDrawArrays(GL_TRIANGLES, 0, 6); + glBindVertexArray(0); + + _resolveProgram->deactivate();*/ + + //================================ // Adjusting color and brightness //================================ // //// Histogram Equalization //computeImageHistogram(); - - - //glBindFramebuffer(GL_FRAMEBUFFER, defaultFbo); } void FramebufferRenderer::performRaycasterTasks(const std::vector& tasks) { @@ -1800,7 +1915,7 @@ void FramebufferRenderer::performRaycasterTasks(const std::vector exitProgram->deactivate(); } - glBindFramebuffer(GL_FRAMEBUFFER, _mainFramebuffer); + glBindFramebuffer(GL_FRAMEBUFFER, _gBuffers._mainFramebuffer); glm::vec3 cameraPosition; bool isCameraInside = raycaster->isCameraInside( raycasterTask.renderData, @@ -1846,7 +1961,7 @@ void FramebufferRenderer::performRaycasterTasks(const std::vector ghoul::opengl::TextureUnit mainDepthTextureUnit; mainDepthTextureUnit.activate(); - glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _mainDepthTexture); + glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _gBuffers._mainDepthTexture); raycastProgram->setUniform("mainDepthTexture", mainDepthTextureUnit); raycastProgram->setUniform("nAaSamples", _nAaSamples); @@ -1893,12 +2008,22 @@ void FramebufferRenderer::performDeferredTasks( } if (deferredcastProgram) { + _pingPongIndex = _pingPongIndex == 0 ? 1 : 0; + int fromIndex = _pingPongIndex == 0 ? 1 : 0; + glDrawBuffers(1, &ColorAttachment01Array[_pingPongIndex]); + glDisablei(GL_BLEND, 0); + glDisablei(GL_BLEND, 1); + deferredcastProgram->activate(); // adding G-Buffer ghoul::opengl::TextureUnit mainDColorTextureUnit; mainDColorTextureUnit.activate(); - glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _mainColorTexture); + //glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _gBuffers._mainColorTexture); + glBindTexture( + GL_TEXTURE_2D_MULTISAMPLE, + _pingPongBuffers.colorTexture[fromIndex] + ); deferredcastProgram->setUniform( "mainColorTexture", mainDColorTextureUnit @@ -1906,7 +2031,7 @@ void FramebufferRenderer::performDeferredTasks( ghoul::opengl::TextureUnit mainPositionTextureUnit; mainPositionTextureUnit.activate(); - glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _mainPositionTexture); + glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _gBuffers._mainPositionTexture); deferredcastProgram->setUniform( "mainPositionTexture", mainPositionTextureUnit @@ -1914,7 +2039,7 @@ void FramebufferRenderer::performDeferredTasks( ghoul::opengl::TextureUnit mainNormalTextureUnit; mainNormalTextureUnit.activate(); - glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _mainNormalTexture); + glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _gBuffers._mainNormalTexture); deferredcastProgram->setUniform( "mainNormalTexture", mainNormalTextureUnit @@ -1951,9 +2076,10 @@ void FramebufferRenderer::performDeferredTasks( deferredcastProgram->deactivate(); - if (firstPaint) { + // JCC: No neeeded anymore + /*if (firstPaint) { firstPaint = false; - } + }*/ } else { LWARNING( From 420879c28b84e69ac98a453b56a3649bc3ccbec1 Mon Sep 17 00:00:00 2001 From: Jonathas Costa Date: Wed, 3 Jul 2019 09:43:55 -0400 Subject: [PATCH 13/39] Fixed and Improved ping pong. --- .../openspace/rendering/framebufferrenderer.h | 4 +- .../shaders/atmosphere_deferred_fs.glsl | 61 ++++------ shaders/framebuffer/hdrAndFiltering.frag | 73 +++++++----- shaders/framebuffer/resolveframebuffer.frag | 14 +-- src/rendering/framebufferrenderer.cpp | 108 +++++++----------- 5 files changed, 115 insertions(+), 145 deletions(-) diff --git a/include/openspace/rendering/framebufferrenderer.h b/include/openspace/rendering/framebufferrenderer.h index f5b90f3b36..efa772a800 100644 --- a/include/openspace/rendering/framebufferrenderer.h +++ b/include/openspace/rendering/framebufferrenderer.h @@ -227,9 +227,9 @@ private: std::unique_ptr _resolveProgram; UniformCache(mainColorTexture, blackoutFactor, nAaSamples) _uniformCache; - UniformCache(deferredResultsTexture, blackoutFactor, hdrExposure, gamma, + UniformCache(hdrFeedingTexture, blackoutFactor, hdrExposure, gamma, toneMapOperator, aveLum, maxWhite, Hue, Saturation, Value, - Lightness, colorSpace) _hdrUniformCache; + Lightness, colorSpace, nAaSamples) _hdrUniformCache; UniformCache(renderedImage, bloomImage, bloomOrigFactor, bloomNewFactor) _bloomUniformCache; diff --git a/modules/atmosphere/shaders/atmosphere_deferred_fs.glsl b/modules/atmosphere/shaders/atmosphere_deferred_fs.glsl index d2a5999144..53da2d939d 100644 --- a/modules/atmosphere/shaders/atmosphere_deferred_fs.glsl +++ b/modules/atmosphere/shaders/atmosphere_deferred_fs.glsl @@ -61,7 +61,6 @@ #include "floatoperations.glsl" -#include "hdr.glsl" #include "atmosphere_common.glsl" out vec4 renderTarget; @@ -71,11 +70,6 @@ uniform int nAaSamples; uniform double msaaSamplePatter[48]; uniform int cullAtmosphere; -// The following uniforms are -// set into the current Renderer -uniform bool firstPaint; -uniform float atmExposure; - uniform sampler2D irradianceTexture; uniform sampler3D inscatterTexture; uniform sampler2DMS mainPositionTexture; @@ -90,8 +84,6 @@ uniform dmat4 dSgctProjectionToModelTransformMatrix; uniform dvec4 dCamPosObj; uniform dvec3 sunDirectionObj; -uniform float blackoutFactor; - /******************************************************************************* ***** ALL CALCULATIONS FOR ECLIPSE ARE IN METERS AND IN WORLD SPACE SYSTEM **** *******************************************************************************/ @@ -315,7 +307,7 @@ vec3 inscatterRadiance(inout vec3 x, inout float t, inout float irradianceFactor // through the atmosphere. If this ray hits something inside the atmosphere, // we will subtract the attenuated scattering light from that path in the // current path. - vec4 inscatterRadiance = max(texture4D(inscatterTexture, r, mu, muSun, nu), 0.0); + vec4 inscatterRadiance = max(texture4D(inscatterTexture, r, mu, muSun, nu), 0.0); // After removing the initial path from camera pos to top of atmosphere (for an // observer in the space) we test if the light ray is hitting the atmosphere @@ -363,7 +355,7 @@ vec3 inscatterRadiance(inout vec3 x, inout float t, inout float irradianceFactor if (abs(mu - muHorizon) < INTERPOLATION_EPS) { // We want an interpolation value close to 1/2, so the // contribution of each radiance value is almost the same - // or it has a havey weight if from above or below horizon + // or it has a heavy weight if from above or below horizon float interpolationValue = ((mu - muHorizon) + INTERPOLATION_EPS) / (2.0f * INTERPOLATION_EPS); //float t2 = t * t; @@ -429,7 +421,11 @@ vec3 inscatterRadiance(inout vec3 x, inout float t, inout float irradianceFactor return finalScatteringRadiance; } else { //return ((r-Rg) * invRtMinusRg)*spaceColor.rgb + finalScatteringRadiance; - return attenuation * spaceColor.rgb + finalScatteringRadiance; + //return attenuation * spaceColor.rgb + finalScatteringRadiance; + // JCC: Review next step. I don't like it. + return attenuation * spaceColor.rgb + + 1.0 * attenuation * finalScatteringRadiance + + (vec3(1.0) - attenuation) * finalScatteringRadiance; } } @@ -536,7 +532,8 @@ vec3 sunColor(const vec3 x, const float t, const vec3 v, const vec3 s, const flo vec3(0.0f) : transmittanceLUT(r, mu)) : vec3(1.0f); // JCC: Change this function to a impostor texture with gaussian decay color weighted // by tge sunRadiance, transmittance and irradianceColor (11/03/2017) - float sunFinalColor = step(cos(M_PI / 650.0f), dot(v, s)) * sunRadiance * (1.0f- irradianceFactor); + float sunFinalColor = smoothstep(cos(M_PI / 500.0f), cos(M_PI / 900.0f), dot(v, s)) * + sunRadiance * (1.0f - irradianceFactor); return transmittance * sunFinalColor; } @@ -546,7 +543,6 @@ void main() { if (cullAtmosphere == 0) { vec4 atmosphereFinalColor = vec4(0.0f); - vec4 backgroundFinalColor = vec4(0.0f); int nSamples = 1; // First we determine if the pixel is complex (different fragments on it) @@ -570,7 +566,8 @@ void main() { for (int i = 0; i < nSamples; i++) { // Color from G-Buffer //vec4 color = texelFetch(mainColorTexture, fragCoords, i); - vec4 color = vec4(-log2(vec3(1.0) - colorArray[i].rgb), colorArray[i].a); + //vec4 color = vec4(-log2(vec3(1.0) - colorArray[i].rgb), colorArray[i].a); + vec4 color = colorArray[i]; // Ray in object space dRay ray; dvec4 planetPositionObjectCoords = dvec4(0.0); @@ -636,8 +633,7 @@ void main() { if (dot(position.xyz, vec3(1.0)) > 0.0 && (pixelDepth < offset)) { // ATM Occluded - Something in fron of ATM. - //atmosphereFinalColor += vec4(HDR(color.xyz * backgroundConstant, atmExposure), color.a); - atmosphereFinalColor += vec4(color.xyz, color.a); + atmosphereFinalColor += color; } else { // Following paper nomenclature double t = offset; @@ -686,44 +682,27 @@ void main() { } // Final Color of ATM plus terrain: - //vec4 finalRadiance = vec4(HDR(inscatterColor + groundColorV + sunColorV, atmExposure), 1.0); vec4 finalRadiance = vec4(inscatterColor + groundColorV + sunColorV, 1.0); atmosphereFinalColor += finalRadiance; } } else { // no intersection - //atmosphereFinalColor += vec4(HDR(color.xyz * backgroundConstant, atmExposure), color.a); - //atmosphereFinalColor += vec4(color.xyz * backgroundConstant, color.a); - //backgroundFinalColor += color; - discard; + // Buffer color + atmosphereFinalColor += color; } } renderTarget = atmosphereFinalColor / float(nSamples); - - // renderTarget = vec4( - // (atmosphereFinalColor.xyz + (backgroundFinalColor.xyz * backgroundConstant)) / float(nSamples), - // (atmosphereFinalColor.a + backgroundFinalColor.a) / float(nSamples) - // ); } else { // culling - if (firstPaint) { - vec4 bColor = vec4(0.0f); - for (int f = 0; f < nAaSamples; f++) { - bColor += texelFetch(mainColorTexture, fragCoords, f); - } - bColor /= float(nAaSamples); - //renderTarget = vec4(HDR(bColor.xyz * backgroundConstant, atmExposure), bColor.a); - //renderTarget = vec4(bColor.xyz * backgroundConstant, bColor.a); - renderTarget = vec4(-log2(vec3(1.0) - bColor.rgb), bColor.a); - //renderTarget = bColor; - - } - else { - //renderTarget = vec4(vec3(1.0, 0.0, 0.0), 1.0); - discard; + vec4 bColor = vec4(0.0f); + for (int f = 0; f < nAaSamples; f++) { + bColor += texelFetch(mainColorTexture, fragCoords, f); } + bColor /= float(nAaSamples); + //renderTarget = vec4(-log2(vec3(1.0) - bColor.rgb), bColor.a); + renderTarget = bColor; } } diff --git a/shaders/framebuffer/hdrAndFiltering.frag b/shaders/framebuffer/hdrAndFiltering.frag index afa8de682f..3996ea5e44 100644 --- a/shaders/framebuffer/hdrAndFiltering.frag +++ b/shaders/framebuffer/hdrAndFiltering.frag @@ -43,53 +43,64 @@ uniform float Value; uniform float Lightness; uniform int toneMapOperator; uniform uint colorSpace; +uniform int nAaSamples; -uniform sampler2D deferredResultsTexture; +//uniform sampler2D hdrFeedingTexture; +uniform sampler2DMS hdrFeedingTexture; in vec2 texCoord; +// JCC: Change the next function to work with a MSAA texture vec4 adaptiveToneMap() { - int i; - float lum[25]; - vec2 tex_scale = vec2(1.0) / textureSize(deferredResultsTexture, 0); + // int i; + // float lum[25]; + // // Non MSAAA variant: + // //vec2 tex_scale = vec2(1.0) / textureSize(hdrFeedingTexture, 0); + // vec2 tex_scale = vec2(1.0) / textureSize(hdrFeedingTexture); - for (i = 0; i < 25; i++) - { - vec2 tc = (gl_FragCoord.xy + 3.5 * vec2(i % 5 - 2, i / 5 - 2)); - vec3 col = texture(deferredResultsTexture, tc * tex_scale).rgb; - lum[i] = dot(col, vec3(0.3, 0.59, 0.11)); - } + // for (i = 0; i < 25; i++) + // { + // vec2 tc = (gl_FragCoord.xy + 3.5 * vec2(i % 5 - 2, i / 5 - 2)); + // vec3 col = texture(hdrFeedingTexture, tc * tex_scale).rgb; + // lum[i] = dot(col, vec3(0.3, 0.59, 0.11)); + // } - // Calculate weighted color of region - vec3 vColor = texelFetch(deferredResultsTexture, ivec2(gl_FragCoord.xy), 0).rgb; + // // Calculate weighted color of region + // vec3 vColor = texelFetch(hdrFeedingTexture, ivec2(gl_FragCoord.xy), 0).rgb; - float kernelLuminance = ( - (1.0 * (lum[0] + lum[4] + lum[20] + lum[24])) + - (4.0 * (lum[1] + lum[3] + lum[5] + lum[9] + - lum[15] + lum[19] + lum[21] + lum[23])) + - (7.0 * (lum[2] + lum[10] + lum[14] + lum[22])) + - (16.0 * (lum[6] + lum[8] + lum[16] + lum[18])) + - (26.0 * (lum[7] + lum[11] + lum[13] + lum[17])) + - (41.0 * lum[12]) - ) / 273.0; + // float kernelLuminance = ( + // (1.0 * (lum[0] + lum[4] + lum[20] + lum[24])) + + // (4.0 * (lum[1] + lum[3] + lum[5] + lum[9] + + // lum[15] + lum[19] + lum[21] + lum[23])) + + // (7.0 * (lum[2] + lum[10] + lum[14] + lum[22])) + + // (16.0 * (lum[6] + lum[8] + lum[16] + lum[18])) + + // (26.0 * (lum[7] + lum[11] + lum[13] + lum[17])) + + // (41.0 * lum[12]) + // ) / 273.0; - // Compute the corresponding exposure - float exposure = sqrt(8.0 / (kernelLuminance + 0.25)); + // // Compute the corresponding exposure + // float exposure = sqrt(8.0 / (kernelLuminance + 0.25)); - // Apply the exposure to this texel - vec4 fColor; - fColor.rgb = 1.0 - exp2(-vColor * exposure); - fColor.a = 1.0f; + // // Apply the exposure to this texel + // vec4 fColor; + // fColor.rgb = 1.0 - exp2(-vColor * exposure); + // fColor.a = 1.0f; - return fColor; + // return fColor; + return vec4(1.0, 0.0, 0.0, 1.0); } void main() { vec4 color = vec4(0.0); - color = texture(deferredResultsTexture, texCoord); - //color = texelFetch(deferredResultsTexture, ivec2(gl_FragCoord.xy), 0); - color.a *= blackoutFactor; + + //color = texture(hdrFeedingTexture, texCoord); + for (int i = 0; i < nAaSamples; i++) { + color += texelFetch(hdrFeedingTexture, ivec2(gl_FragCoord), i); + } + + color /= nAaSamples; + color.rgb *= blackoutFactor; vec3 tColor = vec3(0.0); if (toneMapOperator == EXPONENTIAL) { diff --git a/shaders/framebuffer/resolveframebuffer.frag b/shaders/framebuffer/resolveframebuffer.frag index e3ff098396..39f2946dec 100644 --- a/shaders/framebuffer/resolveframebuffer.frag +++ b/shaders/framebuffer/resolveframebuffer.frag @@ -31,13 +31,13 @@ uniform int nAaSamples; uniform sampler2DMS mainColorTexture; void main() { - vec4 color = vec4(0.0); - for (int i = 0; i < nAaSamples; i++) { - color += texelFetch(mainColorTexture, ivec2(gl_FragCoord), i); - } + vec4 color = vec4(0.0); + for (int i = 0; i < nAaSamples; i++) { + color += texelFetch(mainColorTexture, ivec2(gl_FragCoord), i); + } - color /= nAaSamples; - color.rgb *= blackoutFactor; + color /= nAaSamples; + color.rgb *= blackoutFactor; - finalColor = vec4(color.rgb, 1.0); + finalColor = vec4(color.rgb, 1.0); } diff --git a/src/rendering/framebufferrenderer.cpp b/src/rendering/framebufferrenderer.cpp index 7998fedcd5..f97703fb2e 100644 --- a/src/rendering/framebufferrenderer.cpp +++ b/src/rendering/framebufferrenderer.cpp @@ -55,10 +55,10 @@ namespace { "mainColorTexture", "blackoutFactor", "nAaSamples" }; - constexpr const std::array HDRUniformNames = { - "deferredResultsTexture", "blackoutFactor", "hdrExposure", "gamma", + constexpr const std::array HDRUniformNames = { + "hdrFeedingTexture", "blackoutFactor", "hdrExposure", "gamma", "toneMapOperator", "aveLum", "maxWhite", "Hue", "Saturation", "Value", - "Lightness", "colorSpace" + "Lightness", "colorSpace", "nAaSamples" }; constexpr const std::array BloomUniformNames = { @@ -528,8 +528,7 @@ void FramebufferRenderer::resolveMSAA(float blackoutFactor) { ghoul::opengl::TextureUnit mainColorTextureUnit; mainColorTextureUnit.activate(); - //glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _gBuffers._mainColorTexture); - glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _pingPongBuffers.colorTexture[_pingPongIndex]); + glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _gBuffers._mainColorTexture); _resolveProgram->setUniform(_uniformCache.mainColorTexture, mainColorTextureUnit); _resolveProgram->setUniform(_uniformCache.blackoutFactor, blackoutFactor); _resolveProgram->setUniform(_uniformCache.nAaSamples, _nAaSamples); @@ -551,6 +550,7 @@ void FramebufferRenderer::applyTMO(float blackoutFactor) { "FramebufferRenderer::render::TMO_GLOBAL" ); } + // JCC: Mudar aqui para que a entrada do TMO seja MSAA averageLuminaceInFB = computeBufferAveLuminanceGPU(); if (std::isnan(averageLuminaceInFB)) { averageLuminaceInFB = 1000.0; @@ -565,6 +565,7 @@ void FramebufferRenderer::applyTMO(float blackoutFactor) { "FramebufferRenderer::render::TMO_Mipmapping" ); } + // JCC: Mudar aqui para que a entrada do TMO seja MSAA if (_bloomEnabled) { computeMipMappingFromHDRBuffer(_bloomBuffers._bloomTexture[2]); } @@ -584,14 +585,18 @@ void FramebufferRenderer::applyTMO(float blackoutFactor) { ghoul::opengl::TextureUnit hdrFeedingTextureUnit; hdrFeedingTextureUnit.activate(); if (_bloomEnabled) { + // JCC: The next texture must be a MSAA texture glBindTexture(GL_TEXTURE_2D, _bloomBuffers._bloomTexture[2]); } else { - glBindTexture(GL_TEXTURE_2D, _hdrBuffers._hdrFilteringTexture); + glBindTexture( + GL_TEXTURE_2D_MULTISAMPLE, + _pingPongBuffers.colorTexture[_pingPongIndex] + ); } _hdrFilteringProgram->setUniform( - _hdrUniformCache.deferredResultsTexture, + _hdrUniformCache.hdrFeedingTexture, hdrFeedingTextureUnit ); @@ -607,6 +612,7 @@ void FramebufferRenderer::applyTMO(float blackoutFactor) { _hdrFilteringProgram->setUniform(_hdrUniformCache.Value, _value); _hdrFilteringProgram->setUniform(_hdrUniformCache.Lightness, _lightness); _hdrFilteringProgram->setUniform(_hdrUniformCache.colorSpace, _colorSpace); + _hdrFilteringProgram->setUniform(_hdrUniformCache.nAaSamples, _nAaSamples); glBindVertexArray(_screenQuad); @@ -762,13 +768,13 @@ void FramebufferRenderer::applyBloomFilter() { // the _bloomBuffers._bloomTexture[2] texture (JCC: That can be // done by blending operation (ONE)) { - ghoul::opengl::TextureUnit deferredResultsTextureUnit; - deferredResultsTextureUnit.activate(); + ghoul::opengl::TextureUnit hdrFeedingTextureUnit; + hdrFeedingTextureUnit.activate(); // Original buffer will be summed to the bloom result glBindTexture(GL_TEXTURE_2D, _hdrBuffers._hdrFilteringTexture); _bloomResolveProgram->setUniform( _bloomUniformCache.renderedImage, - deferredResultsTextureUnit + hdrFeedingTextureUnit ); ghoul::opengl::TextureUnit bloomTextureUnit; @@ -1761,6 +1767,10 @@ void FramebufferRenderer::updateMSAASamplingPattern() { } void FramebufferRenderer::render(Scene* scene, Camera* camera, float blackoutFactor) { + // Reset ping pong texture rendering + _pingPongIndex = 0; + + // Measurements cache variable const bool doPerformanceMeasurements = global::performanceManager.isEnabled(); std::unique_ptr perf; @@ -1819,34 +1829,38 @@ void FramebufferRenderer::render(Scene* scene, Camera* camera, float blackoutFac //glDrawBuffers(1, ColorAttachment0Array); //glClear(GL_COLOR_BUFFER_BIT); - glBindFramebuffer(GL_FRAMEBUFFER, _pingPongBuffers.framebuffer); - glDrawBuffers(1, &ColorAttachment01Array[_pingPongIndex]); - glEnablei(GL_BLEND, 0); - glDisablei(GL_BLEND, 1); - glDisablei(GL_BLEND, 2); - glDisablei(GL_BLEND, 3); - - // Run Deferred Tasks (resolve step is executed together with these tasks) - { - std::unique_ptr perfInternal; - if (doPerformanceMeasurements) { - perfInternal = std::make_unique( - "FramebufferRenderer::render::deferredTasks" - ); - } - performDeferredTasks(tasks.deferredcasterTasks, blackoutFactor); - } - + // If no Deferred Task are prensent, the resolve step // is executed in a separated step if (tasks.deferredcasterTasks.empty()) { resolveMSAA(blackoutFactor); } + else { + // We use ping pong rendering in order to be able to + // render multiple deferred tasks at same time (e.g. + // more than 1 ATM being seen at once) + glBindFramebuffer(GL_FRAMEBUFFER, _pingPongBuffers.framebuffer); + glDrawBuffers(1, &ColorAttachment01Array[_pingPongIndex]); + // JCC: next commands should be in the cache.... + glEnablei(GL_BLEND, 0); + glDisablei(GL_BLEND, 1); + glDisablei(GL_BLEND, 2); + glDisablei(GL_BLEND, 3); + + std::unique_ptr perfInternal; + if (doPerformanceMeasurements) { + perfInternal = std::make_unique( + "FramebufferRenderer::render::deferredTasks" + ); + } + performDeferredTasks(tasks.deferredcasterTasks, blackoutFactor); + } // Disabling depth test for filtering and hdr glDisable(GL_DEPTH_TEST); + // JCC: Change bloom to work in a MSAA environment if (_bloomEnabled) { std::unique_ptr perfInternal; if (doPerformanceMeasurements) { @@ -1861,37 +1875,12 @@ void FramebufferRenderer::render(Scene* scene, Camera* camera, float blackoutFac } // When applying the TMO, the result is saved to the default FBO to be displayed - // by the Operating System + // by the Operating System. Also, the resolve procedure is executed in this step. glBindFramebuffer(GL_FRAMEBUFFER, _osDefaultGLState.defaultFBO); glViewport(0, 0, _resolution.x, _resolution.y); - - // JCC: AQUI -> PRECISO FAZER UM RESOLVE COM HDR JUNTO PARA ECONOMIZAR TEMPO - // - // Apply the selected TMO on the results applyTMO(blackoutFactor); - // JCC: ADJUST HERE SO THE HDR IS TOGETHER WITH THE RESOLVE: - // As a last step, copy the rendering to the final default framebuffer. - /*_resolveProgram->activate(); - - ghoul::opengl::TextureUnit mainColorTextureUnit; - mainColorTextureUnit.activate(); - - glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _pingPongBuffers[_pingPongIndex].colorTexture); - _resolveProgram->setUniform(_uniformCache.mainColorTexture, mainColorTextureUnit); - _resolveProgram->setUniform(_uniformCache.blackoutFactor, blackoutFactor); - _resolveProgram->setUniform(_uniformCache.nAaSamples, _nAaSamples); - _resolveProgram->setUniform(_uniformCache.exposure, _hdrExposure); - _resolveProgram->setUniform(_uniformCache.gamma, _gamma); - _resolveProgram->setUniform(_uniformCache.nAaSamples, _nAaSamples); - - glBindVertexArray(_screenQuad); - glDrawArrays(GL_TRIANGLES, 0, 6); - glBindVertexArray(0); - - _resolveProgram->deactivate();*/ - //================================ // Adjusting color and brightness @@ -1993,9 +1982,7 @@ void FramebufferRenderer::performDeferredTasks( const std::vector& tasks, float blackoutFactor ) -{ - bool firstPaint = true; - +{ for (const DeferredcasterTask& deferredcasterTask : tasks) { Deferredcaster* deferredcaster = deferredcasterTask.deferredcaster; @@ -2050,8 +2037,6 @@ void FramebufferRenderer::performDeferredTasks( // 48 = 16 samples * 3 coords deferredcastProgram->setUniform("msaaSamplePatter", &_mSAAPattern[0], 48); - deferredcastProgram->setUniform("firstPaint", firstPaint); - deferredcastProgram->setUniform("atmExposure", _hdrExposure); deferredcaster->preRaycast( deferredcasterTask.renderData, _deferredcastData[deferredcaster], @@ -2075,11 +2060,6 @@ void FramebufferRenderer::performDeferredTasks( ); deferredcastProgram->deactivate(); - - // JCC: No neeeded anymore - /*if (firstPaint) { - firstPaint = false; - }*/ } else { LWARNING( From 2eed2202611a42da116bc0e056c0d1dfc301099c Mon Sep 17 00:00:00 2001 From: Jonathas Costa Date: Wed, 3 Jul 2019 10:27:59 -0400 Subject: [PATCH 14/39] Decreased Gaussian Filter size in order to improve performance of bloom. --- shaders/framebuffer/bloomFilter.frag | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/shaders/framebuffer/bloomFilter.frag b/shaders/framebuffer/bloomFilter.frag index e0830c77e9..ab3445c61a 100644 --- a/shaders/framebuffer/bloomFilter.frag +++ b/shaders/framebuffer/bloomFilter.frag @@ -58,6 +58,16 @@ const float weights[] = float[](0.0024499299678342, 0.0043538453346397, 0.0024499299678342); +const float weights2[] = float[](0.077847, + 0.123317, + 0.077847, + 0.123317, + 0.195346, + 0.123317, + 0.077847, + 0.123317, + 0.077847); + void main(void) { vec4 color = vec4(0.0); From 470a6d56d504056b2a04d592d7811ff3ffac090c Mon Sep 17 00:00:00 2001 From: Jonathas Costa Date: Sat, 13 Jul 2019 15:39:31 -0400 Subject: [PATCH 15/39] Faster bloom. --- .../openspace/rendering/framebufferrenderer.h | 15 +- shaders/framebuffer/bloomFilter.frag | 96 ++++-- shaders/framebuffer/bloomFilter.vert | 8 +- shaders/framebuffer/bloomResolveFilter.frag | 18 +- src/rendering/framebufferrenderer.cpp | 291 ++++++++++-------- 5 files changed, 248 insertions(+), 180 deletions(-) diff --git a/include/openspace/rendering/framebufferrenderer.h b/include/openspace/rendering/framebufferrenderer.h index efa772a800..ba63e178bb 100644 --- a/include/openspace/rendering/framebufferrenderer.h +++ b/include/openspace/rendering/framebufferrenderer.h @@ -87,12 +87,12 @@ private: }; typedef struct { - GLuint _mainColorTexture; - GLuint _mainFilterTexture; - GLuint _mainPositionTexture; - GLuint _mainNormalTexture; - GLuint _mainDepthTexture; - GLuint _mainFramebuffer; + GLuint _colorTexture; + GLuint _filterTexture; + GLuint _positionTexture; + GLuint _normalTexture; + GLuint _depthTexture; + GLuint _framebuffer; } GBuffers; typedef struct { @@ -181,8 +181,7 @@ public: void update() override; void performRaycasterTasks(const std::vector& tasks); - void performDeferredTasks(const std::vector& tasks, - float blackoutFactor); + void performDeferredTasks(const std::vector& tasks); void render(Scene* scene, Camera* camera, float blackoutFactor) override; /** diff --git a/shaders/framebuffer/bloomFilter.frag b/shaders/framebuffer/bloomFilter.frag index ab3445c61a..7e3ed34d82 100644 --- a/shaders/framebuffer/bloomFilter.frag +++ b/shaders/framebuffer/bloomFilter.frag @@ -27,12 +27,12 @@ layout (location = 0) out vec4 finalColor; uniform int numberOfSamples; -uniform int filterStep; -uniform sampler2DMS filterImage; -uniform sampler2D filterFirstPass; +uniform int maxResX; +uniform int maxResY; +uniform sampler2DMS msaaTexture; // Gaussian Weights from OpenGL SuperBible 7 ed. -const float weights[] = float[](0.0024499299678342, +const float weights2[] = float[](0.0024499299678342, 0.0043538453346397, 0.0073599963704157, 0.0118349786570722, @@ -58,38 +58,82 @@ const float weights[] = float[](0.0024499299678342, 0.0043538453346397, 0.0024499299678342); -const float weights2[] = float[](0.077847, - 0.123317, - 0.077847, - 0.123317, - 0.195346, - 0.123317, - 0.077847, - 0.123317, - 0.077847); +// Gaussian weights calculated by http://dev.theomader.com/gaussian-kernel-calculator/ +// sigma = 4.4625, kernel size = 5 +const float weights[] = float[](0.190079, + 0.204885, + 0.210072, + 0.204885, + 0.190079); + +// Gaussian weights calculated by http://dev.theomader.com/gaussian-kernel-calculator/ +// sigma = 8, kernel size = 45 +const float weights3[] = float[](0.001147, + 0.001605, + 0.002209, + 0.002995, + 0.003998, + 0.005253, + 0.006795, + 0.008655, + 0.010852, + 0.013397, + 0.016283, + 0.019484, + 0.022952, + 0.02662, + 0.030396, + 0.03417, + 0.037817, + 0.041206, + 0.044204, + 0.046685, + 0.048543, + 0.049692, + 0.050082, + 0.049692, + 0.048543, + 0.046685, + 0.044204, + 0.041206, + 0.037817, + 0.03417, + 0.030396, + 0.02662, + 0.022952, + 0.019484, + 0.016283, + 0.013397, + 0.010852, + 0.008655, + 0.006795, + 0.005253, + 0.003998, + 0.002995, + 0.002209, + 0.001605, + 0.001147); void main(void) { vec4 color = vec4(0.0); // Transpose the image so the filter can be applied on X and Y + // P is the central position in the filter mask ivec2 P = ivec2(gl_FragCoord.yx) - ivec2(0, weights.length() >> 1); - float origAlpha = 1.0; - - for (int i = 0; i < weights.length(); i++) + + for (int w = 0; w < weights.length(); w++) { - if (filterStep == 1) { - vec4 tmpColor = vec4(0.0); + ivec2 texelCoord = P + ivec2(0, w); + vec4 tmpColor = vec4(0.0); + if ((texelCoord.x >= 0 && texelCoord.y >= 0) && + (texelCoord.x < maxResX && texelCoord.y < maxResY)) { for (int s = 0; s < numberOfSamples; ++s) { - tmpColor += vec4(texelFetch(filterImage, P + ivec2(0, i), 0).rgb, s) * weights[i]; + tmpColor += texelFetch(msaaTexture, texelCoord, s); } tmpColor /= numberOfSamples; - color += tmpColor; - //color += vec4(texelFetch(filterImage, P + ivec2(0, i), 0).rgb, 1) * weights[i]; - origAlpha = color.a; - } else if (filterStep == 2) { - color += vec4(texelFetch(filterFirstPass, P + ivec2(0, i), 0).rgb, 0) * weights[i]; - } + } + color += tmpColor * weights[w]; } - finalColor = vec4(color.rgb, 1.0); + finalColor = color; } diff --git a/shaders/framebuffer/bloomFilter.vert b/shaders/framebuffer/bloomFilter.vert index 818a0d62af..df6b10c032 100644 --- a/shaders/framebuffer/bloomFilter.vert +++ b/shaders/framebuffer/bloomFilter.vert @@ -26,10 +26,10 @@ void main(void) { - const vec4 vertices[] = vec4[](vec4(-1.0, -1.0, 0.5, 1.0), - vec4( 1.0, -1.0, 0.5, 1.0), - vec4(-1.0, 1.0, 0.5, 1.0), - vec4( 1.0, 1.0, 0.5, 1.0)); + const vec4 vertices[] = vec4[](vec4(-1.0, -1.0, 1.0, 1.0), + vec4( 1.0, -1.0, 1.0, 1.0), + vec4(-1.0, 1.0, 1.0, 1.0), + vec4( 1.0, 1.0, 1.0, 1.0)); gl_Position = vertices[gl_VertexID]; } \ No newline at end of file diff --git a/shaders/framebuffer/bloomResolveFilter.frag b/shaders/framebuffer/bloomResolveFilter.frag index ddc3b73327..2b4a83f71b 100644 --- a/shaders/framebuffer/bloomResolveFilter.frag +++ b/shaders/framebuffer/bloomResolveFilter.frag @@ -26,18 +26,24 @@ layout (location = 0) out vec4 finalColor; +uniform int numberOfSamples; uniform float bloomOrigFactor; uniform float bloomNewFactor; -uniform sampler2D renderedImage; -uniform sampler2D bloomImage; +uniform sampler2DMS renderedImage; +uniform sampler2DMS bloomImage; void main(void) { vec4 color = vec4(0.0); - color += texelFetch(renderedImage, ivec2(gl_FragCoord.xy), 0) * bloomOrigFactor; - float alpha = color.a; - color += texelFetch(bloomImage, ivec2(gl_FragCoord.xy), 0) * bloomNewFactor; + vec4 renderedImageTmpColor = vec4(0.0); + vec4 bloomImageTmpColor = vec4(0.0); + for (int s = 0; s < numberOfSamples; ++s) { + renderedImageTmpColor += texelFetch(renderedImage, ivec2(gl_FragCoord), s); + bloomImageTmpColor += texelFetch(bloomImage, ivec2(gl_FragCoord), s); + } + renderedImageTmpColor /= numberOfSamples; + bloomImageTmpColor /= numberOfSamples; - finalColor = vec4(color.rgb, alpha); + finalColor = renderedImageTmpColor * bloomOrigFactor + bloomImageTmpColor * bloomNewFactor; } diff --git a/src/rendering/framebufferrenderer.cpp b/src/rendering/framebufferrenderer.cpp index f97703fb2e..5ff4f32713 100644 --- a/src/rendering/framebufferrenderer.cpp +++ b/src/rendering/framebufferrenderer.cpp @@ -143,16 +143,16 @@ void FramebufferRenderer::initialize() { glGetIntegerv(GL_FRAMEBUFFER_BINDING, &defaultFbo); // GBuffers - glGenTextures(1, &_gBuffers._mainColorTexture); - glGenTextures(1, &_gBuffers._mainDepthTexture); - glGenTextures(1, &_gBuffers._mainFilterTexture); - glGenTextures(1, &_gBuffers._mainPositionTexture); - glGenTextures(1, &_gBuffers._mainNormalTexture); - glGenFramebuffers(1, &_gBuffers._mainFramebuffer); + glGenTextures(1, &_gBuffers._colorTexture); + glGenTextures(1, &_gBuffers._depthTexture); + glGenTextures(1, &_gBuffers._filterTexture); + glGenTextures(1, &_gBuffers._positionTexture); + glGenTextures(1, &_gBuffers._normalTexture); + glGenFramebuffers(1, &_gBuffers._framebuffer); // PingPong Buffers // The first pingpong buffer shares the color texture with the renderbuffer: - _pingPongBuffers.colorTexture[0] = _gBuffers._mainColorTexture; + _pingPongBuffers.colorTexture[0] = _gBuffers._colorTexture; glGenTextures(1, &_pingPongBuffers.colorTexture[1]); glGenFramebuffers(1, &_pingPongBuffers.framebuffer); @@ -190,48 +190,49 @@ void FramebufferRenderer::initialize() { GL_LINEAR_MIPMAP_NEAREST ); + // Allocate Textures/Buffers Memory updateResolution(); + updateRendererData(); updateRaycastData(); //==============================// - //===== Building Buffers =====// + //===== GBuffers Buffers =====// //==============================// - - glBindFramebuffer(GL_FRAMEBUFFER, _gBuffers._mainFramebuffer); + glBindFramebuffer(GL_FRAMEBUFFER, _gBuffers._framebuffer); glFramebufferTexture2D( GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE, - _gBuffers._mainColorTexture, + _gBuffers._colorTexture, 0 ); glFramebufferTexture2D( GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D_MULTISAMPLE, - _gBuffers._mainPositionTexture, + _gBuffers._positionTexture, 0 ); glFramebufferTexture2D( GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT2, GL_TEXTURE_2D_MULTISAMPLE, - _gBuffers._mainNormalTexture, + _gBuffers._normalTexture, 0 ); glFramebufferTexture2D( GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT3, GL_TEXTURE_2D_MULTISAMPLE, - _gBuffers._mainFilterTexture, + _gBuffers._filterTexture, 0 ); glFramebufferTexture2D( GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D_MULTISAMPLE, - _gBuffers._mainDepthTexture, + _gBuffers._depthTexture, 0 ); @@ -240,6 +241,9 @@ void FramebufferRenderer::initialize() { LERROR("Main framebuffer is not complete"); } + //==============================// + //===== PingPong Buffers =====// + //==============================// glBindFramebuffer(GL_FRAMEBUFFER, _pingPongBuffers.framebuffer); glFramebufferTexture2D( GL_FRAMEBUFFER, @@ -259,7 +263,7 @@ void FramebufferRenderer::initialize() { GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D_MULTISAMPLE, - _gBuffers._mainDepthTexture, + _gBuffers._depthTexture, 0 ); @@ -268,6 +272,9 @@ void FramebufferRenderer::initialize() { LERROR("Ping pong buffer is not complete"); } + //======================================// + //===== Volume Rendering Buffers =====// + //======================================// // Builds Exit Framebuffer glBindFramebuffer(GL_FRAMEBUFFER, _exitFramebuffer); glFramebufferTexture2D( @@ -290,7 +297,9 @@ void FramebufferRenderer::initialize() { LERROR("Exit framebuffer is not complete"); } - // Builds HDR/Filtering Framebuffer + //===================================// + //===== HDR/Filtering Buffers =====// + //===================================// glBindFramebuffer(GL_FRAMEBUFFER, _hdrBuffers._hdrFilteringFramebuffer); glFramebufferTexture2D( GL_FRAMEBUFFER, @@ -305,7 +314,9 @@ void FramebufferRenderer::initialize() { LERROR("HDR/Filtering framebuffer is not complete"); } - // Buids Average Lum FBO + //========================================// + //===== Average Luminosity Buffers =====// + //========================================// glBindFramebuffer(GL_FRAMEBUFFER, _aLumBuffers._computeAveLumFBO); glFramebufferTexture2D( GL_FRAMEBUFFER, @@ -320,20 +331,28 @@ void FramebufferRenderer::initialize() { LERROR("Average Luminosity framebuffer is not complete"); } - // Builds Bloom Filter FBOs - //const GLenum buffers[] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1 }; - const GLenum buffers[] = { GL_COLOR_ATTACHMENT0 }; + //==============================// + //======= Bloom Buffers ======// + //==============================// for (int i = 0; i < 3; i++) { glBindFramebuffer(GL_FRAMEBUFFER, _bloomBuffers._bloomFilterFBO[i]); glFramebufferTexture2D( - GL_FRAMEBUFFER, - GL_COLOR_ATTACHMENT0, - GL_TEXTURE_2D, - _bloomBuffers._bloomTexture[i], + GL_FRAMEBUFFER, + GL_COLOR_ATTACHMENT0, + GL_TEXTURE_2D_MULTISAMPLE, + _bloomBuffers._bloomTexture[i], 0 ); - glDrawBuffers(1, buffers); + // Not written to, just to have an happy complete GL framebuffer + /*glFramebufferTexture2D( + GL_FRAMEBUFFER, + GL_DEPTH_ATTACHMENT, + GL_TEXTURE_2D_MULTISAMPLE, + _gBuffers._depthTexture, + 0 + );*/ + glDrawBuffers(1, ColorAttachment0Array); status = glCheckFramebufferStatus(GL_FRAMEBUFFER); if (status != GL_FRAMEBUFFER_COMPLETE) { @@ -341,7 +360,9 @@ void FramebufferRenderer::initialize() { } } - // Builds Histogram FBO + //=============================================// + //====== Histogram Equalization Buffers ======// + //=============================================// glBindFramebuffer(GL_FRAMEBUFFER, _histoBuffers._histoFramebuffer); glFramebufferTexture2D( GL_FRAMEBUFFER, @@ -356,7 +377,9 @@ void FramebufferRenderer::initialize() { LERROR("Histogram framebuffer is not complete"); } - // Buids TMO via mipmapping FBO + //======================================// + //====== MipMapping TMO Buffers ======// + //======================================// glBindFramebuffer(GL_FRAMEBUFFER, _mMappingTMOBuffers._tmoFramebuffer); glFramebufferTexture2D( GL_FRAMEBUFFER, @@ -372,17 +395,17 @@ void FramebufferRenderer::initialize() { } // JCC: Moved to here to avoid NVidia: "Program/shader state performance warning" - // Builds HDR and Filtering programs + // Building programs updateHDRAndFiltering(); updateAveLum(); updateBloomConfig(); updateHistogramConfig(); - // Builds deferred casters programs updateDeferredcastData(); updateTMOViaMipMappingConfig(); _dirtyMsaaSamplingPattern = true; + // Sets back to default FBO glBindFramebuffer(GL_FRAMEBUFFER, defaultFbo); _resolveProgram = ghoul::opengl::ProgramObject::Build( @@ -442,7 +465,7 @@ void FramebufferRenderer::initialize() { void FramebufferRenderer::deinitialize() { LINFO("Deinitializing FramebufferRenderer"); - glDeleteFramebuffers(1, &_gBuffers._mainFramebuffer); + glDeleteFramebuffers(1, &_gBuffers._framebuffer); glDeleteFramebuffers(1, &_exitFramebuffer); glDeleteFramebuffers(1, &_hdrBuffers._hdrFilteringFramebuffer); glDeleteFramebuffers(1, &_aLumBuffers._computeAveLumFBO); @@ -451,12 +474,12 @@ void FramebufferRenderer::deinitialize() { glDeleteFramebuffers(1, &_mMappingTMOBuffers._tmoFramebuffer); glDeleteFramebuffers(1, &_pingPongBuffers.framebuffer); - glDeleteTextures(1, &_gBuffers._mainColorTexture); - glDeleteTextures(1, &_gBuffers._mainDepthTexture); + glDeleteTextures(1, &_gBuffers._colorTexture); + glDeleteTextures(1, &_gBuffers._depthTexture); glDeleteTextures(1, &_hdrBuffers._hdrFilteringTexture); - glDeleteTextures(1, &_gBuffers._mainPositionTexture); - glDeleteTextures(1, &_gBuffers._mainNormalTexture); + glDeleteTextures(1, &_gBuffers._positionTexture); + glDeleteTextures(1, &_gBuffers._normalTexture); glDeleteTextures(1, &_aLumBuffers._computeAveLumTexture); glDeleteTextures(3, _bloomBuffers._bloomTexture); glDeleteTextures(1, &_histoBuffers._histoTexture); @@ -528,7 +551,7 @@ void FramebufferRenderer::resolveMSAA(float blackoutFactor) { ghoul::opengl::TextureUnit mainColorTextureUnit; mainColorTextureUnit.activate(); - glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _gBuffers._mainColorTexture); + glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _gBuffers._colorTexture); _resolveProgram->setUniform(_uniformCache.mainColorTexture, mainColorTextureUnit); _resolveProgram->setUniform(_uniformCache.blackoutFactor, blackoutFactor); _resolveProgram->setUniform(_uniformCache.nAaSamples, _nAaSamples); @@ -586,7 +609,10 @@ void FramebufferRenderer::applyTMO(float blackoutFactor) { hdrFeedingTextureUnit.activate(); if (_bloomEnabled) { // JCC: The next texture must be a MSAA texture - glBindTexture(GL_TEXTURE_2D, _bloomBuffers._bloomTexture[2]); + glBindTexture( + GL_TEXTURE_2D_MULTISAMPLE, + _bloomBuffers._bloomTexture[2] + ); } else { glBindTexture( @@ -695,8 +721,8 @@ void FramebufferRenderer::applyBloomFilter() { } glBindFramebuffer(GL_FRAMEBUFFER, _bloomBuffers._bloomFilterFBO[0]); - glDrawBuffers(1, ColorAttachment0Array); - glClear(GL_COLOR_BUFFER_BIT); + glDrawBuffer(GL_COLOR_ATTACHMENT0); + //glClear(GL_COLOR_BUFFER_BIT); glViewport(0, 0, _resolution.y, _resolution.x); glBindVertexArray(_bloomBuffers._bloomVAO); @@ -704,62 +730,56 @@ void FramebufferRenderer::applyBloomFilter() { // First blurring pass (vertical) { - ghoul::opengl::TextureUnit filterTextureUnit; - filterTextureUnit.activate(); - // The filter texture where the gaussian filter will be applied - glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _gBuffers._mainFilterTexture); + ghoul::opengl::TextureUnit msaaTextureUnit; + msaaTextureUnit.activate(); + // Incoming texture to apply the gaussian filter + glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _gBuffers._filterTexture); - _bloomProgram->setUniform("filterStep", 1); - _bloomProgram->setUniform("filterImage", filterTextureUnit); + _bloomProgram->setUniform("msaaTexture", msaaTextureUnit); _bloomProgram->setUniform("numberOfSamples", _nAaSamples); - - // Making OpenGL happy... - ghoul::opengl::TextureUnit dummyTextureUnit; - dummyTextureUnit.activate(); - glBindTexture(GL_TEXTURE_2D, _bloomBuffers._bloomTexture[2]); - _bloomProgram->setUniform("filterFirstPass", dummyTextureUnit); + _bloomProgram->setUniform("maxResX", _resolution.y); + _bloomProgram->setUniform("maxResY", _resolution.x); + glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); - glFlush(); + //glFlush(); } _bloomProgram->deactivate(); glBindFramebuffer(GL_FRAMEBUFFER, _bloomBuffers._bloomFilterFBO[1]); - glDrawBuffers(1, ColorAttachment0Array); + glDrawBuffer(GL_COLOR_ATTACHMENT0); glViewport(0, 0, _resolution.x, _resolution.y); - glClear(GL_COLOR_BUFFER_BIT); + //glClear(GL_COLOR_BUFFER_BIT); glBindVertexArray(_bloomBuffers._bloomVAO); _bloomProgram->activate(); // Second blurring pass (horizontal) { - ghoul::opengl::TextureUnit filterTextureUnit; - filterTextureUnit.activate(); + ghoul::opengl::TextureUnit msaaTextureUnit; + msaaTextureUnit.activate(); // The results of the previous pass is passed to this pass - glBindTexture(GL_TEXTURE_2D, _bloomBuffers._bloomTexture[0]); - _bloomProgram->setUniform("filterStep", 2); - _bloomProgram->setUniform("filterFirstPass", filterTextureUnit); + glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _bloomBuffers._bloomTexture[0]); + + _bloomProgram->setUniform("msaaTexture", msaaTextureUnit); _bloomProgram->setUniform("numberOfSamples", _nAaSamples); - // Making OpenGL happy... - ghoul::opengl::TextureUnit dummyTextureUnit; - dummyTextureUnit.activate(); - glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _gBuffers._mainFilterTexture); - _bloomProgram->setUniform("filterImage", dummyTextureUnit); - + _bloomProgram->setUniform("maxResX", _resolution.x); + _bloomProgram->setUniform("maxResY", _resolution.y); + glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); - glFlush(); + //glFlush(); } _bloomProgram->deactivate(); glBindFramebuffer(GL_FRAMEBUFFER, _bloomBuffers._bloomFilterFBO[2]); - glDrawBuffers(1, ColorAttachment0Array); + glDrawBuffer(GL_COLOR_ATTACHMENT0); glViewport(0, 0, _resolution.x, _resolution.y); - glClear(GL_COLOR_BUFFER_BIT); + // JCC: Do I need the next clear? + //glClear(GL_COLOR_BUFFER_BIT); _bloomResolveProgram->activate(); @@ -771,7 +791,10 @@ void FramebufferRenderer::applyBloomFilter() { ghoul::opengl::TextureUnit hdrFeedingTextureUnit; hdrFeedingTextureUnit.activate(); // Original buffer will be summed to the bloom result - glBindTexture(GL_TEXTURE_2D, _hdrBuffers._hdrFilteringTexture); + glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, + _pingPongBuffers.colorTexture[_pingPongIndex] + ); + _bloomResolveProgram->setUniform( _bloomUniformCache.renderedImage, hdrFeedingTextureUnit @@ -780,9 +803,11 @@ void FramebufferRenderer::applyBloomFilter() { ghoul::opengl::TextureUnit bloomTextureUnit; bloomTextureUnit.activate(); // Results of the second pass are added to the original buffer - glBindTexture(GL_TEXTURE_2D, _bloomBuffers._bloomTexture[1]); + glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _bloomBuffers._bloomTexture[1]); _bloomResolveProgram->setUniform(_bloomUniformCache.bloomImage, bloomTextureUnit); + _bloomResolveProgram->setUniform("numberOfSamples", _nAaSamples); + _bloomResolveProgram->setUniform( _bloomUniformCache.bloomOrigFactor, _bloomOrigFactor @@ -792,9 +817,9 @@ void FramebufferRenderer::applyBloomFilter() { _bloomNewFactor ); - // Write the results to the _bloomDilterFBO[2] texture + // Write the results to the _bloomDilterFBO[2] in _bloomTexture[2] texture glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); - glFlush(); + //glFlush(); } _bloomResolveProgram->deactivate(); @@ -1042,24 +1067,55 @@ void FramebufferRenderer::update() { } void FramebufferRenderer::updateResolution() { - glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _gBuffers._mainColorTexture); + glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _gBuffers._colorTexture); glTexImage2DMultisample( GL_TEXTURE_2D_MULTISAMPLE, _nAaSamples, GL_RGBA16F, _resolution.x, _resolution.y, - true + GL_TRUE ); - glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _gBuffers._mainFilterTexture); + glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _gBuffers._filterTexture); glTexImage2DMultisample( GL_TEXTURE_2D_MULTISAMPLE, _nAaSamples, GL_RGBA16F, _resolution.x, _resolution.y, - true + GL_TRUE + ); + + glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _gBuffers._positionTexture); + glTexImage2DMultisample( + GL_TEXTURE_2D_MULTISAMPLE, + _nAaSamples, + GL_RGBA32F, + _resolution.x, + _resolution.y, + GL_TRUE + ); + + glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _gBuffers._normalTexture); + + glTexImage2DMultisample( + GL_TEXTURE_2D_MULTISAMPLE, + _nAaSamples, + GL_RGBA32F, + _resolution.x, + _resolution.y, + GL_TRUE + ); + + glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _gBuffers._depthTexture); + glTexImage2DMultisample( + GL_TEXTURE_2D_MULTISAMPLE, + _nAaSamples, + GL_DEPTH_COMPONENT32F, + _resolution.x, + _resolution.y, + GL_TRUE ); glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _pingPongBuffers.colorTexture[1]); @@ -1069,7 +1125,7 @@ void FramebufferRenderer::updateResolution() { GL_RGBA16F, _resolution.x, _resolution.y, - true + GL_TRUE ); @@ -1109,23 +1165,16 @@ void FramebufferRenderer::updateResolution() { glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); // Bloom Filter - for (int i = 0; i < 3; i++) - { - glBindTexture(GL_TEXTURE_2D, _bloomBuffers._bloomTexture[i]); - glTexImage2D( - GL_TEXTURE_2D, - 0, + for (int i = 0; i < 3; i++) { + glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _bloomBuffers._bloomTexture[i]); + glTexImage2DMultisample( + GL_TEXTURE_2D_MULTISAMPLE, + _nAaSamples, GL_RGBA16F, i ? _resolution.x : _resolution.y, i ? _resolution.y : _resolution.x, - 0, - GL_RGBA, - GL_FLOAT, - nullptr + GL_TRUE ); - - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); } // Histogram Texture @@ -1151,7 +1200,7 @@ void FramebufferRenderer::updateResolution() { _histoPoints.clear(); _histoPoints.reserve(_resolution.x * _resolution.y); for (int i = 0; i < _resolution.x * _resolution.y; ++i) { - _histoPoints.push_back(i); + _histoPoints.push_back(static_cast(i)); } glBufferData( @@ -1183,38 +1232,7 @@ void FramebufferRenderer::updateResolution() { glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - // G-Buffer main position - glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _gBuffers._mainPositionTexture); - glTexImage2DMultisample( - GL_TEXTURE_2D_MULTISAMPLE, - _nAaSamples, - GL_RGBA32F, - _resolution.x, - _resolution.y, - true - ); - - glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _gBuffers._mainNormalTexture); - - glTexImage2DMultisample( - GL_TEXTURE_2D_MULTISAMPLE, - _nAaSamples, - GL_RGBA32F, - _resolution.x, - _resolution.y, - true - ); - - glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _gBuffers._mainDepthTexture); - glTexImage2DMultisample( - GL_TEXTURE_2D_MULTISAMPLE, - _nAaSamples, - GL_DEPTH_COMPONENT32F, - _resolution.x, - _resolution.y, - true - ); - + // Volume Rendering Textures glBindTexture(GL_TEXTURE_2D, _exitColorTexture); glTexImage2D( GL_TEXTURE_2D, @@ -1446,6 +1464,9 @@ void FramebufferRenderer::updateHDRAndFiltering() { } void FramebufferRenderer::updateMSAASamplingPattern() { + // JCC: All code below can be replaced by + // void GetMultisamplefv( enum pname, uint index, float *val ); + LDEBUG("Updating MSAA Sampling Pattern"); constexpr const int GridSize = 32; @@ -1789,7 +1810,7 @@ void FramebufferRenderer::render(Scene* scene, Camera* camera, float blackoutFac captureAndSetOpenGLDefaultState(); // deferred g-buffer plus filter - glBindFramebuffer(GL_FRAMEBUFFER, _gBuffers._mainFramebuffer); + glBindFramebuffer(GL_FRAMEBUFFER, _gBuffers._framebuffer); glDrawBuffers(4, ColorAttachment0123Array); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); @@ -1831,15 +1852,15 @@ void FramebufferRenderer::render(Scene* scene, Camera* camera, float blackoutFac - // If no Deferred Task are prensent, the resolve step + // If no Deferred Task are present, the resolve step // is executed in a separated step if (tasks.deferredcasterTasks.empty()) { resolveMSAA(blackoutFactor); } else { // We use ping pong rendering in order to be able to - // render multiple deferred tasks at same time (e.g. - // more than 1 ATM being seen at once) + // render to the same final buffer, multiple + // deferred tasks at same time (e.g. more than 1 ATM being seen at once) glBindFramebuffer(GL_FRAMEBUFFER, _pingPongBuffers.framebuffer); glDrawBuffers(1, &ColorAttachment01Array[_pingPongIndex]); // JCC: next commands should be in the cache.... @@ -1854,7 +1875,7 @@ void FramebufferRenderer::render(Scene* scene, Camera* camera, float blackoutFac "FramebufferRenderer::render::deferredTasks" ); } - performDeferredTasks(tasks.deferredcasterTasks, blackoutFactor); + performDeferredTasks(tasks.deferredcasterTasks); } // Disabling depth test for filtering and hdr @@ -1869,7 +1890,6 @@ void FramebufferRenderer::render(Scene* scene, Camera* camera, float blackoutFac ); } - // JCC: PRECISO AJUSTAR A ENTRADA DO BLOOM PARA A NOVA PING PONG. // Results of the DeferredTasks as entry for the bloom filter applyBloomFilter(); } @@ -1904,7 +1924,7 @@ void FramebufferRenderer::performRaycasterTasks(const std::vector exitProgram->deactivate(); } - glBindFramebuffer(GL_FRAMEBUFFER, _gBuffers._mainFramebuffer); + glBindFramebuffer(GL_FRAMEBUFFER, _gBuffers._framebuffer); glm::vec3 cameraPosition; bool isCameraInside = raycaster->isCameraInside( raycasterTask.renderData, @@ -1950,7 +1970,7 @@ void FramebufferRenderer::performRaycasterTasks(const std::vector ghoul::opengl::TextureUnit mainDepthTextureUnit; mainDepthTextureUnit.activate(); - glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _gBuffers._mainDepthTexture); + glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _gBuffers._depthTexture); raycastProgram->setUniform("mainDepthTexture", mainDepthTextureUnit); raycastProgram->setUniform("nAaSamples", _nAaSamples); @@ -1979,8 +1999,7 @@ void FramebufferRenderer::performRaycasterTasks(const std::vector } void FramebufferRenderer::performDeferredTasks( - const std::vector& tasks, - float blackoutFactor + const std::vector& tasks ) { for (const DeferredcasterTask& deferredcasterTask : tasks) { @@ -2006,7 +2025,7 @@ void FramebufferRenderer::performDeferredTasks( // adding G-Buffer ghoul::opengl::TextureUnit mainDColorTextureUnit; mainDColorTextureUnit.activate(); - //glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _gBuffers._mainColorTexture); + //glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _gBuffers._colorTexture); glBindTexture( GL_TEXTURE_2D_MULTISAMPLE, _pingPongBuffers.colorTexture[fromIndex] @@ -2018,7 +2037,7 @@ void FramebufferRenderer::performDeferredTasks( ghoul::opengl::TextureUnit mainPositionTextureUnit; mainPositionTextureUnit.activate(); - glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _gBuffers._mainPositionTexture); + glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _gBuffers._positionTexture); deferredcastProgram->setUniform( "mainPositionTexture", mainPositionTextureUnit @@ -2026,7 +2045,7 @@ void FramebufferRenderer::performDeferredTasks( ghoul::opengl::TextureUnit mainNormalTextureUnit; mainNormalTextureUnit.activate(); - glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _gBuffers._mainNormalTexture); + glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _gBuffers._normalTexture); deferredcastProgram->setUniform( "mainNormalTexture", mainNormalTextureUnit From e3775849a3dd30bf19f36f1eacbd5ac4cbae45df Mon Sep 17 00:00:00 2001 From: Jonathas Costa Date: Sat, 13 Jul 2019 16:21:20 -0400 Subject: [PATCH 16/39] Even faster bloom. --- shaders/framebuffer/bloomFilter.frag | 15 ++++++--------- src/rendering/framebufferrenderer.cpp | 6 ------ 2 files changed, 6 insertions(+), 15 deletions(-) diff --git a/shaders/framebuffer/bloomFilter.frag b/shaders/framebuffer/bloomFilter.frag index 7e3ed34d82..763e1fdf28 100644 --- a/shaders/framebuffer/bloomFilter.frag +++ b/shaders/framebuffer/bloomFilter.frag @@ -60,7 +60,7 @@ const float weights2[] = float[](0.0024499299678342, // Gaussian weights calculated by http://dev.theomader.com/gaussian-kernel-calculator/ // sigma = 4.4625, kernel size = 5 -const float weights[] = float[](0.190079, +const float weights3[] = float[](0.190079, 0.204885, 0.210072, 0.204885, @@ -68,7 +68,7 @@ const float weights[] = float[](0.190079, // Gaussian weights calculated by http://dev.theomader.com/gaussian-kernel-calculator/ // sigma = 8, kernel size = 45 -const float weights3[] = float[](0.001147, +const float weights[] = float[](0.001147, 0.001605, 0.002209, 0.002995, @@ -125,13 +125,10 @@ void main(void) { ivec2 texelCoord = P + ivec2(0, w); vec4 tmpColor = vec4(0.0); - if ((texelCoord.x >= 0 && texelCoord.y >= 0) && - (texelCoord.x < maxResX && texelCoord.y < maxResY)) { - for (int s = 0; s < numberOfSamples; ++s) { - tmpColor += texelFetch(msaaTexture, texelCoord, s); - } - tmpColor /= numberOfSamples; - } + for (int s = 0; s < numberOfSamples; ++s) { + tmpColor += texelFetch(msaaTexture, texelCoord, s); + } + tmpColor /= numberOfSamples; color += tmpColor * weights[w]; } diff --git a/src/rendering/framebufferrenderer.cpp b/src/rendering/framebufferrenderer.cpp index 5ff4f32713..d46463aeb8 100644 --- a/src/rendering/framebufferrenderer.cpp +++ b/src/rendering/framebufferrenderer.cpp @@ -738,9 +738,6 @@ void FramebufferRenderer::applyBloomFilter() { _bloomProgram->setUniform("msaaTexture", msaaTextureUnit); _bloomProgram->setUniform("numberOfSamples", _nAaSamples); - _bloomProgram->setUniform("maxResX", _resolution.y); - _bloomProgram->setUniform("maxResY", _resolution.x); - glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); //glFlush(); } @@ -765,9 +762,6 @@ void FramebufferRenderer::applyBloomFilter() { _bloomProgram->setUniform("msaaTexture", msaaTextureUnit); _bloomProgram->setUniform("numberOfSamples", _nAaSamples); - _bloomProgram->setUniform("maxResX", _resolution.x); - _bloomProgram->setUniform("maxResY", _resolution.y); - glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); //glFlush(); From 3c5f4afc3f7b25a28e96eb61525c7cfd8aa4aae6 Mon Sep 17 00:00:00 2001 From: Jonathas Costa Date: Sat, 13 Jul 2019 16:54:44 -0400 Subject: [PATCH 17/39] Super duper bloom. --- include/openspace/rendering/abufferrenderer.h | 2 + .../openspace/rendering/framebufferrenderer.h | 9 +++- include/openspace/rendering/renderengine.h | 1 + include/openspace/rendering/renderer.h | 1 + shaders/framebuffer/bloomFilter.frag | 41 ++++++++++++---- src/rendering/abufferrenderer.cpp | 8 +++ src/rendering/framebufferrenderer.cpp | 49 ++++++++++++++----- src/rendering/renderengine.cpp | 14 ++++++ 8 files changed, 102 insertions(+), 23 deletions(-) diff --git a/include/openspace/rendering/abufferrenderer.h b/include/openspace/rendering/abufferrenderer.h index f9f9eba844..aa99d10ad1 100644 --- a/include/openspace/rendering/abufferrenderer.h +++ b/include/openspace/rendering/abufferrenderer.h @@ -62,6 +62,7 @@ public: void setResolution(glm::ivec2 res) override; void setNAaSamples(int nAaSamples) override; + void setBlurrinessLevel(int level) override; void setHDRExposure(float hdrExposure) override; void setGamma(float gamma) override; void setMaxWhite(float maxWhite) override; @@ -147,6 +148,7 @@ private: GLuint _fragmentTexture; GLuint _vertexPositionBuffer; int _nAaSamples; + int _blurrinessLevel = 1; float _hdrExposure = 0.4f; float _hdrBackground = 2.8f; diff --git a/include/openspace/rendering/framebufferrenderer.h b/include/openspace/rendering/framebufferrenderer.h index ba63e178bb..0f3f5dfa49 100644 --- a/include/openspace/rendering/framebufferrenderer.h +++ b/include/openspace/rendering/framebufferrenderer.h @@ -156,6 +156,7 @@ public: void setResolution(glm::ivec2 res) override; void setNAaSamples(int nAaSamples) override; + void setBlurrinessLevel(int level) override; void setHDRExposure(float hdrExposure) override; void setGamma(float gamma) override; void setMaxWhite(float maxWhite) override; @@ -230,8 +231,11 @@ private: toneMapOperator, aveLum, maxWhite, Hue, Saturation, Value, Lightness, colorSpace, nAaSamples) _hdrUniformCache; - UniformCache(renderedImage, bloomImage, bloomOrigFactor, bloomNewFactor) - _bloomUniformCache; + UniformCache(renderedImage, bloomImage, bloomOrigFactor, bloomNewFactor, + numberOfSamples) _bloomUniformCache; + + UniformCache(numberOfSamples, msaaTexture, blurriness) + _bloomFilterUniformCache; UniformCache(renderedImage, maxWhite, imageWidth, imageHeight) _histoUniformCache; @@ -260,6 +264,7 @@ private: glm::ivec2 _resolution = glm::ivec2(0); int _nAaSamples; + int _blurrinessLevel = 1; float _hdrExposure = 1.68f; float _gamma = 0.86f; float _maxWhite = 1.0f; diff --git a/include/openspace/rendering/renderengine.h b/include/openspace/rendering/renderengine.h index 8dd8d41f33..df16d22986 100644 --- a/include/openspace/rendering/renderengine.h +++ b/include/openspace/rendering/renderengine.h @@ -243,6 +243,7 @@ private: properties::PropertyOwner _bloomOwner; properties::BoolProperty _enableBloom; properties::BoolProperty _automaticBloom; + properties::IntProperty _bloomBlurrinessLevel; properties::FloatProperty _bloomThreshouldMin; properties::FloatProperty _bloomThreshouldMax; properties::FloatProperty _bloomOrigColorFactor; diff --git a/include/openspace/rendering/renderer.h b/include/openspace/rendering/renderer.h index bc6eda6f5b..c304b7b0db 100644 --- a/include/openspace/rendering/renderer.h +++ b/include/openspace/rendering/renderer.h @@ -50,6 +50,7 @@ public: virtual void setResolution(glm::ivec2 res) = 0; virtual void setNAaSamples(int nAaSamples) = 0; + virtual void setBlurrinessLevel(int level) = 0; virtual void setHDRExposure(float hdrExposure) = 0; virtual void setGamma(float gamma) = 0; virtual void setMaxWhite(float maxWhite) = 0; diff --git a/shaders/framebuffer/bloomFilter.frag b/shaders/framebuffer/bloomFilter.frag index 763e1fdf28..094cadfe7b 100644 --- a/shaders/framebuffer/bloomFilter.frag +++ b/shaders/framebuffer/bloomFilter.frag @@ -27,8 +27,7 @@ layout (location = 0) out vec4 finalColor; uniform int numberOfSamples; -uniform int maxResX; -uniform int maxResY; +uniform int blurriness; uniform sampler2DMS msaaTexture; // Gaussian Weights from OpenGL SuperBible 7 ed. @@ -60,7 +59,7 @@ const float weights2[] = float[](0.0024499299678342, // Gaussian weights calculated by http://dev.theomader.com/gaussian-kernel-calculator/ // sigma = 4.4625, kernel size = 5 -const float weights3[] = float[](0.190079, +const float weights1[] = float[](0.190079, 0.204885, 0.210072, 0.204885, @@ -68,7 +67,7 @@ const float weights3[] = float[](0.190079, // Gaussian weights calculated by http://dev.theomader.com/gaussian-kernel-calculator/ // sigma = 8, kernel size = 45 -const float weights[] = float[](0.001147, +const float weights3[] = float[](0.001147, 0.001605, 0.002209, 0.002995, @@ -114,23 +113,47 @@ const float weights[] = float[](0.001147, 0.001605, 0.001147); -void main(void) +vec4 applyConvolution(const int version) { vec4 color = vec4(0.0); // Transpose the image so the filter can be applied on X and Y // P is the central position in the filter mask - ivec2 P = ivec2(gl_FragCoord.yx) - ivec2(0, weights.length() >> 1); - for (int w = 0; w < weights.length(); w++) + int weightsLength = 0; + + if (version == 1) { + weightsLength = weights1.length(); + } else if (version == 2) { + weightsLength = weights2.length(); + } else if (version == 3) { + weightsLength = weights3.length(); + } + + ivec2 P = ivec2(gl_FragCoord.yx) - ivec2(0, weightsLength >> 1); + + for (int w = 0; w < weightsLength; w++) { ivec2 texelCoord = P + ivec2(0, w); vec4 tmpColor = vec4(0.0); + for (int s = 0; s < numberOfSamples; ++s) { tmpColor += texelFetch(msaaTexture, texelCoord, s); } tmpColor /= numberOfSamples; - color += tmpColor * weights[w]; + + if (version == 1) { + color += tmpColor * weights1[w]; + } else if (version == 2) { + color += tmpColor * weights2[w]; + } else if (version == 3) { + color += tmpColor * weights3[w]; + } } - finalColor = color; + return color; +} + +void main(void) +{ + finalColor = applyConvolution(blurriness); } diff --git a/src/rendering/abufferrenderer.cpp b/src/rendering/abufferrenderer.cpp index bde3611414..e504658408 100644 --- a/src/rendering/abufferrenderer.cpp +++ b/src/rendering/abufferrenderer.cpp @@ -702,6 +702,14 @@ void ABufferRenderer::setNAaSamples(int nAaSamples) { _dirtyResolution = true; } +void ABufferRenderer::setBlurrinessLevel(int level) { + ghoul_assert( + level > 0 && nAaSamples < 4, + "Blurriness level has to be between 1 and 3" + ); + _blurrinessLevel = level; +} + void ABufferRenderer::setHDRExposure(float hdrExposure) { _hdrExposure = hdrExposure; if (_hdrExposure < 0.f) { diff --git a/src/rendering/framebufferrenderer.cpp b/src/rendering/framebufferrenderer.cpp index d46463aeb8..cb84663f53 100644 --- a/src/rendering/framebufferrenderer.cpp +++ b/src/rendering/framebufferrenderer.cpp @@ -61,8 +61,13 @@ namespace { "Lightness", "colorSpace", "nAaSamples" }; - constexpr const std::array BloomUniformNames = { - "renderedImage", "bloomImage", "bloomOrigFactor", "bloomNewFactor" + constexpr const std::array BloomUniformNames = { + "renderedImage", "bloomImage", "bloomOrigFactor", "bloomNewFactor", + "numberOfSamples" + }; + + constexpr const std::array BloomFilterUniformNames = { + "numberOfSamples", "msaaTexture", "blurriness" }; constexpr const std::array HistoUniformNames = { @@ -429,7 +434,12 @@ void FramebufferRenderer::initialize() { _bloomUniformCache, BloomUniformNames ); - + ghoul::opengl::updateUniformLocations( + *_bloomProgram, + _bloomFilterUniformCache, + BloomFilterUniformNames + ); + ghoul::opengl::updateUniformLocations( *_histoProgram, _histoUniformCache, @@ -735,8 +745,9 @@ void FramebufferRenderer::applyBloomFilter() { // Incoming texture to apply the gaussian filter glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _gBuffers._filterTexture); - _bloomProgram->setUniform("msaaTexture", msaaTextureUnit); - _bloomProgram->setUniform("numberOfSamples", _nAaSamples); + _bloomProgram->setUniform(_bloomFilterUniformCache.msaaTexture, msaaTextureUnit); + _bloomProgram->setUniform(_bloomFilterUniformCache.numberOfSamples, _nAaSamples); + _bloomProgram->setUniform(_bloomFilterUniformCache.blurriness, _blurrinessLevel); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); //glFlush(); @@ -759,8 +770,9 @@ void FramebufferRenderer::applyBloomFilter() { // The results of the previous pass is passed to this pass glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _bloomBuffers._bloomTexture[0]); - _bloomProgram->setUniform("msaaTexture", msaaTextureUnit); - _bloomProgram->setUniform("numberOfSamples", _nAaSamples); + _bloomProgram->setUniform(_bloomFilterUniformCache.msaaTexture, msaaTextureUnit); + _bloomProgram->setUniform(_bloomFilterUniformCache.numberOfSamples, _nAaSamples); + _bloomProgram->setUniform(_bloomFilterUniformCache.blurriness, _blurrinessLevel); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); @@ -800,7 +812,7 @@ void FramebufferRenderer::applyBloomFilter() { glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _bloomBuffers._bloomTexture[1]); _bloomResolveProgram->setUniform(_bloomUniformCache.bloomImage, bloomTextureUnit); - _bloomResolveProgram->setUniform("numberOfSamples", _nAaSamples); + _bloomResolveProgram->setUniform(_bloomUniformCache.numberOfSamples, _nAaSamples); _bloomResolveProgram->setUniform( _bloomUniformCache.bloomOrigFactor, @@ -959,10 +971,6 @@ void FramebufferRenderer::update() { _aveLumProgram->rebuildFromFile(); } - if (_bloomProgram->isDirty()) { - _bloomProgram->rebuildFromFile(); - } - if (_bloomResolveProgram->isDirty()) { _bloomResolveProgram->rebuildFromFile(); ghoul::opengl::updateUniformLocations( @@ -972,6 +980,15 @@ void FramebufferRenderer::update() { ); } + if (_bloomProgram->isDirty()) { + _bloomProgram->rebuildFromFile(); + ghoul::opengl::updateUniformLocations( + *_bloomProgram, + _bloomFilterUniformCache, + BloomFilterUniformNames + ); + } + if (_histoProgram->isDirty()) { _histoProgram->rebuildFromFile(); ghoul::opengl::updateUniformLocations( @@ -2103,6 +2120,14 @@ void FramebufferRenderer::setNAaSamples(int nAaSamples) { _dirtyMsaaSamplingPattern = true; } +void FramebufferRenderer::setBlurrinessLevel(int level) { + ghoul_assert( + level > 0 && nAaSamples < 4, + "Blurriness level has to be between 1 and 3" + ); + _blurrinessLevel = level; +} + void FramebufferRenderer::setHDRExposure(float hdrExposure) { ghoul_assert(hdrExposure > 0.f, "HDR exposure must be greater than zero"); _hdrExposure = hdrExposure; diff --git a/src/rendering/renderengine.cpp b/src/rendering/renderengine.cpp index 38cc738e4f..13e29acf30 100644 --- a/src/rendering/renderengine.cpp +++ b/src/rendering/renderengine.cpp @@ -271,6 +271,12 @@ namespace { "Enable/Disable Automatic Bloom." }; + constexpr openspace::properties::Property::PropertyInfo BlurrinessLevelBloomInfo = { + "BlurrinessLevelBloom", + "Increase/Decrease Bloom Blurriness Level", + "Increase/Decrease Bloom Blurriness Level." + }; + constexpr openspace::properties::Property::PropertyInfo HueInfo = { "Hue", "Hue", @@ -354,6 +360,7 @@ RenderEngine::RenderEngine() , _bloomOwner(BloomInfo) , _enableBloom(EnableBloomInfo, false) , _automaticBloom(AutomaticBloomInfo, false) + , _bloomBlurrinessLevel(BlurrinessLevelBloomInfo, 1, 1, 3) , _bloomThreshouldMin(BloomThreshouldMinInfo, 0.5, 0.0, 100.0) , _bloomThreshouldMax(BloomThreshouldMaxInfo, 1.0, 0.0, 100.0) , _bloomOrigColorFactor(BloomOrigColorFactorInfo, 1.0, 0.0, 100.0) @@ -543,6 +550,13 @@ RenderEngine::RenderEngine() }); addProperty(_automaticBloom); + _bloomBlurrinessLevel.onChange([this]() { + if (_renderer) { + _renderer->setBlurrinessLevel(_bloomBlurrinessLevel); + } + }); + addProperty(_bloomBlurrinessLevel); + addProperty(_bloomThreshouldMin); _bloomThreshouldMin.onChange([this]() { if (_renderer) { From 2e751d0c66ace2757417a1d6a4204adf3e82ed42 Mon Sep 17 00:00:00 2001 From: Jonathas Costa Date: Sun, 14 Jul 2019 18:01:49 -0400 Subject: [PATCH 18/39] Improved final image quality. Enabled automatic bloom. Fixed inverse HDR. --- data/assets/default.scene | 11 ++++---- .../openspace/rendering/framebufferrenderer.h | 14 +++++----- include/openspace/rendering/renderer.h | 1 + shaders/framebuffer/renderframebuffer.frag | 14 +++++----- src/rendering/framebufferrenderer.cpp | 26 +++++++++++++++---- src/rendering/renderengine.cpp | 6 ++--- 6 files changed, 47 insertions(+), 25 deletions(-) diff --git a/data/assets/default.scene b/data/assets/default.scene index 733300d350..5b5bc7e649 100644 --- a/data/assets/default.scene +++ b/data/assets/default.scene @@ -17,13 +17,14 @@ asset.onInitialize(function () openspace.globebrowsing.goToGeo(58.5877, 16.1924, 20000000) -- HDR / Image options: - openspace.setPropertyValueSingle('RenderEngine.Gamma', 0.86); - openspace.setPropertyValueSingle('RenderEngine.HDRExposure', 1.68); + openspace.setPropertyValueSingle('RenderEngine.Gamma', 0.95); + openspace.setPropertyValueSingle('RenderEngine.HDRExposure', 3.7); openspace.setPropertyValueSingle('RenderEngine.ToneMapOperator', 8); openspace.setPropertyValueSingle('RenderEngine.Lightness', 1.1); - openspace.setPropertyValueSingle('RenderEngine.Saturation', 1.45); - openspace.setPropertyValueSingle('RenderEngine.BloomNewColorFactor', 6.0); - --openspace.setPropertyValueSingle('RenderEngine.', ); + openspace.setPropertyValueSingle('RenderEngine.Saturation', 1.2); + openspace.setPropertyValueSingle('RenderEngine.BloomThreshouldMin', 0.15); + openspace.setPropertyValueSingle('RenderEngine.BloomThreshouldMax', 2.0); + openspace.setPropertyValueSingle('RenderEngine.BloomNewColorFactor', 4.7); end) diff --git a/include/openspace/rendering/framebufferrenderer.h b/include/openspace/rendering/framebufferrenderer.h index 0f3f5dfa49..09bbfcd512 100644 --- a/include/openspace/rendering/framebufferrenderer.h +++ b/include/openspace/rendering/framebufferrenderer.h @@ -175,6 +175,7 @@ public: void setColorSpace(unsigned int colorspace) override; void enableBloom(bool enable) override; + void enableAutomaticBloom(bool enable) override; void enableHistogram(bool enable) override; int nAaSamples() const override; @@ -265,22 +266,23 @@ private: glm::ivec2 _resolution = glm::ivec2(0); int _nAaSamples; int _blurrinessLevel = 1; - float _hdrExposure = 1.68f; - float _gamma = 0.86f; + float _hdrExposure = 3.7f; + float _gamma = 0.95f; float _maxWhite = 1.0f; bool _bloomEnabled = false; - float _bloomThresholdMin = 0.0; - float _bloomThresholdMax = 1.0; + bool _automaticBloomEnabled = false; + float _bloomThresholdMin = 0.5; + float _bloomThresholdMax = 8.1; float _bloomOrigFactor = 1.0; float _bloomNewFactor = 1.0; - int _toneMapOperator = 8; // JCC TODO: temporarilly set to 8 because setProperty seems not to be working for OptionProperty + int _toneMapOperator = 8; bool _histogramEnabled = false; int _numberOfBins = 1024; // JCC TODO: Add a parameter control for this. float _tmoKey = 0.18f; float _tmoYwhite = 1e6f; float _tmoSaturation = 1.0f; float _hue = 1.f; - float _saturation = 1.45f; + float _saturation = 1.2f; float _value = 1.f; float _lightness = 1.1f; unsigned int _colorSpace = 1; diff --git a/include/openspace/rendering/renderer.h b/include/openspace/rendering/renderer.h index c304b7b0db..1b45a7fcf4 100644 --- a/include/openspace/rendering/renderer.h +++ b/include/openspace/rendering/renderer.h @@ -69,6 +69,7 @@ public: virtual void setColorSpace(unsigned int colorspace) = 0; virtual void enableBloom(bool enable) = 0; + virtual void enableAutomaticBloom(bool enable) = 0; virtual void enableHistogram(bool enable) = 0; virtual int nAaSamples() const = 0; diff --git a/shaders/framebuffer/renderframebuffer.frag b/shaders/framebuffer/renderframebuffer.frag index 2da88e1da5..ce52803c72 100644 --- a/shaders/framebuffer/renderframebuffer.frag +++ b/shaders/framebuffer/renderframebuffer.frag @@ -25,22 +25,24 @@ #include "floatoperations.glsl" #include <#{fragmentPath}> +#define exposure #{rendererData.hdrExposure} +#define automaticBloom #{rendererData.automaticBloom} +#define bloom_thresh_min #{rendererData.bloom_thresh_min} +#define bloom_thresh_max #{rendererData.bloom_thresh_max} + layout(location = 0) out vec4 _out_color_; layout(location = 1) out vec4 gPosition; layout(location = 2) out vec4 gNormal; layout(location = 3) out vec4 filterBuffer; -uniform bool automaticBloom; -uniform float bloom_thresh_min; -uniform float bloom_thresh_max; - void main() { Fragment f = getFragment(); - _out_color_ = f.color; + _out_color_ = vec4((log2(vec3(1.0) - f.color.rgb)/(-exposure)), f.color.a); + //_out_color_ = f.color; gPosition = f.gPosition; gNormal = f.gNormal; - if (automaticBloom) { + if (automaticBloom == 1) { // Extract luminance float Y = dot(f.color.rgb, vec3(0.299, 0.587, 0.144)); diff --git a/src/rendering/framebufferrenderer.cpp b/src/rendering/framebufferrenderer.cpp index cb84663f53..f2060feb3c 100644 --- a/src/rendering/framebufferrenderer.cpp +++ b/src/rendering/framebufferrenderer.cpp @@ -1082,7 +1082,7 @@ void FramebufferRenderer::updateResolution() { glTexImage2DMultisample( GL_TEXTURE_2D_MULTISAMPLE, _nAaSamples, - GL_RGBA16F, + GL_RGBA32F, _resolution.x, _resolution.y, GL_TRUE @@ -1092,7 +1092,7 @@ void FramebufferRenderer::updateResolution() { glTexImage2DMultisample( GL_TEXTURE_2D_MULTISAMPLE, _nAaSamples, - GL_RGBA16F, + GL_RGBA32F, _resolution.x, _resolution.y, GL_TRUE @@ -1133,7 +1133,7 @@ void FramebufferRenderer::updateResolution() { glTexImage2DMultisample( GL_TEXTURE_2D_MULTISAMPLE, _nAaSamples, - GL_RGBA16F, + GL_RGBA32F, _resolution.x, _resolution.y, GL_TRUE @@ -1146,7 +1146,7 @@ void FramebufferRenderer::updateResolution() { glTexImage2D( GL_TEXTURE_2D, 0, - GL_RGBA16F, + GL_RGBA32F, _resolution.x, _resolution.y, 0, @@ -1181,7 +1181,7 @@ void FramebufferRenderer::updateResolution() { glTexImage2DMultisample( GL_TEXTURE_2D_MULTISAMPLE, _nAaSamples, - GL_RGBA16F, + GL_RGBA32F, i ? _resolution.x : _resolution.y, i ? _resolution.y : _resolution.x, GL_TRUE @@ -1196,6 +1196,7 @@ void FramebufferRenderer::updateResolution() { GL_RGBA32F, _numberOfBins, 1, + 0, GL_RGBA, GL_FLOAT, @@ -2131,6 +2132,7 @@ void FramebufferRenderer::setBlurrinessLevel(int level) { void FramebufferRenderer::setHDRExposure(float hdrExposure) { ghoul_assert(hdrExposure > 0.f, "HDR exposure must be greater than zero"); _hdrExposure = hdrExposure; + updateRendererData(); } void FramebufferRenderer::setGamma(float gamma) { @@ -2149,10 +2151,12 @@ void FramebufferRenderer::setToneMapOperator(int tmOp) { void FramebufferRenderer::setBloomThreMin(float minV) { _bloomThresholdMin = minV; + updateRendererData(); } void FramebufferRenderer::setBloomThreMax(float maxV) { _bloomThresholdMax = maxV; + updateRendererData(); } void FramebufferRenderer::setBloomOrigFactor(float origFactor) { @@ -2199,6 +2203,14 @@ void FramebufferRenderer::enableBloom(bool enable) { _bloomEnabled = enable; } +void FramebufferRenderer::enableAutomaticBloom(bool enable) { + _automaticBloomEnabled = enable; + if (_automaticBloomEnabled) { + _bloomEnabled = true; + } + updateRendererData(); +} + void FramebufferRenderer::enableHistogram(bool enable) { _histogramEnabled = enable; } @@ -2214,6 +2226,10 @@ const std::vector& FramebufferRenderer::mSSAPattern() const { void FramebufferRenderer::updateRendererData() { ghoul::Dictionary dict; dict.setValue("fragmentRendererPath", std::string(RenderFragmentShaderPath)); + dict.setValue("hdrExposure", std::to_string(_hdrExposure)); + dict.setValue("automaticBloom", std::to_string(_automaticBloomEnabled)); + dict.setValue("bloom_thresh_min", std::to_string(_bloomThresholdMin)); + dict.setValue("bloom_thresh_max", std::to_string(_bloomThresholdMax)); _rendererData = dict; global::renderEngine.setRendererData(dict); } diff --git a/src/rendering/renderengine.cpp b/src/rendering/renderengine.cpp index 13e29acf30..75c5b91ac0 100644 --- a/src/rendering/renderengine.cpp +++ b/src/rendering/renderengine.cpp @@ -543,9 +543,9 @@ RenderEngine::RenderEngine() addProperty(_enableBloom); _automaticBloom.onChange([this]() { - if (_renderer && _automaticBloom) { - _renderer->enableBloom(true); - _enableBloom = true; + if (_renderer) { + _renderer->enableAutomaticBloom(_automaticBloom); + _renderer->enableBloom(_automaticBloom); } }); addProperty(_automaticBloom); From cb36a25d5a8e51f37bea893b7a52108f0cbbb25e Mon Sep 17 00:00:00 2001 From: Jonathas Costa Date: Sun, 14 Jul 2019 18:32:00 -0400 Subject: [PATCH 19/39] Improve FB renderer pipeline. --- .../openspace/rendering/framebufferrenderer.h | 10 +-- shaders/framebuffer/hdrAndFiltering.frag | 2 +- src/rendering/framebufferrenderer.cpp | 73 +++++++++++-------- 3 files changed, 48 insertions(+), 37 deletions(-) diff --git a/include/openspace/rendering/framebufferrenderer.h b/include/openspace/rendering/framebufferrenderer.h index 09bbfcd512..e5bfea78d3 100644 --- a/include/openspace/rendering/framebufferrenderer.h +++ b/include/openspace/rendering/framebufferrenderer.h @@ -204,7 +204,7 @@ private: float computeBufferAveLuminance(); float computeBufferAveLuminanceGPU(); - void applyBloomFilter(); + void applyBloomFilter(bool noDeferredTaskExecuted); void computeImageHistogram(); void computeMipMappingFromHDRBuffer(GLuint oglImageBuffer); @@ -271,10 +271,10 @@ private: float _maxWhite = 1.0f; bool _bloomEnabled = false; bool _automaticBloomEnabled = false; - float _bloomThresholdMin = 0.5; - float _bloomThresholdMax = 8.1; - float _bloomOrigFactor = 1.0; - float _bloomNewFactor = 1.0; + float _bloomThresholdMin = 0.5f; + float _bloomThresholdMax = 8.1f; + float _bloomOrigFactor = 1.0f; + float _bloomNewFactor = 1.0f; int _toneMapOperator = 8; bool _histogramEnabled = false; int _numberOfBins = 1024; // JCC TODO: Add a parameter control for this. diff --git a/shaders/framebuffer/hdrAndFiltering.frag b/shaders/framebuffer/hdrAndFiltering.frag index 3996ea5e44..b05f4a31e9 100644 --- a/shaders/framebuffer/hdrAndFiltering.frag +++ b/shaders/framebuffer/hdrAndFiltering.frag @@ -94,7 +94,7 @@ vec4 adaptiveToneMap() { void main() { vec4 color = vec4(0.0); - //color = texture(hdrFeedingTexture, texCoord); + // Resolving... for (int i = 0; i < nAaSamples; i++) { color += texelFetch(hdrFeedingTexture, ivec2(gl_FragCoord), i); } diff --git a/src/rendering/framebufferrenderer.cpp b/src/rendering/framebufferrenderer.cpp index f2060feb3c..2dd31b76a1 100644 --- a/src/rendering/framebufferrenderer.cpp +++ b/src/rendering/framebufferrenderer.cpp @@ -598,12 +598,14 @@ void FramebufferRenderer::applyTMO(float blackoutFactor) { "FramebufferRenderer::render::TMO_Mipmapping" ); } - // JCC: Mudar aqui para que a entrada do TMO seja MSAA + if (_bloomEnabled) { + // JCC: Mudar aqui para que a entrada do TMO seja MSAA computeMipMappingFromHDRBuffer(_bloomBuffers._bloomTexture[2]); } else { - computeMipMappingFromHDRBuffer(_hdrBuffers._hdrFilteringTexture); + // JCC: Mudar aqui para que a entrada do TMO seja MSAA + computeMipMappingFromHDRBuffer(_pingPongBuffers.colorTexture[_pingPongIndex]); } } else { @@ -618,7 +620,7 @@ void FramebufferRenderer::applyTMO(float blackoutFactor) { ghoul::opengl::TextureUnit hdrFeedingTextureUnit; hdrFeedingTextureUnit.activate(); if (_bloomEnabled) { - // JCC: The next texture must be a MSAA texture + // The next texture must be a MSAA texture glBindTexture( GL_TEXTURE_2D_MULTISAMPLE, _bloomBuffers._bloomTexture[2] @@ -702,7 +704,21 @@ float FramebufferRenderer::computeBufferAveLuminanceGPU() { ghoul::opengl::TextureUnit hdrTextureUnit; hdrTextureUnit.activate(); - glBindTexture(GL_TEXTURE_2D, _hdrBuffers._hdrFilteringTexture); + + // JCC: Mudar aveLumProgram para trabalhar com MSAA + if (_bloomEnabled) { + glBindTexture( + GL_TEXTURE_2D_MULTISAMPLE, + _bloomBuffers._bloomTexture[2] + ); + } + else { + glBindTexture( + GL_TEXTURE_2D_MULTISAMPLE, + _pingPongBuffers.colorTexture[_pingPongIndex] + ); + } + _aveLumProgram->setUniform("hdrTexture", hdrTextureUnit); _aveLumProgram->setUniform("bufferWidth", _resolution.x); _aveLumProgram->setUniform("bufferHeight", _resolution.y); @@ -724,7 +740,7 @@ float FramebufferRenderer::computeBufferAveLuminanceGPU() { return static_cast(gpuAveLum[0]); } -void FramebufferRenderer::applyBloomFilter() { +void FramebufferRenderer::applyBloomFilter(bool noDeferredTaskExecuted) { if (!_bloomBuffers._bloomVAO) { glGenVertexArrays(1, &_bloomBuffers._bloomVAO); @@ -732,7 +748,6 @@ void FramebufferRenderer::applyBloomFilter() { glBindFramebuffer(GL_FRAMEBUFFER, _bloomBuffers._bloomFilterFBO[0]); glDrawBuffer(GL_COLOR_ATTACHMENT0); - //glClear(GL_COLOR_BUFFER_BIT); glViewport(0, 0, _resolution.y, _resolution.x); glBindVertexArray(_bloomBuffers._bloomVAO); @@ -750,7 +765,6 @@ void FramebufferRenderer::applyBloomFilter() { _bloomProgram->setUniform(_bloomFilterUniformCache.blurriness, _blurrinessLevel); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); - //glFlush(); } _bloomProgram->deactivate(); @@ -758,7 +772,6 @@ void FramebufferRenderer::applyBloomFilter() { glBindFramebuffer(GL_FRAMEBUFFER, _bloomBuffers._bloomFilterFBO[1]); glDrawBuffer(GL_COLOR_ATTACHMENT0); glViewport(0, 0, _resolution.x, _resolution.y); - //glClear(GL_COLOR_BUFFER_BIT); glBindVertexArray(_bloomBuffers._bloomVAO); _bloomProgram->activate(); @@ -784,9 +797,7 @@ void FramebufferRenderer::applyBloomFilter() { glBindFramebuffer(GL_FRAMEBUFFER, _bloomBuffers._bloomFilterFBO[2]); glDrawBuffer(GL_COLOR_ATTACHMENT0); glViewport(0, 0, _resolution.x, _resolution.y); - // JCC: Do I need the next clear? - //glClear(GL_COLOR_BUFFER_BIT); - + _bloomResolveProgram->activate(); // Adding the result of the blurring processes to the @@ -794,12 +805,21 @@ void FramebufferRenderer::applyBloomFilter() { // the _bloomBuffers._bloomTexture[2] texture (JCC: That can be // done by blending operation (ONE)) { + // Original buffer will be summed to the bloom result ghoul::opengl::TextureUnit hdrFeedingTextureUnit; hdrFeedingTextureUnit.activate(); - // Original buffer will be summed to the bloom result - glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, - _pingPongBuffers.colorTexture[_pingPongIndex] - ); + + if (noDeferredTaskExecuted) { + glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, + _pingPongBuffers.colorTexture[0] + ); + } + else { + glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, + _pingPongBuffers.colorTexture[_pingPongIndex] + ); + } + _bloomResolveProgram->setUniform( _bloomUniformCache.renderedImage, @@ -825,7 +845,6 @@ void FramebufferRenderer::applyBloomFilter() { // Write the results to the _bloomDilterFBO[2] in _bloomTexture[2] texture glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); - //glFlush(); } _bloomResolveProgram->deactivate(); @@ -1857,19 +1876,9 @@ void FramebufferRenderer::render(Scene* scene, Camera* camera, float blackoutFac performRaycasterTasks(tasks.raycasterTasks); } - //// Binds the final Framebuffer which will contain the results of the TMOs - //glBindFramebuffer(GL_FRAMEBUFFER, _hdrBuffers._hdrFilteringFramebuffer); - //glDrawBuffers(1, ColorAttachment0Array); - //glClear(GL_COLOR_BUFFER_BIT); - - - // If no Deferred Task are present, the resolve step // is executed in a separated step - if (tasks.deferredcasterTasks.empty()) { - resolveMSAA(blackoutFactor); - } - else { + if (!tasks.deferredcasterTasks.empty()) { // We use ping pong rendering in order to be able to // render to the same final buffer, multiple // deferred tasks at same time (e.g. more than 1 ATM being seen at once) @@ -1893,7 +1902,6 @@ void FramebufferRenderer::render(Scene* scene, Camera* camera, float blackoutFac // Disabling depth test for filtering and hdr glDisable(GL_DEPTH_TEST); - // JCC: Change bloom to work in a MSAA environment if (_bloomEnabled) { std::unique_ptr perfInternal; if (doPerformanceMeasurements) { @@ -1902,15 +1910,18 @@ void FramebufferRenderer::render(Scene* scene, Camera* camera, float blackoutFac ); } - // Results of the DeferredTasks as entry for the bloom filter - applyBloomFilter(); + // Results of the DeferredTasks as entry for the bloom filter + applyBloomFilter( + !tasks.deferredcasterTasks.empty() ? true : false + ); } // When applying the TMO, the result is saved to the default FBO to be displayed // by the Operating System. Also, the resolve procedure is executed in this step. glBindFramebuffer(GL_FRAMEBUFFER, _osDefaultGLState.defaultFBO); glViewport(0, 0, _resolution.x, _resolution.y); - // Apply the selected TMO on the results + + // Apply the selected TMO on the results and resolve the result for the default FBO applyTMO(blackoutFactor); From 0f09c36aa2f7f649e1bb95a2a792a500cdbe0a91 Mon Sep 17 00:00:00 2001 From: Jonathas Costa Date: Mon, 15 Jul 2019 10:31:08 -0400 Subject: [PATCH 20/39] Bring back changes for transparency and added new error protection for big components. --- data/assets/scene/solarsystem/sun/glare.asset | 4 +- .../openspace/rendering/framebufferrenderer.h | 5 +++ include/openspace/rendering/renderable.h | 1 + modules/base/rendering/renderableplane.cpp | 8 +++- modules/base/rendering/renderableplane.h | 4 +- .../rendering/renderableplaneimagelocal.cpp | 2 + modules/base/rendering/renderabletrail.cpp | 6 ++- .../base/rendering/renderabletrailorbit.cpp | 6 +-- shaders/framebuffer/renderframebuffer.frag | 4 +- src/rendering/framebufferrenderer.cpp | 37 ++++++++++++++----- src/rendering/renderable.cpp | 9 +++++ 11 files changed, 66 insertions(+), 20 deletions(-) diff --git a/data/assets/scene/solarsystem/sun/glare.asset b/data/assets/scene/solarsystem/sun/glare.asset index 61b8da7423..e61537b1d2 100644 --- a/data/assets/scene/solarsystem/sun/glare.asset +++ b/data/assets/scene/solarsystem/sun/glare.asset @@ -13,10 +13,10 @@ local SunGlare = { Size = 1.3*10^10.5, Origin = "Center", Billboard = true, - Texture = textures .. "/halo.png", + Texture = textures .. "/test6.png", BlendMode = "Additive", Opacity = 0.65, - RenderableType = "Transparent" + RenderableType = "Transparency" }, Transform = { Translation = { diff --git a/include/openspace/rendering/framebufferrenderer.h b/include/openspace/rendering/framebufferrenderer.h index e5bfea78d3..1a38bdbbed 100644 --- a/include/openspace/rendering/framebufferrenderer.h +++ b/include/openspace/rendering/framebufferrenderer.h @@ -73,6 +73,11 @@ private: GL_COLOR_ATTACHMENT1 }; + inline static const GLenum ColorAttachment03Array[2] = { + GL_COLOR_ATTACHMENT0, + GL_COLOR_ATTACHMENT3 + }; + inline static const GLenum ColorAttachment012Array[3] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, diff --git a/include/openspace/rendering/renderable.h b/include/openspace/rendering/renderable.h index 30b820a24c..0e6f0896ee 100644 --- a/include/openspace/rendering/renderable.h +++ b/include/openspace/rendering/renderable.h @@ -96,6 +96,7 @@ protected: properties::FloatProperty _opacity; properties::StringProperty _renderableType; + void setRenderBinFromOpacity(); void registerUpdateRenderBinFromOpacity(); private: diff --git a/modules/base/rendering/renderableplane.cpp b/modules/base/rendering/renderableplane.cpp index 277c9ccd0a..922e040a7f 100644 --- a/modules/base/rendering/renderableplane.cpp +++ b/modules/base/rendering/renderableplane.cpp @@ -127,7 +127,7 @@ RenderablePlane::RenderablePlane(const ghoul::Dictionary& dictionary) _blendMode.onChange([&]() { switch (_blendMode) { case BlendModeNormal: - setRenderBin(Renderable::RenderBin::Opaque); + setRenderBinFromOpacity(); break; case BlendModeAdditive: setRenderBin(Renderable::RenderBin::Transparent); @@ -137,6 +137,12 @@ RenderablePlane::RenderablePlane(const ghoul::Dictionary& dictionary) } }); + _opacity.onChange([&]() { + if (_blendMode == BlendModeNormal) { + setRenderBinFromOpacity(); + } + }); + if (dictionary.hasKey(BlendModeInfo.identifier)) { const std::string v = dictionary.value(BlendModeInfo.identifier); if (v == "Normal") { diff --git a/modules/base/rendering/renderableplane.h b/modules/base/rendering/renderableplane.h index 184d3f637a..a8be7ebe90 100644 --- a/modules/base/rendering/renderableplane.h +++ b/modules/base/rendering/renderableplane.h @@ -67,12 +67,14 @@ protected: virtual void bindTexture(); virtual void unbindTexture(); +protected: + properties::OptionProperty _blendMode; + private: void createPlane(); properties::BoolProperty _billboard; properties::FloatProperty _size; - properties::OptionProperty _blendMode; ghoul::opengl::ProgramObject* _shader = nullptr; diff --git a/modules/base/rendering/renderableplaneimagelocal.cpp b/modules/base/rendering/renderableplaneimagelocal.cpp index 170282cf89..a7ea7baf1d 100644 --- a/modules/base/rendering/renderableplaneimagelocal.cpp +++ b/modules/base/rendering/renderableplaneimagelocal.cpp @@ -85,6 +85,8 @@ RenderablePlaneImageLocal::RenderablePlaneImageLocal(const ghoul::Dictionary& di "RenderablePlaneImageLocal" ); + addProperty(_blendMode); + _texturePath = absPath(dictionary.value(TextureInfo.identifier)); _textureFile = std::make_unique(_texturePath); diff --git a/modules/base/rendering/renderabletrail.cpp b/modules/base/rendering/renderabletrail.cpp index 2fff2bc6a9..aa834b544e 100644 --- a/modules/base/rendering/renderabletrail.cpp +++ b/modules/base/rendering/renderabletrail.cpp @@ -178,8 +178,10 @@ RenderableTrail::RenderableTrail(const ghoul::Dictionary& dictionary) properties::OptionProperty::DisplayType::Dropdown ) { + + setRenderBin(RenderBin::Overlay); addProperty(_opacity); - registerUpdateRenderBinFromOpacity(); + //registerUpdateRenderBinFromOpacity(); _translation = Translation::createFromDictionary( dictionary.value(KeyTranslation) @@ -289,7 +291,7 @@ void RenderableTrail::render(const RenderData& data, RendererTasks&) { if (usingFramebufferRenderer) { glDepthMask(false); - //glBlendFunc(GL_SRC_ALPHA, GL_ONE); + glBlendFunc(GL_SRC_ALPHA, GL_ONE); } const bool renderLines = (_renderingModes == RenderingModeLines) | diff --git a/modules/base/rendering/renderabletrailorbit.cpp b/modules/base/rendering/renderabletrailorbit.cpp index e00156ec72..b4ad1da19e 100644 --- a/modules/base/rendering/renderabletrailorbit.cpp +++ b/modules/base/rendering/renderabletrailorbit.cpp @@ -100,8 +100,8 @@ namespace { constexpr openspace::properties::Property::PropertyInfo RenderableTypeInfo = { "RenderableType", "RenderableType", - "This value specifies if the plane should be rendered in the Background," - "Opaque, Transparent, or Overlay rendering step." + "This value specifies if the orbit should be rendered in the Background," + "Opaque, Transparent, or Overlay rendering step. Default is Transparent." }; } // namespace @@ -192,7 +192,7 @@ RenderableTrailOrbit::RenderableTrailOrbit(const ghoul::Dictionary& dictionary) } } else { - setRenderBin(Renderable::RenderBin::Opaque); + setRenderBin(Renderable::RenderBin::Overlay); } } diff --git a/shaders/framebuffer/renderframebuffer.frag b/shaders/framebuffer/renderframebuffer.frag index ce52803c72..a152004a86 100644 --- a/shaders/framebuffer/renderframebuffer.frag +++ b/shaders/framebuffer/renderframebuffer.frag @@ -30,6 +30,8 @@ #define bloom_thresh_min #{rendererData.bloom_thresh_min} #define bloom_thresh_max #{rendererData.bloom_thresh_max} +#define deltaError 0.00001 + layout(location = 0) out vec4 _out_color_; layout(location = 1) out vec4 gPosition; layout(location = 2) out vec4 gNormal; @@ -37,7 +39,7 @@ layout(location = 3) out vec4 filterBuffer; void main() { Fragment f = getFragment(); - _out_color_ = vec4((log2(vec3(1.0) - f.color.rgb)/(-exposure)), f.color.a); + _out_color_ = vec4((log2(vec3(1.0) - (f.color.rgb - vec3(deltaError)))/(-exposure)), f.color.a); //_out_color_ = f.color; gPosition = f.gPosition; gNormal = f.gNormal; diff --git a/src/rendering/framebufferrenderer.cpp b/src/rendering/framebufferrenderer.cpp index 2dd31b76a1..a70a0030de 100644 --- a/src/rendering/framebufferrenderer.cpp +++ b/src/rendering/framebufferrenderer.cpp @@ -34,7 +34,6 @@ #include #include #include -#include #include #include #include @@ -264,6 +263,13 @@ void FramebufferRenderer::initialize() { _pingPongBuffers.colorTexture[1], 0 ); + glFramebufferTexture2D( + GL_FRAMEBUFFER, + GL_COLOR_ATTACHMENT3, + GL_TEXTURE_2D_MULTISAMPLE, + _gBuffers._filterTexture, + 0 + ); glFramebufferTexture2D( GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, @@ -530,6 +536,16 @@ void FramebufferRenderer::captureAndSetOpenGLDefaultState() { glDisablei(GL_BLEND, 2); glDisablei(GL_BLEND, 3); + glClampColor(GL_CLAMP_READ_COLOR, GL_FALSE); + + // JCC: From OpenGL Registry + // Note that the FrontFace and ClampColor commands in section 12.2 are not + // deprecated, as they still affect other non - deprecated functionality; however, + // the ClampColor targets CLAMP_VERTEX_COLOR and CLAMP_FRAGMENT_ - + // COLOR are deprecated. + //glClampColor(GL_CLAMP_VERTEX_COLOR, GL_FALSE); + //glClampColor(GL_CLAMP_FRAGMENT_COLOR, GL_FALSE); + _osDefaultGLState.blendEnabled = true; _osDefaultGLState.blend0Enabled = true; _osDefaultGLState.blend1Enabled = false; @@ -1860,10 +1876,11 @@ void FramebufferRenderer::render(Scene* scene, Camera* camera, float blackoutFac scene->render(data, tasks); data.renderBinMask = static_cast(Renderable::RenderBin::Opaque); scene->render(data, tasks); + + glDrawBuffers(2, ColorAttachment03Array); + data.renderBinMask = static_cast(Renderable::RenderBin::Transparent); scene->render(data, tasks); - data.renderBinMask = static_cast(Renderable::RenderBin::Overlay); - scene->render(data, tasks); // Run Volume Tasks { @@ -1876,19 +1893,12 @@ void FramebufferRenderer::render(Scene* scene, Camera* camera, float blackoutFac performRaycasterTasks(tasks.raycasterTasks); } - // If no Deferred Task are present, the resolve step - // is executed in a separated step if (!tasks.deferredcasterTasks.empty()) { // We use ping pong rendering in order to be able to // render to the same final buffer, multiple // deferred tasks at same time (e.g. more than 1 ATM being seen at once) glBindFramebuffer(GL_FRAMEBUFFER, _pingPongBuffers.framebuffer); glDrawBuffers(1, &ColorAttachment01Array[_pingPongIndex]); - // JCC: next commands should be in the cache.... - glEnablei(GL_BLEND, 0); - glDisablei(GL_BLEND, 1); - glDisablei(GL_BLEND, 2); - glDisablei(GL_BLEND, 3); std::unique_ptr perfInternal; if (doPerformanceMeasurements) { @@ -1899,6 +1909,13 @@ void FramebufferRenderer::render(Scene* scene, Camera* camera, float blackoutFac performDeferredTasks(tasks.deferredcasterTasks); } + glDrawBuffers(4, ColorAttachment0123Array); + + data.renderBinMask = static_cast(Renderable::RenderBin::Overlay); + scene->render(data, tasks); + + glDrawBuffer(GL_COLOR_ATTACHMENT0); + // Disabling depth test for filtering and hdr glDisable(GL_DEPTH_TEST); diff --git a/src/rendering/renderable.cpp b/src/rendering/renderable.cpp index efd779f686..ac019c4aca 100644 --- a/src/rendering/renderable.cpp +++ b/src/rendering/renderable.cpp @@ -211,6 +211,15 @@ void Renderable::onEnabledChange(std::function callback) { }); } +void Renderable::setRenderBinFromOpacity() { + if (_opacity > 0.f && _opacity < 1.f) { + setRenderBin(Renderable::RenderBin::Transparent); + } + else { + setRenderBin(Renderable::RenderBin::Opaque); + } +} + void Renderable::registerUpdateRenderBinFromOpacity() { _opacity.onChange([this](){ if (_opacity > 0.f && _opacity < 1.f) { From dc1ab017c6efbb9dc628e7cb209c66acf8fd3e9e Mon Sep 17 00:00:00 2001 From: Jonathas Costa Date: Wed, 17 Jul 2019 18:28:06 -0400 Subject: [PATCH 21/39] Adding back in the right buffer. --- shaders/framebuffer/renderframebuffer.frag | 16 ++++++++-------- src/rendering/framebufferrenderer.cpp | 3 --- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/shaders/framebuffer/renderframebuffer.frag b/shaders/framebuffer/renderframebuffer.frag index a152004a86..d62ccd71ab 100644 --- a/shaders/framebuffer/renderframebuffer.frag +++ b/shaders/framebuffer/renderframebuffer.frag @@ -30,7 +30,7 @@ #define bloom_thresh_min #{rendererData.bloom_thresh_min} #define bloom_thresh_max #{rendererData.bloom_thresh_max} -#define deltaError 0.00001 +#define deltaError 0.013 layout(location = 0) out vec4 _out_color_; layout(location = 1) out vec4 gPosition; @@ -38,18 +38,18 @@ layout(location = 2) out vec4 gNormal; layout(location = 3) out vec4 filterBuffer; void main() { - Fragment f = getFragment(); - _out_color_ = vec4((log2(vec3(1.0) - (f.color.rgb - vec3(deltaError)))/(-exposure)), f.color.a); - //_out_color_ = f.color; - gPosition = f.gPosition; - gNormal = f.gNormal; + Fragment f = getFragment(); + vec4 tmpOutColor = vec4((log2(vec3(1.0) - (f.color.rgb - vec3(deltaError)))/(-exposure)), f.color.a); + //_out_color_ = f.color; + gPosition = f.gPosition; + gNormal = f.gNormal; if (automaticBloom == 1) { // Extract luminance float Y = dot(f.color.rgb, vec3(0.299, 0.587, 0.144)); // Apply Bloom on the bloom threshold range values - vec3 bColor = f.color.rgb * 4.0 * smoothstep(bloom_thresh_min, bloom_thresh_max, Y); + vec3 bColor = tmpOutColor.rgb * smoothstep(bloom_thresh_min, bloom_thresh_max, Y); filterBuffer = vec4(bColor, f.color.a); } else { @@ -58,6 +58,6 @@ void main() { else filterBuffer = vec4(0); } - + _out_color_ = tmpOutColor; gl_FragDepth = normalizeFloat(f.depth); } diff --git a/src/rendering/framebufferrenderer.cpp b/src/rendering/framebufferrenderer.cpp index a70a0030de..bc8aa7da41 100644 --- a/src/rendering/framebufferrenderer.cpp +++ b/src/rendering/framebufferrenderer.cpp @@ -1876,9 +1876,6 @@ void FramebufferRenderer::render(Scene* scene, Camera* camera, float blackoutFac scene->render(data, tasks); data.renderBinMask = static_cast(Renderable::RenderBin::Opaque); scene->render(data, tasks); - - glDrawBuffers(2, ColorAttachment03Array); - data.renderBinMask = static_cast(Renderable::RenderBin::Transparent); scene->render(data, tasks); From df6c90b1ee9a55994255c68919950964f52b3973 Mon Sep 17 00:00:00 2001 From: Jonathas Costa Date: Mon, 22 Jul 2019 10:25:44 -0400 Subject: [PATCH 22/39] Separated filters and cache from HDR. --- data/assets/default.scene | 4 - .../openspace/rendering/framebufferrenderer.h | 80 +- include/openspace/rendering/renderengine.h | 31 - include/openspace/rendering/renderer.h | 9 - shaders/framebuffer/bloomFilter.frag | 159 --- shaders/framebuffer/bloomFilter.vert | 35 - shaders/framebuffer/bloomResolveFilter.frag | 49 - shaders/framebuffer/bloomResolveFilter.vert | 35 - shaders/framebuffer/computeAveLum.frag | 51 - shaders/framebuffer/computeAveLum.vert | 31 - shaders/framebuffer/computeHistogram_fs.glsl | 35 - shaders/framebuffer/computeHistogram_vs.glsl | 63 -- shaders/framebuffer/computeTMO_fs.glsl | 85 -- shaders/framebuffer/computeTMO_vs.glsl | 33 - shaders/framebuffer/renderframebuffer.frag | 30 +- src/rendering/framebufferrenderer.cpp | 929 +----------------- src/rendering/renderengine.cpp | 117 --- 17 files changed, 55 insertions(+), 1721 deletions(-) delete mode 100644 shaders/framebuffer/bloomFilter.frag delete mode 100644 shaders/framebuffer/bloomFilter.vert delete mode 100644 shaders/framebuffer/bloomResolveFilter.frag delete mode 100644 shaders/framebuffer/bloomResolveFilter.vert delete mode 100644 shaders/framebuffer/computeAveLum.frag delete mode 100644 shaders/framebuffer/computeAveLum.vert delete mode 100644 shaders/framebuffer/computeHistogram_fs.glsl delete mode 100644 shaders/framebuffer/computeHistogram_vs.glsl delete mode 100644 shaders/framebuffer/computeTMO_fs.glsl delete mode 100644 shaders/framebuffer/computeTMO_vs.glsl diff --git a/data/assets/default.scene b/data/assets/default.scene index 5b5bc7e649..e1cdab4343 100644 --- a/data/assets/default.scene +++ b/data/assets/default.scene @@ -22,10 +22,6 @@ asset.onInitialize(function () openspace.setPropertyValueSingle('RenderEngine.ToneMapOperator', 8); openspace.setPropertyValueSingle('RenderEngine.Lightness', 1.1); openspace.setPropertyValueSingle('RenderEngine.Saturation', 1.2); - openspace.setPropertyValueSingle('RenderEngine.BloomThreshouldMin', 0.15); - openspace.setPropertyValueSingle('RenderEngine.BloomThreshouldMax', 2.0); - openspace.setPropertyValueSingle('RenderEngine.BloomNewColorFactor', 4.7); - end) asset.onDeinitialize(function () diff --git a/include/openspace/rendering/framebufferrenderer.h b/include/openspace/rendering/framebufferrenderer.h index 1a38bdbbed..f66adc94e6 100644 --- a/include/openspace/rendering/framebufferrenderer.h +++ b/include/openspace/rendering/framebufferrenderer.h @@ -93,7 +93,6 @@ private: typedef struct { GLuint _colorTexture; - GLuint _filterTexture; GLuint _positionTexture; GLuint _normalTexture; GLuint _depthTexture; @@ -105,35 +104,11 @@ private: GLuint colorTexture[2]; } PingPongBuffers; - typedef struct { - GLuint _histoVao; - GLuint _histoVbo; - GLuint _histoTexture; - GLuint _histoFramebuffer; - } HistoBuffers; - - typedef struct { - GLuint _bloomVAO = 0u; - GLuint _bloomFilterFBO[3]; - GLuint _bloomTexture[3]; - } BloomBuffers; - typedef struct { GLuint _hdrFilteringFramebuffer; GLuint _hdrFilteringTexture; } HDRBuffers; - typedef struct { - GLuint _computeAveLumFBO; - GLuint _computeAveLumTexture; - } AverageLumBuffers; - - typedef struct { - GLuint _tmoTexture; - GLuint _tmoFramebuffer; - GLuint _tmoHdrSampler; - } MipMappingTMOBuffers; - public: typedef std::map< VolumeRaycaster*, @@ -153,23 +128,14 @@ public: void updateRaycastData(); void updateDeferredcastData(); void updateHDRAndFiltering(); - void updateAveLum(); - void updateBloomConfig(); - void updateHistogramConfig(); - void updateTMOViaMipMappingConfig(); void updateMSAASamplingPattern(); void setResolution(glm::ivec2 res) override; void setNAaSamples(int nAaSamples) override; - void setBlurrinessLevel(int level) override; void setHDRExposure(float hdrExposure) override; void setGamma(float gamma) override; void setMaxWhite(float maxWhite) override; void setToneMapOperator(int tmOp) override; - void setBloomThreMin(float minV) override; - void setBloomThreMax(float maxV) override; - void setBloomOrigFactor(float origFactor) override; - void setBloomNewFactor(float newFactor) override; void setKey(float key) override; void setYwhite(float white) override; void setTmoSaturation(float sat) override; @@ -179,10 +145,6 @@ public: void setLightness(float lightness) override; void setColorSpace(unsigned int colorspace) override; - void enableBloom(bool enable) override; - void enableAutomaticBloom(bool enable) override; - void enableHistogram(bool enable) override; - int nAaSamples() const override; const std::vector& mSSAPattern() const override; @@ -203,16 +165,9 @@ public: DeferredcasterListener::IsAttached isAttached) override; private: - void captureAndSetOpenGLDefaultState(); void resolveMSAA(float blackoutFactor); void applyTMO(float blackoutFactor); - float computeBufferAveLuminance(); - float computeBufferAveLuminanceGPU(); - void applyBloomFilter(bool noDeferredTaskExecuted); - void computeImageHistogram(); - void computeMipMappingFromHDRBuffer(GLuint oglImageBuffer); - private: std::map _raycastData; RaycasterProgObjMap _exitPrograms; @@ -223,11 +178,6 @@ private: DeferredcasterProgObjMap _deferredcastPrograms; std::unique_ptr _hdrFilteringProgram; - std::unique_ptr _aveLumProgram; - std::unique_ptr _bloomProgram; - std::unique_ptr _bloomResolveProgram; - std::unique_ptr _histoProgram; - std::unique_ptr _histoApplyProgram; std::unique_ptr _tmoProgram; std::unique_ptr _resolveProgram; @@ -237,16 +187,7 @@ private: toneMapOperator, aveLum, maxWhite, Hue, Saturation, Value, Lightness, colorSpace, nAaSamples) _hdrUniformCache; - UniformCache(renderedImage, bloomImage, bloomOrigFactor, bloomNewFactor, - numberOfSamples) _bloomUniformCache; - - UniformCache(numberOfSamples, msaaTexture, blurriness) - _bloomFilterUniformCache; - - UniformCache(renderedImage, maxWhite, imageWidth, imageHeight) _histoUniformCache; - - UniformCache(hdrSampler, key, Ywhite, sat) _tmoUniformCache; - + GLint _defaultFBO; GLuint _screenQuad; GLuint _vertexPositionBuffer; GLuint _exitColorTexture; @@ -255,12 +196,8 @@ private: GBuffers _gBuffers; PingPongBuffers _pingPongBuffers; - HistoBuffers _histoBuffers; - BloomBuffers _bloomBuffers; HDRBuffers _hdrBuffers; - AverageLumBuffers _aLumBuffers; - MipMappingTMOBuffers _mMappingTMOBuffers; - + unsigned int _pingPongIndex = 0u; bool _dirtyDeferredcastData; @@ -270,19 +207,11 @@ private: glm::ivec2 _resolution = glm::ivec2(0); int _nAaSamples; - int _blurrinessLevel = 1; float _hdrExposure = 3.7f; float _gamma = 0.95f; - float _maxWhite = 1.0f; - bool _bloomEnabled = false; - bool _automaticBloomEnabled = false; - float _bloomThresholdMin = 0.5f; - float _bloomThresholdMax = 8.1f; - float _bloomOrigFactor = 1.0f; - float _bloomNewFactor = 1.0f; + float _maxWhite = 5.0f; int _toneMapOperator = 8; bool _histogramEnabled = false; - int _numberOfBins = 1024; // JCC TODO: Add a parameter control for this. float _tmoKey = 0.18f; float _tmoYwhite = 1e6f; float _tmoSaturation = 1.0f; @@ -296,9 +225,6 @@ private: std::vector _histoPoints; ghoul::Dictionary _rendererData; - - // Capture Default OpenSpace GL State - RenderEngine::GLDefaultState _osDefaultGLState; }; } // namespace openspace diff --git a/include/openspace/rendering/renderengine.h b/include/openspace/rendering/renderengine.h index df16d22986..b5f59212d2 100644 --- a/include/openspace/rendering/renderengine.h +++ b/include/openspace/rendering/renderengine.h @@ -88,23 +88,6 @@ public: HSL }; - struct GLDefaultState { - GLboolean blendEnabled; - GLboolean blend0Enabled; - GLboolean blend1Enabled; - GLboolean blend2Enabled; - GLboolean blend3Enabled; - GLboolean cullFaceEnabled; - GLboolean depthTestEnabled; - GLint defaultFBO; - GLenum blendEquationRGB; - GLenum blendEquationAlpha; - GLenum blendDestAlpha; - GLenum blendDestRGB; - GLenum blendSrcAlpha; - GLenum blendSrcRGB; - }; - RenderEngine(); ~RenderEngine(); @@ -191,9 +174,6 @@ public: */ static scripting::LuaLibrary luaLibrary(); - const RenderEngine::GLDefaultState& glDefaultState() const; - void setGLDefaultState(RenderEngine::GLDefaultState glDS); - glm::ivec2 renderingResolution() const; glm::ivec2 fontResolution() const; @@ -216,8 +196,6 @@ private: Camera* _camera = nullptr; Scene* _scene = nullptr; - GLDefaultState _glDefaultState; - properties::BoolProperty _doPerformanceMeasurements; std::unique_ptr _renderer; @@ -240,15 +218,6 @@ private: properties::FloatProperty _globalBlackOutFactor; properties::IntProperty _nAaSamples; - properties::PropertyOwner _bloomOwner; - properties::BoolProperty _enableBloom; - properties::BoolProperty _automaticBloom; - properties::IntProperty _bloomBlurrinessLevel; - properties::FloatProperty _bloomThreshouldMin; - properties::FloatProperty _bloomThreshouldMax; - properties::FloatProperty _bloomOrigColorFactor; - properties::FloatProperty _bloomNewColorFactor; - properties::PropertyOwner _tmoOwner; properties::FloatProperty _hdrExposure; properties::FloatProperty _maxWhite; diff --git a/include/openspace/rendering/renderer.h b/include/openspace/rendering/renderer.h index 1b45a7fcf4..b9907c1dcb 100644 --- a/include/openspace/rendering/renderer.h +++ b/include/openspace/rendering/renderer.h @@ -50,15 +50,10 @@ public: virtual void setResolution(glm::ivec2 res) = 0; virtual void setNAaSamples(int nAaSamples) = 0; - virtual void setBlurrinessLevel(int level) = 0; virtual void setHDRExposure(float hdrExposure) = 0; virtual void setGamma(float gamma) = 0; virtual void setMaxWhite(float maxWhite) = 0; virtual void setToneMapOperator(int tmOp) = 0; - virtual void setBloomThreMin(float minV) = 0; - virtual void setBloomThreMax(float maxV) = 0; - virtual void setBloomOrigFactor(float origFactor) = 0; - virtual void setBloomNewFactor(float newFactor) = 0; virtual void setKey(float key) = 0; virtual void setYwhite(float white) = 0; virtual void setTmoSaturation(float sat) = 0; @@ -68,10 +63,6 @@ public: virtual void setLightness(float lightness) = 0; virtual void setColorSpace(unsigned int colorspace) = 0; - virtual void enableBloom(bool enable) = 0; - virtual void enableAutomaticBloom(bool enable) = 0; - virtual void enableHistogram(bool enable) = 0; - virtual int nAaSamples() const = 0; virtual const std::vector& mSSAPattern() const = 0; diff --git a/shaders/framebuffer/bloomFilter.frag b/shaders/framebuffer/bloomFilter.frag deleted file mode 100644 index 094cadfe7b..0000000000 --- a/shaders/framebuffer/bloomFilter.frag +++ /dev/null @@ -1,159 +0,0 @@ -/***************************************************************************************** - * * - * OpenSpace * - * * - * Copyright (c) 2014-2018 * - * * - * Permission is hereby granted, free of charge, to any person obtaining a copy of this * - * software and associated documentation files (the "Software"), to deal in the Software * - * without restriction, including without limitation the rights to use, copy, modify, * - * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to * - * permit persons to whom the Software is furnished to do so, subject to the following * - * conditions: * - * * - * The above copyright notice and this permission notice shall be included in all copies * - * or substantial portions of the Software. * - * * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, * - * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A * - * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT * - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF * - * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * - * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * - ****************************************************************************************/ - -#version __CONTEXT__ - -layout (location = 0) out vec4 finalColor; - -uniform int numberOfSamples; -uniform int blurriness; -uniform sampler2DMS msaaTexture; - -// Gaussian Weights from OpenGL SuperBible 7 ed. -const float weights2[] = float[](0.0024499299678342, - 0.0043538453346397, - 0.0073599963704157, - 0.0118349786570722, - 0.0181026699707781, - 0.0263392293891488, - 0.0364543006660986, - 0.0479932050577658, - 0.0601029809166942, - 0.0715974486241365, - 0.0811305381519717, - 0.0874493212267511, - 0.0896631113333857, - 0.0874493212267511, - 0.0811305381519717, - 0.0715974486241365, - 0.0601029809166942, - 0.0479932050577658, - 0.0364543006660986, - 0.0263392293891488, - 0.0181026699707781, - 0.0118349786570722, - 0.0073599963704157, - 0.0043538453346397, - 0.0024499299678342); - -// Gaussian weights calculated by http://dev.theomader.com/gaussian-kernel-calculator/ -// sigma = 4.4625, kernel size = 5 -const float weights1[] = float[](0.190079, - 0.204885, - 0.210072, - 0.204885, - 0.190079); - -// Gaussian weights calculated by http://dev.theomader.com/gaussian-kernel-calculator/ -// sigma = 8, kernel size = 45 -const float weights3[] = float[](0.001147, - 0.001605, - 0.002209, - 0.002995, - 0.003998, - 0.005253, - 0.006795, - 0.008655, - 0.010852, - 0.013397, - 0.016283, - 0.019484, - 0.022952, - 0.02662, - 0.030396, - 0.03417, - 0.037817, - 0.041206, - 0.044204, - 0.046685, - 0.048543, - 0.049692, - 0.050082, - 0.049692, - 0.048543, - 0.046685, - 0.044204, - 0.041206, - 0.037817, - 0.03417, - 0.030396, - 0.02662, - 0.022952, - 0.019484, - 0.016283, - 0.013397, - 0.010852, - 0.008655, - 0.006795, - 0.005253, - 0.003998, - 0.002995, - 0.002209, - 0.001605, - 0.001147); - -vec4 applyConvolution(const int version) -{ - vec4 color = vec4(0.0); - // Transpose the image so the filter can be applied on X and Y - // P is the central position in the filter mask - - int weightsLength = 0; - - if (version == 1) { - weightsLength = weights1.length(); - } else if (version == 2) { - weightsLength = weights2.length(); - } else if (version == 3) { - weightsLength = weights3.length(); - } - - ivec2 P = ivec2(gl_FragCoord.yx) - ivec2(0, weightsLength >> 1); - - for (int w = 0; w < weightsLength; w++) - { - ivec2 texelCoord = P + ivec2(0, w); - vec4 tmpColor = vec4(0.0); - - for (int s = 0; s < numberOfSamples; ++s) { - tmpColor += texelFetch(msaaTexture, texelCoord, s); - } - tmpColor /= numberOfSamples; - - if (version == 1) { - color += tmpColor * weights1[w]; - } else if (version == 2) { - color += tmpColor * weights2[w]; - } else if (version == 3) { - color += tmpColor * weights3[w]; - } - } - - return color; -} - -void main(void) -{ - finalColor = applyConvolution(blurriness); -} diff --git a/shaders/framebuffer/bloomFilter.vert b/shaders/framebuffer/bloomFilter.vert deleted file mode 100644 index df6b10c032..0000000000 --- a/shaders/framebuffer/bloomFilter.vert +++ /dev/null @@ -1,35 +0,0 @@ -/***************************************************************************************** - * * - * OpenSpace * - * * - * Copyright (c) 2014-2018 * - * * - * Permission is hereby granted, free of charge, to any person obtaining a copy of this * - * software and associated documentation files (the "Software"), to deal in the Software * - * without restriction, including without limitation the rights to use, copy, modify, * - * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to * - * permit persons to whom the Software is furnished to do so, subject to the following * - * conditions: * - * * - * The above copyright notice and this permission notice shall be included in all copies * - * or substantial portions of the Software. * - * * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, * - * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A * - * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT * - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF * - * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * - * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * - ****************************************************************************************/ - -#version __CONTEXT__ - -void main(void) -{ - const vec4 vertices[] = vec4[](vec4(-1.0, -1.0, 1.0, 1.0), - vec4( 1.0, -1.0, 1.0, 1.0), - vec4(-1.0, 1.0, 1.0, 1.0), - vec4( 1.0, 1.0, 1.0, 1.0)); - - gl_Position = vertices[gl_VertexID]; -} \ No newline at end of file diff --git a/shaders/framebuffer/bloomResolveFilter.frag b/shaders/framebuffer/bloomResolveFilter.frag deleted file mode 100644 index 2b4a83f71b..0000000000 --- a/shaders/framebuffer/bloomResolveFilter.frag +++ /dev/null @@ -1,49 +0,0 @@ -/***************************************************************************************** - * * - * OpenSpace * - * * - * Copyright (c) 2014-2018 * - * * - * Permission is hereby granted, free of charge, to any person obtaining a copy of this * - * software and associated documentation files (the "Software"), to deal in the Software * - * without restriction, including without limitation the rights to use, copy, modify, * - * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to * - * permit persons to whom the Software is furnished to do so, subject to the following * - * conditions: * - * * - * The above copyright notice and this permission notice shall be included in all copies * - * or substantial portions of the Software. * - * * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, * - * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A * - * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT * - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF * - * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * - * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * - ****************************************************************************************/ - -#version __CONTEXT__ - -layout (location = 0) out vec4 finalColor; - -uniform int numberOfSamples; -uniform float bloomOrigFactor; -uniform float bloomNewFactor; -uniform sampler2DMS renderedImage; -uniform sampler2DMS bloomImage; - -void main(void) -{ - vec4 color = vec4(0.0); - - vec4 renderedImageTmpColor = vec4(0.0); - vec4 bloomImageTmpColor = vec4(0.0); - for (int s = 0; s < numberOfSamples; ++s) { - renderedImageTmpColor += texelFetch(renderedImage, ivec2(gl_FragCoord), s); - bloomImageTmpColor += texelFetch(bloomImage, ivec2(gl_FragCoord), s); - } - renderedImageTmpColor /= numberOfSamples; - bloomImageTmpColor /= numberOfSamples; - - finalColor = renderedImageTmpColor * bloomOrigFactor + bloomImageTmpColor * bloomNewFactor; -} diff --git a/shaders/framebuffer/bloomResolveFilter.vert b/shaders/framebuffer/bloomResolveFilter.vert deleted file mode 100644 index 818a0d62af..0000000000 --- a/shaders/framebuffer/bloomResolveFilter.vert +++ /dev/null @@ -1,35 +0,0 @@ -/***************************************************************************************** - * * - * OpenSpace * - * * - * Copyright (c) 2014-2018 * - * * - * Permission is hereby granted, free of charge, to any person obtaining a copy of this * - * software and associated documentation files (the "Software"), to deal in the Software * - * without restriction, including without limitation the rights to use, copy, modify, * - * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to * - * permit persons to whom the Software is furnished to do so, subject to the following * - * conditions: * - * * - * The above copyright notice and this permission notice shall be included in all copies * - * or substantial portions of the Software. * - * * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, * - * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A * - * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT * - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF * - * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * - * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * - ****************************************************************************************/ - -#version __CONTEXT__ - -void main(void) -{ - const vec4 vertices[] = vec4[](vec4(-1.0, -1.0, 0.5, 1.0), - vec4( 1.0, -1.0, 0.5, 1.0), - vec4(-1.0, 1.0, 0.5, 1.0), - vec4( 1.0, 1.0, 0.5, 1.0)); - - gl_Position = vertices[gl_VertexID]; -} \ No newline at end of file diff --git a/shaders/framebuffer/computeAveLum.frag b/shaders/framebuffer/computeAveLum.frag deleted file mode 100644 index a4b4cc2f50..0000000000 --- a/shaders/framebuffer/computeAveLum.frag +++ /dev/null @@ -1,51 +0,0 @@ -/***************************************************************************************** - * * - * OpenSpace * - * * - * Copyright (c) 2014-2018 * - * * - * Permission is hereby granted, free of charge, to any person obtaining a copy of this * - * software and associated documentation files (the "Software"), to deal in the Software * - * without restriction, including without limitation the rights to use, copy, modify, * - * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to * - * permit persons to whom the Software is furnished to do so, subject to the following * - * conditions: * - * * - * The above copyright notice and this permission notice shall be included in all copies * - * or substantial portions of the Software. * - * * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, * - * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A * - * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT * - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF * - * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * - * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * - ****************************************************************************************/ - -#version __CONTEXT__ - -layout (location = 0) out vec4 finalColor; - -uniform int bufferWidth; -uniform int bufferHeight; -uniform sampler2D hdrTexture; - -in vec2 texCoord; - -void main() { - vec4 color = vec4(0.0); - float fH = float(bufferHeight); - float fW = float(bufferWidth); - - float sum = 0.f; - for (int i = 0; i < bufferHeight; ++i) { - for (int j = 0; j < bufferWidth; ++j) { - vec2 texCoord = vec2(float(i) / fH, float(j) / fW); - vec4 tmpColor = texture(hdrTexture, texCoord); - float lum = dot(tmpColor.xyz, vec3(0.2126f, 0.7152f, 0.0722f)); - sum += log(lum + 0.00001); // 0.00001 to avoid log(0) from black pixels - } - } - - finalColor = vec4(vec3(exp(sum / (fH * fW))), 1.0); -} \ No newline at end of file diff --git a/shaders/framebuffer/computeAveLum.vert b/shaders/framebuffer/computeAveLum.vert deleted file mode 100644 index 4927e34304..0000000000 --- a/shaders/framebuffer/computeAveLum.vert +++ /dev/null @@ -1,31 +0,0 @@ -/***************************************************************************************** - * * - * OpenSpace * - * * - * Copyright (c) 2014-2018 * - * * - * Permission is hereby granted, free of charge, to any person obtaining a copy of this * - * software and associated documentation files (the "Software"), to deal in the Software * - * without restriction, including without limitation the rights to use, copy, modify, * - * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to * - * permit persons to whom the Software is furnished to do so, subject to the following * - * conditions: * - * * - * The above copyright notice and this permission notice shall be included in all copies * - * or substantial portions of the Software. * - * * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, * - * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A * - * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT * - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF * - * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * - * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * - ****************************************************************************************/ - -#version __CONTEXT__ - -layout(location = 0) in vec4 position; - -void main() { - gl_Position = position; -} diff --git a/shaders/framebuffer/computeHistogram_fs.glsl b/shaders/framebuffer/computeHistogram_fs.glsl deleted file mode 100644 index 066da34759..0000000000 --- a/shaders/framebuffer/computeHistogram_fs.glsl +++ /dev/null @@ -1,35 +0,0 @@ -/***************************************************************************************** - * * - * OpenSpace * - * * - * Copyright (c) 2014-2018 * - * * - * Permission is hereby granted, free of charge, to any person obtaining a copy of this * - * software and associated documentation files (the "Software"), to deal in the Software * - * without restriction, including without limitation the rights to use, copy, modify, * - * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to * - * permit persons to whom the Software is furnished to do so, subject to the following * - * conditions: * - * * - * The above copyright notice and this permission notice shall be included in all copies * - * or substantial portions of the Software. * - * * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, * - * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A * - * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT * - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF * - * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * - * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * - ****************************************************************************************/ - -#version __CONTEXT__ - -layout (location = 0) out vec4 finalColor; - -in vec3 pColor; - -void main() -{ - //finalColor = vec4(1.0, 0.0, 0.0, 1.0); - finalColor = vec4(pColor, 1.0); -} \ No newline at end of file diff --git a/shaders/framebuffer/computeHistogram_vs.glsl b/shaders/framebuffer/computeHistogram_vs.glsl deleted file mode 100644 index e03b268311..0000000000 --- a/shaders/framebuffer/computeHistogram_vs.glsl +++ /dev/null @@ -1,63 +0,0 @@ -/***************************************************************************************** - * * - * OpenSpace * - * * - * Copyright (c) 2014-2018 * - * * - * Permission is hereby granted, free of charge, to any person obtaining a copy of this * - * software and associated documentation files (the "Software"), to deal in the Software * - * without restriction, including without limitation the rights to use, copy, modify, * - * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to * - * permit persons to whom the Software is furnished to do so, subject to the following * - * conditions: * - * * - * The above copyright notice and this permission notice shall be included in all copies * - * or substantial portions of the Software. * - * * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, * - * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A * - * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT * - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF * - * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * - * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * - ****************************************************************************************/ - -#version __CONTEXT__ - -layout(location = 0) in vec4 pixelCoord; - -uniform float maxWhite; -//uniform int numberOfPixels; -//uniform int numberOfBins; -uniform float imageWidth; -uniform float imageHeight; - -uniform sampler2D renderedImage; - -flat out vec3 pColor; - -void main() -{ - vec2 texCoord; - texCoord.x = float(int(pixelCoord.x / imageWidth)) / imageWidth; - texCoord.y = float(int(pixelCoord.x) % int(imageWidth)) / imageHeight; - vec3 pixelColor = texture(renderedImage, texCoord).xyz; - pColor = pixelColor; - float pixelLuminosity = dot(pixelColor, vec3(0.2126f, 0.7152f, 0.0722f)); - - //gl_Position = vec4(-1.0 + (2.0 * pixelLuminosity / maxWhite), 0.0, 0.0, 1.0); - - //gl_Position = vec4(2.0 * texCoord - vec2(1.0), 0.0, 1.0); - - //gl_Position = vec4(0.5, 2.0 * texCoord.y - 1.0, 0.0, 1.0); - - //gl_Position = vec4(-1.0 + (pixelLuminosity * 0.0078125), -1.0, 0.0, 1.0); - - //gl_Position = vec4(0.5, -1.0 + (pixelLuminosity * 0.0078125), 0.0, 1.0); - - //gl_Position = vec4(0.0, -1.0 + (2.0 * pixelLuminosity / maxWhite), 0.0, 1.0); - - gl_Position = vec4((2.0 * pixelLuminosity / maxWhite) - 1.0, 2.0 * texCoord.y - 1.0, 0.0, 1.0); - - gl_PointSize = 1.0; -} \ No newline at end of file diff --git a/shaders/framebuffer/computeTMO_fs.glsl b/shaders/framebuffer/computeTMO_fs.glsl deleted file mode 100644 index 3a0e6c0db6..0000000000 --- a/shaders/framebuffer/computeTMO_fs.glsl +++ /dev/null @@ -1,85 +0,0 @@ -/***************************************************************************************** - * * - * OpenSpace * - * * - * Copyright (c) 2014-2018 * - * * - * Permission is hereby granted, free of charge, to any person obtaining a copy of this * - * software and associated documentation files (the "Software"), to deal in the Software * - * without restriction, including without limitation the rights to use, copy, modify, * - * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to * - * permit persons to whom the Software is furnished to do so, subject to the following * - * conditions: * - * * - * The above copyright notice and this permission notice shall be included in all copies * - * or substantial portions of the Software. * - * * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, * - * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A * - * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT * - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF * - * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * - * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * - ****************************************************************************************/ - -#version __CONTEXT__ - -#include "hdr.glsl" - -layout (location = 0) out vec4 finalColor; - -uniform float key; -uniform float Ywhite; -uniform float sat; - -uniform sampler2D hdrSampler; - -in vec2 texCoord; - -vec3 toneMapGlobal(vec3 hdrColor, float logAvgLum) { - vec3 XYZ = srgbToXYZ(hdrColor); - - float Y = (key / logAvgLum) * XYZ.y; - float Yd = (Y * (1.0 + Y/(Ywhite * Ywhite))) / (1.0 + Y); - - return pow(hdrColor / XYZ.y, vec3(sat)) * Yd; -} - -vec3 toneMapLocal(vec3 hdrColor, float logAvgLum) { - vec3 XYZ = srgbToXYZ(hdrColor); - - float Y = (key / logAvgLum) * XYZ.y; - float LocalAdaptation; - float factor = key / logAvgLum; - float epsilon = 0.05; - float phi = 8.0; - float scale[7] = float[7](1, 2, 4, 8, 16, 32, 64); - - for (int i = 0; i < 7; ++i) { - float V1 = exp(texture(hdrSampler, texCoord, i).a) * factor; - float V2 = exp(texture(hdrSampler, texCoord, i+1).a) * factor; - - if ( abs(V1-V2) / ((key * pow(2, phi) / (scale[i] * scale[i])) + V1) - > epsilon ) { - LocalAdaptation = V1; - break; - } else { - LocalAdaptation = V2; - } - } - - float Yd = Y / (1.0 + LocalAdaptation); - - return pow(hdrColor / XYZ.y, vec3(sat)) * Yd; -} - -void main() { - vec3 hdrColor = texture(hdrSampler, texCoord).rgb; - - float logAvgLum = exp(texture(hdrSampler, texCoord, 20).a); - - //finalColor.rgb = toneMapGlobal(hdrColor, logAvgLum); - - finalColor = vec4(toneMapGlobal(hdrColor, logAvgLum), 1.0); - finalColor = vec4(1.0, 0.0, 0.0, 1.0); -} diff --git a/shaders/framebuffer/computeTMO_vs.glsl b/shaders/framebuffer/computeTMO_vs.glsl deleted file mode 100644 index 2ddb63b462..0000000000 --- a/shaders/framebuffer/computeTMO_vs.glsl +++ /dev/null @@ -1,33 +0,0 @@ -/***************************************************************************************** - * * - * OpenSpace * - * * - * Copyright (c) 2014-2018 * - * * - * Permission is hereby granted, free of charge, to any person obtaining a copy of this * - * software and associated documentation files (the "Software"), to deal in the Software * - * without restriction, including without limitation the rights to use, copy, modify, * - * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to * - * permit persons to whom the Software is furnished to do so, subject to the following * - * conditions: * - * * - * The above copyright notice and this permission notice shall be included in all copies * - * or substantial portions of the Software. * - * * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, * - * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A * - * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT * - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF * - * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * - * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * - ****************************************************************************************/ - -#version __CONTEXT__ - -layout(location = 0) in vec4 position; -out vec2 texCoord; - -void main() { - texCoord = 0.5 + position.xy * 0.5; - gl_Position = position; -} \ No newline at end of file diff --git a/shaders/framebuffer/renderframebuffer.frag b/shaders/framebuffer/renderframebuffer.frag index d62ccd71ab..1799e695f7 100644 --- a/shaders/framebuffer/renderframebuffer.frag +++ b/shaders/framebuffer/renderframebuffer.frag @@ -26,10 +26,6 @@ #include <#{fragmentPath}> #define exposure #{rendererData.hdrExposure} -#define automaticBloom #{rendererData.automaticBloom} -#define bloom_thresh_min #{rendererData.bloom_thresh_min} -#define bloom_thresh_max #{rendererData.bloom_thresh_max} - #define deltaError 0.013 layout(location = 0) out vec4 _out_color_; @@ -38,26 +34,10 @@ layout(location = 2) out vec4 gNormal; layout(location = 3) out vec4 filterBuffer; void main() { - Fragment f = getFragment(); - vec4 tmpOutColor = vec4((log2(vec3(1.0) - (f.color.rgb - vec3(deltaError)))/(-exposure)), f.color.a); - //_out_color_ = f.color; - gPosition = f.gPosition; - gNormal = f.gNormal; + Fragment f = getFragment(); + _out_color_ = vec4((log2(vec3(1.0) - (f.color.rgb - vec3(deltaError)))/(-exposure)), f.color.a); + gPosition = f.gPosition; + gNormal = f.gNormal; - if (automaticBloom == 1) { - // Extract luminance - float Y = dot(f.color.rgb, vec3(0.299, 0.587, 0.144)); - - // Apply Bloom on the bloom threshold range values - vec3 bColor = tmpOutColor.rgb * smoothstep(bloom_thresh_min, bloom_thresh_max, Y); - - filterBuffer = vec4(bColor, f.color.a); - } else { - if (f.filterFlag == 1) - filterBuffer = f.color; - else - filterBuffer = vec4(0); - } - _out_color_ = tmpOutColor; - gl_FragDepth = normalizeFloat(f.depth); + gl_FragDepth = normalizeFloat(f.depth); } diff --git a/src/rendering/framebufferrenderer.cpp b/src/rendering/framebufferrenderer.cpp index bc8aa7da41..d0bf66baf8 100644 --- a/src/rendering/framebufferrenderer.cpp +++ b/src/rendering/framebufferrenderer.cpp @@ -60,19 +60,6 @@ namespace { "Lightness", "colorSpace", "nAaSamples" }; - constexpr const std::array BloomUniformNames = { - "renderedImage", "bloomImage", "bloomOrigFactor", "bloomNewFactor", - "numberOfSamples" - }; - - constexpr const std::array BloomFilterUniformNames = { - "numberOfSamples", "msaaTexture", "blurriness" - }; - - constexpr const std::array HistoUniformNames = { - "renderedImage", "maxWhite", "imageWidth", "imageHeight" - }; - constexpr const std::array TMOUniformNames = { "hdrSampler", "key", "Ywhite", "sat" }; @@ -143,13 +130,11 @@ void FramebufferRenderer::initialize() { glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 2, nullptr); glEnableVertexAttribArray(0); - GLint defaultFbo; - glGetIntegerv(GL_FRAMEBUFFER_BINDING, &defaultFbo); + glGetIntegerv(GL_FRAMEBUFFER_BINDING, &_defaultFBO); // GBuffers glGenTextures(1, &_gBuffers._colorTexture); glGenTextures(1, &_gBuffers._depthTexture); - glGenTextures(1, &_gBuffers._filterTexture); glGenTextures(1, &_gBuffers._positionTexture); glGenTextures(1, &_gBuffers._normalTexture); glGenFramebuffers(1, &_gBuffers._framebuffer); @@ -169,31 +154,6 @@ void FramebufferRenderer::initialize() { glGenFramebuffers(1, &_hdrBuffers._hdrFilteringFramebuffer); glGenTextures(1, &_hdrBuffers._hdrFilteringTexture); - // Compute Average Luminosity Buffers - glGenTextures(1, &_aLumBuffers._computeAveLumTexture); - glGenFramebuffers(1, &_aLumBuffers._computeAveLumFBO); - - // Bloom Buffers - glGenFramebuffers(3, _bloomBuffers._bloomFilterFBO); - glGenTextures(3, _bloomBuffers._bloomTexture); - - // Histogram Buffers - glGenFramebuffers(1, &_histoBuffers._histoFramebuffer); - glGenTextures(1, &_histoBuffers._histoTexture); - glGenVertexArrays(1, &_histoBuffers._histoVao); - glBindVertexArray(_histoBuffers._histoVao); - glGenBuffers(1, &_histoBuffers._histoVbo); - - // TMO via mipmapping Buffers - glGenFramebuffers(1, &_mMappingTMOBuffers._tmoFramebuffer); - glGenTextures(1, &_mMappingTMOBuffers._tmoTexture); - glGenSamplers(1, &_mMappingTMOBuffers._tmoHdrSampler); - glSamplerParameteri( - _mMappingTMOBuffers._tmoHdrSampler, - GL_TEXTURE_MIN_FILTER, - GL_LINEAR_MIPMAP_NEAREST - ); - // Allocate Textures/Buffers Memory updateResolution(); @@ -225,13 +185,6 @@ void FramebufferRenderer::initialize() { _gBuffers._normalTexture, 0 ); - glFramebufferTexture2D( - GL_FRAMEBUFFER, - GL_COLOR_ATTACHMENT3, - GL_TEXTURE_2D_MULTISAMPLE, - _gBuffers._filterTexture, - 0 - ); glFramebufferTexture2D( GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, @@ -263,13 +216,6 @@ void FramebufferRenderer::initialize() { _pingPongBuffers.colorTexture[1], 0 ); - glFramebufferTexture2D( - GL_FRAMEBUFFER, - GL_COLOR_ATTACHMENT3, - GL_TEXTURE_2D_MULTISAMPLE, - _gBuffers._filterTexture, - 0 - ); glFramebufferTexture2D( GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, @@ -325,99 +271,15 @@ void FramebufferRenderer::initialize() { LERROR("HDR/Filtering framebuffer is not complete"); } - //========================================// - //===== Average Luminosity Buffers =====// - //========================================// - glBindFramebuffer(GL_FRAMEBUFFER, _aLumBuffers._computeAveLumFBO); - glFramebufferTexture2D( - GL_FRAMEBUFFER, - GL_COLOR_ATTACHMENT0, - GL_TEXTURE_2D, - _aLumBuffers._computeAveLumTexture, - 0 - ); - - status = glCheckFramebufferStatus(GL_FRAMEBUFFER); - if (status != GL_FRAMEBUFFER_COMPLETE) { - LERROR("Average Luminosity framebuffer is not complete"); - } - - //==============================// - //======= Bloom Buffers ======// - //==============================// - for (int i = 0; i < 3; i++) - { - glBindFramebuffer(GL_FRAMEBUFFER, _bloomBuffers._bloomFilterFBO[i]); - glFramebufferTexture2D( - GL_FRAMEBUFFER, - GL_COLOR_ATTACHMENT0, - GL_TEXTURE_2D_MULTISAMPLE, - _bloomBuffers._bloomTexture[i], - 0 - ); - // Not written to, just to have an happy complete GL framebuffer - /*glFramebufferTexture2D( - GL_FRAMEBUFFER, - GL_DEPTH_ATTACHMENT, - GL_TEXTURE_2D_MULTISAMPLE, - _gBuffers._depthTexture, - 0 - );*/ - glDrawBuffers(1, ColorAttachment0Array); - - status = glCheckFramebufferStatus(GL_FRAMEBUFFER); - if (status != GL_FRAMEBUFFER_COMPLETE) { - LERROR(fmt::format("Bloom framebuffer {} is not complete", i)); - } - } - - //=============================================// - //====== Histogram Equalization Buffers ======// - //=============================================// - glBindFramebuffer(GL_FRAMEBUFFER, _histoBuffers._histoFramebuffer); - glFramebufferTexture2D( - GL_FRAMEBUFFER, - GL_COLOR_ATTACHMENT0, - GL_TEXTURE_2D, - _histoBuffers._histoTexture, - 0 - ); - - status = glCheckFramebufferStatus(GL_FRAMEBUFFER); - if (status != GL_FRAMEBUFFER_COMPLETE) { - LERROR("Histogram framebuffer is not complete"); - } - - //======================================// - //====== MipMapping TMO Buffers ======// - //======================================// - glBindFramebuffer(GL_FRAMEBUFFER, _mMappingTMOBuffers._tmoFramebuffer); - glFramebufferTexture2D( - GL_FRAMEBUFFER, - GL_COLOR_ATTACHMENT0, - GL_TEXTURE_2D, - _mMappingTMOBuffers._tmoTexture, - 0 - ); - - status = glCheckFramebufferStatus(GL_FRAMEBUFFER); - if (status != GL_FRAMEBUFFER_COMPLETE) { - LERROR("Histogram framebuffer is not complete"); - } - // JCC: Moved to here to avoid NVidia: "Program/shader state performance warning" // Building programs updateHDRAndFiltering(); - updateAveLum(); - updateBloomConfig(); - updateHistogramConfig(); updateDeferredcastData(); - updateTMOViaMipMappingConfig(); _dirtyMsaaSamplingPattern = true; // Sets back to default FBO - glBindFramebuffer(GL_FRAMEBUFFER, defaultFbo); + glBindFramebuffer(GL_FRAMEBUFFER, _defaultFBO); _resolveProgram = ghoul::opengl::ProgramObject::Build( "Framebuffer Resolve", @@ -435,46 +297,12 @@ void FramebufferRenderer::initialize() { _hdrUniformCache, HDRUniformNames ); - ghoul::opengl::updateUniformLocations( - *_bloomResolveProgram, - _bloomUniformCache, - BloomUniformNames - ); - ghoul::opengl::updateUniformLocations( - *_bloomProgram, - _bloomFilterUniformCache, - BloomFilterUniformNames - ); - - ghoul::opengl::updateUniformLocations( - *_histoProgram, - _histoUniformCache, - HistoUniformNames - ); - - // /*ghoul::opengl::updateUniformLocations( - // *_histoApplyProgram, - // _histoApplyUniformCache, - // HistoApplyUniformNames - // );*/ - - ghoul::opengl::updateUniformLocations( - *_tmoProgram, - _tmoUniformCache, - TMOUniformNames - ); global::raycasterManager.addListener(*this); global::deferredcasterManager.addListener(*this); // Default GL State for Blending glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - glGetIntegerv(GL_BLEND_EQUATION_RGB, &_osDefaultGLState.blendEquationRGB); - glGetIntegerv(GL_BLEND_EQUATION_ALPHA, &_osDefaultGLState.blendEquationAlpha); - glGetIntegerv(GL_BLEND_DST_ALPHA, &_osDefaultGLState.blendDestAlpha); - glGetIntegerv(GL_BLEND_DST_RGB, &_osDefaultGLState.blendDestRGB); - glGetIntegerv(GL_BLEND_SRC_ALPHA, &_osDefaultGLState.blendSrcAlpha); - glGetIntegerv(GL_BLEND_SRC_RGB, &_osDefaultGLState.blendSrcRGB); } @@ -484,10 +312,6 @@ void FramebufferRenderer::deinitialize() { glDeleteFramebuffers(1, &_gBuffers._framebuffer); glDeleteFramebuffers(1, &_exitFramebuffer); glDeleteFramebuffers(1, &_hdrBuffers._hdrFilteringFramebuffer); - glDeleteFramebuffers(1, &_aLumBuffers._computeAveLumFBO); - glDeleteFramebuffers(3, _bloomBuffers._bloomFilterFBO); - glDeleteFramebuffers(1, &_histoBuffers._histoFramebuffer); - glDeleteFramebuffers(1, &_mMappingTMOBuffers._tmoFramebuffer); glDeleteFramebuffers(1, &_pingPongBuffers.framebuffer); glDeleteTextures(1, &_gBuffers._colorTexture); @@ -496,11 +320,7 @@ void FramebufferRenderer::deinitialize() { glDeleteTextures(1, &_hdrBuffers._hdrFilteringTexture); glDeleteTextures(1, &_gBuffers._positionTexture); glDeleteTextures(1, &_gBuffers._normalTexture); - glDeleteTextures(1, &_aLumBuffers._computeAveLumTexture); - glDeleteTextures(3, _bloomBuffers._bloomTexture); - glDeleteTextures(1, &_histoBuffers._histoTexture); - glDeleteTextures(1, &_mMappingTMOBuffers._tmoTexture); - + glDeleteTextures(1, &_pingPongBuffers.colorTexture[1]); glDeleteTextures(1, &_exitColorTexture); @@ -509,8 +329,6 @@ void FramebufferRenderer::deinitialize() { glDeleteBuffers(1, &_vertexPositionBuffer); glDeleteVertexArrays(1, &_screenQuad); - glDeleteSamplers(1, &_mMappingTMOBuffers._tmoHdrSampler); - global::raycasterManager.removeListener(*this); global::deferredcasterManager.removeListener(*this); } @@ -527,50 +345,6 @@ void FramebufferRenderer::deferredcastersChanged(Deferredcaster&, _dirtyDeferredcastData = true; } -void FramebufferRenderer::captureAndSetOpenGLDefaultState() { - // Capture standard fbo - glGetIntegerv(GL_FRAMEBUFFER_BINDING, &_osDefaultGLState.defaultFBO); - - glEnablei(GL_BLEND, 0); - glDisablei(GL_BLEND, 1); - glDisablei(GL_BLEND, 2); - glDisablei(GL_BLEND, 3); - - glClampColor(GL_CLAMP_READ_COLOR, GL_FALSE); - - // JCC: From OpenGL Registry - // Note that the FrontFace and ClampColor commands in section 12.2 are not - // deprecated, as they still affect other non - deprecated functionality; however, - // the ClampColor targets CLAMP_VERTEX_COLOR and CLAMP_FRAGMENT_ - - // COLOR are deprecated. - //glClampColor(GL_CLAMP_VERTEX_COLOR, GL_FALSE); - //glClampColor(GL_CLAMP_FRAGMENT_COLOR, GL_FALSE); - - _osDefaultGLState.blendEnabled = true; - _osDefaultGLState.blend0Enabled = true; - _osDefaultGLState.blend1Enabled = false; - _osDefaultGLState.blend2Enabled = false; - _osDefaultGLState.blend3Enabled = false; - - glBlendEquationSeparate( - _osDefaultGLState.blendEquationRGB, - _osDefaultGLState.blendEquationAlpha - ); - glBlendFuncSeparate( - _osDefaultGLState.blendSrcRGB, - _osDefaultGLState.blendDestRGB, - _osDefaultGLState.blendSrcAlpha, - _osDefaultGLState.blendDestAlpha - ); - - glEnable(GL_DEPTH_TEST); - _osDefaultGLState.depthTestEnabled = true; - - // Update the default OS GL state to the RenderEngine to be - // available to all renderables - global::renderEngine.setGLDefaultState(_osDefaultGLState); -} - void FramebufferRenderer::resolveMSAA(float blackoutFactor) { _resolveProgram->activate(); @@ -590,389 +364,46 @@ void FramebufferRenderer::resolveMSAA(float blackoutFactor) { void FramebufferRenderer::applyTMO(float blackoutFactor) { const bool doPerformanceMeasurements = global::performanceManager.isEnabled(); - float averageLuminaceInFB = 0.0; - if (_toneMapOperator == - static_cast(openspace::RenderEngine::ToneMapOperators::GLOBAL)) { - std::unique_ptr perfInternal; - if (doPerformanceMeasurements) { - perfInternal = std::make_unique( - "FramebufferRenderer::render::TMO_GLOBAL" - ); - } - // JCC: Mudar aqui para que a entrada do TMO seja MSAA - averageLuminaceInFB = computeBufferAveLuminanceGPU(); - if (std::isnan(averageLuminaceInFB)) { - averageLuminaceInFB = 1000.0; - } - } - else if ( - _toneMapOperator == - static_cast(openspace::RenderEngine::ToneMapOperators::MIPMAPPING)) { - std::unique_ptr perfInternal; - if (doPerformanceMeasurements) { - perfInternal = std::make_unique( - "FramebufferRenderer::render::TMO_Mipmapping" - ); - } - - if (_bloomEnabled) { - // JCC: Mudar aqui para que a entrada do TMO seja MSAA - computeMipMappingFromHDRBuffer(_bloomBuffers._bloomTexture[2]); - } - else { - // JCC: Mudar aqui para que a entrada do TMO seja MSAA - computeMipMappingFromHDRBuffer(_pingPongBuffers.colorTexture[_pingPongIndex]); - } - } - else { - std::unique_ptr perfInternal; - if (doPerformanceMeasurements) { - perfInternal = std::make_unique( - "FramebufferRenderer::render::TMO" - ); - } - _hdrFilteringProgram->activate(); - - ghoul::opengl::TextureUnit hdrFeedingTextureUnit; - hdrFeedingTextureUnit.activate(); - if (_bloomEnabled) { - // The next texture must be a MSAA texture - glBindTexture( - GL_TEXTURE_2D_MULTISAMPLE, - _bloomBuffers._bloomTexture[2] + std::unique_ptr perfInternal; + + if (doPerformanceMeasurements) { + perfInternal = std::make_unique( + "FramebufferRenderer::render::TMO" ); - } - else { - glBindTexture( - GL_TEXTURE_2D_MULTISAMPLE, - _pingPongBuffers.colorTexture[_pingPongIndex] - ); - } - - _hdrFilteringProgram->setUniform( - _hdrUniformCache.hdrFeedingTexture, - hdrFeedingTextureUnit - ); - - - _hdrFilteringProgram->setUniform(_hdrUniformCache.blackoutFactor, blackoutFactor); - _hdrFilteringProgram->setUniform(_hdrUniformCache.hdrExposure, _hdrExposure); - _hdrFilteringProgram->setUniform(_hdrUniformCache.gamma, _gamma); - _hdrFilteringProgram->setUniform(_hdrUniformCache.toneMapOperator, _toneMapOperator); - _hdrFilteringProgram->setUniform(_hdrUniformCache.aveLum, averageLuminaceInFB); - _hdrFilteringProgram->setUniform(_hdrUniformCache.maxWhite, _maxWhite); - _hdrFilteringProgram->setUniform(_hdrUniformCache.Hue, _hue); - _hdrFilteringProgram->setUniform(_hdrUniformCache.Saturation, _saturation); - _hdrFilteringProgram->setUniform(_hdrUniformCache.Value, _value); - _hdrFilteringProgram->setUniform(_hdrUniformCache.Lightness, _lightness); - _hdrFilteringProgram->setUniform(_hdrUniformCache.colorSpace, _colorSpace); - _hdrFilteringProgram->setUniform(_hdrUniformCache.nAaSamples, _nAaSamples); - - - glBindVertexArray(_screenQuad); - glDrawArrays(GL_TRIANGLES, 0, 6); - glBindVertexArray(0); - - _hdrFilteringProgram->deactivate(); } -} + _hdrFilteringProgram->activate(); -float FramebufferRenderer::computeBufferAveLuminance() { - unsigned int texDimension = _resolution.x * _resolution.y; + ghoul::opengl::TextureUnit hdrFeedingTextureUnit; + hdrFeedingTextureUnit.activate(); + glBindTexture( + GL_TEXTURE_2D_MULTISAMPLE, + _pingPongBuffers.colorTexture[_pingPongIndex] + ); - std::unique_ptr texData(new GLfloat[texDimension * 3]); + _hdrFilteringProgram->setUniform( + _hdrUniformCache.hdrFeedingTexture, + hdrFeedingTextureUnit + ); - ghoul::opengl::TextureUnit hdrTextureUnit; - hdrTextureUnit.activate(); - glBindTexture(GL_TEXTURE_2D, _hdrBuffers._hdrFilteringTexture); - glClampColor(GL_CLAMP_READ_COLOR, GL_FALSE); - glGetTexImage(GL_TEXTURE_2D, 0, GL_RGB, GL_FLOAT, texData.get()); - - float sum = 0.0f; - for (unsigned int i = 0; i < texDimension; i++) { - float lum = glm::dot( - glm::vec3(texData[i * 3 + 0], texData[i * 3 + 1], texData[i * 3 + 2]), - glm::vec3(0.2126f, 0.7152f, 0.0722f) - ); - sum += logf(lum + 0.00001f); - } + _hdrFilteringProgram->setUniform(_hdrUniformCache.blackoutFactor, blackoutFactor); + _hdrFilteringProgram->setUniform(_hdrUniformCache.hdrExposure, _hdrExposure); + _hdrFilteringProgram->setUniform(_hdrUniformCache.gamma, _gamma); + _hdrFilteringProgram->setUniform(_hdrUniformCache.toneMapOperator, _toneMapOperator); + _hdrFilteringProgram->setUniform(_hdrUniformCache.maxWhite, _maxWhite); + _hdrFilteringProgram->setUniform(_hdrUniformCache.Hue, _hue); + _hdrFilteringProgram->setUniform(_hdrUniformCache.Saturation, _saturation); + _hdrFilteringProgram->setUniform(_hdrUniformCache.Value, _value); + _hdrFilteringProgram->setUniform(_hdrUniformCache.Lightness, _lightness); + _hdrFilteringProgram->setUniform(_hdrUniformCache.colorSpace, _colorSpace); + _hdrFilteringProgram->setUniform(_hdrUniformCache.nAaSamples, _nAaSamples); - return expf(sum / texDimension); -} -float FramebufferRenderer::computeBufferAveLuminanceGPU() { - // Capture standard fbo - GLint defaultFbo; - glGetIntegerv(GL_FRAMEBUFFER_BINDING, &defaultFbo); - - glBindFramebuffer(GL_FRAMEBUFFER, _aLumBuffers._computeAveLumFBO); - GLenum textureBuffers[1] = { GL_COLOR_ATTACHMENT0 }; - glDrawBuffers(1, textureBuffers); - glClear(GL_COLOR_BUFFER_BIT); - - glViewport(0, 0, 1, 1); - - _aveLumProgram->activate(); - - //float averageLuminaceInFB = computeBufferAveLuminance(); - //std::cout << "=== Average Lum on CPU = " << averageLuminaceInFB << " ===" << std::endl; - - ghoul::opengl::TextureUnit hdrTextureUnit; - hdrTextureUnit.activate(); - - // JCC: Mudar aveLumProgram para trabalhar com MSAA - if (_bloomEnabled) { - glBindTexture( - GL_TEXTURE_2D_MULTISAMPLE, - _bloomBuffers._bloomTexture[2] - ); - } - else { - glBindTexture( - GL_TEXTURE_2D_MULTISAMPLE, - _pingPongBuffers.colorTexture[_pingPongIndex] - ); - } - - _aveLumProgram->setUniform("hdrTexture", hdrTextureUnit); - _aveLumProgram->setUniform("bufferWidth", _resolution.x); - _aveLumProgram->setUniform("bufferHeight", _resolution.y); - glBindVertexArray(_screenQuad); glDrawArrays(GL_TRIANGLES, 0, 6); glBindVertexArray(0); - _aveLumProgram->deactivate(); - - std::vector gpuAveLum; - saveTextureToMemory(GL_COLOR_ATTACHMENT0, 1, 1, gpuAveLum); - - //std::cout << "=== Average Lum on GPU = " << gpuAveLum[0] << " ===" << std::endl; - - glBindFramebuffer(GL_FRAMEBUFFER, defaultFbo); - glViewport(0, 0, _resolution.x, _resolution.y); - - return static_cast(gpuAveLum[0]); -} - -void FramebufferRenderer::applyBloomFilter(bool noDeferredTaskExecuted) { - - if (!_bloomBuffers._bloomVAO) { - glGenVertexArrays(1, &_bloomBuffers._bloomVAO); - } - - glBindFramebuffer(GL_FRAMEBUFFER, _bloomBuffers._bloomFilterFBO[0]); - glDrawBuffer(GL_COLOR_ATTACHMENT0); - glViewport(0, 0, _resolution.y, _resolution.x); - glBindVertexArray(_bloomBuffers._bloomVAO); - - _bloomProgram->activate(); - - // First blurring pass (vertical) - { - ghoul::opengl::TextureUnit msaaTextureUnit; - msaaTextureUnit.activate(); - // Incoming texture to apply the gaussian filter - glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _gBuffers._filterTexture); - - _bloomProgram->setUniform(_bloomFilterUniformCache.msaaTexture, msaaTextureUnit); - _bloomProgram->setUniform(_bloomFilterUniformCache.numberOfSamples, _nAaSamples); - _bloomProgram->setUniform(_bloomFilterUniformCache.blurriness, _blurrinessLevel); - - glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); - } - - _bloomProgram->deactivate(); - - glBindFramebuffer(GL_FRAMEBUFFER, _bloomBuffers._bloomFilterFBO[1]); - glDrawBuffer(GL_COLOR_ATTACHMENT0); - glViewport(0, 0, _resolution.x, _resolution.y); - glBindVertexArray(_bloomBuffers._bloomVAO); - - _bloomProgram->activate(); - - // Second blurring pass (horizontal) - { - ghoul::opengl::TextureUnit msaaTextureUnit; - msaaTextureUnit.activate(); - // The results of the previous pass is passed to this pass - glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _bloomBuffers._bloomTexture[0]); - - _bloomProgram->setUniform(_bloomFilterUniformCache.msaaTexture, msaaTextureUnit); - _bloomProgram->setUniform(_bloomFilterUniformCache.numberOfSamples, _nAaSamples); - _bloomProgram->setUniform(_bloomFilterUniformCache.blurriness, _blurrinessLevel); - - glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); - - //glFlush(); - } - - _bloomProgram->deactivate(); - - glBindFramebuffer(GL_FRAMEBUFFER, _bloomBuffers._bloomFilterFBO[2]); - glDrawBuffer(GL_COLOR_ATTACHMENT0); - glViewport(0, 0, _resolution.x, _resolution.y); - - _bloomResolveProgram->activate(); - - // Adding the result of the blurring processes to the - // hdrFilteringTexture and saving the result in - // the _bloomBuffers._bloomTexture[2] texture (JCC: That can be - // done by blending operation (ONE)) - { - // Original buffer will be summed to the bloom result - ghoul::opengl::TextureUnit hdrFeedingTextureUnit; - hdrFeedingTextureUnit.activate(); - - if (noDeferredTaskExecuted) { - glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, - _pingPongBuffers.colorTexture[0] - ); - } - else { - glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, - _pingPongBuffers.colorTexture[_pingPongIndex] - ); - } - - - _bloomResolveProgram->setUniform( - _bloomUniformCache.renderedImage, - hdrFeedingTextureUnit - ); - - ghoul::opengl::TextureUnit bloomTextureUnit; - bloomTextureUnit.activate(); - // Results of the second pass are added to the original buffer - glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _bloomBuffers._bloomTexture[1]); - _bloomResolveProgram->setUniform(_bloomUniformCache.bloomImage, bloomTextureUnit); - - _bloomResolveProgram->setUniform(_bloomUniformCache.numberOfSamples, _nAaSamples); - - _bloomResolveProgram->setUniform( - _bloomUniformCache.bloomOrigFactor, - _bloomOrigFactor - ); - _bloomResolveProgram->setUniform( - _bloomUniformCache.bloomNewFactor, - _bloomNewFactor - ); - - // Write the results to the _bloomDilterFBO[2] in _bloomTexture[2] texture - glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); - } - - _bloomResolveProgram->deactivate(); -} - -void FramebufferRenderer::computeImageHistogram() { - glBindFramebuffer(GL_FRAMEBUFFER, _histoBuffers._histoFramebuffer); - GLenum textureBuffer[] = { - GL_COLOR_ATTACHMENT0 - }; - glDrawBuffers(1, textureBuffer); - - glClearColor(0.0, 0.0, 0.0, 1.0); - glClear(GL_COLOR_BUFFER_BIT); - glViewport(0, 0, _resolution.x, _resolution.y); - - GLboolean depthTestEnabled = glIsEnabled(GL_DEPTH_TEST); - - glDisable(GL_DEPTH_TEST); - - // Saving Blending State - GLboolean blendEnabled = glIsEnabled(GL_BLEND); - GLenum blendEquationRGB; - GLenum blendEquationAlpha; - GLenum blendDestAlpha; - GLenum blendDestRGB; - GLenum blendSrcAlpha; - GLenum blendSrcRGB; - - glGetIntegerv(GL_BLEND_EQUATION_RGB, &blendEquationRGB); - glGetIntegerv(GL_BLEND_EQUATION_ALPHA, &blendEquationAlpha); - glGetIntegerv(GL_BLEND_DST_ALPHA, &blendDestAlpha); - glGetIntegerv(GL_BLEND_DST_RGB, &blendDestRGB); - glGetIntegerv(GL_BLEND_SRC_ALPHA, &blendSrcAlpha); - glGetIntegerv(GL_BLEND_SRC_RGB, &blendSrcRGB); - - // Changing blending functions for histogram computation - glBlendEquation(GL_FUNC_ADD); - glBlendFunc(GL_ONE, GL_ONE); - glEnable(GL_BLEND); - - glBindVertexArray(_histoBuffers._histoVao); - - _histoProgram->activate(); - - ghoul::opengl::TextureUnit renderedImage; - renderedImage.activate(); - glBindTexture(GL_TEXTURE_2D, _hdrBuffers._hdrFilteringTexture); - _histoProgram->setUniform(_histoUniformCache.renderedImage, renderedImage); - _histoProgram->setUniform(_histoUniformCache.imageWidth, static_cast(_resolution.x)); - _histoProgram->setUniform(_histoUniformCache.imageHeight, static_cast(_resolution.y)); - _histoProgram->setUniform(_histoUniformCache.maxWhite, _maxWhite); - - glDrawArrays(GL_POINTS, 0, _resolution.x * _resolution.y); - - glFlush(); - - _histoProgram->deactivate(); - - // Testing - std::vector gpuHistogram; - saveTextureToMemory(GL_COLOR_ATTACHMENT0, _numberOfBins, 1, gpuHistogram); - - - // Restores blending state - if (!blendEnabled) { - glDisable(GL_BLEND); - } - else { - glBlendEquationSeparate(blendEquationRGB, blendEquationAlpha); - glBlendFuncSeparate(blendSrcRGB, blendDestRGB, blendSrcAlpha, blendDestAlpha); - } - - // Restores Depth test state - if (depthTestEnabled) { - glEnable(GL_DEPTH_TEST); - } -} - -void FramebufferRenderer::computeMipMappingFromHDRBuffer(GLuint oglImageBuffer) { - glEnable(GL_FRAMEBUFFER_SRGB); - /*glBindFramebuffer(GL_FRAMEBUFFER, _mMappingTMOBuffers._tmoFramebuffer); - GLenum textureBuffer[] = { - GL_COLOR_ATTACHMENT0 - }; - glDrawBuffers(1, textureBuffer); - - glClearColor(0.0, 0.0, 0.0, 1.0); - glClear(GL_COLOR_BUFFER_BIT); - glViewport(0, 0, _resolution.x, _resolution.y);*/ - - ghoul::opengl::TextureUnit samplerUnit; - samplerUnit.activate(); - glBindTexture(GL_TEXTURE_2D, oglImageBuffer); - glBindSampler(samplerUnit.operator GLint(), _mMappingTMOBuffers._tmoHdrSampler); - - glGenerateMipmap(GL_TEXTURE_2D); - - _tmoProgram->activate(); - - _tmoProgram->setUniform(_tmoUniformCache.hdrSampler, samplerUnit); - _tmoProgram->setUniform(_tmoUniformCache.key, _tmoKey); - _tmoProgram->setUniform(_tmoUniformCache.Ywhite, _tmoYwhite); - _tmoProgram->setUniform(_tmoUniformCache.sat, _tmoSaturation); - - glBindVertexArray(_screenQuad); - glDrawArrays(GL_TRIANGLES, 0, 6); - - _tmoProgram->deactivate(); - - glBindVertexArray(0); - glBindSampler(oglImageBuffer, 0); + _hdrFilteringProgram->deactivate(); } void FramebufferRenderer::update() { @@ -1002,46 +433,6 @@ void FramebufferRenderer::update() { ); } - if (_aveLumProgram->isDirty()) { - _aveLumProgram->rebuildFromFile(); - } - - if (_bloomResolveProgram->isDirty()) { - _bloomResolveProgram->rebuildFromFile(); - ghoul::opengl::updateUniformLocations( - *_bloomResolveProgram, - _bloomUniformCache, - BloomUniformNames - ); - } - - if (_bloomProgram->isDirty()) { - _bloomProgram->rebuildFromFile(); - ghoul::opengl::updateUniformLocations( - *_bloomProgram, - _bloomFilterUniformCache, - BloomFilterUniformNames - ); - } - - if (_histoProgram->isDirty()) { - _histoProgram->rebuildFromFile(); - ghoul::opengl::updateUniformLocations( - *_histoProgram, - _histoUniformCache, - HistoUniformNames - ); - } - - //if (_histoApplyProgram->isDirty()) { - // _histoApplyProgram->rebuildFromFile(); - // /*ghoul::opengl::updateUniformLocations( - // *_histoApplyProgram, - // _histoApplyUniformCache, - // HistoApplyUniformNames - // );*/ - //} - if (_hdrFilteringProgram->isDirty()) { _hdrFilteringProgram->rebuildFromFile(); @@ -1052,15 +443,6 @@ void FramebufferRenderer::update() { ); } - if (_tmoProgram->isDirty()) { - _tmoProgram->rebuildFromFile(); - ghoul::opengl::updateUniformLocations( - *_tmoProgram, - _tmoUniformCache, - TMOUniformNames - ); - } - using K = VolumeRaycaster*; using V = std::unique_ptr; for (const std::pair& program : _exitPrograms) { @@ -1123,16 +505,6 @@ void FramebufferRenderer::updateResolution() { GL_TRUE ); - glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _gBuffers._filterTexture); - glTexImage2DMultisample( - GL_TEXTURE_2D_MULTISAMPLE, - _nAaSamples, - GL_RGBA32F, - _resolution.x, - _resolution.y, - GL_TRUE - ); - glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _gBuffers._positionTexture); glTexImage2DMultisample( GL_TEXTURE_2D_MULTISAMPLE, @@ -1193,92 +565,6 @@ void FramebufferRenderer::updateResolution() { glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - // Average Luminosity Computation Texture - glBindTexture(GL_TEXTURE_2D, _aLumBuffers._computeAveLumTexture); - glTexImage2D( - GL_TEXTURE_2D, - 0, - GL_RGBA32F, - 1, - 1, - 0, - GL_RGBA, - GL_FLOAT, - nullptr - ); - - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - - // Bloom Filter - for (int i = 0; i < 3; i++) { - glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _bloomBuffers._bloomTexture[i]); - glTexImage2DMultisample( - GL_TEXTURE_2D_MULTISAMPLE, - _nAaSamples, - GL_RGBA32F, - i ? _resolution.x : _resolution.y, - i ? _resolution.y : _resolution.x, - GL_TRUE - ); - } - - // Histogram Texture - glBindTexture(GL_TEXTURE_2D, _histoBuffers._histoTexture); - glTexImage2D( - GL_TEXTURE_2D, - 0, - GL_RGBA32F, - _numberOfBins, - 1, - - 0, - GL_RGBA, - GL_FLOAT, - nullptr - ); - - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - - glBindVertexArray(_histoBuffers._histoVao); - glBindBuffer(GL_ARRAY_BUFFER, _histoBuffers._histoVbo); - - _histoPoints.clear(); - _histoPoints.reserve(_resolution.x * _resolution.y); - for (int i = 0; i < _resolution.x * _resolution.y; ++i) { - _histoPoints.push_back(static_cast(i)); - } - - glBufferData( - GL_ARRAY_BUFFER, - sizeof(float) * _histoPoints.size(), - _histoPoints.data(), - GL_DYNAMIC_DRAW - ); - - glEnableVertexAttribArray(0); - glVertexAttribPointer(0, 1, GL_FLOAT, GL_FALSE, 0, nullptr); - - glBindVertexArray(0); - - // TMO via mipmapping - glBindTexture(GL_TEXTURE_2D, _mMappingTMOBuffers._tmoTexture); - glTexImage2D( - GL_TEXTURE_2D, - 0, - GL_SRGB8, - _resolution.x, - _resolution.y, - 0, - GL_RGB, - GL_UNSIGNED_BYTE, - nullptr - ); - - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - // Volume Rendering Textures glBindTexture(GL_TEXTURE_2D, _exitColorTexture); glTexImage2D( @@ -1439,65 +725,6 @@ void FramebufferRenderer::updateDeferredcastData() { _dirtyDeferredcastData = false; } -void FramebufferRenderer::updateAveLum() { - _aveLumProgram = ghoul::opengl::ProgramObject::Build( - "Computes Average Luminace on GPU", - absPath("${SHADERS}/framebuffer/computeAveLum.vert"), - absPath("${SHADERS}/framebuffer/computeAveLum.frag") - ); - using IgnoreError = ghoul::opengl::ProgramObject::IgnoreError; - //_aveLumProgram->setIgnoreSubroutineUniformLocationError(IgnoreError::Yes); - //_aveLumProgram->setIgnoreUniformLocationError(IgnoreError::Yes); -} - -void FramebufferRenderer::updateBloomConfig() { - _bloomProgram = ghoul::opengl::ProgramObject::Build( - "Appies the Bloom Filter", - absPath("${SHADERS}/framebuffer/bloomFilter.vert"), - absPath("${SHADERS}/framebuffer/bloomFilter.frag") - ); - using IgnoreError = ghoul::opengl::ProgramObject::IgnoreError; - //_bloomProgram->setIgnoreSubroutineUniformLocationError(IgnoreError::Yes); - //_bloomProgram->setIgnoreUniformLocationError(IgnoreError::Yes); - - _bloomResolveProgram = ghoul::opengl::ProgramObject::Build( - "Adds bloom to final image", - absPath("${SHADERS}/framebuffer/bloomResolveFilter.vert"), - absPath("${SHADERS}/framebuffer/bloomResolveFilter.frag") - ); - //_bloomResolveProgram->setIgnoreSubroutineUniformLocationError(IgnoreError::Yes); - //_bloomResolveProgram->setIgnoreUniformLocationError(IgnoreError::Yes); -} - -void FramebufferRenderer::updateHistogramConfig() { - _histoProgram = ghoul::opengl::ProgramObject::Build( - "Computes Histogram from Image", - absPath("${SHADERS}/framebuffer/computeHistogram_vs.glsl"), - absPath("${SHADERS}/framebuffer/computeHistogram_fs.glsl") - ); - using IgnoreError = ghoul::opengl::ProgramObject::IgnoreError; - //_histoProgram->setIgnoreSubroutineUniformLocationError(IgnoreError::Yes); - //_histoProgram->setIgnoreUniformLocationError(IgnoreError::Yes); - - /*_histoApplyProgram = ghoul::opengl::ProgramObject::Build( - "Applies histogram on the image", - absPath("${SHADERS}/framebuffer/applyHistogram.vert"), - absPath("${SHADERS}/framebuffer/applyHistogram.frag") - );*/ - //_histoApplyProgram->setIgnoreSubroutineUniformLocationError(IgnoreError::Yes); - //_histoApplyProgram->setIgnoreUniformLocationError(IgnoreError::Yes); -} - -void FramebufferRenderer::updateTMOViaMipMappingConfig() { - _tmoProgram = ghoul::opengl::ProgramObject::Build( - "Computes TMO via MipMapping", - absPath("${SHADERS}/framebuffer/computeTMO_vs.glsl"), - absPath("${SHADERS}/framebuffer/computeTMO_fs.glsl") - ); - using IgnoreError = ghoul::opengl::ProgramObject::IgnoreError; - //_tmoProgram ->setIgnoreSubroutineUniformLocationError(IgnoreError::Yes); - //_tmoProgram ->setIgnoreUniformLocationError(IgnoreError::Yes); -} void FramebufferRenderer::updateHDRAndFiltering() { _hdrFilteringProgram = ghoul::opengl::ProgramObject::Build( @@ -1835,7 +1062,16 @@ void FramebufferRenderer::updateMSAASamplingPattern() { } void FramebufferRenderer::render(Scene* scene, Camera* camera, float blackoutFactor) { - // Reset ping pong texture rendering + // Set OpenGL default rendering state + glGetIntegerv(GL_FRAMEBUFFER_BINDING, &_defaultFBO); + glEnablei(GL_BLEND, 0); + glDisablei(GL_BLEND, 1); + glDisablei(GL_BLEND, 2); + + glClampColor(GL_CLAMP_READ_COLOR, GL_FALSE); + + glEnable(GL_DEPTH_TEST); + _pingPongIndex = 0; // Measurements cache variable @@ -1852,13 +1088,9 @@ void FramebufferRenderer::render(Scene* scene, Camera* camera, float blackoutFac return; } - // Capture and Update the default OS GL state to the RenderEngine to be - // available to all renderables - captureAndSetOpenGLDefaultState(); - - // deferred g-buffer plus filter + // deferred g-buffer glBindFramebuffer(GL_FRAMEBUFFER, _gBuffers._framebuffer); - glDrawBuffers(4, ColorAttachment0123Array); + glDrawBuffers(3, ColorAttachment012Array); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); Time time = global::timeManager.time(); @@ -1906,7 +1138,7 @@ void FramebufferRenderer::render(Scene* scene, Camera* camera, float blackoutFac performDeferredTasks(tasks.deferredcasterTasks); } - glDrawBuffers(4, ColorAttachment0123Array); + glDrawBuffers(3, ColorAttachment012Array); data.renderBinMask = static_cast(Renderable::RenderBin::Overlay); scene->render(data, tasks); @@ -1915,36 +1147,14 @@ void FramebufferRenderer::render(Scene* scene, Camera* camera, float blackoutFac // Disabling depth test for filtering and hdr glDisable(GL_DEPTH_TEST); - - if (_bloomEnabled) { - std::unique_ptr perfInternal; - if (doPerformanceMeasurements) { - perfInternal = std::make_unique( - "FramebufferRenderer::render::applyBloomFilter" - ); - } - - // Results of the DeferredTasks as entry for the bloom filter - applyBloomFilter( - !tasks.deferredcasterTasks.empty() ? true : false - ); - } - + // When applying the TMO, the result is saved to the default FBO to be displayed // by the Operating System. Also, the resolve procedure is executed in this step. - glBindFramebuffer(GL_FRAMEBUFFER, _osDefaultGLState.defaultFBO); + glBindFramebuffer(GL_FRAMEBUFFER, _defaultFBO); glViewport(0, 0, _resolution.x, _resolution.y); // Apply the selected TMO on the results and resolve the result for the default FBO applyTMO(blackoutFactor); - - - //================================ - // Adjusting color and brightness - //================================ - // - //// Histogram Equalization - //computeImageHistogram(); } void FramebufferRenderer::performRaycasterTasks(const std::vector& tasks) { @@ -2146,14 +1356,6 @@ void FramebufferRenderer::setNAaSamples(int nAaSamples) { _dirtyMsaaSamplingPattern = true; } -void FramebufferRenderer::setBlurrinessLevel(int level) { - ghoul_assert( - level > 0 && nAaSamples < 4, - "Blurriness level has to be between 1 and 3" - ); - _blurrinessLevel = level; -} - void FramebufferRenderer::setHDRExposure(float hdrExposure) { ghoul_assert(hdrExposure > 0.f, "HDR exposure must be greater than zero"); _hdrExposure = hdrExposure; @@ -2166,7 +1368,7 @@ void FramebufferRenderer::setGamma(float gamma) { } void FramebufferRenderer::setMaxWhite(float maxWhite) { - ghoul_assert(gamma > 0.f, "Max White value must be greater than zero"); + ghoul_assert(maxWhite > 0.f, "Max White value must be greater than zero"); _maxWhite = maxWhite; } @@ -2174,24 +1376,6 @@ void FramebufferRenderer::setToneMapOperator(int tmOp) { _toneMapOperator = tmOp; } -void FramebufferRenderer::setBloomThreMin(float minV) { - _bloomThresholdMin = minV; - updateRendererData(); -} - -void FramebufferRenderer::setBloomThreMax(float maxV) { - _bloomThresholdMax = maxV; - updateRendererData(); -} - -void FramebufferRenderer::setBloomOrigFactor(float origFactor) { - _bloomOrigFactor = origFactor; -} - -void FramebufferRenderer::setBloomNewFactor(float newFactor) { - _bloomNewFactor = newFactor; -} - void FramebufferRenderer::setKey(float key) { _tmoKey = key; } @@ -2224,22 +1408,6 @@ void FramebufferRenderer::setColorSpace(unsigned int colorspace) { _colorSpace = colorspace; } -void FramebufferRenderer::enableBloom(bool enable) { - _bloomEnabled = enable; -} - -void FramebufferRenderer::enableAutomaticBloom(bool enable) { - _automaticBloomEnabled = enable; - if (_automaticBloomEnabled) { - _bloomEnabled = true; - } - updateRendererData(); -} - -void FramebufferRenderer::enableHistogram(bool enable) { - _histogramEnabled = enable; -} - int FramebufferRenderer::nAaSamples() const { return _nAaSamples; } @@ -2252,9 +1420,6 @@ void FramebufferRenderer::updateRendererData() { ghoul::Dictionary dict; dict.setValue("fragmentRendererPath", std::string(RenderFragmentShaderPath)); dict.setValue("hdrExposure", std::to_string(_hdrExposure)); - dict.setValue("automaticBloom", std::to_string(_automaticBloomEnabled)); - dict.setValue("bloom_thresh_min", std::to_string(_bloomThresholdMin)); - dict.setValue("bloom_thresh_max", std::to_string(_bloomThresholdMax)); _rendererData = dict; global::renderEngine.setRendererData(dict); } diff --git a/src/rendering/renderengine.cpp b/src/rendering/renderengine.cpp index 75c5b91ac0..43de3b9856 100644 --- a/src/rendering/renderengine.cpp +++ b/src/rendering/renderengine.cpp @@ -228,30 +228,6 @@ namespace { "Max value for white color [0.01-10.0] to be used by tone mapping operators." }; - constexpr openspace::properties::Property::PropertyInfo BloomThreshouldMinInfo = { - "BloomThreshouldMin", - "Bloom Threshould Min Value", - "Min value a pixel must have to be bloomed." - }; - - constexpr openspace::properties::Property::PropertyInfo BloomThreshouldMaxInfo = { - "BloomThreshouldMax", - "Bloom Threshould Max Value", - "Max value a pixel must have to be bloomed." - }; - - constexpr openspace::properties::Property::PropertyInfo BloomOrigColorFactorInfo = { - "BloomOrigColorFactor", - "Bloom Original Color Factor Value", - "Bloom Original Color Factor Value." - }; - - constexpr openspace::properties::Property::PropertyInfo BloomNewColorFactorInfo = { - "BloomNewColorFactor", - "Bloom New Color Factor Value", - "Bloom New Color Factor Value." - }; - constexpr openspace::properties::Property::PropertyInfo ToneMapOperatorInfo = { "ToneMapOperator", "ToneMap Operator", @@ -259,24 +235,6 @@ namespace { "pixels using a LDR distribution." }; - constexpr openspace::properties::Property::PropertyInfo EnableBloomInfo = { - "EnableBloom", - "Enable/Disable Bloom", - "Enable/Disable Bloom." - }; - - constexpr openspace::properties::Property::PropertyInfo AutomaticBloomInfo = { - "AutomaticBloom", - "Enable/Disable Automatic Bloom", - "Enable/Disable Automatic Bloom." - }; - - constexpr openspace::properties::Property::PropertyInfo BlurrinessLevelBloomInfo = { - "BlurrinessLevelBloom", - "Increase/Decrease Bloom Blurriness Level", - "Increase/Decrease Bloom Blurriness Level." - }; - constexpr openspace::properties::Property::PropertyInfo HueInfo = { "Hue", "Hue", @@ -301,12 +259,6 @@ namespace { "Lightness" }; - openspace::properties::PropertyOwner::PropertyOwnerInfo BloomInfo = { - "BloomOp", - "Bloom Options", - "" - }; - openspace::properties::PropertyOwner::PropertyOwnerInfo TMOInfo = { "ToneMappingOp", "Tone Mapping Options", @@ -357,14 +309,6 @@ RenderEngine::RenderEngine() , _disableMasterRendering(DisableMasterInfo, false) , _globalBlackOutFactor(GlobalBlackoutFactorInfo, 1.f, 0.f, 1.f) , _nAaSamples(AaSamplesInfo, 4, 1, 8) - , _bloomOwner(BloomInfo) - , _enableBloom(EnableBloomInfo, false) - , _automaticBloom(AutomaticBloomInfo, false) - , _bloomBlurrinessLevel(BlurrinessLevelBloomInfo, 1, 1, 3) - , _bloomThreshouldMin(BloomThreshouldMinInfo, 0.5, 0.0, 100.0) - , _bloomThreshouldMax(BloomThreshouldMaxInfo, 1.0, 0.0, 100.0) - , _bloomOrigColorFactor(BloomOrigColorFactorInfo, 1.0, 0.0, 100.0) - , _bloomNewColorFactor(BloomNewColorFactorInfo, 1.0, 0.0, 100.0) , _tmoOwner(TMOInfo) , _hdrExposure(HDRExposureInfo, 1.68f, 0.01f, 10.0f) , _maxWhite(MaxWhiteInfo, 4.f, 0.001f, 100.0f) @@ -534,59 +478,6 @@ RenderEngine::RenderEngine() //this->addPropertySubOwner(_imageOwner); - _enableBloom.onChange([this]() { - if (_renderer) { - _renderer->enableBloom(_enableBloom); - } - }); - - addProperty(_enableBloom); - - _automaticBloom.onChange([this]() { - if (_renderer) { - _renderer->enableAutomaticBloom(_automaticBloom); - _renderer->enableBloom(_automaticBloom); - } - }); - addProperty(_automaticBloom); - - _bloomBlurrinessLevel.onChange([this]() { - if (_renderer) { - _renderer->setBlurrinessLevel(_bloomBlurrinessLevel); - } - }); - addProperty(_bloomBlurrinessLevel); - - addProperty(_bloomThreshouldMin); - _bloomThreshouldMin.onChange([this]() { - if (_renderer) { - _renderer->setBloomThreMin(_bloomThreshouldMin); - } - }); - - addProperty(_bloomThreshouldMax); - _bloomThreshouldMax.onChange([this]() { - if (_renderer) { - _renderer->setBloomThreMax(_bloomThreshouldMax); - } - }); - - addProperty(_bloomOrigColorFactor); - _bloomOrigColorFactor.onChange([this]() { - if (_renderer) { - _renderer->setBloomOrigFactor(_bloomOrigColorFactor); - } - }); - - addProperty(_bloomNewColorFactor); - _bloomNewColorFactor.onChange([this]() { - if (_renderer) { - _renderer->setBloomNewFactor(_bloomNewColorFactor); - } - }); - - //this->addPropertySubOwner(_bloomOwner); - addProperty(_globalBlackOutFactor); addProperty(_applyWarping); @@ -1283,14 +1174,6 @@ scripting::LuaLibrary RenderEngine::luaLibrary() { }; } -const RenderEngine::GLDefaultState& RenderEngine::glDefaultState() const { - return _glDefaultState; -} - -void RenderEngine::setGLDefaultState(RenderEngine::GLDefaultState glDS) { - _glDefaultState = std::move(glDS); -} - void RenderEngine::addScreenSpaceRenderable(std::unique_ptr s) { const std::string identifier = s->identifier(); From 20d24764e7aaa0183bf05e508ed82e6a26328445 Mon Sep 17 00:00:00 2001 From: Jonathas Costa Date: Mon, 22 Jul 2019 16:05:00 -0400 Subject: [PATCH 23/39] Cleaned code and removed unused features. --- .../openspace/rendering/framebufferrenderer.h | 8 +-- include/openspace/rendering/renderengine.h | 3 -- include/openspace/rendering/renderer.h | 3 -- shaders/framebuffer/hdrAndFiltering.frag | 49 +----------------- shaders/hdr.glsl | 5 +- src/rendering/framebufferrenderer.cpp | 20 +------- src/rendering/renderengine.cpp | 51 ------------------- 7 files changed, 5 insertions(+), 134 deletions(-) diff --git a/include/openspace/rendering/framebufferrenderer.h b/include/openspace/rendering/framebufferrenderer.h index f66adc94e6..fa7b7e1756 100644 --- a/include/openspace/rendering/framebufferrenderer.h +++ b/include/openspace/rendering/framebufferrenderer.h @@ -136,9 +136,6 @@ public: void setGamma(float gamma) override; void setMaxWhite(float maxWhite) override; void setToneMapOperator(int tmOp) override; - void setKey(float key) override; - void setYwhite(float white) override; - void setTmoSaturation(float sat) override; void setHue(float hue) override; void setValue(float value) override; void setSaturation(float sat) override; @@ -184,7 +181,7 @@ private: UniformCache(mainColorTexture, blackoutFactor, nAaSamples) _uniformCache; UniformCache(hdrFeedingTexture, blackoutFactor, hdrExposure, gamma, - toneMapOperator, aveLum, maxWhite, Hue, Saturation, Value, + toneMapOperator, maxWhite, Hue, Saturation, Value, Lightness, colorSpace, nAaSamples) _hdrUniformCache; GLint _defaultFBO; @@ -212,9 +209,6 @@ private: float _maxWhite = 5.0f; int _toneMapOperator = 8; bool _histogramEnabled = false; - float _tmoKey = 0.18f; - float _tmoYwhite = 1e6f; - float _tmoSaturation = 1.0f; float _hue = 1.f; float _saturation = 1.2f; float _value = 1.f; diff --git a/include/openspace/rendering/renderengine.h b/include/openspace/rendering/renderengine.h index b5f59212d2..c9617a9c4b 100644 --- a/include/openspace/rendering/renderengine.h +++ b/include/openspace/rendering/renderengine.h @@ -222,9 +222,6 @@ private: properties::FloatProperty _hdrExposure; properties::FloatProperty _maxWhite; properties::OptionProperty _toneMapOperator; - properties::FloatProperty _tmoKey; - properties::FloatProperty _tmoYwhite; - properties::FloatProperty _tmoSaturation; properties::PropertyOwner _imageOwner; properties::FloatProperty _gamma; diff --git a/include/openspace/rendering/renderer.h b/include/openspace/rendering/renderer.h index b9907c1dcb..92f2857428 100644 --- a/include/openspace/rendering/renderer.h +++ b/include/openspace/rendering/renderer.h @@ -54,9 +54,6 @@ public: virtual void setGamma(float gamma) = 0; virtual void setMaxWhite(float maxWhite) = 0; virtual void setToneMapOperator(int tmOp) = 0; - virtual void setKey(float key) = 0; - virtual void setYwhite(float white) = 0; - virtual void setTmoSaturation(float sat) = 0; virtual void setHue(float hue) = 0; virtual void setValue(float value) = 0; virtual void setSaturation(float sat) = 0; diff --git a/shaders/framebuffer/hdrAndFiltering.frag b/shaders/framebuffer/hdrAndFiltering.frag index b05f4a31e9..8f5bbdf8c2 100644 --- a/shaders/framebuffer/hdrAndFiltering.frag +++ b/shaders/framebuffer/hdrAndFiltering.frag @@ -36,7 +36,6 @@ uniform float hdrExposure; uniform float blackoutFactor; uniform float gamma; uniform float maxWhite; -uniform float aveLum; uniform float Hue; uniform float Saturation; uniform float Value; @@ -45,52 +44,10 @@ uniform int toneMapOperator; uniform uint colorSpace; uniform int nAaSamples; -//uniform sampler2D hdrFeedingTexture; uniform sampler2DMS hdrFeedingTexture; in vec2 texCoord; -// JCC: Change the next function to work with a MSAA texture -vec4 adaptiveToneMap() { - // int i; - // float lum[25]; - // // Non MSAAA variant: - // //vec2 tex_scale = vec2(1.0) / textureSize(hdrFeedingTexture, 0); - // vec2 tex_scale = vec2(1.0) / textureSize(hdrFeedingTexture); - - // for (i = 0; i < 25; i++) - // { - // vec2 tc = (gl_FragCoord.xy + 3.5 * vec2(i % 5 - 2, i / 5 - 2)); - // vec3 col = texture(hdrFeedingTexture, tc * tex_scale).rgb; - // lum[i] = dot(col, vec3(0.3, 0.59, 0.11)); - // } - - // // Calculate weighted color of region - // vec3 vColor = texelFetch(hdrFeedingTexture, ivec2(gl_FragCoord.xy), 0).rgb; - - // float kernelLuminance = ( - // (1.0 * (lum[0] + lum[4] + lum[20] + lum[24])) + - // (4.0 * (lum[1] + lum[3] + lum[5] + lum[9] + - // lum[15] + lum[19] + lum[21] + lum[23])) + - // (7.0 * (lum[2] + lum[10] + lum[14] + lum[22])) + - // (16.0 * (lum[6] + lum[8] + lum[16] + lum[18])) + - // (26.0 * (lum[7] + lum[11] + lum[13] + lum[17])) + - // (41.0 * lum[12]) - // ) / 273.0; - - // // Compute the corresponding exposure - // float exposure = sqrt(8.0 / (kernelLuminance + 0.25)); - - // // Apply the exposure to this texel - // vec4 fColor; - // fColor.rgb = 1.0 - exp2(-vColor * exposure); - // fColor.a = 1.0f; - - // return fColor; - return vec4(1.0, 0.0, 0.0, 1.0); -} - - void main() { vec4 color = vec4(0.0); @@ -104,7 +61,7 @@ void main() { vec3 tColor = vec3(0.0); if (toneMapOperator == EXPONENTIAL) { - tColor = exponentialToneMapping(color.rgb, hdrExposure, gamma); + tColor = exponentialToneMapping(color.rgb, hdrExposure, gamma); } else if (toneMapOperator == LINEAR) { tColor = linearToneMapping(color.rgb, hdrExposure); } else if (toneMapOperator == SIMPLE_REINHARD) { @@ -121,10 +78,6 @@ void main() { tColor = Uncharted2ToneMapping(color.rgb, hdrExposure); } else if (toneMapOperator == COSTA) { tColor = jToneMapping(color.rgb, hdrExposure); - } else if (toneMapOperator == ADAPTIVE) { - tColor = vec3(adaptiveToneMap()); - } else if (toneMapOperator == GLOBAL) { - tColor = globalToneMappingOperatorRTR(color.rgb, hdrExposure, maxWhite, aveLum); } else if (toneMapOperator == PHOTOGRAPHIC_REINHARD) { tColor = photographicReinhardToneMapping(color.rgb); } diff --git a/shaders/hdr.glsl b/shaders/hdr.glsl index 846893b404..8f3f11f55d 100644 --- a/shaders/hdr.glsl +++ b/shaders/hdr.glsl @@ -32,10 +32,7 @@ #define FILMIC 6 #define UNCHARTED 7 #define COSTA 8 -#define ADAPTIVE 9 -#define GLOBAL 10 -#define PHOTOGRAPHIC_REINHARD 11 -#define MIPMAPPING 12 +#define PHOTOGRAPHIC_REINHARD 9 const float HCV_EPSILON = 1e-10; const float HSL_EPSILON = 1e-10; diff --git a/src/rendering/framebufferrenderer.cpp b/src/rendering/framebufferrenderer.cpp index d0bf66baf8..780841a0f4 100644 --- a/src/rendering/framebufferrenderer.cpp +++ b/src/rendering/framebufferrenderer.cpp @@ -54,16 +54,12 @@ namespace { "mainColorTexture", "blackoutFactor", "nAaSamples" }; - constexpr const std::array HDRUniformNames = { + constexpr const std::array HDRUniformNames = { "hdrFeedingTexture", "blackoutFactor", "hdrExposure", "gamma", - "toneMapOperator", "aveLum", "maxWhite", "Hue", "Saturation", "Value", + "toneMapOperator", "maxWhite", "Hue", "Saturation", "Value", "Lightness", "colorSpace", "nAaSamples" }; - constexpr const std::array TMOUniformNames = { - "hdrSampler", "key", "Ywhite", "sat" - }; - constexpr const char* ExitFragmentShaderPath = "${SHADERS}/framebuffer/exitframebuffer.frag"; constexpr const char* RaycastFragmentShaderPath = @@ -1376,18 +1372,6 @@ void FramebufferRenderer::setToneMapOperator(int tmOp) { _toneMapOperator = tmOp; } -void FramebufferRenderer::setKey(float key) { - _tmoKey = key; -} - -void FramebufferRenderer::setYwhite(float white) { - _tmoYwhite = white; -} - -void FramebufferRenderer::setTmoSaturation(float sat) { - _tmoSaturation = sat; -} - void FramebufferRenderer::setHue(float hue) { _hue = hue; } diff --git a/src/rendering/renderengine.cpp b/src/rendering/renderengine.cpp index 43de3b9856..1ab0cf6be0 100644 --- a/src/rendering/renderengine.cpp +++ b/src/rendering/renderengine.cpp @@ -197,24 +197,6 @@ namespace { "equivalent of an electronic image sensor." }; - constexpr openspace::properties::Property::PropertyInfo TMOSaturationInfo = { - "TMOSaturation", - "TMO Saturation", - "TMO Saturation" - }; - - constexpr openspace::properties::Property::PropertyInfo TMOYWhiteInfo = { - "TMOYWhite", - "Ywhite", - "Ywhite" - }; - - constexpr openspace::properties::Property::PropertyInfo TMOKeyInfo = { - "TMOKey", - "Key", - "Key" - }; - constexpr openspace::properties::Property::PropertyInfo GammaInfo = { "Gamma", "Gamma Correction", @@ -313,9 +295,6 @@ RenderEngine::RenderEngine() , _hdrExposure(HDRExposureInfo, 1.68f, 0.01f, 10.0f) , _maxWhite(MaxWhiteInfo, 4.f, 0.001f, 100.0f) , _toneMapOperator(ToneMapOperatorInfo, properties::OptionProperty::DisplayType::Dropdown) - , _tmoKey(TMOKeyInfo, 0.18f, 0.0f, 1.0f) - , _tmoYwhite(TMOYWhiteInfo, 1e6f, 0.0f, 1e10f) - , _tmoSaturation(TMOSaturationInfo, 1.f, 0.0f, 1.0f) , _imageOwner(ImageInfo) , _gamma(GammaInfo, 0.86f, 0.01f, 5.0f) , _hue(HueInfo, 1.f, 0.0f, 5.0f) @@ -385,10 +364,7 @@ RenderEngine::RenderEngine() _toneMapOperator.addOption(static_cast(ToneMapOperators::FILMIC), "Filmic"); _toneMapOperator.addOption(static_cast(ToneMapOperators::UNCHARTED), "Uncharted 2"); _toneMapOperator.addOption(static_cast(ToneMapOperators::COSTA), "Costa"); - _toneMapOperator.addOption(static_cast(ToneMapOperators::ADAPTIVE), "Adaptive"); - _toneMapOperator.addOption(static_cast(ToneMapOperators::GLOBAL), "Global"); _toneMapOperator.addOption(static_cast(ToneMapOperators::PHOTOGRAPHIC_REINHARD), "Photographic Reinhard"); - _toneMapOperator.addOption(static_cast(ToneMapOperators::MIPMAPPING), "MipMapping Global/Local Reinhard"); _toneMapOperator.set(8); _toneMapOperator.onChange([this]() { @@ -399,33 +375,6 @@ RenderEngine::RenderEngine() addProperty(_toneMapOperator); - _tmoKey.onChange([this]() { - if (_renderer) { - _renderer->setKey(_tmoKey); - } - }); - - addProperty(_tmoKey); - - _tmoYwhite.onChange([this]() { - if (_renderer) { - _renderer->setYwhite(_tmoYwhite); - } - }); - - addProperty(_tmoYwhite); - - _tmoSaturation.onChange([this]() { - if (_renderer) { - _renderer->setTmoSaturation(_tmoSaturation); - } - }); - - addProperty(_tmoSaturation); - - //this->addPropertySubOwner(_tmoOwner); - - _gamma.onChange([this]() { if (_renderer) { _renderer->setGamma(_gamma); From a6b90991b234f2934e053467fd20af3a4ce899f0 Mon Sep 17 00:00:00 2001 From: Jonathas Costa Date: Mon, 22 Jul 2019 16:47:58 -0400 Subject: [PATCH 24/39] Merging Master --- .gitmodules | 6 +- CMakeLists.txt | 5 + apps/OpenSpace-MinVR/CMakeLists.txt | 2 +- apps/OpenSpace-MinVR/main.cpp | 17 +- apps/OpenSpace/main.cpp | 88 ++-- apps/Wormhole/main.cpp | 57 +- data/assets/apollo8.scene | 21 +- data/assets/apollo_sites.scene | 34 +- data/assets/dawn.scene | 3 +- data/assets/examples/basic.scene | 16 +- data/assets/gaia.scene | 3 +- data/assets/insight.scene | 7 +- data/assets/juno.scene | 7 +- data/assets/messenger.scene | 7 +- data/assets/newhorizons.scene | 9 +- data/assets/osirisrex.scene | 5 +- data/assets/rosetta.scene | 7 +- .../gaia/gaia_dr2_download_stars.asset | 15 +- .../solarsystem/interstellar/oumuamua.asset | 3 +- .../solarsystem/missions/apollo/a11_lem.asset | 4 +- .../solarsystem/missions/apollo/a17_lem.asset | 1 + .../missions/apollo/apollo11.asset | 188 ++++--- .../apollo/apollo_globebrowsing.asset | 16 +- .../missions/apollo/bouldersstation2.asset | 12 +- .../missions/apollo/bouldersstation6.asset | 12 +- .../missions/apollo/bouldersstation7.asset | 4 +- .../missions/apollo/lem_model.asset | 2 +- .../solarsystem/missions/dawn/vesta.asset | 2 +- .../planets/jupiter/minor/carpo_group.asset | 2 +- .../solarsystem/sssb/tesla_roadster.asset | 3 +- data/assets/util/asset_helper.asset | 24 + data/assets/util/webgui.asset | 52 +- data/assets/voyager.scene | 6 +- include/openspace/interaction/interpolator.h | 2 +- .../openspace/interaction/navigationhandler.h | 51 +- .../openspace/interaction/orbitalnavigator.h | 11 +- .../openspace/interaction/sessionrecording.h | 1 - .../rendering/screenspacerenderable.h | 6 +- include/openspace/util/time.h | 2 +- include/openspace/util/timeline.h | 11 +- include/openspace/util/timeline.inl | 24 +- modules/base/CMakeLists.txt | 13 +- modules/base/basemodule.cpp | 7 + .../base/dashboard/dashboarditemframerate.cpp | 2 +- .../rendering/renderabletrailtrajectory.cpp | 4 +- .../base/rendering/screenspacedashboard.cpp | 1 - .../base/rendering/screenspaceframebuffer.cpp | 16 +- .../base/rendering/screenspaceimagelocal.cpp | 29 +- modules/base/shaders/screenspace_fs.glsl | 2 - modules/cefwebgui/cefwebguimodule.cpp | 16 +- modules/cefwebgui/cefwebguimodule.h | 4 + modules/cefwebgui/include/guirenderhandler.h | 4 +- modules/cefwebgui/shaders/gui_vs.glsl | 3 +- .../rendering/renderablebillboardscloud.cpp | 1 - .../rendering/renderabledumeshes.cpp | 17 +- .../rendering/renderableplanescloud.cpp | 2 +- .../renderablefieldlinessequence.cpp | 2 +- modules/globebrowsing/CMakeLists.txt | 5 + modules/globebrowsing/globebrowsingmodule.cpp | 250 +++++---- modules/globebrowsing/globebrowsingmodule.h | 52 +- .../globebrowsing/globebrowsingmodule_lua.inl | 82 ++- .../src/dashboarditemglobelocation.cpp | 9 +- .../src/globelabelscomponent.cpp | 18 +- .../globebrowsing/src/globetranslation.cpp | 110 ++-- modules/globebrowsing/src/globetranslation.h | 4 +- modules/globebrowsing/src/layer.cpp | 7 +- modules/globebrowsing/src/layer.h | 3 +- modules/globebrowsing/src/layergroup.cpp | 7 +- modules/globebrowsing/src/layergroup.h | 3 +- modules/globebrowsing/src/layermanager.cpp | 6 +- modules/globebrowsing/src/layermanager.h | 3 +- modules/globebrowsing/src/renderableglobe.cpp | 26 +- modules/globebrowsing/src/renderableglobe.h | 4 + modules/globebrowsing/src/tileprovider.cpp | 16 +- modules/globebrowsing/src/tileprovider.h | 4 +- modules/imgui/src/gui.cpp | 76 ++- modules/server/src/topics/luascripttopic.cpp | 19 +- .../server/src/topics/setpropertytopic.cpp | 24 +- modules/server/src/topics/timetopic.cpp | 1 - modules/space/rendering/renderablestars.cpp | 2 - modules/space/rendering/renderablestars.h | 1 - .../space/translation/horizonstranslation.cpp | 2 +- modules/sync/CMakeLists.txt | 46 -- modules/sync/ext/libtorrent | 1 - modules/sync/syncmodule.cpp | 30 +- modules/sync/syncmodule.h | 12 - modules/sync/syncs/torrentsynchronization.cpp | 197 ------- modules/sync/syncs/torrentsynchronization.h | 77 --- modules/sync/torrentclient.cpp | 271 ---------- modules/sync/torrentclient.h | 125 ----- .../rendering/renderabletimevaryingvolume.cpp | 2 +- .../volume/tasks/generaterawvolumetask.cpp | 3 - modules/volume/transferfunctionhandler.cpp | 6 - modules/webbrowser/include/eventhandler.h | 4 +- .../webbrowser/include/screenspacebrowser.h | 15 +- modules/webbrowser/src/eventhandler.cpp | 2 +- modules/webbrowser/src/screenspacebrowser.cpp | 47 +- modules/webbrowser/src/webbrowserapp.cpp | 3 +- modules/webbrowser/src/webrenderhandler.cpp | 11 +- modules/webbrowser/webbrowsermodule.cpp | 2 +- modules/webgui/webguimodule.cpp | 140 ++++- modules/webgui/webguimodule.h | 18 +- recordings/apollo8 | Bin 5994 -> 0 bytes src/documentation/core_registration.cpp | 3 + src/engine/openspaceengine.cpp | 3 - src/interaction/navigationhandler.cpp | 486 +++++++++++++----- src/interaction/navigationhandler_lua.inl | 50 +- src/interaction/orbitalnavigator.cpp | 36 +- src/interaction/sessionrecording.cpp | 2 +- src/interaction/touchbar.mm | 103 ++-- src/network/parallelpeer.cpp | 2 +- src/openspace.cpp | 2 +- src/performance/performancemanager.cpp | 3 +- src/rendering/dashboard_lua.inl | 8 +- src/rendering/renderengine.cpp | 84 ++- src/rendering/screenspacerenderable.cpp | 18 +- src/scene/scenegraphnode.cpp | 16 +- src/util/time_lua.inl | 8 +- src/util/timemanager.cpp | 31 +- 119 files changed, 1812 insertions(+), 1660 deletions(-) delete mode 160000 modules/sync/ext/libtorrent delete mode 100644 modules/sync/syncs/torrentsynchronization.cpp delete mode 100644 modules/sync/syncs/torrentsynchronization.h delete mode 100644 modules/sync/torrentclient.cpp delete mode 100644 modules/sync/torrentclient.h delete mode 100644 recordings/apollo8 diff --git a/.gitmodules b/.gitmodules index 4311e7851a..3e4cfb738b 100644 --- a/.gitmodules +++ b/.gitmodules @@ -10,9 +10,6 @@ [submodule "modules/touch/ext/libTUIO11"] path = modules/touch/ext/libTUIO11 url = https://github.com/mkalten/TUIO11_CPP -[submodule "modules/sync/ext/libtorrent"] - path = modules/sync/ext/libtorrent - url = https://github.com/OpenSpace/libtorrent.git [submodule "apps/OpenSpace-MinVR/ext/minvr"] path = apps/OpenSpace-MinVR/ext/minvr url = https://github.com/OpenSpace/minvr @@ -26,3 +23,6 @@ [submodule "modules/fitsfilereader/ext/cfitsio"] path = modules/fitsfilereader/ext/cfitsio url = https://github.com/OpenSpace/cfitsio.git +[submodule "apps/OpenSpace-MinVR/ext/glfw"] + path = apps/OpenSpace-MinVR/ext/glfw + url = https://github.com/opensgct/glfw diff --git a/CMakeLists.txt b/CMakeLists.txt index dc5a7104df..724729bcad 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -285,6 +285,11 @@ if (OPENSPACE_WITH_ABUFFER_RENDERER) target_compile_definitions(openspace-core PUBLIC "OPENSPACE_WITH_ABUFFER_RENDERER") endif () +option(OPENSPACE_WITH_INSTRUMENTATION "Add instrumentation options" OFF) +if (OPENSPACE_WITH_INSTRUMENTATION) + target_compile_definitions(openspace-core PUBLIC "OPENSPACE_WITH_INSTRUMENTATION") +endif () + # Just in case, create the bin directory add_custom_command( diff --git a/apps/OpenSpace-MinVR/CMakeLists.txt b/apps/OpenSpace-MinVR/CMakeLists.txt index 656da9b194..f58a2a13cc 100644 --- a/apps/OpenSpace-MinVR/CMakeLists.txt +++ b/apps/OpenSpace-MinVR/CMakeLists.txt @@ -50,7 +50,7 @@ target_include_directories(OpenSpace-MinVR PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/ex target_include_directories(OpenSpace-MinVR PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/ext/minvr/external/GLFW/src/include) -target_link_libraries(OpenSpace-MinVR libOpenSpace MinVR) +target_link_libraries(OpenSpace-MinVR openspace-core MinVR) # Web Browser and Web gui # Why not put these in the module's path? Because they do not have access to the diff --git a/apps/OpenSpace-MinVR/main.cpp b/apps/OpenSpace-MinVR/main.cpp index b4cde8364e..1b309b4b8d 100644 --- a/apps/OpenSpace-MinVR/main.cpp +++ b/apps/OpenSpace-MinVR/main.cpp @@ -200,7 +200,14 @@ void Handler::onVREvent(const VRDataIndex& eventData) { if (button == MouseButton::Right && action == MouseAction::Press) { windowingGlobals.mouseButtons |= 1 << 2; } - global::openSpaceEngine.mouseButtonCallback(button, action); + + using KM = KeyModifier; + KM mod = KM::NoModifier; + mod |= keyboardState.modifierShift ? KM::Shift : KM::NoModifier; + mod |= keyboardState.modifierCtrl ? KM::Control : KM::NoModifier; + mod |= keyboardState.modifierAlt ? KM::Alt : KM::NoModifier; + + global::openSpaceEngine.mouseButtonCallback(button, action, mod); } } @@ -341,6 +348,14 @@ int main(int argc, char** argv) { ghoul::initialize(); + // Register the path of the executable, + // to make it possible to find other files in the same directory. + FileSys.registerPathToken( + "${BIN}", + ghoul::filesystem::File(absPath(argv[0])).directoryName(), + ghoul::filesystem::FileSystem::Override::Yes + ); + // Create the OpenSpace engine and get arguments for the SGCT engine std::string windowConfiguration; try { diff --git a/apps/OpenSpace/main.cpp b/apps/OpenSpace/main.cpp index ff713b447a..e77ce29331 100644 --- a/apps/OpenSpace/main.cpp +++ b/apps/OpenSpace/main.cpp @@ -76,6 +76,8 @@ constexpr const bool EnableDetailedVtune = false; #include "nvToolsExt.h" #endif // OPENSPACE_HAS_NVTOOLS +using namespace openspace; + namespace { constexpr const char* _loggerCat = "main"; @@ -157,9 +159,9 @@ LONG WINAPI generateMiniDump(EXCEPTION_POINTERS* exceptionPointers) { std::string dumpFile = fmt::format( "OpenSpace_{}_{}_{}-{}-{}-{}-{}-{}-{}--{}--{}.dmp", - openspace::OPENSPACE_VERSION_MAJOR, - openspace::OPENSPACE_VERSION_MINOR, - openspace::OPENSPACE_VERSION_PATCH, + OPENSPACE_VERSION_MAJOR, + OPENSPACE_VERSION_MINOR, + OPENSPACE_VERSION_PATCH, stLocalTime.wYear, stLocalTime.wMonth, stLocalTime.wDay, @@ -260,7 +262,7 @@ void mainInitFunc() { LTRACE("main::mainInitFunc(begin)"); LDEBUG("Initializing OpenSpace Engine started"); - openspace::global::openSpaceEngine.initialize(); + global::openSpaceEngine.initialize(); LDEBUG("Initializing OpenSpace Engine finished"); { @@ -287,7 +289,7 @@ void mainInitFunc() { LDEBUG("Initializing OpenGL in OpenSpace Engine started"); - openspace::global::openSpaceEngine.initializeGL(); + global::openSpaceEngine.initializeGL(); LDEBUG("Initializing OpenGL in OpenSpace Engine finished"); @@ -366,7 +368,7 @@ void mainInitFunc() { // std::string screenshotPath = "${SCREENSHOTS}"; - if (openspace::global::configuration.shouldUseScreenshotDate) { + if (global::configuration.shouldUseScreenshotDate) { std::time_t now = std::time(nullptr); std::tm* nowTime = std::localtime(&now); char mbstr[128]; @@ -412,13 +414,13 @@ void mainPreSyncFunc() { #endif // OPENSPACE_HAS_VTUNE LTRACE("main::mainPreSyncFunc(begin)"); - openspace::global::openSpaceEngine.preSynchronization(); + global::openSpaceEngine.preSynchronization(); // Query joystick status - using namespace openspace::interaction; + using namespace interaction; for (int i = GLFW_JOYSTICK_1; i <= GLFW_JOYSTICK_LAST; ++i) { - JoystickInputState& state = openspace::global::joystickInputStates[i]; + JoystickInputState& state = global::joystickInputStates[i]; int present = glfwJoystickPresent(i); if (present == GLFW_FALSE) { @@ -511,7 +513,7 @@ void mainPostSyncPreDrawFunc() { #endif // OPENSPACE_HAS_NVTOOLS LTRACE("main::postSynchronizationPreDraw(begin)"); - openspace::global::openSpaceEngine.postSynchronizationPreDraw(); + global::openSpaceEngine.postSynchronizationPreDraw(); #ifdef OPENVR_SUPPORT if (FirstOpenVRWindow) { @@ -559,7 +561,7 @@ void mainRenderFunc() { #endif try { - openspace::global::openSpaceEngine.render( + global::openSpaceEngine.render( SgctEngine->getModelMatrix(), viewMatrix, projectionMatrix @@ -591,7 +593,7 @@ void mainDraw2DFunc() { LTRACE("main::mainDraw2DFunc(begin)"); try { - openspace::global::openSpaceEngine.drawOverlays(); + global::openSpaceEngine.drawOverlays(); } catch (const ghoul::RuntimeError& e) { LERRORC(e.component, e.message); @@ -627,7 +629,7 @@ void mainPostDrawFunc() { } #endif // OPENVR_SUPPORT - openspace::global::openSpaceEngine.postDraw(); + global::openSpaceEngine.postDraw(); #ifdef OPENSPACE_HAS_SPOUT for (const SpoutWindow& w : SpoutWindows) { @@ -667,7 +669,7 @@ void mainPostDrawFunc() { -void mainKeyboardCallback(int key, int, int action, int mods) { +void mainKeyboardCallback(int key, int, int action, int modifiers) { #ifdef OPENSPACE_HAS_VTUNE if (EnableDetailedVtune) { __itt_frame_begin_v3(_vTune.keyboard, nullptr); @@ -675,11 +677,10 @@ void mainKeyboardCallback(int key, int, int action, int mods) { #endif // OPENSPACE_HAS_VTUNE LTRACE("main::mainKeyboardCallback(begin)"); - openspace::global::openSpaceEngine.keyboardCallback( - openspace::Key(key), - openspace::KeyModifier(mods), - openspace::KeyAction(action) - ); + const Key k = Key(key); + const KeyModifier m = KeyModifier(modifiers); + const KeyAction a = KeyAction(action); + global::openSpaceEngine.keyboardCallback(k, m, a); LTRACE("main::mainKeyboardCallback(begin)"); #ifdef OPENSPACE_HAS_VTUNE @@ -699,11 +700,10 @@ void mainMouseButtonCallback(int key, int action, int modifiers) { #endif // OPENSPACE_HAS_VTUNE LTRACE("main::mainMouseButtonCallback(begin)"); - openspace::global::openSpaceEngine.mouseButtonCallback( - openspace::MouseButton(key), - openspace::MouseAction(action), - openspace::KeyModifier(modifiers) - ); + const MouseButton k = MouseButton(key); + const MouseAction a = MouseAction(action); + const KeyModifier m = KeyModifier(modifiers); + global::openSpaceEngine.mouseButtonCallback(k, a, m); LTRACE("main::mainMouseButtonCallback(end)"); #ifdef OPENSPACE_HAS_VTUNE @@ -722,7 +722,7 @@ void mainMousePosCallback(double x, double y) { } #endif // OPENSPACE_HAS_VTUNE - openspace::global::openSpaceEngine.mousePositionCallback(x, y); + global::openSpaceEngine.mousePositionCallback(x, y); #ifdef OPENSPACE_HAS_VTUNE if (EnableDetailedVtune) { @@ -741,7 +741,7 @@ void mainMouseScrollCallback(double posX, double posY) { #endif // OPENSPACE_HAS_VTUNE LTRACE("main::mainMouseScrollCallback(begin"); - openspace::global::openSpaceEngine.mouseScrollWheelCallback(posX, posY); + global::openSpaceEngine.mouseScrollWheelCallback(posX, posY); LTRACE("main::mainMouseScrollCallback(end)"); #ifdef OPENSPACE_HAS_VTUNE @@ -753,17 +753,15 @@ void mainMouseScrollCallback(double posX, double posY) { -void mainCharCallback(unsigned int codepoint, int mods) { +void mainCharCallback(unsigned int codepoint, int modifiers) { #ifdef OPENSPACE_HAS_VTUNE if (EnableDetailedVtune) { __itt_frame_begin_v3(_vTune.character, nullptr); } #endif // OPENSPACE_HAS_VTUNE - openspace::global::openSpaceEngine.charCallback( - codepoint, - openspace::KeyModifier(mods) - ); + const KeyModifier m = KeyModifier(modifiers); + global::openSpaceEngine.charCallback(codepoint, m); #ifdef OPENSPACE_HAS_VTUNE if (EnableDetailedVtune) { @@ -782,7 +780,7 @@ void mainEncodeFun() { #endif // OPENSPACE_HAS_VTUNE LTRACE("main::mainEncodeFun(begin)"); - std::vector data = openspace::global::openSpaceEngine.encode(); + std::vector data = global::openSpaceEngine.encode(); _synchronizationBuffer.setVal(std::move(data)); sgct::SharedData::instance()->writeVector(&_synchronizationBuffer); @@ -806,7 +804,7 @@ void mainDecodeFun() { sgct::SharedData::instance()->readVector(&_synchronizationBuffer); std::vector data = _synchronizationBuffer.getVal(); - openspace::global::openSpaceEngine.decode(std::move(data)); + global::openSpaceEngine.decode(std::move(data)); LTRACE("main::mainDecodeFun(end)"); #ifdef OPENSPACE_HAS_VTUNE @@ -833,7 +831,7 @@ void mainLogCallback(const char* msg) { void setSgctDelegateFunctions() { - openspace::WindowDelegate& sgctDelegate = openspace::global::windowDelegate; + WindowDelegate& sgctDelegate = global::windowDelegate; sgctDelegate.terminate = []() { sgct::Engine::instance()->terminate(); }; sgctDelegate.setBarrier = [](bool enabled) { sgct::SGCTWindow::setBarrier(enabled); @@ -1101,7 +1099,7 @@ int main(int argc, char** argv) { ghoul::cmdparser::CommandlineParser::AllowUnknownCommands::Yes ); - openspace::CommandlineArguments commandlineArguments; + CommandlineArguments commandlineArguments; parser.addCommand(std::make_unique>( commandlineArguments.configurationName, "--file", "-f", "Provides the path to the OpenSpace configuration file. Only the '${TEMPORARY}' " @@ -1141,8 +1139,6 @@ int main(int argc, char** argv) { // Create the OpenSpace engine and get arguments for the SGCT engine std::string windowConfiguration; try { - using namespace openspace; - // Find configuration std::string configurationFilePath = commandlineArguments.configurationName; if (commandlineArguments.configurationName.empty()) { @@ -1178,16 +1174,17 @@ int main(int argc, char** argv) { // Determining SGCT configuration file LDEBUG("SGCT Configuration file: " + global::configuration.windowConfiguration); - windowConfiguration = openspace::global::configuration.windowConfiguration; + windowConfiguration = global::configuration.windowConfiguration; } - catch (const openspace::documentation::SpecificationError& e) { + catch (const documentation::SpecificationError& e) { LFATALC("main", "Loading of configuration file failed"); - for (const openspace::documentation::TestResult::Offense& o : e.result.offenses) { + for (const documentation::TestResult::Offense& o : e.result.offenses) { LERRORC(o.offender, ghoul::to_string(o.reason)); } - for (const openspace::documentation::TestResult::Warning& w : e.result.warnings) { + for (const documentation::TestResult::Warning& w : e.result.warnings) { LWARNINGC(w.offender, ghoul::to_string(w.reason)); } + ghoul::deinitialize(); exit(EXIT_FAILURE); } catch (const ghoul::RuntimeError& e) { @@ -1196,10 +1193,11 @@ int main(int argc, char** argv) { if (ghoul::logging::LogManager::isInitialized()) { LogMgr.flushLogs(); } + ghoul::deinitialize(); return EXIT_FAILURE; } - openspace::global::openSpaceEngine.registerPathTokens(); + global::openSpaceEngine.registerPathTokens(); // Prepend the outgoing sgctArguments with the program name // as well as the configuration file that sgct is supposed to use @@ -1293,8 +1291,8 @@ int main(int argc, char** argv) { auto cleanup = [&](bool isInitialized) { if (isInitialized) { - openspace::global::openSpaceEngine.deinitializeGL(); - openspace::global::openSpaceEngine.deinitialize(); + global::openSpaceEngine.deinitializeGL(); + global::openSpaceEngine.deinitialize(); } // Clear function bindings to avoid crash after destroying the OpenSpace Engine @@ -1321,6 +1319,8 @@ int main(int argc, char** argv) { } } #endif // OPENSPACE_HAS_SPOUT + + ghoul::deinitialize(); }; if (!initSuccess) { diff --git a/apps/Wormhole/main.cpp b/apps/Wormhole/main.cpp index 029ee407cb..a988789255 100644 --- a/apps/Wormhole/main.cpp +++ b/apps/Wormhole/main.cpp @@ -22,43 +22,26 @@ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * ****************************************************************************************/ - -#include - -#include -#include -#include -#include -#include +#include +#include #include #include - -#include -#include -#include - -#include - -#include -#include -#include -#include -#include +#include #include -#include namespace { - const std::string _loggerCat = "Wormhole"; -} + constexpr const char*_loggerCat = "Wormhole"; +} // namespace int main(int argc, char** argv) { using namespace openspace; + using namespace ghoul::cmdparser; std::vector arguments(argv, argv + argc); - ghoul::cmdparser::CommandlineParser commandlineParser( + CommandlineParser commandlineParser( "Wormhole", - ghoul::cmdparser::CommandlineParser::AllowUnknownCommands::Yes + CommandlineParser::AllowUnknownCommands::Yes ); std::stringstream defaultPassword; @@ -73,43 +56,43 @@ int main(int argc, char** argv) { std::chrono::system_clock::now().time_since_epoch().count() + 1 ) % 0xffffff); - std::string portString = ""; + std::string portString; commandlineParser.addCommand( std::make_unique>( portString, "--port", "-p", "Sets the port to listen on" - ) + ) ); - std::string password = ""; + std::string password; commandlineParser.addCommand( std::make_unique>( password, "--password", "-l", "Sets the password to use" - ) + ) ); - std::string changeHostPassword = ""; + std::string changeHostPassword; commandlineParser.addCommand( std::make_unique>( changeHostPassword, "--hostpassword", "-h", "Sets the host password to use" - ) + ) ); commandlineParser.setCommandLine(arguments); commandlineParser.execute(); - if (password == "") { + if (password.empty()) { password = defaultPassword.str(); } - if (changeHostPassword == "") { + if (changeHostPassword.empty()) { changeHostPassword = defaultChangeHostPassword.str(); } @@ -118,11 +101,11 @@ int main(int argc, char** argv) { int port = 25001; - if (portString != "") { + if (!portString.empty()) { try { port = std::stoi(portString); } - catch (...) { + catch (const std::invalid_argument&) { LERROR(fmt::format("Invalid port: {}", portString)); } } @@ -132,7 +115,9 @@ int main(int argc, char** argv) { server.setDefaultHostAddress("127.0.0.1"); LINFO(fmt::format("Server listening to port {}", port)); - while (std::cin.get() != 'q') {} + while (std::cin.get() != 'q') { + std::this_thread::sleep_for(std::chrono::milliseconds(1000)); + } server.stop(); LINFO("Server stopped"); diff --git a/data/assets/apollo8.scene b/data/assets/apollo8.scene index 3301a6720a..6ec4a8b9d5 100644 --- a/data/assets/apollo8.scene +++ b/data/assets/apollo8.scene @@ -12,14 +12,19 @@ local Keybindings = { { Key = "E", Command = "openspace.time.setPause(true);" .. - "openspace.setPropertyValue('*Trail.Renderable.Enabled', false)".. - "openspace.setPropertyValue('Scene.Apollo8LaunchTrail.Renderable.Enabled', false)".. - "openspace.sessionRecording.startPlayback('apollo8')", + "openspace.time.setDeltaTime(1);" .. + "openspace.time.setTime('1968 DEC 24 16:37:31');" .. + "openspace.navigation.setNavigationState({" .. + " Anchor = 'Apollo8'," .. + " Position = { 1.494592E1, 3.236777E1, -4.171296E1 }," .. + " ReferenceFrame = 'Root'," .. + " Up = { 0.960608E0, -0.212013E0, 0.179675E0 }" .. + "});" .. + "openspace.setPropertyValue('*Trail.Renderable.Enabled', false)", Documentation = "Jump to right before the earthrise photo", Name = "Set Earthrise time", GuiPath = "/Missions/Apollo/8", Local = false - }, { Key = "U", @@ -115,13 +120,7 @@ asset.onInitialize(function () openspace.setPropertyValueSingle('NavigationHandler.OrbitalNavigator.MinimumAllowedDistance', 0.000000); openspace.setPropertyValueSingle('Scene.Moon.Renderable.LodScaleFactor', 24.0); - openspace.navigation.setCameraState({ - Anchor = earthAsset.Earth.Identifier, - Position = { 0, 0, 0 }, - Rotation = { 0.758797, 0.221490, -0.605693, -0.091135 }, - }) - - openspace.globebrowsing.goToGeo(20, -60, 15000000) + openspace.globebrowsing.goToGeo(earthAsset.Earth.Identifier, 20, -60, 15000000) end) asset.onDeinitialize(function () diff --git a/data/assets/apollo_sites.scene b/data/assets/apollo_sites.scene index 2c59d6f25a..09721fe7d6 100644 --- a/data/assets/apollo_sites.scene +++ b/data/assets/apollo_sites.scene @@ -2,15 +2,15 @@ asset.require('./base') --moonrocks.scene local sceneHelper = asset.require('util/scene_helper') - -- local station2 = asset.require('scene/solarsystem/missions/apollo/bouldersstation2') -- local station6 = asset.require('scene/solarsystem/missions/apollo/bouldersstation6') -- local station7 = asset.require('scene/solarsystem/missions/apollo/bouldersstation7') +asset.require('scene/solarsystem/missions/apollo/apollo8') asset.require('scene/solarsystem/missions/apollo/apollo11') -asset.require('scene/solarsystem/missions/apollo/a11_lem') asset.require('scene/solarsystem/missions/apollo/a17_lem') asset.require('scene/solarsystem/missions/apollo/apollo_globebrowsing') asset.require('scene/solarsystem/missions/apollo/apollo_11_lem_flipbook') +asset.require('scene/solarsystem/missions/apollo/insignias_map') local Keybindings = { { @@ -37,11 +37,11 @@ local Keybindings = { }, { Key = "F11", - Command = "openspace.time.setTime('1969 JUL 20 20:17:40');" .. + Command = "openspace.time.setTime('1969 JUL 20 20:17:40');" .. "openspace.setPropertyValueSingle('Scene.Moon.Renderable.Layers.HeightLayers.LRO_NAC_Apollo_11.Enabled', true);" .. "openspace.setPropertyValueSingle('Scene.Moon.Renderable.Layers.ColorLayers.A11_M177481212_p_longlat.Enabled', true);" .. "openspace.setPropertyValueSingle('Scene.Moon.Renderable.LodScaleFactor', 20.11);" .. - "openspace.setPropertyValue('NavigationHandler.OrbitalNavigator.Anchor', 'Apollo11LemModel');" .. + "openspace.setPropertyValue('NavigationHandler.OrbitalNavigator.Anchor', 'Apollo11LemPosition');" .. "openspace.setPropertyValue('NavigationHandler.OrbitalNavigator.RetargetAnchor', nil);" .. "openspace.setPropertyValueSingle('Scene.Apollo11MoonTrail.Renderable.Enabled', true);" .. "openspace.setPropertyValueSingle('Scene.Apollo11LemTrail.Renderable.Enabled', true);", @@ -82,10 +82,14 @@ asset.onInitialize(function () sceneHelper.bindKeys(Keybindings) - openspace.markInterestingNodes({ "Moon", "Apollo11LemModel", "Apollo17LemModel", "Apollo11", "Apollo11LunarLander" }) + openspace.markInterestingNodes({ + "Moon", "Apollo11LemModel", "Apollo17LemModel", + "Apollo11", "Apollo11LunarLander", + -- "Station_2_Boulder2", "Station_6_Fragment1" + }) + openspace.setPropertyValueSingle('Scene.Moon.Renderable.Layers.ColorLayers.A17_travmap.BlendMode', 0); -- To enable both sites by default, uncomment these lines - -- openspace.setPropertyValueSingle('Scene.Moon.Renderable.Layers.ColorLayers.A17_travmap.BlendMode', 0.000000); -- openspace.setPropertyValueSingle('Scene.Moon.Renderable.Layers.ColorLayers.A17_travmap.Enabled', true); -- openspace.setPropertyValueSingle('Scene.Moon.Renderable.Layers.HeightLayers.LRO_NAC_Apollo_17.Enabled', true); -- openspace.setPropertyValueSingle('Scene.Moon.Renderable.Layers.ColorLayers.A17_LEM.Enabled', true); @@ -95,17 +99,19 @@ asset.onInitialize(function () -- openspace.setPropertyValueSingle('Scene.Moon.Renderable.Layers.ColorLayers.A17_station7.BlendMode', 0.000000); -- openspace.setPropertyValueSingle('Scene.Moon.Renderable.Layers.HeightLayers.LRO_NAC_Apollo_11.Enabled', true); -- openspace.setPropertyValueSingle('Scene.Moon.Renderable.Layers.ColorLayers.A11_M177481212_p_longlat.Enabled', true); - - openspace.navigation.setCameraState({ - Anchor = moonAsset.Moon.Identifier, - Position = { 0, 0, 0 }, - Rotation = { 0, 0, 0, 0 }, - }) - openspace.globebrowsing.goToGeo(20, -60, 15000000) + + openspace.setPropertyValueSingle('Scene.Apollo11LemDescentModel.Renderable.RotationVector', { 273.205475,6.904110,308.712311 }); + openspace.setPropertyValueSingle('Scene.Apollo11LemLandedModel.Renderable.RotationVector', { 273.205475,6.904110,308.712311 }); + + openspace.globebrowsing.goToGeo(moonAsset.Moon.Identifier, 20, -60, 15000000) openspace.setPropertyValueSingle("Scene.Moon.Renderable.PerformShading", false) end) asset.onDeinitialize(function () - openspace.removeInterestingNodes({ "Moon", "Apollo11Lem", "Apollo17Lem", "Apollo11", "Apollo11LunarLander" }) + openspace.removeInterestingNodes({ + "Moon", "Apollo11Lem", "Apollo17Lem", + "Apollo11", "Apollo11LemPosition", + -- "Station_6_Fragment1", "Station_6_Fragments_2_3" + }) end) diff --git a/data/assets/dawn.scene b/data/assets/dawn.scene index b519b87da2..8af4d7bf6d 100644 --- a/data/assets/dawn.scene +++ b/data/assets/dawn.scene @@ -10,10 +10,9 @@ asset.onInitialize(function () openspace.markInterestingNodes({ "Dawn", "Ceres", "Vesta" }) - openspace.navigation.setCameraState({ + openspace.navigation.setNavigationState({ Anchor = DawnAsset.Dawn.Identifier, Position = { 526781518487.171326, 257168309890.072144, -1381125204152.817383 }, - Rotation = { -0.106166, 0.981574, -0.084545, 0.134513 }, }) end) diff --git a/data/assets/examples/basic.scene b/data/assets/examples/basic.scene index 182c4776fe..ec17991a57 100644 --- a/data/assets/examples/basic.scene +++ b/data/assets/examples/basic.scene @@ -1,8 +1,9 @@ local assetHelper = asset.require('util/asset_helper') local sceneHelper = asset.require('util/scene_helper') local propertyHelper = asset.require('util/property_helper') +local debugHelper = asset.require('util/debug_helper') --- At this point, a sceene needs basic spice data to load. +-- At this point, a scene needs basic spice data to load. asset.require('spice/base') asset.require('util/default_keybindings') @@ -12,10 +13,15 @@ asset.require('util/default_joystick') asset.require('util/webgui') local spheres = asset.require('examples/spheres') +debugHelper.registerCartesianAxes(asset, { + Parent = "Root", + Scale = 10 +}) + asset.onInitialize(function () - openspace.navigation.setCameraState({ - Anchor = spheres.ExampleSphere1.Identifier, - Position = { 20, 0, 0 }, - Rotation = { 0.758797, 0.221490, -0.605693, -0.091135 } + openspace.navigation.setNavigationState({ + Anchor = "Root", + Position = { 20, 20, 20 }, + Up = {0, 1, 0}, }) end) diff --git a/data/assets/gaia.scene b/data/assets/gaia.scene index 94d2f8ddbb..45213dfeaa 100644 --- a/data/assets/gaia.scene +++ b/data/assets/gaia.scene @@ -35,10 +35,9 @@ asset.onInitialize(function () openspace.markInterestingNodes({ "Gaia" }) - openspace.navigation.setCameraState({ + openspace.navigation.setNavigationState({ Anchor = earthAsset.Earth.Identifier, Position = { 1000000000000.0, 1000000000000.0, 1000000000000.0 }, - Rotation = { 0.683224, -0.765934, -0.601234, -0.418073 }, }) end) diff --git a/data/assets/insight.scene b/data/assets/insight.scene index 3c02820e60..d185471418 100644 --- a/data/assets/insight.scene +++ b/data/assets/insight.scene @@ -60,10 +60,11 @@ asset.onInitialize(function () openspace.markInterestingNodes({ "Insight" }) - openspace.navigation.setCameraState({ + openspace.navigation.setNavigationState({ Anchor = insightAsset.Insight.Identifier, - Position = { 0, 0, 0 }, - Rotation = { 0.758797, 0.221490, -0.605693, -0.091135 }, + Position = { 8.430115E0, -1.791710E1, 2.813660E0 }, + ReferenceFrame = "Root", + Up = { 0.494659E0,0.357162E0,0.792306E0 }, }) end) diff --git a/data/assets/juno.scene b/data/assets/juno.scene index 9ed6afaccd..f17e5c3f8b 100644 --- a/data/assets/juno.scene +++ b/data/assets/juno.scene @@ -18,10 +18,11 @@ asset.onInitialize(function () 28800, 57600, 115200, 230400, 460800, 921600, 1843200, 3686400, 7372800, 14745600 }) - openspace.navigation.setCameraState({ + openspace.navigation.setNavigationState({ Anchor = junoAsset.Juno.Identifier, - Position = { 1837386367.601345, -389860693812.834839, 714830404470.398926 }, - Rotation = { -0.336540, 0.711402, -0.099212, 0.608937 }, + Position = { 1.243398E8, 7.176068E7, -1.519733E7 }, + ReferenceFrame = "Root", + Up = { -0.377400E0, 0.764573E0, 0.522492E0 }, }) end) diff --git a/data/assets/messenger.scene b/data/assets/messenger.scene index 850077d2b0..dc2f722880 100644 --- a/data/assets/messenger.scene +++ b/data/assets/messenger.scene @@ -33,10 +33,11 @@ asset.onInitialize(function () 28800, 57600, 115200, 230400, 460800, 921600, 1843200, 3686400, 7372800, 14745600 }) - openspace.navigation.setCameraState({ + openspace.navigation.setNavigationState({ Anchor = "Mercury", - Position = { 526781518487.171326, 257168309890.072144, -1381125204152.817383 }, - Rotation = {0.180662, 0.021334, 0.979084, 0.091111}, + Position = { 2.423690E11, 1.979038E11, -2.241483E10 }, + ReferenceFrame = "Root", + Up = { -0.492046E0, 0.666088E0, 0.560551E0 } }) end) diff --git a/data/assets/newhorizons.scene b/data/assets/newhorizons.scene index 71f77d618a..9de5012f7d 100644 --- a/data/assets/newhorizons.scene +++ b/data/assets/newhorizons.scene @@ -255,10 +255,11 @@ asset.onInitialize(function () openspace.setPropertyValueSingle('Scene.Charon.Renderable.Enabled', false) openspace.setPropertyValueSingle("Scene.PlutoBarycenterTrail.Renderable.Enabled", false) - openspace.navigation.setCameraState({ - Anchor = NewHorizonsAsset.NewHorizons.Identifier, - Position = { 4662120063743.592773, 1263245003503.724854, -955413856565.788086 }, - Rotation = { 0.683224, -0.165934, 0.701234, 0.118073 }, + openspace.navigation.setNavigationState({ + Anchor = "NewHorizons", + ReferenceFrame = "Root", + Position = { -6.572656E1, -7.239404E1, -2.111890E1 }, + Up = { 0.102164, -0.362945, 0.926193 } }) end) diff --git a/data/assets/osirisrex.scene b/data/assets/osirisrex.scene index a53e817cd2..285fdb5252 100644 --- a/data/assets/osirisrex.scene +++ b/data/assets/osirisrex.scene @@ -134,10 +134,9 @@ asset.onInitialize(function () openspace.markInterestingNodes({ "OsirisRex", "BennuBarycenter", "Earth" }) - openspace.navigation.setCameraState({ + openspace.navigation.setNavigationState({ Anchor = OsirisRexAsset.OsirisRex.Identifier, - Position = { 26974590199.661884, 76314608558.908020, -127086452897.101791 }, - Rotation = { 0.729548, -0.126024, 0.416827, 0.527382 }, + Position = { 26974590199.661884, 76314608558.908020, -127086452897.101791 } }) end) diff --git a/data/assets/rosetta.scene b/data/assets/rosetta.scene index 67d5dc7951..315c8804fc 100644 --- a/data/assets/rosetta.scene +++ b/data/assets/rosetta.scene @@ -134,10 +134,11 @@ asset.onInitialize(function () 28800, 57600, 115200, 230400, 460800, 921600, 1843200, 3686400, 7372800, 14745600 }) - openspace.navigation.setCameraState({ + openspace.navigation.setNavigationState({ Anchor = Comet67PAsset.Comet67P.Identifier, - Position = { 526781518487.171326, 257168309890.072144, -1381125204152.817383 }, - Rotation = { -0.106166, 0.981574, -0.084545, 0.134513 }, + ReferenceFrame = "Root", + Position = { -7.294781E5 , -6.657894E5, 2.509047E6 }, + Up = { 0.146529E0, 0.944727E0, 0.293290E0 } }) openspace.setPropertyValue('Scene.67P.Renderable.PerformShading', false); diff --git a/data/assets/scene/milkyway/gaia/gaia_dr2_download_stars.asset b/data/assets/scene/milkyway/gaia/gaia_dr2_download_stars.asset index 4dac2821f8..d80419ac78 100644 --- a/data/assets/scene/milkyway/gaia/gaia_dr2_download_stars.asset +++ b/data/assets/scene/milkyway/gaia/gaia_dr2_download_stars.asset @@ -1,19 +1,30 @@ -- Download a dataset of 618 million stars (28 GB), already preprocessed and stored in a binary octree. -- The octree was generated from the full DR2 by filtering away all stars with a parallax error higher than 0.5 -- Max Star Per Node = 50,000 and max distance = 500kpc -asset.syncedResource({ +local gaia618Destination = asset.syncedResource({ Name = "Gaia DR2 618M Octree", Type = "HttpSynchronization", Identifier = "gaia_stars_618M_octree", Version = 1 }) +local gaia618DestinationExtracted = gaia618Destination + '/data'; -- Download the full DR2 dataset with 24 values per star (preprocessed with theReadFitsTask (gaia_read.task) into 8 binary files). -- From these files new subsets can be created with the ConstructOctreeTask (gaia_octree.task). -- Total size of download is 151 GB. -asset.syncedResource({ +local gaiaFull = asset.syncedResource({ Name = "Gaia DR2 Full Raw", Type = "HttpSynchronization", Identifier = "gaia_stars_dr2_raw", Version = 1 }) + +asset.onInitialize(function() + if not openspace.directoryExists(gaia618DestinationExtracted) then + openspace.printInfo("Extracted Gaia dataset") + openspace.unzipFile(gaia618Destination .. '/DR2_full_Octree[50kSPN,500dist]_50,50.zip', gaia618DestinationExtracted, true) + end +end) + +asset.export('GaiaDR2_618M', gaia618DestinationExtracted) +asset.export('GaiaFullDataset', gaiaFull) diff --git a/data/assets/scene/solarsystem/interstellar/oumuamua.asset b/data/assets/scene/solarsystem/interstellar/oumuamua.asset index 33758e6224..2b972b5c3a 100644 --- a/data/assets/scene/solarsystem/interstellar/oumuamua.asset +++ b/data/assets/scene/solarsystem/interstellar/oumuamua.asset @@ -20,7 +20,8 @@ local OumuamuaTrail = { Color = { 0.9, 0.9, 0.0 }, StartTime = "2014 JAN 01 00:00:00", EndTime = "2023 JAN 01 00:00:00", - SampleInterval = 60 + SampleInterval = 7000, + TimeStampSubsampleFactor = 1 }, GUI = { Name = "'Oumuamua Trail", diff --git a/data/assets/scene/solarsystem/missions/apollo/a11_lem.asset b/data/assets/scene/solarsystem/missions/apollo/a11_lem.asset index 2a9182d715..05b81e0af4 100644 --- a/data/assets/scene/solarsystem/missions/apollo/a11_lem.asset +++ b/data/assets/scene/solarsystem/missions/apollo/a11_lem.asset @@ -15,8 +15,8 @@ local Apollo11Lem = { Globe = moonAsset.Moon.Identifier, Longitude = -360+23.47306, Latitude = 0.67402, - FixedAltitude = -1927.65, - UseFixedAltitude = true + Altitude = -1927.65, + UseHeightMap = false }, }, GUI = { diff --git a/data/assets/scene/solarsystem/missions/apollo/a17_lem.asset b/data/assets/scene/solarsystem/missions/apollo/a17_lem.asset index 9d6f403071..3a88c8cf75 100644 --- a/data/assets/scene/solarsystem/missions/apollo/a17_lem.asset +++ b/data/assets/scene/solarsystem/missions/apollo/a17_lem.asset @@ -14,6 +14,7 @@ local Apollo17Lem = { Globe = moonAsset.Moon.Identifier, Longitude = -329.22833, Latitude = 20.19092, + UseHeightmap = true }, }, GUI = { diff --git a/data/assets/scene/solarsystem/missions/apollo/apollo11.asset b/data/assets/scene/solarsystem/missions/apollo/apollo11.asset index 64f5dcd9bd..ac1c6eb153 100644 --- a/data/assets/scene/solarsystem/missions/apollo/apollo11.asset +++ b/data/assets/scene/solarsystem/missions/apollo/apollo11.asset @@ -1,5 +1,8 @@ local assetHelper = asset.require('util/asset_helper') local sunTransforms = asset.require('scene/solarsystem/sun/transforms') +local descentKeyframes = asset.require('./apollo11_lem_descent.asset') +local descentRotationKeyframes = asset.require('./apollo11_lem_descent_rotation.asset') +local model = asset.require('scene/solarsystem/missions/apollo/lem_model') asset.require('spice/base') @@ -11,7 +14,7 @@ local kernelsFolder = asset.syncedResource({ }) local modelFolder = asset.syncedResource({ - Name = "Apollo Kernels", + Name = "Apollo Models", Type = "HttpSynchronization", Identifier = "apollo_11_models", Version = 1 @@ -24,7 +27,7 @@ local kernels = { kernelsFolder .. '/apollo11_orbits_full9km.bsp', kernelsFolder .. '/apollo11_orbits_lm9km.bsp', } - +--landing - 1969-07-20T20:17:40 local apolloSpiceId = "-911" local apolloLemSpiceId = "-911500" @@ -107,81 +110,44 @@ local Apollo11MoonTrail = { } } --- Uncomment if you want to follow the mock decent --- local Apollo11LemPosition = { --- Identifier = "Apollo11LemPosition", --- Parent = "Moon", --- TimeFrame = { --- Type = "TimeFrameInterval", --- Start = "1969 JUL 20 19:10:25.183", --- End = "1969 JUL 20 20:17:46.183" --- }, --- Transform = { --- Translation = { --- Type = "SpiceTranslation", --- Target = apolloLemSpiceId, --- Observer = "MOON", --- Frame = "MOON_ME", --- Kernels = kernels --- }, --- }, --- GUI = { --- Hidden = true, --- Name = "Apollo 11 Lunar Lander Position", --- Path = "/Solar System/Missions/Apollo/11" --- } --- } --- local Apollo11LunarLanderModel = { --- Identifier = "Apollo11LunarLander", --- Parent = Apollo11LemPosition.Identifier, --- Transform = { --- Rotation = { --- Type = "StaticRotation", --- Rotation = {0.0, 0.0, -3.1415/2} --- }, --- Scale = { --- Type = "StaticScale", --- Scale = 100.0 --- } --- }, --- TimeFrame = { --- Type = "TimeFrameInterval", --- Start = "1969 JUL 20 19:10:25.183", --- End = "1969 JUL 20 20:17:46.183" --- }, --- Renderable = { --- Type = "RenderableModel", --- Geometry = { --- Type = "MultiModelGeometry", --- GeometryFile = modelFolder .. "/lem_nasa.obj" --- }, --- ColorTexture = modelFolder .. "/gray.png", --- LightSources = assetHelper.getDefaultLightSources(sunTransforms.SolarSystemBarycenter.Identifier) --- }, --- GUI = { --- Hidden = false, --- Name = "Apollo 11 Lunar Lander", --- Path = "/Solar System/Missions/Apollo/11" --- } --- } - -local Apollo11LemTrail = { - Identifier = "Apollo11LemTrail", - Parent = "Moon", - Renderable = { - Type = "RenderableTrailTrajectory", - Translation = { +local lemTranslation = { + Type = "TimelineTranslation", + Keyframes = { + -- 20:14:30 is an arbitrary cutoff, but last 4 minutes data in descentKeyframes + -- begins at 20.14.40. Due to linear interpolation, we will get + -- a 10s linear transition to the location where the descentKeyframes start. + ['1969 JUL 20 20:14:30'] = { Type = "SpiceTranslation", Target = apolloLemSpiceId, Observer = "MOON", Frame = "IAU_MOON", Kernels = kernels }, - Color = {0.780000,0.940000,0.340000 }, + ['1969 JUL 20 20:14:40'] = { + Type = "TimelineTranslation", + Keyframes = descentKeyframes.keyframes + } + } +} + +local lemRotation = { + Type = "TimelineRotation", + Keyframes = descentRotationKeyframes.keyframes +} + + + +local Apollo11LemTrail = { + Identifier = "Apollo11LemTrail", + Parent = "Moon", + Renderable = { + Type = "RenderableTrailTrajectory", + Translation = lemTranslation, + Color = { 0.780000,0.940000,0.340000 }, StartTime = "1969 JUL 20 19:10:25.183", EndTime = "1969 JUL 20 20:17:46.183", - SampleInterval = 60, + SampleInterval = 2, EnableFade = false, Enabled = false, }, @@ -191,11 +157,91 @@ local Apollo11LemTrail = { } } +local Apollo11LemPosition = { + Identifier = "Apollo11LemPosition", + Parent = "Moon", + TimeFrame = { + Type = "TimeFrameInterval", + Start = "1969 JUL 20 19:10:25.183" + }, + Transform = { + Translation = lemTranslation, + Rotation = lemRotation + }, + GUI = { + Hidden = false, + Name = "Apollo 11 Lunar Lander Position", + Path = "/Solar System/Missions/Apollo/11" + } +} +--landing - 1969-07-20T20:17:40 + +local Apollo11LemDescentModel = { + Identifier = "Apollo11LemDescentModel", + Parent = Apollo11LemPosition.Identifier, + TimeFrame = { + Type = "TimeFrameInterval", + Start = "1969 JUL 19 19:38:29.183", + End = "1969 JUL 20 20:17:40.0" + }, + Transform = { + Scale = { + Type = "StaticScale", + Scale = 0.24 + } + }, + Renderable = { + Type = "RenderableModel", + Geometry = { + Type = "MultiModelGeometry", + GeometryFile = model.modelFolder .. "/lmremoved.obj" + }, + ColorTexture = model.modelFolder .. "/LM-2_ver2clean_u1_v1.jpeg", + LightSources = assetHelper.getDefaultLightSources(sunTransforms.SolarSystemBarycenter.Identifier) + }, + GUI = { + Hidden = false, + Name = "Apollo 11 Descent Lem", + Path = "/Solar System/Missions/Apollo/11" + } +} + +local Apollo11LemLandedModel = { + Identifier = "Apollo11LemLandedModel", + Parent = Apollo11LemPosition.Identifier, + TimeFrame = { + Type = "TimeFrameInterval", + Start = "1969 JUL 20 20:17:40.0" + }, + Transform = { + Scale = { + Type = "StaticScale", + Scale = 0.24 + } + }, + Renderable = { + Type = "RenderableModel", + Geometry = { + Type = "MultiModelGeometry", + GeometryFile = model.modelFolder .. "/LM-2_ver2clean.obj" + }, + ColorTexture = model.modelFolder .. "/LM-2_ver2clean_u1_v1.jpeg", + LightSources = assetHelper.getDefaultLightSources(sunTransforms.SolarSystemBarycenter.Identifier) + }, + GUI = { + Hidden = false, + Name = "Apollo 11 Landed Lem", + Path = "/Solar System/Missions/Apollo/11" + } +} + + local exportList = { - Apollo11Position, - -- Apollo11LemPosition, + Apollo11Position, + Apollo11LemPosition, Apollo11Model, - -- Apollo11LunarLanderModel, + Apollo11LemDescentModel, + Apollo11LemLandedModel, Apollo11MoonTrail, Apollo11LemTrail, } diff --git a/data/assets/scene/solarsystem/missions/apollo/apollo_globebrowsing.asset b/data/assets/scene/solarsystem/missions/apollo/apollo_globebrowsing.asset index aaab113192..fb9f1e14c5 100644 --- a/data/assets/scene/solarsystem/missions/apollo/apollo_globebrowsing.asset +++ b/data/assets/scene/solarsystem/missions/apollo/apollo_globebrowsing.asset @@ -2,36 +2,36 @@ local heightmaps = asset.syncedResource({ - Name = "Apollo Globebrowsing", + Name = "Apollo Globebrowsing Heightmaps", Type = "HttpSynchronization", Identifier = "apollo_globebrowsing_heightmaps", Version = 1 }) local basemaps = asset.syncedResource({ - Name = "Apollo Globebrowsing", + Name = "Apollo Globebrowsing Basemaps", Type = "HttpSynchronization", Identifier = "apollo_globebrowsing_basemaps", Version = 1 }) local naclighting = asset.syncedResource({ - Name = "Apollo Globebrowsing", + Name = "Apollo Globebrowsing NAC Lighting", Type = "HttpSynchronization", Identifier = "apollo_globebrowsing_naclighting", Version = 1 }) local stations = asset.syncedResource({ - Name = "Apollo 17 Globebrowsing", + Name = "Apollo 17 Globebrowsing Stations", Type = "HttpSynchronization", Identifier = "apollo_17_stations", Version = 1 }) asset.onInitialize(function () - openspace.globebrowsing.addBlendingLayersFromDirectory(heightmaps,"Moon") - openspace.globebrowsing.addBlendingLayersFromDirectory(basemaps,"Moon") - openspace.globebrowsing.addBlendingLayersFromDirectory(naclighting,"Moon") - openspace.globebrowsing.addBlendingLayersFromDirectory(stations,"Moon") + openspace.globebrowsing.addBlendingLayersFromDirectory(heightmaps, "Moon") + openspace.globebrowsing.addBlendingLayersFromDirectory(basemaps, "Moon") + openspace.globebrowsing.addBlendingLayersFromDirectory(naclighting, "Moon") + openspace.globebrowsing.addBlendingLayersFromDirectory(stations, "Moon") end) diff --git a/data/assets/scene/solarsystem/missions/apollo/bouldersstation2.asset b/data/assets/scene/solarsystem/missions/apollo/bouldersstation2.asset index 5723c970bc..2d096b99d0 100644 --- a/data/assets/scene/solarsystem/missions/apollo/bouldersstation2.asset +++ b/data/assets/scene/solarsystem/missions/apollo/bouldersstation2.asset @@ -33,8 +33,8 @@ local Station2Boulder1Holder = { Globe = moonAsset.Moon.Identifier, Longitude = -360+30.5294692, Latitude = 20.098824, - FixedAltitude = -2442.8, - UseFixedAltitude = true + Altitude = -2442.8, + UseHeightMap = false } }, GUI = { @@ -78,8 +78,8 @@ local Station2Boulder2Holder = { Globe = moonAsset.Moon.Identifier, Longitude = -360+30.5287892, Latitude = 20.098240, - FixedAltitude = -2434.6, - UseFixedAltitude = true + Altitude = -2434.6, + UseHeightMap = false } }, GUI = { @@ -123,8 +123,8 @@ local Station2Boulder3Holder = { Globe = moonAsset.Moon.Identifier, Longitude = -360+30.5294692, Latitude = 20.098610, - FixedAltitude = -2441.55, - UseFixedAltitude = true + Altitude = -2441.55, + UseHeightMap = false } }, GUI = { diff --git a/data/assets/scene/solarsystem/missions/apollo/bouldersstation6.asset b/data/assets/scene/solarsystem/missions/apollo/bouldersstation6.asset index dba9844a7c..919de3f9a8 100644 --- a/data/assets/scene/solarsystem/missions/apollo/bouldersstation6.asset +++ b/data/assets/scene/solarsystem/missions/apollo/bouldersstation6.asset @@ -37,6 +37,8 @@ local Station6Frag1Holder = { Globe = moonAsset.Moon.Identifier, Longitude = -360+30.80068, Latitude = 20.2903, + Altitude = -2562.6, + UseHeightmap = false } }, GUI = { @@ -54,6 +56,8 @@ local Station6Frag1Model = { Globe = moonAsset.Moon.Identifier, Longitude = -360+30.8007, Latitude = 20.2903, + Altitude = -2562.6, + UseHeightmap = false } }, Transform = { @@ -104,8 +108,8 @@ local Station6Frag2Model = { Globe = moonAsset.Moon.Identifier, Longitude = -360+30.80055, Latitude = 20.289808, - FixedAltitude = -2566.5, - UseFixedAltitude = true + Altitude = -2566.5, + UseHeightmap = false } }, Renderable = { @@ -140,8 +144,8 @@ local Station6Frag3Model = { Globe = moonAsset.Moon.Identifier, Longitude = -360+30.80053, Latitude = 20.29030, - FixedAltitude = -2563.0, - UseFixedAltitude = true + Altitude = -2563.0, + UseHeightMap = false } }, Renderable = { diff --git a/data/assets/scene/solarsystem/missions/apollo/bouldersstation7.asset b/data/assets/scene/solarsystem/missions/apollo/bouldersstation7.asset index 555d4fcb82..d2eab52355 100644 --- a/data/assets/scene/solarsystem/missions/apollo/bouldersstation7.asset +++ b/data/assets/scene/solarsystem/missions/apollo/bouldersstation7.asset @@ -34,8 +34,8 @@ local Station7BoulderHolder = { Globe = moonAsset.Moon.Identifier, Longitude = -360+30.8165882, Latitude = 20.2908556, - FixedAltitude = -2593.5, - UseFixedAltitude = true + Altitude = -2593.5, + UseHeightMap = true } }, GUI = { diff --git a/data/assets/scene/solarsystem/missions/apollo/lem_model.asset b/data/assets/scene/solarsystem/missions/apollo/lem_model.asset index cd592de5e8..dbc9210394 100644 --- a/data/assets/scene/solarsystem/missions/apollo/lem_model.asset +++ b/data/assets/scene/solarsystem/missions/apollo/lem_model.asset @@ -2,7 +2,7 @@ local modelFolder = asset.syncedResource({ Name = "Apollo Lem Models", Type = "HttpSynchronization", Identifier = "apollo_lem_model", - Version = 2 + Version = 3 }) asset.export('modelFolder', modelFolder) diff --git a/data/assets/scene/solarsystem/missions/dawn/vesta.asset b/data/assets/scene/solarsystem/missions/dawn/vesta.asset index d6b1735e36..64bfabfca8 100644 --- a/data/assets/scene/solarsystem/missions/dawn/vesta.asset +++ b/data/assets/scene/solarsystem/missions/dawn/vesta.asset @@ -20,7 +20,7 @@ local images = asset.syncedResource({ local models = asset.syncedResource({ Name = "Vesta Models", Type = "HttpSynchronization", - Identifier = "vesta_comet", + Identifier = "vesta_model", Version = 1 }) diff --git a/data/assets/scene/solarsystem/planets/jupiter/minor/carpo_group.asset b/data/assets/scene/solarsystem/planets/jupiter/minor/carpo_group.asset index 157b5dbbfd..7938f89387 100644 --- a/data/assets/scene/solarsystem/planets/jupiter/minor/carpo_group.asset +++ b/data/assets/scene/solarsystem/planets/jupiter/minor/carpo_group.asset @@ -14,7 +14,7 @@ local carpoGroup = { { Identifier = "Carpo", Parent = { - Name = parentIdentifier, + Identifier = parentIdentifier, Spice = parentSpice }, Spice = "CARPO", diff --git a/data/assets/scene/solarsystem/sssb/tesla_roadster.asset b/data/assets/scene/solarsystem/sssb/tesla_roadster.asset index 5fd6308fdc..ca2a577dff 100644 --- a/data/assets/scene/solarsystem/sssb/tesla_roadster.asset +++ b/data/assets/scene/solarsystem/sssb/tesla_roadster.asset @@ -20,7 +20,8 @@ local TeslaRoadsterTrail = { Color = { 0.9, 0.9, 0.0 }, StartTime = "2018 FEB 8 00:00:00", EndTime = "2022 FEB 7 00:00:00", - SampleInterval = 60 + SampleInterval = 3000, + TimeStampSubsampleFactor = 1 }, GUI = { Name = "Tesla Roadster Trail", diff --git a/data/assets/util/asset_helper.asset b/data/assets/util/asset_helper.asset index 8664122cbc..a785329785 100644 --- a/data/assets/util/asset_helper.asset +++ b/data/assets/util/asset_helper.asset @@ -42,6 +42,29 @@ local registerSceneGraphNodes = function (sceneAsset, nodes, override) end) end + +local registerScreenSpaceRenderables = function (sceneAsset, renderables, override) + override = override or false + if not override then + if tableLength(renderables) == 0 then + openspace.printWarning(sceneAsset.filePath .. ": Register function was called with an empty node list. Pass 'true' as third argument to silence this warning.") + return + end + end + + sceneAsset.onInitialize(function () + for i, node in ipairs(renderables) do + openspace.addScreenSpaceRenderable(node) + end + end) + sceneAsset.onDeinitialize(function () + for i = #renderables, 1, -1 do + renderable = renderables[i] + openspace.removeScreenSpaceRenderable(renderable.Identifier) + end + end) +end + local registerDashboardItems = function (dashboardAsset, items) dashboardAsset.onInitialize( function () @@ -176,6 +199,7 @@ end asset.export("registerSceneGraphNodes", registerSceneGraphNodes) asset.export("registerSceneGraphNodesAndExport", registerSceneGraphNodesAndExport) +asset.export("registerScreenSpaceRenderables", registerScreenSpaceRenderables) asset.export("registerSpiceKernels", registerSpiceKernels) asset.export("registerDashboardItems", registerDashboardItems) asset.export("requireAll", requireAll) diff --git a/data/assets/util/webgui.asset b/data/assets/util/webgui.asset index d4d54451c5..b51a582660 100644 --- a/data/assets/util/webgui.asset +++ b/data/assets/util/webgui.asset @@ -1,18 +1,11 @@ +asset.require('./static_server') + local guiCustomization = asset.require('customization/gui') -- Select which commit hashes to use for the frontend and backend -local frontendHash = "c603ad07d1407a7d3def43f1e203244cee1c06f6" -local backendHash = "84737f9785f12efbb12d2de9d511154c6215fe9c" - +local frontendHash = "2d1bb8d8d8478b6ed025ccc6f1e0ceacf04b6114" local dataProvider = "data.openspaceproject.com/files/webgui" -local backend = asset.syncedResource({ - Identifier = "WebGuiBackend", - Name = "Web Gui Backend", - Type = "UrlSynchronization", - Url = dataProvider .. "/backend/" .. backendHash .. "/backend.zip" -}) - local frontend = asset.syncedResource({ Identifier = "WebGuiFrontend", Name = "Web Gui Frontend", @@ -27,22 +20,21 @@ asset.onInitialize(function () openspace.unzipFile(frontend .. "/frontend.zip", dest, true) end - -- Unzip the frontend bundle - dest = backend .. "/backend" - if not openspace.directoryExists(dest) then - openspace.unzipFile(backend .. "/backend.zip", dest, true) - end + -- Serve the production GUI: + local directories = openspace.getPropertyValue("Modules.WebGui.Directories") + directories[#directories + 1] = "frontend" + directories[#directories + 1] = frontend .. '/frontend' + openspace.setPropertyValueSingle("Modules.WebGui.Directories", directories) + openspace.setPropertyValueSingle("Modules.WebGui.DefaultEndpoint", "frontend") - -- Do not serve the files if we are in webgui development mode. - -- In that case, you have to serve the webgui manually, using `npm start`. - if not guiCustomization.webguiDevelopmentMode then + if guiCustomization.webguiDevelopmentMode then + -- Route CEF to the deveopment version of the GUI. + -- This must be manually served using `npm start` + -- in the OpenSpace-WebGuiFrontend repository. openspace.setPropertyValueSingle( - "Modules.WebGui.ServerProcessEntryPoint", backend .. "/backend/backend.js" + "Modules.CefWebGui.GuiUrl", + "http://127.0.0.1:4690/frontend/#/onscreen" ) - openspace.setPropertyValueSingle( - "Modules.WebGui.WebDirectory", frontend .. "/frontend" - ) - openspace.setPropertyValueSingle("Modules.WebGui.ServerProcessEnabled", true) end -- The GUI contains date and simulation increment, @@ -54,5 +46,17 @@ asset.onInitialize(function () end) asset.onDeinitialize(function () - openspace.setPropertyValueSingle("Modules.WebGui.ServerProcessEnabled", false) + -- Remove the frontend endpoint + local directories = openspace.getPropertyValue("Modules.WebGui.Directories") + local newDirectories; + + openspace.setPropertyValueSingle("Modules.WebGui.DefaultEndpoint", "") + + for i = 0, #directories, 2 do + if (string.find(directories[i], "frontend") == nil) then + newDirectories[#newDirectories + 1] = directories[i] + newDirectories[#newDirectories + 1] = directories[i + 1] + end + end + openspace.setPropertyValueSingle("Modules.WebGui.Directories", newDirectories) end) diff --git a/data/assets/voyager.scene b/data/assets/voyager.scene index d91cc5254d..c5789bf926 100644 --- a/data/assets/voyager.scene +++ b/data/assets/voyager.scene @@ -47,10 +47,10 @@ asset.onInitialize(function () "Earth", "Voyager 1", "Voyager 2", "Jupiter", "Saturn", "Uranus", "Neptune" }) - openspace.navigation.setCameraState({ + openspace.navigation.setNavigationState({ Anchor = VoyagerAsset.Voyager_1.Identifier, - Position = { 526781518487.171326, 257168309890.072144, -1381125204152.817383 }, - Rotation = { -0.106166, 0.981574, -0.084545, 0.134513 }, + ReferenceFrame = "Root", + Position = { 526781518487.171326, 257168309890.072144, -1381125204152.817383 } }) end) diff --git a/include/openspace/interaction/interpolator.h b/include/openspace/interaction/interpolator.h index b2f79a9e55..54750bc1eb 100644 --- a/include/openspace/interaction/interpolator.h +++ b/include/openspace/interaction/interpolator.h @@ -51,7 +51,7 @@ public: private: std::function _transferFunction; - float _t = 0.f; + float _t = 1.f; float _interpolationTime = 1.f; float _scaledDeltaTime = 0.f; }; diff --git a/include/openspace/interaction/navigationhandler.h b/include/openspace/interaction/navigationhandler.h index 3ab99cd0e9..0da3db3ab8 100644 --- a/include/openspace/interaction/navigationhandler.h +++ b/include/openspace/interaction/navigationhandler.h @@ -25,13 +25,17 @@ #ifndef __OPENSPACE_CORE___NAVIGATIONHANDLER___H__ #define __OPENSPACE_CORE___NAVIGATIONHANDLER___H__ -#include - +#include +#include #include +#include +#include +#include #include #include #include #include +#include namespace openspace { class Camera; @@ -48,6 +52,25 @@ class OrbitalNavigator; class NavigationHandler : public properties::PropertyOwner { public: + struct NavigationState { + NavigationState() = default; + NavigationState(const ghoul::Dictionary& dictionary); + NavigationState(std::string anchor, std::string aim, std::string referenceFrame, + glm::dvec3 position, std::optional up = std::nullopt, + double yaw = 0.0, double pitch = 0.0); + + ghoul::Dictionary dictionary() const; + static documentation::Documentation Documentation(); + + std::string anchor; + std::string aim; + std::string referenceFrame; + glm::dvec3 position; + std::optional up; + double yaw = 0.0; + double pitch = 0.0; + }; + NavigationHandler(); ~NavigationHandler(); @@ -55,10 +78,10 @@ public: void deinitialize(); // Mutators + void setNavigationStateNextFame(NavigationState state); void setCamera(Camera* camera); void setInterpolationTime(float durationInSeconds); - void setCameraStateFromDictionary(const ghoul::Dictionary& cameraDict); void updateCamera(double deltaTime); void setEnableKeyFrameInteraction(); void setDisableKeyFrameInteraction(); @@ -66,12 +89,11 @@ public: void stopPlayback(); // Accessors - ghoul::Dictionary cameraStateDictionary(); Camera* camera() const; const InputState& inputState() const; const OrbitalNavigator& orbitalNavigator() const; OrbitalNavigator& orbitalNavigator(); - KeyframeNavigator& keyframeNavigator() const; + KeyframeNavigator& keyframeNavigator(); bool isKeyFrameInteractionEnabled() const; float interpolationTime() const; @@ -100,10 +122,14 @@ public: void clearJoystickButtonCommand(int button); std::vector joystickButtonCommand(int button) const; + NavigationState navigationState(const SceneGraphNode& referenceFrame) const; + void saveNavigationState(const std::string& filepath, + const std::string& referenceFrameIdentifier); - void saveCameraStateToFile(const std::string& filepath); - void restoreCameraStateFromFile(const std::string& filepath); + void loadNavigationState(const std::string& filepath); + + void setNavigationStateNextFrame(NavigationState state); /** * \return The Lua library that contains all Lua functions available to affect the @@ -112,15 +138,18 @@ public: static scripting::LuaLibrary luaLibrary(); private: - bool _cameraUpdatedFromScript = false; + void applyNavigationState(const NavigationHandler::NavigationState& ns); + bool _playbackModeEnabled = false; - std::unique_ptr _inputState; + InputState _inputState; Camera* _camera = nullptr; std::function _playbackEndCallback; - std::unique_ptr _orbitalNavigator; - std::unique_ptr _keyframeNavigator; + OrbitalNavigator _orbitalNavigator; + KeyframeNavigator _keyframeNavigator; + + std::optional _pendingNavigationState; properties::BoolProperty _useKeyFrameInteraction; }; diff --git a/include/openspace/interaction/orbitalnavigator.h b/include/openspace/interaction/orbitalnavigator.h index 3f60af50c6..0eff98c64c 100644 --- a/include/openspace/interaction/orbitalnavigator.h +++ b/include/openspace/interaction/orbitalnavigator.h @@ -38,6 +38,8 @@ #include #include +#include + namespace openspace { class SceneGraphNode; class Camera; @@ -58,6 +60,7 @@ public: Camera* camera() const; void setCamera(Camera* camera); + void clearPreviousState(); void setFocusNode(const std::string& focusNode); void setAnchorNode(const std::string& anchorNode); @@ -70,6 +73,7 @@ public: void resetNodeMovements(); JoystickCameraStates& joystickStates(); + const JoystickCameraStates& joystickStates() const; bool followingNodeRotation() const; const SceneGraphNode* anchorNode() const; @@ -146,10 +150,9 @@ private: const SceneGraphNode* _anchorNode = nullptr; const SceneGraphNode* _aimNode = nullptr; - glm::dvec3 _previousAnchorNodePosition; - glm::dquat _previousAnchorNodeRotation; - - glm::dvec3 _previousAimNodePosition; + std::optional_previousAnchorNodePosition; + std::optional _previousAnchorNodeRotation; + std::optional _previousAimNodePosition; double _currentCameraToSurfaceDistance = 0.0; bool _directlySetStereoDistance = false; diff --git a/include/openspace/interaction/sessionrecording.h b/include/openspace/interaction/sessionrecording.h index 470f018fcb..26c5f5a094 100644 --- a/include/openspace/interaction/sessionrecording.h +++ b/include/openspace/interaction/sessionrecording.h @@ -221,7 +221,6 @@ private: double timestamp; }; ExternInteraction _externInteract; - bool _isRecording = false; double _timestampRecordStarted = 0.0; double _timestampPlaybackStarted_application = 0.0; double _timestampPlaybackStarted_simulation = 0.0; diff --git a/include/openspace/rendering/screenspacerenderable.h b/include/openspace/rendering/screenspacerenderable.h index 6f780f29b4..d5dfabef94 100644 --- a/include/openspace/rendering/screenspacerenderable.h +++ b/include/openspace/rendering/screenspacerenderable.h @@ -82,7 +82,7 @@ protected: void draw(glm::mat4 modelTransform); - virtual void bindTexture(); + virtual void bindTexture() = 0; virtual void unbindTexture(); properties::BoolProperty _enabled; @@ -106,10 +106,8 @@ protected: properties::TriggerProperty _delete; glm::ivec2 _objectSize; - UniformCache(occlusionDepth, alpha, modelTransform, viewProj, texture) _uniformCache; + UniformCache(alpha, modelTransform, viewProj, texture) _uniformCache; std::unique_ptr _shader; - - glm::vec2 _originalViewportSize; }; } // namespace openspace diff --git a/include/openspace/util/time.h b/include/openspace/util/time.h index aa8cf2e4c0..d784ac2426 100644 --- a/include/openspace/util/time.h +++ b/include/openspace/util/time.h @@ -65,7 +65,7 @@ public: */ static double convertTime(const std::string& time); - Time(double secondsJ2000 = -1); + explicit Time(double secondsJ2000 = -1); Time(const Time& other) = default; /** diff --git a/include/openspace/util/timeline.h b/include/openspace/util/timeline.h index b47d9cf4e3..81f2a9687b 100644 --- a/include/openspace/util/timeline.h +++ b/include/openspace/util/timeline.h @@ -44,7 +44,12 @@ struct KeyframeBase { */ template struct Keyframe : public KeyframeBase { - Keyframe(size_t i, double t, T p); + Keyframe(size_t i, double t, T d); + + Keyframe(Keyframe const&) = default; + Keyframe(Keyframe&&) = default; + Keyframe& operator=(Keyframe&&) = default; + Keyframe& operator=(Keyframe const&) = default; T data; }; @@ -56,7 +61,8 @@ class Timeline { public: virtual ~Timeline() = default; - void addKeyframe(double time, T data); + void addKeyframe(double time, const T& data); + void addKeyframe(double time, T&& data); void clearKeyframes(); void removeKeyframe(size_t id); void removeKeyframesBefore(double timestamp, bool inclusive = false); @@ -66,6 +72,7 @@ public: size_t nKeyframes() const; const Keyframe* firstKeyframeAfter(double timestamp, bool inclusive = false) const; const Keyframe* lastKeyframeBefore(double timestamp, bool inclusive = false) const; + const std::deque>& keyframes() const; private: diff --git a/include/openspace/util/timeline.inl b/include/openspace/util/timeline.inl index 79ccf4c51a..d2811a6aee 100644 --- a/include/openspace/util/timeline.inl +++ b/include/openspace/util/timeline.inl @@ -25,13 +25,25 @@ namespace openspace { template -Keyframe::Keyframe(size_t i, double t, T p) +Keyframe::Keyframe(size_t i, double t, T d) : KeyframeBase{ i, t } - , data(p) + , data(std::move(d)) {} template -void Timeline::addKeyframe(double timestamp, T data) { +void Timeline::addKeyframe(double timestamp, T&& data) { + Keyframe keyframe(++_nextKeyframeId, timestamp, std::move(data)); + const auto iter = std::upper_bound( + _keyframes.cbegin(), + _keyframes.cend(), + keyframe, + &compareKeyframeTimes + ); + _keyframes.insert(iter, std::move(keyframe)); +} + +template +void Timeline::addKeyframe(double timestamp, const T& data) { Keyframe keyframe(++_nextKeyframeId, timestamp, data); const auto iter = std::upper_bound( _keyframes.cbegin(), @@ -39,7 +51,7 @@ void Timeline::addKeyframe(double timestamp, T data) { keyframe, &compareKeyframeTimes ); - _keyframes.insert(iter, keyframe); + _keyframes.insert(iter, std::move(keyframe)); } template @@ -143,7 +155,7 @@ void Timeline::removeKeyframe(size_t id) { std::remove_if( _keyframes.begin(), _keyframes.end(), - [id] (Keyframe keyframe) { return keyframe.id == id; } + [id] (const Keyframe& keyframe) { return keyframe.id == id; } ), _keyframes.end() ); @@ -209,7 +221,7 @@ const Keyframe* Timeline::lastKeyframeBefore(double timestamp, bool inclus return &(*it); } -template +template const std::deque>& Timeline::keyframes() const { return _keyframes; } diff --git a/modules/base/CMakeLists.txt b/modules/base/CMakeLists.txt index de4b747968..2ce1e6846c 100644 --- a/modules/base/CMakeLists.txt +++ b/modules/base/CMakeLists.txt @@ -54,8 +54,7 @@ set(HEADER_FILES ${CMAKE_CURRENT_SOURCE_DIR}/rendering/screenspaceframebuffer.h ${CMAKE_CURRENT_SOURCE_DIR}/rendering/screenspaceimagelocal.h ${CMAKE_CURRENT_SOURCE_DIR}/rendering/screenspaceimageonline.h - ${CMAKE_CURRENT_SOURCE_DIR}/translation/luatranslation.h - ${CMAKE_CURRENT_SOURCE_DIR}/translation/statictranslation.h + ${CMAKE_CURRENT_SOURCE_DIR}/rotation/timelinerotation.h ${CMAKE_CURRENT_SOURCE_DIR}/rotation/constantrotation.h ${CMAKE_CURRENT_SOURCE_DIR}/rotation/fixedrotation.h ${CMAKE_CURRENT_SOURCE_DIR}/rotation/luarotation.h @@ -65,6 +64,10 @@ set(HEADER_FILES ${CMAKE_CURRENT_SOURCE_DIR}/scale/timedependentscale.h ${CMAKE_CURRENT_SOURCE_DIR}/timeframe/timeframeinterval.h ${CMAKE_CURRENT_SOURCE_DIR}/timeframe/timeframeunion.h + ${CMAKE_CURRENT_SOURCE_DIR}/translation/luatranslation.h + ${CMAKE_CURRENT_SOURCE_DIR}/translation/statictranslation.h + ${CMAKE_CURRENT_SOURCE_DIR}/translation/timelinetranslation.h + ) source_group("Header Files" FILES ${HEADER_FILES}) @@ -98,8 +101,7 @@ set(SOURCE_FILES ${CMAKE_CURRENT_SOURCE_DIR}/rendering/screenspaceframebuffer.cpp ${CMAKE_CURRENT_SOURCE_DIR}/rendering/screenspaceimagelocal.cpp ${CMAKE_CURRENT_SOURCE_DIR}/rendering/screenspaceimageonline.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/translation/luatranslation.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/translation/statictranslation.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/rotation/timelinerotation.cpp ${CMAKE_CURRENT_SOURCE_DIR}/rotation/constantrotation.cpp ${CMAKE_CURRENT_SOURCE_DIR}/rotation/fixedrotation.cpp ${CMAKE_CURRENT_SOURCE_DIR}/rotation/luarotation.cpp @@ -109,6 +111,9 @@ set(SOURCE_FILES ${CMAKE_CURRENT_SOURCE_DIR}/scale/timedependentscale.cpp ${CMAKE_CURRENT_SOURCE_DIR}/timeframe/timeframeinterval.cpp ${CMAKE_CURRENT_SOURCE_DIR}/timeframe/timeframeunion.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/translation/luatranslation.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/translation/statictranslation.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/translation/timelinetranslation.cpp ) source_group("Source Files" FILES ${SOURCE_FILES}) diff --git a/modules/base/basemodule.cpp b/modules/base/basemodule.cpp index ead6089797..ba70bd6c2e 100644 --- a/modules/base/basemodule.cpp +++ b/modules/base/basemodule.cpp @@ -55,9 +55,11 @@ #include #include #include +#include #include #include #include +#include #include #include #include @@ -131,6 +133,7 @@ void BaseModule::internalInitialize(const ghoul::Dictionary&) { auto fTranslation = FactoryManager::ref().factory(); ghoul_assert(fTranslation, "Ephemeris factory was not created"); + fTranslation->registerClass("TimelineTranslation"); fTranslation->registerClass("LuaTranslation"); fTranslation->registerClass("StaticTranslation"); @@ -141,6 +144,8 @@ void BaseModule::internalInitialize(const ghoul::Dictionary&) { fRotation->registerClass("FixedRotation"); fRotation->registerClass("LuaRotation"); fRotation->registerClass("StaticRotation"); + fRotation->registerClass("TimelineRotation"); + auto fScale = FactoryManager::ref().factory(); ghoul_assert(fScale, "Scale factory was not created"); @@ -198,6 +203,7 @@ std::vector BaseModule::documentations() const { FixedRotation::Documentation(), LuaRotation::Documentation(), StaticRotation::Documentation(), + TimelineRotation::Documentation(), LuaScale::Documentation(), StaticScale::Documentation(), @@ -205,6 +211,7 @@ std::vector BaseModule::documentations() const { LuaTranslation::Documentation(), StaticTranslation::Documentation(), + TimelineTranslation::Documentation(), TimeFrameInterval::Documentation(), TimeFrameUnion::Documentation(), diff --git a/modules/base/dashboard/dashboarditemframerate.cpp b/modules/base/dashboard/dashboarditemframerate.cpp index 006667a6f2..bdc10a49a0 100644 --- a/modules/base/dashboard/dashboarditemframerate.cpp +++ b/modules/base/dashboard/dashboarditemframerate.cpp @@ -289,7 +289,7 @@ void DashboardItemFramerate::render(glm::vec2& penPosition) { ); int nLines = output.empty() ? 0 : - (std::count(output.begin(), output.end(), '\n') + 1); + static_cast((std::count(output.begin(), output.end(), '\n') + 1)); penPosition.y -= _font->height() * static_cast(nLines); diff --git a/modules/base/rendering/renderabletrailtrajectory.cpp b/modules/base/rendering/renderabletrailtrajectory.cpp index 54f51f1c27..ee019b8827 100644 --- a/modules/base/rendering/renderabletrailtrajectory.cpp +++ b/modules/base/rendering/renderabletrailtrajectory.cpp @@ -226,8 +226,8 @@ void RenderableTrailTrajectory::update(const UpdateData& data) { for (int i = 0; i < nValues; ++i) { const glm::vec3 p = _translation->position({ {}, - _start + i * totalSampleInterval, - 0.0, + Time(_start + i * totalSampleInterval), + Time(0.0), false }); _vertexArray[i] = { p.x, p.y, p.z }; diff --git a/modules/base/rendering/screenspacedashboard.cpp b/modules/base/rendering/screenspacedashboard.cpp index 9f271d350c..d86376d06f 100644 --- a/modules/base/rendering/screenspacedashboard.cpp +++ b/modules/base/rendering/screenspacedashboard.cpp @@ -212,7 +212,6 @@ void ScreenSpaceDashboard::update() { if (global::windowDelegate.windowHasResized()) { const glm::ivec2 size = global::windowDelegate.currentWindowResolution(); _size = { 0.f, 0.f, size.x, size.y }; - _originalViewportSize = size; createFramebuffer(); } } diff --git a/modules/base/rendering/screenspaceframebuffer.cpp b/modules/base/rendering/screenspaceframebuffer.cpp index 28ba4d80e0..5a94669b99 100644 --- a/modules/base/rendering/screenspaceframebuffer.cpp +++ b/modules/base/rendering/screenspaceframebuffer.cpp @@ -106,15 +106,15 @@ void ScreenSpaceFramebuffer::render() { const glm::vec2& resolution = global::windowDelegate.currentWindowResolution(); const glm::vec4& size = _size.value(); - const float xratio = _originalViewportSize.x / (size.z - size.x); - const float yratio = _originalViewportSize.y / (size.w - size.y);; + const float xratio = resolution.x / (size.z - size.x); + const float yratio = resolution.y / (size.w - size.y);; if (!_renderFunctions.empty()) { glViewport( static_cast(-size.x * xratio), static_cast(-size.y * yratio), - static_cast(_originalViewportSize.x * xratio), - static_cast(_originalViewportSize.y * yratio) + static_cast(resolution.x * xratio), + static_cast(resolution.y * yratio) ); GLint defaultFBO = _framebuffer->getActiveObject(); _framebuffer->activate(); @@ -170,14 +170,16 @@ void ScreenSpaceFramebuffer::removeAllRenderFunctions() { } void ScreenSpaceFramebuffer::createFramebuffer() { + glm::vec2 resolution = global::windowDelegate.currentWindowResolution(); + _framebuffer = std::make_unique(); _framebuffer->activate(); _texture = std::make_unique(glm::uvec3( - _originalViewportSize.x, - _originalViewportSize.y, + resolution.x, + resolution.y, 1 )); - _objectSize = glm::ivec2(_originalViewportSize); + _objectSize = glm::ivec2(resolution); _texture->uploadTexture(); _texture->setFilter(ghoul::opengl::Texture::FilterMode::LinearMipMap); diff --git a/modules/base/rendering/screenspaceimagelocal.cpp b/modules/base/rendering/screenspaceimagelocal.cpp index a0751cf9f0..392a8952d0 100644 --- a/modules/base/rendering/screenspaceimagelocal.cpp +++ b/modules/base/rendering/screenspaceimagelocal.cpp @@ -28,6 +28,7 @@ #include #include #include +#include #include #include #include @@ -96,11 +97,30 @@ ScreenSpaceImageLocal::ScreenSpaceImageLocal(const ghoul::Dictionary& dictionary setGuiName("ScreenSpaceImageLocal " + std::to_string(iIdentifier)); } - _texturePath.onChange([this]() { _textureIsDirty = true; }); + _texturePath.onChange([this]() { + if (!FileSys.fileExists(FileSys.absolutePath(_texturePath))) { + LWARNINGC( + "ScreenSpaceImageLocal", + fmt::format("Image {} did not exist for {}", _texturePath, _identifier) + ); + } + else { + _textureIsDirty = true; + } + }); addProperty(_texturePath); if (dictionary.hasKey(TexturePathInfo.identifier)) { - _texturePath = dictionary.value(TexturePathInfo.identifier); + std::string path = dictionary.value(TexturePathInfo.identifier); + if (!FileSys.fileExists(FileSys.absolutePath(path))) { + LWARNINGC( + "ScreenSpaceImageLocal", + fmt::format("Image {} did not exist for {}", path, _identifier) + ); + } + else { + _texturePath = path; + } } } @@ -130,12 +150,13 @@ void ScreenSpaceImageLocal::update() { _objectSize = _texture->dimensions(); _textureIsDirty = false; } - } } void ScreenSpaceImageLocal::bindTexture() { - _texture->bind(); + if (_texture) { + _texture->bind(); + } } } // namespace openspace diff --git a/modules/base/shaders/screenspace_fs.glsl b/modules/base/shaders/screenspace_fs.glsl index 6d4e66856c..9dc5fd70ad 100644 --- a/modules/base/shaders/screenspace_fs.glsl +++ b/modules/base/shaders/screenspace_fs.glsl @@ -29,10 +29,8 @@ in vec2 vs_st; in vec4 vs_position; uniform sampler2D texture1; -uniform float OcclusionDepth; uniform float Alpha; - Fragment getFragment() { Fragment frag; diff --git a/modules/cefwebgui/cefwebguimodule.cpp b/modules/cefwebgui/cefwebguimodule.cpp index ecdbfc46b1..4a69090acf 100644 --- a/modules/cefwebgui/cefwebguimodule.cpp +++ b/modules/cefwebgui/cefwebguimodule.cpp @@ -25,7 +25,6 @@ #include #include -#include #include #include #include @@ -166,7 +165,15 @@ void CefWebGuiModule::internalInitialize(const ghoul::Dictionary& configuration) } else { WebGuiModule* webGuiModule = global::moduleEngine.module(); _url = "http://127.0.0.1:" + - std::to_string(webGuiModule->port()) + "/#/onscreen"; + std::to_string(webGuiModule->port()) + "/frontend/#/onscreen"; + + _endpointCallback = webGuiModule->addEndpointChangeCallback( + [this](const std::string& endpoint, bool exists) { + if (exists && endpoint == "frontend" && _instance) { + _instance->reloadBrowser(); + } + } + ); } if (configuration.hasValue(GuiScaleInfo.identifier)) { @@ -204,6 +211,11 @@ void CefWebGuiModule::internalInitialize(const ghoul::Dictionary& configuration) }); global::callback::deinitializeGL.emplace_back([this]() { + if (_endpointCallback != -1) { + WebGuiModule* webGuiModule = global::moduleEngine.module(); + webGuiModule->removeEndpointChangeCallback(_endpointCallback); + _endpointCallback = -1; + } _enabled = false; startOrStopGui(); }); diff --git a/modules/cefwebgui/cefwebguimodule.h b/modules/cefwebgui/cefwebguimodule.h index 81bf8231f4..d822b838a5 100644 --- a/modules/cefwebgui/cefwebguimodule.h +++ b/modules/cefwebgui/cefwebguimodule.h @@ -27,6 +27,8 @@ #include +#include + #include #include #include @@ -53,6 +55,8 @@ private: properties::StringProperty _url; properties::FloatProperty _guiScale; std::unique_ptr _instance; + + WebGuiModule::CallbackHandle _endpointCallback = -1; }; } // namespace openspace diff --git a/modules/cefwebgui/include/guirenderhandler.h b/modules/cefwebgui/include/guirenderhandler.h index 203ccf3eb9..b28a1875f5 100644 --- a/modules/cefwebgui/include/guirenderhandler.h +++ b/modules/cefwebgui/include/guirenderhandler.h @@ -39,8 +39,8 @@ public: GUIRenderHandler(); virtual ~GUIRenderHandler(); - void draw(); - void render(); + void draw() override; + void render() override; private: std::unique_ptr _programObject; diff --git a/modules/cefwebgui/shaders/gui_vs.glsl b/modules/cefwebgui/shaders/gui_vs.glsl index 2488aa7924..2323d505d3 100644 --- a/modules/cefwebgui/shaders/gui_vs.glsl +++ b/modules/cefwebgui/shaders/gui_vs.glsl @@ -31,8 +31,7 @@ uniform mat4 ortho; out vec2 Texcoord; void main() { - Texcoord = vec2(position.x + 1.0f, position.y - 1.0f) * 0.5; - Texcoord.y *= -1.0f; + Texcoord = vec2(position.x + 1.0f, position.y + 1.0f) * 0.5; gl_Position = vec4(position, 0.0, 1.0); } diff --git a/modules/digitaluniverse/rendering/renderablebillboardscloud.cpp b/modules/digitaluniverse/rendering/renderablebillboardscloud.cpp index 171625c4e3..c29d1608a9 100644 --- a/modules/digitaluniverse/rendering/renderablebillboardscloud.cpp +++ b/modules/digitaluniverse/rendering/renderablebillboardscloud.cpp @@ -750,7 +750,6 @@ void RenderableBillboardsCloud::renderBillboards(const RenderData& data, _program->activate(); - const glm::dmat4 projMatrix = glm::dmat4(data.camera.projectionMatrix()); _program->setUniform( "screenSize", glm::vec2(global::renderEngine.renderingResolution()) diff --git a/modules/digitaluniverse/rendering/renderabledumeshes.cpp b/modules/digitaluniverse/rendering/renderabledumeshes.cpp index 8c4c84e4f3..ccaa706c03 100644 --- a/modules/digitaluniverse/rendering/renderabledumeshes.cpp +++ b/modules/digitaluniverse/rendering/renderabledumeshes.cpp @@ -77,19 +77,6 @@ namespace { "all point." }; - //constexpr openspace::properties::Property::PropertyInfo ScaleFactorInfo = { - // "ScaleFactor", - // "Scale Factor", - // "This value is used as a multiplicative factor that is applied to the apparent " - // "size of each point." - //}; - - constexpr openspace::properties::Property::PropertyInfo ColorInfo = { - "Color", - "Color", - "This value is used to define the color of the astronomical object." - }; - constexpr openspace::properties::Property::PropertyInfo TextColorInfo = { "TextColor", "Text Color", @@ -427,7 +414,7 @@ void RenderableDUMeshes::initializeGL() { } void RenderableDUMeshes::deinitializeGL() { - for (const std::pair& pair : _renderingMeshesMap) { + for (const std::pair& pair : _renderingMeshesMap) { for (int i = 0; i < pair.second.numU; ++i) { glDeleteVertexArrays(1, &pair.second.vaoArray[i]); glDeleteBuffers(1, &pair.second.vboArray[i]); @@ -483,7 +470,7 @@ void RenderableDUMeshes::renderMeshes(const RenderData&, _program->setUniform(_uniformCache.alphaValue, _alphaValue); //_program->setUniform(_uniformCache.scaleFactor, _scaleFactor); - for (const std::pair& pair : _renderingMeshesMap) { + for (const std::pair& pair : _renderingMeshesMap) { _program->setUniform(_uniformCache.color, _meshColorMap[pair.second.colorIndex]); for (size_t i = 0; i < pair.second.vaoArray.size(); ++i) { glBindVertexArray(pair.second.vaoArray[i]); diff --git a/modules/digitaluniverse/rendering/renderableplanescloud.cpp b/modules/digitaluniverse/rendering/renderableplanescloud.cpp index 7581b01f17..b06176406e 100644 --- a/modules/digitaluniverse/rendering/renderableplanescloud.cpp +++ b/modules/digitaluniverse/rendering/renderableplanescloud.cpp @@ -844,7 +844,7 @@ bool RenderablePlanesCloud::loadData() { bool RenderablePlanesCloud::loadTextures() { if (!_textureFileMap.empty()) { - for (const std::pair& pair : _textureFileMap) { + for (const std::pair& pair : _textureFileMap) { const auto& p = _textureMap.insert(std::make_pair( pair.first, ghoul::io::TextureReader::ref().loadTexture(pair.second) diff --git a/modules/fieldlinessequence/rendering/renderablefieldlinessequence.cpp b/modules/fieldlinessequence/rendering/renderablefieldlinessequence.cpp index 1afc04feab..0e108d525f 100644 --- a/modules/fieldlinessequence/rendering/renderablefieldlinessequence.cpp +++ b/modules/fieldlinessequence/rendering/renderablefieldlinessequence.cpp @@ -771,7 +771,7 @@ void RenderableFieldlinesSequence::definePropertyCallbackFunctions() { }); _pJumpToStartBtn.onChange([this] { - global::timeManager.setTimeNextFrame(_startTimes[0]); + global::timeManager.setTimeNextFrame(Time(_startTimes[0])); }); } diff --git a/modules/globebrowsing/CMakeLists.txt b/modules/globebrowsing/CMakeLists.txt index 5d2bbafadf..7d46e40e1a 100644 --- a/modules/globebrowsing/CMakeLists.txt +++ b/modules/globebrowsing/CMakeLists.txt @@ -109,6 +109,11 @@ create_new_module( ${HEADER_FILES} ${SOURCE_FILES} ${SHADER_FILES} ) +option(OPENSPACE_MODULE_GLOBEBROWSING_INSTRUMENTATION "Instrumentation for GlobeBrowsing Performance" OFF) +if (OPENSPACE_MODULE_GLOBEBROWSING_INSTRUMENTATION) + target_compile_definitions(openspace-module-globebrowsing INTERFACE "OPENSPACE_MODULE_GLOBEBROWSING_INSTRUMENTATION") +endif () + install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/gdal_data DESTINATION modules/globebrowsing) if (WIN32) diff --git a/modules/globebrowsing/globebrowsingmodule.cpp b/modules/globebrowsing/globebrowsingmodule.cpp index e17d676b3e..081fedebdc 100644 --- a/modules/globebrowsing/globebrowsingmodule.cpp +++ b/modules/globebrowsing/globebrowsingmodule.cpp @@ -38,6 +38,7 @@ #include #include #include +#include #include #include #include @@ -100,6 +101,14 @@ namespace { "The maximum size of the MemoryAwareTileCache, on the CPU and GPU." }; +#ifdef OPENSPACE_MODULE_GLOBEBROWSING_INSTRUMENTATION + constexpr const openspace::properties::Property::PropertyInfo InstrumentationInfo = { + "SaveInstrumentationInfo", + "Save Instrumentation Info", + "If enabled, the instrumentation data is saved to disk at the end of the frame." + }; +#endif // OPENSPACE_MODULE_GLOBEBROWSING_INSTRUMENTATION + openspace::GlobeBrowsingModule::Capabilities parseSubDatasets(char** subDatasets, int nSubdatasets) @@ -162,12 +171,24 @@ GlobeBrowsingModule::GlobeBrowsingModule() , _wmsCacheLocation(WMSCacheLocationInfo, "${BASE}/cache_gdal") , _wmsCacheSizeMB(WMSCacheSizeInfo, 1024) , _tileCacheSizeMB(TileCacheSizeInfo, 1024) +#ifdef OPENSPACE_MODULE_GLOBEBROWSING_INSTRUMENTATION + , _saveInstrumentation(InstrumentationInfo, false) +#endif // OPENSPACE_MODULE_GLOBEBROWSING_INSTRUMENTATION { addProperty(_wmsCacheEnabled); addProperty(_offlineMode); addProperty(_wmsCacheLocation); addProperty(_wmsCacheSizeMB); addProperty(_tileCacheSizeMB); + +#ifdef OPENSPACE_MODULE_GLOBEBROWSING_INSTRUMENTATION + _saveInstrumentation.onChange([&]() { + if (_saveInstrumentation) { + _frameInfo.lastSavedFrame = global::renderEngine.frameNumber(); + } + }); + addProperty(_saveInstrumentation); +#endif // OPENSPACE_MODULE_GLOBEBROWSING_INSTRUMENTATION } void GlobeBrowsingModule::internalInitialize(const ghoul::Dictionary& dict) { @@ -234,6 +255,43 @@ void GlobeBrowsingModule::internalInitialize(const ghoul::Dictionary& dict) { // Render global::callback::render.emplace_back([&]() { _tileCache->update(); }); + // Postdraw +#ifdef OPENSPACE_MODULE_GLOBEBROWSING_INSTRUMENTATION + global::callback::postDraw.emplace_back([&]() { + // >= as we might have multiple frames per postDraw call (stereo rendering, + // fisheye, etc) + const uint16_t next = _frameInfo.lastSavedFrame + _frameInfo.saveEveryNthFrame; + const bool shouldSave = _saveInstrumentation && + global::renderEngine.frameNumber() >= next; + if (shouldSave) { + using K = const globebrowsing::RenderableGlobe*; + using V = std::vector; + for (const std::pair& i : _frameInfo.frames) { + std::string filename = fmt::format( + "_inst_globebrowsing_{}_{}_{}.txt", + i.first->owner()->identifier(), // Owner of the renderable has a name + _frameInfo.lastSavedFrame, + _frameInfo.saveEveryNthFrame + ); + std::ofstream file(absPath("${BIN}/" + filename)); + for (const FrameInfo& f : i.second) { + std::string line = fmt::format( + "{}\t{}\t{}\t{}", + f.iFrame, + f.nTilesRenderedLocal, + f.nTilesRenderedGlobal, + f.nTilesUploaded + ); + file << line << '\n'; + } + } + + _frameInfo.frames.clear(); + _frameInfo.lastSavedFrame = global::renderEngine.frameNumber(); + } + }); +#endif // OPENSPACE_MODULE_GLOBEBROWSING_INSTRUMENTATION + // Deinitialize global::callback::deinitialize.emplace_back([&]() { GdalWrapper::destroy(); }); @@ -338,16 +396,24 @@ scripting::LuaLibrary GlobeBrowsingModule::luaLibrary() const { "goToGeo", &globebrowsing::luascriptfunctions::goToGeo, {}, - "number, number, number", - "Go to geographic coordinates latitude and longitude" + "[string], number, number, [number]", + "Go to geographic coordinates of a globe. The first (optional) argument is " + "the identifier of a scene graph node that has a RenderableGlobe attached. " + "If no globe is passed in, the current anchor will be used. " + "The second argument is latitude and the third is longitude (degrees). " + "North and East are expressed as positive angles, while South and West are " + "negative. The optional fourh argument is the altitude in meters. If no " + "altitude is provided, the altitude will be kept as the current distance to " + "the surface of the specified globe." }, { "getGeoPosition", &globebrowsing::luascriptfunctions::getGeoPosition, {}, - "name, latitude, longitude, altitude", - "Returns the specified surface position on the globe as three floating point " - "values" + "string, number, number, number", + "Returns the specified surface position on the globe identified by the first " + "argument, as three floating point values - latitude, longitude and altitude " + "(degrees and meters)." }, { "getGeoPositionForCamera", @@ -355,7 +421,7 @@ scripting::LuaLibrary GlobeBrowsingModule::luaLibrary() const { {}, "void", "Get geographic coordinates of the camera poosition in latitude, " - "longitude, and altitude" + "longitude, and altitude (degrees and meters)." }, { "loadWMSCapabilities", @@ -395,29 +461,29 @@ scripting::LuaLibrary GlobeBrowsingModule::luaLibrary() const { return res; } -void GlobeBrowsingModule::goToChunk(int x, int y, int level) { - Camera* cam = global::navigationHandler.camera(); - goToChunk(*cam, globebrowsing::TileIndex(x,y,level), glm::vec2(0.5f, 0.5f), true); +void GlobeBrowsingModule::goToChunk(const globebrowsing::RenderableGlobe& globe, + int x, int y, int level) +{ + goToChunk(globe, globebrowsing::TileIndex(x, y, level), glm::vec2(0.5f, 0.5f), true); } -void GlobeBrowsingModule::goToGeo(double latitude, double longitude) { +void GlobeBrowsingModule::goToGeo(const globebrowsing::RenderableGlobe& globe, + double latitude, double longitude) +{ using namespace globebrowsing; - Camera* cam = global::navigationHandler.camera(); goToGeodetic2( - *cam, + globe, Geodetic2{ glm::radians(latitude), glm::radians(longitude) }, true ); } -void GlobeBrowsingModule::goToGeo(double latitude, double longitude, - double altitude) +void GlobeBrowsingModule::goToGeo(const globebrowsing::RenderableGlobe& globe, + double latitude, double longitude, double altitude) { using namespace globebrowsing; - - Camera* cam = global::navigationHandler.camera(); goToGeodetic3( - *cam, + globe, { Geodetic2{ glm::radians(latitude), glm::radians(longitude) }, altitude @@ -437,32 +503,15 @@ glm::vec3 GlobeBrowsingModule::cartesianCoordinatesFromGeo( altitude }; - const glm::dvec3 positionModelSpace = globe.ellipsoid().cartesianPosition(pos); - //glm::dmat4 modelTransform = globe.modelTransform(); - //glm::dvec3 positionWorldSpace = glm::dvec3(modelTransform * - //glm::dvec4(positionModelSpace, 1.0)); - - return glm::vec3(positionModelSpace); + return glm::vec3(globe.ellipsoid().cartesianPosition(pos)); } -void GlobeBrowsingModule::goToChunk(Camera& camera, const globebrowsing::TileIndex& ti, +void GlobeBrowsingModule::goToChunk(const globebrowsing::RenderableGlobe& globe, + const globebrowsing::TileIndex& ti, glm::vec2 uv, bool doResetCameraDirection) { using namespace globebrowsing; - const RenderableGlobe* globe = castFocusNodeRenderableToGlobe(); - if (!globe) { - LERROR("Focus node must have a RenderableGlobe renderable."); - return; - } - - // Camera position in model space - const glm::dvec3 camPos = camera.positionVec3(); - const glm::dmat4 inverseModelTransform = glm::inverse(globe->modelTransform()); - const glm::dvec3 cameraPositionModelSpace = glm::dvec3( - inverseModelTransform * glm::dvec4(camPos, 1) - ); - const GeodeticPatch patch(ti); const Geodetic2 corner = patch.corner(SOUTH_WEST); Geodetic2 positionOnPatch = patch.size(); @@ -473,32 +522,50 @@ void GlobeBrowsingModule::goToChunk(Camera& camera, const globebrowsing::TileInd corner.lon + positionOnPatch.lon }; - const glm::dvec3 positionOnEllipsoid = globe->ellipsoid().geodeticSurfaceProjection( + // Compute altitude + const glm::dvec3 cameraPosition = global::navigationHandler.camera()->positionVec3(); + SceneGraphNode* globeSceneGraphNode = dynamic_cast(globe.owner()); + if (!globeSceneGraphNode) { + LERROR( + "Cannot go to chunk. The renderable is not attached to a scene graph node." + ); + return; + } + const glm::dmat4 inverseModelTransform = globeSceneGraphNode->inverseModelTransform(); + const glm::dvec3 cameraPositionModelSpace = + glm::dvec3(inverseModelTransform * glm::dvec4(cameraPosition, 1.0)); + const SurfacePositionHandle posHandle = globe.calculateSurfacePositionHandle( cameraPositionModelSpace ); - const double altitude = glm::length(cameraPositionModelSpace - positionOnEllipsoid); + + const Geodetic2 geo2 = globe.ellipsoid().cartesianToGeodetic2( + posHandle.centerToReferenceSurface + ); - goToGeodetic3(camera, {pointPosition, altitude}, doResetCameraDirection); + const double altitude = glm::length( + cameraPositionModelSpace - posHandle.centerToReferenceSurface + ); + + goToGeodetic3(globe, { pointPosition, altitude }, doResetCameraDirection); } -void GlobeBrowsingModule::goToGeodetic2(Camera& camera, globebrowsing::Geodetic2 geo2, +void GlobeBrowsingModule::goToGeodetic2(const globebrowsing::RenderableGlobe& globe, + globebrowsing::Geodetic2 geo2, bool doResetCameraDirection) { using namespace globebrowsing; - const RenderableGlobe* globe = castFocusNodeRenderableToGlobe(); - if (!globe) { - LERROR("Focus node must have a RenderableGlobe renderable."); - return; + const glm::dvec3 cameraPosition = global::navigationHandler.camera()->positionVec3(); + SceneGraphNode* globeSceneGraphNode = dynamic_cast(globe.owner()); + if (!globeSceneGraphNode) { + LERROR("Error when going to Geodetic2"); } - interaction::NavigationHandler& nav = global::navigationHandler; - const glm::dvec3 cameraPosition = nav.camera()->positionVec3(); - const glm::dmat4 inverseModelTransform = - nav.orbitalNavigator().anchorNode()->inverseModelTransform(); + const glm::dmat4 inverseModelTransform = globeSceneGraphNode->inverseModelTransform(); + const glm::dvec3 cameraPositionModelSpace = glm::dvec3(inverseModelTransform * glm::dvec4(cameraPosition, 1.0)); - const SurfacePositionHandle posHandle = globe->calculateSurfacePositionHandle( + const SurfacePositionHandle posHandle = globe.calculateSurfacePositionHandle( cameraPositionModelSpace ); @@ -506,71 +573,58 @@ void GlobeBrowsingModule::goToGeodetic2(Camera& camera, globebrowsing::Geodetic2 posHandle.referenceSurfaceOutDirection * posHandle.heightToSurface; const double altitude = glm::length(cameraPositionModelSpace - centerToActualSurface); - goToGeodetic3(camera, { geo2, altitude }, doResetCameraDirection); + goToGeodetic3(globe, { geo2, altitude }, doResetCameraDirection); } -void GlobeBrowsingModule::goToGeodetic3(Camera& camera, globebrowsing::Geodetic3 geo3, +void GlobeBrowsingModule::goToGeodetic3(const globebrowsing::RenderableGlobe& globe, + globebrowsing::Geodetic3 geo3, bool doResetCameraDirection) { using namespace globebrowsing; + const glm::dvec3 positionModelSpace = globe.ellipsoid().cartesianPosition(geo3); - const RenderableGlobe* globe = castFocusNodeRenderableToGlobe(); - if (!globe) { - LERROR("Focus node must have a RenderableGlobe renderable."); - return; - } - const glm::dvec3 positionModelSpace = globe->ellipsoid().cartesianPosition(geo3); - const glm::dmat4 modelTransform = globe->modelTransform(); - const glm::dvec3 positionWorldSpace = glm::dvec3(modelTransform * - glm::dvec4(positionModelSpace, 1.0)); - camera.setPositionVec3(positionWorldSpace); + const glm::dvec3 slightlyNorth = globe.ellipsoid().cartesianSurfacePosition( + Geodetic2{ geo3.geodetic2.lat + 0.001, geo3.geodetic2.lon } + ); - if (doResetCameraDirection) { - resetCameraDirection(camera, geo3.geodetic2); - } + interaction::NavigationHandler::NavigationState state; + state.anchor = globe.owner()->identifier(); + state.referenceFrame = globe.owner()->identifier(); + state.position = positionModelSpace; + state.up = slightlyNorth; + + global::navigationHandler.setNavigationStateNextFrame(state); } -void GlobeBrowsingModule::resetCameraDirection(Camera& camera, - globebrowsing::Geodetic2 geo2) +glm::dquat GlobeBrowsingModule::lookDownCameraRotation( + const globebrowsing::RenderableGlobe& globe, + glm::dvec3 cameraModelSpace, + globebrowsing::Geodetic2 geo2) { using namespace globebrowsing; - const RenderableGlobe* globe = castFocusNodeRenderableToGlobe(); - if (!globe) { - LERROR("Focus node must have a RenderableGlobe renderable."); - return; - } - // Camera is described in world space - const glm::dmat4 modelTransform = globe->modelTransform(); + const glm::dmat4 modelTransform = globe.modelTransform(); // Lookup vector - const glm::dvec3 positionModelSpace = globe->ellipsoid().cartesianSurfacePosition( + const glm::dvec3 positionModelSpace = globe.ellipsoid().cartesianSurfacePosition( geo2 ); - const glm::dvec3 slightlyNorth = globe->ellipsoid().cartesianSurfacePosition( + const glm::dvec3 slightlyNorth = globe.ellipsoid().cartesianSurfacePosition( Geodetic2{ geo2.lat + 0.001, geo2.lon } ); const glm::dvec3 lookUpModelSpace = glm::normalize( slightlyNorth - positionModelSpace ); - const glm::dvec3 lookUpWorldSpace = glm::dmat3(modelTransform) * lookUpModelSpace; - - // Lookat vector - const glm::dvec3 lookAtWorldSpace = glm::dvec3( - modelTransform * glm::dvec4(positionModelSpace, 1.0) - ); - - // Eye position - const glm::dvec3 eye = camera.positionVec3(); // Matrix - const glm::dmat4 lookAtMatrix = glm::lookAt(eye, lookAtWorldSpace, lookUpWorldSpace); + const glm::dmat4 lookAtMatrix = + glm::lookAt(cameraModelSpace, positionModelSpace, lookUpModelSpace); // Set rotation const glm::dquat rotation = glm::quat_cast(inverse(lookAtMatrix)); - camera.setRotation(rotation); + return rotation; } const globebrowsing::RenderableGlobe* @@ -732,5 +786,27 @@ uint64_t GlobeBrowsingModule::wmsCacheSize() const { return size * 1024 * 1024; } +#ifdef OPENSPACE_MODULE_GLOBEBROWSING_INSTRUMENTATION +void GlobeBrowsingModule::addFrameInfo(globebrowsing::RenderableGlobe* globe, + uint32_t nTilesRenderedLocal, + uint32_t nTilesRenderedGlobal, + uint32_t nTilesUploaded) +{ + auto it = _frameInfo.frames.find(globe); + if (it == _frameInfo.frames.end()) { + _frameInfo.frames[globe] = std::vector(); + _frameInfo.frames[globe].reserve(_frameInfo.saveEveryNthFrame); + } + else { + it->second.push_back({ + global::renderEngine.frameNumber(), + nTilesRenderedLocal, + nTilesRenderedGlobal, + nTilesUploaded + }); + } +} + +#endif // OPENSPACE_MODULE_GLOBEBROWSING_INSTRUMENTATION } // namespace openspace diff --git a/modules/globebrowsing/globebrowsingmodule.h b/modules/globebrowsing/globebrowsingmodule.h index 9db83196a9..89e397d8ab 100644 --- a/modules/globebrowsing/globebrowsingmodule.h +++ b/modules/globebrowsing/globebrowsingmodule.h @@ -53,9 +53,12 @@ public: GlobeBrowsingModule(); - void goToChunk(int x, int y, int level); - void goToGeo(double latitude, double longitude); - void goToGeo(double latitude, double longitude, double altitude); + void goToChunk(const globebrowsing::RenderableGlobe& globe, int x, int y, int level); + void goToGeo(const globebrowsing::RenderableGlobe& globe, + double latitude, double longitude); + + void goToGeo(const globebrowsing::RenderableGlobe& globe, + double latitude, double longitude, double altitude); glm::vec3 cartesianCoordinatesFromGeo(const globebrowsing::RenderableGlobe& globe, double latitude, double longitude, double altitude); @@ -90,17 +93,26 @@ public: std::string wmsCacheLocation() const; uint64_t wmsCacheSize() const; // bytes +#ifdef OPENSPACE_MODULE_GLOBEBROWSING_INSTRUMENTATION + void addFrameInfo(globebrowsing::RenderableGlobe* globe, uint32_t nTilesRenderedLocal, + uint32_t nTilesRenderedGlobal, uint32_t nTilesUploaded); +#endif // OPENSPACE_MODULE_GLOBEBROWSING_INSTRUMENTATION + protected: void internalInitialize(const ghoul::Dictionary&) override; private: - void goToChunk(Camera& camera, const globebrowsing::TileIndex& ti, glm::vec2 uv, - bool doResetCameraDirection); - void goToGeodetic2(Camera& camera, globebrowsing::Geodetic2 geo2, - bool doResetCameraDirection); - void goToGeodetic3(Camera& camera, globebrowsing::Geodetic3 geo3, - bool doResetCameraDirection); - void resetCameraDirection(Camera& camera, globebrowsing::Geodetic2 geo2); + void goToChunk(const globebrowsing::RenderableGlobe& globe, + const globebrowsing::TileIndex& ti, glm::vec2 uv, bool doResetCameraDirection); + + void goToGeodetic2(const globebrowsing::RenderableGlobe& globe, + globebrowsing::Geodetic2 geo2, bool doResetCameraDirection); + + void goToGeodetic3(const globebrowsing::RenderableGlobe& globe, + globebrowsing::Geodetic3 geo3, bool doResetCameraDirection); + + glm::dquat lookDownCameraRotation(const globebrowsing::RenderableGlobe& globe, + glm::dvec3 cameraPositionModelSpace, globebrowsing::Geodetic2 geo2); /** \return a comma separated list of layer group names. @@ -127,6 +139,26 @@ private: std::map _capabilitiesMap; std::multimap _urlList; + +#ifdef OPENSPACE_MODULE_GLOBEBROWSING_INSTRUMENTATION + struct FrameInfo { + uint64_t iFrame = 0; + uint32_t nTilesRenderedLocal = 0; + uint32_t nTilesRenderedGlobal = 0; + uint32_t nTilesUploaded = 0; + }; + + struct { + std::unordered_map< + globebrowsing::RenderableGlobe*, + std::vector + > frames; + + uint64_t lastSavedFrame = 0; + const uint16_t saveEveryNthFrame = 2048; + } _frameInfo; + properties::BoolProperty _saveInstrumentation; +#endif // OPENSPACE_MODULE_GLOBEBROWSING_INSTRUMENTATION }; } // namespace openspace diff --git a/modules/globebrowsing/globebrowsingmodule_lua.inl b/modules/globebrowsing/globebrowsingmodule_lua.inl index b9928a119f..0c6479b211 100644 --- a/modules/globebrowsing/globebrowsingmodule_lua.inl +++ b/modules/globebrowsing/globebrowsingmodule_lua.inl @@ -128,31 +128,79 @@ int deleteLayer(lua_State* L) { } int goToChunk(lua_State* L) { - ghoul::lua::checkArgumentsAndThrow(L, 3, "lua::goToChunk"); + ghoul::lua::checkArgumentsAndThrow(L, 4, "lua::goToChunk"); - const int x = ghoul::lua::value(L, 1); - const int y = ghoul::lua::value(L, 2); - const int level = ghoul::lua::value(L, 3); - lua_pop(L, 3); + const std::string& globeIdentifier = ghoul::lua::value(L, 1); + const int x = ghoul::lua::value(L, 2); + const int y = ghoul::lua::value(L, 3); + const int level = ghoul::lua::value(L, 4); + lua_pop(L, 4); - global::moduleEngine.module()->goToChunk(x, y, level); + SceneGraphNode* n = sceneGraphNode(globeIdentifier); + if (!n) { + return ghoul::lua::luaError(L, "Unknown globe name: " + globeIdentifier); + } + + const RenderableGlobe* globe = dynamic_cast(n->renderable()); + if (!globe) { + return ghoul::lua::luaError(L, "Identifier must be a RenderableGlobe"); + } + + global::moduleEngine.module()->goToChunk(*globe, x, y, level); ghoul_assert(lua_gettop(L) == 0, "Incorrect number of items left on stack"); return 0; } int goToGeo(lua_State* L) { - const int nArguments = ghoul::lua::checkArgumentsAndThrow(L, 2, 3, "lua::goToGeo"); + const int nArguments = ghoul::lua::checkArgumentsAndThrow(L, { 2, 4 }, "lua::goToGeo"); - const double latitude = ghoul::lua::value(L, 1); - const double longitude = ghoul::lua::value(L, 2); + // Check if the user provided a Scene graph node identifier as the first argument. + // lua_isstring returns true for both numbers and strings, so better use !lua_isnumber + const bool providedGlobeIdentifier = !lua_isnumber(L, 1); + const int parameterOffset = providedGlobeIdentifier ? 1 : 0; - if (nArguments == 2) { - global::moduleEngine.module()->goToGeo(latitude, longitude); + const SceneGraphNode* n; + if (providedGlobeIdentifier) { + const std::string& globeIdentifier = ghoul::lua::value(L, 1); + n = sceneGraphNode(globeIdentifier); + if (!n) { + return ghoul::lua::luaError(L, "Unknown globe name: " + globeIdentifier); + } } - else if (nArguments == 3) { - const double altitude = ghoul::lua::value(L, 3); + else { + n = global::navigationHandler.orbitalNavigator().anchorNode(); + if (!n) { + return ghoul::lua::luaError(L, "No anchor node is set."); + } + } + + const double latitude = ghoul::lua::value(L, parameterOffset + 1); + const double longitude = ghoul::lua::value(L, parameterOffset + 2); + + const RenderableGlobe* globe = dynamic_cast(n->renderable()); + if (!globe) { + if (providedGlobeIdentifier) { + return ghoul::lua::luaError(L, "Identifier must be a RenderableGlobe"); + } + else { + return ghoul::lua::luaError(L, + "Current anchor node is not a RenderableGlobe. " + "Either change the anchor to a globe, or specify a globe identifier " + "as the first argument" + ); + } + } + + if (nArguments == parameterOffset + 2) { global::moduleEngine.module()->goToGeo( + *globe, latitude, longitude + ); + } + else if (nArguments == parameterOffset + 3) { + const double altitude = ghoul::lua::value(L, parameterOffset + 3); + global::moduleEngine.module()->goToGeo( + *globe, latitude, longitude, altitude @@ -168,19 +216,19 @@ int goToGeo(lua_State* L) { int getGeoPosition(lua_State* L) { ghoul::lua::checkArgumentsAndThrow(L, 4, "lua::getGeoPosition"); - const std::string& name = ghoul::lua::value(L, 1); + const std::string& globeIdentifier = ghoul::lua::value(L, 1); const double latitude = ghoul::lua::value(L, 2); const double longitude = ghoul::lua::value(L, 3); const double altitude = ghoul::lua::value(L, 4); lua_pop(L, 4); - SceneGraphNode* n = sceneGraphNode(name); + SceneGraphNode* n = sceneGraphNode(globeIdentifier); if (!n) { - return ghoul::lua::luaError(L, "Unknown globe name: " + name); + return ghoul::lua::luaError(L, "Unknown globe identifier: " + globeIdentifier); } const RenderableGlobe* globe = dynamic_cast(n->renderable()); if (!globe) { - return ghoul::lua::luaError(L, "Name must be a RenderableGlobe"); + return ghoul::lua::luaError(L, "Identifier must be a RenderableGlobe"); } GlobeBrowsingModule& mod = *(global::moduleEngine.module()); diff --git a/modules/globebrowsing/src/dashboarditemglobelocation.cpp b/modules/globebrowsing/src/dashboarditemglobelocation.cpp index 86ab30d9e0..3b6dcbf462 100644 --- a/modules/globebrowsing/src/dashboarditemglobelocation.cpp +++ b/modules/globebrowsing/src/dashboarditemglobelocation.cpp @@ -173,9 +173,16 @@ void DashboardItemGlobeLocation::render(glm::vec2& penPosition) { bool isEast = lon > 0.0; lon = std::abs(lon); - const double altitude = glm::length( + double altitude = glm::length( cameraPositionModelSpace - posHandle.centerToReferenceSurface ); + + if (glm::length(cameraPositionModelSpace) < + glm::length(posHandle.centerToReferenceSurface)) + { + altitude = -altitude; + } + std::pair dist = simplifyDistance(altitude); penPosition.y -= _font->height(); diff --git a/modules/globebrowsing/src/globelabelscomponent.cpp b/modules/globebrowsing/src/globelabelscomponent.cpp index 864b85d6c7..9cea901ce7 100644 --- a/modules/globebrowsing/src/globelabelscomponent.cpp +++ b/modules/globebrowsing/src/globelabelscomponent.cpp @@ -45,11 +45,10 @@ #include namespace { - constexpr const char* KeyLabels = "Labels"; - constexpr const char* KeyLabelsFileName = "FileName"; - constexpr const char* _loggerCat = "GlobeLabels"; + constexpr const char* KeyLabelsFileName = "FileName"; + constexpr const double LabelFadeRangeConst = 1500.0; constexpr const double RangeAngularCoefConst = 0.8; constexpr const float MinTransparencyValueConst = 0.009f; @@ -671,19 +670,10 @@ void GlobeLabelsComponent::renderLabels(const RenderData& data, float distToCamera, float fadeInVariable ) { - constexpr double DIST_EPS = 6000.0; - constexpr double SIN_EPS = 0.001; - glm::vec4 textColor = _labelsColor; textColor.a *= fadeInVariable; - glm::dmat4 invMP = glm::inverse(_globe->modelTransform()); - glm::dmat4 invCombinedView = glm::inverse(data.camera.combinedViewMatrix()); - - glm::dvec4 cameraPosWorld = invCombinedView * glm::dvec4(0.0, 0.0, 0.0, 1.0); - glm::dvec3 cameraPosObj = glm::dvec3(invMP * cameraPosWorld); glm::dvec4 cameraUpVecWorld = glm::dvec4(data.camera.lookUpVectorWorldSpace(), 0.0); - glm::dvec3 cameraLookUpObj = glm::dvec3(invMP * cameraUpVecWorld); glm::dmat4 VP = glm::dmat4(data.camera.sgctInternal.projectionMatrix()) * data.camera.combinedViewMatrix(); @@ -799,7 +789,7 @@ bool GlobeLabelsComponent::isLabelInFrustum(const glm::dmat4& MVMatrix, double bottomDistance = MVMatrix[3][3] + MVMatrix[3][1]; double topDistance = MVMatrix[3][3] - MVMatrix[3][1]; double nearDistance = MVMatrix[3][3] + MVMatrix[3][2]; - double farDistance = MVMatrix[3][3] - MVMatrix[3][2]; + // double farDistance = MVMatrix[3][3] - MVMatrix[3][2]; // Normalize Planes const double invMagLeft = 1.0 / glm::length(leftNormal); @@ -824,7 +814,7 @@ bool GlobeLabelsComponent::isLabelInFrustum(const glm::dmat4& MVMatrix, const double invMagFar = 1.0 / glm::length(farNormal); farNormal *= invMagFar; - farDistance *= invMagFar; + // farDistance *= invMagFar; constexpr const float Radius = 1.0; diff --git a/modules/globebrowsing/src/globetranslation.cpp b/modules/globebrowsing/src/globetranslation.cpp index 6c4a5ea2c9..560994bed4 100644 --- a/modules/globebrowsing/src/globetranslation.cpp +++ b/modules/globebrowsing/src/globetranslation.cpp @@ -58,20 +58,21 @@ namespace { "globe. The default value is 0.0" }; - constexpr openspace::properties::Property::PropertyInfo FixedAltitudeInfo = { - "FixedAltitude", - "Fixed Altitude", - "The altitude in meters of the location on the globe's surface. This value is " - "used if the 'UseFixedAltitude' property is 'true'. The default value is 10000km." + constexpr openspace::properties::Property::PropertyInfo AltitudeInfo = { + "Altitude", + "Altitude", + "The altitude in meters. " + "If the 'UseHeightmap' property is 'true', this is an offset from the actual " + "surface of the globe. If not, this is an offset from the reference ellipsoid." + "The default value is 0.0" }; - constexpr openspace::properties::Property::PropertyInfo UseFixedAltitudeInfo = { - "UseFixedAltitude", - "Use Fixed Altitude", - "If this value is 'true', the altitude specified in 'FixedAltitude' is used for " - "this translation. If it is 'false', the altitude will be computed based on the " - "height information that is available about the globe to which this translation " - "is attached. The default value is 'true'." + constexpr openspace::properties::Property::PropertyInfo UseHeightmapInfo = { + "UseHeightmap", + "Use Heightmap", + "If this value is 'true', the altitude specified in 'Altitude' will be treated " + "as an offset from the heightmap. Otherwise, it will be an offset from the " + "globe's reference ellipsoid. The default value is 'false'." }; } // namespace @@ -81,8 +82,8 @@ documentation::Documentation GlobeTranslation::Documentation() { using namespace openspace::documentation; return { - "Spice Translation", - "space_translation_spicetranslation", + "Globe Translation", + "space_translation_globetranslation", { { "Type", @@ -110,16 +111,16 @@ documentation::Documentation GlobeTranslation::Documentation() { LatitudeInfo.description, }, { - FixedAltitudeInfo.identifier, + AltitudeInfo.identifier, new DoubleVerifier, Optional::Yes, - FixedAltitudeInfo.description + AltitudeInfo.description }, { - UseFixedAltitudeInfo.identifier, + UseHeightmapInfo.identifier, new BoolVerifier, Optional::Yes, - UseFixedAltitudeInfo.description + UseHeightmapInfo.description } } }; @@ -129,8 +130,8 @@ GlobeTranslation::GlobeTranslation(const ghoul::Dictionary& dictionary) : _globe(GlobeInfo) , _longitude(LongitudeInfo, 0.0, -180.0, 180.0) , _latitude(LatitudeInfo, 0.0, -90.0, 90.0) - , _fixedAltitude(FixedAltitudeInfo, 1e8, 0.0, 1e12) - , _useFixedAltitude(UseFixedAltitudeInfo, false) + , _altitude(AltitudeInfo, 0.0, 0.0, 1e12) + , _useHeightmap(UseHeightmapInfo, false) { documentation::testSpecificationAndThrow( Documentation(), @@ -145,11 +146,11 @@ GlobeTranslation::GlobeTranslation(const ghoul::Dictionary& dictionary) if (dictionary.hasKey(LatitudeInfo.identifier)) { _latitude = dictionary.value(LatitudeInfo.identifier); } - if (dictionary.hasKey(FixedAltitudeInfo.identifier)) { - _fixedAltitude = dictionary.value(FixedAltitudeInfo.identifier); + if (dictionary.hasKey(AltitudeInfo.identifier)) { + _altitude = dictionary.value(AltitudeInfo.identifier); } - if (dictionary.hasKey(UseFixedAltitudeInfo.identifier)) { - _useFixedAltitude = dictionary.value(UseFixedAltitudeInfo.identifier); + if (dictionary.hasKey(UseHeightmapInfo.identifier)) { + _useHeightmap = dictionary.value(UseHeightmapInfo.identifier); } _globe.onChange([this]() { @@ -159,8 +160,13 @@ GlobeTranslation::GlobeTranslation(const ghoul::Dictionary& dictionary) _longitude.onChange([this]() { _positionIsDirty = true; }); _latitude.onChange([this]() { _positionIsDirty = true; }); - _fixedAltitude.onChange([this]() { _positionIsDirty = true; }); - _useFixedAltitude.onChange([this]() { _positionIsDirty = true; }); + _altitude.onChange([this]() { _positionIsDirty = true; }); + _useHeightmap.onChange([this]() { _positionIsDirty = true; }); + + addProperty(_longitude); + addProperty(_latitude); + addProperty(_altitude); + addProperty(_useHeightmap); } void GlobeTranslation::fillAttachedNode() { @@ -173,8 +179,10 @@ void GlobeTranslation::fillAttachedNode() { "GlobeTranslation", "Could not set attached node as it does not have a RenderableGlobe" ); - // Reset the globe name to it's previous name - _globe = _attachedNode->identifier(); + if (_attachedNode) { + // Reset the globe name to it's previous name + _globe = _attachedNode->identifier(); + } } } @@ -188,8 +196,8 @@ glm::dvec3 GlobeTranslation::position(const UpdateData&) const { _positionIsDirty = true; } - if (!_useFixedAltitude) { - // If we don't use the fixed altitude, we have to compute the height every frame + if (_useHeightmap) { + // If we use the heightmap, we have to compute the height every frame _positionIsDirty = true; } @@ -197,33 +205,35 @@ glm::dvec3 GlobeTranslation::position(const UpdateData&) const { return _position; } - GlobeBrowsingModule& mod = *(global::moduleEngine.module()); - glm::vec3 pos = mod.cartesianCoordinatesFromGeo( - *_attachedNode, - _latitude, - _longitude, - _fixedAltitude - ); - - if (_useFixedAltitude) { - _position = glm::dvec3(pos); - _positionIsDirty = true; - - return _position; - } - else { - SurfacePositionHandle h = _attachedNode->calculateSurfacePositionHandle(pos); - - pos = mod.cartesianCoordinatesFromGeo( + if (_useHeightmap) { + glm::vec3 groundPos = mod.cartesianCoordinatesFromGeo( *_attachedNode, _latitude, _longitude, - h.heightToSurface + 0.0 ); - _position = glm::dvec3(pos); + SurfacePositionHandle h = + _attachedNode->calculateSurfacePositionHandle(groundPos); + + _position = mod.cartesianCoordinatesFromGeo( + *_attachedNode, + _latitude, + _longitude, + h.heightToSurface + _altitude + ); + return _position; + } + else { + _position = mod.cartesianCoordinatesFromGeo( + *_attachedNode, + _latitude, + _longitude, + _altitude + ); + _positionIsDirty = false; return _position; } } diff --git a/modules/globebrowsing/src/globetranslation.h b/modules/globebrowsing/src/globetranslation.h index 7fbd943b7b..91c0bdf61b 100644 --- a/modules/globebrowsing/src/globetranslation.h +++ b/modules/globebrowsing/src/globetranslation.h @@ -49,8 +49,8 @@ private: properties::StringProperty _globe; properties::DoubleProperty _longitude; properties::DoubleProperty _latitude; - properties::DoubleProperty _fixedAltitude; - properties::BoolProperty _useFixedAltitude; + properties::DoubleProperty _altitude; + properties::BoolProperty _useHeightmap; RenderableGlobe* _attachedNode = nullptr; diff --git a/modules/globebrowsing/src/layer.cpp b/modules/globebrowsing/src/layer.cpp index 52e69b7731..e07f632bbb 100644 --- a/modules/globebrowsing/src/layer.cpp +++ b/modules/globebrowsing/src/layer.cpp @@ -341,9 +341,12 @@ void Layer::onChange(std::function callback) { _onChangeCallback = std::move(callback); } -void Layer::update() { +int Layer::update() { if (_tileProvider) { - tileprovider::update(*_tileProvider); + return tileprovider::update(*_tileProvider); + } + else { + return 0; } } diff --git a/modules/globebrowsing/src/layer.h b/modules/globebrowsing/src/layer.h index 4658468b90..908217611f 100644 --- a/modules/globebrowsing/src/layer.h +++ b/modules/globebrowsing/src/layer.h @@ -64,7 +64,8 @@ public: void onChange(std::function callback); - void update(); + // Return: number of tiles that were updated + int update(); glm::ivec2 tilePixelStartOffset() const; glm::ivec2 tilePixelSizeDifference() const; diff --git a/modules/globebrowsing/src/layergroup.cpp b/modules/globebrowsing/src/layergroup.cpp index f6088e8869..e0aff6f0af 100644 --- a/modules/globebrowsing/src/layergroup.cpp +++ b/modules/globebrowsing/src/layergroup.cpp @@ -91,15 +91,18 @@ void LayerGroup::deinitialize() { } } -void LayerGroup::update() { +int LayerGroup::update() { + int res = 0; _activeLayers.clear(); for (const std::unique_ptr& layer : _layers) { if (layer->enabled()) { - layer->update(); + res += layer->update(); _activeLayers.push_back(layer.get()); } } + + return res; } Layer* LayerGroup::addLayer(const ghoul::Dictionary& layerDict) { diff --git a/modules/globebrowsing/src/layergroup.h b/modules/globebrowsing/src/layergroup.h index 923cef7011..7db9a718de 100644 --- a/modules/globebrowsing/src/layergroup.h +++ b/modules/globebrowsing/src/layergroup.h @@ -48,7 +48,8 @@ struct LayerGroup : public properties::PropertyOwner { void deinitialize(); /// Updates all layers tile providers within this group - void update(); + /// Return: Number of tiles that were updated + int update(); Layer* addLayer(const ghoul::Dictionary& layerDict); void deleteLayer(const std::string& layerName); diff --git a/modules/globebrowsing/src/layermanager.cpp b/modules/globebrowsing/src/layermanager.cpp index 0f442d8bcf..ae677ada58 100644 --- a/modules/globebrowsing/src/layermanager.cpp +++ b/modules/globebrowsing/src/layermanager.cpp @@ -111,10 +111,12 @@ std::array LayerManager::layerGroups( return res; } -void LayerManager::update() { +int LayerManager::update() { + int res = 0; for (std::unique_ptr& layerGroup : _layerGroups) { - layerGroup->update(); + res += layerGroup->update(); } + return res; } void LayerManager::reset(bool includeDisabled) { diff --git a/modules/globebrowsing/src/layermanager.h b/modules/globebrowsing/src/layermanager.h index de7fbb4c62..36de309488 100644 --- a/modules/globebrowsing/src/layermanager.h +++ b/modules/globebrowsing/src/layermanager.h @@ -63,7 +63,8 @@ public: std::array layerGroups() const; - void update(); + // Return: Number of tiles updated + int update(); void reset(bool includeDisabled = false); void onChange(std::function callback); diff --git a/modules/globebrowsing/src/renderableglobe.cpp b/modules/globebrowsing/src/renderableglobe.cpp index 6361670ee6..51c263d9c3 100644 --- a/modules/globebrowsing/src/renderableglobe.cpp +++ b/modules/globebrowsing/src/renderableglobe.cpp @@ -47,6 +47,13 @@ #include #include +#ifdef OPENSPACE_MODULE_GLOBEBROWSING_INSTRUMENTATION +#include +#include +openspace::GlobeBrowsingModule* _module = nullptr; + +#endif // OPENSPACE_MODULE_GLOBEBROWSING_INSTRUMENTATION + namespace { // Global flags to modify the RenderableGlobe constexpr const bool LimitLevelByAvailableData = true; @@ -176,7 +183,7 @@ namespace { }; constexpr openspace::properties::Property::PropertyInfo TargetLodScaleFactorInfo = { - "TargetLodScaleFactorInfo", + "TargetLodScaleFactor", "Target Level of Detail Scale Factor", "" // @TODO Missing documentation }; @@ -595,10 +602,13 @@ RenderableGlobe::RenderableGlobe(const ghoul::Dictionary& dictionary) if (dictionary.hasKeyAndValue(KeyLabels)) { _labelsDictionary = dictionary.value(KeyLabels); } + +#ifdef OPENSPACE_MODULE_GLOBEBROWSING_INSTRUMENTATION + _module = global::moduleEngine.module(); +#endif // OPENSPACE_MODULE_GLOBEBROWSING_INSTRUMENTATION } void RenderableGlobe::initializeGL() { - if (!_labelsDictionary.empty()) { _globeLabelsComponent.initialize(_labelsDictionary, this); addPropertySubOwner(_globeLabelsComponent); @@ -745,7 +755,11 @@ void RenderableGlobe::update(const UpdateData& data) { _layerManager.reset(); _debugProperties.resetTileProviders = false; } +#ifdef OPENSPACE_MODULE_GLOBEBROWSING_INSTRUMENTATION + _nUploadedTiles = _layerManager.update(); +#else _layerManager.update(); +#endif // OPENSPACE_MODULE_GLOBEBROWSING_INSTRUMENTATION if (_nLayersIsDirty) { std::array lgs = @@ -1034,6 +1048,14 @@ void RenderableGlobe::renderChunks(const RenderData& data, RendererTasks&) { } _localRenderer.program->deactivate(); +#ifdef OPENSPACE_MODULE_GLOBEBROWSING_INSTRUMENTATION + _module->addFrameInfo( + this, + std::min(localCount, ChunkBufferSize), + std::min(globalCount, ChunkBufferSize), + _nUploadedTiles + ); +#endif // OPENSPACE_MODULE_GLOBEBROWSING_INSTRUMENTATION if (_debugProperties.showChunkBounds || _debugProperties.showChunkAABB) { for (int i = 0; i < std::min(globalCount, ChunkBufferSize); ++i) { diff --git a/modules/globebrowsing/src/renderableglobe.h b/modules/globebrowsing/src/renderableglobe.h index 93022b532c..7886c0d3e2 100644 --- a/modules/globebrowsing/src/renderableglobe.h +++ b/modules/globebrowsing/src/renderableglobe.h @@ -274,6 +274,10 @@ private: // Labels GlobeLabelsComponent _globeLabelsComponent; ghoul::Dictionary _labelsDictionary; + +#ifdef OPENSPACE_MODULE_GLOBEBROWSING_INSTRUMENTATION + int _nUploadedTiles = 0; +#endif // OPENSPACE_MODULE_GLOBEBROWSING_INSTRUMENTATION }; } // namespace openspace::globebrowsing diff --git a/modules/globebrowsing/src/tileprovider.cpp b/modules/globebrowsing/src/tileprovider.cpp index 0fe168fd78..ad72426685 100644 --- a/modules/globebrowsing/src/tileprovider.cpp +++ b/modules/globebrowsing/src/tileprovider.cpp @@ -162,15 +162,17 @@ void initAsyncTileDataReader(DefaultTileProvider& t, TileTextureInitData initDat ); } -void initTexturesFromLoadedData(DefaultTileProvider& t) { +bool initTexturesFromLoadedData(DefaultTileProvider& t) { if (t.asyncTextureDataProvider) { std::optional tile = t.asyncTextureDataProvider->popFinishedRawTile(); if (tile) { const cache::ProviderTileKey key = { tile->tileIndex, t.uniqueIdentifier }; ghoul_assert(!t.tileCache->exist(key), "Tile must not be existing in cache"); t.tileCache->createTileAndPut(key, std::move(tile.value())); + return true; } } + return false; } @@ -1073,7 +1075,7 @@ TileDepthTransform depthTransform(TileProvider& tp) { -void update(TileProvider& tp) { +int update(TileProvider& tp) { switch (tp.type) { case Type::DefaultTileProvider: { DefaultTileProvider& t = static_cast(tp); @@ -1082,7 +1084,7 @@ void update(TileProvider& tp) { } t.asyncTextureDataProvider->update(); - initTexturesFromLoadedData(t); + bool hasUploaded = initTexturesFromLoadedData(t); if (t.asyncTextureDataProvider->shouldBeDeleted()) { t.asyncTextureDataProvider = nullptr; @@ -1091,6 +1093,9 @@ void update(TileProvider& tp) { tileTextureInitData(t.layerGroupID, t.padTiles, t.tilePixelSize) ); } + if (hasUploaded) { + return 1; + } break; } case Type::SingleImageTileProvider: @@ -1123,13 +1128,16 @@ void update(TileProvider& tp) { if (newCurrent) { t.currentTileProvider = newCurrent; } - update(*t.currentTileProvider); + if (t.currentTileProvider) { + update(*t.currentTileProvider); + } } break; } default: throw ghoul::MissingCaseException(); } + return 0; } diff --git a/modules/globebrowsing/src/tileprovider.h b/modules/globebrowsing/src/tileprovider.h index c367638374..c7e3cd5196 100644 --- a/modules/globebrowsing/src/tileprovider.h +++ b/modules/globebrowsing/src/tileprovider.h @@ -222,8 +222,10 @@ TileDepthTransform depthTransform(TileProvider& tp); /** * This method should be called once per frame. Here, TileProviders * are given the opportunity to update their internal state. + * + * \return The number of tiles that have been updated in this call */ -void update(TileProvider& tp); +int update(TileProvider& tp); /** * Provides a uniform way of all TileProviders to reload or diff --git a/modules/imgui/src/gui.cpp b/modules/imgui/src/gui.cpp index 51088e6abf..0767a812a4 100644 --- a/modules/imgui/src/gui.cpp +++ b/modules/imgui/src/gui.cpp @@ -53,32 +53,69 @@ namespace { constexpr const std::array UniformNames = { "tex", "ortho" }; - void addScreenSpaceRenderableLocal(std::string texturePath) { + void addScreenSpaceRenderableLocal(std::string identifier, std::string texturePath) { if (!FileSys.fileExists(absPath(texturePath))) { LWARNING(fmt::format("Could not find image '{}'", texturePath)); return; } - openspace::global::scriptEngine.queueScript( - fmt::format( + std::string script; + if (identifier.empty()) { + script = fmt::format( "openspace.addScreenSpaceRenderable({{\ Type = 'ScreenSpaceImageLocal',\ TexturePath = openspace.absPath('{}')\ }});", - std::move(texturePath) - ), + texturePath + ); + } + else { + script = fmt::format( + "openspace.addScreenSpaceRenderable({{\ + Type = 'ScreenSpaceImageLocal',\ + TexturePath = openspace.absPath('{}'),\ + Identifier = '{}',\ + Name = '{}'\ + }});", + texturePath, + identifier, + identifier + ); + } + + openspace::global::scriptEngine.queueScript( + script, openspace::scripting::ScriptEngine::RemoteScripting::Yes ); } - void addScreenSpaceRenderableOnline(std::string texturePath) { - openspace::global::scriptEngine.queueScript( - fmt::format( + void addScreenSpaceRenderableOnline(std::string identifier, std::string texturePath) { + std::string script; + if (identifier.empty()) { + script = fmt::format( "openspace.addScreenSpaceRenderable({{\ - Type = 'ScreenSpaceImageOnline', URL = '{}'\ + Type = 'ScreenSpaceImageOnline',\ + URL = '{}'\ }});", - std::move(texturePath) - ), + texturePath + ); + } + else { + script = fmt::format( + "openspace.addScreenSpaceRenderable({{\ + Type = 'ScreenSpaceImageOnline',\ + URL = '{}',\ + Identifier = '{}',\ + Name = '{}'\ + }});", + texturePath, + identifier, + identifier + ); + } + + openspace::global::scriptEngine.queueScript( + script, openspace::scripting::ScriptEngine::RemoteScripting::Yes ); } @@ -616,9 +653,16 @@ void GUI::render() { renderAndUpdatePropertyVisibility(); static const int addImageBufferSize = 256; + static char identifierBuffer[addImageBufferSize]; static char addImageLocalBuffer[addImageBufferSize]; static char addImageOnlineBuffer[addImageBufferSize]; + ImGui::InputText( + "Identifier for Local/Online Images", + identifierBuffer, + addImageBufferSize + ); + bool addImageLocal = ImGui::InputText( "Add Local Image", addImageLocalBuffer, @@ -626,7 +670,10 @@ void GUI::render() { ImGuiInputTextFlags_EnterReturnsTrue ); if (addImageLocal) { - addScreenSpaceRenderableLocal(std::string(addImageLocalBuffer)); + addScreenSpaceRenderableLocal( + std::string(identifierBuffer), + std::string(addImageLocalBuffer) + ); } bool addImageOnline = ImGui::InputText( @@ -637,7 +684,10 @@ void GUI::render() { ); if (addImageOnline) { - addScreenSpaceRenderableOnline(std::string(addImageOnlineBuffer)); + addScreenSpaceRenderableOnline( + std::string(identifierBuffer), + std::string(addImageOnlineBuffer) + ); } bool addDashboard = ImGui::Button("Add New Dashboard"); diff --git a/modules/server/src/topics/luascripttopic.cpp b/modules/server/src/topics/luascripttopic.cpp index f883410764..018159f0ba 100644 --- a/modules/server/src/topics/luascripttopic.cpp +++ b/modules/server/src/topics/luascripttopic.cpp @@ -69,7 +69,7 @@ namespace { return "[" + formatLuaString(it.key()) + "] = " + formatLua(it); } - std::string formatLuaTable(const nlohmann::json& json) { + std::string formatObjectAsLuaTable(const nlohmann::json& json) { std::string output = "{"; auto it = json.begin(); for (size_t i = 0; i < json.size(); ++i, ++it) { @@ -81,9 +81,24 @@ namespace { return output + "}"; } + std::string formatArrayAsLuaTable(const nlohmann::json& json) { + std::string output = "{"; + auto it = json.begin(); + for (size_t i = 0; i < json.size(); ++i, ++it) { + output += formatLua(it); + if (i < json.size() - 1) { + output += ","; + } + } + return output + "}"; + } + std::string formatLua(const nlohmann::json::const_iterator& it) { if (it->is_object()) { - return formatLuaTable(it->get()); + return formatObjectAsLuaTable(it->get()); + } + if (it->is_array()) { + return formatArrayAsLuaTable(it->get()); } if (it->is_number()) { return fmt::format("{:E}", it->get()); diff --git a/modules/server/src/topics/setpropertytopic.cpp b/modules/server/src/topics/setpropertytopic.cpp index 584f8c2fe8..2e40e4d99d 100644 --- a/modules/server/src/topics/setpropertytopic.cpp +++ b/modules/server/src/topics/setpropertytopic.cpp @@ -41,15 +41,29 @@ namespace { std::string escapedLuaString(const std::string& str) { std::string luaString; + for (const char& c : str) { switch (c) { - case '\'': - luaString += "\'"; - break; - default: - luaString += c; + case '\t': + luaString += "\\t"; // Replace tab with \t. + break; + case '"': + luaString += "\\\""; // Replace " with \". + break; + case '\\': + luaString += "\\\\"; // Replace \ with \\. + break; + case '\n': + luaString += "\\\\n"; // Replace newline with \n. + break; + case '\r': + luaString += "\\r"; // Replace carriage return with \r. + break; + default: + luaString += c; } } + return luaString; } diff --git a/modules/server/src/topics/timetopic.cpp b/modules/server/src/topics/timetopic.cpp index 4710d13c4f..60512f4516 100644 --- a/modules/server/src/topics/timetopic.cpp +++ b/modules/server/src/topics/timetopic.cpp @@ -32,7 +32,6 @@ #include namespace { - constexpr const char* _loggerCat = "TimeTopic"; constexpr const char* EventKey = "event"; constexpr const char* SubscribeEvent = "start_subscription"; constexpr const char* UnsubscribeEvent = "stop_subscription"; diff --git a/modules/space/rendering/renderablestars.cpp b/modules/space/rendering/renderablestars.cpp index 891ee0efb8..474e7158b3 100644 --- a/modules/space/rendering/renderablestars.cpp +++ b/modules/space/rendering/renderablestars.cpp @@ -773,7 +773,6 @@ void RenderableStars::renderPSFToTexture() { GLenum blendDestRGB; GLenum blendSrcAlpha; GLenum blendSrcRGB; - GLboolean depthMask; glGetIntegerv(GL_BLEND_EQUATION_RGB, &blendEquationRGB); glGetIntegerv(GL_BLEND_EQUATION_ALPHA, &blendEquationAlpha); @@ -927,7 +926,6 @@ void RenderableStars::render(const RenderData& data, RendererTasks&) { glm::dmat4(data.modelTransform.rotation) * glm::dmat4(glm::scale(glm::dmat4(1.0), glm::dvec3(data.modelTransform.scale))); - glm::dmat4 modelViewMatrix = data.camera.combinedViewMatrix() * modelMatrix; glm::dmat4 projectionMatrix = glm::dmat4(data.camera.projectionMatrix()); glm::dmat4 cameraViewProjectionMatrix = projectionMatrix * diff --git a/modules/space/rendering/renderablestars.h b/modules/space/rendering/renderablestars.h index 986fd5682f..272b6b9242 100644 --- a/modules/space/rendering/renderablestars.h +++ b/modules/space/rendering/renderablestars.h @@ -165,7 +165,6 @@ private: GLuint _psfVao = 0; GLuint _psfVbo = 0; GLuint _psfTexture = 0; - GLuint _discTexture = 0; GLuint _convolvedTexture = 0; }; diff --git a/modules/space/translation/horizonstranslation.cpp b/modules/space/translation/horizonstranslation.cpp index e50d284047..80dca66afe 100644 --- a/modules/space/translation/horizonstranslation.cpp +++ b/modules/space/translation/horizonstranslation.cpp @@ -179,7 +179,7 @@ void HorizonsTranslation::readHorizonsTextFile(const std::string& horizonsTextFi ); // Add position to stored timeline. - _timeline.addKeyframe(timeInJ2000, gPos); + _timeline.addKeyframe(timeInJ2000, std::move(gPos)); std::getline(fileStream, line); } diff --git a/modules/sync/CMakeLists.txt b/modules/sync/CMakeLists.txt index 28fde9802a..a263e5498f 100644 --- a/modules/sync/CMakeLists.txt +++ b/modules/sync/CMakeLists.txt @@ -24,8 +24,6 @@ include(${OPENSPACE_CMAKE_EXT_DIR}/module_definition.cmake) -option(OPENSPACE_MODULE_SYNC_USE_LIBTORRENT "Use libtorrent" OFF) - set(HEADER_FILES ${CMAKE_CURRENT_SOURCE_DIR}/syncmodule.h ${CMAKE_CURRENT_SOURCE_DIR}/syncs/httpsynchronization.h @@ -42,48 +40,4 @@ set(SOURCE_FILES ) source_group("Source Files" FILES ${SOURCE_FILES}) -if (OPENSPACE_MODULE_SYNC_USE_LIBTORRENT) - set(HEADER_FILES - ${HEADER_FILES} - ${CMAKE_CURRENT_SOURCE_DIR}/torrentclient.h - ${CMAKE_CURRENT_SOURCE_DIR}/syncs/torrentsynchronization.h - ) - set(SOURCE_FILES - ${SOURCE_FILES} - ${CMAKE_CURRENT_SOURCE_DIR}/torrentclient.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/syncs/torrentsynchronization.cpp - ) -endif () - - create_new_module("Sync" sync_module ${HEADER_FILES} ${SOURCE_FILES}) - -##### -# Libtorrent -##### - -if (OPENSPACE_MODULE_SYNC_USE_LIBTORRENT) - set(Boost_USE_STATIC_LIBS ON) - set(Boost_USE_MULTITHREADED ON) - set(LIBTORRENT_encryption OFF CACHE BOOL "Use OpenSSL Encryption" FORCE) - set(LIBTORRENT_shared OFF CACHE BOOL "Use Libtorrent as shared library" FORCE) - - include_external_library( - ${sync_module} - torrent-rasterbar - ${CMAKE_CURRENT_SOURCE_DIR}/ext/libtorrent - ) - target_include_directories( - ${sync_module} - SYSTEM PUBLIC - ${CMAKE_CURRENT_SOURCE_DIR}/ext/libtorrent/include - ) - - target_compile_definitions(openspace-module-sync PUBLIC SYNC_USE_LIBTORRENT) - - mark_as_advanced(LIBTORRENT_build_examples LIBTORRENT_build_tests - LIBTORRENT_deprecated-functions LIBTORRENT_dht LIBTORRENT_encryption - LIBTORRENT_exceptions LIBTORRENT_exceptions LIBTORRENT_libiconv - LIBTORRENT_logging LIBTORRENT_shared LIBTORRENT_static_runtime - ) -endif () # OPENSPACE_MODULE_SYNC_USE_LIBTORRENT \ No newline at end of file diff --git a/modules/sync/ext/libtorrent b/modules/sync/ext/libtorrent deleted file mode 160000 index 22477e7430..0000000000 --- a/modules/sync/ext/libtorrent +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 22477e7430a643fc64e55a669e2ad0e87a67647e diff --git a/modules/sync/syncmodule.cpp b/modules/sync/syncmodule.cpp index 791254a3cd..6f920b85d4 100644 --- a/modules/sync/syncmodule.cpp +++ b/modules/sync/syncmodule.cpp @@ -25,7 +25,6 @@ #include #include -#include #include #include #include @@ -87,19 +86,6 @@ void SyncModule::internalInitialize(const ghoul::Dictionary& configuration) { } ); -#ifdef SYNC_USE_LIBTORRENT - fSynchronization->registerClass( - "TorrentSynchronization", - [this](bool, const ghoul::Dictionary& dictionary) { - return new TorrentSynchronization( - dictionary, - _synchronizationRoot, - _torrentClient - ); - } - ); -#endif // SYNC_USE_LIBTORRENT - fSynchronization->registerClass( "UrlSynchronization", [this](bool, const ghoul::Dictionary& dictionary) { @@ -113,17 +99,6 @@ void SyncModule::internalInitialize(const ghoul::Dictionary& configuration) { auto fTask = FactoryManager::ref().factory(); ghoul_assert(fTask, "No task factory existed"); fTask->registerClass("SyncAssetTask"); - -#ifdef SYNC_USE_LIBTORRENT - _torrentClient.initialize(); - global::callback::deinitialize.emplace_back([&]() { _torrentClient.deinitialize(); }); -#endif // SYNC_USE_LIBTORRENT -} - -void SyncModule::internalDeinitialize() { -#ifdef SYNC_USE_LIBTORRENT - _torrentClient.deinitialize(); -#endif // SYNC_USE_LIBTORRENT } std::string SyncModule::synchronizationRoot() const { @@ -140,10 +115,7 @@ std::vector SyncModule::httpSynchronizationRepositories() const { std::vector SyncModule::documentations() const { return { - HttpSynchronization::Documentation(), -#ifdef SYNC_USE_LIBTORRENT - TorrentSynchronization::Documentation() -#endif // SYNC_USE_LIBTORRENT + HttpSynchronization::Documentation() }; } diff --git a/modules/sync/syncmodule.h b/modules/sync/syncmodule.h index eef18e8b72..64cb7e412d 100644 --- a/modules/sync/syncmodule.h +++ b/modules/sync/syncmodule.h @@ -27,10 +27,6 @@ #include -#ifdef SYNC_USE_LIBTORRENT -#include -#endif // SYNC_USE_LIBTORRENT - namespace openspace { class SyncModule : public OpenSpaceModule { @@ -44,20 +40,12 @@ public: void addHttpSynchronizationRepository(std::string repository); std::vector httpSynchronizationRepositories() const; -#ifdef SYNC_USE_LIBTORRENT - TorrentClient& torrentClient(); -#endif // SYNC_USE_LIBTORRENT - std::vector documentations() const override; protected: void internalInitialize(const ghoul::Dictionary& configuration) override; - void internalDeinitialize() override; private: -#ifdef SYNC_USE_LIBTORRENT - TorrentClient _torrentClient; -#endif // SYNC_USE_LIBTORRENT std::vector _synchronizationRepositories; std::string _synchronizationRoot; }; diff --git a/modules/sync/syncs/torrentsynchronization.cpp b/modules/sync/syncs/torrentsynchronization.cpp deleted file mode 100644 index 2f3bfd1485..0000000000 --- a/modules/sync/syncs/torrentsynchronization.cpp +++ /dev/null @@ -1,197 +0,0 @@ -/***************************************************************************************** - * * - * OpenSpace * - * * - * Copyright (c) 2014-2019 * - * * - * Permission is hereby granted, free of charge, to any person obtaining a copy of this * - * software and associated documentation files (the "Software"), to deal in the Software * - * without restriction, including without limitation the rights to use, copy, modify, * - * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to * - * permit persons to whom the Software is furnished to do so, subject to the following * - * conditions: * - * * - * The above copyright notice and this permission notice shall be included in all copies * - * or substantial portions of the Software. * - * * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, * - * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A * - * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT * - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF * - * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * - * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * - ****************************************************************************************/ - -#include - -#include -#include -#include -#include -#include -#include - -namespace { - constexpr const char* KeyIdentifier = "Identifier"; - constexpr const char* KeyMagnet = "Magnet"; -} // namespace - -namespace openspace { - -documentation::Documentation TorrentSynchronization::Documentation() { - using namespace openspace::documentation; - return { - "TorrentSynchronization", - "torrent_synchronization", - { - { - KeyIdentifier, - new StringVerifier, - Optional::No, - "A unique identifier for this torrent" - }, - { - KeyMagnet, - new StringVerifier, - Optional::No, - "A magnet link identifying the torrent" - } - } - }; -} - -TorrentSynchronization::TorrentSynchronization(const ghoul::Dictionary& dict, - std::string synchronizationRoot, - TorrentClient& torrentClient) - : ResourceSynchronization(dict) - , _synchronizationRoot(std::move(synchronizationRoot)) - , _torrentClient(torrentClient) -{ - documentation::testSpecificationAndThrow( - Documentation(), - dict, - "TorrentSynchronization" - ); - - _identifier = dict.value(KeyIdentifier); - _magnetLink = dict.value(KeyMagnet); -} - -TorrentSynchronization::~TorrentSynchronization() { - cancel(); -} - -std::string TorrentSynchronization::uniformResourceName() const { - const size_t begin = _magnetLink.find("=urn") + 1; - const size_t end = _magnetLink.find('&', begin); - std::string xs = _magnetLink.substr( - begin, - (end == std::string::npos) ? end : (end - begin) - ); - - std::transform( - xs.begin(), - xs.end(), - xs.begin(), - [](char x) { return (x == ':') ? '.' : x; } - ); - return xs; -} - -std::string TorrentSynchronization::directory() { - ghoul::filesystem::Directory d( - _synchronizationRoot + - ghoul::filesystem::FileSystem::PathSeparator + - "torrent" + - ghoul::filesystem::FileSystem::PathSeparator + - _identifier + - ghoul::filesystem::FileSystem::PathSeparator + - uniformResourceName() - ); - - return FileSys.absPath(d); -} - -void TorrentSynchronization::start() { - if (_enabled) { - return; - } - begin(); - - if (hasSyncFile()) { - resolve(); - } - - _enabled = true; - try { - _torrentId = _torrentClient.addMagnetLink( - _magnetLink, - directory(), - [this](TorrentClient::TorrentProgress p) { - updateTorrentProgress(p); - } - ); - } catch (const TorrentError& e) { - LERRORC(name(), e.message); - if (!isResolved()) { - reject(); - } - } -} - -void TorrentSynchronization::cancel() { - if (_enabled) { - _torrentClient.removeTorrent(_torrentId); - _enabled = false; - reset(); - } -} - -void TorrentSynchronization::clear() { - cancel(); - // TODO: Remove all files from directory. -} - -bool TorrentSynchronization::hasSyncFile() { - const std::string& path = directory() + ".ossync"; - return FileSys.fileExists(path); -} - -void TorrentSynchronization::createSyncFile() { - const std::string& directoryName = directory(); - const std::string& filepath = directoryName + ".ossync"; - - FileSys.createDirectory(directoryName, ghoul::filesystem::FileSystem::Recursive::Yes); - - std::ofstream syncFile(filepath, std::ofstream::out); - syncFile << "Synchronized"; - syncFile.close(); -} - -size_t TorrentSynchronization::nSynchronizedBytes() { - std::lock_guard g(_progressMutex); - return _progress.nDownloadedBytes; -} - -size_t TorrentSynchronization::nTotalBytes() { - std::lock_guard g(_progressMutex); - return _progress.nTotalBytes; -} - -bool TorrentSynchronization::nTotalBytesIsKnown() { - std::lock_guard g(_progressMutex); - return _progress.nTotalBytesKnown; -} - -void TorrentSynchronization::updateTorrentProgress( - TorrentClient::TorrentProgress progress) -{ - std::lock_guard g(_progressMutex); - _progress = progress; - if (progress.finished && (state() == State::Syncing)) { - createSyncFile(); - resolve(); - } -} - -} // namespace openspace diff --git a/modules/sync/syncs/torrentsynchronization.h b/modules/sync/syncs/torrentsynchronization.h deleted file mode 100644 index 98f9811f4e..0000000000 --- a/modules/sync/syncs/torrentsynchronization.h +++ /dev/null @@ -1,77 +0,0 @@ -/***************************************************************************************** - * * - * OpenSpace * - * * - * Copyright (c) 2014-2019 * - * * - * Permission is hereby granted, free of charge, to any person obtaining a copy of this * - * software and associated documentation files (the "Software"), to deal in the Software * - * without restriction, including without limitation the rights to use, copy, modify, * - * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to * - * permit persons to whom the Software is furnished to do so, subject to the following * - * conditions: * - * * - * The above copyright notice and this permission notice shall be included in all copies * - * or substantial portions of the Software. * - * * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, * - * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A * - * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT * - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF * - * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * - * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * - ****************************************************************************************/ - -#ifndef __OPENSPACE_MODULE_SYNC___TORRENTSYNCHRONIZATION___H__ -#define __OPENSPACE_MODULE_SYNC___TORRENTSYNCHRONIZATION___H__ - -#ifdef SYNC_USE_LIBTORRENT - -#include - -#include - -namespace openspace { - -class TorrentSynchronizationJob; - -class TorrentSynchronization : public ResourceSynchronization { -public: - TorrentSynchronization(const ghoul::Dictionary& dict, std::string synchronizationRoot, - TorrentClient& client); - - virtual ~TorrentSynchronization(); - - std::string directory() override; - void start() override; - void cancel() override; - void clear() override; - - size_t nSynchronizedBytes() override; - size_t nTotalBytes() override; - bool nTotalBytesIsKnown() override; - - static documentation::Documentation Documentation(); - -private: - void updateTorrentProgress(TorrentClient::TorrentProgress p); - std::string uniformResourceName() const; - bool hasSyncFile(); - void createSyncFile(); - - std::atomic_bool _enabled = false; - - TorrentClient::TorrentId _torrentId = 0; - TorrentClient::TorrentProgress _progress; - std::mutex _progressMutex; - std::string _identifier; - std::string _magnetLink; - std::string _synchronizationRoot; - TorrentClient& _torrentClient; -}; - -} // namespace openspace - -#endif // SYNC_USE_LIBTORRENT - -#endif // __OPENSPACE_MODULE_SYNC___TORRENTSYNCHRONIZATION___H__ diff --git a/modules/sync/torrentclient.cpp b/modules/sync/torrentclient.cpp deleted file mode 100644 index e2379f9c67..0000000000 --- a/modules/sync/torrentclient.cpp +++ /dev/null @@ -1,271 +0,0 @@ -/***************************************************************************************** - * * - * OpenSpace * - * * - * Copyright (c) 2014-2019 * - * * - * Permission is hereby granted, free of charge, to any person obtaining a copy of this * - * software and associated documentation files (the "Software"), to deal in the Software * - * without restriction, including without limitation the rights to use, copy, modify, * - * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to * - * permit persons to whom the Software is furnished to do so, subject to the following * - * conditions: * - * * - * The above copyright notice and this permission notice shall be included in all copies * - * or substantial portions of the Software. * - * * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, * - * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A * - * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT * - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF * - * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * - * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * - ****************************************************************************************/ - -#include - -#include -#include -#include - -#ifdef SYNC_USE_LIBTORRENT -#ifdef _MSC_VER -#pragma warning (push) -#pragma warning (disable : 4265) -#pragma warning (disable : 4996) -#endif // _MSC_VER - -#include -#include -#include -#include -#include -#include - -#ifdef _MSC_VER -#pragma warning (pop) -#endif // _MSC_VER - - -namespace { - constexpr const char* _loggerCat = "TorrentClient"; - constexpr const std::chrono::milliseconds PollInterval(1000); -} // namespace - -#endif // SYNC_USE_LIBTORRENT - -namespace openspace { - -TorrentError::TorrentError(std::string msg) - : RuntimeError(std::move(msg), "TorrentClient") -{} - -void TorrentClient::initialize() { -#ifdef SYNC_USE_LIBTORRENT - libtorrent::settings_pack settings; - settings.set_str( - libtorrent::settings_pack::user_agent, - "OpenSpace/" + std::string(OPENSPACE_VERSION_NUMBER) - ); - - settings.set_str( - libtorrent::settings_pack::listen_interfaces, - "0.0.0.0:6881,0.0.0.0:20280,0.0.0.0:20285,0.0.0.0:20290" - ); - settings.set_bool(libtorrent::settings_pack::allow_multiple_connections_per_ip, true); - settings.set_bool(libtorrent::settings_pack::enable_upnp, true); - //settings.set_bool(libtorrent::settings_pack::ignore_limits_on_local_network, true); - settings.set_int(libtorrent::settings_pack::connection_speed, 20); - settings.set_int(libtorrent::settings_pack::active_downloads, -1); - settings.set_int(libtorrent::settings_pack::active_seeds, -1); - settings.set_int(libtorrent::settings_pack::active_limit, 30); - - settings.set_str( - libtorrent::settings_pack::dht_bootstrap_nodes, - "router.utorrent.com,dht.transmissionbt.com,router.bittorrent.com,\ -router.bitcomet.com" - ); - settings.set_int(libtorrent::settings_pack::dht_announce_interval, 15); - - _session.apply_settings(settings); - - libtorrent::error_code ec; - - _isInitialized = true; - _isActive = true; - - _torrentThread = std::thread([this]() { - while (_isActive) { - pollAlerts(); - std::unique_lock lock(_abortMutex); - _abortNotifier.wait_for(lock, PollInterval); - } - }); -#endif // SYNC_USE_LIBTORRENT -} - -void TorrentClient::deinitialize() { -#ifdef SYNC_USE_LIBTORRENT - if (!_isActive) { - return; - } - - _isActive = false; - _abortNotifier.notify_all(); - if (_torrentThread.joinable()) { - _torrentThread.join(); - } - - const std::vector& handles = _session.get_torrents(); - for (const lt::torrent_handle& h : handles) { - _session.remove_torrent(h); - } - _torrents.clear(); - - _session.abort(); - _isInitialized = false; -#endif // SYNC_USE_LIBTORRENT -} - -void TorrentClient::pollAlerts() { -#ifdef SYNC_USE_LIBTORRENT - // Libtorrent does not seem to reliably generate alerts for all added torrents. - // To make sure that the program does not keep waiting for already finished - // downsloads, we go through the whole list of torrents when polling. - // However, in theory, the commented code below should be more efficient: - /* - std::vector alerts; - { - std::lock_guard guard(_mutex); - _session->pop_alerts(&alerts); - } - for (lt::alert* a : alerts) { - if (const lt::torrent_alert* alert = - dynamic_cast(a)) - { - notify(alert->handle.id()); - } - } - */ - std::vector handles; - { - std::lock_guard guard(_mutex); - handles = _session.get_torrents(); - } - for (const lt::torrent_handle& h : handles) { - notify(h.id()); - } -#endif // SYNC_USE_LIBTORRENT -} - -TorrentClient::TorrentId TorrentClient::addTorrentFile( - [[ maybe_unused ]] const std::string& torrentFile, - [[maybe_unused]] const std::string& destination, - [[maybe_unused]] TorrentProgressCallback cb) -{ -#ifdef SYNC_USE_LIBTORRENT - std::lock_guard guard(_mutex); - - if (!_isInitialized) { - LERROR("Torrent session not initialized when adding torrent"); - return -1; - } - - libtorrent::error_code ec; - libtorrent::add_torrent_params p; - p.save_path = destination; - p.ti = std::make_shared(torrentFile, ec); - if (ec) { - LERROR(fmt::format("{}: {}", torrentFile, ec.message())); - } - const libtorrent::torrent_handle h = _session.add_torrent(p, ec); - if (ec) { - LERROR(fmt::format("{}: {}", torrentFile, ec.message())); - } - - TorrentId id = h.id(); - _torrents.emplace(id, Torrent{ id, h, std::move(cb) }); - return id; -#else // SYNC_USE_LIBTORRENT - throw TorrentError("SyncModule is compiled without libtorrent support"); -#endif // SYNC_USE_LIBTORRENT -} - -TorrentClient::TorrentId TorrentClient::addMagnetLink( - [[maybe_unused]] const std::string& magnetLink, - [[maybe_unused]] const std::string& destination, - [[maybe_unused]] TorrentProgressCallback cb) -{ -#ifdef SYNC_USE_LIBTORRENT - std::lock_guard guard(_mutex); - - // TODO: register callback! - if (!_isInitialized) { - LERROR("Torrent session not initialized when adding torrent"); - return -1; - } - libtorrent::error_code ec; - libtorrent::add_torrent_params p = libtorrent::parse_magnet_uri(magnetLink, ec); - if (ec) { - LERROR(fmt::format("{}: {}", magnetLink, ec.message())); - } - p.save_path = destination; - p.storage_mode = libtorrent::storage_mode_allocate; - const libtorrent::torrent_handle h = _session.add_torrent(p, ec); - if (ec) { - LERROR(fmt::format("{}: {}", magnetLink, ec.message())); - } - - TorrentId id = h.id(); - _torrents.emplace(id, Torrent{ id, h, std::move(cb) }); - return id; -#else // SYNC_USE_LIBTORRENT - throw TorrentError("SyncModule is compiled without libtorrent support"); -#endif // SYNC_USE_LIBTORRENT -} - -void TorrentClient::removeTorrent([[maybe_unused]] TorrentId id) { -#ifdef SYNC_USE_LIBTORRENT - std::lock_guard guard(_mutex); - - const auto it = _torrents.find(id); - if (it == _torrents.end()) { - return; - } - - const libtorrent::torrent_handle h = it->second.handle; - _session.remove_torrent(h); - - _torrents.erase(it); -#endif // SYNC_USE_LIBTORRENT -} - -void TorrentClient::notify([[maybe_unused]] TorrentId id) { -#ifdef SYNC_USE_LIBTORRENT - TorrentProgressCallback callback; - TorrentProgress progress; - - { - std::lock_guard guard(_mutex); - - const auto it = _torrents.find(id); - if (it == _torrents.end()) { - return; - } - - const libtorrent::torrent_handle h = it->second.handle; - const libtorrent::torrent_status status = h.status(); - - progress.finished = status.is_finished; - progress.nTotalBytesKnown = status.total_wanted > 0; - progress.nTotalBytes = status.total_wanted; - progress.nDownloadedBytes = status.total_wanted_done; - - callback = it->second.callback; - } - - callback(progress); -#endif // SYNC_USE_LIBTORRENT -} - -} // namespace openspace diff --git a/modules/sync/torrentclient.h b/modules/sync/torrentclient.h deleted file mode 100644 index e633e24fdf..0000000000 --- a/modules/sync/torrentclient.h +++ /dev/null @@ -1,125 +0,0 @@ -/***************************************************************************************** - * * - * OpenSpace * - * * - * Copyright (c) 2014-2019 * - * * - * Permission is hereby granted, free of charge, to any person obtaining a copy of this * - * software and associated documentation files (the "Software"), to deal in the Software * - * without restriction, including without limitation the rights to use, copy, modify, * - * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to * - * permit persons to whom the Software is furnished to do so, subject to the following * - * conditions: * - * * - * The above copyright notice and this permission notice shall be included in all copies * - * or substantial portions of the Software. * - * * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, * - * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A * - * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT * - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF * - * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * - * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * - ****************************************************************************************/ - -#ifndef __OPENSPACE_MODULE_SYNC___TORRENTCLIENT___H__ -#define __OPENSPACE_MODULE_SYNC___TORRENTCLIENT___H__ - -#ifdef SYNC_USE_LIBTORRENT - -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef SYNC_USE_LIBTORRENT -#ifdef _MSC_VER -#pragma warning (push) -#pragma warning (disable : 4265) -#pragma warning (disable : 4996) -#endif // _MSC_VER - -// libtorrent defines a class with the name 'defer', which messes with out #define of the -// defer macro in ghoul/misc/defer.h -#undef defer - -#include -#include - -#ifdef _MSC_VER -#pragma warning (pop) -#endif // _MSC_VER - - -#else // SYNC_USE_LIBTORRENT -// Dummy definition to make TorrentClient compile, these is not actually used if -// SYNC_USE_LIBTORRENT is FALSE -namespace libtorrent { - using torrent_handle = void*; - using session = void*; -} // namespace libtorrent - -#endif // SYNC_USE_LIBTORRENT - -namespace openspace { - -struct TorrentError : public ghoul::RuntimeError { - explicit TorrentError(std::string msg); -}; - -class TorrentClient { -public: - struct TorrentProgress { - bool finished = false; - bool nTotalBytesKnown = false; - size_t nTotalBytes = 0; - size_t nDownloadedBytes = 0; - }; - - using TorrentProgressCallback = std::function; - using TorrentId = int32_t; - - void initialize(); - void deinitialize(); - - TorrentId addTorrentFile(const std::string& torrentFile, - const std::string& destination, TorrentProgressCallback cb); - - TorrentId addMagnetLink(const std::string& magnetLink, const std::string& destination, - TorrentProgressCallback cb); - - void removeTorrent(TorrentId id); - -private: - struct Torrent { - TorrentId id; - libtorrent::torrent_handle handle; - TorrentProgressCallback callback; - }; - - void notify(TorrentId id); - void pollAlerts(); - -#ifdef SYNC_USE_LIBTORRENT - libtorrent::session _session; - bool _isInitialized = false; - std::atomic_bool _isActive = false; -#endif // SYNC_USE_LIBTORRENT - - std::thread _torrentThread; - std::condition_variable _abortNotifier; - std::mutex _abortMutex; - std::mutex _mutex; - - std::unordered_map _torrents; -}; - -} // namespace openspace - -#endif // SYNC_USE_LIBTORRENT - -#endif // __OPENSPACE_MODULE_SYNC___TORRENTCLIENT___H__ diff --git a/modules/volume/rendering/renderabletimevaryingvolume.cpp b/modules/volume/rendering/renderabletimevaryingvolume.cpp index ffe7bd5034..d6a0ae9963 100644 --- a/modules/volume/rendering/renderabletimevaryingvolume.cpp +++ b/modules/volume/rendering/renderabletimevaryingvolume.cpp @@ -426,7 +426,7 @@ RenderableTimeVaryingVolume::Timestep* RenderableTimeVaryingVolume::timestepFrom void RenderableTimeVaryingVolume::jumpToTimestep(int target) { Timestep* t = timestepFromIndex(target); if (t) { - global::timeManager.setTimeNextFrame(t->metadata.time); + global::timeManager.setTimeNextFrame(Time(t->metadata.time)); } } diff --git a/modules/volume/tasks/generaterawvolumetask.cpp b/modules/volume/tasks/generaterawvolumetask.cpp index ea64003e33..e5942215ff 100644 --- a/modules/volume/tasks/generaterawvolumetask.cpp +++ b/modules/volume/tasks/generaterawvolumetask.cpp @@ -50,9 +50,6 @@ namespace { constexpr const char* KeyValueFunction = "ValueFunction"; constexpr const char* KeyLowerDomainBound = "LowerDomainBound"; constexpr const char* KeyUpperDomainBound = "UpperDomainBound"; - - constexpr const char* KeyMinValue = "MinValue"; - constexpr const char* KeyMaxValue = "MaxValue"; } // namespace namespace openspace { diff --git a/modules/volume/transferfunctionhandler.cpp b/modules/volume/transferfunctionhandler.cpp index 1bee321f4a..e3d01f1e8d 100644 --- a/modules/volume/transferfunctionhandler.cpp +++ b/modules/volume/transferfunctionhandler.cpp @@ -35,12 +35,6 @@ namespace { "All the envelopes used in the transfer function" }; - constexpr openspace::properties::Property::PropertyInfo HistogramInfo = { - "Histogram", - "Histogram", - "All the data" - }; - constexpr openspace::properties::Property::PropertyInfo DataUnitInfo = { "DataUnit", "DataUnit", diff --git a/modules/webbrowser/include/eventhandler.h b/modules/webbrowser/include/eventhandler.h index 1596a02cb0..3ef6bdce06 100644 --- a/modules/webbrowser/include/eventhandler.h +++ b/modules/webbrowser/include/eventhandler.h @@ -57,9 +57,9 @@ class BrowserInstance; class EventHandler { public: void initialize(); - void setBrowser(const CefRefPtr& browser); void setBrowserInstance(BrowserInstance* browserInstance); - void detachBrowser(); + void resetBrowserInstance(); + void touchPressCallback(const double x, const double y); void touchReleaseCallback(const double x, const double y); bool hasContentCallback(const double, const double); diff --git a/modules/webbrowser/include/screenspacebrowser.h b/modules/webbrowser/include/screenspacebrowser.h index 41b4a2eb0b..be83f58c71 100644 --- a/modules/webbrowser/include/screenspacebrowser.h +++ b/modules/webbrowser/include/screenspacebrowser.h @@ -30,6 +30,7 @@ #include #include #include +#include #ifdef _MSC_VER #pragma warning (push) @@ -62,9 +63,11 @@ class WebKeyboardHandler; class ScreenSpaceBrowser : public ScreenSpaceRenderable { public: ScreenSpaceBrowser(const ghoul::Dictionary& dictionary); + virtual ~ScreenSpaceBrowser() = default; + + bool initializeGL() override; + bool deinitializeGL() override; - bool initialize() override; - bool deinitialize() override; void render() override; void update() override; bool isReady() const override; @@ -72,14 +75,18 @@ public: private: class ScreenSpaceRenderHandler : public WebRenderHandler { public: - void draw(); - void render(); + void draw() override; + void render() override; void setTexture(GLuint t); }; + void bindTexture() override; + properties::StringProperty _url; properties::Vec2Property _dimensions; + properties::TriggerProperty _reload; + CefRefPtr _renderHandler; CefRefPtr _keyboardHandler; std::unique_ptr _browserInstance; diff --git a/modules/webbrowser/src/eventhandler.cpp b/modules/webbrowser/src/eventhandler.cpp index 8cd3c96b3f..1231178231 100644 --- a/modules/webbrowser/src/eventhandler.cpp +++ b/modules/webbrowser/src/eventhandler.cpp @@ -361,7 +361,7 @@ void EventHandler::setBrowserInstance(BrowserInstance* browserInstance) { _browserInstance = browserInstance; } -void EventHandler::detachBrowser() { +void EventHandler::resetBrowserInstance() { _browserInstance = nullptr; } diff --git a/modules/webbrowser/src/screenspacebrowser.cpp b/modules/webbrowser/src/screenspacebrowser.cpp index 21c4e622bf..1c69bb0b4c 100644 --- a/modules/webbrowser/src/screenspacebrowser.cpp +++ b/modules/webbrowser/src/screenspacebrowser.cpp @@ -35,7 +35,6 @@ namespace { constexpr const char* KeyIdentifier = "Indentifier"; - constexpr const char* KeyUrl = "URL"; constexpr const char* _loggerCat = "ScreenSpaceBrowser"; const openspace::properties::Property::PropertyInfo DimensionsInfo = { @@ -44,11 +43,17 @@ namespace { "Set the dimensions of the web browser windows." }; const openspace::properties::Property::PropertyInfo UrlInfo = { + "Url", "URL", - "url", "The URL to load" }; + const openspace::properties::Property::PropertyInfo ReloadInfo = { + "Reload", + "Reload", + "Reload the web browser" + }; + } // namespace namespace openspace { @@ -65,6 +70,7 @@ ScreenSpaceBrowser::ScreenSpaceBrowser(const ghoul::Dictionary &dictionary) : ScreenSpaceRenderable(dictionary) , _url(UrlInfo) , _dimensions(DimensionsInfo, glm::vec2(0.f), glm::vec2(0.f), glm::vec2(3000.f)) + , _reload(ReloadInfo) { if (dictionary.hasKey(KeyIdentifier)) { setIdentifier(dictionary.value(KeyIdentifier)); @@ -74,17 +80,13 @@ ScreenSpaceBrowser::ScreenSpaceBrowser(const ghoul::Dictionary &dictionary) ++id; } - if (dictionary.hasKeyAndValue(KeyUrl)) { - _url = dictionary.value(KeyUrl); + if (dictionary.hasKeyAndValue(UrlInfo.identifier)) { + _url = dictionary.value(UrlInfo.identifier); } glm::vec2 windowDimensions = global::windowDelegate.currentSubwindowSize(); _dimensions = windowDimensions; - _texture = std::make_unique( - glm::uvec3(windowDimensions, 1.0f) - ); - _renderHandler = new ScreenSpaceRenderHandler(); _keyboardHandler = new WebKeyboardHandler(); _browserInstance = std::make_unique( @@ -94,9 +96,11 @@ ScreenSpaceBrowser::ScreenSpaceBrowser(const ghoul::Dictionary &dictionary) _url.onChange([this]() { _isUrlDirty = true; }); _dimensions.onChange([this]() { _isDimensionsDirty = true; }); + _reload.onChange([this]() { _browserInstance->reloadBrowser(); }); addProperty(_url); addProperty(_dimensions); + addProperty(_reload); WebBrowserModule* webBrowser = global::moduleEngine.module(); if (webBrowser) { @@ -104,17 +108,24 @@ ScreenSpaceBrowser::ScreenSpaceBrowser(const ghoul::Dictionary &dictionary) } } -bool ScreenSpaceBrowser::initialize() { - _originalViewportSize = global::windowDelegate.currentWindowSize(); +bool ScreenSpaceBrowser::initializeGL() { + _texture = std::make_unique( + glm::uvec3(_dimensions.value(), 1.0f) + ); + _renderHandler->setTexture(*_texture); createShaders(); + _browserInstance->initialize(); _browserInstance->loadUrl(_url); return isReady(); } -bool ScreenSpaceBrowser::deinitialize() { +bool ScreenSpaceBrowser::deinitializeGL() { + _renderHandler->setTexture(0); + _texture = nullptr; + std::string urlString; _url.getStringValue(urlString); LDEBUG(fmt::format("Deinitializing ScreenSpaceBrowser: {}", urlString)); @@ -125,11 +136,12 @@ bool ScreenSpaceBrowser::deinitialize() { if (webBrowser) { webBrowser->removeBrowser(_browserInstance.get()); _browserInstance.reset(); - return true; + } + else { + LWARNING("Could not find WebBrowserModule"); } - LWARNING("Could not find WebBrowserModule"); - return false; + return ScreenSpaceRenderable::deinitializeGL(); } void ScreenSpaceBrowser::render() { @@ -146,6 +158,8 @@ void ScreenSpaceBrowser::render() { } void ScreenSpaceBrowser::update() { + _objectSize = _texture->dimensions(); + if (_isUrlDirty) { _browserInstance->loadUrl(_url); _isUrlDirty = false; @@ -153,7 +167,6 @@ void ScreenSpaceBrowser::update() { if (_isDimensionsDirty) { _browserInstance->reshape(_dimensions.value()); - _originalViewportSize = _dimensions.value(); _isDimensionsDirty = false; } } @@ -162,4 +175,8 @@ bool ScreenSpaceBrowser::isReady() const { return _shader && _texture; } +void ScreenSpaceBrowser::bindTexture() { + _texture->bind(); +} + } // namespace openspace diff --git a/modules/webbrowser/src/webbrowserapp.cpp b/modules/webbrowser/src/webbrowserapp.cpp index 6ccfaefaf5..dc49bd8fa9 100644 --- a/modules/webbrowser/src/webbrowserapp.cpp +++ b/modules/webbrowser/src/webbrowserapp.cpp @@ -41,10 +41,11 @@ void WebBrowserApp::OnContextCreated(CefRefPtr, CefRefPtr, } void WebBrowserApp::OnBeforeCommandLineProcessing(const CefString&, - CefRefPtr) + CefRefPtr commandLine) { // command_line->AppendSwitch("disable-gpu"); // command_line->AppendSwitch("disable-gpu-compositing"); + commandLine->AppendSwitchWithValue("autoplay-policy", "no-user-gesture-required"); } } // namespace openspace diff --git a/modules/webbrowser/src/webrenderhandler.cpp b/modules/webbrowser/src/webrenderhandler.cpp index 555e88d721..204dea11c5 100644 --- a/modules/webbrowser/src/webrenderhandler.cpp +++ b/modules/webbrowser/src/webrenderhandler.cpp @@ -78,11 +78,13 @@ void WebRenderHandler::OnPaint(CefRefPtr, CefRenderHandler::PaintEle // Copy the updated rectangle line by line. for (int y = lowerUpdatingRectBound.y; y < upperUpdatingRectBound.y; ++y) { int lineOffset = y * w + lowerUpdatingRectBound.x; + // Chromium stores image upside down compared to OpenGL, so we flip it: + int invLineOffset = (h - y - 1) * w + lowerUpdatingRectBound.x; int rectWidth = upperUpdatingRectBound.x - lowerUpdatingRectBound.x; std::copy( reinterpret_cast(buffer) + lineOffset, reinterpret_cast(buffer) + lineOffset + rectWidth, - _browserBuffer.data() + lineOffset + _browserBuffer.data() + invLineOffset ); } @@ -123,14 +125,15 @@ void WebRenderHandler::updateTexture() { GL_TEXTURE_2D, 0, _lowerDirtyRectBound.x, - _lowerDirtyRectBound.y, + _browserBufferSize.y - _upperDirtyRectBound.y, _upperDirtyRectBound.x - _lowerDirtyRectBound.x, _upperDirtyRectBound.y - _lowerDirtyRectBound.y, GL_BGRA_EXT, GL_UNSIGNED_BYTE, reinterpret_cast( _browserBuffer.data() + - _lowerDirtyRectBound.y * _browserBufferSize.x + _lowerDirtyRectBound.x + (_browserBufferSize.y - _upperDirtyRectBound.y) * + _browserBufferSize.x + _lowerDirtyRectBound.x ) ); @@ -148,7 +151,7 @@ bool WebRenderHandler::hasContent(int x, int y) { if (_browserBuffer.empty()) { return false; } - int index = x + (_browserBufferSize.x * y); + int index = x + _browserBufferSize.x * (_browserBufferSize.y - y - 1); index = glm::clamp(index, 0, static_cast(_browserBuffer.size() - 1)); return _browserBuffer[index].a; } diff --git a/modules/webbrowser/webbrowsermodule.cpp b/modules/webbrowser/webbrowsermodule.cpp index c9181fa28c..bf11e5eb34 100644 --- a/modules/webbrowser/webbrowsermodule.cpp +++ b/modules/webbrowser/webbrowsermodule.cpp @@ -98,7 +98,7 @@ void WebBrowserModule::internalDeinitialize() { return; } - _eventHandler.detachBrowser(); + _eventHandler.resetBrowserInstance(); bool forceBrowserShutdown = true; for (BrowserInstance* browser : _browsers) { diff --git a/modules/webgui/webguimodule.cpp b/modules/webgui/webguimodule.cpp index 47f9ea7672..41a7f4c49f 100644 --- a/modules/webgui/webguimodule.cpp +++ b/modules/webgui/webguimodule.cpp @@ -27,6 +27,7 @@ #include #include #include +#include #include #include #include @@ -67,11 +68,34 @@ namespace { }; constexpr openspace::properties::Property::PropertyInfo - WebDirectoryInfo = + DirectoriesInfo = { - "WebDirectory", - "Web Directory", - "Directory from which to to serve static content", + "Directories", + "Directories", + "Directories from which to to serve static content, as a string list " + "with entries expressed as pairs, where every odd is the endpoint name and every " + "even is the directory.", + }; + + constexpr openspace::properties::Property::PropertyInfo + DefaultEndpointInfo = + { + "DefaultEndpoint", + "Default Endpoint", + "The 'default' endpoint. " + "The server will redirect http requests from / to /", + }; + + + constexpr openspace::properties::Property::PropertyInfo + ServedDirectoriesInfo = + { + "ServedDirectories", + "ServedDirectories", + "Directories that are currently served. This value is set by the server process, " + "as a verification of the actually served directories. For example, an onChange " + "callback can be registered to this, to reload browsers when the server is ready." + "Manual changes to this property have no effect." }; constexpr const char* DefaultAddress = "localhost"; @@ -82,16 +106,20 @@ namespace openspace { WebGuiModule::WebGuiModule() : OpenSpaceModule(WebGuiModule::Name) - , _enabled(ServerProcessEnabledInfo, false) + , _enabled(ServerProcessEnabledInfo, true) , _entryPoint(ServerProcessEntryPointInfo) - , _webDirectory(WebDirectoryInfo) + , _directories(DirectoriesInfo) + , _servedDirectories(ServedDirectoriesInfo) + , _defaultEndpoint(DefaultEndpointInfo) , _port(PortInfo, DefaultPort) , _address(AddressInfo, DefaultAddress) , _webSocketInterface(WebSocketInterfaceInfo, "") { addProperty(_enabled); addProperty(_entryPoint); - addProperty(_webDirectory); + addProperty(_directories); + addProperty(_servedDirectories); + addProperty(_defaultEndpoint); addProperty(_address); addProperty(_port); } @@ -104,6 +132,30 @@ std::string WebGuiModule::address() const { return _address; } +WebGuiModule::CallbackHandle WebGuiModule::addEndpointChangeCallback(EndpointCallback cb) +{ + CallbackHandle handle = _nextCallbackHandle++; + _endpointChangeCallbacks.push_back({ handle, std::move(cb) }); + return handle; +} + +void WebGuiModule::removeEndpointChangeCallback(CallbackHandle handle) { + const auto it = std::find_if( + _endpointChangeCallbacks.begin(), + _endpointChangeCallbacks.end(), + [handle](const std::pair& cb) { + return cb.first == handle; + } + ); + + ghoul_assert( + it != _endpointChangeCallbacks.end(), + "handle must be a valid callback handle" + ); + + _endpointChangeCallbacks.erase(it); +} + void WebGuiModule::internalInitialize(const ghoul::Dictionary& configuration) { if (configuration.hasValue(PortInfo.identifier)) { _port = configuration.value(PortInfo.identifier); @@ -119,7 +171,7 @@ void WebGuiModule::internalInitialize(const ghoul::Dictionary& configuration) { } auto startOrStop = [this]() { - if (_enabled) { + if (_enabled && !_entryPoint.value().empty()) { startProcess(); } else { stopProcess(); @@ -135,12 +187,46 @@ void WebGuiModule::internalInitialize(const ghoul::Dictionary& configuration) { _enabled.onChange(startOrStop); _entryPoint.onChange(restartIfEnabled); - _webDirectory.onChange(restartIfEnabled); + _directories.onChange(restartIfEnabled); + _defaultEndpoint.onChange(restartIfEnabled); + _servedDirectories.onChange([this]() { + std::unordered_map newEndpoints; + std::vector list = _servedDirectories.value(); + for (int i = 0; i < list.size() - 1; i += 2) { + newEndpoints[list[i]] = newEndpoints[list[i + 1]]; + } + for (const std::pair& e : _endpoints) { + if (newEndpoints.find(e.first) == newEndpoints.end()) { + // This endpoint existed before but does not exist anymore. + notifyEndpointListeners(e.first, false); + } + } + for (const std::pair& e : newEndpoints) { + if (_endpoints.find(e.first) == _endpoints.end() || + newEndpoints[e.first] != e.second) + { + // This endpoint exists now but did not exist before, + // or the directory has changed. + notifyEndpointListeners(e.first, true); + } + } + _endpoints = newEndpoints; + }); _port.onChange(restartIfEnabled); startOrStop(); } +void WebGuiModule::notifyEndpointListeners(const std::string& endpoint, bool exists) { + using K = CallbackHandle; + using V = EndpointCallback; + for (const std::pair& it : _endpointChangeCallbacks) { + it.second(endpoint, exists); + } +} + void WebGuiModule::startProcess() { + _endpoints.clear(); + ServerModule* serverModule = global::moduleEngine.module(); const ServerInterface* serverInterface = serverModule->serverInterfaceByIdentifier(_webSocketInterface); @@ -157,25 +243,55 @@ void WebGuiModule::startProcess() { const std::string nodePath = absPath("${MODULE_WEBGUI}/ext/nodejs/node"); #endif + std::string formattedDirectories = "["; + + std::vector directories = _directories.value(); + bool first = true; + + for (const std::string& str : directories) { + if (!first) { + formattedDirectories += ","; + } + first = false; + + // Escape twice: First json, and then bash (which needs same escape sequences) + formattedDirectories += "\\\"" + escapedJson(escapedJson(str)) + "\\\""; + } + formattedDirectories += "]"; + + const std::string defaultEndpoint = _defaultEndpoint.value().empty() ? + "" : + " --redirect \"" + _defaultEndpoint.value() + "\""; + const std::string command = "\"" + nodePath + "\" " + "\"" + absPath(_entryPoint.value()) + "\"" + - " --directory \"" + absPath(_webDirectory.value()) + "\"" + + " --directories \"" + formattedDirectories + "\"" + + defaultEndpoint + " --http-port \"" + std::to_string(_port.value()) + "\" " + " --ws-address \"" + _address.value() + "\"" + - " --ws-port \"" + std::to_string(webSocketPort) + "\"" + + " --ws-port " + std::to_string(webSocketPort) + " --auto-close --local"; _process = std::make_unique( command, - _webDirectory.value(), + absPath("${BIN}"), [](const char* data, size_t n) { const std::string str(data, n); LDEBUG(fmt::format("Web GUI server output: {}", str)); + }, + [](const char* data, size_t n) { + const std::string str(data, n); + LERROR(fmt::format("Web GUI server error: {}", str)); } ); } void WebGuiModule::stopProcess() { + for (const auto& e : _endpoints) { + notifyEndpointListeners(e.first, false); + } + _endpoints.clear(); + if (_process) { _process->kill(); } diff --git a/modules/webgui/webguimodule.h b/modules/webgui/webguimodule.h index 1f721b0193..7419d1b44e 100644 --- a/modules/webgui/webguimodule.h +++ b/modules/webgui/webguimodule.h @@ -28,19 +28,27 @@ #include #include +#include #include #include #include #include +#include +#include namespace openspace { class WebGuiModule : public OpenSpaceModule { public: + using CallbackHandle = int; + using EndpointCallback = std::function; + static constexpr const char* Name = "WebGui"; WebGuiModule(); int port() const; std::string address() const; + CallbackHandle addEndpointChangeCallback(EndpointCallback cb); + void removeEndpointChangeCallback(CallbackHandle); protected: void internalInitialize(const ghoul::Dictionary&) override; @@ -48,15 +56,23 @@ protected: private: void startProcess(); void stopProcess(); + void notifyEndpointListeners(const std::string& endpoint, bool exists); std::unique_ptr _process; properties::BoolProperty _enabled; properties::StringProperty _entryPoint; - properties::StringProperty _webDirectory; + properties::StringListProperty _directories; + properties::StringListProperty _servedDirectories; + properties::StringProperty _defaultEndpoint; + + std::unordered_map _endpoints; properties::IntProperty _port; properties::StringProperty _address; properties::StringProperty _webSocketInterface; + + std::vector> _endpointChangeCallbacks; + int _nextCallbackHandle = 0; }; } // namespace openspace diff --git a/recordings/apollo8 b/recordings/apollo8 deleted file mode 100644 index c9cafbdcaac57d01aa5cf35d5406fef593b8d869..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5994 zcmb{0?Nd~B6u|M76qF{|)C_?^OvZ48Wrd;0(p?fATBHa{Nh!bs!=vmDi^+oFf@K;q zC50O1NMa5M8R|}fq%5#tusnnEEFupTg<>!*ghux;bMhZJ_syMq=g#*t=e)Y}drK9W z5Tpu+$k4<{P$ovWsp7*md%_`3DwTM7zHSMc2kD>N)+NbBTIqrmk3+J_cNAk`E{&BU z;VKw*l?ykm*iDZ2V9#D3y}3xFe|yibGO_SJqj5+!IX5@3*1c6`D-t6)6=Cec8hgX(4y4E1% zXzz_XiOYg%(wpe$Nh3A5KPWvR_ayKok2-8=FhmA?ib+t2kATka&rc zbB&H2qCVU`x_2fTA#KCVGyXrZL)3@zrV0IRgrv5T!|QIaL)3@BThSvHMgeN^?i@X% zXNRZ{Dc^qOun{3~zGsPB6+1+ISTnOi7K2c5n6Iv&njNA(=RKRw&hhB z`w>!o{oP9co9qzv;oN$|z!X9OQU6K4c#ct6GIn z%bJ{~kUI8>s1MOQnv!2eNUL}%!?vCsqCS`v-f(&op@4x;2AlaI>O*$w>eUhRt5bht zIA~;_i25L(7`%5FA^FO@wwwlbi25+292T8LXz}y9svV8&5cR>ubxHnJgz`i^?X&z4 z^}%7x{O&`9q`%!PA8%%#i27h0>G5@H6rhHC9_jiPc8L0LcGB1-N66lGS}*)VbN_o& zA2v+QnvNh8VPCo_sEr+>KE&E-1}`DxTUIl~i27g}FO)%Z#9#$Nr^+%%B%SONQ6Hq~*+;t&3JX~J z@o|2L`rv;j&S@N>4#WNjL;Mi+VRq-%z&V7D74=_m>0)0U^c+xz(;>cd%Sn%8E8?5!$g&fV;*qdvTGGE5VQkfA`aMZ*tKAA;=4 zMk5jWv$S}+mLH-%G<$X}N=2yeg?0Pvde~P-eW)vWJpIM|>Z~ff)%+0kA>&2+@e2qQ z{O+~X$PZB;GW~q6lq1xj>0ay5%f345gL&G|rY3|+w_JNIjvt~vdm_9Z4bDurWhH6CkA)RAg+j4~l`{&YJgAxff7 fQmX!ca$X0e2feR^U{R}RT6^wE5o;U=+|>UMgyQg7 diff --git a/src/documentation/core_registration.cpp b/src/documentation/core_registration.cpp index 3d7e026b94..1d8de7effb 100644 --- a/src/documentation/core_registration.cpp +++ b/src/documentation/core_registration.cpp @@ -58,6 +58,9 @@ namespace openspace { void registerCoreClasses(documentation::DocumentationEngine& engine) { engine.addDocumentation(LogFactoryDocumentation()); engine.addDocumentation(Mission::Documentation()); + engine.addDocumentation( + interaction::NavigationHandler::NavigationState::Documentation() + ); engine.addDocumentation(Renderable::Documentation()); engine.addDocumentation(Rotation::Documentation()); engine.addDocumentation(Scale::Documentation()); diff --git a/src/engine/openspaceengine.cpp b/src/engine/openspaceengine.cpp index 52a268ca12..4bebd18ff7 100644 --- a/src/engine/openspaceengine.cpp +++ b/src/engine/openspaceengine.cpp @@ -811,7 +811,6 @@ void OpenSpaceEngine::deinitialize() { ghoul::logging::LogManager::deinitialize(); - ghoul::deinitialize(); LTRACE("deinitialize(end)"); @@ -1013,8 +1012,6 @@ void OpenSpaceEngine::preSynchronization() { } global::renderEngine.updateScene(); - //_navigationHandler->updateCamera(dt); - if (_scene) { Camera* camera = _scene->camera(); diff --git a/src/interaction/navigationhandler.cpp b/src/interaction/navigationhandler.cpp index c9b765a545..f4f0c21dc9 100644 --- a/src/interaction/navigationhandler.cpp +++ b/src/interaction/navigationhandler.cpp @@ -27,14 +27,17 @@ #include #include #include -#include -#include -#include #include +#include +#include #include +#include +#include #include #include #include +#include +#include #include namespace { @@ -43,7 +46,11 @@ namespace { constexpr const char* KeyAnchor = "Anchor"; constexpr const char* KeyAim = "Aim"; constexpr const char* KeyPosition = "Position"; - constexpr const char* KeyRotation = "Rotation"; + constexpr const char* KeyUp = "Up"; + constexpr const char* KeyYaw = "Yaw"; + constexpr const char* KeyPitch = "Pitch"; + constexpr const char* KeyReferenceFrame = "ReferenceFrame"; + const double Epsilon = 1E-7; constexpr const openspace::properties::Property::PropertyInfo KeyFrameInfo = { "UseKeyFrameInteraction", @@ -51,24 +58,101 @@ namespace { "If this is set to 'true' the entire interaction is based off key frames rather " "than using the mouse interaction." }; + } // namespace #include "navigationhandler_lua.inl" namespace openspace::interaction { + +ghoul::Dictionary +openspace::interaction::NavigationHandler::NavigationState::dictionary() const +{ + ghoul::Dictionary cameraDict; + cameraDict.setValue(KeyPosition, position); + cameraDict.setValue(KeyAnchor, anchor); + + if (anchor != referenceFrame) { + cameraDict.setValue(KeyReferenceFrame, referenceFrame); + } + if (!aim.empty()) { + cameraDict.setValue(KeyAim, aim); + } + if (up.has_value()) { + cameraDict.setValue(KeyUp, up.value()); + + if (std::abs(yaw) > Epsilon) { + cameraDict.setValue(KeyYaw, yaw); + } + if (std::abs(pitch) > Epsilon) { + cameraDict.setValue(KeyPitch, pitch); + } + } + + return cameraDict; +} + +openspace::interaction::NavigationHandler::NavigationState::NavigationState( + const ghoul::Dictionary& dictionary) +{ + const bool hasAnchor = dictionary.hasValue(KeyAnchor); + const bool hasPosition = dictionary.hasValue(KeyPosition); + if (!hasAnchor || !hasPosition) { + throw ghoul::RuntimeError( + "Position and Anchor need to be defined for navigation dictionary." + ); + } + + anchor = dictionary.value(KeyAnchor); + position = dictionary.value(KeyPosition); + + if (dictionary.hasValue(KeyReferenceFrame)) { + referenceFrame = dictionary.value(KeyReferenceFrame); + } + else { + referenceFrame = anchor; + } + if (dictionary.hasValue(KeyAim)) { + aim = dictionary.value(KeyAim); + } + + if (dictionary.hasValue(KeyUp)) { + up = dictionary.value(KeyUp); + + if (dictionary.hasValue(KeyYaw)) { + yaw = dictionary.value(KeyYaw); + } + if (dictionary.hasValue(KeyPitch)) { + pitch = dictionary.value(KeyPitch); + } + } +} + +openspace::interaction::NavigationHandler::NavigationState::NavigationState( + std::string anchor, + std::string aim, + std::string referenceFrame, + glm::dvec3 position, + std::optional up, + double yaw, + double pitch) + : anchor(std::move(anchor)) + , aim(std::move(aim)) + , referenceFrame(std::move(referenceFrame)) + , position(std::move(position)) + , up(std::move(up)) + , yaw(yaw) + , pitch(pitch) +{} + NavigationHandler::NavigationHandler() : properties::PropertyOwner({ "NavigationHandler" }) , _useKeyFrameInteraction(KeyFrameInfo, false) { - - _inputState = std::make_unique(); - _orbitalNavigator = std::make_unique(); - _keyframeNavigator = std::make_unique(); - // Add the properties addProperty(_useKeyFrameInteraction); - addPropertySubOwner(*_orbitalNavigator); + addPropertySubOwner(_orbitalNavigator); } NavigationHandler::~NavigationHandler() {} // NOLINT @@ -90,19 +174,25 @@ void NavigationHandler::deinitialize() { void NavigationHandler::setCamera(Camera* camera) { _camera = camera; - _orbitalNavigator->setCamera(camera); + _orbitalNavigator.setCamera(camera); } -const OrbitalNavigator& NavigationHandler::orbitalNavigator() const { - return *_orbitalNavigator; +void NavigationHandler::setNavigationStateNextFrame( + NavigationHandler::NavigationState state) +{ + _pendingNavigationState = std::move(state); } OrbitalNavigator& NavigationHandler::orbitalNavigator() { - return *_orbitalNavigator; + return _orbitalNavigator; } -KeyframeNavigator& NavigationHandler::keyframeNavigator() const { - return *_keyframeNavigator; +const OrbitalNavigator& NavigationHandler::orbitalNavigator() const { + return _orbitalNavigator; +} + +KeyframeNavigator& NavigationHandler::keyframeNavigator() { + return _keyframeNavigator; } bool NavigationHandler::isKeyFrameInteractionEnabled() const { @@ -110,33 +200,93 @@ bool NavigationHandler::isKeyFrameInteractionEnabled() const { } float NavigationHandler::interpolationTime() const { - return _orbitalNavigator->retargetInterpolationTime(); + return _orbitalNavigator.retargetInterpolationTime(); } void NavigationHandler::setInterpolationTime(float durationInSeconds) { - _orbitalNavigator->setRetargetInterpolationTime(durationInSeconds); + _orbitalNavigator.setRetargetInterpolationTime(durationInSeconds); } void NavigationHandler::updateCamera(double deltaTime) { - ghoul_assert(_inputState != nullptr, "InputState must not be nullptr"); ghoul_assert(_camera != nullptr, "Camera must not be nullptr"); - if (_cameraUpdatedFromScript) { - _cameraUpdatedFromScript = false; - } - else { - if (!_playbackModeEnabled && _camera) { - if (_useKeyFrameInteraction) { - _keyframeNavigator->updateCamera(*_camera, _playbackModeEnabled); - } - else { - _orbitalNavigator->updateStatesFromInput(*_inputState, deltaTime); - _orbitalNavigator->updateCameraStateFromStates(deltaTime); - } + if (_pendingNavigationState.has_value()) { + applyNavigationState(_pendingNavigationState.value()); + _orbitalNavigator.resetVelocities(); + _pendingNavigationState.reset(); + } else if (!_playbackModeEnabled && _camera) { + if (_useKeyFrameInteraction) { + _keyframeNavigator.updateCamera(*_camera, _playbackModeEnabled); + } + else { + _orbitalNavigator.updateStatesFromInput(_inputState, deltaTime); + _orbitalNavigator.updateCameraStateFromStates(deltaTime); } } } +void NavigationHandler::applyNavigationState(const NavigationHandler::NavigationState& ns) +{ + const SceneGraphNode* referenceFrame = sceneGraphNode(ns.referenceFrame); + const SceneGraphNode* anchor = sceneGraphNode(ns.anchor); + + if (!anchor) { + LERROR(fmt::format( + "Could not find scene graph node '{}' used as anchor.", ns.referenceFrame + )); + return; + } + if (!ns.aim.empty() && !sceneGraphNode(ns.aim)) { + LERROR(fmt::format( + "Could not find scene graph node '{}' used as aim.", ns.referenceFrame + )); + return; + } + if (!referenceFrame) { + LERROR(fmt::format( + "Could not find scene graph node '{}' used as reference frame.", + ns.referenceFrame) + ); + return; + } + + const glm::dvec3 anchorWorldPosition = anchor->worldPosition(); + const glm::dmat3 referenceFrameTransform = referenceFrame->worldRotationMatrix(); + + _orbitalNavigator.setAnchorNode(ns.anchor); + _orbitalNavigator.setAimNode(ns.aim); + + const SceneGraphNode* anchorNode = _orbitalNavigator.anchorNode(); + const SceneGraphNode* aimNode = _orbitalNavigator.aimNode(); + if (!aimNode) { + aimNode = anchorNode; + } + + const glm::dvec3 cameraPositionWorld = anchorWorldPosition + + glm::dvec3(referenceFrameTransform * glm::dvec4(ns.position, 1.0)); + + glm::dvec3 up = ns.up.has_value() ? + glm::normalize(referenceFrameTransform * ns.up.value()) : + glm::dvec3(0.0, 1.0, 0.0); + + // Construct vectors of a "neutral" view, i.e. when the aim is centered in view. + glm::dvec3 neutralView = + glm::normalize(aimNode->worldPosition() - cameraPositionWorld); + + glm::dquat neutralCameraRotation = glm::inverse(glm::quat_cast(glm::lookAt( + glm::dvec3(0.0), + neutralView, + up + ))); + + glm::dquat pitchRotation = glm::angleAxis(ns.pitch, glm::dvec3(1.f, 0.f, 0.f)); + glm::dquat yawRotation = glm::angleAxis(ns.yaw, glm::dvec3(0.f, -1.f, 0.f)); + + _camera->setPositionVec3(cameraPositionWorld); + _camera->setRotation(neutralCameraRotation * yawRotation * pitchRotation); + _orbitalNavigator.clearPreviousState(); +} + void NavigationHandler::setEnableKeyFrameInteraction() { _useKeyFrameInteraction = true; } @@ -150,8 +300,8 @@ void NavigationHandler::triggerPlaybackStart() { } void NavigationHandler::stopPlayback() { - _orbitalNavigator->resetVelocities(); - _orbitalNavigator->resetNodeMovements(); + _orbitalNavigator.resetVelocities(); + _orbitalNavigator.resetNodeMovements(); _playbackModeEnabled = false; } @@ -160,131 +310,120 @@ Camera* NavigationHandler::camera() const { } const InputState& NavigationHandler::inputState() const { - return *_inputState; + return _inputState; } void NavigationHandler::mouseButtonCallback(MouseButton button, MouseAction action) { - _inputState->mouseButtonCallback(button, action); + _inputState.mouseButtonCallback(button, action); } void NavigationHandler::mousePositionCallback(double x, double y) { - _inputState->mousePositionCallback(x, y); + _inputState.mousePositionCallback(x, y); } void NavigationHandler::mouseScrollWheelCallback(double pos) { - _inputState->mouseScrollWheelCallback(pos); + _inputState.mouseScrollWheelCallback(pos); } void NavigationHandler::keyboardCallback(Key key, KeyModifier modifier, KeyAction action) { - _inputState->keyboardCallback(key, modifier, action); + _inputState.keyboardCallback(key, modifier, action); } -void NavigationHandler::setCameraStateFromDictionary(const ghoul::Dictionary& cameraDict) +NavigationHandler::NavigationState NavigationHandler::navigationState( + const SceneGraphNode& referenceFrame) const { - bool readSuccessful = true; + const SceneGraphNode* anchor = _orbitalNavigator.anchorNode(); + const SceneGraphNode* aim = _orbitalNavigator.aimNode(); - std::string anchor; - std::string aim; - glm::dvec3 cameraPosition; - glm::dvec4 cameraRotation; // Need to read the quaternion as a vector first. - - readSuccessful &= cameraDict.getValue(KeyAnchor, anchor); - readSuccessful &= cameraDict.getValue(KeyPosition, cameraPosition); - readSuccessful &= cameraDict.getValue(KeyRotation, cameraRotation); - cameraDict.getValue(KeyAim, aim); // Aim is not required - - if (!readSuccessful) { - throw ghoul::RuntimeError( - "Position, Rotation and Focus need to be defined for camera dictionary." - ); + if (!aim) { + aim = anchor; } - // Set state - _orbitalNavigator->setAnchorNode(anchor); - _orbitalNavigator->setAimNode(aim); + const glm::dquat invNeutralRotation = glm::quat_cast(glm::lookAt( + glm::dvec3(0.0, 0.0, 0.0), + aim->worldPosition() - _camera->positionVec3(), + glm::normalize(_camera->lookUpVectorWorldSpace()) + )); - _camera->setPositionVec3(cameraPosition); - _camera->setRotation(glm::dquat( - cameraRotation.x, cameraRotation.y, cameraRotation.z, cameraRotation.w)); + glm::dquat localRotation = invNeutralRotation * _camera->rotationQuaternion(); + glm::dvec3 eulerAngles = glm::eulerAngles(localRotation); + + const double pitch = eulerAngles.x; + const double yaw = -eulerAngles.y; + + // Need to compensate by redisual roll left in local rotation: + const glm::dquat unroll = glm::angleAxis(eulerAngles.z, glm::dvec3(0, 0, 1)); + const glm::dvec3 neutralUp = + glm::inverse(invNeutralRotation) * unroll * _camera->lookUpVectorCameraSpace(); + + const glm::dmat3 invReferenceFrameTransform = + glm::inverse(referenceFrame.worldRotationMatrix()); + + const glm::dvec3 position = invReferenceFrameTransform * + (glm::dvec4(_camera->positionVec3() - anchor->worldPosition(), 1.0)); + + return NavigationState( + _orbitalNavigator.anchorNode()->identifier(), + _orbitalNavigator.aimNode() ? + _orbitalNavigator.aimNode()->identifier() : "", + referenceFrame.identifier(), + position, + invReferenceFrameTransform * neutralUp, yaw, pitch + ); } -ghoul::Dictionary NavigationHandler::cameraStateDictionary() { - glm::dvec3 cameraPosition; - glm::dquat quat; - glm::dvec4 cameraRotation; +void NavigationHandler::saveNavigationState(const std::string& filepath, + const std::string& referenceFrameIdentifier) +{ + const SceneGraphNode* referenceFrame = _orbitalNavigator.followingNodeRotation() ? + _orbitalNavigator.anchorNode() : + sceneGraph()->root(); - cameraPosition = _camera->positionVec3(); - quat = _camera->rotationQuaternion(); - cameraRotation = glm::dvec4(quat.w, quat.x, quat.y, quat.z); - - ghoul::Dictionary cameraDict; - cameraDict.setValue(KeyPosition, cameraPosition); - cameraDict.setValue(KeyRotation, cameraRotation); - cameraDict.setValue(KeyAnchor, _orbitalNavigator->anchorNode()->identifier()); - if (_orbitalNavigator->aimNode()) { - cameraDict.setValue(KeyAim, _orbitalNavigator->aimNode()->identifier()); - } - - return cameraDict; -} - -void NavigationHandler::saveCameraStateToFile(const std::string& filepath) { - if (!filepath.empty()) { - std::string fullpath = absPath(filepath); - LINFO(fmt::format("Saving camera position: {}", filepath)); - - ghoul::Dictionary cameraDict = cameraStateDictionary(); - - // TODO(abock): Should get the camera state as a dictionary and save the - // dictionary to a file in form of a lua state and not use ofstreams here. - - std::ofstream ofs(fullpath.c_str()); - - glm::dvec3 p = _camera->positionVec3(); - glm::dquat q = _camera->rotationQuaternion(); - - ofs << "return {" << std::endl; - ofs << " " << KeyAnchor << " = " << "\"" << - _orbitalNavigator->anchorNode()->identifier() << "\"" - << "," << std::endl; - - if (_orbitalNavigator->aimNode()) { - ofs << " " << KeyAim << " = " << "\"" << - _orbitalNavigator->aimNode()->identifier() << "\"" - << "," << std::endl; + if (!referenceFrameIdentifier.empty()) { + referenceFrame = sceneGraphNode(referenceFrameIdentifier); + if (!referenceFrame) { + LERROR(fmt::format( + "Could not find node '{}' to use as reference frame", + referenceFrameIdentifier + )); + return; } + } - ofs << " " << KeyPosition << " = {" - << std::to_string(p.x) << ", " - << std::to_string(p.y) << ", " - << std::to_string(p.z) << "}," << std::endl; - ofs << " " << KeyRotation << " = {" - << std::to_string(q.w) << ", " - << std::to_string(q.x) << ", " - << std::to_string(q.y) << ", " - << std::to_string(q.z) << "}," << std::endl; - ofs << "}"<< std::endl; + if (!filepath.empty()) { + std::string absolutePath = absPath(filepath); + LINFO(fmt::format("Saving camera position: {}", absolutePath)); + ghoul::Dictionary cameraDict = navigationState(*referenceFrame).dictionary(); + ghoul::DictionaryLuaFormatter formatter; + + std::ofstream ofs(absolutePath.c_str()); + ofs << "return " << formatter.format(cameraDict); ofs.close(); } } -void NavigationHandler::restoreCameraStateFromFile(const std::string& filepath) { - LINFO(fmt::format("Reading camera state from file: {}", filepath)); - if (!FileSys.fileExists(filepath)) { - throw ghoul::FileNotFoundError(filepath, "CameraFilePath"); +void NavigationHandler::loadNavigationState(const std::string& filepath) { + const std::string absolutePath = absPath(filepath); + LINFO(fmt::format("Reading camera state from file: {}", absolutePath)); + + if (!FileSys.fileExists(absolutePath)) { + throw ghoul::FileNotFoundError(absolutePath, "NavigationState"); } - ghoul::Dictionary cameraDict; + ghoul::Dictionary navigationStateDictionary; try { - ghoul::lua::loadDictionaryFromFile(filepath, cameraDict); - setCameraStateFromDictionary(cameraDict); - _cameraUpdatedFromScript = true; + ghoul::lua::loadDictionaryFromFile(absolutePath, navigationStateDictionary); + openspace::documentation::testSpecificationAndThrow( + NavigationState::Documentation(), + navigationStateDictionary, + "NavigationState" + ); + setNavigationStateNextFrame(NavigationState(navigationStateDictionary)); } catch (ghoul::RuntimeError& e) { - LWARNING("Unable to set camera position"); - LWARNING(e.message); + LERROR(fmt::format("Unable to set camera position: {}", e.message)); } } @@ -293,7 +432,7 @@ void NavigationHandler::setJoystickAxisMapping(int axis, JoystickCameraStates::AxisInvert shouldInvert, JoystickCameraStates::AxisNormalize shouldNormalize) { - _orbitalNavigator->joystickStates().setAxisMapping( + _orbitalNavigator.joystickStates().setAxisMapping( axis, mapping, shouldInvert, @@ -304,15 +443,15 @@ void NavigationHandler::setJoystickAxisMapping(int axis, JoystickCameraStates::AxisInformation NavigationHandler::joystickAxisMapping(int axis) const { - return _orbitalNavigator->joystickStates().axisMapping(axis); + return _orbitalNavigator.joystickStates().axisMapping(axis); } void NavigationHandler::setJoystickAxisDeadzone(int axis, float deadzone) { - _orbitalNavigator->joystickStates().setDeadzone(axis, deadzone); + _orbitalNavigator.joystickStates().setDeadzone(axis, deadzone); } float NavigationHandler::joystickAxisDeadzone(int axis) const { - return _orbitalNavigator->joystickStates().deadzone(axis); + return _orbitalNavigator.joystickStates().deadzone(axis); } void NavigationHandler::bindJoystickButtonCommand(int button, std::string command, @@ -320,7 +459,7 @@ void NavigationHandler::bindJoystickButtonCommand(int button, std::string comman JoystickCameraStates::ButtonCommandRemote remote, std::string documentation) { - _orbitalNavigator->joystickStates().bindButtonCommand( + _orbitalNavigator.joystickStates().bindButtonCommand( button, std::move(command), action, @@ -330,11 +469,68 @@ void NavigationHandler::bindJoystickButtonCommand(int button, std::string comman } void NavigationHandler::clearJoystickButtonCommand(int button) { - _orbitalNavigator->joystickStates().clearButtonCommand(button); + _orbitalNavigator.joystickStates().clearButtonCommand(button); } std::vector NavigationHandler::joystickButtonCommand(int button) const { - return _orbitalNavigator->joystickStates().buttonCommand(button); + return _orbitalNavigator.joystickStates().buttonCommand(button); +} + +documentation::Documentation NavigationHandler::NavigationState::Documentation() { + using namespace documentation; + + return { + "Navigation State", + "core_navigation_state", + { + { + KeyAnchor, + new StringVerifier, + Optional::No, + "The identifier of the anchor node." + }, + { + KeyAim, + new StringVerifier, + Optional::Yes, + "The identifier of the aim node, if used." + }, + { + KeyReferenceFrame, + new StringVerifier, + Optional::Yes, + "The identifier of the scene graph node to use as reference frame. " + "If not specified, this will be the same as the anchor." + }, + { + KeyPosition, + new DoubleVector3Verifier, + Optional::No, + "The position of the camera relative to the anchor node, " + "expressed in meters in the specified reference frame." + }, + { + KeyUp, + new DoubleVector3Verifier, + Optional::Yes, + "The up vector expressed in the coordinate system of the reference frame." + }, + { + KeyYaw, + new DoubleVerifier, + Optional::Yes, + "The yaw angle in radians. " + "Positive angle means yawing camera to the right." + }, + { + KeyPitch, + new DoubleVerifier, + Optional::Yes, + "The pitch angle in radians. " + "Positive angle means pitching camera upwards." + }, + } + }; } scripting::LuaLibrary NavigationHandler::luaLibrary() { @@ -342,25 +538,33 @@ scripting::LuaLibrary NavigationHandler::luaLibrary() { "navigation", { { - "setCameraState", - &luascriptfunctions::setCameraState, + "setNavigationState", + &luascriptfunctions::setNavigationState, {}, - "object", - "Set the camera state" + "table", + "Set the navigation state. " + "The argument must be a valid Navigation State." }, { - "saveCameraStateToFile", - &luascriptfunctions::saveCameraStateToFile, + "saveNavigationState", + &luascriptfunctions::saveNavigationState, {}, - "string", - "Save the current camera state to file" + "string, [string]", + "Save the current navigation state to a file with the path given by the " + "first argument. The optoinal second argument is the scene graph node to " + "use as reference frame. By default, the reference frame will picked " + "based on whether the orbital navigator is currently following the " + "anchor node rotation. If it is, the anchor will be chosen as reference " + "frame. If not, the reference frame will be set to the scene graph root." }, { - "restoreCameraStateFromFile", - &luascriptfunctions::restoreCameraStateFromFile, + "loadNavigationState", + &luascriptfunctions::loadNavigationState, {}, "string", - "Restore the camera state from file" + "Load a navigation state from file. The file should be a lua file " + "returning the navigation state as a table formatted as a " + "Navigation State, such as the output files of saveNavigationState." }, { "retargetAnchor", diff --git a/src/interaction/navigationhandler_lua.inl b/src/interaction/navigationhandler_lua.inl index f2affeeea7..899859c36e 100644 --- a/src/interaction/navigationhandler_lua.inl +++ b/src/interaction/navigationhandler_lua.inl @@ -26,8 +26,8 @@ namespace openspace::luascriptfunctions { -int restoreCameraStateFromFile(lua_State* L) { - ghoul::lua::checkArgumentsAndThrow(L, 1, "lua::restoreCameraStateFromFile"); +int loadNavigationState(lua_State* L) { + ghoul::lua::checkArgumentsAndThrow(L, 1, "lua::loadNavigationState"); const std::string& cameraStateFilePath = ghoul::lua::value( L, @@ -39,27 +39,35 @@ int restoreCameraStateFromFile(lua_State* L) { return ghoul::lua::luaError(L, "filepath string is empty"); } - global::navigationHandler.restoreCameraStateFromFile(cameraStateFilePath); + global::navigationHandler.loadNavigationState(cameraStateFilePath); ghoul_assert(lua_gettop(L) == 0, "Incorrect number of items left on stack"); return 0; } -int setCameraState(lua_State* L) { - ghoul::lua::checkArgumentsAndThrow(L, 1, "lua::setCameraState"); +int setNavigationState(lua_State* L) { + ghoul::lua::checkArgumentsAndThrow(L, 1, "lua::setNavigationState"); - try { - ghoul::Dictionary dictionary; - ghoul::lua::luaDictionaryFromState(L, dictionary); - global::navigationHandler.setCameraStateFromDictionary(dictionary); - } catch (const ghoul::RuntimeError& e) { + ghoul::Dictionary navigationStateDictionary; + ghoul::lua::luaDictionaryFromState(L, navigationStateDictionary); + + using namespace openspace::documentation; + + TestResult r = testSpecification( + interaction::NavigationHandler::NavigationState::Documentation(), + navigationStateDictionary + ); + + if (!r.success) { lua_settop(L, 0); return ghoul::lua::luaError( L, - fmt::format("Could not set camera state: {}", e.what()) + fmt::format("Could not set camera state: {}", ghoul::to_string(r)) ); } + global::navigationHandler.setNavigationStateNextFrame(navigationStateDictionary); + // @CLEANUP: When luaDictionaryFromState doesn't leak space anymore, remove the next // line ---abock(2018-02-15) lua_settop(L, 0); @@ -67,21 +75,27 @@ int setCameraState(lua_State* L) { return 0; } -int saveCameraStateToFile(lua_State* L) { - ghoul::lua::checkArgumentsAndThrow(L, 1, "lua::saveCameraStateToFile"); - - const std::string& cameraStateFilePath = ghoul::lua::value( +int saveNavigationState(lua_State* L) { + const int n = ghoul::lua::checkArgumentsAndThrow( L, - 1, - ghoul::lua::PopValue::Yes + { 1, 2 }, + "lua::saveNavigationState" ); + const std::string& cameraStateFilePath = ghoul::lua::value(L, 1); + + std::string referenceFrame = ""; + if (n > 1) { + referenceFrame = ghoul::lua::value(L, 2); + } + if (cameraStateFilePath.empty()) { return ghoul::lua::luaError(L, "filepath string is empty"); } - global::navigationHandler.saveCameraStateToFile(cameraStateFilePath); + global::navigationHandler.saveNavigationState(cameraStateFilePath, referenceFrame); + lua_settop(L, 0); ghoul_assert(lua_gettop(L) == 0, "Incorrect number of items left on stack"); return 0; } diff --git a/src/interaction/orbitalnavigator.cpp b/src/interaction/orbitalnavigator.cpp index a1ae0da15b..2ec2474bf9 100644 --- a/src/interaction/orbitalnavigator.cpp +++ b/src/interaction/orbitalnavigator.cpp @@ -365,20 +365,26 @@ void OrbitalNavigator::updateCameraStateFromStates(double deltaTime) { const glm::dvec3 anchorPos = _anchorNode->worldPosition(); const glm::dvec3 prevCameraPosition = _camera->positionVec3(); - const glm::dvec3 anchorDisplacement = anchorPos - _previousAnchorNodePosition; + const glm::dvec3 anchorDisplacement = _previousAnchorNodePosition.has_value() ? + (anchorPos - _previousAnchorNodePosition.value()) : + glm::dvec3(0.0); CameraPose pose = { _camera->positionVec3() + anchorDisplacement, _camera->rotationQuaternion() }; - if (_aimNode && _aimNode != _anchorNode) { + const bool hasPreviousPositions = + _previousAnchorNodePosition.has_value() && + _previousAimNodePosition.has_value(); + + if (_aimNode && _aimNode != _anchorNode && hasPreviousPositions) { const glm::dvec3 aimPos = _aimNode->worldPosition(); const glm::dvec3 cameraToAnchor = - _previousAnchorNodePosition - prevCameraPosition; + _previousAnchorNodePosition.value() - prevCameraPosition; Displacement anchorToAim = { - _previousAimNodePosition - _previousAnchorNodePosition, + _previousAimNodePosition.value() - _previousAnchorNodePosition.value(), aimPos - anchorPos }; @@ -413,8 +419,9 @@ void OrbitalNavigator::updateCameraStateFromStates(double deltaTime) { glm::dquat anchorRotation = glm::quat_cast(_anchorNode->worldRotationMatrix()); - glm::dquat anchorNodeRotationDiff = - _previousAnchorNodeRotation * glm::inverse(anchorRotation); + glm::dquat anchorNodeRotationDiff = _previousAnchorNodeRotation.has_value() ? + _previousAnchorNodeRotation.value() * glm::inverse(anchorRotation) : + glm::dquat(); _previousAnchorNodeRotation = anchorRotation; @@ -563,11 +570,17 @@ void OrbitalNavigator::setAnchorNode(const SceneGraphNode* anchorNode) { _anchorNode = anchorNode; if (_anchorNode) { - _previousAnchorNodePosition = _anchorNode->worldPosition(); - _previousAnchorNodeRotation = glm::quat_cast(_anchorNode->worldRotationMatrix()); + _previousAnchorNodePosition.reset(); + _previousAnchorNodeRotation.reset(); } } +void OrbitalNavigator::clearPreviousState() { + _previousAnchorNodePosition.reset(); + _previousAnchorNodeRotation.reset(); + _previousAimNodePosition.reset(); +} + void OrbitalNavigator::setAimNode(const SceneGraphNode* aimNode) { _retargetAimInterpolator.end(); _aimNode = aimNode; @@ -652,6 +665,9 @@ void OrbitalNavigator::setRetargetInterpolationTime(float durationInSeconds) { } bool OrbitalNavigator::followingNodeRotation() const { + if (_aimNode != nullptr && _aimNode != _anchorNode) { + return false; + } return _followRotationInterpolator.value() >= 1.0; } @@ -1219,4 +1235,8 @@ JoystickCameraStates& OrbitalNavigator::joystickStates() { return _joystickStates; } +const JoystickCameraStates& OrbitalNavigator::joystickStates() const { + return _joystickStates; +} + } // namespace openspace::interaction diff --git a/src/interaction/sessionrecording.cpp b/src/interaction/sessionrecording.cpp index 89b3707e89..b46206e6d7 100644 --- a/src/interaction/sessionrecording.cpp +++ b/src/interaction/sessionrecording.cpp @@ -848,7 +848,7 @@ void SessionRecording::playbackCamera() { pbFrame.followFocusNodeRotation = (rotationFollowing == "F"); } if (_setSimulationTimeWithNextCameraKeyframe) { - global::timeManager.setTimeNextFrame(timeSim); + global::timeManager.setTimeNextFrame(Time(timeSim)); _setSimulationTimeWithNextCameraKeyframe = false; _saveRenderingCurrentRecordedTime = timeRec; } diff --git a/src/interaction/touchbar.mm b/src/interaction/touchbar.mm index de51a9fee7..f1762ced24 100644 --- a/src/interaction/touchbar.mm +++ b/src/interaction/touchbar.mm @@ -31,6 +31,7 @@ #include #include #include +#include using namespace openspace; @@ -44,8 +45,8 @@ using namespace openspace; #import static NSString* pauseResultId = @"com.openspaceproject.pause_resume"; -static NSString* showFullGuiId = @"com.openspaceproject.show_full_gui"; -static NSString* showSimpleGuiId = @"com.openspaceproject.show_simple_gui"; +static NSString* hideGuiId = @"com.openspaceproject.hide_gui"; +static NSString* hideOnScreenTextId = @"com.openspaceproject.hide_onscreen"; NSArray* focusIdentifiers; @@ -55,8 +56,8 @@ NSArray* focusIdentifiers; makeItemForIdentifier:(NSTouchBarItemIdentifier)identifier; - (void)pauseResumeButtonAction:(id)sender; - (void)focusObjectAction:(id)sender; - - (void)fullGuiButtonAction:(id)sender; - - (void)simpleGuiButtonAction:(id)sender; + - (void)hideTextAction:(id)sender; + - (void)hideGuiAction:(id)sender; @end @implementation TouchBarDelegate @@ -66,7 +67,7 @@ NSArray* focusIdentifiers; touchBar.customizationIdentifier = @"com.openspaceproject.main_touch_bar"; - NSArray* objs = [@[showSimpleGuiId, showFullGuiId, + NSArray* objs = [@[hideGuiId, hideOnScreenTextId, NSTouchBarItemIdentifierFixedSpaceSmall, pauseResultId, NSTouchBarItemIdentifierFlexibleSpace] arrayByAddingObjectsFromArray: focusIdentifiers]; @@ -85,8 +86,6 @@ NSArray* focusIdentifiers; - (NSTouchBarItem *)touchBar:(NSTouchBar *)touchBar makeItemForIdentifier:(NSTouchBarItemIdentifier)identifier { - // @TODO(abock): Potential memory leak here by returning an alloc? - // Remove the unused variable warning (void)touchBar; @@ -112,38 +111,38 @@ NSArray* focusIdentifiers; return [touchBarItem autorelease]; } - if ([identifier isEqualToString:showFullGuiId]) { + if ([identifier isEqualToString:hideOnScreenTextId]) { NSButton* button = [NSButton - buttonWithTitle:@"Full GUI" - target:self action:@selector(fullGuiButtonAction:) + buttonWithTitle:@"Toggle Text" + target:self action:@selector(hideTextAction:) ]; NSCustomTouchBarItem* touchBarItem = [ [NSCustomTouchBarItem alloc] - initWithIdentifier:showFullGuiId + initWithIdentifier:hideOnScreenTextId ]; touchBarItem.view = button; touchBarItem.customizationLabel = NSLocalizedString( - @"Toggles the full GUI", + @"Toogles on-screen text", @"" ); return [touchBarItem autorelease]; } - if ([identifier isEqualToString:showSimpleGuiId]) { + if ([identifier isEqualToString:hideGuiId]) { NSButton* button = [NSButton - buttonWithTitle:@"Simple GUI" - target:self action:@selector(simpleGuiButtonAction:) + buttonWithTitle:@"Toggle GUI" + target:self action:@selector(hideGuiAction:) ]; NSCustomTouchBarItem* touchBarItem = [ [NSCustomTouchBarItem alloc] - initWithIdentifier:showSimpleGuiId + initWithIdentifier:hideGuiId ]; touchBarItem.view = button; touchBarItem.customizationLabel = NSLocalizedString( - @"Toggles the simple GUI", + @"Toggles the main GUI", @"" ); @@ -188,63 +187,40 @@ NSArray* focusIdentifiers; NSString* title = [button title]; + std::string str = fmt::format( + "openspace.setPropertyValueSingle('{}', '{}');\ + openspace.setPropertyValueSingle('{}', '');\ + openspace.setPropertyValueSingle('{}', '');", + "NavigationHandler.OrbitalNavigator.Anchor", std::string([title UTF8String]), + "NavigationHandler.OrbitalNavigator.Aim", + "NavigationHandler.OrbitalNavigator.RetargetAnchor" + ); global::scriptEngine.queueScript( - "openspace.setPropertyValue('NavigationHandler.Origin', '" + - std::string([title UTF8String]) + "');", + str, scripting::ScriptEngine::RemoteScripting::Yes ); } - - (void)fullGuiButtonAction:(id)sender { + - (void)hideTextAction:(id)sender { // Remove unused variable warning (void)sender; + global::scriptEngine.queueScript( - "local b = openspace.getPropertyValue(\ - 'Modules.ImGUI.Main.Enabled'\ - );\ - openspace.setPropertyValueSingle(\ - 'Modules.ImGUI.Main.Enabled',\ - not b\ - );\ - openspace.setPropertyValueSingle(\ - 'Modules.ImGUI.Main.IsHidden',\ - b\ - );", + "local isEnabled = openspace.getPropertyValue('Dashboard.IsEnabled');\ + openspace.setPropertyValueSingle('Dashboard.IsEnabled', not isEnabled);\ + openspace.setPropertyValueSingle('RenderEngine.ShowLog', not isEnabled);\ + openspace.setPropertyValueSingle('RenderEngine.ShowVersion', not isEnabled);\ + openspace.setPropertyValueSingle('RenderEngine.ShowCamera', not isEnabled)", scripting::ScriptEngine::RemoteScripting::No ); } - - (void)simpleGuiButtonAction:(id)sender { + - (void)hideGuiAction:(id)sender { // Remove unused variable warning (void)sender; global::scriptEngine.queueScript( -"local b = openspace.getPropertyValue('Modules.ImGUI.Main.FeaturedProperties.Enabled');\n\ -local c = openspace.getPropertyValue('Modules.ImGUI.Main.IsHidden');\n\ -openspace.setPropertyValue('Modules.ImGUI.*.Enabled', false);\n\ -if b and c then\n\ - -- This can happen if the main properties window is enabled, the main gui\n\ - -- is enabled and then closed again. So the main properties window is\n\ - -- enabled, but also all windows are hidden\n\ - openspace.setPropertyValueSingle('Modules.ImGUI.Main.IsHidden', false);\n\ - openspace.setPropertyValueSingle(\n\ - 'Modules.ImGUI.Main.FeaturedProperties.Enabled',\n\ - true\n\ - );\n\ - openspace.setPropertyValueSingle(\n\ - 'Modules.ImGUI.Main.SpaceTime.Enabled',\n\ - true\n\ - );\n\ -else\n\ - openspace.setPropertyValueSingle(\n\ - 'Modules.ImGUI.Main.FeaturedProperties.Enabled',\n\ - not b\n\ - );\n\ - openspace.setPropertyValueSingle(\n\ - 'Modules.ImGUI.Main.SpaceTime.Enabled',\n\ - not b\n\ - );\n\ - openspace.setPropertyValueSingle('Modules.ImGUI.Main.IsHidden', b);\n\ -end", + "local isEnabled = openspace.getPropertyValue('Modules.CefWebGui.Visible');\ + openspace.setPropertyValueSingle('Modules.CefWebGui.Visible', not isEnabled);", scripting::ScriptEngine::RemoteScripting::No ); } @@ -266,19 +242,18 @@ void showTouchbar() { [NSApplication sharedApplication].automaticCustomizeTouchBarMenuItemEnabled = YES; } - std::vector nodes = - global::renderEngine.scene()->allSceneGraphNodes(); + std::vector ns = global::renderEngine.scene()->allSceneGraphNodes(); std::sort( - nodes.begin(), - nodes.end(), + ns.begin(), + ns.end(), [](SceneGraphNode* lhs, SceneGraphNode* rhs) { return lhs->guiName() < rhs->guiName(); } ); NSMutableArray* ids = [[NSMutableArray alloc] init]; - for (SceneGraphNode* n : nodes) { + for (SceneGraphNode* n : ns) { const std::vector& tags = n->tags(); auto it = std::find(tags.begin(), tags.end(), "GUI.Interesting"); if (it != tags.end()) { diff --git a/src/network/parallelpeer.cpp b/src/network/parallelpeer.cpp index cef58ee498..684680b279 100644 --- a/src/network/parallelpeer.cpp +++ b/src/network/parallelpeer.cpp @@ -325,7 +325,7 @@ void ParallelPeer::dataMessageReceived(const std::vector& message) TimeKeyframeData timeKeyframeData; timeKeyframeData.delta = kfMessage._dt; timeKeyframeData.pause = kfMessage._paused; - timeKeyframeData.time = kfMessage._time; + timeKeyframeData.time = Time(kfMessage._time); timeKeyframeData.jump = kfMessage._requiresTimeJump; const double kfTimestamp = convertTimestamp(kfMessage._timestamp); diff --git a/src/openspace.cpp b/src/openspace.cpp index 439608d025..343b49c480 100644 --- a/src/openspace.cpp +++ b/src/openspace.cpp @@ -29,7 +29,7 @@ namespace openspace { std::string licenseText() { return "OpenSpace\n\ \n\ -Copyright (c) 2014-2018\n\ +Copyright (c) 2014-2019\n\ \n\ Permission is hereby granted, free of charge, to any person obtaining a copy of this\n\ software and associated documentation files (the \"Software\"), to deal in the Software\n\ diff --git a/src/performance/performancemanager.cpp b/src/performance/performancemanager.cpp index e4075bf055..6694af0fca 100644 --- a/src/performance/performancemanager.cpp +++ b/src/performance/performancemanager.cpp @@ -62,7 +62,6 @@ namespace openspace::performance { // The ghoul::SharedData block addressed by OpenSpacePerformanceMeasurementSharedData // will only get allocated once and contains the total number of allocated shared memory // blocks alongside a list of names of these blocks -// void PerformanceManager::CreateGlobalSharedMemory() { static_assert( @@ -70,6 +69,8 @@ void PerformanceManager::CreateGlobalSharedMemory() { "The global memory struct does not fit the allocated global memory space" ); + ghoul::SharedMemory::remove(GlobalSharedMemoryName); + if (ghoul::SharedMemory::exists(GlobalSharedMemoryName)) { ghoul::SharedMemory sharedMemory(GlobalSharedMemoryName); sharedMemory.acquireLock(); diff --git a/src/rendering/dashboard_lua.inl b/src/rendering/dashboard_lua.inl index a6544c6af6..3157fa3d01 100644 --- a/src/rendering/dashboard_lua.inl +++ b/src/rendering/dashboard_lua.inl @@ -48,7 +48,13 @@ int addDashboardItem(lua_State* L) { } lua_settop(L, 0); - global::dashboard.addDashboardItem(DashboardItem::createFromDictionary(d)); + try { + global::dashboard.addDashboardItem(DashboardItem::createFromDictionary(d)); + } + catch (const ghoul::RuntimeError& e) { + LERRORC("addDashboardItem", e.what()); + return ghoul::lua::luaError(L, "Error adding dashboard item"); + } ghoul_assert(lua_gettop(L) == 0, "Incorrect number of items left on stack"); return 0; diff --git a/src/rendering/renderengine.cpp b/src/rendering/renderengine.cpp index 1ab0cf6be0..84908f38e7 100644 --- a/src/rendering/renderengine.cpp +++ b/src/rendering/renderengine.cpp @@ -144,11 +144,20 @@ namespace { }; constexpr openspace::properties::Property::PropertyInfo ShowFrameNumberInfo = { - "ShowFrameNumber", - "Show Frame Number", - "If this value is enabled, the current frame number is rendered into the window." + "ShowFrameInformation", + "Show Frame Information", + "If this value is enabled, the current frame number and frame times are rendered " + "into the window." }; +#ifdef OPENSPACE_WITH_INSTRUMENTATION + constexpr openspace::properties::Property::PropertyInfo SaveFrameInfo = { + "SaveFrameInformation", + "Save Frame Information", + "Saves the frame information to disk" + }; +#endif // OPENSPACE_WITH_INSTRUMENTATION + constexpr openspace::properties::Property::PropertyInfo DisableMasterInfo = { "DisableMasterRendering", "Disable Master Rendering", @@ -287,10 +296,14 @@ RenderEngine::RenderEngine() , _showCameraInfo(ShowCameraInfo, true) , _takeScreenshot(TakeScreenshotInfo) , _applyWarping(ApplyWarpingInfo, false) - , _showFrameNumber(ShowFrameNumberInfo, false) + , _showFrameInformation(ShowFrameNumberInfo, false) +#ifdef OPENSPACE_WITH_INSTRUMENTATION + , _saveFrameInformation(SaveFrameInfo, false) +#endif // OPENSPACE_WITH_INSTRUMENTATION , _disableMasterRendering(DisableMasterInfo, false) , _globalBlackOutFactor(GlobalBlackoutFactorInfo, 1.f, 0.f, 1.f) , _nAaSamples(AaSamplesInfo, 4, 1, 8) +<<<<<<< HEAD , _tmoOwner(TMOInfo) , _hdrExposure(HDRExposureInfo, 1.68f, 0.01f, 10.0f) , _maxWhite(MaxWhiteInfo, 4.f, 0.001f, 100.0f) @@ -302,6 +315,11 @@ RenderEngine::RenderEngine() , _value(ValueInfo, 1.f, 0.0f, 5.0f) , _lightness(LightnessInfo, 1.1f, 0.0f, 5.0f) , _colorSpace(ColorSpaceInfo, properties::OptionProperty::DisplayType::Dropdown) +======= + , _hdrExposure(HDRExposureInfo, 0.4f, 0.01f, 10.0f) + , _hdrBackground(BackgroundExposureInfo, 2.8f, 0.01f, 10.0f) + , _gamma(GammaInfo, 2.2f, 0.01f, 10.0f) +>>>>>>> master , _horizFieldOfView(HorizFieldOfViewInfo, 80.f, 1.f, 179.0f) , _globalRotation( GlobalRotationInfo, @@ -320,7 +338,11 @@ RenderEngine::RenderEngine() glm::vec3(0.f), glm::vec3(-glm::pi()), glm::vec3(glm::pi()) +<<<<<<< HEAD ) +======= + ) +>>>>>>> master { _doPerformanceMeasurements.onChange([this](){ global::performanceManager.setEnabled(_doPerformanceMeasurements); @@ -440,7 +462,15 @@ RenderEngine::RenderEngine() _takeScreenshot.onChange([this](){ _shouldTakeScreenshot = true; }); addProperty(_takeScreenshot); - addProperty(_showFrameNumber); + addProperty(_showFrameInformation); +#ifdef OPENSPACE_WITH_INSTRUMENTATION + _saveFrameInformation.onChange([&]() { + if (_saveFrameInformation) { + _frameInfo.lastSavedFrame = frameNumber(); + } + }); + addProperty(_saveFrameInformation); +#endif // OPENSPACE_WITH_INSTRUMENTATION addProperty(_globalRotation); addProperty(_screenSpaceRotation); @@ -538,12 +568,12 @@ void RenderEngine::initializeGL() { // development global::windowDelegate.setNearFarClippingPlane(0.001f, 1000.f); - //Set horizontal FOV value with whatever the field of view (in degrees) is of the + // Set horizontal FOV value with whatever the field of view (in degrees) is of the // initialized window _horizFieldOfView = static_cast(global::windowDelegate.getHorizFieldOfView()); - constexpr const float FontSizeBig = 50.f; - _fontBig = global::fontManager.font(KeyFontMono, FontSizeBig); + constexpr const float FontSizeFrameinfo = 32.f; + _fontFrameInfo = global::fontManager.font(KeyFontMono, FontSizeFrameinfo); constexpr const float FontSizeTime = 15.f; _fontDate = global::fontManager.font(KeyFontMono, FontSizeTime); constexpr const float FontSizeMono = 10.f; @@ -705,13 +735,18 @@ void RenderEngine::render(const glm::mat4& sceneMatrix, const glm::mat4& viewMat ); } - if (_showFrameNumber) { + if (_showFrameInformation) { glm::vec2 penPosition = glm::vec2( fontResolution().x / 2 - 50, fontResolution().y / 3 ); - RenderFont(*_fontBig, penPosition, std::to_string(_frameNumber)); + std::string fn = std::to_string(_frameNumber); + std::string dt = std::to_string(global::windowDelegate.deltaTime()); + std::string avgDt = std::to_string(global::windowDelegate.averageDeltaTime()); + + std::string res = "Frame: " + fn + '\n' + "Dt: " + dt + '\n' + "Avg Dt: " + avgDt; + RenderFont(*_fontFrameInfo, penPosition, res); } ++_frameNumber; @@ -917,6 +952,35 @@ void RenderEngine::postDraw() { scene()->allSceneGraphNodes() ); } + +#ifdef OPENSPACE_WITH_INSTRUMENTATION + if (_saveFrameInformation) { + _frameInfo.frames.push_back({ + frameNumber(), + global::windowDelegate.deltaTime(), + global::windowDelegate.averageDeltaTime() + }); + } + + const uint16_t next = _frameInfo.lastSavedFrame + _frameInfo.saveEveryNthFrame; + const bool shouldSave = _saveFrameInformation && frameNumber() >= next; + if (shouldSave) { + std::string filename = fmt::format( + "_inst_renderengine_{}_{}.txt", + _frameInfo.lastSavedFrame, _frameInfo.saveEveryNthFrame + ); + std::ofstream file(absPath("${BIN}/" + filename)); + for (const FrameInfo& i : _frameInfo.frames) { + std::string line = fmt::format( + "{}\t{}\t{}", i.iFrame, i.deltaTime, i.avgDeltaTime + ); + file << line << '\n'; + } + + _frameInfo.frames.clear(); + _frameInfo.lastSavedFrame = frameNumber(); + } +#endif // OPENSPACE_WITH_INSTRUMENTATION } Scene* RenderEngine::scene() { diff --git a/src/rendering/screenspacerenderable.cpp b/src/rendering/screenspacerenderable.cpp index 98a2c4519f..d8aa117073 100644 --- a/src/rendering/screenspacerenderable.cpp +++ b/src/rendering/screenspacerenderable.cpp @@ -42,8 +42,8 @@ namespace { constexpr const char* KeyType = "Type"; constexpr const char* KeyTag = "Tag"; - constexpr const std::array UniformNames = { - "OcclusionDepth", "Alpha", "ModelTransform", "ViewProjectionMatrix", "texture1" + constexpr const std::array UniformNames = { + "Alpha", "ModelTransform", "ViewProjectionMatrix", "texture1" }; constexpr openspace::properties::Property::PropertyInfo EnabledInfo = { @@ -451,7 +451,6 @@ bool ScreenSpaceRenderable::initialize() { } bool ScreenSpaceRenderable::initializeGL() { - _originalViewportSize = global::windowDelegate.currentWindowResolution(); createShaders(); return isReady(); } @@ -523,15 +522,9 @@ glm::mat4 ScreenSpaceRenderable::scaleMatrix() { float textureRatio = static_cast(_objectSize.y) / static_cast(_objectSize.x); - float scalingRatioX = _originalViewportSize.x / resolution.x; - float scalingRatioY = _originalViewportSize.y / resolution.y; glm::mat4 scale = glm::scale( glm::mat4(1.f), - glm::vec3( - _scale * scalingRatioX, - _scale * scalingRatioY * textureRatio, - 1.f - ) + glm::vec3(_scale, _scale * textureRatio, 1.f) ); // Simulate orthographic projection by distance to plane. @@ -614,9 +607,8 @@ void ScreenSpaceRenderable::draw(glm::mat4 modelTransform) { unbindTexture(); } -void ScreenSpaceRenderable::bindTexture() {} - -void ScreenSpaceRenderable::unbindTexture() {} +void ScreenSpaceRenderable::unbindTexture() { +} } // namespace openspace diff --git a/src/scene/scenegraphnode.cpp b/src/scene/scenegraphnode.cpp index 8fce29ad62..914242cf9a 100644 --- a/src/scene/scenegraphnode.cpp +++ b/src/scene/scenegraphnode.cpp @@ -374,14 +374,14 @@ void SceneGraphNode::update(const UpdateData& data) { } UpdateData newUpdateData = data; - _worldRotationCached = calculateWorldRotation(); - _worldScaleCached = calculateWorldScale(); // Assumes _worldRotationCached and _worldScaleCached have been calculated for parent _worldPositionCached = calculateWorldPosition(); + _worldRotationCached = calculateWorldRotation(); + _worldScaleCached = calculateWorldScale(); - newUpdateData.modelTransform.translation = worldPosition(); - newUpdateData.modelTransform.rotation = worldRotationMatrix(); - newUpdateData.modelTransform.scale = worldScale(); + newUpdateData.modelTransform.translation = _worldPositionCached; + newUpdateData.modelTransform.rotation = _worldRotationCached; + newUpdateData.modelTransform.scale = _worldScaleCached; glm::dmat4 translation = glm::translate( glm::dmat4(1.0), @@ -655,7 +655,7 @@ bool SceneGraphNode::hasGuiHintHidden() const { glm::dvec3 SceneGraphNode::calculateWorldPosition() const { // recursive up the hierarchy if there are parents available if (_parent) { - const glm::dvec3 wp = _parent->calculateWorldPosition(); + const glm::dvec3 wp = _parent->worldPosition(); const glm::dmat3 wrot = _parent->worldRotationMatrix(); const double ws = _parent->worldScale(); const glm::dvec3 p = position(); @@ -684,7 +684,7 @@ bool SceneGraphNode::isTimeFrameActive(const Time& time) const { glm::dmat3 SceneGraphNode::calculateWorldRotation() const { // recursive up the hierarchy if there are parents available if (_parent) { - return _parent->calculateWorldRotation() * rotationMatrix(); + return _parent->worldRotationMatrix() * rotationMatrix(); } else { return rotationMatrix(); @@ -694,7 +694,7 @@ glm::dmat3 SceneGraphNode::calculateWorldRotation() const { double SceneGraphNode::calculateWorldScale() const { // recursive up the hierarchy if there are parents available if (_parent) { - return _parent->calculateWorldScale() * scale(); + return _parent->worldScale() * scale(); } else { return scale(); diff --git a/src/util/time_lua.inl b/src/util/time_lua.inl index 9a197065e8..ac0115367e 100644 --- a/src/util/time_lua.inl +++ b/src/util/time_lua.inl @@ -333,12 +333,12 @@ int time_setTime(lua_State* L) { if (nArguments == 1) { if (isNumber) { double value = lua_tonumber(L, 1); - global::timeManager.setTimeNextFrame(value); + global::timeManager.setTimeNextFrame(Time(value)); return 0; } if (isString) { const char* time = lua_tostring(L, 1); - global::timeManager.setTimeNextFrame(Time::convertTime(time)); + global::timeManager.setTimeNextFrame(Time(Time::convertTime(time))); return 0; } ghoul_assert(lua_gettop(L) == 0, "Incorrect number of items left on stack"); @@ -424,7 +424,7 @@ int time_interpolateTime(lua_State* L) { global::timeManager.interpolateTime(targetTime, duration); } else { - global::timeManager.setTimeNextFrame(targetTime); + global::timeManager.setTimeNextFrame(Time(targetTime)); } } return 0; @@ -486,7 +486,7 @@ int time_interpolateTimeRelative(lua_State* L) { } else { global::timeManager.setTimeNextFrame( - global::timeManager.time().j2000Seconds() + delta + Time(global::timeManager.time().j2000Seconds() + delta) ); } } diff --git a/src/util/timemanager.cpp b/src/util/timemanager.cpp index 4f31a86f23..d8e920d2a7 100644 --- a/src/util/timemanager.cpp +++ b/src/util/timemanager.cpp @@ -109,7 +109,7 @@ void TimeManager::interpolateTime(double targetTime, double durationSeconds) { const bool pause = isPaused(); const TimeKeyframeData current = { time(), deltaTime(), false, false }; - const TimeKeyframeData next = { targetTime, targetDeltaTime(), pause, false }; + const TimeKeyframeData next = { Time(targetTime), targetDeltaTime(), pause, false }; clearKeyframes(); addKeyframe(now, current); @@ -138,7 +138,7 @@ void TimeManager::preSynchronization(double dt) { if (newTime != _lastTime) { using K = const CallbackHandle; using V = TimeChangeCallback; - for (const std::pair& it : _timeChangeCallbacks) { + for (const std::pair& it : _timeChangeCallbacks) { it.second(); } } @@ -148,14 +148,14 @@ void TimeManager::preSynchronization(double dt) { { using K = const CallbackHandle; using V = TimeChangeCallback; - for (const std::pair& it : _deltaTimeChangeCallbacks) { + for (const std::pair& it : _deltaTimeChangeCallbacks) { it.second(); } } if (_timelineChanged) { using K = const CallbackHandle; using V = TimeChangeCallback; - for (const std::pair& it : _timelineChangeCallbacks) { + for (const std::pair& it : _timelineChangeCallbacks) { it.second(); } } @@ -193,12 +193,12 @@ TimeKeyframeData TimeManager::interpolate(double applicationTime) { } else if (hasPastKeyframes) { // Extrapolate based on last past keyframe const double deltaApplicationTime = applicationTime - lastPastKeyframe->timestamp; - Time predictedTime = { + Time predictedTime( lastPastKeyframe->data.time.j2000Seconds() + deltaApplicationTime * (lastPastKeyframe->data.pause ? 0.0 : lastPastKeyframe->data.delta) - }; - return TimeKeyframeData{ + ); + return TimeKeyframeData { predictedTime, lastPastKeyframe->data.delta, false, @@ -206,7 +206,7 @@ TimeKeyframeData TimeManager::interpolate(double applicationTime) { }; } // As the last option, fall back on the current time. - return TimeKeyframeData{ _currentTime, _targetDeltaTime, _timePaused, false }; + return TimeKeyframeData { _currentTime, _targetDeltaTime, _timePaused, false }; } void TimeManager::progressTime(double dt) { @@ -230,7 +230,7 @@ void TimeManager::progressTime(double dt) { using K = const CallbackHandle; using V = TimeChangeCallback; - for (const std::pair& it : _timeJumpCallbacks) { + for (const std::pair& it : _timeJumpCallbacks) { it.second(); } return; @@ -316,7 +316,7 @@ TimeKeyframeData TimeManager::interpolate(const Keyframe& past deltaAppTime; TimeKeyframeData data { - interpolatedTime, + Time(interpolatedTime), interpolatedDeltaTime, past.data.pause, past.data.jump @@ -532,9 +532,9 @@ void TimeManager::interpolateDeltaTime(double newDeltaTime, double interpolation } const double now = global::windowDelegate.applicationTime(); - - Time newTime = time().j2000Seconds() + - (_deltaTime + newDeltaTime) * 0.5 * interpolationDuration; + Time newTime( + time().j2000Seconds() + (_deltaTime + newDeltaTime) * 0.5 * interpolationDuration + ); TimeKeyframeData currentKeyframe = { time(), _deltaTime, false, false }; TimeKeyframeData futureKeyframe = { newTime, newDeltaTime, false, false }; @@ -556,8 +556,9 @@ void TimeManager::interpolatePause(bool pause, double interpolationDuration) { const double now = global::windowDelegate.applicationTime(); double targetDelta = pause ? 0.0 : _targetDeltaTime; - Time newTime = time().j2000Seconds() + - (_deltaTime + targetDelta) * 0.5 * interpolationDuration; + Time newTime( + time().j2000Seconds() + (_deltaTime + targetDelta) * 0.5 * interpolationDuration + ); TimeKeyframeData currentKeyframe = { time(), _deltaTime, false, false }; TimeKeyframeData futureKeyframe = { newTime, _targetDeltaTime, pause, false }; From 67ba8a14dcd9a08a8294eea35c10555f7297fe25 Mon Sep 17 00:00:00 2001 From: Jonathas Costa Date: Mon, 22 Jul 2019 17:52:30 -0400 Subject: [PATCH 25/39] Fixed problems after merging master into this branch. --- include/openspace/rendering/renderengine.h | 23 ++++++++++++++----- .../base/rendering/renderabletrailorbit.cpp | 14 +++++------ src/rendering/renderengine.cpp | 10 -------- 3 files changed, 24 insertions(+), 23 deletions(-) diff --git a/include/openspace/rendering/renderengine.h b/include/openspace/rendering/renderengine.h index c9617a9c4b..09dc55e09b 100644 --- a/include/openspace/rendering/renderengine.h +++ b/include/openspace/rendering/renderengine.h @@ -77,10 +77,7 @@ public: FILMIC, //6 UNCHARTED, //7 COSTA, //8 - ADAPTIVE, //8 - GLOBAL, //9 - PHOTOGRAPHIC_REINHARD, //10 - MIPMAPPING //11 + PHOTOGRAPHIC_REINHARD, //9 }; enum class COLORSPACE { @@ -212,7 +209,21 @@ private: properties::TriggerProperty _takeScreenshot; bool _shouldTakeScreenshot = false; properties::BoolProperty _applyWarping; - properties::BoolProperty _showFrameNumber; + properties::BoolProperty _showFrameInformation; +#ifdef OPENSPACE_WITH_INSTRUMENTATION + struct FrameInfo { + uint64_t iFrame; + double deltaTime; + double avgDeltaTime; + }; + + struct { + std::vector frames; + uint64_t lastSavedFrame = 0; + uint16_t saveEveryNthFrame = 2048; + } _frameInfo; + properties::BoolProperty _saveFrameInformation; +#endif // OPENSPACE_WITH_INSTRUMENTATION properties::BoolProperty _disableMasterRendering; properties::FloatProperty _globalBlackOutFactor; @@ -243,7 +254,7 @@ private: std::vector _programs; - std::shared_ptr _fontBig; + std::shared_ptr _fontFrameInfo; std::shared_ptr _fontInfo; std::shared_ptr _fontDate; std::shared_ptr _fontLog; diff --git a/modules/base/rendering/renderabletrailorbit.cpp b/modules/base/rendering/renderabletrailorbit.cpp index b4ad1da19e..7106006d6c 100644 --- a/modules/base/rendering/renderabletrailorbit.cpp +++ b/modules/base/rendering/renderabletrailorbit.cpp @@ -233,8 +233,8 @@ void RenderableTrailOrbit::update(const UpdateData& data) { // Write the current location into the floating position const glm::vec3 p = _translation->position({ {}, - data.time.j2000Seconds(), - 0.0, + data.time.now(), + Time(0.0), false }); _vertexArray[_primaryRenderInformation.first] = { p.x, p.y, p.z }; @@ -412,8 +412,8 @@ RenderableTrailOrbit::UpdateReport RenderableTrailOrbit::updateTrails( // location const glm::vec3 p = _translation->position({ {}, - _lastPointTime, - 0.0, + Time(_lastPointTime), + Time(0.0), false }); _vertexArray[_primaryRenderInformation.first] = { p.x, p.y, p.z }; @@ -452,8 +452,8 @@ RenderableTrailOrbit::UpdateReport RenderableTrailOrbit::updateTrails( // location const glm::vec3 p = _translation->position({ {}, - _firstPointTime, - 0.0, + Time(_firstPointTime), + Time(0.0), false }); _vertexArray[_primaryRenderInformation.first] = { p.x, p.y, p.z }; @@ -496,7 +496,7 @@ void RenderableTrailOrbit::fullSweep(double time) { const double secondsPerPoint = _period / (_resolution - 1); // starting at 1 because the first position is a floating current one for (int i = 1; i < _resolution; ++i) { - const glm::vec3 p = _translation->position({ {}, time, 0.0, false }); + const glm::vec3 p = _translation->position({ {}, Time(time), Time(0.0), false }); _vertexArray[i] = { p.x, p.y, p.z }; time -= secondsPerPoint; diff --git a/src/rendering/renderengine.cpp b/src/rendering/renderengine.cpp index 84908f38e7..d150e0b8fc 100644 --- a/src/rendering/renderengine.cpp +++ b/src/rendering/renderengine.cpp @@ -303,7 +303,6 @@ RenderEngine::RenderEngine() , _disableMasterRendering(DisableMasterInfo, false) , _globalBlackOutFactor(GlobalBlackoutFactorInfo, 1.f, 0.f, 1.f) , _nAaSamples(AaSamplesInfo, 4, 1, 8) -<<<<<<< HEAD , _tmoOwner(TMOInfo) , _hdrExposure(HDRExposureInfo, 1.68f, 0.01f, 10.0f) , _maxWhite(MaxWhiteInfo, 4.f, 0.001f, 100.0f) @@ -315,11 +314,6 @@ RenderEngine::RenderEngine() , _value(ValueInfo, 1.f, 0.0f, 5.0f) , _lightness(LightnessInfo, 1.1f, 0.0f, 5.0f) , _colorSpace(ColorSpaceInfo, properties::OptionProperty::DisplayType::Dropdown) -======= - , _hdrExposure(HDRExposureInfo, 0.4f, 0.01f, 10.0f) - , _hdrBackground(BackgroundExposureInfo, 2.8f, 0.01f, 10.0f) - , _gamma(GammaInfo, 2.2f, 0.01f, 10.0f) ->>>>>>> master , _horizFieldOfView(HorizFieldOfViewInfo, 80.f, 1.f, 179.0f) , _globalRotation( GlobalRotationInfo, @@ -338,11 +332,7 @@ RenderEngine::RenderEngine() glm::vec3(0.f), glm::vec3(-glm::pi()), glm::vec3(glm::pi()) -<<<<<<< HEAD ) -======= - ) ->>>>>>> master { _doPerformanceMeasurements.onChange([this](){ global::performanceManager.setEnabled(_doPerformanceMeasurements); From 4360246863e5511b62a977d7b13bebd25ce50761 Mon Sep 17 00:00:00 2001 From: Jonathas Costa Date: Tue, 23 Jul 2019 15:37:42 -0400 Subject: [PATCH 26/39] Fixed small issues. --- data/assets/default.scene | 10 ++-------- .../scene/solarsystem/planets/earth/atmosphere.asset | 1 + modules/atmosphere/rendering/renderableatmosphere.cpp | 6 ++++++ 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/data/assets/default.scene b/data/assets/default.scene index e1cdab4343..4fe83c270c 100644 --- a/data/assets/default.scene +++ b/data/assets/default.scene @@ -6,16 +6,10 @@ asset.onInitialize(function () -- Jump back one day to show a complete planet openspace.time.setTime(openspace.time.advancedTime(now, "-1d")) + openspace.globebrowsing.goToGeo("Earth", 58.5877, 16.1924, 20000000) + openspace.markInterestingNodes({ "Earth", "Mars", "Moon", "Sun" }) - openspace.navigation.setCameraState({ - Anchor = earthAsset.Earth.Identifier, - Position = { 0, 0, 0 }, - Rotation = { 0.758797, 0.221490, -0.605693, -0.091135 }, - }) - - openspace.globebrowsing.goToGeo(58.5877, 16.1924, 20000000) - -- HDR / Image options: openspace.setPropertyValueSingle('RenderEngine.Gamma', 0.95); openspace.setPropertyValueSingle('RenderEngine.HDRExposure', 3.7); diff --git a/data/assets/scene/solarsystem/planets/earth/atmosphere.asset b/data/assets/scene/solarsystem/planets/earth/atmosphere.asset index 641e3a0759..7b3197b84f 100644 --- a/data/assets/scene/solarsystem/planets/earth/atmosphere.asset +++ b/data/assets/scene/solarsystem/planets/earth/atmosphere.asset @@ -16,6 +16,7 @@ local Atmosphere = { PlanetRadius = 6377.0, PlanetAverageGroundReflectance = 0.1, GroundRadianceEmittion = 0.6, + SunIntensity = 6.9, Rayleigh = { Coefficients = { -- Wavelengths are given in 10^-9m diff --git a/modules/atmosphere/rendering/renderableatmosphere.cpp b/modules/atmosphere/rendering/renderableatmosphere.cpp index 47545042b8..d7e556384d 100644 --- a/modules/atmosphere/rendering/renderableatmosphere.cpp +++ b/modules/atmosphere/rendering/renderableatmosphere.cpp @@ -403,6 +403,12 @@ RenderableAtmosphere::RenderableAtmosphere(const ghoul::Dictionary& dictionary) "Atmosphere Effects. Disabling atmosphere effects for this planet." ); } + + if (atmosphereDictionary.hasKey(SunIntensityInfo.identifier)) { + _sunRadianceIntensity = atmosphereDictionary.value( + SunIntensityInfo.identifier + ); + } if (!atmosphereDictionary.getValue( GroundRadianceEmittioninfo.identifier, From 77bc2d4e6d1ad197792a73b17d2e5fed4d8fe48f Mon Sep 17 00:00:00 2001 From: Jonathas Costa Date: Wed, 24 Jul 2019 15:52:27 -0400 Subject: [PATCH 27/39] Improved Mars illumination. --- .../scene/solarsystem/planets/mars/atmosphere.asset | 2 ++ modules/atmosphere/rendering/renderableatmosphere.cpp | 11 ++++++++++- modules/atmosphere/rendering/renderableatmosphere.h | 1 + 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/data/assets/scene/solarsystem/planets/mars/atmosphere.asset b/data/assets/scene/solarsystem/planets/mars/atmosphere.asset index 2850e528ca..bffdc14094 100644 --- a/data/assets/scene/solarsystem/planets/mars/atmosphere.asset +++ b/data/assets/scene/solarsystem/planets/mars/atmosphere.asset @@ -16,6 +16,8 @@ local Atmosphere = { PlanetRadius = 3386.190, PlanetAverageGroundReflectance = 0.1, GroundRadianceEmittion = 0.37, + SunIntensity = 6.7, + MieScatteringExtinctionPropCoefficient = 0.23862, Rayleigh = { Coefficients = { -- Wavelengths are given in 10^-9m diff --git a/modules/atmosphere/rendering/renderableatmosphere.cpp b/modules/atmosphere/rendering/renderableatmosphere.cpp index d7e556384d..232a70b011 100644 --- a/modules/atmosphere/rendering/renderableatmosphere.cpp +++ b/modules/atmosphere/rendering/renderableatmosphere.cpp @@ -266,6 +266,7 @@ RenderableAtmosphere::RenderableAtmosphere(const ghoul::Dictionary& dictionary) , _mieHeightScale(0.f) , _miePhaseConstant(0.f) , _sunRadianceIntensity(5.f) + , _mieScattExtPropCoefProp(1.f) , _mieExtinctionCoeff(glm::vec3(0.f)) , _rayleighScatteringCoeff(glm::vec3(0.f)) , _ozoneExtinctionCoeff(glm::vec3(0.f)) @@ -409,6 +410,12 @@ RenderableAtmosphere::RenderableAtmosphere(const ghoul::Dictionary& dictionary) SunIntensityInfo.identifier ); } + + if (atmosphereDictionary.hasKey(MieScatteringExtinctionPropCoeffInfo.identifier)) { + _mieScattExtPropCoefProp = atmosphereDictionary.value( + MieScatteringExtinctionPropCoeffInfo.identifier + ); + } if (!atmosphereDictionary.getValue( GroundRadianceEmittioninfo.identifier, @@ -634,8 +641,10 @@ RenderableAtmosphere::RenderableAtmosphere(const ghoul::Dictionary& dictionary) _mieScatteringCoeffZP.onChange(updateAtmosphere); addProperty(_mieScatteringCoeffZP); - _mieScatteringExtinctionPropCoefficientP = + _mieScatteringExtinctionPropCoefficientP = + _mieScattExtPropCoefProp != 1.f ? _mieScattExtPropCoefProp : _mieScatteringCoeff.x / _mieExtinctionCoeff.x; + _mieScatteringExtinctionPropCoefficientP.onChange(updateAtmosphere); addProperty(_mieScatteringExtinctionPropCoefficientP); diff --git a/modules/atmosphere/rendering/renderableatmosphere.h b/modules/atmosphere/rendering/renderableatmosphere.h index d86f068ca7..202933b593 100644 --- a/modules/atmosphere/rendering/renderableatmosphere.h +++ b/modules/atmosphere/rendering/renderableatmosphere.h @@ -122,6 +122,7 @@ private: float _mieHeightScale; float _miePhaseConstant; float _sunRadianceIntensity; + float _mieScattExtPropCoefProp; glm::vec3 _mieExtinctionCoeff; glm::vec3 _rayleighScatteringCoeff; From 3a0b5f0c1545f0dfc6ba34c227a3b814941175ee Mon Sep 17 00:00:00 2001 From: Jonathas Costa Date: Thu, 1 Aug 2019 12:20:36 -0400 Subject: [PATCH 28/39] Changed rendering order back for orbits and other improvements. --- .../atmosphere/shaders/atmosphere_deferred_fs.glsl | 9 +-------- modules/base/rendering/renderabletrail.cpp | 2 +- modules/base/rendering/renderabletrailorbit.cpp | 2 +- modules/base/shaders/renderabletrail_fs.glsl | 6 ++++-- shaders/framebuffer/hdrAndFiltering.frag | 12 ++++++------ shaders/framebuffer/renderframebuffer.frag | 12 +++++++++--- 6 files changed, 22 insertions(+), 21 deletions(-) diff --git a/modules/atmosphere/shaders/atmosphere_deferred_fs.glsl b/modules/atmosphere/shaders/atmosphere_deferred_fs.glsl index 53da2d939d..cc55e3fb08 100644 --- a/modules/atmosphere/shaders/atmosphere_deferred_fs.glsl +++ b/modules/atmosphere/shaders/atmosphere_deferred_fs.glsl @@ -535,7 +535,7 @@ vec3 sunColor(const vec3 x, const float t, const vec3 v, const vec3 s, const flo float sunFinalColor = smoothstep(cos(M_PI / 500.0f), cos(M_PI / 900.0f), dot(v, s)) * sunRadiance * (1.0f - irradianceFactor); - return transmittance * sunFinalColor; + return transmittance * sunFinalColor; } void main() { @@ -559,14 +559,8 @@ void main() { } nSamples = complex ? nAaSamples / 2 : 1; - // Performance variables: - //float Rt2 = Rt * Rt; // in Km - //float Rg2 = Rg * Rg; // in Km - for (int i = 0; i < nSamples; i++) { // Color from G-Buffer - //vec4 color = texelFetch(mainColorTexture, fragCoords, i); - //vec4 color = vec4(-log2(vec3(1.0) - colorArray[i].rgb), colorArray[i].a); vec4 color = colorArray[i]; // Ray in object space dRay ray; @@ -701,7 +695,6 @@ void main() { bColor += texelFetch(mainColorTexture, fragCoords, f); } bColor /= float(nAaSamples); - //renderTarget = vec4(-log2(vec3(1.0) - bColor.rgb), bColor.a); renderTarget = bColor; } } diff --git a/modules/base/rendering/renderabletrail.cpp b/modules/base/rendering/renderabletrail.cpp index aa834b544e..25eac54d6e 100644 --- a/modules/base/rendering/renderabletrail.cpp +++ b/modules/base/rendering/renderabletrail.cpp @@ -179,7 +179,7 @@ RenderableTrail::RenderableTrail(const ghoul::Dictionary& dictionary) ) { - setRenderBin(RenderBin::Overlay); + setRenderBin(RenderBin::Transparent); addProperty(_opacity); //registerUpdateRenderBinFromOpacity(); diff --git a/modules/base/rendering/renderabletrailorbit.cpp b/modules/base/rendering/renderabletrailorbit.cpp index f92385d35f..631d555f08 100644 --- a/modules/base/rendering/renderabletrailorbit.cpp +++ b/modules/base/rendering/renderabletrailorbit.cpp @@ -192,7 +192,7 @@ RenderableTrailOrbit::RenderableTrailOrbit(const ghoul::Dictionary& dictionary) } } else { - setRenderBin(Renderable::RenderBin::Overlay); + setRenderBin(Renderable::RenderBin::Transparent); } } diff --git a/modules/base/shaders/renderabletrail_fs.glsl b/modules/base/shaders/renderabletrail_fs.glsl index 8ce42af488..6dc1eef809 100644 --- a/modules/base/shaders/renderabletrail_fs.glsl +++ b/modules/base/shaders/renderabletrail_fs.glsl @@ -60,9 +60,11 @@ Fragment getFragment() { } frag.color.a = transparencyCorrection; - } - + } + if (frag.color.a < 0.2f) + discard; + // G-Buffer // JCC: The depthCorrection here is a temporary tweak // to fix precision problems. diff --git a/shaders/framebuffer/hdrAndFiltering.frag b/shaders/framebuffer/hdrAndFiltering.frag index 8f5bbdf8c2..c1da56002c 100644 --- a/shaders/framebuffer/hdrAndFiltering.frag +++ b/shaders/framebuffer/hdrAndFiltering.frag @@ -84,16 +84,16 @@ void main() { if (colorSpace == HSL_COLOR) { vec3 hslColor = rgb2hsl(tColor); - hslColor.x *= Hue; - hslColor.y *= Saturation; - hslColor.z *= Lightness; + hslColor.x = (hslColor.x * Hue) > 360.f ? 360.f : (hslColor.x * Hue); + hslColor.y = (hslColor.y * Saturation) > 1.f ? 1.f : (hslColor.y * Saturation); + hslColor.z = (hslColor.z * Lightness) > 1.f ? 1.f : (hslColor.z * Lightness); finalColor = vec4(gammaCorrection(hsl2rgb(hslColor), gamma), color.a); } else if (colorSpace == HSV_COLOR) { vec3 hsvColor = rgb2hsv(tColor); - hsvColor.x *= Hue; - hsvColor.y *= Saturation; - hsvColor.z *= Value; + hsvColor.x = (hsvColor.x * Hue) > 360.f ? 360.f : (hsvColor.x * Hue); + hsvColor.y = (hsvColor.y * Saturation) > 1.f ? 1.f : (hsvColor.y * Saturation); + hsvColor.z = (hsvColor.z * Value) > 1.f ? 1.f : (hsvColor.z * Value); finalColor = vec4(gammaCorrection(hsv2rgb(hsvColor), gamma), color.a); } diff --git a/shaders/framebuffer/renderframebuffer.frag b/shaders/framebuffer/renderframebuffer.frag index 1799e695f7..ed9f8c4dca 100644 --- a/shaders/framebuffer/renderframebuffer.frag +++ b/shaders/framebuffer/renderframebuffer.frag @@ -26,7 +26,8 @@ #include <#{fragmentPath}> #define exposure #{rendererData.hdrExposure} -#define deltaError 0.013 +#define DeltaError 0.013f +#define MaxValueColorBuffer 1E10 layout(location = 0) out vec4 _out_color_; layout(location = 1) out vec4 gPosition; @@ -34,8 +35,13 @@ layout(location = 2) out vec4 gNormal; layout(location = 3) out vec4 filterBuffer; void main() { - Fragment f = getFragment(); - _out_color_ = vec4((log2(vec3(1.0) - (f.color.rgb - vec3(deltaError)))/(-exposure)), f.color.a); + Fragment f = getFragment(); + _out_color_ = vec4((log2(vec3(1.0) - (f.color.rgb - vec3(DeltaError)))/(-exposure)), f.color.a); + + _out_color_.x = isnan(_out_color_.x) ? MaxValueColorBuffer : _out_color_.x; + _out_color_.y = isnan(_out_color_.y) ? MaxValueColorBuffer : _out_color_.y; + _out_color_.z = isnan(_out_color_.z) ? MaxValueColorBuffer : _out_color_.z; + gPosition = f.gPosition; gNormal = f.gNormal; From 904811f60d3e8b900d24c7b074d7e79ed466f81d Mon Sep 17 00:00:00 2001 From: Emil Axelsson Date: Tue, 13 Aug 2019 11:28:33 +0200 Subject: [PATCH 29/39] Small cleanup --- include/openspace/rendering/renderer.h | 2 +- .../atmosphere/rendering/renderableatmosphere.cpp | 7 +++---- modules/base/rendering/renderabletrail.cpp | 1 - modules/base/shaders/renderabletrail_fs.glsl | 13 +------------ shaders/fragment.glsl | 1 - 5 files changed, 5 insertions(+), 19 deletions(-) diff --git a/include/openspace/rendering/renderer.h b/include/openspace/rendering/renderer.h index 92f2857428..b17e0f613b 100644 --- a/include/openspace/rendering/renderer.h +++ b/include/openspace/rendering/renderer.h @@ -41,7 +41,7 @@ class RenderableVolume; class Camera; class Scene; -class Renderer { +class Renderer { public: virtual ~Renderer() = default; diff --git a/modules/atmosphere/rendering/renderableatmosphere.cpp b/modules/atmosphere/rendering/renderableatmosphere.cpp index 232a70b011..fd931c251f 100644 --- a/modules/atmosphere/rendering/renderableatmosphere.cpp +++ b/modules/atmosphere/rendering/renderableatmosphere.cpp @@ -406,15 +406,14 @@ RenderableAtmosphere::RenderableAtmosphere(const ghoul::Dictionary& dictionary) } if (atmosphereDictionary.hasKey(SunIntensityInfo.identifier)) { - _sunRadianceIntensity = atmosphereDictionary.value( - SunIntensityInfo.identifier - ); + _sunRadianceIntensity = + atmosphereDictionary.value(SunIntensityInfo.identifier); } if (atmosphereDictionary.hasKey(MieScatteringExtinctionPropCoeffInfo.identifier)) { _mieScattExtPropCoefProp = atmosphereDictionary.value( MieScatteringExtinctionPropCoeffInfo.identifier - ); + ); } if (!atmosphereDictionary.getValue( diff --git a/modules/base/rendering/renderabletrail.cpp b/modules/base/rendering/renderabletrail.cpp index 25eac54d6e..0ef5160223 100644 --- a/modules/base/rendering/renderabletrail.cpp +++ b/modules/base/rendering/renderabletrail.cpp @@ -181,7 +181,6 @@ RenderableTrail::RenderableTrail(const ghoul::Dictionary& dictionary) setRenderBin(RenderBin::Transparent); addProperty(_opacity); - //registerUpdateRenderBinFromOpacity(); _translation = Translation::createFromDictionary( dictionary.value(KeyTranslation) diff --git a/modules/base/shaders/renderabletrail_fs.glsl b/modules/base/shaders/renderabletrail_fs.glsl index 6dc1eef809..4482761a7e 100644 --- a/modules/base/shaders/renderabletrail_fs.glsl +++ b/modules/base/shaders/renderabletrail_fs.glsl @@ -46,8 +46,6 @@ Fragment getFragment() { frag.depth = vs_positionScreenSpace.w; frag.blend = BLEND_MODE_ADDITIVE; - vec4 depthCorrection = vec4(0.0, 0.0, 100.0, 0.0); - if (renderPhase == RenderPhasePoints) { // Use the length of the vector (dot(circCoord, circCoord)) as factor in the // smoothstep to gradually decrease the alpha on the edges of the point @@ -62,19 +60,10 @@ Fragment getFragment() { frag.color.a = transparencyCorrection; } - if (frag.color.a < 0.2f) - discard; - - // G-Buffer - // JCC: The depthCorrection here is a temporary tweak - // to fix precision problems. - frag.gPosition = vs_gPosition + depthCorrection; + frag.gPosition = vs_gPosition; // There is no normal here frag.gNormal = vec4(0.0, 0.0, -1.0, 1.0); - // Bloom filter - frag.filterFlag = 1; - return frag; } diff --git a/shaders/fragment.glsl b/shaders/fragment.glsl index a4f4c9bf5a..6e5c67a9e0 100644 --- a/shaders/fragment.glsl +++ b/shaders/fragment.glsl @@ -32,7 +32,6 @@ struct Fragment { vec4 color; vec4 gPosition; vec4 gNormal; - uint filterFlag; float depth; uint blend; bool forceFboRendering; From 1cba7e1d88bb0c6c508ce39b0d46fdc59ce01030 Mon Sep 17 00:00:00 2001 From: Emil Axelsson Date: Tue, 13 Aug 2019 11:57:08 +0200 Subject: [PATCH 30/39] Render trails last --- modules/base/rendering/renderabletrail.cpp | 2 +- modules/base/rendering/renderabletrailorbit.cpp | 2 +- src/rendering/framebufferrenderer.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/base/rendering/renderabletrail.cpp b/modules/base/rendering/renderabletrail.cpp index 0ef5160223..ef15ccba28 100644 --- a/modules/base/rendering/renderabletrail.cpp +++ b/modules/base/rendering/renderabletrail.cpp @@ -179,7 +179,7 @@ RenderableTrail::RenderableTrail(const ghoul::Dictionary& dictionary) ) { - setRenderBin(RenderBin::Transparent); + setRenderBin(RenderBin::Overlay); addProperty(_opacity); _translation = Translation::createFromDictionary( diff --git a/modules/base/rendering/renderabletrailorbit.cpp b/modules/base/rendering/renderabletrailorbit.cpp index 631d555f08..f92385d35f 100644 --- a/modules/base/rendering/renderabletrailorbit.cpp +++ b/modules/base/rendering/renderabletrailorbit.cpp @@ -192,7 +192,7 @@ RenderableTrailOrbit::RenderableTrailOrbit(const ghoul::Dictionary& dictionary) } } else { - setRenderBin(Renderable::RenderBin::Transparent); + setRenderBin(Renderable::RenderBin::Overlay); } } diff --git a/src/rendering/framebufferrenderer.cpp b/src/rendering/framebufferrenderer.cpp index 780841a0f4..b4db62fc76 100644 --- a/src/rendering/framebufferrenderer.cpp +++ b/src/rendering/framebufferrenderer.cpp @@ -1135,7 +1135,7 @@ void FramebufferRenderer::render(Scene* scene, Camera* camera, float blackoutFac } glDrawBuffers(3, ColorAttachment012Array); - + glEnablei(GL_BLEND, 0); data.renderBinMask = static_cast(Renderable::RenderBin::Overlay); scene->render(data, tasks); From 188dffc63ce6c56e2adc7fd94b108b2f96fec62e Mon Sep 17 00:00:00 2001 From: Emil Axelsson Date: Tue, 13 Aug 2019 15:10:28 +0200 Subject: [PATCH 31/39] Fix rendering bugs: White displaying as black. Overlay bin rendering invisible if odd numbers of atmospheres are rendered. --- shaders/hdr.glsl | 6 +++--- src/rendering/framebufferrenderer.cpp | 3 ++- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/shaders/hdr.glsl b/shaders/hdr.glsl index 8f3f11f55d..b3cdb1e322 100644 --- a/shaders/hdr.glsl +++ b/shaders/hdr.glsl @@ -34,9 +34,9 @@ #define COSTA 8 #define PHOTOGRAPHIC_REINHARD 9 -const float HCV_EPSILON = 1e-10; -const float HSL_EPSILON = 1e-10; -const float HCY_EPSILON = 1e-10; +const float HCV_EPSILON = 1e-7; +const float HSL_EPSILON = 1e-7; +const float HCY_EPSILON = 1e-7; // White given by D65 const mat3 RGB2XYZ = mat3( diff --git a/src/rendering/framebufferrenderer.cpp b/src/rendering/framebufferrenderer.cpp index b4db62fc76..0637db5db2 100644 --- a/src/rendering/framebufferrenderer.cpp +++ b/src/rendering/framebufferrenderer.cpp @@ -1134,8 +1134,9 @@ void FramebufferRenderer::render(Scene* scene, Camera* camera, float blackoutFac performDeferredTasks(tasks.deferredcasterTasks); } - glDrawBuffers(3, ColorAttachment012Array); + glDrawBuffers(1, &ColorAttachment01Array[_pingPongIndex]); glEnablei(GL_BLEND, 0); + data.renderBinMask = static_cast(Renderable::RenderBin::Overlay); scene->render(data, tasks); From 17d43d4c9326c1febb52fa1b8a6c061ca7d87249 Mon Sep 17 00:00:00 2001 From: Jonathas Costa Date: Thu, 15 Aug 2019 14:23:14 -0400 Subject: [PATCH 32/39] Removed unsused TMOs. Removed unused sliders and adjusted to default position others. --- data/assets/default.scene | 4 +- .../solarsystem/missions/apollo/a15.asset | 203 -- .../missions/apollo/a15kernels.asset | 86 - .../solarsystem/missions/apollo/apollo8.asset | 234 -- .../apollo/apollo_11_lem_flipbook.asset | 39 - .../missions/apollo/apollo_csm.asset | 280 -- .../missions/apollo/apollo_lem.asset | 51 - .../solarsystem/missions/dawn/ceres.asset | 60 - .../solarsystem/missions/dawn/dawn.asset | 795 ----- .../missions/dawn/dawn_kernels.asset | 8 - .../solarsystem/missions/gaia/gaia.asset | 67 - .../solarsystem/missions/gaia/trail.asset | 64 - .../missions/gaia/transforms.asset | 27 - .../solarsystem/missions/insight/edl.asset | 981 ------ .../solarsystem/missions/juno/juno.asset | 202 -- .../messenger/mercurymagnetosphere.asset | 59 - .../missions/messenger/messengerSC.asset | 220 -- .../missions/messenger/openspace_mercury.ti | 33 - .../missions/messenger/transferfunction.txt | 8 - .../missions/newhorizons/charon.asset | 120 - .../missions/newhorizons/fov.asset | 386 --- .../missions/newhorizons/kernels.asset | 48 - .../missions/newhorizons/label.asset | 31 - .../missions/newhorizons/model.asset | 57 - .../missions/newhorizons/newhorizons.asset | 20 - .../missions/newhorizons/newhorizons.mission | 122 - .../missions/newhorizons/othermoons.asset | 126 - .../missions/newhorizons/pluto.asset | 251 -- .../missions/newhorizons/trail.asset | 36 - .../missions/newhorizons/transforms.asset | 54 - .../BaseballDiamond_PolyCam.txt | 2640 ----------------- ...urvey_EquatorialStations_Spectrometers.txt | 7 - .../OrbitalB_Site08_PolyCamImages.txt | 173 -- .../Recon_225m_Equatorial_PolyCam.txt | 110 - .../Recon_225m_Equatorial_spectrometers.txt | 1 - .../Recon_525m_Equatorial_spectrometers.txt | 1559 ---------- .../missions/osirisrex/bennu.asset | 115 - .../missions/osirisrex/model.asset | 345 --- .../missions/osirisrex/osirisrex.asset | 16 - .../missions/osirisrex/osirisrex.mission | 386 --- .../missions/osirisrex/script_schedule.asset | 18 - .../osirisrex/spice_kernel_times.mission | 95 - .../missions/osirisrex/trail.asset | 80 - .../missions/osirisrex/transforms.asset | 26 - .../missions/pioneer/pioneer10.asset | 75 - .../missions/pioneer/pioneer11.asset | 78 - .../solarsystem/missions/rosetta/67p.asset | 154 - .../missions/rosetta/rosetta.asset | 543 ---- .../missions/voyager/voyager1.asset | 239 -- .../missions/voyager/voyager2.asset | 338 --- .../openspace/rendering/framebufferrenderer.h | 27 +- include/openspace/rendering/renderengine.h | 31 +- include/openspace/rendering/renderer.h | 6 - .../shaders/atmosphere_deferred_fs.glsl | 8 - shaders/framebuffer/hdrAndFiltering.frag | 51 +- shaders/framebuffer/renderframebuffer.frag | 3 +- shaders/framebuffer/resolveframebuffer.vert | 8 - shaders/hdr.glsl | 92 +- src/rendering/framebufferrenderer.cpp | 362 +-- src/rendering/renderengine.cpp | 114 +- 60 files changed, 43 insertions(+), 12329 deletions(-) delete mode 100644 data/assets/scene/solarsystem/missions/apollo/a15.asset delete mode 100644 data/assets/scene/solarsystem/missions/apollo/a15kernels.asset delete mode 100644 data/assets/scene/solarsystem/missions/apollo/apollo8.asset delete mode 100644 data/assets/scene/solarsystem/missions/apollo/apollo_11_lem_flipbook.asset delete mode 100644 data/assets/scene/solarsystem/missions/apollo/apollo_csm.asset delete mode 100644 data/assets/scene/solarsystem/missions/apollo/apollo_lem.asset delete mode 100644 data/assets/scene/solarsystem/missions/dawn/ceres.asset delete mode 100644 data/assets/scene/solarsystem/missions/dawn/dawn.asset delete mode 100644 data/assets/scene/solarsystem/missions/dawn/dawn_kernels.asset delete mode 100644 data/assets/scene/solarsystem/missions/gaia/gaia.asset delete mode 100644 data/assets/scene/solarsystem/missions/gaia/trail.asset delete mode 100644 data/assets/scene/solarsystem/missions/gaia/transforms.asset delete mode 100644 data/assets/scene/solarsystem/missions/insight/edl.asset delete mode 100644 data/assets/scene/solarsystem/missions/juno/juno.asset delete mode 100644 data/assets/scene/solarsystem/missions/messenger/mercurymagnetosphere.asset delete mode 100644 data/assets/scene/solarsystem/missions/messenger/messengerSC.asset delete mode 100644 data/assets/scene/solarsystem/missions/messenger/openspace_mercury.ti delete mode 100644 data/assets/scene/solarsystem/missions/messenger/transferfunction.txt delete mode 100644 data/assets/scene/solarsystem/missions/newhorizons/charon.asset delete mode 100644 data/assets/scene/solarsystem/missions/newhorizons/fov.asset delete mode 100644 data/assets/scene/solarsystem/missions/newhorizons/kernels.asset delete mode 100644 data/assets/scene/solarsystem/missions/newhorizons/label.asset delete mode 100644 data/assets/scene/solarsystem/missions/newhorizons/model.asset delete mode 100644 data/assets/scene/solarsystem/missions/newhorizons/newhorizons.asset delete mode 100644 data/assets/scene/solarsystem/missions/newhorizons/newhorizons.mission delete mode 100644 data/assets/scene/solarsystem/missions/newhorizons/othermoons.asset delete mode 100644 data/assets/scene/solarsystem/missions/newhorizons/pluto.asset delete mode 100644 data/assets/scene/solarsystem/missions/newhorizons/trail.asset delete mode 100644 data/assets/scene/solarsystem/missions/newhorizons/transforms.asset delete mode 100644 data/assets/scene/solarsystem/missions/osirisrex/InstrumentTimes/BaseballDiamond_PolyCam.txt delete mode 100644 data/assets/scene/solarsystem/missions/osirisrex/InstrumentTimes/DetailedSurvey_EquatorialStations_Spectrometers.txt delete mode 100644 data/assets/scene/solarsystem/missions/osirisrex/InstrumentTimes/OrbitalB_Site08_PolyCamImages.txt delete mode 100644 data/assets/scene/solarsystem/missions/osirisrex/InstrumentTimes/Recon_225m_Equatorial_PolyCam.txt delete mode 100644 data/assets/scene/solarsystem/missions/osirisrex/InstrumentTimes/Recon_225m_Equatorial_spectrometers.txt delete mode 100644 data/assets/scene/solarsystem/missions/osirisrex/InstrumentTimes/Recon_525m_Equatorial_spectrometers.txt delete mode 100644 data/assets/scene/solarsystem/missions/osirisrex/bennu.asset delete mode 100644 data/assets/scene/solarsystem/missions/osirisrex/model.asset delete mode 100644 data/assets/scene/solarsystem/missions/osirisrex/osirisrex.asset delete mode 100644 data/assets/scene/solarsystem/missions/osirisrex/osirisrex.mission delete mode 100644 data/assets/scene/solarsystem/missions/osirisrex/script_schedule.asset delete mode 100644 data/assets/scene/solarsystem/missions/osirisrex/spice_kernel_times.mission delete mode 100644 data/assets/scene/solarsystem/missions/osirisrex/trail.asset delete mode 100644 data/assets/scene/solarsystem/missions/osirisrex/transforms.asset delete mode 100644 data/assets/scene/solarsystem/missions/pioneer/pioneer10.asset delete mode 100644 data/assets/scene/solarsystem/missions/pioneer/pioneer11.asset delete mode 100644 data/assets/scene/solarsystem/missions/rosetta/67p.asset delete mode 100644 data/assets/scene/solarsystem/missions/rosetta/rosetta.asset delete mode 100644 data/assets/scene/solarsystem/missions/voyager/voyager1.asset delete mode 100644 data/assets/scene/solarsystem/missions/voyager/voyager2.asset diff --git a/data/assets/default.scene b/data/assets/default.scene index 69acec94e3..46e59bf846 100644 --- a/data/assets/default.scene +++ b/data/assets/default.scene @@ -14,9 +14,7 @@ asset.onInitialize(function () -- HDR / Image options: openspace.setPropertyValueSingle('RenderEngine.Gamma', 0.95); openspace.setPropertyValueSingle('RenderEngine.HDRExposure', 3.7); - openspace.setPropertyValueSingle('RenderEngine.ToneMapOperator', 8); - openspace.setPropertyValueSingle('RenderEngine.Lightness', 1.1); - openspace.setPropertyValueSingle('RenderEngine.Saturation', 1.2); + openspace.setPropertyValueSingle('RenderEngine.Saturation', 1.0); end) asset.onDeinitialize(function () diff --git a/data/assets/scene/solarsystem/missions/apollo/a15.asset b/data/assets/scene/solarsystem/missions/apollo/a15.asset deleted file mode 100644 index 659edf4fd2..0000000000 --- a/data/assets/scene/solarsystem/missions/apollo/a15.asset +++ /dev/null @@ -1,203 +0,0 @@ -local assetHelper = asset.require('util/asset_helper') -local sunTransforms = asset.require('scene/solarsystem/sun/transforms') -asset.require('spice/base') - ---asset.require('scene/solarsystem/missions/apollo/a15kernels') - - -local models = asset.syncedResource({ - Name = "Apollo 15 Models", - Type = "HttpSynchronization", - Identifier = "apollo_models", - Version = 1 -}) - -local kernels = asset.syncedResource({ - Name = "Apollo Kernels", - Type = "HttpSynchronization", - Identifier = "apollo_spice", - Version = 1 -}) - -local Kernels = { - kernels .. "/apollo15.0001.tsc", - - -- kernels .. '/AS15-P_v01.bc', - kernels .. '/apollo15.0001.tf', - kernels .. '/apollo15MetricAddendum002.ti', - -- kernels .. '/apollo15PanoramicAddendum001.ti', - kernels .. '/apollo15_metric.0002.ti', - -- kernels .. '/apollo15_panoramic.0001.ti', - kernels .. '/apollo15-1.bsp', - kernels .. '/AS15-M_v01.bc', - -- kernels .. '/AS15-M_v01.bsp', -} - - - --- local Apollo15Kernels = { --- --sclk --- ApolloKernels .. "/apollo15.0001.tsc", - --- --pck --- ApolloKernels .. "/moon_080317.tf", --- ApolloKernels .. "/moon_assoc_me.tf", - --- --ik --- ApolloKernels .. "/apollo15_metric_v2.0001.ti", --- ApolloKernels .. "/apollo15_panoramic.0001.ti", - --- --tspk --- ApolloKernels .. "/de421.bsp", --- ApolloKernels .. "/moon_pa_de421_1900-2050.bpc", - --- --iak --- ApolloKernels .. "/apollo15MetricAddendum002.ti", --- ApolloKernels .. "/apolloPanAddendum001.ti", - --- --fk --- ApolloKernels .. "/apollo15_v2.0001.tf", --- ApolloKernels .. "/apollo15_v2.0002.tf", - --- --spk --- ApolloKernels .. "/AS15_M_REV23_SMITHED_V01.bsp", --- ApolloKernels .. "/AS15_M_REV4.bsp ", --- ApolloKernels .. "/AS15_M_REV70_SMITHED_V01.bsp", --- ApolloKernels .. "/AS15_M_REV04_v2.bsp ", --- ApolloKernels .. "/AS15_M_REV27_SMITHED_V01.bsp", --- ApolloKernels .. "/AS15_M_REV44_SMITHED_V01.bsp", --- ApolloKernels .. "/AS15_M_REV71_SMITHED_V01.bsp", --- ApolloKernels .. "/AS15_M_REV15_SMITHED_V01.bsp", --- ApolloKernels .. "/AS15_M_REV33_SMITHED_V01.bsp", --- ApolloKernels .. "/AS15_M_REV50_SMITHED_V01.bsp", --- ApolloKernels .. "/AS15_M_REV71_SMITHED_V02.bsp", --- ApolloKernels .. "/AS15_M_REV15_v2.bsp ", --- ApolloKernels .. "/AS15_M_REV34_SMITHED_V01.bsp", --- ApolloKernels .. "/AS15_M_REV60_SMITHED_V01.bsp", --- ApolloKernels .. "/AS15_M_REV72_v2.bsp", --- ApolloKernels .. "/AS15_M_REV16_SMITHED_V01.bsp", --- ApolloKernels .. "/AS15_M_REV35_SMITHED_V02.bsp", --- ApolloKernels .. "/AS15_M_REV62_SMITHED_V01.bsp", --- ApolloKernels .. "/AS15_M_REV22_SMITHED_V01.bsp", --- ApolloKernels .. "/AS15_M_REV38_SMITHED_V01.bsp", --- ApolloKernels .. "/AS15_M_REV63_SMITHED_V01.bsp", - --- --ck --- ApolloKernels .. "/AS15_M_REV04_SMITHED_V01.bc", --- ApolloKernels .. "/AS15_M_REV15_SMITHED_V01.bc", --- ApolloKernels .. "/AS15_M_REV16_SMITHED_V01.bc", --- ApolloKernels .. "/AS15_M_REV22_SMITHED_V01.bc", --- ApolloKernels .. "/AS15_M_REV23_SMITHED_V01.bc", --- ApolloKernels .. "/AS15_M_REV27_SMITHED_V01.bc", --- ApolloKernels .. "/AS15_M_REV33_SMITHED_V01.bc", --- ApolloKernels .. "/AS15_M_REV34_SMITHED_V01.bc", --- ApolloKernels .. "/AS15_M_REV35_SMITHED_V01.bc", --- ApolloKernels .. "/AS15_M_REV35_SMITHED_V02.bc", --- ApolloKernels .. "/AS15_M_REV38_SMITHED_V01.bc", --- ApolloKernels .. "/AS15_M_REV44_SMITHED_V01.bc", --- ApolloKernels .. "/AS15_M_REV50_SMITHED_V01.bc", --- ApolloKernels .. "/AS15_M_REV60_SMITHED_V01.bc", --- ApolloKernels .. "/AS15_M_REV62_SMITHED_V01.bc", --- ApolloKernels .. "/AS15_M_REV63_SMITHED_V01.bc", --- ApolloKernels .. "/AS15_M_REV70_SMITHED_V01.bc", --- ApolloKernels .. "/AS15_M_REV71_SMITHED_V01.bc", --- ApolloKernels .. "/AS15_M_REV71_SMITHED_V02.bc", --- ApolloKernels .. "/AS15_M_REV72_v2.bc", --- } - - - - -local LightSources = { - { - Type = "SceneGraphLightSource", - Identifier = "Sun", - Node = sunTransforms.SolarSystemBarycenter.Identifier, - Intensity = 1.0 - }, - -- { - -- Identifier = "Camera", - -- Type = "CameraLightSource", - -- Intensity = 0.5, - -- Enabled = false - -- } -} - - -local Apollo15 = { - Identifier = "Apollo15", - Parent = "Moon", - Transform = { - Translation = { - Type = "SpiceTranslation", - Target = "APOLLO 15", - Observer = "MOON", - Frame = "IAU_MOON", - Kernels = Kernels - }, - Rotation = { - Type = "SpiceRotation", - SourceFrame = "A15_METRIC", - DestinationFrame = "GALACTIC" - } - }, - TimeFrame = { -- Using Spice kernels for 1850-2150 - Type = "TimeFrameInterval", - Start = "1971-07-30T02:22:00.00", - End = "1971-08-01T18:05:00.00" - }, - GUI = { - Name = "Apollo 15", - Path = "/Solar System/Missions/Apollo 15" - } -} - -local Apollo15Main = { - Identifier = "Apollo15Main", - Parent = Apollo15.Identifier, - Renderable = { - Type = "RenderableModel", - Geometry = { - Type = "MultiModelGeometry", --- GeometryFile = models .. "/Apollo_Spacecraft.obj" - GeometryFile = models .. "/Apollo_CSM_shrunk_rotated_xy_doubble_size.obj" - }, - ColorTexture = models .. "/gray.png", - LightSources = LightSources, - DisableFaceCulling = true - }, - GUI = { - Name = "Apollo 15 Main", - Path = "/Solar System/Missions/Apollo 15" - } -} - -local Apollo15Trail = { - Identifier = "Apollo15Trail", - Parent = "Moon", - Renderable = { - Type = "RenderableTrailTrajectory", - Translation = { - Type = "SpiceTranslation", - Target = "APOLLO 15", - Observer = "MOON", - Frame = "IAU_MOON", - Kernels = Kernels - }, - Color = { 0.70, 0.50, 0.20 }, - StartTime = "1971 JUL 26", - EndTime = "1971 AUG 01 14:30:41.680", - SampleInterval = 2 - }, - GUI = { - Name = "Apollo 15 Trail", - Path = "/Solar System/Missions/Apollo 15" - } -} - -assetHelper.registerSceneGraphNodesAndExport(asset, { - Apollo15, - Apollo15Main, - Apollo15Trail -}) - diff --git a/data/assets/scene/solarsystem/missions/apollo/a15kernels.asset b/data/assets/scene/solarsystem/missions/apollo/a15kernels.asset deleted file mode 100644 index eca91e2614..0000000000 --- a/data/assets/scene/solarsystem/missions/apollo/a15kernels.asset +++ /dev/null @@ -1,86 +0,0 @@ -local ApolloKernels = asset.syncedResource({ - Name = "Apollo Kernels", - Type = "HttpSynchronization", - Identifier = "apollo_spice", - Version = 1 -}) - -local Apollo15Kernels = { - - - - --sclk - ApolloKernels .. "apollo15.0001.tsc", - - --pck - ApolloKernels .. "moon_080317.tf", - ApolloKernels .. "moon_assoc_me.tf", - - --ik - ApolloKernels .. "apollo15_metric_v2.0001.ti", - ApolloKernels .. "apollo15_panoramic.0001.ti", - - --tspk - ApolloKernels .. "de421.bsp", - ApolloKernels .. "moon_pa_de421_1900-2050.bpc", - - --iak - ApolloKernels .. "apollo15MetricAddendum002.ti", - ApolloKernels .. "apolloPanAddendum001.ti", - - --fk - ApolloKernels .. "apollo15_v2.0001.tf", - ApolloKernels .. "apollo15_v2.0002.tf", - - --spk - ApolloKernels .. "AS15_M_REV23_SMITHED_V01.bsp", - ApolloKernels .. "AS15_M_REV4.bsp ", - ApolloKernels .. "AS15_M_REV70_SMITHED_V01.bsp", - ApolloKernels .. "AS15_M_REV04_v2.bsp ", - ApolloKernels .. "AS15_M_REV27_SMITHED_V01.bsp", - ApolloKernels .. "AS15_M_REV44_SMITHED_V01.bsp", - ApolloKernels .. "AS15_M_REV71_SMITHED_V01.bsp", - ApolloKernels .. "AS15_M_REV15_SMITHED_V01.bsp", - ApolloKernels .. "AS15_M_REV33_SMITHED_V01.bsp", - ApolloKernels .. "AS15_M_REV50_SMITHED_V01.bsp", - ApolloKernels .. "AS15_M_REV71_SMITHED_V02.bsp", - ApolloKernels .. "AS15_M_REV15_v2.bsp ", - ApolloKernels .. "AS15_M_REV34_SMITHED_V01.bsp", - ApolloKernels .. "AS15_M_REV60_SMITHED_V01.bsp", - ApolloKernels .. "AS15_M_REV72_v2.bsp", - ApolloKernels .. "AS15_M_REV16_SMITHED_V01.bsp", - ApolloKernels .. "AS15_M_REV35_SMITHED_V02.bsp", - ApolloKernels .. "AS15_M_REV62_SMITHED_V01.bsp", - ApolloKernels .. "AS15_M_REV22_SMITHED_V01.bsp", - ApolloKernels .. "AS15_M_REV38_SMITHED_V01.bsp", - ApolloKernels .. "AS15_M_REV63_SMITHED_V01.bsp", - - --ck - ApolloKernels .. "AS15_M_REV04_SMITHED_V01.bc", - ApolloKernels .. "AS15_M_REV15_SMITHED_V01.bc", - ApolloKernels .. "AS15_M_REV16_SMITHED_V01.bc", - ApolloKernels .. "AS15_M_REV22_SMITHED_V01.bc", - ApolloKernels .. "AS15_M_REV23_SMITHED_V01.bc", - ApolloKernels .. "AS15_M_REV27_SMITHED_V01.bc", - ApolloKernels .. "AS15_M_REV33_SMITHED_V01.bc", - ApolloKernels .. "AS15_M_REV34_SMITHED_V01.bc", - ApolloKernels .. "AS15_M_REV35_SMITHED_V01.bc", - ApolloKernels .. "AS15_M_REV35_SMITHED_V02.bc", - ApolloKernels .. "AS15_M_REV38_SMITHED_V01.bc", - ApolloKernels .. "AS15_M_REV44_SMITHED_V01.bc", - ApolloKernels .. "AS15_M_REV50_SMITHED_V01.bc", - ApolloKernels .. "AS15_M_REV60_SMITHED_V01.bc", - ApolloKernels .. "AS15_M_REV62_SMITHED_V01.bc", - ApolloKernels .. "AS15_M_REV63_SMITHED_V01.bc", - ApolloKernels .. "AS15_M_REV70_SMITHED_V01.bc", - ApolloKernels .. "AS15_M_REV71_SMITHED_V01.bc", - ApolloKernels .. "AS15_M_REV71_SMITHED_V02.bc", - ApolloKernels .. "AS15_M_REV72_v2.bc", - - -} - - - ---asset.export("ApolloKernels", Kernels) -asset.export("Apollo15Kernels", Apollo15Kernels) diff --git a/data/assets/scene/solarsystem/missions/apollo/apollo8.asset b/data/assets/scene/solarsystem/missions/apollo/apollo8.asset deleted file mode 100644 index 27e86fd80d..0000000000 --- a/data/assets/scene/solarsystem/missions/apollo/apollo8.asset +++ /dev/null @@ -1,234 +0,0 @@ -local assetHelper = asset.require('util/asset_helper') -local sunTransforms = asset.require('scene/solarsystem/sun/transforms') -local csm = asset.require('./apollo_csm') - -asset.require('spice/base') - -local kernelsFolder = asset.syncedResource({ - Name = "Apollo Kernels", - Type = "HttpSynchronization", - Identifier = "apollo_spice", - Version = 1 -}) - -local kernels = { - kernelsFolder .. "/moon_080317.tf", - kernelsFolder .. "/apollo8.tf", - kernelsFolder .. "/moon_pa_de421_1900-2050.bpc", - kernelsFolder .. '/apollo8.tsc', - kernelsFolder .. '/apollo8.bsp', - kernelsFolder .. '/apollo8_earthrise.bc', -} - -local apolloSpiceId = "-908" - -local Apollo8Launch = { - Identifier = "Apollo8Launch", - Parent = "Earth", - TimeFrame = { -- Using Spice kernels for 1850-2150 - Type = "TimeFrameInterval", - Start = "1968 DEC 21", - End = "1968 DEC 28" - }, - Transform = { - Translation = { - Type = "SpiceTranslation", - Target = apolloSpiceId, - Observer = "EARTH", - Frame = "IAU_EARTH", - Kernels = kernels - }, - }, - GUI = { - Name = "Apollo 8 Launch Capsule", - Path = "/Solar System/Missions/Apollo" - } -} - - -local Apollo8 = { - Identifier = "Apollo8", - Parent = "EarthBarycenter", - TimeFrame = { -- Using Spice kernels for 1850-2150 - Type = "TimeFrameInterval", - Start = "1968 DEC 21", - End = "1968 DEC 28" - }, - Transform = { - Translation = { - Type = "SpiceTranslation", - Target = apolloSpiceId, - Observer = "EARTH BARYCENTER", - Frame = "GALACTIC", - Kernels = kernels - }, - Rotation = { - Type = "SpiceRotation", - SourceFrame = "A8_EARTHRISE", - DestinationFrame = "GALACTIC", - TimeFrame = { - -- The orientation of Apollo 8 is only - -- available during the few minutes when - -- the famous Earthrise picture was taken. - Type = "TimeFrameInterval", - Start = "1968 DEC 24 16:37:19", - End = "1968 DEC 24 16:40:15" - } - } - }, - GUI = { - Name = "Apollo 8", - Path = "/Solar System/Missions/Apollo" - } -} - -local Apollo8LaunchModel = { - Identifier = "Apollo8LaunchModel", - Parent = Apollo8Launch.Identifier, - Transform = { - Scale = { - Type = "StaticScale", - -- The scale of the model is in cm; OpenSpace is in m - Scale = 0.01 - }, - Rotation = { - Type = "StaticRotation", - Rotation = {0.0, 0.0, -3.1415/2} - } - }, - GUI = { - Hidden = true, - Name = "Apollo 8 Launch Model", - Path = "/Solar System/Missions/Apollo" - } -} - -local Apollo8Model = { - Identifier = "Apollo8Model", - Parent = Apollo8.Identifier, - Transform = { - Scale = { - Type = "StaticScale", - -- The scale of the model is in cm; OpenSpace is in m - Scale = 0.01 - }, - Rotation = { - Type = "StaticRotation", - Rotation = {0.0, 0.0, -3.1415/2} - } - }, - GUI = { - Hidden = true, - Name = "Apollo 8 Model", - Path = "/Solar System/Missions/Apollo" - } -} - -local PivotOffset = { 0, 2.5, 0} - --- The pivot node is used for navigation inside the spacecraft - -local Apollo8Pivot = { - Identifier = "Apollo8Pivot", - Parent = Apollo8.Identifier, - Transform = { - Translation = { - Type = "StaticTranslation", - Position = PivotOffset - }, - }, - GUI = { - Name = "Apollo 8 Pivot", - Path = "/Solar System/Missions/Apollo" - } -} - - -local Apollo8LaunchTrail = { - Identifier = "Apollo8LaunchTrail", - Parent = "Earth", - Renderable = { - Type = "RenderableTrailTrajectory", - Translation = { - Type = "SpiceTranslation", - Target = apolloSpiceId, - Observer = "EARTH", - Frame = "IAU_EARTH", - Kernels = kernels - }, - Color = { 0.70, 0.50, 0.20 }, - StartTime = "1968 DEC 21 12:51:00", - EndTime = "1968 DEC 21 23:23:22", - SampleInterval = 30 - }, - GUI = { - Name = "Apollo 8 Launch Trail", - Path = "/Solar System/Missions/Apollo" - } -} - -local Apollo8MoonTrail = { - Identifier = "Apollo8MoonTrail", - Parent = "Moon", - Renderable = { - Type = "RenderableTrailTrajectory", - Translation = { - Type = "SpiceTranslation", - Target = apolloSpiceId, - Observer = "MOON", - Frame = "IAU_MOON", - Kernels = kernels - }, - Color = { 0.70, 0.50, 0.20 }, - StartTime = "1968 DEC 23", - EndTime = "1968 DEC 26", - SampleInterval = 30, - Enabled = false, - }, - GUI = { - Name = "Apollo 8 Moon Trail", - Path = "/Solar System/Missions/Apollo" - } -} - -local Apollo8EarthBarycenterTrail = { - Identifier = "Apollo8EarthBarycenterTrail", - Parent = "EarthBarycenter", - Renderable = { - Type = "RenderableTrailTrajectory", - Translation = { - Type = "SpiceTranslation", - Target = apolloSpiceId, - Observer = "EARTH BARYCENTER", - Frame = "GALACTIC", - Kernels = kernels - }, - Color = { 1, 0.0, 0.0 }, - StartTime = "1968 DEC 21", - EndTime = "1968 DEC 28", - SampleInterval = 30, - Enabled = false, - }, - GUI = { - Name = "Apollo 8 Earth Barycenter Trail", - Path = "/Solar System/Missions/Apollo" - } -} - -local exportList = { - Apollo8, - Apollo8Model, - Apollo8Launch, - Apollo8LaunchModel, - Apollo8Pivot, - - Apollo8LaunchTrail, - Apollo8MoonTrail, - Apollo8EarthBarycenterTrail -} - -assetHelper.registerSceneGraphNodesAndExport(asset, exportList) --- Registering Command and Service module needs to happen fter the export list --- has been registered, since it depends on the Apollo8Model scene graph node. -csm.registerCsm(asset, Apollo8Model.Identifier) -csm.registerCsm(asset, Apollo8LaunchModel.Identifier) diff --git a/data/assets/scene/solarsystem/missions/apollo/apollo_11_lem_flipbook.asset b/data/assets/scene/solarsystem/missions/apollo/apollo_11_lem_flipbook.asset deleted file mode 100644 index 4a342dd10f..0000000000 --- a/data/assets/scene/solarsystem/missions/apollo/apollo_11_lem_flipbook.asset +++ /dev/null @@ -1,39 +0,0 @@ ---apollo_11_lem_flipbook.asset -local helper = asset.require('util/vrt_flipbook_helper') - -local assetPrefix = "A11flip"; -local assetGlobe = "Moon"; -local flipbookCount = 19; - -local flipbook = nil; - -local vrts = asset.syncedResource({ - Name = "Apollo 11 Flipbook", - Type = "HttpSynchronization", - Identifier = "apollo_11_flipbook", - Version = 1 -}) - -asset.onInitialize(function () - openspace.globebrowsing.addBlendingLayersFromDirectory(vrts, assetGlobe); - flipbook = helper.createFlipbook(assetPrefix, assetGlobe, 19); - - function nextFlip() - helper.nextFlipbookPage(flipbook); - end - - function previousFlip() - helper.previousFlipbookPage(flipbook); - end - - openspace.bindKey("RIGHT", "nextFlip()", "Show the next Apollo 11 flipbook image.", "Next A11 flip", "/Missions/Apollo/11") - openspace.bindKey("LEFT", "previousFlip()","Show the previous Apollo 11 flipbook image.", "Prev A11 flip", "/Missions/Apollo/11") -end) - - -asset.onDeinitialize(function () - flipbook = nil; - - openspace.clearKey("RIGHT") - openspace.clearKey("LEFT") -end) diff --git a/data/assets/scene/solarsystem/missions/apollo/apollo_csm.asset b/data/assets/scene/solarsystem/missions/apollo/apollo_csm.asset deleted file mode 100644 index 3f5a1e012e..0000000000 --- a/data/assets/scene/solarsystem/missions/apollo/apollo_csm.asset +++ /dev/null @@ -1,280 +0,0 @@ --- This asset exports a function to create an Apollo Command and Service Module (CSM). --- Instead of hard-coding the scene graph node parent, --- client assets can decide which object that the CSM should be attached to. --- Usage example: registerCsm(asset, Apollo8.Idenfitier) --- ...where Apollo8 is the scene graph node identifier to attach the CSM to. - -local assetHelper = asset.require('util/asset_helper') -local sunTransforms = asset.require('scene/solarsystem/sun/transforms') - -local models = asset.syncedResource({ - Name = "Apollo Models", - Type = "HttpSynchronization", - Identifier = "apollo_models", - Version = 1 -}) - -local partsInfo = { - -- Data is structured as: Geometry file name (except .obj suffix), texture file name, shading - - -- Exterior - {"AP08_cone_command_module", "Command_module_diff.png", true}, - {"AP08_cone_hatchdoor_handle_scratched_metal", "scratched_metal_gloss.png", true}, - {"AP08_cone_vent_ports_black", "black.png", true}, - {"AP08_cone_vent_ports_red", "red.png", true}, - {"AP08_cone_hatchdoor_interior", "apollo_hatchdoor_interior.jpg", false}, - - {"AP08_service_black", "black.png", true}, - {"AP08_service_brown", "brown.png", true}, - {"AP08_service_grey", "gray.png", true}, - {"AP08_service_high_gain_antenna", "Antenna_diff.png", true}, - {"AP08_service_module", "Service_module_diff.png", true}, - {"AP08_service_nozzle", "Nozzle_diff.png", true}, - {"AP08_service_pink", "pink.png", true}, - {"AP08_service_red", "red.png", true}, - {"AP08_service_scratched_metal", "scratched_metal_gloss.png", true}, - {"AP08_service_white", "white.png", true}, - - -- Interior - -- {"AP11_int_back_wall_left", "AP11_int_back_wall_left.png", false}, - -- {"AP11_int_back_wall_right", "AP11_int_back_wall_right.png", false}, - -- {"AP11_interior_back_wall_top_0Shape3", "back_wall_top_0Shape3_tpAmbient_paint_03.png", false}, - -- {"AP11_interior_belt_buckles_02_L2", "belt_buckles_02_L2Shape_tpAmbient.png", false}, - -- {"AP11_interior_belt_straps_02", "belt_straps_02Shape_tpAmbient_paint_01.png", false}, - -- {"AP11_interior_black_push_buttons", "push_buttonsShape_tpAmbient.png", false}, - -- {"AP11_interior_bottom_boxes_03", "bottom_boxes_03_paint_01.png", false}, - -- {"AP11_interior_bottom_floor_tp", "bottom_floor_tpAmbient_paint_v002.png", false}, - -- {"AP11_interior_box_back_01", "box_back_01_paint_v001.png", false}, - -- {"AP11_interior_box_back_02", "box_back_02_paint_v001.png", false}, - -- {"AP11_interior_box_back_04", "box_back_04_paint_v001.png", false}, - -- {"AP11_interior_box_lft_lower_01", "box_lft_lower_01Shape_Diffuse_paint_v002.png", false}, - -- {"AP11_interior_box_lft_top", "box_lft_topShape_Diffuse_paint_v009.png", false}, - -- {"AP11_interior_box_mid_tp", "box_mid_tpDiffuse_paint_v001.png", false}, - -- {"AP11_interior_box_rt_top_02", "box_rt_top_02_paint_04.png", false}, - -- {"AP11_interior_brushed_blue_ano", "brushed_blue_ano_paint_01.png", false}, - -- {"AP11_interior_brushed_brass", "brushed_brass_paint_01.png", false}, - -- {"AP11_interior_brushed_grey_ano", "brushed_grey_ano_paint_02.png", false}, - -- {"AP11_interior_canvas_cover", "canvas_coverShape_tpAmbient_paint_01.png", false}, - -- {"AP11_interior_Channel_attachment", "Channel_attachment_Diffuse.png", false}, - -- {"AP11_interior_Channel_baseMetal", "Channel_baseMetal_Diffuse.png", false}, - -- {"AP11_interior_Channel_Material", "Channel_Material_Diffuse.png", false}, - -- {"AP11_interior_Channel_rsMaterial2", "Channel_rsMaterial2_Diffuse.png", false}, - -- {"AP11_interior_cloth_01", "cloth_01Shape_tpAmbient_paint_01.png", false}, - -- {"AP11_interior_coiled_hose", "coiled_hoseShape_tpAmbient.png", false}, - -- {"AP11_interior_control_panel_left_win_plates", "control_panel_left_win_platesShape_tpAmbient.png", false}, - -- {"AP11_interior_control_panel_rt_win_plates", "control_panel_rt_win_platesShape_tpAmbient.png", false}, - -- {"AP11_interior_copper_parts_main_cp", "copper_parts_main_cpShape_tpAmbient.png", false}, - -- {"AP11_interior_dials_main2", "dials_main2Shape_tpAmbient.png", false}, - -- {"AP11_interior_dials_t2", "dials_t2Shape_tpAmbient.png", false}, - -- {"AP11_interior_dial_fixes_01", "dial_fixes_01Shape_tpAmbient.png", false}, - -- {"AP11_interior_fire_ex_02", "fire_ex_02_paint_v001.png", false}, - -- {"AP11_interior_floor_panels_3", "floor_panels_3Shape_tpAmbient_paint_01.png", false}, - -- {"AP11_interior_floor_tile_tex_01", "floor_tile_tex_01.png", false}, - -- {"AP11_interior_grey", "gray.png", false}, - -- {"AP11_interior_handholds_cp", "handholds_cpShape_tpAmbient_paint_05.png", false}, - -- {"AP11_interior_hatch_release_0Shape5", "hatch_release_0Shape5_tpAmbient_paint_02.png", false}, - -- {"AP11_interior_headrests_02", "headrests_02Shape_tpAmbient_paint_01.png", false}, - -- {"AP11_interior_hoses_black_01", "hoses_black_01Shape_tpAmbient_paint_01.png", false}, - -- {"AP11_interior_hoses_white_0Shape1", "hoses_white_0Shape1_tpAmbient_paint_01.png", false}, - -- {"AP11_interior_josticks1", "joysticks1Shape_tpAmbient_paint_01.png", false}, - -- {"AP11_interior_joysticks_fabric1", "joysticks_fabric1_Shape_tpAmbient_paint_01.png", false}, - -- {"AP11_interior_joystick_poles_lft_05", "joystick_poles_lft_05_paint_v002.png", false}, - -- {"AP11_interior_joystick_poles_lft_long_05", "joystick_poles_lft_long_05_paint_v002.png", false}, - -- {"AP11_interior_joystick_poles_rt_05", "joystick_poles_rt_05_paint_v002.png", false}, - -- {"AP11_interior_latch_mechanisms_01", "latch_mechanisms_01Shape_tpAmbient.png", false}, - -- {"AP11_interior_lower_push_buttons", "lower_push_buttonsShape_tpAmbient.png", false}, - -- {"AP11_interior_lower_walls_back", "lower_walls_back_paint_04.png", false}, - -- {"AP11_interior_lower_walls_boxes_head", "lower_walls_boxes_headShape_tpAmbient_paint_v001.png", false}, - -- {"AP11_interior_main_cp_left_smth_03", "main_cp_left_0Shape3_tpAmbient_paint_02.png", false}, - -- {"AP11_interior_main_cp_mid_smth_02", "main_cp_mid_smth_02Shape_tpAmbient_paint_02.png", false}, - -- {"AP11_interior_main_cp_rt_smth", "main_cp_rt_smthShape_tpAmbient_paint_02.png", false}, - -- {"AP11_interior_main_cp_wheels", "main_cp_wheelsShape_tpAmbient.png", false}, - -- {"AP11_interior_metal_brackets_under_hatch", "metal_brackets_under_hatchShape_tpAmbient.png", false}, - -- {"AP11_interior_metal_tunnel_parts", "metal_tunnel_partsShape_tpAmbient_paint_01.png", false}, - -- {"AP11_interior_metal_window_parts", "metal_window_partsShape_tpAmbient_paint_01.png", false}, - -- {"AP11_interior_middle_walls_05", "middle_walls_05_tpAmbient_paint_02.png", false}, - -- {"AP11_interior_middle_walls_0Shape8", "middle_walls_0Shape8_tpAmbient_paint_01.png", false}, - -- {"AP11_interior_mid_tunnel_parts", "mid_tunnel_parts_03Shape_tpAmbient_paint_02.png", false}, - -- {"AP11_interior_new_switch_rails1", "new_switch_rails1Shape_tpAmbient.png", false}, - -- {"AP11_interior_nozzles_02", "nozzles_02Shape_tpAmbient_paint_01.png", false}, - -- {"AP11_interior_outlet_fabric3", "outlet_fabric3Shape_tpAmbient_paint_02.png", false}, - -- {"AP11_interior_pole_end_02", "pole_end_02.png", false}, - -- {"AP11_interior_pole_end_03", "pole_end_03.png", false}, - -- {"AP11_interior_pole_tex_03", "pole_tex_03.png", false}, - -- {"AP11_interior_pole_tex_04", "pole_tex_04.png", false}, - -- {"AP11_interior_pole_tex_05", "pole_tex_05.png", false}, - -- {"AP11_interior_pole_tex_lower_01", "pole_tex_lower_01.png", false}, - -- {"AP11_interior_pole_under_seat_paint_01", "pole_under_seat_paint_01.png", false}, - -- {"AP11_interior_pole_under_seat_square_bar", "pole_under_seat_square_bar_paint_01.png", false}, - -- {"AP11_interior_push_switches_lft1", "push_switches_lft1Shape_tpAmbient.png", false}, - -- {"AP11_interior_random_small_parts_01", "random_small_parts_01Shape_tpAmbient_paint_02.png", false}, - -- {"AP11_interior_red", "red.png", false}, - -- {"AP11_interior_reticle_wheel_tp", "reticle_wheel_tpAmbient_paint_01.png", false}, - -- {"AP11_interior_rivet_paint_v001", "rivet_paint_v001.png", false}, - -- {"AP11_interior_seats_fabric", "seats_fabric_paint_01.png", false}, - -- {"AP11_interior_seat_left_tp", "seat_left_tpAmbient_paint_v001.png", false}, - -- {"AP11_interior_seat_lights_left", "seat_lights_left_Shape_tpAmbient_paint_v001.png", false}, - -- {"AP11_interior_seat_lights_rt", "seat_lights_rt_Shape_tpAmbient_paint_v001.png", false}, - -- {"AP11_interior_seat_middle_tp", "seat_middle_tpAmbient_paint_v001.png", false}, - -- {"AP11_interior_seat_poles_0Shape1", "seat_poles_0Shape1_tpAmbient_paint_01.png", false}, - -- {"AP11_interior_seat_pole_mirror_0Shape1", "seat_pole_mirror_0Shape1_tpAmbient_paint_01.png", false}, - -- {"AP11_interior_seat_rt_tp", "seat_rt_tpAmbient_paint_v001.png", false}, - -- {"AP11_interior_sextant_0Shape2", "sextant_0Shape2_tpAmbient.png", false}, - -- {"AP11_interior_switch_covers_main_middle1", "switch_covers_main_middle1Shape_tpAmbient.png", false}, - -- {"AP11_interior_switch_rails_lft", "switch_rails_lftShape_tpAmbient.png", false}, - -- {"AP11_interior_tunnel_main_cylinder1", "switch_rails_lftShape_tpAmbient.png", false}, - -- {"AP11_interior_tunnel_switches_01", "tunnel_switches_01Shape_tpAmbient.png", false}, - -- {"AP11_interior_tunnel_wheelsShape", "tunnel_wheelsShape_tpAmbient.png", false}, - -- {"AP11_interior_walls_mid_left", "walls_mid_leftShape_tpAmbient_paint_01.png", false}, - -- {"AP11_interior_windows_front_0Shape4", "windows_front_0Shape4_tpAmbient_paint_01.png", false} -} - - -local partsInfoFull = { - -- Data is structured as: Geometry file name (except .obj suffix), texture file name, shading - - -- Exterior - {"AP08_cone_command_module", "Command_module_diff.png", true}, - {"AP08_cone_hatchdoor_handle_scratched_metal", "scratched_metal_gloss.png", true}, - {"AP08_cone_vent_ports_black", "black.png", true}, - {"AP08_cone_vent_ports_red", "red.png", true}, - {"AP08_cone_hatchdoor_interior", "apollo_hatchdoor_interior.jpg", false}, - - {"AP08_service_black", "black.png", true}, - {"AP08_service_brown", "brown.png", true}, - {"AP08_service_grey", "gray.png", true}, - {"AP08_service_high_gain_antenna", "Antenna_diff.png", true}, - {"AP08_service_module", "Service_module_diff.png", true}, - {"AP08_service_nozzle", "Nozzle_diff.png", true}, - {"AP08_service_pink", "pink.png", true}, - {"AP08_service_red", "red.png", true}, - {"AP08_service_scratched_metal", "scratched_metal_gloss.png", true}, - {"AP08_service_white", "white.png", true}, - - -- Interior - {"AP11_int_back_wall_left", "AP11_int_back_wall_left.png", false}, - {"AP11_int_back_wall_right", "AP11_int_back_wall_right.png", false}, - {"AP11_interior_back_wall_top_0Shape3", "back_wall_top_0Shape3_tpAmbient_paint_03.png", false}, - {"AP11_interior_belt_buckles_02_L2", "belt_buckles_02_L2Shape_tpAmbient.png", false}, - {"AP11_interior_belt_straps_02", "belt_straps_02Shape_tpAmbient_paint_01.png", false}, - {"AP11_interior_black_push_buttons", "push_buttonsShape_tpAmbient.png", false}, - {"AP11_interior_bottom_boxes_03", "bottom_boxes_03_paint_01.png", false}, - {"AP11_interior_bottom_floor_tp", "bottom_floor_tpAmbient_paint_v002.png", false}, - {"AP11_interior_box_back_01", "box_back_01_paint_v001.png", false}, - {"AP11_interior_box_back_02", "box_back_02_paint_v001.png", false}, - {"AP11_interior_box_back_04", "box_back_04_paint_v001.png", false}, - {"AP11_interior_box_lft_lower_01", "box_lft_lower_01Shape_Diffuse_paint_v002.png", false}, - {"AP11_interior_box_lft_top", "box_lft_topShape_Diffuse_paint_v009.png", false}, - {"AP11_interior_box_mid_tp", "box_mid_tpDiffuse_paint_v001.png", false}, - {"AP11_interior_box_rt_top_02", "box_rt_top_02_paint_04.png", false}, - {"AP11_interior_brushed_blue_ano", "brushed_blue_ano_paint_01.png", false}, - {"AP11_interior_brushed_brass", "brushed_brass_paint_01.png", false}, - {"AP11_interior_brushed_grey_ano", "brushed_grey_ano_paint_02.png", false}, - {"AP11_interior_canvas_cover", "canvas_coverShape_tpAmbient_paint_01.png", false}, - {"AP11_interior_Channel_attachment", "Channel_attachment_Diffuse.png", false}, - {"AP11_interior_Channel_baseMetal", "Channel_baseMetal_Diffuse.png", false}, - {"AP11_interior_Channel_Material", "Channel_Material_Diffuse.png", false}, - {"AP11_interior_Channel_rsMaterial2", "Channel_rsMaterial2_Diffuse.png", false}, - {"AP11_interior_cloth_01", "cloth_01Shape_tpAmbient_paint_01.png", false}, - {"AP11_interior_coiled_hose", "coiled_hoseShape_tpAmbient.png", false}, - {"AP11_interior_control_panel_left_win_plates", "control_panel_left_win_platesShape_tpAmbient.png", false}, - {"AP11_interior_control_panel_rt_win_plates", "control_panel_rt_win_platesShape_tpAmbient.png", false}, - {"AP11_interior_copper_parts_main_cp", "copper_parts_main_cpShape_tpAmbient.png", false}, - {"AP11_interior_dials_main2", "dials_main2Shape_tpAmbient.png", false}, - {"AP11_interior_dials_t2", "dials_t2Shape_tpAmbient.png", false}, - {"AP11_interior_dial_fixes_01", "dial_fixes_01Shape_tpAmbient.png", false}, - {"AP11_interior_fire_ex_02", "fire_ex_02_paint_v001.png", false}, - {"AP11_interior_floor_panels_3", "floor_panels_3Shape_tpAmbient_paint_01.png", false}, - {"AP11_interior_floor_tile_tex_01", "floor_tile_tex_01.png", false}, - {"AP11_interior_grey", "gray.png", false}, - {"AP11_interior_handholds_cp", "handholds_cpShape_tpAmbient_paint_05.png", false}, - {"AP11_interior_hatch_release_0Shape5", "hatch_release_0Shape5_tpAmbient_paint_02.png", false}, - {"AP11_interior_headrests_02", "headrests_02Shape_tpAmbient_paint_01.png", false}, - {"AP11_interior_hoses_black_01", "hoses_black_01Shape_tpAmbient_paint_01.png", false}, - {"AP11_interior_hoses_white_0Shape1", "hoses_white_0Shape1_tpAmbient_paint_01.png", false}, - {"AP11_interior_josticks1", "joysticks1Shape_tpAmbient_paint_01.png", false}, - {"AP11_interior_joysticks_fabric1", "joysticks_fabric1_Shape_tpAmbient_paint_01.png", false}, - {"AP11_interior_joystick_poles_lft_05", "joystick_poles_lft_05_paint_v002.png", false}, - {"AP11_interior_joystick_poles_lft_long_05", "joystick_poles_lft_long_05_paint_v002.png", false}, - {"AP11_interior_joystick_poles_rt_05", "joystick_poles_rt_05_paint_v002.png", false}, - {"AP11_interior_latch_mechanisms_01", "latch_mechanisms_01Shape_tpAmbient.png", false}, - {"AP11_interior_lower_push_buttons", "lower_push_buttonsShape_tpAmbient.png", false}, - {"AP11_interior_lower_walls_back", "lower_walls_back_paint_04.png", false}, - {"AP11_interior_lower_walls_boxes_head", "lower_walls_boxes_headShape_tpAmbient_paint_v001.png", false}, - {"AP11_interior_main_cp_left_smth_03", "main_cp_left_0Shape3_tpAmbient_paint_02.png", false}, - {"AP11_interior_main_cp_mid_smth_02", "main_cp_mid_smth_02Shape_tpAmbient_paint_02.png", false}, - {"AP11_interior_main_cp_rt_smth", "main_cp_rt_smthShape_tpAmbient_paint_02.png", false}, - {"AP11_interior_main_cp_wheels", "main_cp_wheelsShape_tpAmbient.png", false}, - {"AP11_interior_metal_brackets_under_hatch", "metal_brackets_under_hatchShape_tpAmbient.png", false}, - {"AP11_interior_metal_tunnel_parts", "metal_tunnel_partsShape_tpAmbient_paint_01.png", false}, - {"AP11_interior_metal_window_parts", "metal_window_partsShape_tpAmbient_paint_01.png", false}, - {"AP11_interior_middle_walls_05", "middle_walls_05_tpAmbient_paint_02.png", false}, - {"AP11_interior_middle_walls_0Shape8", "middle_walls_0Shape8_tpAmbient_paint_01.png", false}, - {"AP11_interior_mid_tunnel_parts", "mid_tunnel_parts_03Shape_tpAmbient_paint_02.png", false}, - {"AP11_interior_new_switch_rails1", "new_switch_rails1Shape_tpAmbient.png", false}, - {"AP11_interior_nozzles_02", "nozzles_02Shape_tpAmbient_paint_01.png", false}, - {"AP11_interior_outlet_fabric3", "outlet_fabric3Shape_tpAmbient_paint_02.png", false}, - {"AP11_interior_pole_end_02", "pole_end_02.png", false}, - {"AP11_interior_pole_end_03", "pole_end_03.png", false}, - {"AP11_interior_pole_tex_03", "pole_tex_03.png", false}, - {"AP11_interior_pole_tex_04", "pole_tex_04.png", false}, - {"AP11_interior_pole_tex_05", "pole_tex_05.png", false}, - {"AP11_interior_pole_tex_lower_01", "pole_tex_lower_01.png", false}, - {"AP11_interior_pole_under_seat_paint_01", "pole_under_seat_paint_01.png", false}, - {"AP11_interior_pole_under_seat_square_bar", "pole_under_seat_square_bar_paint_01.png", false}, - {"AP11_interior_push_switches_lft1", "push_switches_lft1Shape_tpAmbient.png", false}, - {"AP11_interior_random_small_parts_01", "random_small_parts_01Shape_tpAmbient_paint_02.png", false}, - {"AP11_interior_red", "red.png", false}, - {"AP11_interior_reticle_wheel_tp", "reticle_wheel_tpAmbient_paint_01.png", false}, - {"AP11_interior_rivet_paint_v001", "rivet_paint_v001.png", false}, - {"AP11_interior_seats_fabric", "seats_fabric_paint_01.png", false}, - {"AP11_interior_seat_left_tp", "seat_left_tpAmbient_paint_v001.png", false}, - {"AP11_interior_seat_lights_left", "seat_lights_left_Shape_tpAmbient_paint_v001.png", false}, - {"AP11_interior_seat_lights_rt", "seat_lights_rt_Shape_tpAmbient_paint_v001.png", false}, - {"AP11_interior_seat_middle_tp", "seat_middle_tpAmbient_paint_v001.png", false}, - {"AP11_interior_seat_poles_0Shape1", "seat_poles_0Shape1_tpAmbient_paint_01.png", false}, - {"AP11_interior_seat_pole_mirror_0Shape1", "seat_pole_mirror_0Shape1_tpAmbient_paint_01.png", false}, - {"AP11_interior_seat_rt_tp", "seat_rt_tpAmbient_paint_v001.png", false}, - {"AP11_interior_sextant_0Shape2", "sextant_0Shape2_tpAmbient.png", false}, - {"AP11_interior_switch_covers_main_middle1", "switch_covers_main_middle1Shape_tpAmbient.png", false}, - {"AP11_interior_switch_rails_lft", "switch_rails_lftShape_tpAmbient.png", false}, - {"AP11_interior_tunnel_main_cylinder1", "switch_rails_lftShape_tpAmbient.png", false}, - {"AP11_interior_tunnel_switches_01", "tunnel_switches_01Shape_tpAmbient.png", false}, - {"AP11_interior_tunnel_wheelsShape", "tunnel_wheelsShape_tpAmbient.png", false}, - {"AP11_interior_walls_mid_left", "walls_mid_leftShape_tpAmbient_paint_01.png", false}, - {"AP11_interior_windows_front_0Shape4", "windows_front_0Shape4_tpAmbient_paint_01.png", false} -} - - - -asset.export("registerCsm", function (asset, parentNodeIdentifier) - local parts = {} - for i, info in ipairs(partsInfo) do - parts[#parts + 1] = assetHelper.createModelPart( - parentNodeIdentifier, - sunTransforms.SolarSystemBarycenter.Identifier, - models, - info[1], - info[2], - info[3] - ) - end - assetHelper.registerSceneGraphNodesAndExport(asset, parts) -end) - - - -asset.export("registerCsmFull", function (asset, parentNodeIdentifier) - local parts = {} - for i, info in ipairs(partsInfoFull) do - parts[#parts + 1] = assetHelper.createModelPart( - parentNodeIdentifier, - sunTransforms.SolarSystemBarycenter.Identifier, - models, - info[1], - info[2], - info[3] - ) - end - assetHelper.registerSceneGraphNodesAndExport(asset, parts) -end) \ No newline at end of file diff --git a/data/assets/scene/solarsystem/missions/apollo/apollo_lem.asset b/data/assets/scene/solarsystem/missions/apollo/apollo_lem.asset deleted file mode 100644 index 4a7a820d76..0000000000 --- a/data/assets/scene/solarsystem/missions/apollo/apollo_lem.asset +++ /dev/null @@ -1,51 +0,0 @@ ---apollo_lem.asset (hopeful title) - --- This asset exports a function to create an Apollo Lunar Excursion Module (LEM). --- Instead of hard-coding the scene graph node parent, --- client assets can decide which object that the LEM should be attached to. --- Usage example: registerLem(asset, Apollo11Lem.Idenfitier) --- ...where Apollo11Lem is the scene graph node identifier to attach the LEM to. - -local assetHelper = asset.require('util/asset_helper') -local sunTransforms = asset.require('scene/solarsystem/sun/transforms') - -local models = asset.syncedResource({ - Name = "Apollo Models", - Type = "HttpSynchronization", - Identifier = "apollo_lem_model", - Version = 1 -}) - -local partsInfo = { - -- Data is structured as: Geometry file name (except .obj suffix), texture file name, shading - -- Exterior - { "black", "black.png", true }, - { "blue_glass", "blue_glass.png", true }, - { "booster", "booster3.png", true }, - { "bright_white", "white.png", true }, - { "dark_grey_dish", "dark_gray.png", true }, - { "dull_white", "dull_white.png", true }, - { "gold", "gold.png", true }, - { "light_grey", "light_gray.png", true }, - { "mid_grey", "gray.png", true }, - { "orange", "orange.png", true }, - { "texture_lem_flag", "texture_lem_flag.png", true }, - { "texture_lem_unitedstates", "texture_lem_unitedstates.png", true }, - { "yellow_buttons", "yellow.png", true } -} - - -asset.export("registerLem", function (asset, parentNodeIdentifier) - local parts = {} - for i, info in ipairs(partsInfo) do - parts[#parts + 1] = assetHelper.createModelPart( - parentNodeIdentifier, - sunTransforms.SolarSystemBarycenter.Identifier, - models, - info[1], - info[2], - info[3] - ) - end - assetHelper.registerSceneGraphNodesAndExport(asset, parts) -end) diff --git a/data/assets/scene/solarsystem/missions/dawn/ceres.asset b/data/assets/scene/solarsystem/missions/dawn/ceres.asset deleted file mode 100644 index 0e7fd2fead..0000000000 --- a/data/assets/scene/solarsystem/missions/dawn/ceres.asset +++ /dev/null @@ -1,60 +0,0 @@ -local assetHelper = asset.require('util/asset_helper') -local transforms = asset.require('scene/solarsystem/sun/transforms') -local kernels = asset.require('./dawn_kernels').Kernels - - - -local textures = asset.syncedResource({ - Name = "Ceres Textures", - Type = "HttpSynchronization", - Identifier = "ceres_textures", - Version = 1 -}) - -local Ceres = { - Identifier = "Ceres", - Parent = transforms.SolarSystemBarycenter.Identifier, - Transform = { - Rotation = { - Type = "SpiceRotation", - SourceFrame = "IAU_CERES", - DestinationFrame = "GALACTIC", - Kernels = { - kernels .. "/dawn_ceres_v01.tpc", - kernels .. "/sb_ceres_140724.bsp", - kernels .. "/sb_ceres_110211.bsp" - } - }, - Translation = { - Type = "SpiceTranslation", - Target = "CERES", - Observer = "SSB", - Kernels = { - kernels .. "/dawn_ceres_v01.tpc", - kernels .. "/sb_ceres_140724.bsp", - kernels .. "/sb_ceres_110211.bsp" - } - } - }, - Renderable = { - Type = "RenderableGlobe", - Radii = { 6.390E5, 6.390E5, 6.390E5 }, - SegmentsPerPatch = 64, - Layers = { - ColorLayers = { - { - Name = "Texture", - FilePath = textures .. "/gray.png", - Enabled = true - } - } - } - }, - GUI = { - Path = "/Solar System/Dwarf Planets/Ceres" - } -} - - - -assetHelper.registerSceneGraphNodesAndExport(asset, { Ceres }) diff --git a/data/assets/scene/solarsystem/missions/dawn/dawn.asset b/data/assets/scene/solarsystem/missions/dawn/dawn.asset deleted file mode 100644 index f630ad8b8f..0000000000 --- a/data/assets/scene/solarsystem/missions/dawn/dawn.asset +++ /dev/null @@ -1,795 +0,0 @@ -local assetHelper = asset.require('util/asset_helper') -local transforms = asset.require('scene/solarsystem/sun/transforms') -local kernels = asset.require('./dawn_kernels').Kernels -local sunTransforms = asset.require('scene/solarsystem/sun/transforms') - - -local textures = asset.syncedResource({ - Name = "Dawn Textures", - Type = "HttpSynchronization", - Identifier = "dawn_textures", - Version = 1 -}) - -local models = asset.syncedResource({ - Name = "Dawn Models", - Type = "HttpSynchronization", - Identifier = "dawn_model", - Version = 1 -}) - -local KernelFiles = { - kernels .. "/dawn_ref_070926-150201_070829.bsp", - - --ik - kernels .. "/dawn_fc_v10.ti", - - -- SPK - kernels .. "/sb_ceres_110211.bsp", - kernels .. "/sb_ceres_140724.bsp", - kernels .. "/sb_vesta_071107.bsp", - - kernels .. "/dawn_rec_070927_070930_081218_v1.bsp", - --[[kernels .. "/dawn_rec_070930_071201_081218_v1.bsp", - kernels .. "/dawn_rec_071201_080205_081218_v1.bsp", - kernels .. "/dawn_rec_080205_080325_081218_v1.bsp", - kernels .. "/dawn_rec_080325_080503_081218_v1.bsp", - kernels .. "/dawn_rec_080503_080601_081218_v1.bsp", - kernels .. "/dawn_rec_080601_080718_081218_v1.bsp", - kernels .. "/dawn_rec_080718_080910_081218_v1.bsp", - kernels .. "/dawn_rec_080910_081022_090218_v1.bsp", - kernels .. "/dawn_rec_081022_081109_090218_v1.bsp", - kernels .. "/dawn_rec_081109_090228_090306_v1.bsp", - kernels .. "/dawn_rec_090228_090501_090702_v1.bsp", - kernels .. "/dawn_rec_090501_090801_090916_v1.bsp", - kernels .. "/dawn_rec_090801_090915_090923_v1.bsp", - kernels .. "/dawn_rec_090915_091201_091202_v1.bsp", - kernels .. "/dawn_rec_091201_100208_100209_v1.bsp", - kernels .. "/dawn_rec_100208_100316_100323_v1.bsp", - kernels .. "/dawn_rec_100316_100413_100422_v1.bsp", - kernels .. "/dawn_rec_100413_100622_100830_v1.bsp", - kernels .. "/dawn_rec_100622_100824_100830_v1.bsp", - kernels .. "/dawn_rec_100824_101130_101202_v1.bsp", - kernels .. "/dawn_rec_101130_110201_110201_v1.bsp", - kernels .. "/dawn_rec_110201_110328_110328_v1.bsp", - kernels .. "/dawn_rec_110328_110419_110420_v1.bsp",--]] - - kernels .. "/dawn_rec_110416_110802_110913_v1.bsp", - kernels .. "/dawn_rec_110802_110831_110922_v1.bsp", - --[[kernels .. "/spk/dawn_rec_110831_110928_111221_v1.bsp", - kernels .. "/dawn_rec_110928_111102_120615_v1.bsp", - kernels .. "/dawn_rec_111102_111210_120618_v1.bsp", - kernels .. "/dawn_rec_111211_120501_120620_v1.bsp", - kernels .. "/dawn_rec_120501_120611_120625_v1.bsp", - kernels .. "/dawn_rec_120611_120724_121101_v1.bsp",--]] - kernels .. "/dawn_rec_120724_120913_121213_v1.bsp", - - --PCK - --kernels .. "/dawn_vesta_v06.tpc", - --kernels .. "/dawn_ceres_v01.tpc", - --kernels .. "/pck00008.tpc", - - -- FK - kernels .. "/dawn_vesta_v00.tf", - kernels .. "/dawn_v12.tf", - - --SCLK - kernels .. "/dawn_203_sclkscet_00039.tsc", - - -- CK - kernels .. "/dawn_sc_070927_070930.bc", - kernels .. "/dawn_sc_110801_110807.bc", - kernels .. "/dawn_sc_110808_110814.bc", - kernels .. "/dawn_sc_120910_120916.bc", - -- kernels .. "/dawn_sc_111226_120101.bc", - -- kernels .. "/dawn_sc_120102_120108.bc", - -- kernels .. "/dawn_sc_120109_120115.bc", - -- kernels .. "/dawn_sc_120116_120122.bc", - -- kernels .. "/dawn_sc_120123_120129.bc", - - -- all space craft CK files, ~10 gb - -- kernels .. "/dawn_sc_120123_120129.bc", - -- kernels .. "/dawn_sc_070927_070930.bc", - --[[kernels .. "/ck/dawn_sc_071001_071007.bc", - kernels .. "/dawn_sc_071008_071014_v2.bc", - kernels .. "/dawn_sc_071015_071021.bc", - kernels .. "/dawn_sc_071022_071028_v2.bc", - kernels .. "/dawn_sc_071029_071104.bc", - kernels .. "/dawn_sc_071105_071111.bc", - kernels .. "/dawn_sc_071112_071118.bc", - kernels .. "/dawn_sc_071119_071125.bc", - kernels .. "/dawn_sc_071126_071202.bc", - kernels .. "/dawn_sc_071203_071209.bc", - kernels .. "/dawn_sc_071210_071216.bc", - kernels .. "/dawn_sc_071217_071223.bc", - kernels .. "/dawn_sc_071224_071230.bc", - kernels .. "/dawn_sc_071231_080106.bc", - kernels .. "/dawn_sc_080107_080113.bc", - kernels .. "/dawn_sc_080114_080120.bc", - kernels .. "/dawn_sc_080121_080127.bc", - kernels .. "/dawn_sc_080128_080203.bc", - kernels .. "/dawn_sc_080204_080210.bc", - kernels .. "/dawn_sc_080211_080217.bc", - kernels .. "/dawn_sc_080218_080224.bc", - kernels .. "/dawn_sc_080225_080302.bc", - kernels .. "/dawn_sc_080303_080309.bc", - kernels .. "/dawn_sc_080310_080316.bc", - kernels .. "/dawn_sc_080317_080323.bc", - kernels .. "/dawn_sc_080324_080330.bc", - kernels .. "/dawn_sc_080331_080406.bc", - kernels .. "/dawn_sc_080407_080413.bc", - kernels .. "/dawn_sc_080414_080420.bc", - kernels .. "/dawn_sc_080421_080427.bc", - kernels .. "/dawn_sc_080428_080504.bc", - kernels .. "/dawn_sc_080505_080511.bc", - kernels .. "/dawn_sc_080512_080518.bc", - kernels .. "/dawn_sc_080519_080525.bc", - kernels .. "/dawn_sc_080526_080601.bc", - kernels .. "/dawn_sc_080602_080608.bc", - kernels .. "/dawn_sc_080609_080615.bc", - kernels .. "/dawn_sc_080616_080622.bc", - kernels .. "/dawn_sc_080623_080629.bc", - kernels .. "/dawn_sc_080630_080706.bc", - kernels .. "/dawn_sc_080707_080713.bc", - kernels .. "/dawn_sc_080714_080720.bc", - kernels .. "/dawn_sc_080721_080727.bc", - kernels .. "/dawn_sc_080728_080803.bc", - kernels .. "/dawn_sc_080804_080810.bc", - kernels .. "/dawn_sc_080811_080817.bc", - kernels .. "/dawn_sc_080818_080824.bc", - kernels .. "/dawn_sc_080825_080831.bc", - kernels .. "/dawn_sc_080901_080907.bc", - kernels .. "/dawn_sc_080908_080914.bc", - kernels .. "/dawn_sc_080915_080921.bc", - kernels .. "/dawn_sc_080922_080928.bc", - kernels .. "/dawn_sc_080929_081005.bc", - kernels .. "/dawn_sc_081006_081012.bc", - kernels .. "/dawn_sc_081013_081019.bc", - kernels .. "/dawn_sc_081020_081026.bc", - kernels .. "/dawn_sc_081027_081102.bc", - kernels .. "/dawn_sc_081103_081109.bc", - kernels .. "/dawn_sc_081110_081116.bc", - kernels .. "/dawn_sc_081117_081123.bc", - kernels .. "/dawn_sc_081124_081130.bc", - kernels .. "/dawn_sc_081201_081207.bc", - kernels .. "/dawn_sc_081208_081214.bc", - kernels .. "/dawn_sc_081215_081221.bc", - kernels .. "/dawn_sc_081222_081228.bc", - kernels .. "/dawn_sc_081229_090104.bc", - kernels .. "/dawn_sc_090105_090111.bc", - kernels .. "/dawn_sc_090112_090118.bc", - kernels .. "/dawn_sc_090119_090125.bc", - kernels .. "/dawn_sc_090126_090201.bc", - kernels .. "/dawn_sc_090202_090208.bc", - kernels .. "/dawn_sc_090209_090215.bc", - kernels .. "/dawn_sc_090216_090222.bc", - kernels .. "/dawn_sc_090223_090301.bc", - kernels .. "/dawn_sc_090302_090308.bc", - kernels .. "/dawn_sc_090309_090315.bc", - kernels .. "/dawn_sc_090316_090322.bc", - kernels .. "/dawn_sc_090323_090329.bc", - kernels .. "/dawn_sc_090330_090405.bc", - kernels .. "/dawn_sc_090406_090412.bc", - kernels .. "/dawn_sc_090413_090419.bc", - kernels .. "/dawn_sc_090420_090426.bc", - kernels .. "/dawn_sc_090427_090503.bc", - kernels .. "/dawn_sc_090504_090510.bc", - kernels .. "/dawn_sc_090511_090517.bc", - kernels .. "/dawn_sc_090518_090524.bc", - kernels .. "/dawn_sc_090525_090531.bc", - kernels .. "/dawn_sc_090601_090607.bc", - kernels .. "/dawn_sc_090608_090614.bc", - kernels .. "/dawn_sc_090615_090621.bc", - kernels .. "/dawn_sc_090622_090628.bc", - kernels .. "/dawn_sc_090629_090705.bc", - kernels .. "/dawn_sc_090706_090712.bc", - kernels .. "/dawn_sc_090713_090719.bc", - kernels .. "/dawn_sc_090720_090726.bc", - kernels .. "/dawn_sc_090727_090802.bc", - kernels .. "/dawn_sc_090803_090809.bc", - kernels .. "/dawn_sc_090810_090816.bc", - kernels .. "/dawn_sc_090817_090823.bc", - kernels .. "/dawn_sc_090824_090830.bc", - kernels .. "/dawn_sc_090831_090906.bc", - kernels .. "/dawn_sc_090907_090913.bc", - kernels .. "/dawn_sc_090914_090920.bc", - kernels .. "/dawn_sc_090921_090927.bc", - kernels .. "/dawn_sc_090928_091004.bc", - kernels .. "/dawn_sc_091005_091011.bc", - kernels .. "/dawn_sc_091012_091018.bc", - kernels .. "/dawn_sc_091019_091025.bc", - kernels .. "/dawn_sc_091026_091101.bc", - kernels .. "/dawn_sc_091102_091108.bc", - kernels .. "/dawn_sc_091109_091115.bc", - kernels .. "/dawn_sc_091116_091122.bc", - kernels .. "/dawn_sc_091123_091129.bc", - kernels .. "/dawn_sc_091130_091206.bc", - kernels .. "/dawn_sc_091207_091213.bc", - kernels .. "/dawn_sc_091214_091220.bc", - kernels .. "/dawn_sc_091221_091227.bc", - kernels .. "/dawn_sc_091228_100103.bc", - kernels .. "/dawn_sc_100104_100110_v2.bc", - kernels .. "/dawn_sc_100111_100117_v2.bc",--]] - -- kernels .. "/dawn_sc_100118_100124.bc", - -- kernels .. "/dawn_sc_100125_100131.bc", - -- kernels .. "/dawn_sc_100201_100207.bc", - -- kernels .. "/dawn_sc_100208_100214.bc", - -- kernels .. "/dawn_sc_100215_100221.bc", - -- kernels .. "/dawn_sc_100222_100228.bc", - -- kernels .. "/dawn_sc_100301_100307.bc", - -- kernels .. "/dawn_sc_100308_100314.bc", - -- kernels .. "/dawn_sc_100315_100321.bc", - -- kernels .. "/dawn_sc_100322_100328.bc", - -- kernels .. "/dawn_sc_100329_100404.bc", - -- kernels .. "/dawn_sc_100405_100411.bc", - -- kernels .. "/dawn_sc_100412_100418.bc", - -- kernels .. "/dawn_sc_100419_100425.bc", - -- kernels .. "/dawn_sc_100426_100502.bc", - -- kernels .. "/dawn_sc_100503_100509.bc", - -- kernels .. "/dawn_sc_100510_100516.bc", - -- kernels .. "/dawn_sc_100517_100523.bc", - -- kernels .. "/dawn_sc_100524_100530.bc", - -- kernels .. "/dawn_sc_100531_100606.bc", - -- kernels .. "/dawn_sc_100607_100613.bc", - -- kernels .. "/dawn_sc_100614_100620.bc", - -- kernels .. "/dawn_sc_100621_100627.bc", - -- kernels .. "/dawn_sc_100628_100704.bc", - -- kernels .. "/dawn_sc_100705_100711.bc", - -- kernels .. "/dawn_sc_100712_100718.bc", - -- kernels .. "/dawn_sc_100719_100725.bc", - -- kernels .. "/dawn_sc_100726_100801.bc", - -- kernels .. "/dawn_sc_100802_100808.bc", - -- kernels .. "/dawn_sc_100809_100815.bc", - -- kernels .. "/dawn_sc_100816_100822.bc", - -- kernels .. "/dawn_sc_100823_100829.bc", - -- kernels .. "/dawn_sc_100830_100905.bc", - -- kernels .. "/dawn_sc_100906_100912.bc", - -- kernels .. "/dawn_sc_100913_100919.bc", - -- kernels .. "/dawn_sc_100920_100926.bc", - -- kernels .. "/dawn_sc_100927_101003.bc", - -- kernels .. "/dawn_sc_101004_101010.bc", - -- kernels .. "/dawn_sc_101011_101017.bc", - -- kernels .. "/dawn_sc_101018_101024.bc", - -- kernels .. "/dawn_sc_101025_101031.bc", - -- kernels .. "/dawn_sc_101101_101107.bc", - -- kernels .. "/dawn_sc_101108_101114.bc", - -- kernels .. "/dawn_sc_101115_101121.bc", - -- kernels .. "/dawn_sc_101122_101128.bc", - -- kernels .. "/dawn_sc_101129_101205.bc", - -- kernels .. "/dawn_sc_101206_101212.bc", - -- kernels .. "/dawn_sc_101213_101219.bc", - -- kernels .. "/dawn_sc_101220_101226.bc", - -- kernels .. "/dawn_sc_101227_110102.bc", - -- kernels .. "/dawn_sc_110103_110109.bc", - -- kernels .. "/dawn_sc_110110_110116.bc", - -- kernels .. "/dawn_sc_110117_110123.bc", - -- kernels .. "/dawn_sc_110124_110130.bc", - -- kernels .. "/dawn_sc_110131_110206.bc", - -- kernels .. "/dawn_sc_110207_110213.bc", - -- kernels .. "/dawn_sc_110214_110220.bc", - -- kernels .. "/dawn_sc_110221_110227.bc", - -- kernels .. "/dawn_sc_110228_110306.bc", - -- kernels .. "/dawn_sc_110307_110313.bc", - -- kernels .. "/dawn_sc_110314_110320.bc", - -- kernels .. "/dawn_sc_110321_110327.bc", - -- kernels .. "/dawn_sc_110328_110403.bc", - -- kernels .. "/dawn_sc_110404_110410.bc", - -- kernels .. "/dawn_sc_110411_110417.bc", - -- kernels .. "/dawn_sc_110418_110424.bc", - -- kernels .. "/dawn_sc_110425_110501.bc", - -- kernels .. "/dawn_sc_110502_110508.bc", - -- kernels .. "/dawn_sc_110509_110515.bc", - -- kernels .. "/dawn_sc_110516_110522.bc", - -- kernels .. "/dawn_sc_110523_110529.bc", - -- kernels .. "/dawn_sc_110530_110605.bc", - -- kernels .. "/dawn_sc_110606_110612.bc", - -- kernels .. "/dawn_sc_110613_110619.bc", - -- kernels .. "/dawn_sc_110620_110626.bc", - -- kernels .. "/dawn_sc_110627_110703.bc", - -- kernels .. "/dawn_sc_110704_110710.bc", - -- kernels .. "/dawn_sc_110711_110717.bc", - -- kernels .. "/dawn_sc_110718_110724.bc", - -- kernels .. "/dawn_sc_110725_110731.bc", - -- kernels .. "/dawn_sc_110801_110807.bc", - -- kernels .. "/dawn_sc_110808_110814.bc", - -- kernels .. "/dawn_sc_110815_110821.bc", - -- kernels .. "/dawn_sc_110822_110828.bc", - -- kernels .. "/dawn_sc_110829_110904.bc", - -- kernels .. "/dawn_sc_110905_110911.bc", - -- kernels .. "/dawn_sc_110912_110918.bc", - -- kernels .. "/dawn_sc_110919_110925.bc", - -- kernels .. "/dawn_sc_110926_111002.bc", - -- kernels .. "/dawn_sc_111003_111009.bc", - -- kernels .. "/dawn_sc_111010_111016.bc", - -- kernels .. "/dawn_sc_111017_111023.bc", - -- kernels .. "/dawn_sc_111024_111030.bc", - -- kernels .. "/dawn_sc_111031_111106.bc", - -- kernels .. "/dawn_sc_111107_111113.bc", - -- kernels .. "/dawn_sc_111114_111120.bc", - -- kernels .. "/dawn_sc_111121_111127.bc", - -- kernels .. "/dawn_sc_111128_111204.bc", - -- kernels .. "/dawn_sc_111205_111211.bc", - -- kernels .. "/dawn_sc_111212_111218.bc", - -- kernels .. "/dawn_sc_111219_111225.bc", - -- kernels .. "/dawn_sc_111226_120101.bc", - -- kernels .. "/dawn_sc_120102_120108.bc", - -- kernels .. "/dawn_sc_120109_120115.bc", - -- kernels .. "/dawn_sc_120116_120122.bc", - -- kernels .. "/dawn_sc_120123_120129.bc", - -- kernels .. "/dawn_sc_120130_120205.bc", - -- kernels .. "/dawn_sc_120206_120212.bc", - -- kernels .. "/dawn_sc_120213_120219.bc", - -- kernels .. "/dawn_sc_120220_120226.bc", - -- kernels .. "/dawn_sc_120227_120304.bc", - -- kernels .. "/dawn_sc_120305_120311.bc", - -- kernels .. "/dawn_sc_120312_120318.bc", - -- kernels .. "/dawn_sc_120319_120325.bc", - -- kernels .. "/dawn_sc_120326_120401.bc", - -- kernels .. "/dawn_sc_120402_120408.bc", - -- kernels .. "/dawn_sc_120409_120415.bc", - -- kernels .. "/dawn_sc_120416_120422.bc", - -- kernels .. "/dawn_sc_120423_120429.bc", - -- kernels .. "/dawn_sc_120430_120506.bc", - -- kernels .. "/dawn_sc_120507_120513.bc", - -- kernels .. "/dawn_sc_120514_120520.bc", - -- kernels .. "/dawn_sc_120521_120527.bc", - -- kernels .. "/dawn_sc_120528_120603.bc", - -- kernels .. "/dawn_sc_120604_120610.bc", - -- kernels .. "/dawn_sc_120611_120617.bc", - -- kernels .. "/dawn_sc_120618_120624.bc", - -- kernels .. "/dawn_sc_120625_120701.bc", - -- kernels .. "/dawn_sc_120702_120708.bc", - -- kernels .. "/dawn_sc_120709_120715.bc", - -- kernels .. "/dawn_sc_120716_120722.bc", - -- kernels .. "/dawn_sc_120723_120729.bc", - -- kernels .. "/dawn_sc_120730_120805.bc", - -- kernels .. "/dawn_sc_120806_120812.bc", - -- kernels .. "/dawn_sc_120813_120819.bc", - -- kernels .. "/dawn_sc_120820_120826.bc", - -- kernels .. "/dawn_sc_120827_120902.bc", - -- kernels .. "/dawn_sc_120903_120909.bc", - -- kernels .. "/dawn_sc_120910_120916.bc", - -- kernels .. "/dawn_sc_f2_3942xxxxx.bc", - -- kernels .. "/dawn_sc_pred_da028b_00_eu.bc", - -- kernels .. "/dawn_sc_pred_dc041a_00.bc", - - -- Solar array rotation kernels ~ 2gb - kernels .. "/dawn_sa_070927_070930.bc", - --[[kernels .. "/ck/dawn_sa_071001_071007.bc", - kernels .. "/dawn_sa_071008_071014.bc", - kernels .. "/dawn_sa_071015_071021.bc", - kernels .. "/dawn_sa_071022_071028_v2.bc", - kernels .. "/dawn_sa_071029_071104.bc", - kernels .. "/dawn_sa_071105_071111.bc", - kernels .. "/dawn_sa_071112_071118.bc", - kernels .. "/dawn_sa_071119_071125.bc", - kernels .. "/dawn_sa_071126_071202.bc", - kernels .. "/dawn_sa_071203_071209.bc", - kernels .. "/dawn_sa_071210_071216.bc", - kernels .. "/dawn_sa_071217_071223.bc", - kernels .. "/dawn_sa_071224_071230.bc", - kernels .. "/dawn_sa_071231_080106.bc", - kernels .. "/dawn_sa_080107_080113.bc", - kernels .. "/dawn_sa_080114_080120.bc", - kernels .. "/dawn_sa_080121_080127.bc", - kernels .. "/dawn_sa_080128_080203.bc", - kernels .. "/dawn_sa_080204_080210.bc", - kernels .. "/dawn_sa_080211_080217.bc", - kernels .. "/dawn_sa_080218_080224.bc", - kernels .. "/dawn_sa_080225_080302.bc", - kernels .. "/dawn_sa_080303_080309.bc", - kernels .. "/dawn_sa_080310_080316.bc", - kernels .. "/dawn_sa_080317_080323.bc", - kernels .. "/dawn_sa_080324_080330.bc", - kernels .. "/dawn_sa_080331_080406.bc", - kernels .. "/dawn_sa_080407_080413.bc", - kernels .. "/dawn_sa_080414_080420.bc", - kernels .. "/dawn_sa_080421_080427.bc", - kernels .. "/dawn_sa_080428_080504.bc", - kernels .. "/dawn_sa_080505_080511.bc", - kernels .. "/dawn_sa_080512_080518.bc", - kernels .. "/dawn_sa_080519_080525.bc", - kernels .. "/dawn_sa_080526_080601.bc", - kernels .. "/dawn_sa_080602_080608.bc", - kernels .. "/dawn_sa_080609_080615.bc", - kernels .. "/dawn_sa_080616_080622.bc", - kernels .. "/dawn_sa_080623_080629.bc", - kernels .. "/dawn_sa_080630_080706.bc", - kernels .. "/dawn_sa_080707_080713.bc", - kernels .. "/dawn_sa_080714_080720.bc", - kernels .. "/dawn_sa_080721_080727.bc", - kernels .. "/dawn_sa_080728_080803.bc", - kernels .. "/dawn_sa_080804_080810.bc", - kernels .. "/dawn_sa_080811_080817.bc", - kernels .. "/dawn_sa_080818_080824.bc", - kernels .. "/dawn_sa_080825_080831.bc", - kernels .. "/dawn_sa_080901_080907.bc", - kernels .. "/dawn_sa_080908_080914.bc", - kernels .. "/dawn_sa_080915_080921.bc", - kernels .. "/dawn_sa_080922_080928.bc", - kernels .. "/dawn_sa_080929_081005.bc", - kernels .. "/dawn_sa_081006_081012.bc", - kernels .. "/dawn_sa_081013_081019.bc", - kernels .. "/dawn_sa_081020_081026.bc", - kernels .. "/dawn_sa_081027_081102.bc", - kernels .. "/dawn_sa_081103_081109.bc", - kernels .. "/dawn_sa_081110_081116.bc", - kernels .. "/dawn_sa_081117_081123.bc", - kernels .. "/dawn_sa_081124_081130.bc", - kernels .. "/dawn_sa_081201_081207.bc", - kernels .. "/dawn_sa_081208_081214.bc", - kernels .. "/dawn_sa_081215_081221.bc", - kernels .. "/dawn_sa_081222_081228.bc", - kernels .. "/dawn_sa_081229_090104.bc", - kernels .. "/dawn_sa_090105_090111.bc", - kernels .. "/dawn_sa_090112_090118.bc", - kernels .. "/dawn_sa_090119_090125.bc", - kernels .. "/dawn_sa_090126_090201.bc", - kernels .. "/dawn_sa_090202_090208.bc", - kernels .. "/dawn_sa_090209_090215.bc", - kernels .. "/dawn_sa_090216_090222.bc", - kernels .. "/dawn_sa_090223_090301.bc", - kernels .. "/dawn_sa_090302_090308.bc", - kernels .. "/dawn_sa_090309_090315.bc", - kernels .. "/dawn_sa_090316_090322.bc", - kernels .. "/dawn_sa_090323_090329.bc", - kernels .. "/dawn_sa_090330_090405.bc", - kernels .. "/dawn_sa_090406_090412.bc", - kernels .. "/dawn_sa_090413_090419.bc", - kernels .. "/dawn_sa_090420_090426.bc", - kernels .. "/dawn_sa_090427_090503.bc", - kernels .. "/dawn_sa_090504_090510.bc", - kernels .. "/dawn_sa_090511_090517.bc", - kernels .. "/dawn_sa_090518_090524.bc", - kernels .. "/dawn_sa_090525_090531.bc", - kernels .. "/dawn_sa_090601_090607.bc", - kernels .. "/dawn_sa_090608_090614.bc", - kernels .. "/dawn_sa_090615_090621.bc", - kernels .. "/dawn_sa_090622_090628.bc", - kernels .. "/dawn_sa_090629_090705.bc", - kernels .. "/dawn_sa_090706_090712.bc", - kernels .. "/dawn_sa_090713_090719.bc", - kernels .. "/dawn_sa_090720_090726.bc", - kernels .. "/dawn_sa_090727_090802.bc", - kernels .. "/dawn_sa_090803_090809.bc", - kernels .. "/dawn_sa_090810_090816.bc", - kernels .. "/dawn_sa_090817_090823.bc", - kernels .. "/dawn_sa_090824_090830.bc", - kernels .. "/dawn_sa_090831_090906.bc", - kernels .. "/dawn_sa_090907_090913.bc", - kernels .. "/dawn_sa_090914_090920.bc", - kernels .. "/dawn_sa_090921_090927.bc", - kernels .. "/dawn_sa_090928_091004.bc", - kernels .. "/dawn_sa_091005_091011.bc", - kernels .. "/dawn_sa_091012_091018.bc", - kernels .. "/dawn_sa_091019_091025.bc", - kernels .. "/dawn_sa_091026_091101.bc", - kernels .. "/dawn_sa_091102_091108.bc", - kernels .. "/dawn_sa_091109_091115.bc", - kernels .. "/dawn_sa_091116_091122.bc", - kernels .. "/dawn_sa_091123_091129.bc", - kernels .. "/dawn_sa_091130_091206.bc", - kernels .. "/dawn_sa_091207_091213.bc", - kernels .. "/dawn_sa_091214_091220.bc", - kernels .. "/dawn_sa_091221_091227.bc", - kernels .. "/dawn_sa_091228_100103.bc", - kernels .. "/dawn_sa_100104_100110_v2.bc", - kernels .. "/dawn_sa_100111_100117_v2.bc", - kernels .. "/dawn_sa_100118_100124.bc", - kernels .. "/dawn_sa_100125_100131.bc", - kernels .. "/dawn_sa_100201_100207.bc", - kernels .. "/dawn_sa_100208_100214.bc", - kernels .. "/dawn_sa_100215_100221.bc", - kernels .. "/dawn_sa_100222_100228.bc", - kernels .. "/dawn_sa_100301_100307.bc", - kernels .. "/dawn_sa_100308_100314.bc", - kernels .. "/dawn_sa_100315_100321.bc", - kernels .. "/dawn_sa_100322_100328.bc", - kernels .. "/dawn_sa_100329_100404.bc", - kernels .. "/dawn_sa_100405_100411.bc", - kernels .. "/dawn_sa_100412_100418.bc", - kernels .. "/dawn_sa_100419_100425.bc", - kernels .. "/dawn_sa_100426_100502.bc", - kernels .. "/dawn_sa_100503_100509.bc", - kernels .. "/dawn_sa_100510_100516.bc", - kernels .. "/dawn_sa_100517_100523.bc", - kernels .. "/dawn_sa_100524_100530.bc", - kernels .. "/dawn_sa_100531_100606.bc", - kernels .. "/dawn_sa_100607_100613.bc", - kernels .. "/dawn_sa_100614_100620.bc", - kernels .. "/dawn_sa_100621_100627.bc", - kernels .. "/dawn_sa_100628_100704.bc", - kernels .. "/dawn_sa_100705_100711.bc", - kernels .. "/dawn_sa_100712_100718.bc", - kernels .. "/dawn_sa_100719_100725.bc", - kernels .. "/dawn_sa_100726_100801.bc", - kernels .. "/dawn_sa_100802_100808.bc", - kernels .. "/dawn_sa_100809_100815.bc", - kernels .. "/dawn_sa_100816_100822.bc", - kernels .. "/dawn_sa_100823_100829.bc", - kernels .. "/dawn_sa_100830_100905.bc", - kernels .. "/dawn_sa_100906_100912.bc", - kernels .. "/dawn_sa_100913_100919.bc", - kernels .. "/dawn_sa_100920_100926.bc", - kernels .. "/dawn_sa_100927_101003.bc", - kernels .. "/dawn_sa_101004_101010.bc", - kernels .. "/dawn_sa_101011_101017.bc", --]] - -- kernels .. "/dawn_sa_101018_101024.bc", - -- kernels .. "/dawn_sa_101025_101031.bc", - -- kernels .. "/dawn_sa_101101_101107.bc", - -- kernels .. "/dawn_sa_101108_101114.bc", - -- kernels .. "/dawn_sa_101115_101121.bc", - -- kernels .. "/dawn_sa_101122_101128.bc", - -- kernels .. "/dawn_sa_101129_101205.bc", - -- kernels .. "/dawn_sa_101206_101212.bc", - -- kernels .. "/dawn_sa_101213_101219.bc", - -- kernels .. "/dawn_sa_101220_101226.bc", - -- kernels .. "/dawn_sa_101227_110102.bc", - -- kernels .. "/dawn_sa_110103_110109.bc", - -- kernels .. "/dawn_sa_110110_110116.bc", - -- kernels .. "/dawn_sa_110117_110123.bc", - -- kernels .. "/dawn_sa_110124_110130.bc", - -- kernels .. "/dawn_sa_110131_110206.bc", - -- kernels .. "/dawn_sa_110207_110213.bc", - -- kernels .. "/dawn_sa_110214_110220.bc", - -- kernels .. "/dawn_sa_110221_110227.bc", - -- kernels .. "/dawn_sa_110228_110306.bc", - -- kernels .. "/dawn_sa_110307_110313.bc", - -- kernels .. "/dawn_sa_110314_110320.bc", - -- kernels .. "/dawn_sa_110321_110327.bc", - -- kernels .. "/dawn_sa_110328_110403.bc", - -- kernels .. "/dawn_sa_110404_110410.bc", - -- kernels .. "/dawn_sa_110411_110417.bc", - -- kernels .. "/dawn_sa_110418_110424.bc", - -- kernels .. "/dawn_sa_110425_110501.bc", - -- kernels .. "/dawn_sa_110502_110508.bc", - -- kernels .. "/dawn_sa_110509_110515.bc", - -- kernels .. "/dawn_sa_110516_110522.bc", - -- kernels .. "/dawn_sa_110523_110529.bc", - -- kernels .. "/dawn_sa_110530_110605.bc", - -- kernels .. "/dawn_sa_110606_110612.bc", - -- kernels .. "/dawn_sa_110613_110619.bc", - -- kernels .. "/dawn_sa_110620_110626.bc", - -- kernels .. "/dawn_sa_110627_110703.bc", - -- kernels .. "/dawn_sa_110704_110710.bc", - -- kernels .. "/dawn_sa_110711_110717.bc", - -- kernels .. "/dawn_sa_110718_110724.bc", - -- kernels .. "/dawn_sa_110725_110731.bc", - -- kernels .. "/dawn_sa_110801_110807.bc", - -- kernels .. "/dawn_sa_110808_110814.bc", - -- kernels .. "/dawn_sa_110815_110821.bc", - -- kernels .. "/dawn_sa_110822_110828.bc", - -- kernels .. "/dawn_sa_110829_110904.bc", - -- kernels .. "/dawn_sa_110905_110911.bc", - -- kernels .. "/dawn_sa_110912_110918.bc", - -- kernels .. "/dawn_sa_110919_110925.bc", - -- kernels .. "/dawn_sa_110926_111002.bc", - -- kernels .. "/dawn_sa_111003_111009.bc", - -- kernels .. "/dawn_sa_111010_111016.bc", - -- kernels .. "/dawn_sa_111017_111023.bc", - -- kernels .. "/dawn_sa_111024_111030.bc", - -- kernels .. "/dawn_sa_111031_111106.bc", - -- kernels .. "/dawn_sa_111107_111113.bc", - -- kernels .. "/dawn_sa_111114_111120.bc", - -- kernels .. "/dawn_sa_111121_111127.bc", - -- kernels .. "/dawn_sa_111128_111204.bc", - -- kernels .. "/dawn_sa_111205_111211.bc", - -- kernels .. "/dawn_sa_111212_111218.bc", - -- kernels .. "/dawn_sa_111219_111225.bc", - -- kernels .. "/dawn_sa_111226_120101.bc", - -- kernels .. "/dawn_sa_120102_120108.bc", - -- kernels .. "/dawn_sa_120109_120115.bc", - -- kernels .. "/dawn_sa_120116_120122.bc", - -- kernels .. "/dawn_sa_120123_120129.bc", - -- kernels .. "/dawn_sa_120130_120205.bc", - -- kernels .. "/dawn_sa_120206_120212.bc", - -- kernels .. "/dawn_sa_120213_120219.bc", - -- kernels .. "/dawn_sa_120220_120226.bc", - -- kernels .. "/dawn_sa_120227_120304.bc", - -- kernels .. "/dawn_sa_120305_120311.bc", - -- kernels .. "/dawn_sa_120312_120318.bc", - -- kernels .. "/dawn_sa_120319_120325.bc", - -- kernels .. "/dawn_sa_120326_120401.bc", - -- kernels .. "/dawn_sa_120402_120408.bc", - -- kernels .. "/dawn_sa_120409_120415.bc", - -- kernels .. "/dawn_sa_120416_120422.bc", - -- kernels .. "/dawn_sa_120423_120429.bc", - -- kernels .. "/dawn_sa_120430_120506.bc", - -- kernels .. "/dawn_sa_120507_120513.bc", - -- kernels .. "/dawn_sa_120514_120520.bc", - -- kernels .. "/dawn_sa_120521_120527.bc", - -- kernels .. "/dawn_sa_120528_120603.bc", - -- kernels .. "/dawn_sa_120604_120610.bc", - -- kernels .. "/dawn_sa_120611_120617.bc", - -- kernels .. "/dawn_sa_120618_120624.bc", - -- kernels .. "/dawn_sa_120625_120701.bc", - -- kernels .. "/dawn_sa_120702_120708.bc", - -- kernels .. "/dawn_sa_120709_120715.bc", - -- kernels .. "/dawn_sa_120716_120722.bc", - -- kernels .. "/dawn_sa_120723_120729.bc", - -- kernels .. "/dawn_sa_120730_120805.bc", - -- kernels .. "/dawn_sa_120806_120812.bc", - -- kernels .. "/dawn_sa_120813_120819.bc", - -- kernels .. "/dawn_sa_120820_120826.bc", - -- kernels .. "/dawn_sa_120827_120902.bc", - -- kernels .. "/dawn_sa_120903_120909.bc", - -- kernels .. "/dawn_sa_120910_120916.bc", -} - -local LightSources = { - { - Type = "SceneGraphLightSource", - Identifier = "Sun", - Node = sunTransforms.SolarSystemBarycenter.Identifier, - Intensity = 1.0 - }, - { - Identifier = "Camera", - Type = "CameraLightSource", - Intensity = 0.5 - } -} - -local Dawn = { - Identifier = "Dawn", - Parent = transforms.SolarSystemBarycenter.Identifier, - Transform = { - Translation = { - Type = "SpiceTranslation", - Target = "DAWN", - Observer = "SUN", - Kernels = KernelFiles - }, - Rotation = { - Type = "SpiceRotation", - SourceFrame = "DAWN_SPACECRAFT", - DestinationFrame = "GALACTIC", - Kernels = KernelFiles - } - }, - Renderable = { - Type = "RenderableModel", - Body = "DAWN", - Geometry = { - Type = "MultiModelGeometry", - GeometryFile = models .. "/mainbodydawn.obj" - }, - ColorTexture = textures .. "/gray.png", - LightSources = LightSources - }, - GUI = { - Path = "/Solar System/Missions/Dawn" - } -} - --- Dawn Solar Array module 1 -local DawnSolarArray1 = { - Identifier = "DawnSolar1", - Parent = Dawn.Identifier, - Transformation = { - Rotation = { - Type = "SpiceRotation", - SourceFrame = "DAWN_SA-Y", - DestinationFrame = "DAWN_SPACECRAFT" - } - }, - Renderable = { - Type = "RenderableModel", - Body = "DAWN", - Geometry = { - Type = "MultiModelGeometry", - GeometryFile = models .. "/solarpanelleft.obj" - }, - ColorTexture = textures .. "/gray.png", - LightSources = LightSources - }, - GUI = { - Name = "Dawn Solar 1", - Path = "/Solar System/Missions/Dawn" - } -} - --- Dawn Solar Array module 2 -local DawnSolarArray2 = { - Identifier = "DawnSolar2", - Parent = Dawn.Identifier, - Transformation = { - Rotation = { - Type = "SpiceRotation", - SourceFrame = "DAWN_SA+Y", - DestinationFrame = "DAWN_SPACECRAFT" - } - }, - Renderable = { - Type = "RenderableModel", - Body = "DAWN", - Geometry = { - Type = "MultiModelGeometry", - GeometryFile = models .. "/solarpanelright.obj" - }, - ColorTexture = textures .. "/gray.png", - LightSources = LightSources - }, - GUI = { - Name = "Dawn Solar 2", - Path = "/Solar System/Missions/Dawn" - } -} - -local DawnTrail = { - Identifier = "DawnTrail", - Parent = transforms.SolarSystemBarycenter.Identifier, - Renderable = { - Type = "RenderableTrailTrajectory", - Translation = { - Type = "SpiceTranslation", - Target = "DAWN", - Observer = "SUN" - }, - Color = { 1.0, 0.8, 0.4 }, - ShowFullTrail = true, - StartTime = "2007 SEP 26 13:28:00", - EndTime = "2012 SEP 12 12:00:00", - PointSize = 5, - SampleInterval = 3600, - TimeStampSubsampleFactor = 4, - EnableFade = false, - Rendering = "Lines+Points" - }, - GUI = { - Name = "Dawn Trail", - Path = "/Solar System/Missions/Dawn" - } -} - --- DawnFov 1 -local DawnFramingCamera1 = { - Identifier = "Dawn_framing_camera_1", - Parent = Dawn.Identifier, - Renderable = { - Type = "RenderableFov", - Body = "DAWN", - Frame = "DAWN_SPACECRAFT", - Color = { 0.8, 0.7, 0.7 }, - Instrument = { - Name = "DAWN_FC1", - Method = "ELLIPSOID", - Aberration = "NONE" - }, - PotentialTargets = { "VESTA", "CERES" } - }, - GUI = { - Name = "Dawn Framing Camera 1", - Path = "/Solar System/Missions/Dawn" - } -} - -local DawnFramingCamera2 = { - Identifier = "Dawn_framing_camera_2", - Parent = Dawn.Identifier, - Renderable = { - Type = "RenderableFov", - Body = "DAWN", - Frame = "DAWN_SPACECRAFT", - Color = { 0.8, 0.7, 0.7 }, - Instrument = { - Name = "DAWN_FC2", - Method = "ELLIPSOID", - Aberration = "NONE" - }, - PotentialTargets = { "VESTA", "CERES" } - }, - GUI = { - Name = "Dawn Framing Camera 2", - Path = "/Solar System/Missions/Dawn" - } -} - -assetHelper.registerSceneGraphNodesAndExport(asset, { - Dawn, - DawnSolarArray1, - DawnSolarArray2, - DawnTrail, - DawnFramingCamera1, - DawnFramingCamera2 -}) diff --git a/data/assets/scene/solarsystem/missions/dawn/dawn_kernels.asset b/data/assets/scene/solarsystem/missions/dawn/dawn_kernels.asset deleted file mode 100644 index 6ee7f55abc..0000000000 --- a/data/assets/scene/solarsystem/missions/dawn/dawn_kernels.asset +++ /dev/null @@ -1,8 +0,0 @@ -local Kernels = asset.syncedResource({ - Name = "Dawn Kernels", - Type = "HttpSynchronization", - Identifier = "dawn_kernels", - Version = 1 -}) - -asset.export("Kernels", Kernels) \ No newline at end of file diff --git a/data/assets/scene/solarsystem/missions/gaia/gaia.asset b/data/assets/scene/solarsystem/missions/gaia/gaia.asset deleted file mode 100644 index b5c6d6a18d..0000000000 --- a/data/assets/scene/solarsystem/missions/gaia/gaia.asset +++ /dev/null @@ -1,67 +0,0 @@ -local assetHelper = asset.require('util/asset_helper') -local transforms = asset.require('./transforms') -local sunTransforms = asset.require('scene/solarsystem/sun/transforms') - - -local textures = asset.syncedResource({ - Name = "Gaia Textures", - Type = "HttpSynchronization", - Identifier = "gaia_textures", - Version = 1 -}) - -local model = asset.syncedResource({ - Name = "Gaia Model", - Type = "HttpSynchronization", - Identifier = "gaia_model", - Version = 1 -}) - - -local Gaia = { - Identifier = "Gaia", - Parent = transforms.GaiaPosition.Identifier, - Transform = { - Rotation = { - Type = "FixedRotation", - Attached = "Gaia", - XAxis = { 1.0, 0.0, 0.0 }, - XAxisOrthogonal = true, - YAxis = "Sun", - YAxisInverted = true - }, - Scale = { - Type = "StaticScale", - Scale = 10.0 - } - }, - -- X Orthogonal - Renderable = { - Type = "RenderableModel", - Body = "GAIA", - Geometry = { - Type = "MultiModelGeometry", - GeometryFile = model .. "/gaia.obj" - }, - ColorTexture = textures .. "/gaia-baked.png", - LightSources = { - { - Type = "SceneGraphLightSource", - Identifier = "Sun", - Node = sunTransforms.SolarSystemBarycenter.Identifier, - Intensity = 0.3 - }, - { - Identifier = "Camera", - Type = "CameraLightSource", - Intensity = 0.4 - } - } - }, - GUI = { - Name = "Gaia", - Path = "/Solar System/Missions/Gaia" - } -} - -assetHelper.registerSceneGraphNodesAndExport(asset, { Gaia }) diff --git a/data/assets/scene/solarsystem/missions/gaia/trail.asset b/data/assets/scene/solarsystem/missions/gaia/trail.asset deleted file mode 100644 index 0ca2041067..0000000000 --- a/data/assets/scene/solarsystem/missions/gaia/trail.asset +++ /dev/null @@ -1,64 +0,0 @@ -local assetHelper = asset.require('util/asset_helper') -local earthTransforms = asset.require('scene/solarsystem/planets/earth/transforms') -local sunTransforms = asset.require('scene/solarsystem/sun/transforms') - -local trail = asset.syncedResource({ - Name = "Gaia Trail", - Type = "HttpSynchronization", - Identifier = "gaia_trail", - Version = 2 -}) - -local GaiaTrail = { - Identifier = "GaiaTrail", - Parent = earthTransforms.EarthBarycenter.Identifier, - Renderable = { - Type = "RenderableTrailTrajectory", - Enabled = false, - Translation = { - Type = "HorizonsTranslation", - HorizonsTextFile = trail .. "/gaia_orbit_horizons.dat" - }, - Color = { 0.0, 0.8, 0.7 }, - ShowFullTrail = false, - StartTime = "2013 DEC 19 09:55:10", - EndTime = "2019 JUN 20 05:55:10", - PointSize = 5, - SampleInterval = 12000, - TimeStampSubsampleFactor = 1, - EnableFade = false, - Rendering = "Lines" - }, - GUI = { - Name = "Gaia Trail", - Path = "/Solar System/Missions/Gaia" - } -} - -local GaiaTrailEclip = { - Identifier = "GaiaTrail_Eclip", - Parent = sunTransforms.SolarSystemBarycenter.Identifier, - Renderable = { - Type = "RenderableTrailTrajectory", - Enabled = false, - Translation = { - Type = "HorizonsTranslation", - HorizonsTextFile = trail .. "/gaia_orbit_horizons_sun.dat" - }, - Color = { 1.0, 0.0, 0.0 }, - ShowFullTrail = false, - StartTime = "2013 DEC 19 09:55:10", - EndTime = "2019 JUN 20 05:55:10", - PointSize = 5, - SampleInterval = 6000, - TimeStampSubsampleFactor = 1, - EnableFade = false, - Rendering = "Lines" - }, - GUI = { - Name = "Gaia Ecliptic Trail", - Path = "/Solar System/Missions/Gaia" - } -} - -assetHelper.registerSceneGraphNodesAndExport(asset, { GaiaTrail, GaiaTrailEclip } ) diff --git a/data/assets/scene/solarsystem/missions/gaia/transforms.asset b/data/assets/scene/solarsystem/missions/gaia/transforms.asset deleted file mode 100644 index a06ed09a95..0000000000 --- a/data/assets/scene/solarsystem/missions/gaia/transforms.asset +++ /dev/null @@ -1,27 +0,0 @@ -local assetHelper = asset.require('util/asset_helper') -local earthTransforms = asset.require('scene/solarsystem/planets/earth/transforms') - - -local trail = asset.syncedResource({ - Name = "Gaia Trail", - Type = "HttpSynchronization", - Identifier = "gaia_trail", - Version = 1 -}) - -local GaiaPosition = { - Identifier = "GaiaPosition", - Parent = earthTransforms.EarthBarycenter.Identifier, - Transform = { - Translation = { - Type = "HorizonsTranslation", - HorizonsTextFile = trail .. "/gaia_orbit_horizons.dat" - }, - }, - GUI = { - Name = "Position", - Path = "/Solar System/Missions/Gaia" - } -} - -assetHelper.registerSceneGraphNodesAndExport(asset, { GaiaPosition }) diff --git a/data/assets/scene/solarsystem/missions/insight/edl.asset b/data/assets/scene/solarsystem/missions/insight/edl.asset deleted file mode 100644 index 5ede98786a..0000000000 --- a/data/assets/scene/solarsystem/missions/insight/edl.asset +++ /dev/null @@ -1,981 +0,0 @@ -asset.require('spice/base') -local sunTransforms = asset.require('scene/solarsystem/sun/transforms') -local assetHelper = asset.require('util/asset_helper') - -local models_chutes = asset.syncedResource({ - Name = "Insight Models Chutes", - Type = "HttpSynchronization", - Identifier = "insight_models_chutes", - Version = 1 -}) - -local models_cruise_arrays = asset.syncedResource({ - Name = "Insight Models Cruise Arrays", - Type = "HttpSynchronization", - Identifier = "insight_models_cruise_arrays", - Version = 1 -}) - -local models_cruise_cone = asset.syncedResource({ - Name = "Insight Models Cruise Cone", - Type = "HttpSynchronization", - Identifier = "insight_models_cruise_cone", - Version = 1 -}) - -local models_lander_lander_deck = asset.syncedResource({ - Name = "Insight Models Lander Deck", - Type = "HttpSynchronization", - Identifier = "insight_models_lander_lander_deck", - Version = 1 -}) - -local models_lander_legs_deploy = asset.syncedResource({ - Name = "Insight Models Lander Legs Deploy", - Type = "HttpSynchronization", - Identifier = "insight_models_lander_legs_deploy", - Version = 1 -}) - -local models_lander_legs_stow = asset.syncedResource({ - Name = "Insight Models Lander Legs Stow", - Type = "HttpSynchronization", - Identifier = "insight_models_lander_legs_stow", - Version = 1 -}) - -local models_lander_panels_deploy = asset.syncedResource({ - Name = "Insight Models Lander Panels Deploy", - Type = "HttpSynchronization", - Identifier = "insight_models_lander_panels_deploy", - Version = 1 -}) - -local models_lander_panels_stow = asset.syncedResource({ - Name = "Insight Models Lander Panels Stow", - Type = "HttpSynchronization", - Identifier = "insight_models_lander_panels_stow", - Version = 1 -}) - - - - -local ikernels = asset.syncedResource({ - Name = "Insight Kernels", - Type = "HttpSynchronization", - Identifier = "insight_kernels", - Version = 1 -}) - -local iKernels = { - ikernels .. '/nsyt_spk_cruise_od063_v1_approach2surface_SC_Lander.tsc', - ikernels .. '/insight_v02.tfr', - ikernels .. '/mar085s.bsp', - ikernels .. '/nsyt_spk_cruise_POST_approach2surface_SC_Lander.bsp', - ikernels .. '/nsyt_spk_cruise_POST_approach2surface_SC_Lander.bck', -} - -local RotationMatrix = { - -1, 0, 0, - 0, 0, -1, - 0, -1, 0 -} - -local LightSources = { - { - Type = "SceneGraphLightSource", - Identifier = "Sun", - Node = sunTransforms.SolarSystemBarycenter.Identifier, - Intensity = 1.0 - }, - { - Type = "SceneGraphLightSource", - Identifier = "Mars", - Node = "Mars", - Intensity = 1.0 - }, - { - Identifier = "Camera", - Type = "CameraLightSource", - Intensity = 0.5 - } -} - ---expected timeline -local entryTimeStart = "2018 NOV 26 19:39:03.68"; --(-00:08:07.32 less then pdf) -local parachuteDeployTime1 = "2018 NOV 26 19:42:41.68" -- entry + 218s -local parachuteDeployTime20 = "2018 NOV 26 19:42:42.18" -- entry + 218.5s -local parachuteDeployTime40 = "2018 NOV 26 19:42:42.68" -- entry + 219s -local heatShieldSeperationTime = "2018 NOV 26 19:42:56.68" -- entry + 233s -local legDeployTime = "2018 NOV 26 19:43:06.68" -- entry + 243s -local landerSeperationTime = "2018 NOV 26 19:44:51.68" -- entry + 348s -local touchdownTime = "2018 NOV 26 19:45:32.68" -- entry + 389s -local panelDeployTime = "2018 NOV 26 19:45:33.68" -- entry + 390s -local foreverTime = "2018 NOV 26 20:17:50.68" -- entry + 2327s - -local kernelTouchdownTime = "2018 NOV 26 19:45:32.3" -local spiceRotationEndTime = "2018 NOV 26 19:51:39" - -local InsightParent = { - Identifier = "InsightParent", - Parent = "MarsBarycenter", - Transform = { - Translation = { - Type = "SpiceTranslation", - Target = "INSIGHT", - Observer = "MARS", - Frame = "GALACTIC", - Kernels = iKernels - }, - Rotation = { - Type = "SpiceRotation", - SourceFrame = "INSIGHT_LANDER_CRUISE", - DestinationFrame = "GALACTIC" - }, - }, - TimeFrame = { - Type = "TimeFrameInterval", - Start = entryTimeStart, - End = spiceRotationEndTime - }, - GUI = { - Hidden = true, - Name = "InsightParent", - Path = "/Solar System/Missions/Insight" - } -} - --- -1397 offset for MOLA -local Insight = { - Identifier = "Insight", - Parent = "InsightParent", - Transform = { - Rotation = { - Type = "StaticRotation", - Rotation = {0.0, 0.0, -3.1415} - } - }, - GUI = { - Name = "Insight", - Path = "/Solar System/Missions/Insight" - } -} - -local Insight_Entry_CapsuleA = { - Identifier = "Insight_Entry_CapsuleA", - Parent = Insight.Identifier, - Renderable = { - Type = "RenderableModel", - Geometry = { - Type = "MultiModelGeometry", - GeometryFile = models_cruise_cone .. "/cruise_insight_doubleside2_newcapsule_diffuse.obj" - }, - ColorTexture = models_cruise_cone .. "/insight_newcapsule_diffuse.jpg", - ModelTransform = RotationMatrix, - LightSources = LightSources, - }, - TimeFrame = { - Type = "TimeFrameInterval", - Start = entryTimeStart, - End = landerSeperationTime - }, - GUI = { - Hidden = true, - Name = "Insight Entry CapsuleA", - Path = "/Solar System/Missions/Insight" - } -} - -local Insight_Entry_Capsule_Ring = { - Identifier = "Insight_Entry_Capsule_Ring", - Parent = Insight.Identifier, - Renderable = { - Type = "RenderableModel", - Geometry = { - Type = "MultiModelGeometry", - GeometryFile = models_cruise_cone .. "/insight_cruise_cone_ring_foil_gold.obj" - }, - ColorTexture = models_cruise_cone .. "/foil_gold_ramp.png", - ModelTransform = RotationMatrix, - LightSources = LightSources, - }, - TimeFrame = { - Type = "TimeFrameInterval", - Start = entryTimeStart, - End = landerSeperationTime - }, - GUI = { - Hidden = true, - Name = "Insight Entry Capsule Ring", - Path = "/Solar System/Missions/Insight" - } -} - -local Insight_Entry_Capsule_Plugs = { - Identifier = "Insight_Entry_Capsule_Plugs", - Parent = Insight.Identifier, - Renderable = { - Type = "RenderableModel", - Geometry = { - Type = "MultiModelGeometry", - GeometryFile = models_cruise_cone .. "/insight_cruise_cone_capsule_diffuse.obj" - }, - ColorTexture = models_cruise_cone .. "/insight_capsule_diffuse.png", - ModelTransform = RotationMatrix, - LightSources = LightSources, - }, - TimeFrame = { - Type = "TimeFrameInterval", - Start = entryTimeStart, - End = landerSeperationTime - }, - GUI = { - Hidden = true, - Name = "Insight Entry Capsule Plugs", - Path = "/Solar System/Missions/Insight" - } -} - -local Insight_Entry_Heatshield = { - Identifier = "Insight_Entry_Heatshield", - Parent = Insight.Identifier, - Renderable = { - Type = "RenderableModel", - Geometry = { - Type = "MultiModelGeometry", - GeometryFile = models_cruise_cone .. "/insight_cruise_heatshield_foil_gold.obj" - }, - ColorTexture = models_cruise_cone .. "/foil_gold_ramp.png", - ModelTransform = RotationMatrix, - LightSources = LightSources, - }, - TimeFrame = { - Type = "TimeFrameInterval", - Start = entryTimeStart, - End = heatShieldSeperationTime - }, - GUI = { - Hidden = true, - Name = "Insight Entry Heatshield", - Path = "/Solar System/Missions/Insight" - } -} - -local Insight_Parachute_0 = { - Identifier = "Insight_Parachute_0", - Parent = Insight.Identifier, - Renderable = { - Type = "RenderableModel", - Geometry = { - Type = "MultiModelGeometry", - GeometryFile = models_chutes .. "/insight_chute_frame01_diff1.obj" - }, - ColorTexture = models_chutes .. "/chute_diff.png", - ModelTransform = RotationMatrix, - LightSources = LightSources, - }, - TimeFrame = { - Type = "TimeFrameInterval", - Start = parachuteDeployTime1, - End = parachuteDeployTime20 - }, - GUI = { - Hidden = true, - Name = "Insight Parachute0", - Path = "/Solar System/Missions/Insight" - } -} - -local Insight_Parachute_Cords_0 = { - Identifier = "Insight_Parachute_Cords_0", - Parent = Insight.Identifier, - Renderable = { - Type = "RenderableModel", - Geometry = { - Type = "MultiModelGeometry", - GeometryFile = models_chutes .. "/insight_chute_frame01_cords1.obj" - }, - ColorTexture = models_chutes .. "/foil_gold_ramp.png", - ModelTransform = RotationMatrix, - LightSources = LightSources, - }, - TimeFrame = { - Type = "TimeFrameInterval", - Start = parachuteDeployTime1, - End = parachuteDeployTime20 - }, - GUI = { - Hidden = true, - Name = "Insight ParachuteC0", - Path = "/Solar System/Missions/Insight" - } -} - -local Insight_Parachute_20 = { - Identifier = "Insight_Parachute_20", - Parent = Insight.Identifier, - Renderable = { - Type = "RenderableModel", - Geometry = { - Type = "MultiModelGeometry", - GeometryFile = models_chutes .. "/insight_chute_frame20_diff1.obj" - }, - ColorTexture = models_chutes .. "/chute_diff.png", - ModelTransform = RotationMatrix, - LightSources = LightSources, - }, - TimeFrame = { - Type = "TimeFrameInterval", - Start = parachuteDeployTime20, - End = parachuteDeployTime40 - }, - GUI = { - Hidden = true, - Name = "Insight Parachute20", - Path = "/Solar System/Missions/Insight" - } -} - -local Insight_Parachute_Cords_20 = { - Identifier = "Insight_Parachute_Cords_20", - Parent = Insight.Identifier, - Renderable = { - Type = "RenderableModel", - Geometry = { - Type = "MultiModelGeometry", - GeometryFile = models_chutes .. "/insight_chute_frame20_cords1.obj" - }, - ColorTexture = models_chutes .. "/foil_gold_ramp.png", - ModelTransform = RotationMatrix, - LightSources = LightSources, - }, - TimeFrame = { - Type = "TimeFrameInterval", - Start = parachuteDeployTime20, - End = parachuteDeployTime40 - }, - GUI = { - Hidden = true, - Name = "Insight ParachuteC20", - Path = "/Solar System/Missions/Insight" - } -} - -local Insight_Parachute_40 = { - Identifier = "Insight_Parachute_40", - Parent = Insight.Identifier, - Renderable = { - Type = "RenderableModel", - Geometry = { - Type = "MultiModelGeometry", - GeometryFile = models_chutes .. "/chute_doubleside_frame40_diff.obj" - }, - ColorTexture = models_chutes .. "/chute_diff.png", - ModelTransform = RotationMatrix, - LightSources = LightSources, - }, - TimeFrame = { - Type = "TimeFrameInterval", - Start = parachuteDeployTime40, - End = landerSeperationTime - }, - GUI = { - Hidden = true, - Name = "Insight Parachute40", - Path = "/Solar System/Missions/Insight" - } -} - -local Insight_Parachute_Cords_40 = { - Identifier = "Insight_Parachute_Cords_40", - Parent = Insight.Identifier, - Renderable = { - Type = "RenderableModel", - Geometry = { - Type = "MultiModelGeometry", - GeometryFile = models_chutes .. "/insight_chute_frame40_cords1.obj" - }, - ColorTexture = models_chutes .. "/foil_gold_ramp.png", - ModelTransform = RotationMatrix, - LightSources = LightSources, - }, - TimeFrame = { - Type = "TimeFrameInterval", - Start = parachuteDeployTime40, - End = landerSeperationTime - }, - GUI = { - Hidden = true, - Name = "Insight ParachuteC40", - Path = "/Solar System/Missions/Insight" - } -} - -local Insight_Lander_A001 = { - Identifier = "Insight_Lander_A001", - Parent = Insight.Identifier, - Renderable = { - Type = "RenderableModel", - Geometry = { - Type = "MultiModelGeometry", - GeometryFile = models_lander_lander_deck .. "/insight_lander_deck_AO01.obj" - }, - ColorTexture = models_lander_lander_deck .. "/InSIGHT_AO_01.jpg", - ModelTransform = RotationMatrix, - LightSources = LightSources, - }, - TimeFrame = { - Type = "TimeFrameInterval", - Start = entryTimeStart, - End = foreverTime - }, - GUI = { - Hidden = true, - Name = "Insight Lander A001", - Path = "/Solar System/Missions/Insight" - } -} - -local Insight_Lander_A002 = { - Identifier = "Insight_Lander_A002", - Parent = Insight.Identifier, - Renderable = { - Type = "RenderableModel", - Geometry = { - Type = "MultiModelGeometry", - GeometryFile = models_lander_lander_deck .. "/insight_lander_deck_AO02.obj" - }, - ColorTexture = models_lander_lander_deck .. "/InSIGHT_AO_02.jpg", - ModelTransform = RotationMatrix, - LightSources = LightSources, - }, - TimeFrame = { - Type = "TimeFrameInterval", - Start = entryTimeStart, - End = foreverTime - }, - GUI = { - Hidden = true, - Name = "Insight Lander A002", - Path = "/Solar System/Missions/Insight" - } -} - -local Insight_Lander_A003 = { - Identifier = "Insight_Lander_A003", - Parent = Insight.Identifier, - Renderable = { - Type = "RenderableModel", - Geometry = { - Type = "MultiModelGeometry", - GeometryFile = models_lander_lander_deck .. "/insight_lander_deck_AO03.obj" - }, - ColorTexture = models_lander_lander_deck .. "/InSIGHT_AO_03.jpg", - ModelTransform = RotationMatrix, - LightSources = LightSources, - }, - TimeFrame = { - Type = "TimeFrameInterval", - Start = entryTimeStart, - End = foreverTime - }, - GUI = { - Hidden = true, - Name = "Insight Lander A003", - Path = "/Solar System/Missions/Insight" - } -} - -local Insight_Lander_A004 = { - Identifier = "Insight_Lander_A004", - Parent = Insight.Identifier, - Renderable = { - Type = "RenderableModel", - Geometry = { - Type = "MultiModelGeometry", - GeometryFile = models_lander_lander_deck .. "/insight_lander_deck_AO04.obj" - }, - ColorTexture = models_lander_lander_deck .. "/InSIGHT_AO_04.jpg", - ModelTransform = RotationMatrix, - LightSources = LightSources, - }, - TimeFrame = { - Type = "TimeFrameInterval", - Start = entryTimeStart, - End = foreverTime - }, - GUI = { - Hidden = true, - Name = "Insight Lander A004", - Path = "/Solar System/Missions/Insight" - } -} - -local Insight_Lander_A005 = { - Identifier = "Insight_Lander_A005", - Parent = Insight.Identifier, - Renderable = { - Type = "RenderableModel", - Geometry = { - Type = "MultiModelGeometry", - GeometryFile = models_lander_lander_deck .. "/insight_lander_deck_AO05.obj" - }, - ColorTexture = models_lander_lander_deck .. "/InSIGHT_AO_05.jpg", - ModelTransform = RotationMatrix, - LightSources = LightSources, - }, - TimeFrame = { - Type = "TimeFrameInterval", - Start = entryTimeStart, - End = foreverTime - }, - GUI = { - Hidden = true, - Name = "Insight Lander A005", - Path = "/Solar System/Missions/Insight" - } -} - -local Insight_Lander_A006 = { - Identifier = "Insight_Lander_A006", - Parent = Insight.Identifier, - Renderable = { - Type = "RenderableModel", - Geometry = { - Type = "MultiModelGeometry", - GeometryFile = models_lander_lander_deck .. "/insight_lander_deck_AO06.obj" - }, - ColorTexture = models_lander_lander_deck .. "/InSIGHT_AO_06.jpg", - ModelTransform = RotationMatrix, - LightSources = LightSources, - }, - TimeFrame = { - Type = "TimeFrameInterval", - Start = entryTimeStart, - End = foreverTime - }, - GUI = { - Hidden = true, - Name = "Insight Lander A006", - Path = "/Solar System/Missions/Insight" - } -} - -local Insight_Lander_A007 = { - Identifier = "Insight_Lander_A007", - Parent = Insight.Identifier, - Renderable = { - Type = "RenderableModel", - Geometry = { - Type = "MultiModelGeometry", - GeometryFile = models_lander_lander_deck .. "/insight_lander_deck_AO07.obj" - }, - ColorTexture = models_lander_lander_deck .. "/InSIGHT_AO_07.jpg", - ModelTransform = RotationMatrix, - LightSources = LightSources, - }, - TimeFrame = { - Type = "TimeFrameInterval", - Start = entryTimeStart, - End = foreverTime - }, - GUI = { - Hidden = true, - Name = "Insight Lander A007", - Path = "/Solar System/Missions/Insight" - } -} - -local Insight_Lander_A008 = { - Identifier = "Insight_Lander_A008", - Parent = Insight.Identifier, - Renderable = { - Type = "RenderableModel", - Geometry = { - Type = "MultiModelGeometry", - GeometryFile = models_lander_lander_deck .. "/insight_lander_deck_AO08.obj" - }, - ColorTexture = models_lander_lander_deck .. "/InSIGHT_AO_08.jpg", - ModelTransform = RotationMatrix, - LightSources = LightSources, - }, - TimeFrame = { - Type = "TimeFrameInterval", - Start = entryTimeStart, - End = foreverTime - }, - GUI = { - Hidden = true, - Name = "Insight Lander A008", - Path = "/Solar System/Missions/Insight" - } -} - -local Insight_Lander_foil1 = { - Identifier = "Insight_Lander_foil1", - Parent = Insight.Identifier, - Renderable = { - Type = "RenderableModel", - Geometry = { - Type = "MultiModelGeometry", - GeometryFile = models_lander_lander_deck .. "/insight_lander_deck_foil1.obj" - }, - ColorTexture = models_lander_lander_deck .. "/foil_silver_ramp.jpg", - ModelTransform = RotationMatrix, - LightSources = LightSources, - }, - TimeFrame = { - Type = "TimeFrameInterval", - Start = entryTimeStart, - End = foreverTime - }, - GUI = { - Hidden = true, - Name = "Insight Lander foil", - Path = "/Solar System/Missions/Insight" - } -} - -local Insight_Lander_Tex01 = { - Identifier = "Insight_Lander_Tex01", - Parent = Insight.Identifier, - Renderable = { - Type = "RenderableModel", - Geometry = { - Type = "MultiModelGeometry", - GeometryFile = models_lander_lander_deck .. "/insight_lander_deck_tex01.obj" - }, - ColorTexture = models_lander_lander_deck .. "/InSIGHT_tex_01.jpg", - ModelTransform = RotationMatrix, - LightSources = LightSources, - }, - TimeFrame = { - Type = "TimeFrameInterval", - Start = entryTimeStart, - End = foreverTime - }, - GUI = { - Hidden = true, - Name = "Insight Lander Tex01", - Path = "/Solar System/Missions/Insight" - } -} - -local Insight_Lander_Tex02 = { - Identifier = "Insight_Lander_Tex02", - Parent = Insight.Identifier, - Renderable = { - Type = "RenderableModel", - Geometry = { - Type = "MultiModelGeometry", - GeometryFile = models_lander_lander_deck .. "/insight_lander_deck_tex02.obj" - }, - ColorTexture = models_lander_lander_deck .. "/InSIGHT_tex_02.jpg", - ModelTransform = RotationMatrix, - LightSources = LightSources, - }, - TimeFrame = { - Type = "TimeFrameInterval", - Start = entryTimeStart, - End = foreverTime - }, - GUI = { - Hidden = true, - Name = "Insight Lander Tex02", - Path = "/Solar System/Missions/Insight" - } -} - -local Insight_Legs_Stowed_tex = { - Identifier = "Insight_Legs_Stowed_tex", - Parent = Insight.Identifier, - Renderable = { - Type = "RenderableModel", - Geometry = { - Type = "MultiModelGeometry", - GeometryFile = models_lander_legs_stow .. "/insight_lander_legs_stow_tex01.obj" - }, - ColorTexture = models_lander_legs_stow .. "/InSIGHT_tex_01.jpg", - ModelTransform = RotationMatrix, - LightSources = LightSources, - }, - TimeFrame = { - Type = "TimeFrameInterval", - Start = heatShieldSeperationTime, - End = legDeployTime - }, - GUI = { - Hidden = true, - Name = "Insight legs_stow_tex", - Path = "/Solar System/Missions/Insight" - } -} - -local Insight_Legs_Stowed_AO06 = { - Identifier = "Insight_Legs_Stowed_AO", - Parent = Insight.Identifier, - Renderable = { - Type = "RenderableModel", - Geometry = { - Type = "MultiModelGeometry", - GeometryFile = models_lander_legs_stow .. "/insight_lander_legs_stow_AO06.obj" - }, - ColorTexture = models_lander_legs_stow .. "/InSIGHT_AO_06.jpg", - ModelTransform = RotationMatrix, - LightSources = LightSources, - }, - TimeFrame = { - Type = "TimeFrameInterval", - Start = heatShieldSeperationTime, - End = legDeployTime - }, - GUI = { - Hidden = true, - Name = "Insight legs_stow_AO", - Path = "/Solar System/Missions/Insight" - } -} - -local Insight_Legs_Deployed_tex = { - Identifier = "Insight_Legs_Deployed_tex", - Parent = Insight.Identifier, - Renderable = { - Type = "RenderableModel", - Geometry = { - Type = "MultiModelGeometry", - GeometryFile = models_lander_legs_deploy .. "/insight_lander_legs_deploy_tex01.obj" - }, - ColorTexture = models_lander_legs_deploy .. "/InSIGHT_tex_01.jpg", - ModelTransform = RotationMatrix, - LightSources = LightSources, - }, - TimeFrame = { - Type = "TimeFrameInterval", - Start = legDeployTime, - End = foreverTime - }, - GUI = { - Hidden = true, - Name = "Insight legs_deploy_tex", - Path = "/Solar System/Missions/Insight" - } -} - -local Insight_Legs_Deployed_AO06 = { - Identifier = "Insight_Legs_Deployed_AO", - Parent = Insight.Identifier, - Renderable = { - Type = "RenderableModel", - Geometry = { - Type = "MultiModelGeometry", - GeometryFile = models_lander_legs_deploy .. "/insight_lander_legs_deploy_AO06.obj" - }, - ColorTexture = models_lander_legs_deploy .. "/InSIGHT_AO_06.jpg", - ModelTransform = RotationMatrix, - LightSources = LightSources, - }, - TimeFrame = { - Type = "TimeFrameInterval", - Start = legDeployTime, - End = foreverTime - }, - GUI = { - Hidden = true, - Name = "Insight legs_deploy_AO", - Path = "/Solar System/Missions/Insight" - } -} - -local Insight_Panels_Stowed_tex = { - Identifier = "Insight_Panels_Stowed_tex", - Parent = Insight.Identifier, - Renderable = { - Type = "RenderableModel", - Geometry = { - Type = "MultiModelGeometry", - GeometryFile = models_lander_panels_stow .. "/insight_lander_panels_stow_tex01.obj" - }, - ColorTexture = models_lander_panels_stow .. "/InSIGHT_tex_01.jpg", - ModelTransform = RotationMatrix, - LightSources = LightSources, - }, - TimeFrame = { - Type = "TimeFrameInterval", - Start = entryTimeStart, - End = foreverTime - }, - GUI = { - Hidden = true, - Name = "Insight panels_stow_tex", - Path = "/Solar System/Missions/Insight" - } -} - -local Insight_Panels_Stowed_tex2 = { - Identifier = "Insight_Panels_Stowed_tex2", - Parent = Insight.Identifier, - Renderable = { - Type = "RenderableModel", - Geometry = { - Type = "MultiModelGeometry", - GeometryFile = models_lander_panels_stow .. "/insight_lander_panels_stow_tex02.obj" - }, - ColorTexture = models_lander_panels_stow .. "/InSIGHT_tex_02.jpg", - ModelTransform = RotationMatrix, - LightSources = LightSources, - }, - TimeFrame = { - Type = "TimeFrameInterval", - Start = entryTimeStart, - End = foreverTime - }, - GUI = { - Hidden = true, - Name = "Insight panels_stow_tex2", - Path = "/Solar System/Missions/Insight" - } -} - -local Insight_Panels_Stowed_AO01 = { - Identifier = "Insight_Panels_Stowed_AO", - Parent = Insight.Identifier, - Renderable = { - Type = "RenderableModel", - Geometry = { - Type = "MultiModelGeometry", - GeometryFile = models_lander_panels_stow .. "/insight_lander_panels_stow_AO01.obj" - }, - ColorTexture = models_lander_panels_stow .. "/InSIGHT_AO_01.jpg", - ModelTransform = RotationMatrix, - LightSources = LightSources, - }, - TimeFrame = { - Type = "TimeFrameInterval", - Start = entryTimeStart, - End = foreverTime - }, - GUI = { - Hidden = true, - Name = "Insight panels_stow_AO", - Path = "/Solar System/Missions/Insight" - } -} - -local Insight_Panels_Deployed_tex = { - Identifier = "Insight_panels_Deployed_tex", - Parent = Insight.Identifier, - Renderable = { - Type = "RenderableModel", - Geometry = { - Type = "MultiModelGeometry", - GeometryFile = models_lander_panels_deploy .. "/insight_lander_panels_deploy_tex01.obj" - }, - ColorTexture = models_lander_panels_deploy .. "/InSIGHT_tex_01.jpg", - ModelTransform = RotationMatrix, - LightSources = LightSources, - }, - TimeFrame = { - Type = "TimeFrameInterval", - Start = panelDeployTime, - End = foreverTime - }, - GUI = { - Hidden = true, - Name = "Insight panels_deploy_tex", - Path = "/Solar System/Missions/Insight" - } -} - -local Insight_Panels_Deployed_tex2 = { - Identifier = "Insight_panels_Deployed_tex2", - Parent = Insight.Identifier, - Renderable = { - Type = "RenderableModel", - Geometry = { - Type = "MultiModelGeometry", - GeometryFile = models_lander_panels_deploy .. "/insight_lander_panels_deploy_tex02.obj" - }, - ColorTexture = models_lander_panels_deploy .. "/InSIGHT_tex_02.jpg", - ModelTransform = RotationMatrix, - LightSources = LightSources, - }, - TimeFrame = { - Type = "TimeFrameInterval", - Start = panelDeployTime, - End = foreverTime - }, - GUI = { - Hidden = true, - Name = "Insight panels_deploy_tex2", - Path = "/Solar System/Missions/Insight" - } -} - -local Insight_Panels_Deployed_AO06 = { - Identifier = "Insight_panels_Deployed_AO", - Parent = Insight.Identifier, - Renderable = { - Type = "RenderableModel", - Geometry = { - Type = "MultiModelGeometry", - GeometryFile = models_lander_panels_deploy .. "/insight_lander_panels_deploy_AO01.obj" - }, - ColorTexture = models_lander_panels_deploy .. "/InSIGHT_AO_01.jpg", - ModelTransform = RotationMatrix, - LightSources = LightSources, - }, - TimeFrame = { - Type = "TimeFrameInterval", - Start = panelDeployTime, - End = foreverTime - }, - GUI = { - Hidden = true, - Name = "Insight panels_deploy_AO", - Path = "/Solar System/Missions/Insight" - } -} - -local Insight_Trail = { - Identifier = "InsightTrail", - Parent = "Mars", - Renderable = { - Enabled = false, - Type = "RenderableTrailTrajectory", - Translation = { - Type = "SpiceTranslation", - Target = "-189", - Observer = "MARS", - Frame = "IAU_MARS", - Kernels = iKernels - }, - Color = { 0.70, 0.50, 0.20 }, - StartTime = "2018 NOV 26 19:30:13.390", - EndTime = "2018 NOV 26 19:51:40.890", - SampleInterval = 2 - }, - TimeFrame = { - Type = "TimeFrameInterval", - Start = entryTimeStart, - End = landerSeperationTime - }, - GUI = { - Name = "Insight Trail", - Path = "/Solar System/Missions/Insight" - } -} - -assetHelper.registerSceneGraphNodesAndExport(asset, { - InsightParent, Insight, Insight_Entry_CapsuleA, Insight_Entry_Capsule_Ring, - Insight_Entry_Capsule_Plugs, Insight_Entry_Heatshield, Insight_Parachute_0, - Insight_Parachute_Cords_0, Insight_Parachute_20, Insight_Parachute_Cords_20, - Insight_Parachute_40, Insight_Parachute_Cords_40, Insight_Lander_A001, - Insight_Lander_A002, Insight_Lander_A003, Insight_Lander_A004, Insight_Lander_A005, - Insight_Lander_A006, Insight_Lander_A007, Insight_Lander_A008, Insight_Lander_foil1, - Insight_Lander_Tex01, Insight_Lander_Tex02, Insight_Legs_Stowed_tex, - Insight_Legs_Stowed_AO06, Insight_Legs_Deployed_tex, Insight_Legs_Deployed_AO06, - Insight_Panels_Stowed_tex, Insight_Panels_Stowed_tex2, Insight_Panels_Stowed_AO01, - Insight_Panels_Deployed_tex, Insight_Panels_Deployed_tex2, - Insight_Panels_Deployed_AO06, Insight_Trail -}) diff --git a/data/assets/scene/solarsystem/missions/juno/juno.asset b/data/assets/scene/solarsystem/missions/juno/juno.asset deleted file mode 100644 index 78d0296a6f..0000000000 --- a/data/assets/scene/solarsystem/missions/juno/juno.asset +++ /dev/null @@ -1,202 +0,0 @@ -local assetHelper = asset.require('util/asset_helper') -local transforms = asset.require('scene/solarsystem/planets/jupiter/transforms') -local sunTransforms = asset.require('scene/solarsystem/sun/transforms') - - -local textures = asset.syncedResource({ - Name = "Juno Textures", - Type = "HttpSynchronization", - Identifier = "juno_textures", - Version = 1 -}) - -local model = asset.syncedResource({ - Name = "Juno Model", - Type = "HttpSynchronization", - Identifier = "juno_model", - Version = 1 -}) - - -local kernels = asset.syncedResource({ - Name = "Juno Kernels", - Type = "HttpSynchronization", - Identifier = "juno_kernels", - Version = 2 -}) - -local JunoKernels = { - kernels .. "/juno_v12.tf", - kernels .. "/JNO_SCLKSCET.00039.tsc", - kernels .. "/juno_jade_v00.ti", - kernels .. "/juno_jedi_v00.ti", - kernels .. "/juno_jiram_v01.ti", - kernels .. "/juno_junocam_v00.ti", - kernels .. "/juno_mag_v00.ti", - kernels .. "/juno_mwr_v01.ti", - kernels .. "/juno_struct_v01.ti", - kernels .. "/juno_uvs_v00.ti", - kernels .. "/juno_waves_v00.ti", - kernels .. "/juno_mwr_v01.ti", - kernels .. "/spk_merge_110805_171017_130515.bsp", - kernels .. "/juno_sc_nom_110807_171016_v01.bc", - kernels .. "/juno_sc_prl_110930_111028_jc003c01_v01.bc", - kernels .. "/juno_sc_prl_111028_111125_jc004b00_v01.bc", - kernels .. "/juno_sc_prl_111125_111223_jc005b00_v01.bc", - kernels .. "/juno_sc_prl_111223_120127_jc006a02_v01.bc", - kernels .. "/juno_sc_prl_120127_120217_jc007a00_v01.bc", - kernels .. "/juno_sc_prl_120217_120316_jc008b00_v02.bc", - kernels .. "/juno_sc_prl_120316_120413_jc009a00_v01.bc", - kernels .. "/juno_sc_prl_120413_120511_jc010a04_v01.bc", - kernels .. "/juno_sc_prl_120511_120608_jc011a01_v02.bc", - kernels .. "/juno_sc_prl_120608_120706_jc012b01_v01.bc", - kernels .. "/juno_sc_prl_120706_120802_jc013a01_v01.bc", - kernels .. "/juno_sc_prl_120802_120824_jc014b01_v01.bc", - kernels .. "/juno_sc_prl_120824_120928_jc015m00_v01.bc", - kernels .. "/juno_sc_prl_120919_120928_jc015o00_v01.bc", - kernels .. "/juno_sc_prl_120928_121026_jc016c03_v01.bc", - kernels .. "/juno_sc_prl_121026_121123_jc017a01_v01.bc", - kernels .. "/juno_sc_prl_121123_121221_jc018b01_v01.bc", - kernels .. "/juno_sc_prl_121221_130118_jc019a01_v01.bc", - kernels .. "/juno_sc_prl_130118_130215_jc020b01_v01.bc", - kernels .. "/juno_sc_prl_130315_130412_jc022b01_v01.bc", - kernels .. "/juno_sc_prl_130412_130510_jc023b03_v01.bc", - kernels .. "/juno_sc_prl_130510_130607_jc024a01_v01.bc", - kernels .. "/juno_sc_prl_130607_130705_jc025a00_v01.bc", - kernels .. "/juno_sc_prl_130705_130802_jc026a01_v01.bc", - kernels .. "/juno_sc_prl_130726_131020_jx024a02_EFB_v03.bc", - kernels .. "/juno_sc_prl_130802_130830_jc027a02_v01.bc", - kernels .. "/juno_sc_prl_130830_130927_jc028a01_v01.bc", - kernels .. "/juno_sc_prl_130926_131025_jc029a00_v01.bc", - kernels .. "/juno_sc_prl_130927_131025_jc029c01_v01.bc", - kernels .. "/juno_sc_prl_131022_131025_jc029f00_v01.bc", - kernels .. "/juno_sc_prl_131025_131122_jc030b04_v01.bc", - kernels .. "/juno_sc_prl_131122_131220_jc031b01_v01.bc", - kernels .. "/juno_sc_prl_131220_140124_jc032a01_v01.bc", - kernels .. "/juno_sc_prl_140124_140214_jc033a01_v01.bc", - kernels .. "/juno_sc_prl_140214_140314_jc034b01_v01.bc", - kernels .. "/juno_sc_prl_140314_140411_jc035a01_v01.bc", - kernels .. "/juno_sc_prl_140411_140509_jc036b01_v01.bc", - kernels .. "/juno_sc_prl_140509_140606_jc037b02_v01.bc", - kernels .. "/juno_sc_prl_140606_140704_jc038a01_v01.bc", - kernels .. "/juno_sc_prl_140704_140801_jc039b01_v01.bc", - kernels .. "/juno_sc_prl_140801_140829_jc040a01_v01.bc", - kernels .. "/juno_sc_prl_140829_140926_jc041a01_v01.bc", - kernels .. "/juno_sc_prl_140926_141024_jc042a01_v01.bc", - kernels .. "/juno_sc_prl_141024_141121_jc043a01_v01.bc", - kernels .. "/juno_sc_prl_141105_141121_jc043m01_v01.bc", - kernels .. "/juno_sc_prl_141107_141121_jc043s01_v01.bc", - kernels .. "/juno_sc_prl_141121_141219_jc044a01_v01.bc", - kernels .. "/juno_sc_prl_141219_150123_jc045a01_v01.bc", - kernels .. "/juno_sc_prl_150123_150213_jc046a01_v01.bc", - kernels .. "/juno_sc_prl_150213_150313_jc047a01_v01.bc", - kernels .. "/juno_sc_prl_150312_150409_jc048a01_v01.bc", - kernels .. "/juno_sc_prl_150410_150508_jc049a01_v01.bc", - kernels .. "/juno_sc_prl_150508_150605_jc050a01_v01.bc", - kernels .. "/juno_sc_prl_150605_150703_jc051a01_v01.bc", - kernels .. "/juno_sc_prl_150703_150731_jc052a01_v01.bc", - kernels .. "/juno_sc_prl_150731_150828_jc053a01_v01.bc", - kernels .. "/juno_sc_prl_150805_150828_jc053m00_v01.bc", - kernels .. "/juno_sc_prl_150807_150828_jc053s00_v01.bc", - kernels .. "/juno_sc_prl_150828_150924_jc054a00_v01.bc", - kernels .. "/juno_sc_prl_150924_151023_jc055a00_v01.bc", - kernels .. "/juno_sc_prl_151023_151120_jc056a00_v01.bc", - kernels .. "/juno_sc_prl_151120_151218_jc057a00_v01.bc", - kernels .. "/juno_sc_prl_151218_160115_jc058a00_v01.bc", - kernels .. "/juno_sc_prl_160115_160212_jc059a00_v01.bc", - kernels .. "/juno_sc_prl_160212_160311_jc060a00_v01.bc", - kernels .. "/juno_sc_prl_160311_160408_jc061a00_v01.bc", - kernels .. "/juno_sc_prl_160408_160506_jc062a00_v01.bc", - kernels .. "/juno_sc_prl_160506_160603_jc063a00_v01.bc", - kernels .. "/juno_sc_prl_160603_160630_jc064a00_v01.bc", - kernels .. "/juno_sc_prl_160708_160729_jm0001rp_v02.bc", - kernels .. "/juno_sc_prl_160729_160826_jm0002rp_v01.bc", - kernels .. "/juno_sc_prl_160827_160920_jm0003a00_v01.bc", - kernels .. "/juno_sc_prl_160924_161019_jm0004a00_v01.bc", - kernels .. "/juno_sc_prl_161014_161115_jm0005a00_v01.bc", - kernels .. "/juno_sc_prl_161022_161115_jm0005b00_v01.bc", - kernels .. "/juno_sc_prl_161115_161213_jx0405rp_v01.bc", - kernels .. "/juno_sc_prl_161210_170115_jm0031a00_v01.bc", - kernels .. "/juno_sc_prl_170115_170201_jm0032a00_v01.bc", - kernels .. "/juno_sc_prl_170201_170309_jm0041a00_v01.bc", - kernels .. "/juno_sc_prl_170309_170326_jm0042rp_v01.bc", - kernels .. "/juno_sc_prl_170326_170427_jm0051rp_v01.bc", - kernels .. "/juno_sc_prl_170427_170518_jm0052rp_v01.bc", - kernels .. "/juno_sc_prl_170518_170615_jm0061a00_v01.bc", - kernels .. "/juno_sc_prl_170615_170710_jm0062a00_v01.bc", - kernels .. "/juno_sc_prl_170710_170805_jm0071a00_v01.bc", - kernels .. "/juno_sc_prl_170805_170831_jm0072a00_v01.bc", - kernels .. "/juno_sc_prl_170831_170927_jm0081a00_v01.bc", - kernels .. "/juno_sc_prl_170927_171023_jm0082a00_v01.bc", - kernels .. "/juno_sc_prl_171023_171030_jm0091a00_v01.bc", - kernels .. "/juno_sc_prl_171023_171030_jm0091a00_v01.bc" -} - -local RotationMatrix = { - 0, 1, 0, - 0, 0, 1, - 1, 0, 0 -} - -local Juno = { - Identifier = "Juno", - Parent = transforms.JupiterBarycenter.Identifier, - Transform = { - Translation = { - Type = "SpiceTranslation", - Target = "JUNO", - Observer = "JUPITER BARYCENTER", - Kernels = JunoKernels - }, - Rotation = { - Type = "SpiceRotation", - SourceFrame = "JUNO_SPACECRAFT", - DestinationFrame = "GALACTIC", - Kernels = JunoKernels - } - }, - Renderable = { - Type = "RenderableModel", - Geometry = { - Type = "MultiModelGeometry", - GeometryFile = model .. "/Juno.obj" - }, - ColorTexture = textures .. "/gray.png", - ModelTransform = RotationMatrix, - LightSources = assetHelper.getDefaultLightSources(sunTransforms.SolarSystemBarycenter.Identifier) - }, - TimeFrame = { - Type = "TimeFrameInterval", - Start = "2011-08-07T17:15:00", - End = "2017-10-16T19:29:24" - }, - GUI = { - Path = "/Solar System/Missions/Juno" - } -} - -local JunoTrail = { - Identifier = "JunoTrail", - Parent = transforms.JupiterBarycenter.Identifier, - Renderable = { - Type = "RenderableTrailTrajectory", - Translation = { - Type = "SpiceTranslation", - Target = "JUNO", - Observer = "JUPITER BARYCENTER", - Kernels = JunoKernels - }, - Color = { 0.70, 0.50, 0.20 }, - StartTime = "2016 JUL 01", - EndTime = "2016 DEC 13", - SampleInterval = 2 - }, - GUI = { - Name = "Juno Trail", - Path = "/Solar System/Missions/Juno" - } -} - - - -assetHelper.registerSceneGraphNodesAndExport(asset, { Juno, JunoTrail }) diff --git a/data/assets/scene/solarsystem/missions/messenger/mercurymagnetosphere.asset b/data/assets/scene/solarsystem/missions/messenger/mercurymagnetosphere.asset deleted file mode 100644 index 9a8713faf6..0000000000 --- a/data/assets/scene/solarsystem/missions/messenger/mercurymagnetosphere.asset +++ /dev/null @@ -1,59 +0,0 @@ --- mercurymagnetosphere.asset - -local assetHelper = asset.require('util/asset_helper') - -local localFolder = asset.syncedResource({ - Name = "Mercury Magnetosphere", - Type = "HttpSynchronization", - Identifier = "mercury_magnetosphere", - Version = 1 -}) - - -local MercuryRadius = 2.4397E6 - -local Magnetosphere = { - Name = "Mercury Magnetosphere", - Identifier = "MercuryMagnetosphere", - Parent = "MercuryBarycenter", - SceneRadius = 0.8E+5, - Renderable = { - Type = "RenderableTimeVaryingVolume", - SourceDirectory = localFolder, - TransferFunction = localFolder .. "/transferfunction.txt", - Variable = "rho", - StepSize = "0.003", - Dimensions = {64, 64, 64}, - GridType = "Cartesian", - SecondsBefore = 24*60*60*365*100, - SecondsAfter = 24*60*60*365*100, - Enabled = false - }, - Transform = { - Translation = { - Type = "SpiceTranslation", - Target = "MERCURY", - Observer = "MERCURY BARYCENTER", - }, - Rotation = { - Type = "SpiceRotation", - SourceFrame = "MERCURYSE", - DestinationFrame = "GALACTIC", - Kernels = { - localFolder .. "/openspace_mercury.ti" - } - }, - Scale = { - Type = "StaticScale", - Scale = MercuryRadius, - }, - }, - GUI = { - Name = "Mercury Magnetosphere", - Path = "/Solar System/Missions/Messenger" - } -} - -assetHelper.registerSceneGraphNodesAndExport(asset, { - Magnetosphere -}) diff --git a/data/assets/scene/solarsystem/missions/messenger/messengerSC.asset b/data/assets/scene/solarsystem/missions/messenger/messengerSC.asset deleted file mode 100644 index 70861f014e..0000000000 --- a/data/assets/scene/solarsystem/missions/messenger/messengerSC.asset +++ /dev/null @@ -1,220 +0,0 @@ -local assetHelper = asset.require('util/asset_helper') -local sunTransforms = asset.require('scene/solarsystem/sun/transforms') -local mercuryTransforms = asset.require('scene/solarsystem/planets/mercury/transforms') - - -local models = asset.syncedResource({ - Name = "Messenger Models", - Type = "HttpSynchronization", - Identifier = "messenger_model", - Version = 1 -}) - -local kernels = asset.syncedResource({ - Name = "Messenger Kernels", - Type = "HttpSynchronization", - Identifier = "messenger_spice", - Version = 2 -}) - - -local LocalKernels = { - kernels .. '/messenger_2548.tsc', - kernels .. '/msgr_v231.tf', - - kernels .. '/de405.bsp', - kernels .. '/msgr_040803_150430_150430_od431sc_2.bsp', - kernels .. '/msgr_antenna_v000.bsp', - kernels .. '/msgr_de405_de423s.bsp', - - kernels .. '/msgr_epps_v100.ti', - kernels .. '/msgr_grns_v110.ti', - kernels .. '/msgr_mag_v021.ti', - kernels .. '/msgr_mascs_v100.ti', - kernels .. '/msgr_mdis_v160.ti', - kernels .. '/msgr_mla_v010.ti', - kernels .. '/msgr_rs_v111.ti', - kernels .. '/msgr_xrs_v001.ti', - - - kernels .. '/pck00008.tpc', - kernels .. '/pck00008_msgr.tpc', - kernels .. '/pck00009_msgr_v10.tpc', - kernels .. '/pck00010_msgr_v10.tpc', - kernels .. '/pck00010_msgr_v23.tpc', - kernels .. '/pck00010.tpc', - - kernels .. '/msgr_1103_v02.bc', - kernels .. '/msgr_1104_v02.bc', - kernels .. '/msgr_1105_v02.bc', - kernels .. '/msgr_1106_v02.bc', -} - - -local RotationMatrix = { - 1, 0, 0, - 0, 0, -1, - 0, 1, 0 -} - - -local LightSources = assetHelper.getDefaultLightSources(sunTransforms.SolarSystemBarycenter.Identifier) - -local Messenger = { - Identifier = "Messenger", - Parent = sunTransforms.SolarSystemBarycenter.Identifier, - Transform = { - Translation = { - Type = "SpiceTranslation", - Target = "MESSENGER", - Observer = "SUN", - Kernels = LocalKernels - }, - Rotation = { - Type = "SpiceRotation", - SourceFrame = "MSGR_SPACECRAFT", - DestinationFrame = "GALACTIC", - }, - }, - TimeFrame = { - Type = "TimeFrameInterval", - Start = "2011-03-01", - End = "2011-06-30" - }, - GUI = { - Name = "Messenger", - Path = "/Solar System/Missions/Messenger" - } -} - -local MessengerProbeBlack = { - Identifier = "MessengerProbe_black", - Parent = Messenger.Identifier, - Renderable = { - Type = "RenderableModel", - Geometry = { - Type = "MultiModelGeometry", - GeometryFile = models .. "/MessengerProbe_black.obj" - }, - ColorTexture = models .. "/Tex_black.png", - ModelTransform = RotationMatrix, - LightSources = LightSources - }, - GUI = { - Name = "MessengerProbe Black", - Path = "/Solar System/Missions/Messenger" - } -} - -local MessengerProbeFoil = { - Identifier = "MessengerProbe_foil", - Parent = Messenger.Identifier, - Renderable = { - Type = "RenderableModel", - Geometry = { - Type = "MultiModelGeometry", - GeometryFile = models .. "/MessengerProbe_foil.obj" - }, - ColorTexture = models .. "/foil_n2.png", - ModelTransform = RotationMatrix, - LightSources = LightSources - }, - GUI = { - Name = "MessengerProbe foil", - Path = "/Solar System/Missions/Messenger" - } -} - -local MessengerProbeHeatShield = { - Identifier = "MessengerProbe_heatShield", - Parent = Messenger.Identifier, - Renderable = { - Type = "RenderableModel", - Geometry = { - Type = "MultiModelGeometry", - GeometryFile = models .. "/MessengerProbe_heatShield.obj" - }, - ColorTexture = models .. "/AO_heatshield4.png", - ModelTransform = RotationMatrix, - LightSources = LightSources - }, - GUI = { - Name = "MessengerProbe Heat Sheild", - Path = "/Solar System/Missions/Messenger" - } -} - -local MessengerProbeMetal = { - Identifier = "MessengerProbe_Metal", - Parent = Messenger.Identifier, - Renderable = { - Type = "RenderableModel", - Geometry = { - Type = "MultiModelGeometry", - GeometryFile = models .. "/MessengerProbe_metal.obj" - }, - ColorTexture = models .. "/Tex_grey.png", - ModelTransform = RotationMatrix, - LightSources = LightSources - }, - GUI = { - Name = "MessengerProbe Metal", - Path = "/Solar System/Missions/Messenger" - } -} - - -local MessengerProbePanels = { - Identifier = "MessengerProbe_panels", - Parent = Messenger.Identifier, - Renderable = { - Type = "RenderableModel", - Geometry = { - Type = "MultiModelGeometry", - GeometryFile = models .. "/MessengerProbe_panels.obj" - }, - ColorTexture = models .. "/Messenger_tex.png", - ModelTransform = RotationMatrix, - LightSources = LightSources - }, - GUI = { - Name = "MessengerProbe Panels", - Path = "/Solar System/Missions/Messenger" - } -} - -local MessengerTrail = { - Identifier = "MessengerTrail", - Parent = mercuryTransforms.MercuryBarycenter.Identifier, - Renderable = { - Type = "RenderableTrailOrbit", - Translation = { - Type = "SpiceTranslation", - Target = "MESSENGER", - Observer = "MERCURY BARYCENTER", - Kernels = Kernels - }, - Color = { 0.288, 0.375, 0.934 }, - EnableFade = false, - StartTime = "2011 MARCH 01 12:00:00", - EndTime = "2011 MAY 30 12:00:00", - Period = 12, - Resolution = 10000 - - }, - GUI = { - Name = "Messenger Trail", - Path = "/Solar System/Missions/Messenger" - } -} - - -assetHelper.registerSceneGraphNodesAndExport(asset, { - Messenger, - MessengerProbeBlack, - MessengerProbeFoil, - MessengerProbeHeatShield, - MessengerProbeMetal, - MessengerProbePanels, - MessengerTrail -}) diff --git a/data/assets/scene/solarsystem/missions/messenger/openspace_mercury.ti b/data/assets/scene/solarsystem/missions/messenger/openspace_mercury.ti deleted file mode 100644 index 218f8c3ec2..0000000000 --- a/data/assets/scene/solarsystem/missions/messenger/openspace_mercury.ti +++ /dev/null @@ -1,33 +0,0 @@ -OpenSpace ecliptic frames: -Mercury-centric Solar Ecliptic (MERCURYSE) frame - -These frames are only defined as helper frames for OpenSpace. - - +X is parallel to the geometric planet-sun position vector. - - -Y axis is the normalized component of the planet's orbital vector - - +Z axis is parallel to the cross product of the frame's +X axis - and the frame's +Y axis. - -\begindata - - FRAME_MERCURYSE = 4600199 - FRAME_4600199_NAME = 'MERCURYSE' - FRAME_4600199_CLASS = 5 - FRAME_4600199_CLASS_ID = 4600199 - FRAME_4600199_CENTER = 199 - FRAME_4600199_RELATIVE = 'J2000' - FRAME_4600199_DEF_STYLE = 'PARAMETERIZED' - FRAME_4600199_FAMILY = 'TWO-VECTOR' - FRAME_4600199_PRI_AXIS = 'X' - FRAME_4600199_PRI_VECTOR_DEF = 'OBSERVER_TARGET_POSITION' - FRAME_4600199_PRI_OBSERVER = 'MERCURY' - FRAME_4600199_PRI_TARGET = 'SUN' - FRAME_4600199_PRI_ABCORR = 'NONE' - FRAME_4600199_SEC_AXIS = 'Y' - FRAME_4600199_SEC_VECTOR_DEF = 'OBSERVER_TARGET_VELOCITY' - FRAME_4600199_SEC_OBSERVER = 'MERCURY' - FRAME_4600199_SEC_TARGET = 'SUN' - FRAME_4600199_SEC_ABCORR = 'NONE' - FRAME_4600199_SEC_FRAME = 'J2000' diff --git a/data/assets/scene/solarsystem/missions/messenger/transferfunction.txt b/data/assets/scene/solarsystem/missions/messenger/transferfunction.txt deleted file mode 100644 index 7174117a1e..0000000000 --- a/data/assets/scene/solarsystem/missions/messenger/transferfunction.txt +++ /dev/null @@ -1,8 +0,0 @@ -width 1024 -lower 0.0 -upper 0.1 -mappingkey 0.0 255 0 0 0 -mappingkey 0.01 255 0 0 0 -mappingkey 0.1 255 255 0 100 - -mappingkey 0.5 255 255 0 255 \ No newline at end of file diff --git a/data/assets/scene/solarsystem/missions/newhorizons/charon.asset b/data/assets/scene/solarsystem/missions/newhorizons/charon.asset deleted file mode 100644 index 3929571670..0000000000 --- a/data/assets/scene/solarsystem/missions/newhorizons/charon.asset +++ /dev/null @@ -1,120 +0,0 @@ -local assetHelper = asset.require('util/asset_helper') -local transforms = asset.require('./transforms') -local sunTransforms = asset.require('scene/solarsystem/sun/transforms') - - - -local textures = asset.syncedResource({ - Name = "Charon Textures", - Type = "HttpSynchronization", - Identifier = "charon_textures", - Version = 3 -}) - -local charonRadius = 6.035E5 - -local CharonProjection = { - Identifier = "CharonProjection", - Parent = transforms.PlutoBarycenterAccurate.Identifier, - Transform = { - Translation = { - Type = "SpiceTranslation", - Target = "CHARON", - Observer = "PLUTO BARYCENTER" - }, - Rotation = { - Type = "SpiceRotation", - SourceFrame = "IAU_CHARON", - DestinationFrame = "GALACTIC" - } - }, - Renderable = { - Type = "RenderablePlanetProjection", - Geometry = { - Type = "SimpleSphere", - Radius = charonRadius, - Segments = 350 - }, - ColorTexturePaths = { - textures .. "/NH_Charon_mosaic.png", - textures .. "/NH_Charon_mosaic_8192.png" - }, - HeightTexturePaths = { - textures .. "/NH_Charon_DTM.png", - textures .. "/NH_Charon_DTM_8192.png" - }, - MeridianShift = true, - Projection = { - Observer = "NEW HORIZONS", - Target = "CHARON", - Aberration = "NONE", - AspectRatio = 2, - - Instrument = { - Name = "NH_LORRI", - Method = "ELLIPSOID", - Aberration = "NONE", - Fovy = 0.2907, - Aspect = 1, - Near = 0.2, - Far = 10000 - }, - - PotentialTargets = { - "PLUTO", - "CHARON" - } - } - }, - GUI = { - Path = "/Solar System/Dwarf Planets/Pluto", - Name = "Charon Projection" - } -} - -local CharonText = { - Identifier = "CharonText", - Parent = CharonProjection.Identifier, - Transform = { - Translation = { - Type = "StaticTranslation", - Position = {0, -1000000.0, 0} - } - }, - Renderable = { - Type = "RenderablePlaneImageLocal", - Size = 10^6.3, - Origin = "Center", - Billboard = true, - Texture = textures .. "/Charon-Text.png", - BlendMode = "Additive" - }, - GUI = { - Name = "Charon Text", - Path = "/Solar System/Dwarf Planets/Pluto" - } -} - -local CharonShadow = { - Identifier = "CharonShadow", - Parent = CharonProjection .Identifier, - Renderable = { - Type = "RenderableShadowCylinder", - TerminatorType = "PENUMBRAL", - LightSource = "SUN", - Observer = "NEW HORIZONS", - Body = "CHARON", - BodyFrame = "IAU_CHARON", - Aberration = "NONE" - }, - GUI = { - Name = "Charon Shadow", - Path = "/Solar System/Dwarf Planets/Pluto" - } -} - -assetHelper.registerSceneGraphNodesAndExport(asset, { - CharonProjection, - CharonText, - CharonShadow -}) diff --git a/data/assets/scene/solarsystem/missions/newhorizons/fov.asset b/data/assets/scene/solarsystem/missions/newhorizons/fov.asset deleted file mode 100644 index 45c7f7ba7e..0000000000 --- a/data/assets/scene/solarsystem/missions/newhorizons/fov.asset +++ /dev/null @@ -1,386 +0,0 @@ -local assetHelper = asset.require('util/asset_helper') -local transforms = asset.require('./transforms') - - - -local LorriOffset = { -6.626, -4.1, -3.23 } -local RalphOffset = { -6.9, -4.6, 8.7 } -local AliceOffset = { -7.9, -1.7, 8.3 } -local RexOffset = { 0, 0, 0 } - -local Lorri = { - Identifier = "NH_LORRI", - Parent = transforms.NewHorizonsPosition.Identifier, - Renderable = { - Type = "RenderableFov", - Body = "NEW HORIZONS", - Frame = "NH_SPACECRAFT", - Color = { 0.8, 0.7, 0.7 }, - Instrument = { - Name = "NH_LORRI", - Aberration = "NONE" - }, - PotentialTargets = { - "Pluto", - "Charon", - -- "Jupiter", "Io", "Europa", "Ganymede", "Callisto" - } - }, - Transform = { - Translation = { - Type = "StaticTranslation", - Position = LorriOffset - } - }, - GUI = { - Name = "LORRI", - Path = "/Solar System/Missions/New Horizons/Instruments" - } -} - -local RalphLeisa = { - Identifier = "NH_RALPH_LEISA", - Parent = transforms.NewHorizonsPosition.Identifier, - Renderable = { - Type = "RenderableFov", - Body = "NEW HORIZONS", - Frame = "NH_SPACECRAFT", - RGB = { 0.8, 0.7, 0.7 }, - Instrument = { - Name = "NH_RALPH_LEISA", - Aberration = "NONE" - }, - PotentialTargets = { - "Pluto", - "Charon", - -- "Jupiter", "Io", "Europa", "Ganymede", "Callisto" - } - }, - Transform = { - Translation = { - Type = "StaticTranslation", - Position = RalphOffset - } - }, - GUI = { - Name = "RALPH LEISA", - Path = "/Solar System/Missions/New Horizons/Instruments" - } -} - -local RalphMvicPan1 = { - Identifier = "NH_RALPH_MVIC_PAN1", - Parent = transforms.NewHorizonsPosition.Identifier, - Renderable = { - Type = "RenderableFov", - Body = "NEW HORIZONS", - Frame = "NH_SPACECRAFT", - RGB = { 0.8, 0.7, 0.7 }, - Instrument = { - Name = "NH_RALPH_MVIC_PAN1", - Aberration = "NONE" - }, - PotentialTargets = { - "Pluto", - "Charon", - -- "Jupiter", "Io", "Europa", "Ganymede", "Callisto" - } - }, - Transform = { - Translation = { - Type = "StaticTranslation", - Position = RalphOffset - } - }, - GUI = { - Name = "RALPH MVIC PAN 1", - Path = "/Solar System/Missions/New Horizons/Instruments" - } -} - -local RalphMvicPan2 = { - Identifier = "NH_RALPH_MVIC_PAN2", - Parent = transforms.NewHorizonsPosition.Identifier, - Renderable = { - Type = "RenderableFov", - Body = "NEW HORIZONS", - Frame = "NH_SPACECRAFT", - RGB = { 0.8, 0.7, 0.7 }, - Instrument = { - Name = "NH_RALPH_MVIC_PAN2", - Aberration = "NONE" - }, - PotentialTargets = { - "Pluto", - "Charon", - -- "Jupiter", "Io", "Europa", "Ganymede", "Callisto" - } - }, - Transform = { - Translation = { - Type = "StaticTranslation", - Position = RalphOffset - } - }, - GUI = { - Name = "RALPH MVIC PAN 2", - Path = "/Solar System/Missions/New Horizons/Instruments" - } -} - -local RalphMvicRed = { - Identifier = "NH_RALPH_MVIC_RED", - Parent = transforms.NewHorizonsPosition.Identifier, - Renderable = { - Type = "RenderableFov", - Body = "NEW HORIZONS", - Frame = "NH_SPACECRAFT", - RGB = { 0.8, 0.7, 0.7 }, - Instrument = { - Name = "NH_RALPH_MVIC_RED", - Aberration = "NONE" - }, - PotentialTargets = { - "Pluto", - "Charon", - -- "Jupiter", "Io", "Europa", "Ganymede", "Callisto" - } - }, - Transform = { - Translation = { - Type = "StaticTranslation", - Position = RalphOffset - } - }, - GUI = { - Name = "RALPH MVIC RED", - Path = "/Solar System/Missions/New Horizons/Instruments" - } -} - -local RalphMvicBlue = { - Identifier = "NH_RALPH_MVIC_BLUE", - Parent = transforms.NewHorizonsPosition.Identifier, - Renderable = { - Type = "RenderableFov", - Body = "NEW HORIZONS", - Frame = "NH_SPACECRAFT", - RGB = { 0.8, 0.7, 0.7 }, - Instrument = { - Name = "NH_RALPH_MVIC_BLUE", - Aberration = "NONE" - }, - PotentialTargets = { - "Pluto", - "Charon", - -- "Jupiter", "Io", "Europa", "Ganymede", "Callisto" - } - }, - Transform = { - Translation = { - Type = "StaticTranslation", - Position = RalphOffset - } - }, - GUI = { - Name = "RALPH MVIC BLUE", - Path = "/Solar System/Missions/New Horizons/Instruments" - } -} - -local RalphMvicFt = { - Identifier = "NH_RALPH_MVIC_FT", - Parent = transforms.NewHorizonsPosition.Identifier, - Renderable = { - Type = "RenderableFov", - Body = "NEW HORIZONS", - Frame = "NH_SPACECRAFT", - RGB = { 0.8, 0.7, 0.7 }, - Instrument = { - Name = "NH_RALPH_MVIC_FT", - Aberration = "NONE" - }, - PotentialTargets = { - "Pluto", - "Charon", - -- "Jupiter", "Io", "Europa", "Ganymede", "Callisto" - } - }, - Transform = { - Translation = { - Type = "StaticTranslation", - Position = RalphOffset - } - }, - GUI = { - Name = "RALPH MVIC FT", - Path = "/Solar System/Missions/New Horizons/Instruments" - } -} - -local RalphMvicMethane = { - Identifier = "NH_RALPH_MVIC_METHANE", - Parent = transforms.NewHorizonsPosition.Identifier, - Renderable = { - Type = "RenderableFov", - Body = "NEW HORIZONS", - Frame = "NH_SPACECRAFT", - RGB = { 0.8, 0.7, 0.7 }, - Instrument = { - Name = "NH_RALPH_MVIC_METHANE", - Aberration = "NONE" - }, - PotentialTargets = { - "Pluto", - "Charon", - -- "Jupiter", "Io", "Europa", "Ganymede", "Callisto" - } - }, - Transform = { - Translation = { - Type = "StaticTranslation", - Position = RalphOffset - } - }, - GUI = { - Name = "RALPH MVIC METHANE", - Path = "/Solar System/Missions/New Horizons/Instruments" - } -} - -local RalphMvicNir = { - Identifier = "NH_RALPH_MVIC_NIR", - Parent = transforms.NewHorizonsPosition.Identifier, - Renderable = { - Type = "RenderableFov", - Body = "NEW HORIZONS", - Frame = "NH_SPACECRAFT", - RGB = { 0.8, 0.7, 0.7 }, - Instrument = { - Name = "NH_RALPH_MVIC_NIR", - Aberration = "NONE" - }, - PotentialTargets = { - "Pluto", - "Charon", - -- "Jupiter", "Io", "Europa", "Ganymede", "Callisto" - } - }, - Transform = { - Translation = { - Type = "StaticTranslation", - Position = RalphOffset - } - }, - GUI = { - Name = "RALPH MVIC NIR", - Path = "/Solar System/Missions/New Horizons/Instruments" - } -} - -local AliceAirglow = { - Identifier = "NH_ALICE_AIRGLOW", - Parent = transforms.NewHorizonsPosition.Identifier, - Renderable = { - Type = "RenderableFov", - Body = "NEW HORIZONS", - Frame = "NH_SPACECRAFT", - RGB = { 0.8, 0.7, 0.7 }, - Instrument = { - Name = "NH_ALICE_AIRGLOW", - Aberration = "NONE" - }, - PotentialTargets = { - "Pluto", - "Charon", - -- "Jupiter", "Io", "Europa", "Ganymede", "Callisto" - }, - SimplifyBounds = true - }, - Transform = { - Translation = { - Type = "StaticTranslation", - Position = AliceOffset - } - }, - GUI = { - Name = "ALICE AIRGLOW", - Path = "/Solar System/Missions/New Horizons/Instruments" - } -} - -local AliceSoc = { - Identifier = "NH_ALICE_SOC", - Parent = transforms.NewHorizonsPosition.Identifier, - Renderable = { - Type = "RenderableFov", - Body = "NEW HORIZONS", - Frame = "NH_SPACECRAFT", - RGB = { 0.8, 0.7, 0.7 }, - Instrument = { - Name = "NH_ALICE_SOC", - Aberration = "NONE" - }, - PotentialTargets = { - "Pluto", - "Charon", - -- "Jupiter", "Io", "Europa", "Ganymede", "Callisto" - } - }, - Transform = { - Translation = { - Type = "StaticTranslation", - Position = AliceOffset - } - }, - GUI = { - Name = "ALICE SOC", - Path = "/Solar System/Missions/New Horizons/Instruments" - } -} - -local Rex = { - Identifier = "NH_REX", - Parent = transforms.NewHorizonsPosition.Identifier, - Renderable = { - Type = "RenderableCrawlingLine", - Source = "NH_REX", - Target = "EARTH", - Instrument = "NH_REX", - Color = { - Start = { 1.0, 0.7, 0.0, 1.0}, - End = {0.0, 0.0, 0.0, 0.0 } - } - }, - Transform = { - Rotation = { - Type = "StaticRotation", - Rotation = {-3.141502/2, 0, -3.141502/2} - }, - Translation = { - Type = "StaticTranslation", - Position = RexOffset - } - }, - GUI = { - Name = "REX", - Path = "/Solar System/Missions/New Horizons/Instruments" - } -} - - - -assetHelper.registerSceneGraphNodesAndExport(asset, { - Lorri, - RalphLeisa, - RalphMvicPan1, - RalphMvicPan2, - RalphMvicRed, - RalphMvicBlue, - RalphMvicFt, - RalphMvicMethane, - RalphMvicNir, - AliceAirglow, - AliceSoc, - Rex -}) diff --git a/data/assets/scene/solarsystem/missions/newhorizons/kernels.asset b/data/assets/scene/solarsystem/missions/newhorizons/kernels.asset deleted file mode 100644 index ed6816032b..0000000000 --- a/data/assets/scene/solarsystem/missions/newhorizons/kernels.asset +++ /dev/null @@ -1,48 +0,0 @@ -local Kernels = asset.syncedResource({ - Name = "New Horizons Kernels", - Type = "HttpSynchronization", - Identifier = "newhorizons_kernels", - Version = 1 -}) - -local NewHorizonsKernels = { - Kernels .. "/nh_pred_20141201_20190301_od122.bsp", - Kernels .. "/NavSE_plu047_od122.bsp", - Kernels .. "/NavPE_de433_od122.bsp", - - Kernels .. "/new-horizons_1121.tsc", - - Kernels .. "/nh_scispi_2015_pred.bc", - Kernels .. "/nh_scispi_2015_recon.bc", - Kernels .. "/nh_lorri_wcs.bc", - - Kernels .. "/PLU_LORRI_ALL_161216.bc", - - Kernels .. "/nh_targets_v001.tpc", - Kernels .. "/nh_pcnh_005.tpc", - - Kernels .. "/nh_v220.tf", - Kernels .. "/nh_allinstruments_v002.ti", - Kernels .. "/nh_alice_v200.ti", - Kernels .. "/nh_lorri_v201.ti", - Kernels .. "/nh_pepssi_v110.ti", - Kernels .. "/nh_ralph_v100.ti", - Kernels .. "/nh_rex_v100.ti", - Kernels .. "/nh_sdc_v101.ti", - Kernels .. "/nh_swap_v100.ti", - Kernels .. "/nh_astr_v000.ti", - Kernels .. "/nh_fss_v000.ti", - Kernels .. "/nh_soc_misc_v001.tf", - Kernels .. "/nh_stars.bsp", -} - -local PlutoKernels = { - Kernels .. "/NavPE_de433_od122.bsp", - Kernels .. "/NavSE_plu047_od122.bsp" -} - - - -asset.export("Kernels", Kernels) -asset.export("NewHorizonsKernels", NewHorizonsKernels) -asset.export("PlutoKernels", PlutoKernels) diff --git a/data/assets/scene/solarsystem/missions/newhorizons/label.asset b/data/assets/scene/solarsystem/missions/newhorizons/label.asset deleted file mode 100644 index 8353a01be9..0000000000 --- a/data/assets/scene/solarsystem/missions/newhorizons/label.asset +++ /dev/null @@ -1,31 +0,0 @@ -local assetHelper = asset.require('util/asset_helper') -local sunTransforms = asset.require('scene/solarsystem/sun/transforms') -local transforms = asset.require('./transforms') -local NewHorizonsModel = asset.require('./model') - - - -local textures = NewHorizonsModel.NewHorizonsTextures -local models = NewHorizonsModel.NewHorizonsModels - -local Labels = { - Identifier = "Labels", - Parent = NewHorizonsModel.NewHorizons.Identifier, - Renderable = { - Type = "RenderableModel", - Body = "NEW HORIZONS", - Geometry = { - Type = "MultiModelGeometry", - GeometryFile = models .. "/Labels.obj" - }, - ColorTexture = textures .. "/labels.png", - AmbientIntensity = 0.8 - }, - GUI = { - Path = "/Solar System/Missions/New Horizons" - } -} - - - -assetHelper.registerSceneGraphNodesAndExport(asset, { Labels }) diff --git a/data/assets/scene/solarsystem/missions/newhorizons/model.asset b/data/assets/scene/solarsystem/missions/newhorizons/model.asset deleted file mode 100644 index 57b6d401d8..0000000000 --- a/data/assets/scene/solarsystem/missions/newhorizons/model.asset +++ /dev/null @@ -1,57 +0,0 @@ -local assetHelper = asset.require('util/asset_helper') -local transforms = asset.require('./transforms') -local sunTransforms = asset.require('scene/solarsystem/sun/transforms') - -local textures = asset.syncedResource({ - Name = "New Horizons Textures", - Type = "HttpSynchronization", - Identifier = "newhorizons_textures", - Version = 3 -}) - -local models = asset.syncedResource({ - Name = "New Horizons Model", - Type = "HttpSynchronization", - Identifier = "newhorizons_model", - Version = 1 -}) - -local NewHorizons = { - Identifier = "NewHorizons", - Parent = transforms.NewHorizonsPosition.Identifier, - Renderable = { - Type = "RenderableModel", - Body = "NEW HORIZONS", - Geometry = { - Type = "MultiModelGeometry", - GeometryFile = models .. "/NewHorizonsCleanModel.obj" - }, - ColorTexture = textures .. "/NHTexture.jpg", - AmbientIntensity = 0.0, - DiffuseIntensity = 1.0, - SpecularIntensity = 1.0, - LightSources = { - { - Type = "SceneGraphLightSource", - Identifier = "Sun", - Node = sunTransforms.SolarSystemBarycenter.Identifier, - Intensity = 1.0 - }, - { - Identifier = "Camera", - Type = "CameraLightSource", - Intensity = 0.5 - } - } - }, - GUI = { - Name = "New Horizons", - Path = "/Solar System/Missions/New Horizons" - } -} - - - -assetHelper.registerSceneGraphNodesAndExport(asset, { NewHorizons }) -asset.export("NewHorizonsTextures", textures) -asset.export("NewHorizonsModels", models) diff --git a/data/assets/scene/solarsystem/missions/newhorizons/newhorizons.asset b/data/assets/scene/solarsystem/missions/newhorizons/newhorizons.asset deleted file mode 100644 index cf35bc01c1..0000000000 --- a/data/assets/scene/solarsystem/missions/newhorizons/newhorizons.asset +++ /dev/null @@ -1,20 +0,0 @@ -asset.require('./model') -asset.require('./label') -asset.require('./fov') -asset.require('./trail') - -asset.require('./pluto') -asset.require('./charon') - -asset.require('./othermoons') - -local mission = asset.localResource("newhorizons.mission") -local missionName - -asset.onInitialize(function() - missionName = openspace.loadMission(mission) -end) - -asset.onDeinitialize(function() - openspace.unloadMission(missionName) -end) diff --git a/data/assets/scene/solarsystem/missions/newhorizons/newhorizons.mission b/data/assets/scene/solarsystem/missions/newhorizons/newhorizons.mission deleted file mode 100644 index 66923f4cc0..0000000000 --- a/data/assets/scene/solarsystem/missions/newhorizons/newhorizons.mission +++ /dev/null @@ -1,122 +0,0 @@ --- Source: http://pluto.jhuapl.edu/Mission/index.php --- Many of the values (especially days of the month if 01 or 30 or 31 and hh::mm::ss if all 0) --- are approximate and need fixing - -return { - Name = "New Horizons", - Phases = { - { - Name = "Cruise Phase", - TimeRange = { Start = "2006 JAN 19 00:00:00", End = "2015 JAN 15 00:00:00" }, - Phases = { - { - Name = "Jupiter fly-by", - TimeRange = { Start = "2007 FEB 28 00:00:00", End = "2007 FEB 28 23:59:59" } - }, - { - Name = "Annual checkout 1", - TimeRange = { Start = "2007 SEP 01 00:00:00", End = "2007 NOV 30 00:00:00" } - }, - { - Name = "Annual checkout 2", - TimeRange = { Start = "2008 JUL 01 00:00:00", End = "2008 AUG 31 00:00:00" } - }, - { - Name = "Annual checkout 3", - TimeRange = { Start = "2009 JUL 01 00:00:00", End = "2009 AUG 31 00:00:00" } - }, - { - Name = "Annual checkout 4", - TimeRange = { Start = "2010 MAY 01 00:00:00", End = "2010 JUL 31 00:00:00" } - }, - { - Name = "Annual checkout 5", - TimeRange = { Start = "2011 MAY 01 00:00:00", End = "2011 JUL 31 00:00:00" } - }, - { - Name = "Annual checkout 6", - TimeRange = { Start = "2012 MAY 01 00:00:00", End = "2012 JUL 31 00:00:00" } - }, - { - Name = "Annual checkout 7", - TimeRange = { Start = "2013 MAY 01 00:00:00", End = "2013 AUG 31 00:00:00" } - }, - { - Name = "Annual checkout 8 and Optical Navigation campaign 1", - TimeRange = { Start = "2014 JUN 01 00:00:00", End = "2014 AUG 31 00:00:00" } - }, - { - Name = "Final Wakeup from Hibernation", - TimeRange = { Start = "2014 DEC 06 00:00:00", End = "2014 DEC 06 23:59:59" } - } - } - }, - { - Name = "Pluto Encounter/Approach Phase 1", - TimeRange = { Start = "2015 JAN 15 00:00:00", End = "2015 APR 01 00:00:00" }, - Phases = { - { - Name = "Optical nagivation campaign 2", - TimeRange = { Start = "2015 JAN 25 00:00:00", End = "2015 APR 01 00:00:00" } - } - } - }, - { - Name = "Pluto Encounter/Approach Phase 2", - TimeRange = { Start = "2015 APR 01 00:00:00", End = "2015 JUN 01 00:00:00" }, - Phases = { - { - Name = "Best-ever images of Pluto", - TimeRange = { Start = "2015 MAY 01 00:00:00", End = "2015 JUN 01 00:00:00" } - } - } - }, - { - Name = "Pluto Encounter/Approach Phase 3", - TimeRange = { Start = "2015 JUN 01 00:00:00", End = "2015 JUL 15 00:00:00" }, - Phases = { - { - Name = "Closest approach to Pluto", - TimeRange = { Start = "2015 JUL 14 11:49:57", End = "2015 JUL 14 11:49:58" } - }, - { - Name = "Closest approach to Charon", - TimeRange = { Start = "2015 JUL 14 12:03:50", End = "2015 JUL 14 12:03:51" } - }, - { - Name = "Pluto-Sun Occultation", - TimeRange = { Start = "2015 JUL 14 12:51:25", End = "2015 JUL 14 12:52:00" } - }, - { - Name = "Pluto-Earth Occultation", - TimeRange = { Start = "2015 JUL 14 12:52:27", End = "2015 JUL 14 12:53:00" } - }, - { - Name = "Charon-Sun Occultation", - TimeRange = { Start = "2015 JUL 14 14:17:40", End = "2015 JUL 14 14:18:00" } - }, - { - Name = "Charon-Earth Occultation", - TimeRange = { Start = "2015 JUL 14 14:20:00", End = "2015 JUL 14 14:21:00" } - } - } - }, - { - Name = "Departure Phase 1", - TimeRange = { Start = "2015 JUL 15 00:00:00", End = "2015 AUG 01 00:00:00" } - }, - { - Name = "Departure Phase 2", - TimeRange = { Start = "2015 AUG 01 00:00:00", End = "2015 OCT 01 00:00:00" } - }, - { - Name = "Departure Phase 3", - TimeRange = { Start = "2015 OCT 01 00:00:00", End = "2016 JAN 01 00:00:00" } - }, - { - Name = "Data Playback Ends", - TimeRange = { Start = "2016 OCT 01 00:00:00", End = "2016 DEC 01 00:00:00" } - } - } -} - diff --git a/data/assets/scene/solarsystem/missions/newhorizons/othermoons.asset b/data/assets/scene/solarsystem/missions/newhorizons/othermoons.asset deleted file mode 100644 index 010e8bc9cf..0000000000 --- a/data/assets/scene/solarsystem/missions/newhorizons/othermoons.asset +++ /dev/null @@ -1,126 +0,0 @@ -local Hydra = asset.require('scene/solarsystem/dwarf_planets/pluto/hydra') -local Kerberos = asset.require('scene/solarsystem/dwarf_planets/pluto/kerberos') -local Nix = asset.require('scene/solarsystem/dwarf_planets/pluto/nix') -local Styx = asset.require('scene/solarsystem/dwarf_planets/pluto/styx') -local assetHelper = asset.require('util/asset_helper') - -local hydraTextures = asset.syncedResource({ - Name = "Hydra Textures", - Type = "HttpSynchronization", - Identifier = "hydra_textures", - Version = 1 -}) - -local HydraText = { - Identifier = "HydraText", - Parent = Hydra.Hydra.Identifier, - Transform = { - Translation = { - Type = "StaticTranslation", - Position = { 1000000, 0, 1000000 }, - }, - }, - Renderable = { - Type = "RenderablePlaneImageLocal", - Size = 10.0^6.3, - Origin = "Center", - Billboard = true, - Texture = hydraTextures .. "/Hydra-Text.png", - BlendMode = "Additive" - }, - GUI = { - Name = "Hydra Text", - Path = "/Solar System/Dwarf Planets/Pluto" - } -} - -local kerberosTextures = asset.syncedResource({ - Name = "Kerberos Textures", - Type = "HttpSynchronization", - Identifier = "kerberos_textures", - Version = 1 -}) - -local KerberosText = { - Identifier = "KerberosText", - Parent = Kerberos.Kerberos.Identifier, - Transform = { - Translation = { - Type = "StaticTranslation", - Position = { 1000000.0, 0, 1000000.0 } - }, - }, - Renderable = { - Type = "RenderablePlaneImageLocal", - Size = 10^6.3, - Origin = "Center", - Billboard = true, - Texture = kerberosTextures .. "/Kerberos-Text.png", - BlendMode = "Additive" - }, - GUI = { - Name = "Kerberos Text", - Path = "/Solar System/Dwarf Planets/Pluto" - } -} - -local nixTextures = asset.syncedResource({ - Name = "Nix Textures", - Type = "HttpSynchronization", - Identifier = "nix_textures", - Version = 1 -}) - -local NixText = { - Identifier = "NixText", - Parent = Nix.Nix.Identifier, - Renderable = { - Type = "RenderablePlaneImageLocal", - Size = 10^6.3, - Origin = "Center", - Billboard = true, - Texture = nixTextures .. "/Nix-Text.png", - BlendMode = "Additive" - }, - GUI = { - Name = "Nix Text", - Path = "/Solar System/Dwarf Planets/Pluto" - } -} - -local styxTextures = asset.syncedResource({ - Name = "Styx Textures", - Type = "HttpSynchronization", - Identifier = "styx_textures", - Version = 1 -}) - -local StyxText = { - Identifier = "StyxText", - Parent = Styx.Styx.Identifier, - Transform = { - Translation = { - Type = "StaticTranslation", - Position = { 1000000.0, 0, 1000000.0 } - }, - }, - Renderable = { - Type = "RenderablePlaneImageLocal", - Size = 10^6.3, - Origin = "Center", - Billboard = true, - Texture = styxTextures .. "/Styx-Text.png", - BlendMode = "Additive" - }, - GUI = { - Name = "Styx Text", - Path = "/Solar System/Dwarf Planets/Pluto" - } -} - -assetHelper.registerSceneGraphNodesAndExport(asset, { - HydraText, - KerberosText, - NixText, - StyxText -}) diff --git a/data/assets/scene/solarsystem/missions/newhorizons/pluto.asset b/data/assets/scene/solarsystem/missions/newhorizons/pluto.asset deleted file mode 100644 index ec93de4ff5..0000000000 --- a/data/assets/scene/solarsystem/missions/newhorizons/pluto.asset +++ /dev/null @@ -1,251 +0,0 @@ -local assetHelper = asset.require('util/asset_helper') -local transforms = asset.require('./transforms') -local sunTransforms = asset.require('scene/solarsystem/sun/transforms') - -local assets = asset.syncedResource({ - Name = "Pluto Assets", - Type = "HttpSynchronization", - Identifier = "newhorizons_plutoencounter_pluto_assets", - Version = 1 -}) - -local encounterTextures = asset.syncedResource({ - Name = "Pluto Encounter Textures", - Type = "HttpSynchronization", - Identifier = "newhorizons_plutoencounter_pluto_textures", - Version = 4 -}) - -local textures = asset.syncedResource({ - Name = "Pluto Textures", - Type = "HttpSynchronization", - Identifier = "pluto_textures", - Version = 5 -}) - -local images = asset.syncedResource({ - Name = "Pluto Images", - Type = "HttpSynchronization", - Identifier = "newhorizons_plutoencounter_pluto_images", - Version = 1 -}) - -local plutoRadius = 1.173E6 - -local PlutoProjection = { - Identifier = "PlutoProjection", - Parent = transforms.PlutoBarycenterAccurate.Identifier, - Transform = { - Translation = { - Type = "SpiceTranslation", - Target = "PLUTO", - Observer = "PLUTO BARYCENTER", - Kernels = NewHorizonsKernels - }, - Rotation = { - Type = "SpiceRotation", - SourceFrame = "IAU_PLUTO", - DestinationFrame = "GALACTIC" - }, - Scale = { - Type = "StaticScale", - Scale = 1.0 - } - }, - Renderable = { - Type = "RenderablePlanetProjection", - Radius = plutoRadius, - Geometry = { - Type = "SimpleSphere", - Radius = plutoRadius, - Segments = 400 - }, - ColorTexturePaths = { - textures .. "/pluto.png", - textures .. "/NH_Pluto_mosaic_16384.png", - textures .. "/NH_Pluto_mosaic_8192.png", - textures .. "/pmap_cyl_k201.jpg", - textures .. "/pmap_cyl_k201_4096.jpg" - }, - HeightTexturePaths = { - textures .. "/NH_Pluto_DTM_16384.png", - textures .. "/NH_Pluto_DTM_8192.png" - }, - MeridianShift = false, - Projection = { - Sequence = images, - EventFile = assets .. "/core_v9h_obs_getmets_v8_time_fix_nofrcd_mld.txt", - -- SequenceType = "hybrid", - SequenceType = "image-sequence", - Observer = "NEW HORIZONS", - Target = "PLUTO", - Aberration = "NONE", - AspectRatio = 2, - - DataInputTranslation = { - Instrument = { - LORRI = { - DetectorType = "Camera", - Spice = { "NH_LORRI" } - }, - RALPH_MVIC_PAN_FRAME = { - DetectorType = "Scanner", - StopCommand = "RALPH_ABORT", - Spice = { "NH_RALPH_MVIC_FT" } - }, - RALPH_MVIC_COLOR = { - DetectorType = "Scanner", - StopCommand = "END_NOM", - Spice = { "NH_RALPH_MVIC_NIR", - "NH_RALPH_MVIC_METHANE", - "NH_RALPH_MVIC_RED", - "NH_RALPH_MVIC_BLUE" } - }, - RALPH_LEISA = { - DetectorType = "Scanner", - StopCommand = "END_NOM", - Spice = { "NH_RALPH_LEISA" } - }, - RALPH_MVIC_PAN1 = { - DetectorType = "Scanner", - StopCommand = "END_NOM", - Spice = { "NH_RALPH_MVIC_PAN1" } - }, - RALPH_MVIC_PAN2 = { - DetectorType = "Scanner", - StopCommand = "END_NOM", - Spice = { "NH_RALPH_MVIC_PAN2" } - }, - ALICE_Use_AIRGLOW = { - DetectorType = "Scanner", - StopCommand = "ALICE_END_PIXELLIST", - Spice = { "NH_ALICE_AIRGLOW" } - }, - ALICE_Use_AIRGLOW = { - DetectorType = "Scanner", - StopCommand = "ALICE_END_HISTOGRAM", - Spice = { "NH_ALICE_AIRGLOW" } - }, - ALICE_Use_SOCC = { - DetectorType = "Scanner", - StopCommand = "ALICE_END_PIXELLIST", - Spice = { "NH_ALICE_SOC" } - }, - ALICE_Use_SOCC = { - DetectorType = "Scanner", - StopCommand = "ALICE_END_HISTOGRAM", - Spice = { "NH_ALICE_SOC" } - }, - REX_START = { - DetectorType = "Scanner", - StopCommand = "REX_MODE_OFF", - Spice = { "NH_REX" } - } - }, - Target ={ - Read = { - "TARGET_NAME", - "INSTRUMENT_HOST_NAME", - "INSTRUMENT_ID", - "START_TIME", - "STOP_TIME", - "DETECTOR_TYPE" - }, - Convert = { - PLUTO = { "PLUTO" }, - NEWHORIZONS = { "NEW HORIZONS" }, - CCD = { "CAMERA" }, - FRAMECCD = { "SCANNER" } - } - } - }, - - Instrument = { - Name = "NH_LORRI", - Method = "ELLIPSOID", - Aberration = "NONE", - Fovy = 0.2907, - Aspect = 1, - Near = 0.2, - Far = 10000 - }, - - PotentialTargets = { - "PLUTO", - "CHARON", - "NIX", - "HYDRA", - "P5", - "P4" - } - } - }, - GUI = { - Name = "Pluto Projection", - Path = "/Solar System/Dwarf Planets/Pluto" - } -} - -local PlutoBarycenterLabel = { - Identifier = "PlutoBarycenterLabel", - Parent = transforms.PlutoBarycenterAccurate.Identifier, - Renderable = { - Type = "RenderablePlaneImageLocal", - Billboard = true, - Size = 5E4, - Texture = encounterTextures .. "/barycenter.png", - BlendMode = "Additive" - }, - GUI = { - Name = "Pluto Barycenter Label", - Path = "/Solar System/Dwarf Planets/Pluto" - } -} - -local PlutoText = { - Identifier = "PlutoText", - Parent = PlutoProjection.Identifier, - Transform = { - Translation = { - Type = "StaticTranslation", - Position = {0, -2000000.0, 0} - }, - }, - Renderable = { - Type = "RenderablePlaneImageLocal", - Size = 10^6.3, - Origin = "Center", - Billboard = true, - Texture = encounterTextures .. "/Pluto-Text.png", - BlendMode = "Additive" - }, - GUI = { - Name = "Pluto Text", - Path = "/Solar System/Dwarf Planets/Pluto" - } -} - -local PlutoShadow = { - Identifier = "PlutoShadow", - Parent = PlutoProjection.Identifier, - Renderable = { - Type = "RenderableShadowCylinder", - TerminatorType = "PENUMBRAL", - LightSource = "SUN", - Observer = "NEW HORIZONS", - Body = "PLUTO", - BodyFrame = "IAU_PLUTO", - Aberration = "NONE", - }, - GUI = { - Name = "Pluto Shadow", - Path = "/Solar System/Dwarf Planets/Pluto" - } -} - -assetHelper.registerSceneGraphNodesAndExport(asset, { - PlutoProjection, - PlutoBarycenterLabel, - PlutoText, - PlutoShadow -}) diff --git a/data/assets/scene/solarsystem/missions/newhorizons/trail.asset b/data/assets/scene/solarsystem/missions/newhorizons/trail.asset deleted file mode 100644 index 9ebb30c5d6..0000000000 --- a/data/assets/scene/solarsystem/missions/newhorizons/trail.asset +++ /dev/null @@ -1,36 +0,0 @@ -local assetHelper = asset.require('util/asset_helper') -local transforms = asset.require('./transforms') - - - -local TrailAtPluto = { - Identifier = "NewHorizonsTrailPluto", - Parent = transforms.PlutoBarycenterAccurate.Identifier, - Renderable = { - Type = "RenderableTrailTrajectory", - Translation = { - Type = "SpiceTranslation", - Target = "NEW HORIZONS", - Observer = "PLUTO BARYCENTER" - }, - Color = { 1.0, 0.8, 0.4 }, - ShowFullTrail = true, - StartTime = "2015 JUL 07 12:00:00", - EndTime = "2015 JUL 17 12:00:00", - PointSize = 5, - SampleInterval = 3600, - TimeStampSubsampleFactor = 4, - EnableFade = false, - Rendering = "Lines+Points" - }, - GUI = { - Name = "New Horizons Trail Pluto", - Path = "/Solar System/Missions/New Horizons" - } -} - - - -assetHelper.registerSceneGraphNodesAndExport(asset, { - TrailAtPluto -}) diff --git a/data/assets/scene/solarsystem/missions/newhorizons/transforms.asset b/data/assets/scene/solarsystem/missions/newhorizons/transforms.asset deleted file mode 100644 index 2ce8b47f00..0000000000 --- a/data/assets/scene/solarsystem/missions/newhorizons/transforms.asset +++ /dev/null @@ -1,54 +0,0 @@ -local assetHelper = asset.require('util/asset_helper') -local sunTransforms = asset.require('scene/solarsystem/sun/transforms') -local kernels = asset.require('./kernels') - -local PlutoBarycenterAccurate = { - Identifier = "PlutoBarycenterAccurate", - Parent = sunTransforms.SolarSystemBarycenter.Identifier, - TimeFrame = { - Type = "TimeFrameInterval", - Start = "2015-JAN-01", - End = "2015-AUG-01" - }, - Transform = { - Translation = { - Type = "SpiceTranslation", - Target = "PLUTO BARYCENTER", - Observer = "SUN", - Kernels = kernels.PlutoKernels - }, - }, - GUI = { - Name = "Pluto Barycenter Accurate", - Path = "/Solar System/Dwarf Planets/Pluto" - } -} - -local NewHorizonsPosition = { - Identifier = "NewHorizonsPosition", - Parent = PlutoBarycenterAccurate.Identifier, - Transform = { - Translation = { - Type = "SpiceTranslation", - Target = "NEW HORIZONS", - Observer = "PLUTO BARYCENTER", - Kernels = kernels.NewHorizonsKernels - }, - Rotation = { - Type = "SpiceRotation", - SourceFrame = "NH_SPACECRAFT", - DestinationFrame = "GALACTIC" - } - }, - GUI = { - Name = "New Horizons Position", - Path = "/Solar System/Missions/New Horizons" - } -} - - - -assetHelper.registerSceneGraphNodesAndExport(asset, { - PlutoBarycenterAccurate, - NewHorizonsPosition -}) diff --git a/data/assets/scene/solarsystem/missions/osirisrex/InstrumentTimes/BaseballDiamond_PolyCam.txt b/data/assets/scene/solarsystem/missions/osirisrex/InstrumentTimes/BaseballDiamond_PolyCam.txt deleted file mode 100644 index 343ab46e51..0000000000 --- a/data/assets/scene/solarsystem/missions/osirisrex/InstrumentTimes/BaseballDiamond_PolyCam.txt +++ /dev/null @@ -1,2640 +0,0 @@ -stk.v.10.0 -BEGIN IntervalList -DateUnitAbrv yyyy/mm/dd -BEGIN Intervals - -"2019/01/13 19:18:29.750" "2019/01/13 19:18:29.950" -"2019/01/13 19:18:41.750" "2019/01/13 19:18:41.950" -"2019/01/13 19:18:53.750" "2019/01/13 19:18:53.950" -"2019/01/13 19:19:05.750" "2019/01/13 19:19:05.950" -"2019/01/13 19:19:17.750" "2019/01/13 19:19:17.950" -"2019/01/13 19:19:29.750" "2019/01/13 19:19:29.950" -"2019/01/13 19:19:41.750" "2019/01/13 19:19:41.950" -"2019/01/13 19:19:53.750" "2019/01/13 19:19:53.950" -"2019/01/13 19:20:05.750" "2019/01/13 19:20:05.950" -"2019/01/13 19:20:17.750" "2019/01/13 19:20:17.950" -"2019/01/13 19:20:29.750" "2019/01/13 19:20:29.950" -"2019/01/13 19:20:41.750" "2019/01/13 19:20:41.950" -"2019/01/13 19:20:53.750" "2019/01/13 19:20:53.950" -"2019/01/13 19:21:05.750" "2019/01/13 19:21:05.950" -"2019/01/13 19:21:46.500" "2019/01/13 19:21:46.700" -"2019/01/13 19:21:58.500" "2019/01/13 19:21:58.700" -"2019/01/13 19:22:10.500" "2019/01/13 19:22:10.700" -"2019/01/13 19:22:22.500" "2019/01/13 19:22:22.700" -"2019/01/13 19:22:34.500" "2019/01/13 19:22:34.700" -"2019/01/13 19:22:46.500" "2019/01/13 19:22:46.700" -"2019/01/13 19:22:58.500" "2019/01/13 19:22:58.700" -"2019/01/13 19:23:10.500" "2019/01/13 19:23:10.700" -"2019/01/13 19:23:22.500" "2019/01/13 19:23:22.700" -"2019/01/13 19:23:34.500" "2019/01/13 19:23:34.700" -"2019/01/13 19:23:46.500" "2019/01/13 19:23:46.700" -"2019/01/13 19:23:58.500" "2019/01/13 19:23:58.700" -"2019/01/13 19:24:10.500" "2019/01/13 19:24:10.700" -"2019/01/13 19:24:22.500" "2019/01/13 19:24:22.700" -"2019/01/13 19:29:37.250" "2019/01/13 19:29:37.450" -"2019/01/13 19:29:49.250" "2019/01/13 19:29:49.450" -"2019/01/13 19:30:01.250" "2019/01/13 19:30:01.450" -"2019/01/13 19:30:13.250" "2019/01/13 19:30:13.450" -"2019/01/13 19:30:25.250" "2019/01/13 19:30:25.450" -"2019/01/13 19:30:37.250" "2019/01/13 19:30:37.450" -"2019/01/13 19:30:49.250" "2019/01/13 19:30:49.450" -"2019/01/13 19:31:01.250" "2019/01/13 19:31:01.450" -"2019/01/13 19:31:13.250" "2019/01/13 19:31:13.450" -"2019/01/13 19:31:25.250" "2019/01/13 19:31:25.450" -"2019/01/13 19:31:37.250" "2019/01/13 19:31:37.450" -"2019/01/13 19:31:49.250" "2019/01/13 19:31:49.450" -"2019/01/13 19:32:01.250" "2019/01/13 19:32:01.450" -"2019/01/13 19:32:13.250" "2019/01/13 19:32:13.450" -"2019/01/13 19:32:54.000" "2019/01/13 19:32:54.200" -"2019/01/13 19:33:06.000" "2019/01/13 19:33:06.200" -"2019/01/13 19:33:18.000" "2019/01/13 19:33:18.200" -"2019/01/13 19:33:30.000" "2019/01/13 19:33:30.200" -"2019/01/13 19:33:42.000" "2019/01/13 19:33:42.200" -"2019/01/13 19:33:54.000" "2019/01/13 19:33:54.200" -"2019/01/13 19:34:06.000" "2019/01/13 19:34:06.200" -"2019/01/13 19:34:18.000" "2019/01/13 19:34:18.200" -"2019/01/13 19:34:30.000" "2019/01/13 19:34:30.200" -"2019/01/13 19:34:42.000" "2019/01/13 19:34:42.200" -"2019/01/13 19:34:54.000" "2019/01/13 19:34:54.200" -"2019/01/13 19:35:06.000" "2019/01/13 19:35:06.200" -"2019/01/13 19:35:18.000" "2019/01/13 19:35:18.200" -"2019/01/13 19:35:30.000" "2019/01/13 19:35:30.200" -"2019/01/13 19:40:44.750" "2019/01/13 19:40:44.950" -"2019/01/13 19:40:56.750" "2019/01/13 19:40:56.950" -"2019/01/13 19:41:08.750" "2019/01/13 19:41:08.950" -"2019/01/13 19:41:20.750" "2019/01/13 19:41:20.950" -"2019/01/13 19:41:32.750" "2019/01/13 19:41:32.950" -"2019/01/13 19:41:44.750" "2019/01/13 19:41:44.950" -"2019/01/13 19:41:56.750" "2019/01/13 19:41:56.950" -"2019/01/13 19:42:08.750" "2019/01/13 19:42:08.950" -"2019/01/13 19:42:20.750" "2019/01/13 19:42:20.950" -"2019/01/13 19:42:32.750" "2019/01/13 19:42:32.950" -"2019/01/13 19:42:44.750" "2019/01/13 19:42:44.950" -"2019/01/13 19:42:56.750" "2019/01/13 19:42:56.950" -"2019/01/13 19:43:08.750" "2019/01/13 19:43:08.950" -"2019/01/13 19:43:20.750" "2019/01/13 19:43:20.950" -"2019/01/13 19:44:00.500" "2019/01/13 19:44:00.700" -"2019/01/13 19:44:12.500" "2019/01/13 19:44:12.700" -"2019/01/13 19:44:24.500" "2019/01/13 19:44:24.700" -"2019/01/13 19:44:36.500" "2019/01/13 19:44:36.700" -"2019/01/13 19:44:48.500" "2019/01/13 19:44:48.700" -"2019/01/13 19:45:00.500" "2019/01/13 19:45:00.700" -"2019/01/13 19:45:12.500" "2019/01/13 19:45:12.700" -"2019/01/13 19:45:24.500" "2019/01/13 19:45:24.700" -"2019/01/13 19:45:36.500" "2019/01/13 19:45:36.700" -"2019/01/13 19:45:48.500" "2019/01/13 19:45:48.700" -"2019/01/13 19:46:00.500" "2019/01/13 19:46:00.700" -"2019/01/13 19:46:12.500" "2019/01/13 19:46:12.700" -"2019/01/13 19:46:24.500" "2019/01/13 19:46:24.700" -"2019/01/13 19:46:36.500" "2019/01/13 19:46:36.700" -"2019/01/13 19:51:51.250" "2019/01/13 19:51:51.450" -"2019/01/13 19:52:03.250" "2019/01/13 19:52:03.450" -"2019/01/13 19:52:15.250" "2019/01/13 19:52:15.450" -"2019/01/13 19:52:27.250" "2019/01/13 19:52:27.450" -"2019/01/13 19:52:39.250" "2019/01/13 19:52:39.450" -"2019/01/13 19:52:51.250" "2019/01/13 19:52:51.450" -"2019/01/13 19:53:03.250" "2019/01/13 19:53:03.450" -"2019/01/13 19:53:15.250" "2019/01/13 19:53:15.450" -"2019/01/13 19:53:27.250" "2019/01/13 19:53:27.450" -"2019/01/13 19:53:39.250" "2019/01/13 19:53:39.450" -"2019/01/13 19:53:51.250" "2019/01/13 19:53:51.450" -"2019/01/13 19:54:03.250" "2019/01/13 19:54:03.450" -"2019/01/13 19:54:15.250" "2019/01/13 19:54:15.450" -"2019/01/13 19:54:27.250" "2019/01/13 19:54:27.450" -"2019/01/13 19:55:07.000" "2019/01/13 19:55:07.200" -"2019/01/13 19:55:19.000" "2019/01/13 19:55:19.200" -"2019/01/13 19:55:31.000" "2019/01/13 19:55:31.200" -"2019/01/13 19:55:43.000" "2019/01/13 19:55:43.200" -"2019/01/13 19:55:55.000" "2019/01/13 19:55:55.200" -"2019/01/13 19:56:07.000" "2019/01/13 19:56:07.200" -"2019/01/13 19:56:19.000" "2019/01/13 19:56:19.200" -"2019/01/13 19:56:31.000" "2019/01/13 19:56:31.200" -"2019/01/13 19:56:43.000" "2019/01/13 19:56:43.200" -"2019/01/13 19:56:55.000" "2019/01/13 19:56:55.200" -"2019/01/13 19:57:07.000" "2019/01/13 19:57:07.200" -"2019/01/13 19:57:19.000" "2019/01/13 19:57:19.200" -"2019/01/13 19:57:31.000" "2019/01/13 19:57:31.200" -"2019/01/13 19:57:43.000" "2019/01/13 19:57:43.200" -"2019/01/13 20:02:57.750" "2019/01/13 20:02:57.950" -"2019/01/13 20:03:09.750" "2019/01/13 20:03:09.950" -"2019/01/13 20:03:21.750" "2019/01/13 20:03:21.950" -"2019/01/13 20:03:33.750" "2019/01/13 20:03:33.950" -"2019/01/13 20:03:45.750" "2019/01/13 20:03:45.950" -"2019/01/13 20:03:57.750" "2019/01/13 20:03:57.950" -"2019/01/13 20:04:09.750" "2019/01/13 20:04:09.950" -"2019/01/13 20:04:21.750" "2019/01/13 20:04:21.950" -"2019/01/13 20:04:33.750" "2019/01/13 20:04:33.950" -"2019/01/13 20:04:45.750" "2019/01/13 20:04:45.950" -"2019/01/13 20:04:57.750" "2019/01/13 20:04:57.950" -"2019/01/13 20:05:09.750" "2019/01/13 20:05:09.950" -"2019/01/13 20:05:21.750" "2019/01/13 20:05:21.950" -"2019/01/13 20:05:33.750" "2019/01/13 20:05:33.950" -"2019/01/13 20:06:13.500" "2019/01/13 20:06:13.700" -"2019/01/13 20:06:25.500" "2019/01/13 20:06:25.700" -"2019/01/13 20:06:37.500" "2019/01/13 20:06:37.700" -"2019/01/13 20:06:49.500" "2019/01/13 20:06:49.700" -"2019/01/13 20:07:01.500" "2019/01/13 20:07:01.700" -"2019/01/13 20:07:13.500" "2019/01/13 20:07:13.700" -"2019/01/13 20:07:25.500" "2019/01/13 20:07:25.700" -"2019/01/13 20:07:37.500" "2019/01/13 20:07:37.700" -"2019/01/13 20:07:49.500" "2019/01/13 20:07:49.700" -"2019/01/13 20:08:01.500" "2019/01/13 20:08:01.700" -"2019/01/13 20:08:13.500" "2019/01/13 20:08:13.700" -"2019/01/13 20:08:25.500" "2019/01/13 20:08:25.700" -"2019/01/13 20:08:37.500" "2019/01/13 20:08:37.700" -"2019/01/13 20:08:49.500" "2019/01/13 20:08:49.700" -"2019/01/13 20:14:04.250" "2019/01/13 20:14:04.450" -"2019/01/13 20:14:16.250" "2019/01/13 20:14:16.450" -"2019/01/13 20:14:28.250" "2019/01/13 20:14:28.450" -"2019/01/13 20:14:40.250" "2019/01/13 20:14:40.450" -"2019/01/13 20:14:52.250" "2019/01/13 20:14:52.450" -"2019/01/13 20:15:04.250" "2019/01/13 20:15:04.450" -"2019/01/13 20:15:16.250" "2019/01/13 20:15:16.450" -"2019/01/13 20:15:28.250" "2019/01/13 20:15:28.450" -"2019/01/13 20:15:40.250" "2019/01/13 20:15:40.450" -"2019/01/13 20:15:52.250" "2019/01/13 20:15:52.450" -"2019/01/13 20:16:04.250" "2019/01/13 20:16:04.450" -"2019/01/13 20:16:16.250" "2019/01/13 20:16:16.450" -"2019/01/13 20:16:28.250" "2019/01/13 20:16:28.450" -"2019/01/13 20:16:40.250" "2019/01/13 20:16:40.450" -"2019/01/13 20:17:20.000" "2019/01/13 20:17:20.200" -"2019/01/13 20:17:32.000" "2019/01/13 20:17:32.200" -"2019/01/13 20:17:44.000" "2019/01/13 20:17:44.200" -"2019/01/13 20:17:56.000" "2019/01/13 20:17:56.200" -"2019/01/13 20:18:08.000" "2019/01/13 20:18:08.200" -"2019/01/13 20:18:20.000" "2019/01/13 20:18:20.200" -"2019/01/13 20:18:32.000" "2019/01/13 20:18:32.200" -"2019/01/13 20:18:44.000" "2019/01/13 20:18:44.200" -"2019/01/13 20:18:56.000" "2019/01/13 20:18:56.200" -"2019/01/13 20:19:08.000" "2019/01/13 20:19:08.200" -"2019/01/13 20:19:20.000" "2019/01/13 20:19:20.200" -"2019/01/13 20:19:32.000" "2019/01/13 20:19:32.200" -"2019/01/13 20:19:44.000" "2019/01/13 20:19:44.200" -"2019/01/13 20:19:56.000" "2019/01/13 20:19:56.200" -"2019/01/13 20:25:10.750" "2019/01/13 20:25:10.950" -"2019/01/13 20:25:22.750" "2019/01/13 20:25:22.950" -"2019/01/13 20:25:34.750" "2019/01/13 20:25:34.950" -"2019/01/13 20:25:46.750" "2019/01/13 20:25:46.950" -"2019/01/13 20:25:58.750" "2019/01/13 20:25:58.950" -"2019/01/13 20:26:10.750" "2019/01/13 20:26:10.950" -"2019/01/13 20:26:22.750" "2019/01/13 20:26:22.950" -"2019/01/13 20:26:34.750" "2019/01/13 20:26:34.950" -"2019/01/13 20:26:46.750" "2019/01/13 20:26:46.950" -"2019/01/13 20:26:58.750" "2019/01/13 20:26:58.950" -"2019/01/13 20:27:10.750" "2019/01/13 20:27:10.950" -"2019/01/13 20:27:22.750" "2019/01/13 20:27:22.950" -"2019/01/13 20:27:34.750" "2019/01/13 20:27:34.950" -"2019/01/13 20:27:46.750" "2019/01/13 20:27:46.950" -"2019/01/13 20:28:26.500" "2019/01/13 20:28:26.700" -"2019/01/13 20:28:38.500" "2019/01/13 20:28:38.700" -"2019/01/13 20:28:50.500" "2019/01/13 20:28:50.700" -"2019/01/13 20:29:02.500" "2019/01/13 20:29:02.700" -"2019/01/13 20:29:14.500" "2019/01/13 20:29:14.700" -"2019/01/13 20:29:26.500" "2019/01/13 20:29:26.700" -"2019/01/13 20:29:38.500" "2019/01/13 20:29:38.700" -"2019/01/13 20:29:50.500" "2019/01/13 20:29:50.700" -"2019/01/13 20:30:02.500" "2019/01/13 20:30:02.700" -"2019/01/13 20:30:14.500" "2019/01/13 20:30:14.700" -"2019/01/13 20:30:26.500" "2019/01/13 20:30:26.700" -"2019/01/13 20:30:38.500" "2019/01/13 20:30:38.700" -"2019/01/13 20:30:50.500" "2019/01/13 20:30:50.700" -"2019/01/13 20:31:02.500" "2019/01/13 20:31:02.700" -"2019/01/13 20:36:16.250" "2019/01/13 20:36:16.450" -"2019/01/13 20:36:28.250" "2019/01/13 20:36:28.450" -"2019/01/13 20:36:40.250" "2019/01/13 20:36:40.450" -"2019/01/13 20:36:52.250" "2019/01/13 20:36:52.450" -"2019/01/13 20:37:04.250" "2019/01/13 20:37:04.450" -"2019/01/13 20:37:16.250" "2019/01/13 20:37:16.450" -"2019/01/13 20:37:28.250" "2019/01/13 20:37:28.450" -"2019/01/13 20:37:40.250" "2019/01/13 20:37:40.450" -"2019/01/13 20:37:52.250" "2019/01/13 20:37:52.450" -"2019/01/13 20:38:04.250" "2019/01/13 20:38:04.450" -"2019/01/13 20:38:16.250" "2019/01/13 20:38:16.450" -"2019/01/13 20:38:28.250" "2019/01/13 20:38:28.450" -"2019/01/13 20:38:40.250" "2019/01/13 20:38:40.450" -"2019/01/13 20:38:52.250" "2019/01/13 20:38:52.450" -"2019/01/13 20:39:32.000" "2019/01/13 20:39:32.200" -"2019/01/13 20:39:44.000" "2019/01/13 20:39:44.200" -"2019/01/13 20:39:56.000" "2019/01/13 20:39:56.200" -"2019/01/13 20:40:08.000" "2019/01/13 20:40:08.200" -"2019/01/13 20:40:20.000" "2019/01/13 20:40:20.200" -"2019/01/13 20:40:32.000" "2019/01/13 20:40:32.200" -"2019/01/13 20:40:44.000" "2019/01/13 20:40:44.200" -"2019/01/13 20:40:56.000" "2019/01/13 20:40:56.200" -"2019/01/13 20:41:08.000" "2019/01/13 20:41:08.200" -"2019/01/13 20:41:20.000" "2019/01/13 20:41:20.200" -"2019/01/13 20:41:32.000" "2019/01/13 20:41:32.200" -"2019/01/13 20:41:44.000" "2019/01/13 20:41:44.200" -"2019/01/13 20:41:56.000" "2019/01/13 20:41:56.200" -"2019/01/13 20:42:08.000" "2019/01/13 20:42:08.200" -"2019/01/13 20:47:21.750" "2019/01/13 20:47:21.950" -"2019/01/13 20:47:33.750" "2019/01/13 20:47:33.950" -"2019/01/13 20:47:45.750" "2019/01/13 20:47:45.950" -"2019/01/13 20:47:57.750" "2019/01/13 20:47:57.950" -"2019/01/13 20:48:09.750" "2019/01/13 20:48:09.950" -"2019/01/13 20:48:21.750" "2019/01/13 20:48:21.950" -"2019/01/13 20:48:33.750" "2019/01/13 20:48:33.950" -"2019/01/13 20:48:45.750" "2019/01/13 20:48:45.950" -"2019/01/13 20:48:57.750" "2019/01/13 20:48:57.950" -"2019/01/13 20:49:09.750" "2019/01/13 20:49:09.950" -"2019/01/13 20:49:21.750" "2019/01/13 20:49:21.950" -"2019/01/13 20:49:33.750" "2019/01/13 20:49:33.950" -"2019/01/13 20:49:45.750" "2019/01/13 20:49:45.950" -"2019/01/13 20:49:57.750" "2019/01/13 20:49:57.950" -"2019/01/13 20:50:37.500" "2019/01/13 20:50:37.700" -"2019/01/13 20:50:49.500" "2019/01/13 20:50:49.700" -"2019/01/13 20:51:01.500" "2019/01/13 20:51:01.700" -"2019/01/13 20:51:13.500" "2019/01/13 20:51:13.700" -"2019/01/13 20:51:25.500" "2019/01/13 20:51:25.700" -"2019/01/13 20:51:37.500" "2019/01/13 20:51:37.700" -"2019/01/13 20:51:49.500" "2019/01/13 20:51:49.700" -"2019/01/13 20:52:01.500" "2019/01/13 20:52:01.700" -"2019/01/13 20:52:13.500" "2019/01/13 20:52:13.700" -"2019/01/13 20:52:25.500" "2019/01/13 20:52:25.700" -"2019/01/13 20:52:37.500" "2019/01/13 20:52:37.700" -"2019/01/13 20:52:49.500" "2019/01/13 20:52:49.700" -"2019/01/13 20:53:01.500" "2019/01/13 20:53:01.700" -"2019/01/13 20:53:13.500" "2019/01/13 20:53:13.700" -"2019/01/13 20:58:27.250" "2019/01/13 20:58:27.450" -"2019/01/13 20:58:39.250" "2019/01/13 20:58:39.450" -"2019/01/13 20:58:51.250" "2019/01/13 20:58:51.450" -"2019/01/13 20:59:03.250" "2019/01/13 20:59:03.450" -"2019/01/13 20:59:15.250" "2019/01/13 20:59:15.450" -"2019/01/13 20:59:27.250" "2019/01/13 20:59:27.450" -"2019/01/13 20:59:39.250" "2019/01/13 20:59:39.450" -"2019/01/13 20:59:51.250" "2019/01/13 20:59:51.450" -"2019/01/13 21:00:03.250" "2019/01/13 21:00:03.450" -"2019/01/13 21:00:15.250" "2019/01/13 21:00:15.450" -"2019/01/13 21:00:27.250" "2019/01/13 21:00:27.450" -"2019/01/13 21:00:39.250" "2019/01/13 21:00:39.450" -"2019/01/13 21:00:51.250" "2019/01/13 21:00:51.450" -"2019/01/13 21:01:03.250" "2019/01/13 21:01:03.450" -"2019/01/13 21:01:43.000" "2019/01/13 21:01:43.200" -"2019/01/13 21:01:55.000" "2019/01/13 21:01:55.200" -"2019/01/13 21:02:07.000" "2019/01/13 21:02:07.200" -"2019/01/13 21:02:19.000" "2019/01/13 21:02:19.200" -"2019/01/13 21:02:31.000" "2019/01/13 21:02:31.200" -"2019/01/13 21:02:43.000" "2019/01/13 21:02:43.200" -"2019/01/13 21:02:55.000" "2019/01/13 21:02:55.200" -"2019/01/13 21:03:07.000" "2019/01/13 21:03:07.200" -"2019/01/13 21:03:19.000" "2019/01/13 21:03:19.200" -"2019/01/13 21:03:31.000" "2019/01/13 21:03:31.200" -"2019/01/13 21:03:43.000" "2019/01/13 21:03:43.200" -"2019/01/13 21:03:55.000" "2019/01/13 21:03:55.200" -"2019/01/13 21:04:07.000" "2019/01/13 21:04:07.200" -"2019/01/13 21:04:19.000" "2019/01/13 21:04:19.200" -"2019/01/13 21:09:32.750" "2019/01/13 21:09:32.950" -"2019/01/13 21:09:44.750" "2019/01/13 21:09:44.950" -"2019/01/13 21:09:56.750" "2019/01/13 21:09:56.950" -"2019/01/13 21:10:08.750" "2019/01/13 21:10:08.950" -"2019/01/13 21:10:20.750" "2019/01/13 21:10:20.950" -"2019/01/13 21:10:32.750" "2019/01/13 21:10:32.950" -"2019/01/13 21:10:44.750" "2019/01/13 21:10:44.950" -"2019/01/13 21:10:56.750" "2019/01/13 21:10:56.950" -"2019/01/13 21:11:08.750" "2019/01/13 21:11:08.950" -"2019/01/13 21:11:20.750" "2019/01/13 21:11:20.950" -"2019/01/13 21:11:32.750" "2019/01/13 21:11:32.950" -"2019/01/13 21:11:44.750" "2019/01/13 21:11:44.950" -"2019/01/13 21:11:56.750" "2019/01/13 21:11:56.950" -"2019/01/13 21:12:08.750" "2019/01/13 21:12:08.950" -"2019/01/13 21:12:47.500" "2019/01/13 21:12:47.700" -"2019/01/13 21:12:59.500" "2019/01/13 21:12:59.700" -"2019/01/13 21:13:11.500" "2019/01/13 21:13:11.700" -"2019/01/13 21:13:23.500" "2019/01/13 21:13:23.700" -"2019/01/13 21:13:35.500" "2019/01/13 21:13:35.700" -"2019/01/13 21:13:47.500" "2019/01/13 21:13:47.700" -"2019/01/13 21:13:59.500" "2019/01/13 21:13:59.700" -"2019/01/13 21:14:11.500" "2019/01/13 21:14:11.700" -"2019/01/13 21:14:23.500" "2019/01/13 21:14:23.700" -"2019/01/13 21:14:35.500" "2019/01/13 21:14:35.700" -"2019/01/13 21:14:47.500" "2019/01/13 21:14:47.700" -"2019/01/13 21:14:59.500" "2019/01/13 21:14:59.700" -"2019/01/13 21:15:11.500" "2019/01/13 21:15:11.700" -"2019/01/13 21:15:23.500" "2019/01/13 21:15:23.700" -"2019/01/13 21:20:37.250" "2019/01/13 21:20:37.450" -"2019/01/13 21:20:49.250" "2019/01/13 21:20:49.450" -"2019/01/13 21:21:01.250" "2019/01/13 21:21:01.450" -"2019/01/13 21:21:13.250" "2019/01/13 21:21:13.450" -"2019/01/13 21:21:25.250" "2019/01/13 21:21:25.450" -"2019/01/13 21:21:37.250" "2019/01/13 21:21:37.450" -"2019/01/13 21:21:49.250" "2019/01/13 21:21:49.450" -"2019/01/13 21:22:01.250" "2019/01/13 21:22:01.450" -"2019/01/13 21:22:13.250" "2019/01/13 21:22:13.450" -"2019/01/13 21:22:25.250" "2019/01/13 21:22:25.450" -"2019/01/13 21:22:37.250" "2019/01/13 21:22:37.450" -"2019/01/13 21:22:49.250" "2019/01/13 21:22:49.450" -"2019/01/13 21:23:01.250" "2019/01/13 21:23:01.450" -"2019/01/13 21:23:13.250" "2019/01/13 21:23:13.450" -"2019/01/13 21:23:52.000" "2019/01/13 21:23:52.200" -"2019/01/13 21:24:04.000" "2019/01/13 21:24:04.200" -"2019/01/13 21:24:16.000" "2019/01/13 21:24:16.200" -"2019/01/13 21:24:28.000" "2019/01/13 21:24:28.200" -"2019/01/13 21:24:40.000" "2019/01/13 21:24:40.200" -"2019/01/13 21:24:52.000" "2019/01/13 21:24:52.200" -"2019/01/13 21:25:04.000" "2019/01/13 21:25:04.200" -"2019/01/13 21:25:16.000" "2019/01/13 21:25:16.200" -"2019/01/13 21:25:28.000" "2019/01/13 21:25:28.200" -"2019/01/13 21:25:40.000" "2019/01/13 21:25:40.200" -"2019/01/13 21:25:52.000" "2019/01/13 21:25:52.200" -"2019/01/13 21:26:04.000" "2019/01/13 21:26:04.200" -"2019/01/13 21:26:16.000" "2019/01/13 21:26:16.200" -"2019/01/13 21:26:28.000" "2019/01/13 21:26:28.200" -"2019/01/13 21:31:41.750" "2019/01/13 21:31:41.950" -"2019/01/13 21:31:53.750" "2019/01/13 21:31:53.950" -"2019/01/13 21:32:05.750" "2019/01/13 21:32:05.950" -"2019/01/13 21:32:17.750" "2019/01/13 21:32:17.950" -"2019/01/13 21:32:29.750" "2019/01/13 21:32:29.950" -"2019/01/13 21:32:41.750" "2019/01/13 21:32:41.950" -"2019/01/13 21:32:53.750" "2019/01/13 21:32:53.950" -"2019/01/13 21:33:05.750" "2019/01/13 21:33:05.950" -"2019/01/13 21:33:17.750" "2019/01/13 21:33:17.950" -"2019/01/13 21:33:29.750" "2019/01/13 21:33:29.950" -"2019/01/13 21:33:41.750" "2019/01/13 21:33:41.950" -"2019/01/13 21:33:53.750" "2019/01/13 21:33:53.950" -"2019/01/13 21:34:05.750" "2019/01/13 21:34:05.950" -"2019/01/13 21:34:17.750" "2019/01/13 21:34:17.950" -"2019/01/13 21:34:56.500" "2019/01/13 21:34:56.700" -"2019/01/13 21:35:08.500" "2019/01/13 21:35:08.700" -"2019/01/13 21:35:20.500" "2019/01/13 21:35:20.700" -"2019/01/13 21:35:32.500" "2019/01/13 21:35:32.700" -"2019/01/13 21:35:44.500" "2019/01/13 21:35:44.700" -"2019/01/13 21:35:56.500" "2019/01/13 21:35:56.700" -"2019/01/13 21:36:08.500" "2019/01/13 21:36:08.700" -"2019/01/13 21:36:20.500" "2019/01/13 21:36:20.700" -"2019/01/13 21:36:32.500" "2019/01/13 21:36:32.700" -"2019/01/13 21:36:44.500" "2019/01/13 21:36:44.700" -"2019/01/13 21:36:56.500" "2019/01/13 21:36:56.700" -"2019/01/13 21:37:08.500" "2019/01/13 21:37:08.700" -"2019/01/13 21:37:20.500" "2019/01/13 21:37:20.700" -"2019/01/13 21:37:32.500" "2019/01/13 21:37:32.700" -"2019/01/13 21:42:46.250" "2019/01/13 21:42:46.450" -"2019/01/13 21:42:58.250" "2019/01/13 21:42:58.450" -"2019/01/13 21:43:10.250" "2019/01/13 21:43:10.450" -"2019/01/13 21:43:22.250" "2019/01/13 21:43:22.450" -"2019/01/13 21:43:34.250" "2019/01/13 21:43:34.450" -"2019/01/13 21:43:46.250" "2019/01/13 21:43:46.450" -"2019/01/13 21:43:58.250" "2019/01/13 21:43:58.450" -"2019/01/13 21:44:10.250" "2019/01/13 21:44:10.450" -"2019/01/13 21:44:22.250" "2019/01/13 21:44:22.450" -"2019/01/13 21:44:34.250" "2019/01/13 21:44:34.450" -"2019/01/13 21:44:46.250" "2019/01/13 21:44:46.450" -"2019/01/13 21:44:58.250" "2019/01/13 21:44:58.450" -"2019/01/13 21:45:10.250" "2019/01/13 21:45:10.450" -"2019/01/13 21:45:22.250" "2019/01/13 21:45:22.450" -"2019/01/13 21:46:01.000" "2019/01/13 21:46:01.200" -"2019/01/13 21:46:13.000" "2019/01/13 21:46:13.200" -"2019/01/13 21:46:25.000" "2019/01/13 21:46:25.200" -"2019/01/13 21:46:37.000" "2019/01/13 21:46:37.200" -"2019/01/13 21:46:49.000" "2019/01/13 21:46:49.200" -"2019/01/13 21:47:01.000" "2019/01/13 21:47:01.200" -"2019/01/13 21:47:13.000" "2019/01/13 21:47:13.200" -"2019/01/13 21:47:25.000" "2019/01/13 21:47:25.200" -"2019/01/13 21:47:37.000" "2019/01/13 21:47:37.200" -"2019/01/13 21:47:49.000" "2019/01/13 21:47:49.200" -"2019/01/13 21:48:01.000" "2019/01/13 21:48:01.200" -"2019/01/13 21:48:13.000" "2019/01/13 21:48:13.200" -"2019/01/13 21:48:25.000" "2019/01/13 21:48:25.200" -"2019/01/13 21:48:37.000" "2019/01/13 21:48:37.200" -"2019/01/13 21:53:49.750" "2019/01/13 21:53:49.950" -"2019/01/13 21:54:01.750" "2019/01/13 21:54:01.950" -"2019/01/13 21:54:13.750" "2019/01/13 21:54:13.950" -"2019/01/13 21:54:25.750" "2019/01/13 21:54:25.950" -"2019/01/13 21:54:37.750" "2019/01/13 21:54:37.950" -"2019/01/13 21:54:49.750" "2019/01/13 21:54:49.950" -"2019/01/13 21:55:01.750" "2019/01/13 21:55:01.950" -"2019/01/13 21:55:13.750" "2019/01/13 21:55:13.950" -"2019/01/13 21:55:25.750" "2019/01/13 21:55:25.950" -"2019/01/13 21:55:37.750" "2019/01/13 21:55:37.950" -"2019/01/13 21:55:49.750" "2019/01/13 21:55:49.950" -"2019/01/13 21:56:01.750" "2019/01/13 21:56:01.950" -"2019/01/13 21:56:13.750" "2019/01/13 21:56:13.950" -"2019/01/13 21:56:25.750" "2019/01/13 21:56:25.950" -"2019/01/13 21:57:04.500" "2019/01/13 21:57:04.700" -"2019/01/13 21:57:16.500" "2019/01/13 21:57:16.700" -"2019/01/13 21:57:28.500" "2019/01/13 21:57:28.700" -"2019/01/13 21:57:40.500" "2019/01/13 21:57:40.700" -"2019/01/13 21:57:52.500" "2019/01/13 21:57:52.700" -"2019/01/13 21:58:04.500" "2019/01/13 21:58:04.700" -"2019/01/13 21:58:16.500" "2019/01/13 21:58:16.700" -"2019/01/13 21:58:28.500" "2019/01/13 21:58:28.700" -"2019/01/13 21:58:40.500" "2019/01/13 21:58:40.700" -"2019/01/13 21:58:52.500" "2019/01/13 21:58:52.700" -"2019/01/13 21:59:04.500" "2019/01/13 21:59:04.700" -"2019/01/13 21:59:16.500" "2019/01/13 21:59:16.700" -"2019/01/13 21:59:28.500" "2019/01/13 21:59:28.700" -"2019/01/13 21:59:40.500" "2019/01/13 21:59:40.700" -"2019/01/13 22:04:53.250" "2019/01/13 22:04:53.450" -"2019/01/13 22:05:05.250" "2019/01/13 22:05:05.450" -"2019/01/13 22:05:17.250" "2019/01/13 22:05:17.450" -"2019/01/13 22:05:29.250" "2019/01/13 22:05:29.450" -"2019/01/13 22:05:41.250" "2019/01/13 22:05:41.450" -"2019/01/13 22:05:53.250" "2019/01/13 22:05:53.450" -"2019/01/13 22:06:05.250" "2019/01/13 22:06:05.450" -"2019/01/13 22:06:17.250" "2019/01/13 22:06:17.450" -"2019/01/13 22:06:29.250" "2019/01/13 22:06:29.450" -"2019/01/13 22:06:41.250" "2019/01/13 22:06:41.450" -"2019/01/13 22:06:53.250" "2019/01/13 22:06:53.450" -"2019/01/13 22:07:05.250" "2019/01/13 22:07:05.450" -"2019/01/13 22:07:17.250" "2019/01/13 22:07:17.450" -"2019/01/13 22:07:29.250" "2019/01/13 22:07:29.450" -"2019/01/13 22:08:08.000" "2019/01/13 22:08:08.200" -"2019/01/13 22:08:20.000" "2019/01/13 22:08:20.200" -"2019/01/13 22:08:32.000" "2019/01/13 22:08:32.200" -"2019/01/13 22:08:44.000" "2019/01/13 22:08:44.200" -"2019/01/13 22:08:56.000" "2019/01/13 22:08:56.200" -"2019/01/13 22:09:08.000" "2019/01/13 22:09:08.200" -"2019/01/13 22:09:20.000" "2019/01/13 22:09:20.200" -"2019/01/13 22:09:32.000" "2019/01/13 22:09:32.200" -"2019/01/13 22:09:44.000" "2019/01/13 22:09:44.200" -"2019/01/13 22:09:56.000" "2019/01/13 22:09:56.200" -"2019/01/13 22:10:08.000" "2019/01/13 22:10:08.200" -"2019/01/13 22:10:20.000" "2019/01/13 22:10:20.200" -"2019/01/13 22:10:32.000" "2019/01/13 22:10:32.200" -"2019/01/13 22:10:44.000" "2019/01/13 22:10:44.200" -"2019/01/13 22:15:56.750" "2019/01/13 22:15:56.950" -"2019/01/13 22:16:08.750" "2019/01/13 22:16:08.950" -"2019/01/13 22:16:20.750" "2019/01/13 22:16:20.950" -"2019/01/13 22:16:32.750" "2019/01/13 22:16:32.950" -"2019/01/13 22:16:44.750" "2019/01/13 22:16:44.950" -"2019/01/13 22:16:56.750" "2019/01/13 22:16:56.950" -"2019/01/13 22:17:08.750" "2019/01/13 22:17:08.950" -"2019/01/13 22:17:20.750" "2019/01/13 22:17:20.950" -"2019/01/13 22:17:32.750" "2019/01/13 22:17:32.950" -"2019/01/13 22:17:44.750" "2019/01/13 22:17:44.950" -"2019/01/13 22:17:56.750" "2019/01/13 22:17:56.950" -"2019/01/13 22:18:08.750" "2019/01/13 22:18:08.950" -"2019/01/13 22:18:20.750" "2019/01/13 22:18:20.950" -"2019/01/13 22:18:32.750" "2019/01/13 22:18:32.950" -"2019/01/13 22:19:10.500" "2019/01/13 22:19:10.700" -"2019/01/13 22:19:22.500" "2019/01/13 22:19:22.700" -"2019/01/13 22:19:34.500" "2019/01/13 22:19:34.700" -"2019/01/13 22:19:46.500" "2019/01/13 22:19:46.700" -"2019/01/13 22:19:58.500" "2019/01/13 22:19:58.700" -"2019/01/13 22:20:10.500" "2019/01/13 22:20:10.700" -"2019/01/13 22:20:22.500" "2019/01/13 22:20:22.700" -"2019/01/13 22:20:34.500" "2019/01/13 22:20:34.700" -"2019/01/13 22:20:46.500" "2019/01/13 22:20:46.700" -"2019/01/13 22:20:58.500" "2019/01/13 22:20:58.700" -"2019/01/13 22:21:10.500" "2019/01/13 22:21:10.700" -"2019/01/13 22:21:22.500" "2019/01/13 22:21:22.700" -"2019/01/13 22:21:34.500" "2019/01/13 22:21:34.700" -"2019/01/13 22:21:46.500" "2019/01/13 22:21:46.700" -"2019/01/13 22:26:59.250" "2019/01/13 22:26:59.450" -"2019/01/13 22:27:11.250" "2019/01/13 22:27:11.450" -"2019/01/13 22:27:23.250" "2019/01/13 22:27:23.450" -"2019/01/13 22:27:35.250" "2019/01/13 22:27:35.450" -"2019/01/13 22:27:47.250" "2019/01/13 22:27:47.450" -"2019/01/13 22:27:59.250" "2019/01/13 22:27:59.450" -"2019/01/13 22:28:11.250" "2019/01/13 22:28:11.450" -"2019/01/13 22:28:23.250" "2019/01/13 22:28:23.450" -"2019/01/13 22:28:35.250" "2019/01/13 22:28:35.450" -"2019/01/13 22:28:47.250" "2019/01/13 22:28:47.450" -"2019/01/13 22:28:59.250" "2019/01/13 22:28:59.450" -"2019/01/13 22:29:11.250" "2019/01/13 22:29:11.450" -"2019/01/13 22:29:23.250" "2019/01/13 22:29:23.450" -"2019/01/13 22:29:35.250" "2019/01/13 22:29:35.450" -"2019/01/13 22:30:13.000" "2019/01/13 22:30:13.200" -"2019/01/13 22:30:25.000" "2019/01/13 22:30:25.200" -"2019/01/13 22:30:37.000" "2019/01/13 22:30:37.200" -"2019/01/13 22:30:49.000" "2019/01/13 22:30:49.200" -"2019/01/13 22:31:01.000" "2019/01/13 22:31:01.200" -"2019/01/13 22:31:13.000" "2019/01/13 22:31:13.200" -"2019/01/13 22:31:25.000" "2019/01/13 22:31:25.200" -"2019/01/13 22:31:37.000" "2019/01/13 22:31:37.200" -"2019/01/13 22:31:49.000" "2019/01/13 22:31:49.200" -"2019/01/13 22:32:01.000" "2019/01/13 22:32:01.200" -"2019/01/13 22:32:13.000" "2019/01/13 22:32:13.200" -"2019/01/13 22:32:25.000" "2019/01/13 22:32:25.200" -"2019/01/13 22:32:37.000" "2019/01/13 22:32:37.200" -"2019/01/13 22:32:49.000" "2019/01/13 22:32:49.200" -"2019/01/13 22:38:01.750" "2019/01/13 22:38:01.950" -"2019/01/13 22:38:13.750" "2019/01/13 22:38:13.950" -"2019/01/13 22:38:25.750" "2019/01/13 22:38:25.950" -"2019/01/13 22:38:37.750" "2019/01/13 22:38:37.950" -"2019/01/13 22:38:49.750" "2019/01/13 22:38:49.950" -"2019/01/13 22:39:01.750" "2019/01/13 22:39:01.950" -"2019/01/13 22:39:13.750" "2019/01/13 22:39:13.950" -"2019/01/13 22:39:25.750" "2019/01/13 22:39:25.950" -"2019/01/13 22:39:37.750" "2019/01/13 22:39:37.950" -"2019/01/13 22:39:49.750" "2019/01/13 22:39:49.950" -"2019/01/13 22:40:01.750" "2019/01/13 22:40:01.950" -"2019/01/13 22:40:13.750" "2019/01/13 22:40:13.950" -"2019/01/13 22:40:25.750" "2019/01/13 22:40:25.950" -"2019/01/13 22:40:37.750" "2019/01/13 22:40:37.950" -"2019/01/13 22:41:15.500" "2019/01/13 22:41:15.700" -"2019/01/13 22:41:27.500" "2019/01/13 22:41:27.700" -"2019/01/13 22:41:39.500" "2019/01/13 22:41:39.700" -"2019/01/13 22:41:51.500" "2019/01/13 22:41:51.700" -"2019/01/13 22:42:03.500" "2019/01/13 22:42:03.700" -"2019/01/13 22:42:15.500" "2019/01/13 22:42:15.700" -"2019/01/13 22:42:27.500" "2019/01/13 22:42:27.700" -"2019/01/13 22:42:39.500" "2019/01/13 22:42:39.700" -"2019/01/13 22:42:51.500" "2019/01/13 22:42:51.700" -"2019/01/13 22:43:03.500" "2019/01/13 22:43:03.700" -"2019/01/13 22:43:15.500" "2019/01/13 22:43:15.700" -"2019/01/13 22:43:27.500" "2019/01/13 22:43:27.700" -"2019/01/13 22:43:39.500" "2019/01/13 22:43:39.700" -"2019/01/13 22:43:51.500" "2019/01/13 22:43:51.700" -"2019/01/13 22:49:03.250" "2019/01/13 22:49:03.450" -"2019/01/13 22:49:15.250" "2019/01/13 22:49:15.450" -"2019/01/13 22:49:27.250" "2019/01/13 22:49:27.450" -"2019/01/13 22:49:39.250" "2019/01/13 22:49:39.450" -"2019/01/13 22:49:51.250" "2019/01/13 22:49:51.450" -"2019/01/13 22:50:03.250" "2019/01/13 22:50:03.450" -"2019/01/13 22:50:15.250" "2019/01/13 22:50:15.450" -"2019/01/13 22:50:27.250" "2019/01/13 22:50:27.450" -"2019/01/13 22:50:39.250" "2019/01/13 22:50:39.450" -"2019/01/13 22:50:51.250" "2019/01/13 22:50:51.450" -"2019/01/13 22:51:03.250" "2019/01/13 22:51:03.450" -"2019/01/13 22:51:15.250" "2019/01/13 22:51:15.450" -"2019/01/13 22:51:27.250" "2019/01/13 22:51:27.450" -"2019/01/13 22:51:39.250" "2019/01/13 22:51:39.450" -"2019/01/13 22:52:17.000" "2019/01/13 22:52:17.200" -"2019/01/13 22:52:29.000" "2019/01/13 22:52:29.200" -"2019/01/13 22:52:41.000" "2019/01/13 22:52:41.200" -"2019/01/13 22:52:53.000" "2019/01/13 22:52:53.200" -"2019/01/13 22:53:05.000" "2019/01/13 22:53:05.200" -"2019/01/13 22:53:17.000" "2019/01/13 22:53:17.200" -"2019/01/13 22:53:29.000" "2019/01/13 22:53:29.200" -"2019/01/13 22:53:41.000" "2019/01/13 22:53:41.200" -"2019/01/13 22:53:53.000" "2019/01/13 22:53:53.200" -"2019/01/13 22:54:05.000" "2019/01/13 22:54:05.200" -"2019/01/13 22:54:17.000" "2019/01/13 22:54:17.200" -"2019/01/13 22:54:29.000" "2019/01/13 22:54:29.200" -"2019/01/13 22:54:41.000" "2019/01/13 22:54:41.200" -"2019/01/13 22:54:53.000" "2019/01/13 22:54:53.200" -"2019/01/13 23:00:04.750" "2019/01/13 23:00:04.950" -"2019/01/13 23:00:16.750" "2019/01/13 23:00:16.950" -"2019/01/13 23:00:28.750" "2019/01/13 23:00:28.950" -"2019/01/13 23:00:40.750" "2019/01/13 23:00:40.950" -"2019/01/13 23:00:52.750" "2019/01/13 23:00:52.950" -"2019/01/13 23:01:04.750" "2019/01/13 23:01:04.950" -"2019/01/13 23:01:16.750" "2019/01/13 23:01:16.950" -"2019/01/13 23:01:28.750" "2019/01/13 23:01:28.950" -"2019/01/13 23:01:40.750" "2019/01/13 23:01:40.950" -"2019/01/13 23:01:52.750" "2019/01/13 23:01:52.950" -"2019/01/13 23:02:04.750" "2019/01/13 23:02:04.950" -"2019/01/13 23:02:16.750" "2019/01/13 23:02:16.950" -"2019/01/13 23:02:28.750" "2019/01/13 23:02:28.950" -"2019/01/13 23:03:17.500" "2019/01/13 23:03:17.700" -"2019/01/13 23:03:29.500" "2019/01/13 23:03:29.700" -"2019/01/13 23:03:41.500" "2019/01/13 23:03:41.700" -"2019/01/13 23:03:53.500" "2019/01/13 23:03:53.700" -"2019/01/13 23:04:05.500" "2019/01/13 23:04:05.700" -"2019/01/13 23:04:17.500" "2019/01/13 23:04:17.700" -"2019/01/13 23:04:29.500" "2019/01/13 23:04:29.700" -"2019/01/13 23:04:41.500" "2019/01/13 23:04:41.700" -"2019/01/13 23:04:53.500" "2019/01/13 23:04:53.700" -"2019/01/13 23:05:05.500" "2019/01/13 23:05:05.700" -"2019/01/13 23:05:17.500" "2019/01/13 23:05:17.700" -"2019/01/13 23:05:29.500" "2019/01/13 23:05:29.700" -"2019/01/13 23:05:41.500" "2019/01/13 23:05:41.700" -"2019/01/13 23:05:53.500" "2019/01/13 23:05:53.700" -"2019/01/13 23:11:05.250" "2019/01/13 23:11:05.450" -"2019/01/13 23:11:17.250" "2019/01/13 23:11:17.450" -"2019/01/13 23:11:29.250" "2019/01/13 23:11:29.450" -"2019/01/13 23:11:41.250" "2019/01/13 23:11:41.450" -"2019/01/13 23:11:53.250" "2019/01/13 23:11:53.450" -"2019/01/13 23:12:05.250" "2019/01/13 23:12:05.450" -"2019/01/13 23:12:17.250" "2019/01/13 23:12:17.450" -"2019/01/13 23:12:29.250" "2019/01/13 23:12:29.450" -"2019/01/13 23:12:41.250" "2019/01/13 23:12:41.450" -"2019/01/13 23:12:53.250" "2019/01/13 23:12:53.450" -"2019/01/13 23:13:05.250" "2019/01/13 23:13:05.450" -"2019/01/13 23:13:17.250" "2019/01/13 23:13:17.450" -"2019/01/13 23:13:29.250" "2019/01/13 23:13:29.450" -"2019/01/13 23:14:18.000" "2019/01/13 23:14:18.200" -"2019/01/13 23:14:30.000" "2019/01/13 23:14:30.200" -"2019/01/13 23:14:42.000" "2019/01/13 23:14:42.200" -"2019/01/13 23:14:54.000" "2019/01/13 23:14:54.200" -"2019/01/13 23:15:06.000" "2019/01/13 23:15:06.200" -"2019/01/13 23:15:18.000" "2019/01/13 23:15:18.200" -"2019/01/13 23:15:30.000" "2019/01/13 23:15:30.200" -"2019/01/13 23:15:42.000" "2019/01/13 23:15:42.200" -"2019/01/13 23:15:54.000" "2019/01/13 23:15:54.200" -"2019/01/13 23:16:06.000" "2019/01/13 23:16:06.200" -"2019/01/13 23:16:18.000" "2019/01/13 23:16:18.200" -"2019/01/13 23:16:30.000" "2019/01/13 23:16:30.200" -"2019/01/13 23:16:42.000" "2019/01/13 23:16:42.200" -"2019/01/13 23:16:54.000" "2019/01/13 23:16:54.200" -"2019/01/13 23:22:05.750" "2019/01/13 23:22:05.950" -"2019/01/13 23:22:17.750" "2019/01/13 23:22:17.950" -"2019/01/13 23:22:29.750" "2019/01/13 23:22:29.950" -"2019/01/13 23:22:41.750" "2019/01/13 23:22:41.950" -"2019/01/13 23:22:53.750" "2019/01/13 23:22:53.950" -"2019/01/13 23:23:05.750" "2019/01/13 23:23:05.950" -"2019/01/13 23:23:17.750" "2019/01/13 23:23:17.950" -"2019/01/13 23:23:29.750" "2019/01/13 23:23:29.950" -"2019/01/13 23:23:41.750" "2019/01/13 23:23:41.950" -"2019/01/13 23:23:53.750" "2019/01/13 23:23:53.950" -"2019/01/13 23:24:05.750" "2019/01/13 23:24:05.950" -"2019/01/13 23:24:17.750" "2019/01/13 23:24:17.950" -"2019/01/13 23:24:29.750" "2019/01/13 23:24:29.950" -"2019/01/13 23:25:18.500" "2019/01/13 23:25:18.700" -"2019/01/13 23:25:30.500" "2019/01/13 23:25:30.700" -"2019/01/13 23:25:42.500" "2019/01/13 23:25:42.700" -"2019/01/13 23:25:54.500" "2019/01/13 23:25:54.700" -"2019/01/13 23:26:06.500" "2019/01/13 23:26:06.700" -"2019/01/13 23:26:18.500" "2019/01/13 23:26:18.700" -"2019/01/13 23:26:30.500" "2019/01/13 23:26:30.700" -"2019/01/13 23:26:42.500" "2019/01/13 23:26:42.700" -"2019/01/13 23:26:54.500" "2019/01/13 23:26:54.700" -"2019/01/13 23:27:06.500" "2019/01/13 23:27:06.700" -"2019/01/13 23:27:18.500" "2019/01/13 23:27:18.700" -"2019/01/13 23:27:30.500" "2019/01/13 23:27:30.700" -"2019/01/13 23:27:42.500" "2019/01/13 23:27:42.700" -"2019/01/13 23:27:54.500" "2019/01/13 23:27:54.700" -"2019/01/13 23:33:05.250" "2019/01/13 23:33:05.450" -"2019/01/13 23:33:17.250" "2019/01/13 23:33:17.450" -"2019/01/13 23:33:29.250" "2019/01/13 23:33:29.450" -"2019/01/13 23:33:41.250" "2019/01/13 23:33:41.450" -"2019/01/13 23:33:53.250" "2019/01/13 23:33:53.450" -"2019/01/13 23:34:05.250" "2019/01/13 23:34:05.450" -"2019/01/13 23:34:17.250" "2019/01/13 23:34:17.450" -"2019/01/13 23:34:29.250" "2019/01/13 23:34:29.450" -"2019/01/13 23:34:41.250" "2019/01/13 23:34:41.450" -"2019/01/13 23:34:53.250" "2019/01/13 23:34:53.450" -"2019/01/13 23:35:05.250" "2019/01/13 23:35:05.450" -"2019/01/13 23:35:17.250" "2019/01/13 23:35:17.450" -"2019/01/13 23:35:29.250" "2019/01/13 23:35:29.450" -"2019/01/14 17:14:47.600" "2019/01/14 17:14:47.800" -"2019/01/14 17:14:59.600" "2019/01/14 17:14:59.800" -"2019/01/14 17:15:11.600" "2019/01/14 17:15:11.800" -"2019/01/14 17:15:23.600" "2019/01/14 17:15:23.800" -"2019/01/14 17:15:35.600" "2019/01/14 17:15:35.800" -"2019/01/14 17:15:47.600" "2019/01/14 17:15:47.800" -"2019/01/14 17:15:59.600" "2019/01/14 17:15:59.800" -"2019/01/14 17:16:11.600" "2019/01/14 17:16:11.800" -"2019/01/14 17:16:23.600" "2019/01/14 17:16:23.800" -"2019/01/14 17:16:35.600" "2019/01/14 17:16:35.800" -"2019/01/14 17:16:47.600" "2019/01/14 17:16:47.800" -"2019/01/14 17:16:59.600" "2019/01/14 17:16:59.800" -"2019/01/14 17:17:11.600" "2019/01/14 17:17:11.800" -"2019/01/14 17:17:52.000" "2019/01/14 17:17:52.200" -"2019/01/14 17:18:04.000" "2019/01/14 17:18:04.200" -"2019/01/14 17:18:16.000" "2019/01/14 17:18:16.200" -"2019/01/14 17:18:28.000" "2019/01/14 17:18:28.200" -"2019/01/14 17:18:40.000" "2019/01/14 17:18:40.200" -"2019/01/14 17:18:52.000" "2019/01/14 17:18:52.200" -"2019/01/14 17:19:04.000" "2019/01/14 17:19:04.200" -"2019/01/14 17:19:16.000" "2019/01/14 17:19:16.200" -"2019/01/14 17:19:28.000" "2019/01/14 17:19:28.200" -"2019/01/14 17:19:40.000" "2019/01/14 17:19:40.200" -"2019/01/14 17:19:52.000" "2019/01/14 17:19:52.200" -"2019/01/14 17:20:04.000" "2019/01/14 17:20:04.200" -"2019/01/14 17:20:16.000" "2019/01/14 17:20:16.200" -"2019/01/14 17:25:13.600" "2019/01/14 17:25:13.800" -"2019/01/14 17:25:25.600" "2019/01/14 17:25:25.800" -"2019/01/14 17:25:37.600" "2019/01/14 17:25:37.800" -"2019/01/14 17:25:49.600" "2019/01/14 17:25:49.800" -"2019/01/14 17:26:01.600" "2019/01/14 17:26:01.800" -"2019/01/14 17:26:13.600" "2019/01/14 17:26:13.800" -"2019/01/14 17:26:25.600" "2019/01/14 17:26:25.800" -"2019/01/14 17:26:37.600" "2019/01/14 17:26:37.800" -"2019/01/14 17:26:49.600" "2019/01/14 17:26:49.800" -"2019/01/14 17:27:01.600" "2019/01/14 17:27:01.800" -"2019/01/14 17:27:13.600" "2019/01/14 17:27:13.800" -"2019/01/14 17:27:25.600" "2019/01/14 17:27:25.800" -"2019/01/14 17:27:37.600" "2019/01/14 17:27:37.800" -"2019/01/14 17:28:18.000" "2019/01/14 17:28:18.200" -"2019/01/14 17:28:30.000" "2019/01/14 17:28:30.200" -"2019/01/14 17:28:42.000" "2019/01/14 17:28:42.200" -"2019/01/14 17:28:54.000" "2019/01/14 17:28:54.200" -"2019/01/14 17:29:06.000" "2019/01/14 17:29:06.200" -"2019/01/14 17:29:18.000" "2019/01/14 17:29:18.200" -"2019/01/14 17:29:30.000" "2019/01/14 17:29:30.200" -"2019/01/14 17:29:42.000" "2019/01/14 17:29:42.200" -"2019/01/14 17:29:54.000" "2019/01/14 17:29:54.200" -"2019/01/14 17:30:06.000" "2019/01/14 17:30:06.200" -"2019/01/14 17:30:18.000" "2019/01/14 17:30:18.200" -"2019/01/14 17:30:30.000" "2019/01/14 17:30:30.200" -"2019/01/14 17:30:42.000" "2019/01/14 17:30:42.200" -"2019/01/14 17:35:39.600" "2019/01/14 17:35:39.800" -"2019/01/14 17:35:51.600" "2019/01/14 17:35:51.800" -"2019/01/14 17:36:03.600" "2019/01/14 17:36:03.800" -"2019/01/14 17:36:15.600" "2019/01/14 17:36:15.800" -"2019/01/14 17:36:27.600" "2019/01/14 17:36:27.800" -"2019/01/14 17:36:39.600" "2019/01/14 17:36:39.800" -"2019/01/14 17:36:51.600" "2019/01/14 17:36:51.800" -"2019/01/14 17:37:03.600" "2019/01/14 17:37:03.800" -"2019/01/14 17:37:15.600" "2019/01/14 17:37:15.800" -"2019/01/14 17:37:27.600" "2019/01/14 17:37:27.800" -"2019/01/14 17:37:39.600" "2019/01/14 17:37:39.800" -"2019/01/14 17:37:51.600" "2019/01/14 17:37:51.800" -"2019/01/14 17:38:03.600" "2019/01/14 17:38:03.800" -"2019/01/14 17:38:44.000" "2019/01/14 17:38:44.200" -"2019/01/14 17:38:56.000" "2019/01/14 17:38:56.200" -"2019/01/14 17:39:08.000" "2019/01/14 17:39:08.200" -"2019/01/14 17:39:20.000" "2019/01/14 17:39:20.200" -"2019/01/14 17:39:32.000" "2019/01/14 17:39:32.200" -"2019/01/14 17:39:44.000" "2019/01/14 17:39:44.200" -"2019/01/14 17:39:56.000" "2019/01/14 17:39:56.200" -"2019/01/14 17:40:08.000" "2019/01/14 17:40:08.200" -"2019/01/14 17:40:20.000" "2019/01/14 17:40:20.200" -"2019/01/14 17:40:32.000" "2019/01/14 17:40:32.200" -"2019/01/14 17:40:44.000" "2019/01/14 17:40:44.200" -"2019/01/14 17:40:56.000" "2019/01/14 17:40:56.200" -"2019/01/14 17:41:08.000" "2019/01/14 17:41:08.200" -"2019/01/14 17:46:05.600" "2019/01/14 17:46:05.800" -"2019/01/14 17:46:17.600" "2019/01/14 17:46:17.800" -"2019/01/14 17:46:29.600" "2019/01/14 17:46:29.800" -"2019/01/14 17:46:41.600" "2019/01/14 17:46:41.800" -"2019/01/14 17:46:53.600" "2019/01/14 17:46:53.800" -"2019/01/14 17:47:05.600" "2019/01/14 17:47:05.800" -"2019/01/14 17:47:17.600" "2019/01/14 17:47:17.800" -"2019/01/14 17:47:29.600" "2019/01/14 17:47:29.800" -"2019/01/14 17:47:41.600" "2019/01/14 17:47:41.800" -"2019/01/14 17:47:53.600" "2019/01/14 17:47:53.800" -"2019/01/14 17:48:05.600" "2019/01/14 17:48:05.800" -"2019/01/14 17:48:17.600" "2019/01/14 17:48:17.800" -"2019/01/14 17:48:29.600" "2019/01/14 17:48:29.800" -"2019/01/14 17:49:10.000" "2019/01/14 17:49:10.200" -"2019/01/14 17:49:22.000" "2019/01/14 17:49:22.200" -"2019/01/14 17:49:34.000" "2019/01/14 17:49:34.200" -"2019/01/14 17:49:46.000" "2019/01/14 17:49:46.200" -"2019/01/14 17:49:58.000" "2019/01/14 17:49:58.200" -"2019/01/14 17:50:10.000" "2019/01/14 17:50:10.200" -"2019/01/14 17:50:22.000" "2019/01/14 17:50:22.200" -"2019/01/14 17:50:34.000" "2019/01/14 17:50:34.200" -"2019/01/14 17:50:46.000" "2019/01/14 17:50:46.200" -"2019/01/14 17:50:58.000" "2019/01/14 17:50:58.200" -"2019/01/14 17:51:10.000" "2019/01/14 17:51:10.200" -"2019/01/14 17:51:22.000" "2019/01/14 17:51:22.200" -"2019/01/14 17:51:34.000" "2019/01/14 17:51:34.200" -"2019/01/14 17:56:31.600" "2019/01/14 17:56:31.800" -"2019/01/14 17:56:43.600" "2019/01/14 17:56:43.800" -"2019/01/14 17:56:55.600" "2019/01/14 17:56:55.800" -"2019/01/14 17:57:07.600" "2019/01/14 17:57:07.800" -"2019/01/14 17:57:19.600" "2019/01/14 17:57:19.800" -"2019/01/14 17:57:31.600" "2019/01/14 17:57:31.800" -"2019/01/14 17:57:43.600" "2019/01/14 17:57:43.800" -"2019/01/14 17:57:55.600" "2019/01/14 17:57:55.800" -"2019/01/14 17:58:07.600" "2019/01/14 17:58:07.800" -"2019/01/14 17:58:19.600" "2019/01/14 17:58:19.800" -"2019/01/14 17:58:31.600" "2019/01/14 17:58:31.800" -"2019/01/14 17:58:43.600" "2019/01/14 17:58:43.800" -"2019/01/14 17:58:55.600" "2019/01/14 17:58:55.800" -"2019/01/14 17:59:37.000" "2019/01/14 17:59:37.200" -"2019/01/14 17:59:49.000" "2019/01/14 17:59:49.200" -"2019/01/14 18:00:01.000" "2019/01/14 18:00:01.200" -"2019/01/14 18:00:13.000" "2019/01/14 18:00:13.200" -"2019/01/14 18:00:25.000" "2019/01/14 18:00:25.200" -"2019/01/14 18:00:37.000" "2019/01/14 18:00:37.200" -"2019/01/14 18:00:49.000" "2019/01/14 18:00:49.200" -"2019/01/14 18:01:01.000" "2019/01/14 18:01:01.200" -"2019/01/14 18:01:13.000" "2019/01/14 18:01:13.200" -"2019/01/14 18:01:25.000" "2019/01/14 18:01:25.200" -"2019/01/14 18:01:37.000" "2019/01/14 18:01:37.200" -"2019/01/14 18:01:49.000" "2019/01/14 18:01:49.200" -"2019/01/14 18:02:01.000" "2019/01/14 18:02:01.200" -"2019/01/14 18:06:58.600" "2019/01/14 18:06:58.800" -"2019/01/14 18:07:10.600" "2019/01/14 18:07:10.800" -"2019/01/14 18:07:22.600" "2019/01/14 18:07:22.800" -"2019/01/14 18:07:34.600" "2019/01/14 18:07:34.800" -"2019/01/14 18:07:46.600" "2019/01/14 18:07:46.800" -"2019/01/14 18:07:58.600" "2019/01/14 18:07:58.800" -"2019/01/14 18:08:10.600" "2019/01/14 18:08:10.800" -"2019/01/14 18:08:22.600" "2019/01/14 18:08:22.800" -"2019/01/14 18:08:34.600" "2019/01/14 18:08:34.800" -"2019/01/14 18:08:46.600" "2019/01/14 18:08:46.800" -"2019/01/14 18:08:58.600" "2019/01/14 18:08:58.800" -"2019/01/14 18:09:10.600" "2019/01/14 18:09:10.800" -"2019/01/14 18:09:22.600" "2019/01/14 18:09:22.800" -"2019/01/14 18:10:04.000" "2019/01/14 18:10:04.200" -"2019/01/14 18:10:16.000" "2019/01/14 18:10:16.200" -"2019/01/14 18:10:28.000" "2019/01/14 18:10:28.200" -"2019/01/14 18:10:40.000" "2019/01/14 18:10:40.200" -"2019/01/14 18:10:52.000" "2019/01/14 18:10:52.200" -"2019/01/14 18:11:04.000" "2019/01/14 18:11:04.200" -"2019/01/14 18:11:16.000" "2019/01/14 18:11:16.200" -"2019/01/14 18:11:28.000" "2019/01/14 18:11:28.200" -"2019/01/14 18:11:40.000" "2019/01/14 18:11:40.200" -"2019/01/14 18:11:52.000" "2019/01/14 18:11:52.200" -"2019/01/14 18:12:04.000" "2019/01/14 18:12:04.200" -"2019/01/14 18:12:16.000" "2019/01/14 18:12:16.200" -"2019/01/14 18:12:28.000" "2019/01/14 18:12:28.200" -"2019/01/14 18:17:26.600" "2019/01/14 18:17:26.800" -"2019/01/14 18:17:38.600" "2019/01/14 18:17:38.800" -"2019/01/14 18:17:50.600" "2019/01/14 18:17:50.800" -"2019/01/14 18:18:02.600" "2019/01/14 18:18:02.800" -"2019/01/14 18:18:14.600" "2019/01/14 18:18:14.800" -"2019/01/14 18:18:26.600" "2019/01/14 18:18:26.800" -"2019/01/14 18:18:38.600" "2019/01/14 18:18:38.800" -"2019/01/14 18:18:50.600" "2019/01/14 18:18:50.800" -"2019/01/14 18:19:02.600" "2019/01/14 18:19:02.800" -"2019/01/14 18:19:14.600" "2019/01/14 18:19:14.800" -"2019/01/14 18:19:26.600" "2019/01/14 18:19:26.800" -"2019/01/14 18:19:38.600" "2019/01/14 18:19:38.800" -"2019/01/14 18:19:50.600" "2019/01/14 18:19:50.800" -"2019/01/14 18:20:32.000" "2019/01/14 18:20:32.200" -"2019/01/14 18:20:44.000" "2019/01/14 18:20:44.200" -"2019/01/14 18:20:56.000" "2019/01/14 18:20:56.200" -"2019/01/14 18:21:08.000" "2019/01/14 18:21:08.200" -"2019/01/14 18:21:20.000" "2019/01/14 18:21:20.200" -"2019/01/14 18:21:32.000" "2019/01/14 18:21:32.200" -"2019/01/14 18:21:44.000" "2019/01/14 18:21:44.200" -"2019/01/14 18:21:56.000" "2019/01/14 18:21:56.200" -"2019/01/14 18:22:08.000" "2019/01/14 18:22:08.200" -"2019/01/14 18:22:20.000" "2019/01/14 18:22:20.200" -"2019/01/14 18:22:32.000" "2019/01/14 18:22:32.200" -"2019/01/14 18:22:44.000" "2019/01/14 18:22:44.200" -"2019/01/14 18:22:56.000" "2019/01/14 18:22:56.200" -"2019/01/14 18:27:54.600" "2019/01/14 18:27:54.800" -"2019/01/14 18:28:06.600" "2019/01/14 18:28:06.800" -"2019/01/14 18:28:18.600" "2019/01/14 18:28:18.800" -"2019/01/14 18:28:30.600" "2019/01/14 18:28:30.800" -"2019/01/14 18:28:42.600" "2019/01/14 18:28:42.800" -"2019/01/14 18:28:54.600" "2019/01/14 18:28:54.800" -"2019/01/14 18:29:06.600" "2019/01/14 18:29:06.800" -"2019/01/14 18:29:18.600" "2019/01/14 18:29:18.800" -"2019/01/14 18:29:30.600" "2019/01/14 18:29:30.800" -"2019/01/14 18:29:42.600" "2019/01/14 18:29:42.800" -"2019/01/14 18:29:54.600" "2019/01/14 18:29:54.800" -"2019/01/14 18:30:06.600" "2019/01/14 18:30:06.800" -"2019/01/14 18:30:18.600" "2019/01/14 18:30:18.800" -"2019/01/14 18:31:00.000" "2019/01/14 18:31:00.200" -"2019/01/14 18:31:12.000" "2019/01/14 18:31:12.200" -"2019/01/14 18:31:24.000" "2019/01/14 18:31:24.200" -"2019/01/14 18:31:36.000" "2019/01/14 18:31:36.200" -"2019/01/14 18:31:48.000" "2019/01/14 18:31:48.200" -"2019/01/14 18:32:00.000" "2019/01/14 18:32:00.200" -"2019/01/14 18:32:12.000" "2019/01/14 18:32:12.200" -"2019/01/14 18:32:24.000" "2019/01/14 18:32:24.200" -"2019/01/14 18:32:36.000" "2019/01/14 18:32:36.200" -"2019/01/14 18:32:48.000" "2019/01/14 18:32:48.200" -"2019/01/14 18:33:00.000" "2019/01/14 18:33:00.200" -"2019/01/14 18:33:12.000" "2019/01/14 18:33:12.200" -"2019/01/14 18:33:24.000" "2019/01/14 18:33:24.200" -"2019/01/14 18:38:22.600" "2019/01/14 18:38:22.800" -"2019/01/14 18:38:34.600" "2019/01/14 18:38:34.800" -"2019/01/14 18:38:46.600" "2019/01/14 18:38:46.800" -"2019/01/14 18:38:58.600" "2019/01/14 18:38:58.800" -"2019/01/14 18:39:10.600" "2019/01/14 18:39:10.800" -"2019/01/14 18:39:22.600" "2019/01/14 18:39:22.800" -"2019/01/14 18:39:34.600" "2019/01/14 18:39:34.800" -"2019/01/14 18:39:46.600" "2019/01/14 18:39:46.800" -"2019/01/14 18:39:58.600" "2019/01/14 18:39:58.800" -"2019/01/14 18:40:10.600" "2019/01/14 18:40:10.800" -"2019/01/14 18:40:22.600" "2019/01/14 18:40:22.800" -"2019/01/14 18:40:34.600" "2019/01/14 18:40:34.800" -"2019/01/14 18:40:46.600" "2019/01/14 18:40:46.800" -"2019/01/14 18:41:28.000" "2019/01/14 18:41:28.200" -"2019/01/14 18:41:40.000" "2019/01/14 18:41:40.200" -"2019/01/14 18:41:52.000" "2019/01/14 18:41:52.200" -"2019/01/14 18:42:04.000" "2019/01/14 18:42:04.200" -"2019/01/14 18:42:16.000" "2019/01/14 18:42:16.200" -"2019/01/14 18:42:28.000" "2019/01/14 18:42:28.200" -"2019/01/14 18:42:40.000" "2019/01/14 18:42:40.200" -"2019/01/14 18:42:52.000" "2019/01/14 18:42:52.200" -"2019/01/14 18:43:04.000" "2019/01/14 18:43:04.200" -"2019/01/14 18:43:16.000" "2019/01/14 18:43:16.200" -"2019/01/14 18:43:28.000" "2019/01/14 18:43:28.200" -"2019/01/14 18:43:40.000" "2019/01/14 18:43:40.200" -"2019/01/14 18:43:52.000" "2019/01/14 18:43:52.200" -"2019/01/14 18:48:50.600" "2019/01/14 18:48:50.800" -"2019/01/14 18:49:02.600" "2019/01/14 18:49:02.800" -"2019/01/14 18:49:14.600" "2019/01/14 18:49:14.800" -"2019/01/14 18:49:26.600" "2019/01/14 18:49:26.800" -"2019/01/14 18:49:38.600" "2019/01/14 18:49:38.800" -"2019/01/14 18:49:50.600" "2019/01/14 18:49:50.800" -"2019/01/14 18:50:02.600" "2019/01/14 18:50:02.800" -"2019/01/14 18:50:14.600" "2019/01/14 18:50:14.800" -"2019/01/14 18:50:26.600" "2019/01/14 18:50:26.800" -"2019/01/14 18:50:38.600" "2019/01/14 18:50:38.800" -"2019/01/14 18:50:50.600" "2019/01/14 18:50:50.800" -"2019/01/14 18:51:02.600" "2019/01/14 18:51:02.800" -"2019/01/14 18:51:14.600" "2019/01/14 18:51:14.800" -"2019/01/14 18:51:57.000" "2019/01/14 18:51:57.200" -"2019/01/14 18:52:09.000" "2019/01/14 18:52:09.200" -"2019/01/14 18:52:21.000" "2019/01/14 18:52:21.200" -"2019/01/14 18:52:33.000" "2019/01/14 18:52:33.200" -"2019/01/14 18:52:45.000" "2019/01/14 18:52:45.200" -"2019/01/14 18:52:57.000" "2019/01/14 18:52:57.200" -"2019/01/14 18:53:09.000" "2019/01/14 18:53:09.200" -"2019/01/14 18:53:21.000" "2019/01/14 18:53:21.200" -"2019/01/14 18:53:33.000" "2019/01/14 18:53:33.200" -"2019/01/14 18:53:45.000" "2019/01/14 18:53:45.200" -"2019/01/14 18:53:57.000" "2019/01/14 18:53:57.200" -"2019/01/14 18:54:09.000" "2019/01/14 18:54:09.200" -"2019/01/14 18:54:21.000" "2019/01/14 18:54:21.200" -"2019/01/14 18:59:19.600" "2019/01/14 18:59:19.800" -"2019/01/14 18:59:31.600" "2019/01/14 18:59:31.800" -"2019/01/14 18:59:43.600" "2019/01/14 18:59:43.800" -"2019/01/14 18:59:55.600" "2019/01/14 18:59:55.800" -"2019/01/14 19:00:07.600" "2019/01/14 19:00:07.800" -"2019/01/14 19:00:19.600" "2019/01/14 19:00:19.800" -"2019/01/14 19:00:31.600" "2019/01/14 19:00:31.800" -"2019/01/14 19:00:43.600" "2019/01/14 19:00:43.800" -"2019/01/14 19:00:55.600" "2019/01/14 19:00:55.800" -"2019/01/14 19:01:07.600" "2019/01/14 19:01:07.800" -"2019/01/14 19:01:19.600" "2019/01/14 19:01:19.800" -"2019/01/14 19:01:31.600" "2019/01/14 19:01:31.800" -"2019/01/14 19:01:43.600" "2019/01/14 19:01:43.800" -"2019/01/14 19:02:26.000" "2019/01/14 19:02:26.200" -"2019/01/14 19:02:38.000" "2019/01/14 19:02:38.200" -"2019/01/14 19:02:50.000" "2019/01/14 19:02:50.200" -"2019/01/14 19:03:02.000" "2019/01/14 19:03:02.200" -"2019/01/14 19:03:14.000" "2019/01/14 19:03:14.200" -"2019/01/14 19:03:26.000" "2019/01/14 19:03:26.200" -"2019/01/14 19:03:38.000" "2019/01/14 19:03:38.200" -"2019/01/14 19:03:50.000" "2019/01/14 19:03:50.200" -"2019/01/14 19:04:02.000" "2019/01/14 19:04:02.200" -"2019/01/14 19:04:14.000" "2019/01/14 19:04:14.200" -"2019/01/14 19:04:26.000" "2019/01/14 19:04:26.200" -"2019/01/14 19:04:38.000" "2019/01/14 19:04:38.200" -"2019/01/14 19:04:50.000" "2019/01/14 19:04:50.200" -"2019/01/14 19:09:48.600" "2019/01/14 19:09:48.800" -"2019/01/14 19:10:00.600" "2019/01/14 19:10:00.800" -"2019/01/14 19:10:12.600" "2019/01/14 19:10:12.800" -"2019/01/14 19:10:24.600" "2019/01/14 19:10:24.800" -"2019/01/14 19:10:36.600" "2019/01/14 19:10:36.800" -"2019/01/14 19:10:48.600" "2019/01/14 19:10:48.800" -"2019/01/14 19:11:00.600" "2019/01/14 19:11:00.800" -"2019/01/14 19:11:12.600" "2019/01/14 19:11:12.800" -"2019/01/14 19:11:24.600" "2019/01/14 19:11:24.800" -"2019/01/14 19:11:36.600" "2019/01/14 19:11:36.800" -"2019/01/14 19:11:48.600" "2019/01/14 19:11:48.800" -"2019/01/14 19:12:00.600" "2019/01/14 19:12:00.800" -"2019/01/14 19:12:12.600" "2019/01/14 19:12:12.800" -"2019/01/14 19:12:55.000" "2019/01/14 19:12:55.200" -"2019/01/14 19:13:07.000" "2019/01/14 19:13:07.200" -"2019/01/14 19:13:19.000" "2019/01/14 19:13:19.200" -"2019/01/14 19:13:31.000" "2019/01/14 19:13:31.200" -"2019/01/14 19:13:43.000" "2019/01/14 19:13:43.200" -"2019/01/14 19:13:55.000" "2019/01/14 19:13:55.200" -"2019/01/14 19:14:07.000" "2019/01/14 19:14:07.200" -"2019/01/14 19:14:19.000" "2019/01/14 19:14:19.200" -"2019/01/14 19:14:31.000" "2019/01/14 19:14:31.200" -"2019/01/14 19:14:43.000" "2019/01/14 19:14:43.200" -"2019/01/14 19:14:55.000" "2019/01/14 19:14:55.200" -"2019/01/14 19:15:07.000" "2019/01/14 19:15:07.200" -"2019/01/14 19:15:19.000" "2019/01/14 19:15:19.200" -"2019/01/14 19:20:18.600" "2019/01/14 19:20:18.800" -"2019/01/14 19:20:30.600" "2019/01/14 19:20:30.800" -"2019/01/14 19:20:42.600" "2019/01/14 19:20:42.800" -"2019/01/14 19:20:54.600" "2019/01/14 19:20:54.800" -"2019/01/14 19:21:06.600" "2019/01/14 19:21:06.800" -"2019/01/14 19:21:18.600" "2019/01/14 19:21:18.800" -"2019/01/14 19:21:30.600" "2019/01/14 19:21:30.800" -"2019/01/14 19:21:42.600" "2019/01/14 19:21:42.800" -"2019/01/14 19:21:54.600" "2019/01/14 19:21:54.800" -"2019/01/14 19:22:06.600" "2019/01/14 19:22:06.800" -"2019/01/14 19:22:18.600" "2019/01/14 19:22:18.800" -"2019/01/14 19:22:30.600" "2019/01/14 19:22:30.800" -"2019/01/14 19:22:42.600" "2019/01/14 19:22:42.800" -"2019/01/14 19:23:25.000" "2019/01/14 19:23:25.200" -"2019/01/14 19:23:37.000" "2019/01/14 19:23:37.200" -"2019/01/14 19:23:49.000" "2019/01/14 19:23:49.200" -"2019/01/14 19:24:01.000" "2019/01/14 19:24:01.200" -"2019/01/14 19:24:13.000" "2019/01/14 19:24:13.200" -"2019/01/14 19:24:25.000" "2019/01/14 19:24:25.200" -"2019/01/14 19:24:37.000" "2019/01/14 19:24:37.200" -"2019/01/14 19:24:49.000" "2019/01/14 19:24:49.200" -"2019/01/14 19:25:01.000" "2019/01/14 19:25:01.200" -"2019/01/14 19:25:13.000" "2019/01/14 19:25:13.200" -"2019/01/14 19:25:25.000" "2019/01/14 19:25:25.200" -"2019/01/14 19:25:37.000" "2019/01/14 19:25:37.200" -"2019/01/14 19:25:49.000" "2019/01/14 19:25:49.200" -"2019/01/14 19:30:48.600" "2019/01/14 19:30:48.800" -"2019/01/14 19:31:00.600" "2019/01/14 19:31:00.800" -"2019/01/14 19:31:12.600" "2019/01/14 19:31:12.800" -"2019/01/14 19:31:24.600" "2019/01/14 19:31:24.800" -"2019/01/14 19:31:36.600" "2019/01/14 19:31:36.800" -"2019/01/14 19:31:48.600" "2019/01/14 19:31:48.800" -"2019/01/14 19:32:00.600" "2019/01/14 19:32:00.800" -"2019/01/14 19:32:12.600" "2019/01/14 19:32:12.800" -"2019/01/14 19:32:24.600" "2019/01/14 19:32:24.800" -"2019/01/14 19:32:36.600" "2019/01/14 19:32:36.800" -"2019/01/14 19:32:48.600" "2019/01/14 19:32:48.800" -"2019/01/14 19:33:00.600" "2019/01/14 19:33:00.800" -"2019/01/14 19:33:12.600" "2019/01/14 19:33:12.800" -"2019/01/14 19:33:55.000" "2019/01/14 19:33:55.200" -"2019/01/14 19:34:07.000" "2019/01/14 19:34:07.200" -"2019/01/14 19:34:19.000" "2019/01/14 19:34:19.200" -"2019/01/14 19:34:31.000" "2019/01/14 19:34:31.200" -"2019/01/14 19:34:43.000" "2019/01/14 19:34:43.200" -"2019/01/14 19:34:55.000" "2019/01/14 19:34:55.200" -"2019/01/14 19:35:07.000" "2019/01/14 19:35:07.200" -"2019/01/14 19:35:19.000" "2019/01/14 19:35:19.200" -"2019/01/14 19:35:31.000" "2019/01/14 19:35:31.200" -"2019/01/14 19:35:43.000" "2019/01/14 19:35:43.200" -"2019/01/14 19:35:55.000" "2019/01/14 19:35:55.200" -"2019/01/14 19:36:07.000" "2019/01/14 19:36:07.200" -"2019/01/14 19:36:19.000" "2019/01/14 19:36:19.200" -"2019/01/14 19:41:18.600" "2019/01/14 19:41:18.800" -"2019/01/14 19:41:30.600" "2019/01/14 19:41:30.800" -"2019/01/14 19:41:42.600" "2019/01/14 19:41:42.800" -"2019/01/14 19:41:54.600" "2019/01/14 19:41:54.800" -"2019/01/14 19:42:06.600" "2019/01/14 19:42:06.800" -"2019/01/14 19:42:18.600" "2019/01/14 19:42:18.800" -"2019/01/14 19:42:30.600" "2019/01/14 19:42:30.800" -"2019/01/14 19:42:42.600" "2019/01/14 19:42:42.800" -"2019/01/14 19:42:54.600" "2019/01/14 19:42:54.800" -"2019/01/14 19:43:06.600" "2019/01/14 19:43:06.800" -"2019/01/14 19:43:18.600" "2019/01/14 19:43:18.800" -"2019/01/14 19:43:30.600" "2019/01/14 19:43:30.800" -"2019/01/14 19:43:42.600" "2019/01/14 19:43:42.800" -"2019/01/14 19:44:25.000" "2019/01/14 19:44:25.200" -"2019/01/14 19:44:37.000" "2019/01/14 19:44:37.200" -"2019/01/14 19:44:49.000" "2019/01/14 19:44:49.200" -"2019/01/14 19:45:01.000" "2019/01/14 19:45:01.200" -"2019/01/14 19:45:13.000" "2019/01/14 19:45:13.200" -"2019/01/14 19:45:25.000" "2019/01/14 19:45:25.200" -"2019/01/14 19:45:37.000" "2019/01/14 19:45:37.200" -"2019/01/14 19:45:49.000" "2019/01/14 19:45:49.200" -"2019/01/14 19:46:01.000" "2019/01/14 19:46:01.200" -"2019/01/14 19:46:13.000" "2019/01/14 19:46:13.200" -"2019/01/14 19:46:25.000" "2019/01/14 19:46:25.200" -"2019/01/14 19:46:37.000" "2019/01/14 19:46:37.200" -"2019/01/14 19:46:49.000" "2019/01/14 19:46:49.200" -"2019/01/14 19:51:48.600" "2019/01/14 19:51:48.800" -"2019/01/14 19:52:00.600" "2019/01/14 19:52:00.800" -"2019/01/14 19:52:12.600" "2019/01/14 19:52:12.800" -"2019/01/14 19:52:24.600" "2019/01/14 19:52:24.800" -"2019/01/14 19:52:36.600" "2019/01/14 19:52:36.800" -"2019/01/14 19:52:48.600" "2019/01/14 19:52:48.800" -"2019/01/14 19:53:00.600" "2019/01/14 19:53:00.800" -"2019/01/14 19:53:12.600" "2019/01/14 19:53:12.800" -"2019/01/14 19:53:24.600" "2019/01/14 19:53:24.800" -"2019/01/14 19:53:36.600" "2019/01/14 19:53:36.800" -"2019/01/14 19:53:48.600" "2019/01/14 19:53:48.800" -"2019/01/14 19:54:00.600" "2019/01/14 19:54:00.800" -"2019/01/14 19:54:12.600" "2019/01/14 19:54:12.800" -"2019/01/14 19:54:55.000" "2019/01/14 19:54:55.200" -"2019/01/14 19:55:07.000" "2019/01/14 19:55:07.200" -"2019/01/14 19:55:19.000" "2019/01/14 19:55:19.200" -"2019/01/14 19:55:31.000" "2019/01/14 19:55:31.200" -"2019/01/14 19:55:43.000" "2019/01/14 19:55:43.200" -"2019/01/14 19:55:55.000" "2019/01/14 19:55:55.200" -"2019/01/14 19:56:07.000" "2019/01/14 19:56:07.200" -"2019/01/14 19:56:19.000" "2019/01/14 19:56:19.200" -"2019/01/14 19:56:31.000" "2019/01/14 19:56:31.200" -"2019/01/14 19:56:43.000" "2019/01/14 19:56:43.200" -"2019/01/14 19:56:55.000" "2019/01/14 19:56:55.200" -"2019/01/14 19:57:07.000" "2019/01/14 19:57:07.200" -"2019/01/14 19:57:19.000" "2019/01/14 19:57:19.200" -"2019/01/14 20:02:18.600" "2019/01/14 20:02:18.800" -"2019/01/14 20:02:30.600" "2019/01/14 20:02:30.800" -"2019/01/14 20:02:42.600" "2019/01/14 20:02:42.800" -"2019/01/14 20:02:54.600" "2019/01/14 20:02:54.800" -"2019/01/14 20:03:06.600" "2019/01/14 20:03:06.800" -"2019/01/14 20:03:18.600" "2019/01/14 20:03:18.800" -"2019/01/14 20:03:30.600" "2019/01/14 20:03:30.800" -"2019/01/14 20:03:42.600" "2019/01/14 20:03:42.800" -"2019/01/14 20:03:54.600" "2019/01/14 20:03:54.800" -"2019/01/14 20:04:06.600" "2019/01/14 20:04:06.800" -"2019/01/14 20:04:18.600" "2019/01/14 20:04:18.800" -"2019/01/14 20:04:30.600" "2019/01/14 20:04:30.800" -"2019/01/14 20:04:42.600" "2019/01/14 20:04:42.800" -"2019/01/14 20:05:26.000" "2019/01/14 20:05:26.200" -"2019/01/14 20:05:38.000" "2019/01/14 20:05:38.200" -"2019/01/14 20:05:50.000" "2019/01/14 20:05:50.200" -"2019/01/14 20:06:02.000" "2019/01/14 20:06:02.200" -"2019/01/14 20:06:14.000" "2019/01/14 20:06:14.200" -"2019/01/14 20:06:26.000" "2019/01/14 20:06:26.200" -"2019/01/14 20:06:38.000" "2019/01/14 20:06:38.200" -"2019/01/14 20:06:50.000" "2019/01/14 20:06:50.200" -"2019/01/14 20:07:02.000" "2019/01/14 20:07:02.200" -"2019/01/14 20:07:14.000" "2019/01/14 20:07:14.200" -"2019/01/14 20:07:26.000" "2019/01/14 20:07:26.200" -"2019/01/14 20:07:38.000" "2019/01/14 20:07:38.200" -"2019/01/14 20:07:50.000" "2019/01/14 20:07:50.200" -"2019/01/14 20:12:49.600" "2019/01/14 20:12:49.800" -"2019/01/14 20:13:01.600" "2019/01/14 20:13:01.800" -"2019/01/14 20:13:13.600" "2019/01/14 20:13:13.800" -"2019/01/14 20:13:25.600" "2019/01/14 20:13:25.800" -"2019/01/14 20:13:37.600" "2019/01/14 20:13:37.800" -"2019/01/14 20:13:49.600" "2019/01/14 20:13:49.800" -"2019/01/14 20:14:01.600" "2019/01/14 20:14:01.800" -"2019/01/14 20:14:13.600" "2019/01/14 20:14:13.800" -"2019/01/14 20:14:25.600" "2019/01/14 20:14:25.800" -"2019/01/14 20:14:37.600" "2019/01/14 20:14:37.800" -"2019/01/14 20:14:49.600" "2019/01/14 20:14:49.800" -"2019/01/14 20:15:01.600" "2019/01/14 20:15:01.800" -"2019/01/14 20:15:13.600" "2019/01/14 20:15:13.800" -"2019/01/14 20:15:57.000" "2019/01/14 20:15:57.200" -"2019/01/14 20:16:09.000" "2019/01/14 20:16:09.200" -"2019/01/14 20:16:21.000" "2019/01/14 20:16:21.200" -"2019/01/14 20:16:33.000" "2019/01/14 20:16:33.200" -"2019/01/14 20:16:45.000" "2019/01/14 20:16:45.200" -"2019/01/14 20:16:57.000" "2019/01/14 20:16:57.200" -"2019/01/14 20:17:09.000" "2019/01/14 20:17:09.200" -"2019/01/14 20:17:21.000" "2019/01/14 20:17:21.200" -"2019/01/14 20:17:33.000" "2019/01/14 20:17:33.200" -"2019/01/14 20:17:45.000" "2019/01/14 20:17:45.200" -"2019/01/14 20:17:57.000" "2019/01/14 20:17:57.200" -"2019/01/14 20:18:09.000" "2019/01/14 20:18:09.200" -"2019/01/14 20:18:21.000" "2019/01/14 20:18:21.200" -"2019/01/14 20:23:20.600" "2019/01/14 20:23:20.800" -"2019/01/14 20:23:32.600" "2019/01/14 20:23:32.800" -"2019/01/14 20:23:44.600" "2019/01/14 20:23:44.800" -"2019/01/14 20:23:56.600" "2019/01/14 20:23:56.800" -"2019/01/14 20:24:08.600" "2019/01/14 20:24:08.800" -"2019/01/14 20:24:20.600" "2019/01/14 20:24:20.800" -"2019/01/14 20:24:32.600" "2019/01/14 20:24:32.800" -"2019/01/14 20:24:44.600" "2019/01/14 20:24:44.800" -"2019/01/14 20:24:56.600" "2019/01/14 20:24:56.800" -"2019/01/14 20:25:08.600" "2019/01/14 20:25:08.800" -"2019/01/14 20:25:20.600" "2019/01/14 20:25:20.800" -"2019/01/14 20:25:32.600" "2019/01/14 20:25:32.800" -"2019/01/14 20:25:44.600" "2019/01/14 20:25:44.800" -"2019/01/14 20:26:28.000" "2019/01/14 20:26:28.200" -"2019/01/14 20:26:40.000" "2019/01/14 20:26:40.200" -"2019/01/14 20:26:52.000" "2019/01/14 20:26:52.200" -"2019/01/14 20:27:04.000" "2019/01/14 20:27:04.200" -"2019/01/14 20:27:16.000" "2019/01/14 20:27:16.200" -"2019/01/14 20:27:28.000" "2019/01/14 20:27:28.200" -"2019/01/14 20:27:40.000" "2019/01/14 20:27:40.200" -"2019/01/14 20:27:52.000" "2019/01/14 20:27:52.200" -"2019/01/14 20:28:04.000" "2019/01/14 20:28:04.200" -"2019/01/14 20:28:16.000" "2019/01/14 20:28:16.200" -"2019/01/14 20:28:28.000" "2019/01/14 20:28:28.200" -"2019/01/14 20:28:40.000" "2019/01/14 20:28:40.200" -"2019/01/14 20:28:52.000" "2019/01/14 20:28:52.200" -"2019/01/14 20:33:52.600" "2019/01/14 20:33:52.800" -"2019/01/14 20:34:04.600" "2019/01/14 20:34:04.800" -"2019/01/14 20:34:16.600" "2019/01/14 20:34:16.800" -"2019/01/14 20:34:28.600" "2019/01/14 20:34:28.800" -"2019/01/14 20:34:40.600" "2019/01/14 20:34:40.800" -"2019/01/14 20:34:52.600" "2019/01/14 20:34:52.800" -"2019/01/14 20:35:04.600" "2019/01/14 20:35:04.800" -"2019/01/14 20:35:16.600" "2019/01/14 20:35:16.800" -"2019/01/14 20:35:28.600" "2019/01/14 20:35:28.800" -"2019/01/14 20:35:40.600" "2019/01/14 20:35:40.800" -"2019/01/14 20:35:52.600" "2019/01/14 20:35:52.800" -"2019/01/14 20:36:04.600" "2019/01/14 20:36:04.800" -"2019/01/14 20:36:16.600" "2019/01/14 20:36:16.800" -"2019/01/14 20:37:00.000" "2019/01/14 20:37:00.200" -"2019/01/14 20:37:12.000" "2019/01/14 20:37:12.200" -"2019/01/14 20:37:24.000" "2019/01/14 20:37:24.200" -"2019/01/14 20:37:36.000" "2019/01/14 20:37:36.200" -"2019/01/14 20:37:48.000" "2019/01/14 20:37:48.200" -"2019/01/14 20:38:00.000" "2019/01/14 20:38:00.200" -"2019/01/14 20:38:12.000" "2019/01/14 20:38:12.200" -"2019/01/14 20:38:24.000" "2019/01/14 20:38:24.200" -"2019/01/14 20:38:36.000" "2019/01/14 20:38:36.200" -"2019/01/14 20:38:48.000" "2019/01/14 20:38:48.200" -"2019/01/14 20:39:00.000" "2019/01/14 20:39:00.200" -"2019/01/14 20:39:12.000" "2019/01/14 20:39:12.200" -"2019/01/14 20:39:24.000" "2019/01/14 20:39:24.200" -"2019/01/14 20:44:24.600" "2019/01/14 20:44:24.800" -"2019/01/14 20:44:36.600" "2019/01/14 20:44:36.800" -"2019/01/14 20:44:48.600" "2019/01/14 20:44:48.800" -"2019/01/14 20:45:00.600" "2019/01/14 20:45:00.800" -"2019/01/14 20:45:12.600" "2019/01/14 20:45:12.800" -"2019/01/14 20:45:24.600" "2019/01/14 20:45:24.800" -"2019/01/14 20:45:36.600" "2019/01/14 20:45:36.800" -"2019/01/14 20:45:48.600" "2019/01/14 20:45:48.800" -"2019/01/14 20:46:00.600" "2019/01/14 20:46:00.800" -"2019/01/14 20:46:12.600" "2019/01/14 20:46:12.800" -"2019/01/14 20:46:24.600" "2019/01/14 20:46:24.800" -"2019/01/14 20:46:36.600" "2019/01/14 20:46:36.800" -"2019/01/14 20:46:48.600" "2019/01/14 20:46:48.800" -"2019/01/14 20:47:32.000" "2019/01/14 20:47:32.200" -"2019/01/14 20:47:44.000" "2019/01/14 20:47:44.200" -"2019/01/14 20:47:56.000" "2019/01/14 20:47:56.200" -"2019/01/14 20:48:08.000" "2019/01/14 20:48:08.200" -"2019/01/14 20:48:20.000" "2019/01/14 20:48:20.200" -"2019/01/14 20:48:32.000" "2019/01/14 20:48:32.200" -"2019/01/14 20:48:44.000" "2019/01/14 20:48:44.200" -"2019/01/14 20:48:56.000" "2019/01/14 20:48:56.200" -"2019/01/14 20:49:08.000" "2019/01/14 20:49:08.200" -"2019/01/14 20:49:20.000" "2019/01/14 20:49:20.200" -"2019/01/14 20:49:32.000" "2019/01/14 20:49:32.200" -"2019/01/14 20:49:44.000" "2019/01/14 20:49:44.200" -"2019/01/14 20:49:56.000" "2019/01/14 20:49:56.200" -"2019/01/14 20:54:56.600" "2019/01/14 20:54:56.800" -"2019/01/14 20:55:08.600" "2019/01/14 20:55:08.800" -"2019/01/14 20:55:20.600" "2019/01/14 20:55:20.800" -"2019/01/14 20:55:32.600" "2019/01/14 20:55:32.800" -"2019/01/14 20:55:44.600" "2019/01/14 20:55:44.800" -"2019/01/14 20:55:56.600" "2019/01/14 20:55:56.800" -"2019/01/14 20:56:08.600" "2019/01/14 20:56:08.800" -"2019/01/14 20:56:20.600" "2019/01/14 20:56:20.800" -"2019/01/14 20:56:32.600" "2019/01/14 20:56:32.800" -"2019/01/14 20:56:44.600" "2019/01/14 20:56:44.800" -"2019/01/14 20:56:56.600" "2019/01/14 20:56:56.800" -"2019/01/14 20:57:08.600" "2019/01/14 20:57:08.800" -"2019/01/14 20:57:20.600" "2019/01/14 20:57:20.800" -"2019/01/14 20:58:04.000" "2019/01/14 20:58:04.200" -"2019/01/14 20:58:16.000" "2019/01/14 20:58:16.200" -"2019/01/14 20:58:28.000" "2019/01/14 20:58:28.200" -"2019/01/14 20:58:40.000" "2019/01/14 20:58:40.200" -"2019/01/14 20:58:52.000" "2019/01/14 20:58:52.200" -"2019/01/14 20:59:04.000" "2019/01/14 20:59:04.200" -"2019/01/14 20:59:16.000" "2019/01/14 20:59:16.200" -"2019/01/14 20:59:28.000" "2019/01/14 20:59:28.200" -"2019/01/14 20:59:40.000" "2019/01/14 20:59:40.200" -"2019/01/14 20:59:52.000" "2019/01/14 20:59:52.200" -"2019/01/14 21:00:04.000" "2019/01/14 21:00:04.200" -"2019/01/14 21:00:16.000" "2019/01/14 21:00:16.200" -"2019/01/14 21:00:28.000" "2019/01/14 21:00:28.200" -"2019/01/14 21:05:28.600" "2019/01/14 21:05:28.800" -"2019/01/14 21:05:40.600" "2019/01/14 21:05:40.800" -"2019/01/14 21:05:52.600" "2019/01/14 21:05:52.800" -"2019/01/14 21:06:04.600" "2019/01/14 21:06:04.800" -"2019/01/14 21:06:16.600" "2019/01/14 21:06:16.800" -"2019/01/14 21:06:28.600" "2019/01/14 21:06:28.800" -"2019/01/14 21:06:40.600" "2019/01/14 21:06:40.800" -"2019/01/14 21:06:52.600" "2019/01/14 21:06:52.800" -"2019/01/14 21:07:04.600" "2019/01/14 21:07:04.800" -"2019/01/14 21:07:16.600" "2019/01/14 21:07:16.800" -"2019/01/14 21:07:28.600" "2019/01/14 21:07:28.800" -"2019/01/14 21:07:40.600" "2019/01/14 21:07:40.800" -"2019/01/14 21:07:52.600" "2019/01/14 21:07:52.800" -"2019/01/14 21:08:36.000" "2019/01/14 21:08:36.200" -"2019/01/14 21:08:48.000" "2019/01/14 21:08:48.200" -"2019/01/14 21:09:00.000" "2019/01/14 21:09:00.200" -"2019/01/14 21:09:12.000" "2019/01/14 21:09:12.200" -"2019/01/14 21:09:24.000" "2019/01/14 21:09:24.200" -"2019/01/14 21:09:36.000" "2019/01/14 21:09:36.200" -"2019/01/14 21:09:48.000" "2019/01/14 21:09:48.200" -"2019/01/14 21:10:00.000" "2019/01/14 21:10:00.200" -"2019/01/14 21:10:12.000" "2019/01/14 21:10:12.200" -"2019/01/14 21:10:24.000" "2019/01/14 21:10:24.200" -"2019/01/14 21:10:36.000" "2019/01/14 21:10:36.200" -"2019/01/14 21:10:48.000" "2019/01/14 21:10:48.200" -"2019/01/14 21:11:00.000" "2019/01/14 21:11:00.200" -"2019/01/14 21:16:00.600" "2019/01/14 21:16:00.800" -"2019/01/14 21:16:12.600" "2019/01/14 21:16:12.800" -"2019/01/14 21:16:24.600" "2019/01/14 21:16:24.800" -"2019/01/14 21:16:36.600" "2019/01/14 21:16:36.800" -"2019/01/14 21:16:48.600" "2019/01/14 21:16:48.800" -"2019/01/14 21:17:00.600" "2019/01/14 21:17:00.800" -"2019/01/14 21:17:12.600" "2019/01/14 21:17:12.800" -"2019/01/14 21:17:24.600" "2019/01/14 21:17:24.800" -"2019/01/14 21:17:36.600" "2019/01/14 21:17:36.800" -"2019/01/14 21:17:48.600" "2019/01/14 21:17:48.800" -"2019/01/14 21:18:00.600" "2019/01/14 21:18:00.800" -"2019/01/14 21:18:12.600" "2019/01/14 21:18:12.800" -"2019/01/14 21:18:24.600" "2019/01/14 21:18:24.800" -"2019/01/14 21:19:08.000" "2019/01/14 21:19:08.200" -"2019/01/14 21:19:20.000" "2019/01/14 21:19:20.200" -"2019/01/14 21:19:32.000" "2019/01/14 21:19:32.200" -"2019/01/14 21:19:44.000" "2019/01/14 21:19:44.200" -"2019/01/14 21:19:56.000" "2019/01/14 21:19:56.200" -"2019/01/14 21:20:08.000" "2019/01/14 21:20:08.200" -"2019/01/14 21:20:20.000" "2019/01/14 21:20:20.200" -"2019/01/14 21:20:32.000" "2019/01/14 21:20:32.200" -"2019/01/14 21:20:44.000" "2019/01/14 21:20:44.200" -"2019/01/14 21:20:56.000" "2019/01/14 21:20:56.200" -"2019/01/14 21:21:08.000" "2019/01/14 21:21:08.200" -"2019/01/14 21:21:20.000" "2019/01/14 21:21:20.200" -"2019/01/14 21:21:32.000" "2019/01/14 21:21:32.200" -"2019/01/14 21:26:32.600" "2019/01/14 21:26:32.800" -"2019/01/14 21:26:44.600" "2019/01/14 21:26:44.800" -"2019/01/14 21:26:56.600" "2019/01/14 21:26:56.800" -"2019/01/14 21:27:08.600" "2019/01/14 21:27:08.800" -"2019/01/14 21:27:20.600" "2019/01/14 21:27:20.800" -"2019/01/14 21:27:32.600" "2019/01/14 21:27:32.800" -"2019/01/14 21:27:44.600" "2019/01/14 21:27:44.800" -"2019/01/14 21:27:56.600" "2019/01/14 21:27:56.800" -"2019/01/14 21:28:08.600" "2019/01/14 21:28:08.800" -"2019/01/14 21:28:20.600" "2019/01/14 21:28:20.800" -"2019/01/14 21:28:32.600" "2019/01/14 21:28:32.800" -"2019/01/14 21:28:44.600" "2019/01/14 21:28:44.800" -"2019/01/14 21:28:56.600" "2019/01/14 21:28:56.800" -"2019/01/20 19:13:45.468" "2019/01/20 19:13:45.668" -"2019/01/20 19:13:57.468" "2019/01/20 19:13:57.668" -"2019/01/20 19:14:09.468" "2019/01/20 19:14:09.668" -"2019/01/20 19:14:21.468" "2019/01/20 19:14:21.668" -"2019/01/20 19:14:33.468" "2019/01/20 19:14:33.668" -"2019/01/20 19:14:45.468" "2019/01/20 19:14:45.668" -"2019/01/20 19:14:57.468" "2019/01/20 19:14:57.668" -"2019/01/20 19:15:09.468" "2019/01/20 19:15:09.668" -"2019/01/20 19:15:21.468" "2019/01/20 19:15:21.668" -"2019/01/20 19:15:33.468" "2019/01/20 19:15:33.668" -"2019/01/20 19:15:45.468" "2019/01/20 19:15:45.668" -"2019/01/20 19:15:57.468" "2019/01/20 19:15:57.668" -"2019/01/20 19:16:09.468" "2019/01/20 19:16:09.668" -"2019/01/20 19:16:21.468" "2019/01/20 19:16:21.668" -"2019/01/20 19:21:42.681" "2019/01/20 19:21:42.881" -"2019/01/20 19:21:54.681" "2019/01/20 19:21:54.881" -"2019/01/20 19:22:06.681" "2019/01/20 19:22:06.881" -"2019/01/20 19:22:18.681" "2019/01/20 19:22:18.881" -"2019/01/20 19:22:30.681" "2019/01/20 19:22:30.881" -"2019/01/20 19:22:42.681" "2019/01/20 19:22:42.881" -"2019/01/20 19:22:54.681" "2019/01/20 19:22:54.881" -"2019/01/20 19:23:06.681" "2019/01/20 19:23:06.881" -"2019/01/20 19:23:18.681" "2019/01/20 19:23:18.881" -"2019/01/20 19:23:30.681" "2019/01/20 19:23:30.881" -"2019/01/20 19:23:42.681" "2019/01/20 19:23:42.881" -"2019/01/20 19:23:54.681" "2019/01/20 19:23:54.881" -"2019/01/20 19:24:06.681" "2019/01/20 19:24:06.881" -"2019/01/20 19:24:18.681" "2019/01/20 19:24:18.881" -"2019/01/20 19:25:00.149" "2019/01/20 19:25:00.349" -"2019/01/20 19:25:12.149" "2019/01/20 19:25:12.349" -"2019/01/20 19:25:24.149" "2019/01/20 19:25:24.349" -"2019/01/20 19:25:36.149" "2019/01/20 19:25:36.349" -"2019/01/20 19:25:48.149" "2019/01/20 19:25:48.349" -"2019/01/20 19:26:00.149" "2019/01/20 19:26:00.349" -"2019/01/20 19:26:12.149" "2019/01/20 19:26:12.349" -"2019/01/20 19:26:24.149" "2019/01/20 19:26:24.349" -"2019/01/20 19:26:36.149" "2019/01/20 19:26:36.349" -"2019/01/20 19:26:48.149" "2019/01/20 19:26:48.349" -"2019/01/20 19:27:00.149" "2019/01/20 19:27:00.349" -"2019/01/20 19:27:12.149" "2019/01/20 19:27:12.349" -"2019/01/20 19:27:24.149" "2019/01/20 19:27:24.349" -"2019/01/20 19:27:36.149" "2019/01/20 19:27:36.349" -"2019/01/20 19:32:57.362" "2019/01/20 19:32:57.562" -"2019/01/20 19:33:09.362" "2019/01/20 19:33:09.562" -"2019/01/20 19:33:21.362" "2019/01/20 19:33:21.562" -"2019/01/20 19:33:33.362" "2019/01/20 19:33:33.562" -"2019/01/20 19:33:45.362" "2019/01/20 19:33:45.562" -"2019/01/20 19:33:57.362" "2019/01/20 19:33:57.562" -"2019/01/20 19:34:09.362" "2019/01/20 19:34:09.562" -"2019/01/20 19:34:21.362" "2019/01/20 19:34:21.562" -"2019/01/20 19:34:33.362" "2019/01/20 19:34:33.562" -"2019/01/20 19:34:45.362" "2019/01/20 19:34:45.562" -"2019/01/20 19:34:57.362" "2019/01/20 19:34:57.562" -"2019/01/20 19:35:09.362" "2019/01/20 19:35:09.562" -"2019/01/20 19:35:21.362" "2019/01/20 19:35:21.562" -"2019/01/20 19:35:33.362" "2019/01/20 19:35:33.562" -"2019/01/20 19:36:14.830" "2019/01/20 19:36:15.030" -"2019/01/20 19:36:26.830" "2019/01/20 19:36:27.030" -"2019/01/20 19:36:38.830" "2019/01/20 19:36:39.030" -"2019/01/20 19:36:50.830" "2019/01/20 19:36:51.030" -"2019/01/20 19:37:02.830" "2019/01/20 19:37:03.030" -"2019/01/20 19:37:14.830" "2019/01/20 19:37:15.030" -"2019/01/20 19:37:26.830" "2019/01/20 19:37:27.030" -"2019/01/20 19:37:38.830" "2019/01/20 19:37:39.030" -"2019/01/20 19:37:50.830" "2019/01/20 19:37:51.030" -"2019/01/20 19:38:02.830" "2019/01/20 19:38:03.030" -"2019/01/20 19:38:14.830" "2019/01/20 19:38:15.030" -"2019/01/20 19:38:26.830" "2019/01/20 19:38:27.030" -"2019/01/20 19:38:38.830" "2019/01/20 19:38:39.030" -"2019/01/20 19:38:50.830" "2019/01/20 19:38:51.030" -"2019/01/20 19:44:12.043" "2019/01/20 19:44:12.243" -"2019/01/20 19:44:24.043" "2019/01/20 19:44:24.243" -"2019/01/20 19:44:36.043" "2019/01/20 19:44:36.243" -"2019/01/20 19:44:48.043" "2019/01/20 19:44:48.243" -"2019/01/20 19:45:00.043" "2019/01/20 19:45:00.243" -"2019/01/20 19:45:12.043" "2019/01/20 19:45:12.243" -"2019/01/20 19:45:24.043" "2019/01/20 19:45:24.243" -"2019/01/20 19:45:36.043" "2019/01/20 19:45:36.243" -"2019/01/20 19:45:48.043" "2019/01/20 19:45:48.243" -"2019/01/20 19:46:00.043" "2019/01/20 19:46:00.243" -"2019/01/20 19:46:12.043" "2019/01/20 19:46:12.243" -"2019/01/20 19:46:24.043" "2019/01/20 19:46:24.243" -"2019/01/20 19:46:36.043" "2019/01/20 19:46:36.243" -"2019/01/20 19:46:48.043" "2019/01/20 19:46:48.243" -"2019/01/20 19:47:29.511" "2019/01/20 19:47:29.711" -"2019/01/20 19:47:41.511" "2019/01/20 19:47:41.711" -"2019/01/20 19:47:53.511" "2019/01/20 19:47:53.711" -"2019/01/20 19:48:05.511" "2019/01/20 19:48:05.711" -"2019/01/20 19:48:17.511" "2019/01/20 19:48:17.711" -"2019/01/20 19:48:29.511" "2019/01/20 19:48:29.711" -"2019/01/20 19:48:41.511" "2019/01/20 19:48:41.711" -"2019/01/20 19:48:53.511" "2019/01/20 19:48:53.711" -"2019/01/20 19:49:05.511" "2019/01/20 19:49:05.711" -"2019/01/20 19:49:17.511" "2019/01/20 19:49:17.711" -"2019/01/20 19:49:29.511" "2019/01/20 19:49:29.711" -"2019/01/20 19:49:41.511" "2019/01/20 19:49:41.711" -"2019/01/20 19:49:53.511" "2019/01/20 19:49:53.711" -"2019/01/20 19:50:05.511" "2019/01/20 19:50:05.711" -"2019/01/20 19:55:26.723" "2019/01/20 19:55:26.923" -"2019/01/20 19:55:38.723" "2019/01/20 19:55:38.923" -"2019/01/20 19:55:50.723" "2019/01/20 19:55:50.923" -"2019/01/20 19:56:02.723" "2019/01/20 19:56:02.923" -"2019/01/20 19:56:14.723" "2019/01/20 19:56:14.923" -"2019/01/20 19:56:26.723" "2019/01/20 19:56:26.923" -"2019/01/20 19:56:38.723" "2019/01/20 19:56:38.923" -"2019/01/20 19:56:50.723" "2019/01/20 19:56:50.923" -"2019/01/20 19:57:02.723" "2019/01/20 19:57:02.923" -"2019/01/20 19:57:14.723" "2019/01/20 19:57:14.923" -"2019/01/20 19:57:26.723" "2019/01/20 19:57:26.923" -"2019/01/20 19:57:38.723" "2019/01/20 19:57:38.923" -"2019/01/20 19:57:50.723" "2019/01/20 19:57:50.923" -"2019/01/20 19:58:02.723" "2019/01/20 19:58:02.923" -"2019/01/20 19:58:43.192" "2019/01/20 19:58:43.392" -"2019/01/20 19:58:55.192" "2019/01/20 19:58:55.392" -"2019/01/20 19:59:07.192" "2019/01/20 19:59:07.392" -"2019/01/20 19:59:19.192" "2019/01/20 19:59:19.392" -"2019/01/20 19:59:31.192" "2019/01/20 19:59:31.392" -"2019/01/20 19:59:43.192" "2019/01/20 19:59:43.392" -"2019/01/20 19:59:55.192" "2019/01/20 19:59:55.392" -"2019/01/20 20:00:07.192" "2019/01/20 20:00:07.392" -"2019/01/20 20:00:19.192" "2019/01/20 20:00:19.392" -"2019/01/20 20:00:31.192" "2019/01/20 20:00:31.392" -"2019/01/20 20:00:43.192" "2019/01/20 20:00:43.392" -"2019/01/20 20:00:55.192" "2019/01/20 20:00:55.392" -"2019/01/20 20:01:07.192" "2019/01/20 20:01:07.392" -"2019/01/20 20:01:19.192" "2019/01/20 20:01:19.392" -"2019/01/20 20:06:40.404" "2019/01/20 20:06:40.604" -"2019/01/20 20:06:52.404" "2019/01/20 20:06:52.604" -"2019/01/20 20:07:04.404" "2019/01/20 20:07:04.604" -"2019/01/20 20:07:16.404" "2019/01/20 20:07:16.604" -"2019/01/20 20:07:28.404" "2019/01/20 20:07:28.604" -"2019/01/20 20:07:40.404" "2019/01/20 20:07:40.604" -"2019/01/20 20:07:52.404" "2019/01/20 20:07:52.604" -"2019/01/20 20:08:04.404" "2019/01/20 20:08:04.604" -"2019/01/20 20:08:16.404" "2019/01/20 20:08:16.604" -"2019/01/20 20:08:28.404" "2019/01/20 20:08:28.604" -"2019/01/20 20:08:40.404" "2019/01/20 20:08:40.604" -"2019/01/20 20:08:52.404" "2019/01/20 20:08:52.604" -"2019/01/20 20:09:04.404" "2019/01/20 20:09:04.604" -"2019/01/20 20:09:16.404" "2019/01/20 20:09:16.604" -"2019/01/20 20:09:56.872" "2019/01/20 20:09:57.072" -"2019/01/20 20:10:08.872" "2019/01/20 20:10:09.072" -"2019/01/20 20:10:20.872" "2019/01/20 20:10:21.072" -"2019/01/20 20:10:32.872" "2019/01/20 20:10:33.072" -"2019/01/20 20:10:44.872" "2019/01/20 20:10:45.072" -"2019/01/20 20:10:56.872" "2019/01/20 20:10:57.072" -"2019/01/20 20:11:08.872" "2019/01/20 20:11:09.072" -"2019/01/20 20:11:20.872" "2019/01/20 20:11:21.072" -"2019/01/20 20:11:32.872" "2019/01/20 20:11:33.072" -"2019/01/20 20:11:44.872" "2019/01/20 20:11:45.072" -"2019/01/20 20:11:56.872" "2019/01/20 20:11:57.072" -"2019/01/20 20:12:08.872" "2019/01/20 20:12:09.072" -"2019/01/20 20:12:20.872" "2019/01/20 20:12:21.072" -"2019/01/20 20:12:32.872" "2019/01/20 20:12:33.072" -"2019/01/20 20:17:54.085" "2019/01/20 20:17:54.285" -"2019/01/20 20:18:06.085" "2019/01/20 20:18:06.285" -"2019/01/20 20:18:18.085" "2019/01/20 20:18:18.285" -"2019/01/20 20:18:30.085" "2019/01/20 20:18:30.285" -"2019/01/20 20:18:42.085" "2019/01/20 20:18:42.285" -"2019/01/20 20:18:54.085" "2019/01/20 20:18:54.285" -"2019/01/20 20:19:06.085" "2019/01/20 20:19:06.285" -"2019/01/20 20:19:18.085" "2019/01/20 20:19:18.285" -"2019/01/20 20:19:30.085" "2019/01/20 20:19:30.285" -"2019/01/20 20:19:42.085" "2019/01/20 20:19:42.285" -"2019/01/20 20:19:54.085" "2019/01/20 20:19:54.285" -"2019/01/20 20:20:06.085" "2019/01/20 20:20:06.285" -"2019/01/20 20:20:18.085" "2019/01/20 20:20:18.285" -"2019/01/20 20:20:30.085" "2019/01/20 20:20:30.285" -"2019/01/20 20:21:10.553" "2019/01/20 20:21:10.753" -"2019/01/20 20:21:22.553" "2019/01/20 20:21:22.753" -"2019/01/20 20:21:34.553" "2019/01/20 20:21:34.753" -"2019/01/20 20:21:46.553" "2019/01/20 20:21:46.753" -"2019/01/20 20:21:58.553" "2019/01/20 20:21:58.753" -"2019/01/20 20:22:10.553" "2019/01/20 20:22:10.753" -"2019/01/20 20:22:22.553" "2019/01/20 20:22:22.753" -"2019/01/20 20:22:34.553" "2019/01/20 20:22:34.753" -"2019/01/20 20:22:46.553" "2019/01/20 20:22:46.753" -"2019/01/20 20:22:58.553" "2019/01/20 20:22:58.753" -"2019/01/20 20:23:10.553" "2019/01/20 20:23:10.753" -"2019/01/20 20:23:22.553" "2019/01/20 20:23:22.753" -"2019/01/20 20:23:34.553" "2019/01/20 20:23:34.753" -"2019/01/20 20:23:46.553" "2019/01/20 20:23:46.753" -"2019/01/20 20:29:07.766" "2019/01/20 20:29:07.966" -"2019/01/20 20:29:19.766" "2019/01/20 20:29:19.966" -"2019/01/20 20:29:31.766" "2019/01/20 20:29:31.966" -"2019/01/20 20:29:43.766" "2019/01/20 20:29:43.966" -"2019/01/20 20:29:55.766" "2019/01/20 20:29:55.966" -"2019/01/20 20:30:07.766" "2019/01/20 20:30:07.966" -"2019/01/20 20:30:19.766" "2019/01/20 20:30:19.966" -"2019/01/20 20:30:31.766" "2019/01/20 20:30:31.966" -"2019/01/20 20:30:43.766" "2019/01/20 20:30:43.966" -"2019/01/20 20:30:55.766" "2019/01/20 20:30:55.966" -"2019/01/20 20:31:07.766" "2019/01/20 20:31:07.966" -"2019/01/20 20:31:19.766" "2019/01/20 20:31:19.966" -"2019/01/20 20:31:31.766" "2019/01/20 20:31:31.966" -"2019/01/20 20:31:43.766" "2019/01/20 20:31:43.966" -"2019/01/20 20:32:24.234" "2019/01/20 20:32:24.434" -"2019/01/20 20:32:36.234" "2019/01/20 20:32:36.434" -"2019/01/20 20:32:48.234" "2019/01/20 20:32:48.434" -"2019/01/20 20:33:00.234" "2019/01/20 20:33:00.434" -"2019/01/20 20:33:12.234" "2019/01/20 20:33:12.434" -"2019/01/20 20:33:24.234" "2019/01/20 20:33:24.434" -"2019/01/20 20:33:36.234" "2019/01/20 20:33:36.434" -"2019/01/20 20:33:48.234" "2019/01/20 20:33:48.434" -"2019/01/20 20:34:00.234" "2019/01/20 20:34:00.434" -"2019/01/20 20:34:12.234" "2019/01/20 20:34:12.434" -"2019/01/20 20:34:24.234" "2019/01/20 20:34:24.434" -"2019/01/20 20:34:36.234" "2019/01/20 20:34:36.434" -"2019/01/20 20:34:48.234" "2019/01/20 20:34:48.434" -"2019/01/20 20:35:00.234" "2019/01/20 20:35:00.434" -"2019/01/20 20:40:21.447" "2019/01/20 20:40:21.647" -"2019/01/20 20:40:33.447" "2019/01/20 20:40:33.647" -"2019/01/20 20:40:45.447" "2019/01/20 20:40:45.647" -"2019/01/20 20:40:57.447" "2019/01/20 20:40:57.647" -"2019/01/20 20:41:09.447" "2019/01/20 20:41:09.647" -"2019/01/20 20:41:21.447" "2019/01/20 20:41:21.647" -"2019/01/20 20:41:33.447" "2019/01/20 20:41:33.647" -"2019/01/20 20:41:45.447" "2019/01/20 20:41:45.647" -"2019/01/20 20:41:57.447" "2019/01/20 20:41:57.647" -"2019/01/20 20:42:09.447" "2019/01/20 20:42:09.647" -"2019/01/20 20:42:21.447" "2019/01/20 20:42:21.647" -"2019/01/20 20:42:33.447" "2019/01/20 20:42:33.647" -"2019/01/20 20:42:45.447" "2019/01/20 20:42:45.647" -"2019/01/20 20:42:57.447" "2019/01/20 20:42:57.647" -"2019/01/20 20:43:37.915" "2019/01/20 20:43:38.115" -"2019/01/20 20:43:49.915" "2019/01/20 20:43:50.115" -"2019/01/20 20:44:01.915" "2019/01/20 20:44:02.115" -"2019/01/20 20:44:13.915" "2019/01/20 20:44:14.115" -"2019/01/20 20:44:25.915" "2019/01/20 20:44:26.115" -"2019/01/20 20:44:37.915" "2019/01/20 20:44:38.115" -"2019/01/20 20:44:49.915" "2019/01/20 20:44:50.115" -"2019/01/20 20:45:01.915" "2019/01/20 20:45:02.115" -"2019/01/20 20:45:13.915" "2019/01/20 20:45:14.115" -"2019/01/20 20:45:25.915" "2019/01/20 20:45:26.115" -"2019/01/20 20:45:37.915" "2019/01/20 20:45:38.115" -"2019/01/20 20:45:49.915" "2019/01/20 20:45:50.115" -"2019/01/20 20:46:01.915" "2019/01/20 20:46:02.115" -"2019/01/20 20:46:13.915" "2019/01/20 20:46:14.115" -"2019/01/20 20:51:34.128" "2019/01/20 20:51:34.328" -"2019/01/20 20:51:46.128" "2019/01/20 20:51:46.328" -"2019/01/20 20:51:58.128" "2019/01/20 20:51:58.328" -"2019/01/20 20:52:10.128" "2019/01/20 20:52:10.328" -"2019/01/20 20:52:22.128" "2019/01/20 20:52:22.328" -"2019/01/20 20:52:34.128" "2019/01/20 20:52:34.328" -"2019/01/20 20:52:46.128" "2019/01/20 20:52:46.328" -"2019/01/20 20:52:58.128" "2019/01/20 20:52:58.328" -"2019/01/20 20:53:10.128" "2019/01/20 20:53:10.328" -"2019/01/20 20:53:22.128" "2019/01/20 20:53:22.328" -"2019/01/20 20:53:34.128" "2019/01/20 20:53:34.328" -"2019/01/20 20:53:46.128" "2019/01/20 20:53:46.328" -"2019/01/20 20:53:58.128" "2019/01/20 20:53:58.328" -"2019/01/20 20:54:10.128" "2019/01/20 20:54:10.328" -"2019/01/20 20:54:50.596" "2019/01/20 20:54:50.796" -"2019/01/20 20:55:02.596" "2019/01/20 20:55:02.796" -"2019/01/20 20:55:14.596" "2019/01/20 20:55:14.796" -"2019/01/20 20:55:26.596" "2019/01/20 20:55:26.796" -"2019/01/20 20:55:38.596" "2019/01/20 20:55:38.796" -"2019/01/20 20:55:50.596" "2019/01/20 20:55:50.796" -"2019/01/20 20:56:02.596" "2019/01/20 20:56:02.796" -"2019/01/20 20:56:14.596" "2019/01/20 20:56:14.796" -"2019/01/20 20:56:26.596" "2019/01/20 20:56:26.796" -"2019/01/20 20:56:38.596" "2019/01/20 20:56:38.796" -"2019/01/20 20:56:50.596" "2019/01/20 20:56:50.796" -"2019/01/20 20:57:02.596" "2019/01/20 20:57:02.796" -"2019/01/20 20:57:14.596" "2019/01/20 20:57:14.796" -"2019/01/20 20:57:26.596" "2019/01/20 20:57:26.796" -"2019/01/20 21:02:46.809" "2019/01/20 21:02:47.009" -"2019/01/20 21:02:58.809" "2019/01/20 21:02:59.009" -"2019/01/20 21:03:10.809" "2019/01/20 21:03:11.009" -"2019/01/20 21:03:22.809" "2019/01/20 21:03:23.009" -"2019/01/20 21:03:34.809" "2019/01/20 21:03:35.009" -"2019/01/20 21:03:46.809" "2019/01/20 21:03:47.009" -"2019/01/20 21:03:58.809" "2019/01/20 21:03:59.009" -"2019/01/20 21:04:10.809" "2019/01/20 21:04:11.009" -"2019/01/20 21:04:22.809" "2019/01/20 21:04:23.009" -"2019/01/20 21:04:34.809" "2019/01/20 21:04:35.009" -"2019/01/20 21:04:46.809" "2019/01/20 21:04:47.009" -"2019/01/20 21:04:58.809" "2019/01/20 21:04:59.009" -"2019/01/20 21:05:10.809" "2019/01/20 21:05:11.009" -"2019/01/20 21:05:22.809" "2019/01/20 21:05:23.009" -"2019/01/20 21:06:02.277" "2019/01/20 21:06:02.477" -"2019/01/20 21:06:14.277" "2019/01/20 21:06:14.477" -"2019/01/20 21:06:26.277" "2019/01/20 21:06:26.477" -"2019/01/20 21:06:38.277" "2019/01/20 21:06:38.477" -"2019/01/20 21:06:50.277" "2019/01/20 21:06:50.477" -"2019/01/20 21:07:02.277" "2019/01/20 21:07:02.477" -"2019/01/20 21:07:14.277" "2019/01/20 21:07:14.477" -"2019/01/20 21:07:26.277" "2019/01/20 21:07:26.477" -"2019/01/20 21:07:38.277" "2019/01/20 21:07:38.477" -"2019/01/20 21:07:50.277" "2019/01/20 21:07:50.477" -"2019/01/20 21:08:02.277" "2019/01/20 21:08:02.477" -"2019/01/20 21:08:14.277" "2019/01/20 21:08:14.477" -"2019/01/20 21:08:26.277" "2019/01/20 21:08:26.477" -"2019/01/20 21:08:38.277" "2019/01/20 21:08:38.477" -"2019/01/20 21:13:58.489" "2019/01/20 21:13:58.689" -"2019/01/20 21:14:10.489" "2019/01/20 21:14:10.689" -"2019/01/20 21:14:22.489" "2019/01/20 21:14:22.689" -"2019/01/20 21:14:34.489" "2019/01/20 21:14:34.689" -"2019/01/20 21:14:46.489" "2019/01/20 21:14:46.689" -"2019/01/20 21:14:58.489" "2019/01/20 21:14:58.689" -"2019/01/20 21:15:10.489" "2019/01/20 21:15:10.689" -"2019/01/20 21:15:22.489" "2019/01/20 21:15:22.689" -"2019/01/20 21:15:34.489" "2019/01/20 21:15:34.689" -"2019/01/20 21:15:46.489" "2019/01/20 21:15:46.689" -"2019/01/20 21:15:58.489" "2019/01/20 21:15:58.689" -"2019/01/20 21:16:10.489" "2019/01/20 21:16:10.689" -"2019/01/20 21:16:22.489" "2019/01/20 21:16:22.689" -"2019/01/20 21:16:34.489" "2019/01/20 21:16:34.689" -"2019/01/20 21:17:13.958" "2019/01/20 21:17:14.158" -"2019/01/20 21:17:25.958" "2019/01/20 21:17:26.158" -"2019/01/20 21:17:37.958" "2019/01/20 21:17:38.158" -"2019/01/20 21:17:49.958" "2019/01/20 21:17:50.158" -"2019/01/20 21:18:01.958" "2019/01/20 21:18:02.158" -"2019/01/20 21:18:13.958" "2019/01/20 21:18:14.158" -"2019/01/20 21:18:25.958" "2019/01/20 21:18:26.158" -"2019/01/20 21:18:37.958" "2019/01/20 21:18:38.158" -"2019/01/20 21:18:49.958" "2019/01/20 21:18:50.158" -"2019/01/20 21:19:01.958" "2019/01/20 21:19:02.158" -"2019/01/20 21:19:13.958" "2019/01/20 21:19:14.158" -"2019/01/20 21:19:25.958" "2019/01/20 21:19:26.158" -"2019/01/20 21:19:37.958" "2019/01/20 21:19:38.158" -"2019/01/20 21:19:49.958" "2019/01/20 21:19:50.158" -"2019/01/20 21:25:10.170" "2019/01/20 21:25:10.370" -"2019/01/20 21:25:22.170" "2019/01/20 21:25:22.370" -"2019/01/20 21:25:34.170" "2019/01/20 21:25:34.370" -"2019/01/20 21:25:46.170" "2019/01/20 21:25:46.370" -"2019/01/20 21:25:58.170" "2019/01/20 21:25:58.370" -"2019/01/20 21:26:10.170" "2019/01/20 21:26:10.370" -"2019/01/20 21:26:22.170" "2019/01/20 21:26:22.370" -"2019/01/20 21:26:34.170" "2019/01/20 21:26:34.370" -"2019/01/20 21:26:46.170" "2019/01/20 21:26:46.370" -"2019/01/20 21:26:58.170" "2019/01/20 21:26:58.370" -"2019/01/20 21:27:10.170" "2019/01/20 21:27:10.370" -"2019/01/20 21:27:22.170" "2019/01/20 21:27:22.370" -"2019/01/20 21:27:34.170" "2019/01/20 21:27:34.370" -"2019/01/20 21:27:46.170" "2019/01/20 21:27:46.370" -"2019/01/20 21:28:25.638" "2019/01/20 21:28:25.838" -"2019/01/20 21:28:37.638" "2019/01/20 21:28:37.838" -"2019/01/20 21:28:49.638" "2019/01/20 21:28:49.838" -"2019/01/20 21:29:01.638" "2019/01/20 21:29:01.838" -"2019/01/20 21:29:13.638" "2019/01/20 21:29:13.838" -"2019/01/20 21:29:25.638" "2019/01/20 21:29:25.838" -"2019/01/20 21:29:37.638" "2019/01/20 21:29:37.838" -"2019/01/20 21:29:49.638" "2019/01/20 21:29:49.838" -"2019/01/20 21:30:01.638" "2019/01/20 21:30:01.838" -"2019/01/20 21:30:13.638" "2019/01/20 21:30:13.838" -"2019/01/20 21:30:25.638" "2019/01/20 21:30:25.838" -"2019/01/20 21:30:37.638" "2019/01/20 21:30:37.838" -"2019/01/20 21:30:49.638" "2019/01/20 21:30:49.838" -"2019/01/20 21:31:01.638" "2019/01/20 21:31:01.838" -"2019/01/20 21:36:21.851" "2019/01/20 21:36:22.051" -"2019/01/20 21:36:33.851" "2019/01/20 21:36:34.051" -"2019/01/20 21:36:45.851" "2019/01/20 21:36:46.051" -"2019/01/20 21:36:57.851" "2019/01/20 21:36:58.051" -"2019/01/20 21:37:09.851" "2019/01/20 21:37:10.051" -"2019/01/20 21:37:21.851" "2019/01/20 21:37:22.051" -"2019/01/20 21:37:33.851" "2019/01/20 21:37:34.051" -"2019/01/20 21:37:45.851" "2019/01/20 21:37:46.051" -"2019/01/20 21:37:57.851" "2019/01/20 21:37:58.051" -"2019/01/20 21:38:09.851" "2019/01/20 21:38:10.051" -"2019/01/20 21:38:21.851" "2019/01/20 21:38:22.051" -"2019/01/20 21:38:33.851" "2019/01/20 21:38:34.051" -"2019/01/20 21:38:45.851" "2019/01/20 21:38:46.051" -"2019/01/20 21:38:57.851" "2019/01/20 21:38:58.051" -"2019/01/20 21:39:37.319" "2019/01/20 21:39:37.519" -"2019/01/20 21:39:49.319" "2019/01/20 21:39:49.519" -"2019/01/20 21:40:01.319" "2019/01/20 21:40:01.519" -"2019/01/20 21:40:13.319" "2019/01/20 21:40:13.519" -"2019/01/20 21:40:25.319" "2019/01/20 21:40:25.519" -"2019/01/20 21:40:37.319" "2019/01/20 21:40:37.519" -"2019/01/20 21:40:49.319" "2019/01/20 21:40:49.519" -"2019/01/20 21:41:01.319" "2019/01/20 21:41:01.519" -"2019/01/20 21:41:13.319" "2019/01/20 21:41:13.519" -"2019/01/20 21:41:25.319" "2019/01/20 21:41:25.519" -"2019/01/20 21:41:37.319" "2019/01/20 21:41:37.519" -"2019/01/20 21:41:49.319" "2019/01/20 21:41:49.519" -"2019/01/20 21:42:01.319" "2019/01/20 21:42:01.519" -"2019/01/20 21:42:13.319" "2019/01/20 21:42:13.519" -"2019/01/20 21:47:33.532" "2019/01/20 21:47:33.732" -"2019/01/20 21:47:45.532" "2019/01/20 21:47:45.732" -"2019/01/20 21:47:57.532" "2019/01/20 21:47:57.732" -"2019/01/20 21:48:09.532" "2019/01/20 21:48:09.732" -"2019/01/20 21:48:21.532" "2019/01/20 21:48:21.732" -"2019/01/20 21:48:33.532" "2019/01/20 21:48:33.732" -"2019/01/20 21:48:45.532" "2019/01/20 21:48:45.732" -"2019/01/20 21:48:57.532" "2019/01/20 21:48:57.732" -"2019/01/20 21:49:09.532" "2019/01/20 21:49:09.732" -"2019/01/20 21:49:21.532" "2019/01/20 21:49:21.732" -"2019/01/20 21:49:33.532" "2019/01/20 21:49:33.732" -"2019/01/20 21:49:45.532" "2019/01/20 21:49:45.732" -"2019/01/20 21:49:57.532" "2019/01/20 21:49:57.732" -"2019/01/20 21:50:09.532" "2019/01/20 21:50:09.732" -"2019/01/20 21:50:49.000" "2019/01/20 21:50:49.200" -"2019/01/20 21:51:01.000" "2019/01/20 21:51:01.200" -"2019/01/20 21:51:13.000" "2019/01/20 21:51:13.200" -"2019/01/20 21:51:25.000" "2019/01/20 21:51:25.200" -"2019/01/20 21:51:37.000" "2019/01/20 21:51:37.200" -"2019/01/20 21:51:49.000" "2019/01/20 21:51:49.200" -"2019/01/20 21:52:01.000" "2019/01/20 21:52:01.200" -"2019/01/20 21:52:13.000" "2019/01/20 21:52:13.200" -"2019/01/20 21:52:25.000" "2019/01/20 21:52:25.200" -"2019/01/20 21:52:37.000" "2019/01/20 21:52:37.200" -"2019/01/20 21:52:49.000" "2019/01/20 21:52:49.200" -"2019/01/20 21:53:01.000" "2019/01/20 21:53:01.200" -"2019/01/20 21:53:13.000" "2019/01/20 21:53:13.200" -"2019/01/20 21:53:25.000" "2019/01/20 21:53:25.200" -"2019/01/20 21:58:44.213" "2019/01/20 21:58:44.413" -"2019/01/20 21:58:56.213" "2019/01/20 21:58:56.413" -"2019/01/20 21:59:08.213" "2019/01/20 21:59:08.413" -"2019/01/20 21:59:20.213" "2019/01/20 21:59:20.413" -"2019/01/20 21:59:32.213" "2019/01/20 21:59:32.413" -"2019/01/20 21:59:44.213" "2019/01/20 21:59:44.413" -"2019/01/20 21:59:56.213" "2019/01/20 21:59:56.413" -"2019/01/20 22:00:08.213" "2019/01/20 22:00:08.413" -"2019/01/20 22:00:20.213" "2019/01/20 22:00:20.413" -"2019/01/20 22:00:32.213" "2019/01/20 22:00:32.413" -"2019/01/20 22:00:44.213" "2019/01/20 22:00:44.413" -"2019/01/20 22:00:56.213" "2019/01/20 22:00:56.413" -"2019/01/20 22:01:08.213" "2019/01/20 22:01:08.413" -"2019/01/20 22:01:20.213" "2019/01/20 22:01:20.413" -"2019/01/20 22:01:58.681" "2019/01/20 22:01:58.881" -"2019/01/20 22:02:10.681" "2019/01/20 22:02:10.881" -"2019/01/20 22:02:22.681" "2019/01/20 22:02:22.881" -"2019/01/20 22:02:34.681" "2019/01/20 22:02:34.881" -"2019/01/20 22:02:46.681" "2019/01/20 22:02:46.881" -"2019/01/20 22:02:58.681" "2019/01/20 22:02:58.881" -"2019/01/20 22:03:10.681" "2019/01/20 22:03:10.881" -"2019/01/20 22:03:22.681" "2019/01/20 22:03:22.881" -"2019/01/20 22:03:34.681" "2019/01/20 22:03:34.881" -"2019/01/20 22:03:46.681" "2019/01/20 22:03:46.881" -"2019/01/20 22:03:58.681" "2019/01/20 22:03:58.881" -"2019/01/20 22:04:10.681" "2019/01/20 22:04:10.881" -"2019/01/20 22:04:22.681" "2019/01/20 22:04:22.881" -"2019/01/20 22:04:34.681" "2019/01/20 22:04:34.881" -"2019/01/20 22:09:53.894" "2019/01/20 22:09:54.094" -"2019/01/20 22:10:05.894" "2019/01/20 22:10:06.094" -"2019/01/20 22:10:17.894" "2019/01/20 22:10:18.094" -"2019/01/20 22:10:29.894" "2019/01/20 22:10:30.094" -"2019/01/20 22:10:41.894" "2019/01/20 22:10:42.094" -"2019/01/20 22:10:53.894" "2019/01/20 22:10:54.094" -"2019/01/20 22:11:05.894" "2019/01/20 22:11:06.094" -"2019/01/20 22:11:17.894" "2019/01/20 22:11:18.094" -"2019/01/20 22:11:29.894" "2019/01/20 22:11:30.094" -"2019/01/20 22:11:41.894" "2019/01/20 22:11:42.094" -"2019/01/20 22:11:53.894" "2019/01/20 22:11:54.094" -"2019/01/20 22:12:05.894" "2019/01/20 22:12:06.094" -"2019/01/20 22:12:17.894" "2019/01/20 22:12:18.094" -"2019/01/20 22:12:29.894" "2019/01/20 22:12:30.094" -"2019/01/20 22:13:08.362" "2019/01/20 22:13:08.562" -"2019/01/20 22:13:20.362" "2019/01/20 22:13:20.562" -"2019/01/20 22:13:32.362" "2019/01/20 22:13:32.562" -"2019/01/20 22:13:44.362" "2019/01/20 22:13:44.562" -"2019/01/20 22:13:56.362" "2019/01/20 22:13:56.562" -"2019/01/20 22:14:08.362" "2019/01/20 22:14:08.562" -"2019/01/20 22:14:20.362" "2019/01/20 22:14:20.562" -"2019/01/20 22:14:32.362" "2019/01/20 22:14:32.562" -"2019/01/20 22:14:44.362" "2019/01/20 22:14:44.562" -"2019/01/20 22:14:56.362" "2019/01/20 22:14:56.562" -"2019/01/20 22:15:08.362" "2019/01/20 22:15:08.562" -"2019/01/20 22:15:20.362" "2019/01/20 22:15:20.562" -"2019/01/20 22:15:32.362" "2019/01/20 22:15:32.562" -"2019/01/20 22:15:44.362" "2019/01/20 22:15:44.562" -"2019/01/20 22:21:03.574" "2019/01/20 22:21:03.774" -"2019/01/20 22:21:15.574" "2019/01/20 22:21:15.774" -"2019/01/20 22:21:27.574" "2019/01/20 22:21:27.774" -"2019/01/20 22:21:39.574" "2019/01/20 22:21:39.774" -"2019/01/20 22:21:51.574" "2019/01/20 22:21:51.774" -"2019/01/20 22:22:03.574" "2019/01/20 22:22:03.774" -"2019/01/20 22:22:15.574" "2019/01/20 22:22:15.774" -"2019/01/20 22:22:27.574" "2019/01/20 22:22:27.774" -"2019/01/20 22:22:39.574" "2019/01/20 22:22:39.774" -"2019/01/20 22:22:51.574" "2019/01/20 22:22:51.774" -"2019/01/20 22:23:03.574" "2019/01/20 22:23:03.774" -"2019/01/20 22:23:15.574" "2019/01/20 22:23:15.774" -"2019/01/20 22:23:27.574" "2019/01/20 22:23:27.774" -"2019/01/20 22:23:39.574" "2019/01/20 22:23:39.774" -"2019/01/20 22:24:18.043" "2019/01/20 22:24:18.243" -"2019/01/20 22:24:30.043" "2019/01/20 22:24:30.243" -"2019/01/20 22:24:42.043" "2019/01/20 22:24:42.243" -"2019/01/20 22:24:54.043" "2019/01/20 22:24:54.243" -"2019/01/20 22:25:06.043" "2019/01/20 22:25:06.243" -"2019/01/20 22:25:18.043" "2019/01/20 22:25:18.243" -"2019/01/20 22:25:30.043" "2019/01/20 22:25:30.243" -"2019/01/20 22:25:42.043" "2019/01/20 22:25:42.243" -"2019/01/20 22:25:54.043" "2019/01/20 22:25:54.243" -"2019/01/20 22:26:06.043" "2019/01/20 22:26:06.243" -"2019/01/20 22:26:18.043" "2019/01/20 22:26:18.243" -"2019/01/20 22:26:30.043" "2019/01/20 22:26:30.243" -"2019/01/20 22:26:42.043" "2019/01/20 22:26:42.243" -"2019/01/20 22:26:54.043" "2019/01/20 22:26:54.243" -"2019/01/20 22:32:13.255" "2019/01/20 22:32:13.455" -"2019/01/20 22:32:25.255" "2019/01/20 22:32:25.455" -"2019/01/20 22:32:37.255" "2019/01/20 22:32:37.455" -"2019/01/20 22:32:49.255" "2019/01/20 22:32:49.455" -"2019/01/20 22:33:01.255" "2019/01/20 22:33:01.455" -"2019/01/20 22:33:13.255" "2019/01/20 22:33:13.455" -"2019/01/20 22:33:25.255" "2019/01/20 22:33:25.455" -"2019/01/20 22:33:37.255" "2019/01/20 22:33:37.455" -"2019/01/20 22:33:49.255" "2019/01/20 22:33:49.455" -"2019/01/20 22:34:01.255" "2019/01/20 22:34:01.455" -"2019/01/20 22:34:13.255" "2019/01/20 22:34:13.455" -"2019/01/20 22:34:25.255" "2019/01/20 22:34:25.455" -"2019/01/20 22:34:37.255" "2019/01/20 22:34:37.455" -"2019/01/20 22:34:49.255" "2019/01/20 22:34:49.455" -"2019/01/20 22:35:27.723" "2019/01/20 22:35:27.923" -"2019/01/20 22:35:39.723" "2019/01/20 22:35:39.923" -"2019/01/20 22:35:51.723" "2019/01/20 22:35:51.923" -"2019/01/20 22:36:03.723" "2019/01/20 22:36:03.923" -"2019/01/20 22:36:15.723" "2019/01/20 22:36:15.923" -"2019/01/20 22:36:27.723" "2019/01/20 22:36:27.923" -"2019/01/20 22:36:39.723" "2019/01/20 22:36:39.923" -"2019/01/20 22:36:51.723" "2019/01/20 22:36:51.923" -"2019/01/20 22:37:03.723" "2019/01/20 22:37:03.923" -"2019/01/20 22:37:15.723" "2019/01/20 22:37:15.923" -"2019/01/20 22:37:27.723" "2019/01/20 22:37:27.923" -"2019/01/20 22:37:39.723" "2019/01/20 22:37:39.923" -"2019/01/20 22:37:51.723" "2019/01/20 22:37:51.923" -"2019/01/20 22:38:03.723" "2019/01/20 22:38:03.923" -"2019/01/20 22:43:21.936" "2019/01/20 22:43:22.136" -"2019/01/20 22:43:33.936" "2019/01/20 22:43:34.136" -"2019/01/20 22:43:45.936" "2019/01/20 22:43:46.136" -"2019/01/20 22:43:57.936" "2019/01/20 22:43:58.136" -"2019/01/20 22:44:09.936" "2019/01/20 22:44:10.136" -"2019/01/20 22:44:21.936" "2019/01/20 22:44:22.136" -"2019/01/20 22:44:33.936" "2019/01/20 22:44:34.136" -"2019/01/20 22:44:45.936" "2019/01/20 22:44:46.136" -"2019/01/20 22:44:57.936" "2019/01/20 22:44:58.136" -"2019/01/20 22:45:09.936" "2019/01/20 22:45:10.136" -"2019/01/20 22:45:21.936" "2019/01/20 22:45:22.136" -"2019/01/20 22:45:33.936" "2019/01/20 22:45:34.136" -"2019/01/20 22:45:45.936" "2019/01/20 22:45:46.136" -"2019/01/20 22:46:35.404" "2019/01/20 22:46:35.604" -"2019/01/20 22:46:47.404" "2019/01/20 22:46:47.604" -"2019/01/20 22:46:59.404" "2019/01/20 22:46:59.604" -"2019/01/20 22:47:11.404" "2019/01/20 22:47:11.604" -"2019/01/20 22:47:23.404" "2019/01/20 22:47:23.604" -"2019/01/20 22:47:35.404" "2019/01/20 22:47:35.604" -"2019/01/20 22:47:47.404" "2019/01/20 22:47:47.604" -"2019/01/20 22:47:59.404" "2019/01/20 22:47:59.604" -"2019/01/20 22:48:11.404" "2019/01/20 22:48:11.604" -"2019/01/20 22:48:23.404" "2019/01/20 22:48:23.604" -"2019/01/20 22:48:35.404" "2019/01/20 22:48:35.604" -"2019/01/20 22:48:47.404" "2019/01/20 22:48:47.604" -"2019/01/20 22:48:59.404" "2019/01/20 22:48:59.604" -"2019/01/20 22:49:11.404" "2019/01/20 22:49:11.604" -"2019/01/20 22:54:29.617" "2019/01/20 22:54:29.817" -"2019/01/20 22:54:41.617" "2019/01/20 22:54:41.817" -"2019/01/20 22:54:53.617" "2019/01/20 22:54:53.817" -"2019/01/20 22:55:05.617" "2019/01/20 22:55:05.817" -"2019/01/20 22:55:17.617" "2019/01/20 22:55:17.817" -"2019/01/20 22:55:29.617" "2019/01/20 22:55:29.817" -"2019/01/20 22:55:41.617" "2019/01/20 22:55:41.817" -"2019/01/20 22:55:53.617" "2019/01/20 22:55:53.817" -"2019/01/20 22:56:05.617" "2019/01/20 22:56:05.817" -"2019/01/20 22:56:17.617" "2019/01/20 22:56:17.817" -"2019/01/20 22:56:29.617" "2019/01/20 22:56:29.817" -"2019/01/20 22:56:41.617" "2019/01/20 22:56:41.817" -"2019/01/20 22:56:53.617" "2019/01/20 22:56:53.817" -"2019/01/20 22:57:43.085" "2019/01/20 22:57:43.285" -"2019/01/20 22:57:55.085" "2019/01/20 22:57:55.285" -"2019/01/20 22:58:07.085" "2019/01/20 22:58:07.285" -"2019/01/20 22:58:19.085" "2019/01/20 22:58:19.285" -"2019/01/20 22:58:31.085" "2019/01/20 22:58:31.285" -"2019/01/20 22:58:43.085" "2019/01/20 22:58:43.285" -"2019/01/20 22:58:55.085" "2019/01/20 22:58:55.285" -"2019/01/20 22:59:07.085" "2019/01/20 22:59:07.285" -"2019/01/20 22:59:19.085" "2019/01/20 22:59:19.285" -"2019/01/20 22:59:31.085" "2019/01/20 22:59:31.285" -"2019/01/20 22:59:43.085" "2019/01/20 22:59:43.285" -"2019/01/20 22:59:55.085" "2019/01/20 22:59:55.285" -"2019/01/20 23:00:07.085" "2019/01/20 23:00:07.285" -"2019/01/20 23:00:19.085" "2019/01/20 23:00:19.285" -"2019/01/20 23:05:37.298" "2019/01/20 23:05:37.498" -"2019/01/20 23:05:49.298" "2019/01/20 23:05:49.498" -"2019/01/20 23:06:01.298" "2019/01/20 23:06:01.498" -"2019/01/20 23:06:13.298" "2019/01/20 23:06:13.498" -"2019/01/20 23:06:25.298" "2019/01/20 23:06:25.498" -"2019/01/20 23:06:37.298" "2019/01/20 23:06:37.498" -"2019/01/20 23:06:49.298" "2019/01/20 23:06:49.498" -"2019/01/20 23:07:01.298" "2019/01/20 23:07:01.498" -"2019/01/20 23:07:13.298" "2019/01/20 23:07:13.498" -"2019/01/20 23:07:25.298" "2019/01/20 23:07:25.498" -"2019/01/20 23:07:37.298" "2019/01/20 23:07:37.498" -"2019/01/20 23:07:49.298" "2019/01/20 23:07:49.498" -"2019/01/20 23:08:01.298" "2019/01/20 23:08:01.498" -"2019/01/20 23:08:50.766" "2019/01/20 23:08:50.966" -"2019/01/20 23:09:02.766" "2019/01/20 23:09:02.966" -"2019/01/20 23:09:14.766" "2019/01/20 23:09:14.966" -"2019/01/20 23:09:26.766" "2019/01/20 23:09:26.966" -"2019/01/20 23:09:38.766" "2019/01/20 23:09:38.966" -"2019/01/20 23:09:50.766" "2019/01/20 23:09:50.966" -"2019/01/20 23:10:02.766" "2019/01/20 23:10:02.966" -"2019/01/20 23:10:14.766" "2019/01/20 23:10:14.966" -"2019/01/20 23:10:26.766" "2019/01/20 23:10:26.966" -"2019/01/20 23:10:38.766" "2019/01/20 23:10:38.966" -"2019/01/20 23:10:50.766" "2019/01/20 23:10:50.966" -"2019/01/20 23:11:02.766" "2019/01/20 23:11:02.966" -"2019/01/20 23:11:14.766" "2019/01/20 23:11:14.966" -"2019/01/20 23:11:26.766" "2019/01/20 23:11:26.966" -"2019/01/20 23:16:43.979" "2019/01/20 23:16:44.179" -"2019/01/20 23:16:55.979" "2019/01/20 23:16:56.179" -"2019/01/20 23:17:07.979" "2019/01/20 23:17:08.179" -"2019/01/20 23:17:19.979" "2019/01/20 23:17:20.179" -"2019/01/20 23:17:31.979" "2019/01/20 23:17:32.179" -"2019/01/20 23:17:43.979" "2019/01/20 23:17:44.179" -"2019/01/20 23:17:55.979" "2019/01/20 23:17:56.179" -"2019/01/20 23:18:07.979" "2019/01/20 23:18:08.179" -"2019/01/20 23:18:19.979" "2019/01/20 23:18:20.179" -"2019/01/20 23:18:31.979" "2019/01/20 23:18:32.179" -"2019/01/20 23:18:43.979" "2019/01/20 23:18:44.179" -"2019/01/20 23:18:55.979" "2019/01/20 23:18:56.179" -"2019/01/20 23:19:07.979" "2019/01/20 23:19:08.179" -"2019/01/20 23:19:57.447" "2019/01/20 23:19:57.647" -"2019/01/20 23:20:09.447" "2019/01/20 23:20:09.647" -"2019/01/20 23:20:21.447" "2019/01/20 23:20:21.647" -"2019/01/20 23:20:33.447" "2019/01/20 23:20:33.647" -"2019/01/20 23:20:45.447" "2019/01/20 23:20:45.647" -"2019/01/20 23:20:57.447" "2019/01/20 23:20:57.647" -"2019/01/20 23:21:09.447" "2019/01/20 23:21:09.647" -"2019/01/20 23:21:21.447" "2019/01/20 23:21:21.647" -"2019/01/20 23:21:33.447" "2019/01/20 23:21:33.647" -"2019/01/20 23:21:45.447" "2019/01/20 23:21:45.647" -"2019/01/20 23:21:57.447" "2019/01/20 23:21:57.647" -"2019/01/20 23:22:09.447" "2019/01/20 23:22:09.647" -"2019/01/20 23:22:21.447" "2019/01/20 23:22:21.647" -"2019/01/20 23:22:33.447" "2019/01/20 23:22:33.647" -"2019/01/20 23:27:50.660" "2019/01/20 23:27:50.860" -"2019/01/20 23:28:02.660" "2019/01/20 23:28:02.860" -"2019/01/20 23:28:14.660" "2019/01/20 23:28:14.860" -"2019/01/20 23:28:26.660" "2019/01/20 23:28:26.860" -"2019/01/20 23:28:38.660" "2019/01/20 23:28:38.860" -"2019/01/20 23:28:50.660" "2019/01/20 23:28:50.860" -"2019/01/20 23:29:02.660" "2019/01/20 23:29:02.860" -"2019/01/20 23:29:14.660" "2019/01/20 23:29:14.860" -"2019/01/20 23:29:26.660" "2019/01/20 23:29:26.860" -"2019/01/20 23:29:38.660" "2019/01/20 23:29:38.860" -"2019/01/20 23:29:50.660" "2019/01/20 23:29:50.860" -"2019/01/20 23:30:02.660" "2019/01/20 23:30:02.860" -"2019/01/20 23:30:14.660" "2019/01/20 23:30:14.860" -"2019/01/21 19:41:11.455" "2019/01/21 19:41:11.655" -"2019/01/21 19:41:23.455" "2019/01/21 19:41:23.655" -"2019/01/21 19:41:35.455" "2019/01/21 19:41:35.655" -"2019/01/21 19:41:47.455" "2019/01/21 19:41:47.655" -"2019/01/21 19:41:59.455" "2019/01/21 19:41:59.655" -"2019/01/21 19:42:11.455" "2019/01/21 19:42:11.655" -"2019/01/21 19:42:23.455" "2019/01/21 19:42:23.655" -"2019/01/21 19:42:35.455" "2019/01/21 19:42:35.655" -"2019/01/21 19:42:47.455" "2019/01/21 19:42:47.655" -"2019/01/21 19:42:59.455" "2019/01/21 19:42:59.655" -"2019/01/21 19:43:11.455" "2019/01/21 19:43:11.655" -"2019/01/21 19:43:23.455" "2019/01/21 19:43:23.655" -"2019/01/21 19:43:35.455" "2019/01/21 19:43:35.655" -"2019/01/21 19:48:06.545" "2019/01/21 19:48:06.745" -"2019/01/21 19:48:18.545" "2019/01/21 19:48:18.745" -"2019/01/21 19:48:30.545" "2019/01/21 19:48:30.745" -"2019/01/21 19:48:42.545" "2019/01/21 19:48:42.745" -"2019/01/21 19:48:54.545" "2019/01/21 19:48:54.745" -"2019/01/21 19:49:06.545" "2019/01/21 19:49:06.745" -"2019/01/21 19:49:18.545" "2019/01/21 19:49:18.745" -"2019/01/21 19:49:30.545" "2019/01/21 19:49:30.745" -"2019/01/21 19:49:42.545" "2019/01/21 19:49:42.745" -"2019/01/21 19:49:54.545" "2019/01/21 19:49:54.745" -"2019/01/21 19:50:06.545" "2019/01/21 19:50:06.745" -"2019/01/21 19:50:18.545" "2019/01/21 19:50:18.745" -"2019/01/21 19:50:30.545" "2019/01/21 19:50:30.745" -"2019/01/21 19:51:08.000" "2019/01/21 19:51:08.200" -"2019/01/21 19:51:20.000" "2019/01/21 19:51:20.200" -"2019/01/21 19:51:32.000" "2019/01/21 19:51:32.200" -"2019/01/21 19:51:44.000" "2019/01/21 19:51:44.200" -"2019/01/21 19:51:56.000" "2019/01/21 19:51:56.200" -"2019/01/21 19:52:08.000" "2019/01/21 19:52:08.200" -"2019/01/21 19:52:20.000" "2019/01/21 19:52:20.200" -"2019/01/21 19:52:32.000" "2019/01/21 19:52:32.200" -"2019/01/21 19:52:44.000" "2019/01/21 19:52:44.200" -"2019/01/21 19:52:56.000" "2019/01/21 19:52:56.200" -"2019/01/21 19:53:08.000" "2019/01/21 19:53:08.200" -"2019/01/21 19:53:20.000" "2019/01/21 19:53:20.200" -"2019/01/21 19:53:32.000" "2019/01/21 19:53:32.200" -"2019/01/21 19:58:03.091" "2019/01/21 19:58:03.291" -"2019/01/21 19:58:15.091" "2019/01/21 19:58:15.291" -"2019/01/21 19:58:27.091" "2019/01/21 19:58:27.291" -"2019/01/21 19:58:39.091" "2019/01/21 19:58:39.291" -"2019/01/21 19:58:51.091" "2019/01/21 19:58:51.291" -"2019/01/21 19:59:03.091" "2019/01/21 19:59:03.291" -"2019/01/21 19:59:15.091" "2019/01/21 19:59:15.291" -"2019/01/21 19:59:27.091" "2019/01/21 19:59:27.291" -"2019/01/21 19:59:39.091" "2019/01/21 19:59:39.291" -"2019/01/21 19:59:51.091" "2019/01/21 19:59:51.291" -"2019/01/21 20:00:03.091" "2019/01/21 20:00:03.291" -"2019/01/21 20:00:15.091" "2019/01/21 20:00:15.291" -"2019/01/21 20:00:27.091" "2019/01/21 20:00:27.291" -"2019/01/21 20:01:04.545" "2019/01/21 20:01:04.745" -"2019/01/21 20:01:16.545" "2019/01/21 20:01:16.745" -"2019/01/21 20:01:28.545" "2019/01/21 20:01:28.745" -"2019/01/21 20:01:40.545" "2019/01/21 20:01:40.745" -"2019/01/21 20:01:52.545" "2019/01/21 20:01:52.745" -"2019/01/21 20:02:04.545" "2019/01/21 20:02:04.745" -"2019/01/21 20:02:16.545" "2019/01/21 20:02:16.745" -"2019/01/21 20:02:28.545" "2019/01/21 20:02:28.745" -"2019/01/21 20:02:40.545" "2019/01/21 20:02:40.745" -"2019/01/21 20:02:52.545" "2019/01/21 20:02:52.745" -"2019/01/21 20:03:04.545" "2019/01/21 20:03:04.745" -"2019/01/21 20:03:16.545" "2019/01/21 20:03:16.745" -"2019/01/21 20:03:28.545" "2019/01/21 20:03:28.745" -"2019/01/21 20:07:59.636" "2019/01/21 20:07:59.836" -"2019/01/21 20:08:11.636" "2019/01/21 20:08:11.836" -"2019/01/21 20:08:23.636" "2019/01/21 20:08:23.836" -"2019/01/21 20:08:35.636" "2019/01/21 20:08:35.836" -"2019/01/21 20:08:47.636" "2019/01/21 20:08:47.836" -"2019/01/21 20:08:59.636" "2019/01/21 20:08:59.836" -"2019/01/21 20:09:11.636" "2019/01/21 20:09:11.836" -"2019/01/21 20:09:23.636" "2019/01/21 20:09:23.836" -"2019/01/21 20:09:35.636" "2019/01/21 20:09:35.836" -"2019/01/21 20:09:47.636" "2019/01/21 20:09:47.836" -"2019/01/21 20:09:59.636" "2019/01/21 20:09:59.836" -"2019/01/21 20:10:11.636" "2019/01/21 20:10:11.836" -"2019/01/21 20:10:23.636" "2019/01/21 20:10:23.836" -"2019/01/21 20:11:01.091" "2019/01/21 20:11:01.291" -"2019/01/21 20:11:13.091" "2019/01/21 20:11:13.291" -"2019/01/21 20:11:25.091" "2019/01/21 20:11:25.291" -"2019/01/21 20:11:37.091" "2019/01/21 20:11:37.291" -"2019/01/21 20:11:49.091" "2019/01/21 20:11:49.291" -"2019/01/21 20:12:01.091" "2019/01/21 20:12:01.291" -"2019/01/21 20:12:13.091" "2019/01/21 20:12:13.291" -"2019/01/21 20:12:25.091" "2019/01/21 20:12:25.291" -"2019/01/21 20:12:37.091" "2019/01/21 20:12:37.291" -"2019/01/21 20:12:49.091" "2019/01/21 20:12:49.291" -"2019/01/21 20:13:01.091" "2019/01/21 20:13:01.291" -"2019/01/21 20:13:13.091" "2019/01/21 20:13:13.291" -"2019/01/21 20:13:25.091" "2019/01/21 20:13:25.291" -"2019/01/21 20:17:56.182" "2019/01/21 20:17:56.382" -"2019/01/21 20:18:08.182" "2019/01/21 20:18:08.382" -"2019/01/21 20:18:20.182" "2019/01/21 20:18:20.382" -"2019/01/21 20:18:32.182" "2019/01/21 20:18:32.382" -"2019/01/21 20:18:44.182" "2019/01/21 20:18:44.382" -"2019/01/21 20:18:56.182" "2019/01/21 20:18:56.382" -"2019/01/21 20:19:08.182" "2019/01/21 20:19:08.382" -"2019/01/21 20:19:20.182" "2019/01/21 20:19:20.382" -"2019/01/21 20:19:32.182" "2019/01/21 20:19:32.382" -"2019/01/21 20:19:44.182" "2019/01/21 20:19:44.382" -"2019/01/21 20:19:56.182" "2019/01/21 20:19:56.382" -"2019/01/21 20:20:08.182" "2019/01/21 20:20:08.382" -"2019/01/21 20:20:20.182" "2019/01/21 20:20:20.382" -"2019/01/21 20:20:57.636" "2019/01/21 20:20:57.836" -"2019/01/21 20:21:09.636" "2019/01/21 20:21:09.836" -"2019/01/21 20:21:21.636" "2019/01/21 20:21:21.836" -"2019/01/21 20:21:33.636" "2019/01/21 20:21:33.836" -"2019/01/21 20:21:45.636" "2019/01/21 20:21:45.836" -"2019/01/21 20:21:57.636" "2019/01/21 20:21:57.836" -"2019/01/21 20:22:09.636" "2019/01/21 20:22:09.836" -"2019/01/21 20:22:21.636" "2019/01/21 20:22:21.836" -"2019/01/21 20:22:33.636" "2019/01/21 20:22:33.836" -"2019/01/21 20:22:45.636" "2019/01/21 20:22:45.836" -"2019/01/21 20:22:57.636" "2019/01/21 20:22:57.836" -"2019/01/21 20:23:09.636" "2019/01/21 20:23:09.836" -"2019/01/21 20:23:21.636" "2019/01/21 20:23:21.836" -"2019/01/21 20:27:52.727" "2019/01/21 20:27:52.927" -"2019/01/21 20:28:04.727" "2019/01/21 20:28:04.927" -"2019/01/21 20:28:16.727" "2019/01/21 20:28:16.927" -"2019/01/21 20:28:28.727" "2019/01/21 20:28:28.927" -"2019/01/21 20:28:40.727" "2019/01/21 20:28:40.927" -"2019/01/21 20:28:52.727" "2019/01/21 20:28:52.927" -"2019/01/21 20:29:04.727" "2019/01/21 20:29:04.927" -"2019/01/21 20:29:16.727" "2019/01/21 20:29:16.927" -"2019/01/21 20:29:28.727" "2019/01/21 20:29:28.927" -"2019/01/21 20:29:40.727" "2019/01/21 20:29:40.927" -"2019/01/21 20:29:52.727" "2019/01/21 20:29:52.927" -"2019/01/21 20:30:04.727" "2019/01/21 20:30:04.927" -"2019/01/21 20:30:16.727" "2019/01/21 20:30:16.927" -"2019/01/21 20:30:54.182" "2019/01/21 20:30:54.382" -"2019/01/21 20:31:06.182" "2019/01/21 20:31:06.382" -"2019/01/21 20:31:18.182" "2019/01/21 20:31:18.382" -"2019/01/21 20:31:30.182" "2019/01/21 20:31:30.382" -"2019/01/21 20:31:42.182" "2019/01/21 20:31:42.382" -"2019/01/21 20:31:54.182" "2019/01/21 20:31:54.382" -"2019/01/21 20:32:06.182" "2019/01/21 20:32:06.382" -"2019/01/21 20:32:18.182" "2019/01/21 20:32:18.382" -"2019/01/21 20:32:30.182" "2019/01/21 20:32:30.382" -"2019/01/21 20:32:42.182" "2019/01/21 20:32:42.382" -"2019/01/21 20:32:54.182" "2019/01/21 20:32:54.382" -"2019/01/21 20:33:06.182" "2019/01/21 20:33:06.382" -"2019/01/21 20:33:18.182" "2019/01/21 20:33:18.382" -"2019/01/21 20:37:49.273" "2019/01/21 20:37:49.473" -"2019/01/21 20:38:01.273" "2019/01/21 20:38:01.473" -"2019/01/21 20:38:13.273" "2019/01/21 20:38:13.473" -"2019/01/21 20:38:25.273" "2019/01/21 20:38:25.473" -"2019/01/21 20:38:37.273" "2019/01/21 20:38:37.473" -"2019/01/21 20:38:49.273" "2019/01/21 20:38:49.473" -"2019/01/21 20:39:01.273" "2019/01/21 20:39:01.473" -"2019/01/21 20:39:13.273" "2019/01/21 20:39:13.473" -"2019/01/21 20:39:25.273" "2019/01/21 20:39:25.473" -"2019/01/21 20:39:37.273" "2019/01/21 20:39:37.473" -"2019/01/21 20:39:49.273" "2019/01/21 20:39:49.473" -"2019/01/21 20:40:01.273" "2019/01/21 20:40:01.473" -"2019/01/21 20:40:13.273" "2019/01/21 20:40:13.473" -"2019/01/21 20:40:50.727" "2019/01/21 20:40:50.927" -"2019/01/21 20:41:02.727" "2019/01/21 20:41:02.927" -"2019/01/21 20:41:14.727" "2019/01/21 20:41:14.927" -"2019/01/21 20:41:26.727" "2019/01/21 20:41:26.927" -"2019/01/21 20:41:38.727" "2019/01/21 20:41:38.927" -"2019/01/21 20:41:50.727" "2019/01/21 20:41:50.927" -"2019/01/21 20:42:02.727" "2019/01/21 20:42:02.927" -"2019/01/21 20:42:14.727" "2019/01/21 20:42:14.927" -"2019/01/21 20:42:26.727" "2019/01/21 20:42:26.927" -"2019/01/21 20:42:38.727" "2019/01/21 20:42:38.927" -"2019/01/21 20:42:50.727" "2019/01/21 20:42:50.927" -"2019/01/21 20:43:02.727" "2019/01/21 20:43:02.927" -"2019/01/21 20:43:14.727" "2019/01/21 20:43:14.927" -"2019/01/21 20:47:46.818" "2019/01/21 20:47:47.018" -"2019/01/21 20:47:58.818" "2019/01/21 20:47:59.018" -"2019/01/21 20:48:10.818" "2019/01/21 20:48:11.018" -"2019/01/21 20:48:22.818" "2019/01/21 20:48:23.018" -"2019/01/21 20:48:34.818" "2019/01/21 20:48:35.018" -"2019/01/21 20:48:46.818" "2019/01/21 20:48:47.018" -"2019/01/21 20:48:58.818" "2019/01/21 20:48:59.018" -"2019/01/21 20:49:10.818" "2019/01/21 20:49:11.018" -"2019/01/21 20:49:22.818" "2019/01/21 20:49:23.018" -"2019/01/21 20:49:34.818" "2019/01/21 20:49:35.018" -"2019/01/21 20:49:46.818" "2019/01/21 20:49:47.018" -"2019/01/21 20:49:58.818" "2019/01/21 20:49:59.018" -"2019/01/21 20:50:10.818" "2019/01/21 20:50:11.018" -"2019/01/21 20:50:48.273" "2019/01/21 20:50:48.473" -"2019/01/21 20:51:00.273" "2019/01/21 20:51:00.473" -"2019/01/21 20:51:12.273" "2019/01/21 20:51:12.473" -"2019/01/21 20:51:24.273" "2019/01/21 20:51:24.473" -"2019/01/21 20:51:36.273" "2019/01/21 20:51:36.473" -"2019/01/21 20:51:48.273" "2019/01/21 20:51:48.473" -"2019/01/21 20:52:00.273" "2019/01/21 20:52:00.473" -"2019/01/21 20:52:12.273" "2019/01/21 20:52:12.473" -"2019/01/21 20:52:24.273" "2019/01/21 20:52:24.473" -"2019/01/21 20:52:36.273" "2019/01/21 20:52:36.473" -"2019/01/21 20:52:48.273" "2019/01/21 20:52:48.473" -"2019/01/21 20:53:00.273" "2019/01/21 20:53:00.473" -"2019/01/21 20:53:12.273" "2019/01/21 20:53:12.473" -"2019/01/21 20:57:44.364" "2019/01/21 20:57:44.564" -"2019/01/21 20:57:56.364" "2019/01/21 20:57:56.564" -"2019/01/21 20:58:08.364" "2019/01/21 20:58:08.564" -"2019/01/21 20:58:20.364" "2019/01/21 20:58:20.564" -"2019/01/21 20:58:32.364" "2019/01/21 20:58:32.564" -"2019/01/21 20:58:44.364" "2019/01/21 20:58:44.564" -"2019/01/21 20:58:56.364" "2019/01/21 20:58:56.564" -"2019/01/21 20:59:08.364" "2019/01/21 20:59:08.564" -"2019/01/21 20:59:20.364" "2019/01/21 20:59:20.564" -"2019/01/21 20:59:32.364" "2019/01/21 20:59:32.564" -"2019/01/21 20:59:44.364" "2019/01/21 20:59:44.564" -"2019/01/21 20:59:56.364" "2019/01/21 20:59:56.564" -"2019/01/21 21:00:08.364" "2019/01/21 21:00:08.564" -"2019/01/21 21:00:46.818" "2019/01/21 21:00:47.018" -"2019/01/21 21:00:58.818" "2019/01/21 21:00:59.018" -"2019/01/21 21:01:10.818" "2019/01/21 21:01:11.018" -"2019/01/21 21:01:22.818" "2019/01/21 21:01:23.018" -"2019/01/21 21:01:34.818" "2019/01/21 21:01:35.018" -"2019/01/21 21:01:46.818" "2019/01/21 21:01:47.018" -"2019/01/21 21:01:58.818" "2019/01/21 21:01:59.018" -"2019/01/21 21:02:10.818" "2019/01/21 21:02:11.018" -"2019/01/21 21:02:22.818" "2019/01/21 21:02:23.018" -"2019/01/21 21:02:34.818" "2019/01/21 21:02:35.018" -"2019/01/21 21:02:46.818" "2019/01/21 21:02:47.018" -"2019/01/21 21:02:58.818" "2019/01/21 21:02:59.018" -"2019/01/21 21:03:10.818" "2019/01/21 21:03:11.018" -"2019/01/21 21:07:42.909" "2019/01/21 21:07:43.109" -"2019/01/21 21:07:54.909" "2019/01/21 21:07:55.109" -"2019/01/21 21:08:06.909" "2019/01/21 21:08:07.109" -"2019/01/21 21:08:18.909" "2019/01/21 21:08:19.109" -"2019/01/21 21:08:30.909" "2019/01/21 21:08:31.109" -"2019/01/21 21:08:42.909" "2019/01/21 21:08:43.109" -"2019/01/21 21:08:54.909" "2019/01/21 21:08:55.109" -"2019/01/21 21:09:06.909" "2019/01/21 21:09:07.109" -"2019/01/21 21:09:18.909" "2019/01/21 21:09:19.109" -"2019/01/21 21:09:30.909" "2019/01/21 21:09:31.109" -"2019/01/21 21:09:42.909" "2019/01/21 21:09:43.109" -"2019/01/21 21:09:54.909" "2019/01/21 21:09:55.109" -"2019/01/21 21:10:06.909" "2019/01/21 21:10:07.109" -"2019/01/21 21:10:45.364" "2019/01/21 21:10:45.564" -"2019/01/21 21:10:57.364" "2019/01/21 21:10:57.564" -"2019/01/21 21:11:09.364" "2019/01/21 21:11:09.564" -"2019/01/21 21:11:21.364" "2019/01/21 21:11:21.564" -"2019/01/21 21:11:33.364" "2019/01/21 21:11:33.564" -"2019/01/21 21:11:45.364" "2019/01/21 21:11:45.564" -"2019/01/21 21:11:57.364" "2019/01/21 21:11:57.564" -"2019/01/21 21:12:09.364" "2019/01/21 21:12:09.564" -"2019/01/21 21:12:21.364" "2019/01/21 21:12:21.564" -"2019/01/21 21:12:33.364" "2019/01/21 21:12:33.564" -"2019/01/21 21:12:45.364" "2019/01/21 21:12:45.564" -"2019/01/21 21:12:57.364" "2019/01/21 21:12:57.564" -"2019/01/21 21:13:09.364" "2019/01/21 21:13:09.564" -"2019/01/21 21:17:41.455" "2019/01/21 21:17:41.655" -"2019/01/21 21:17:53.455" "2019/01/21 21:17:53.655" -"2019/01/21 21:18:05.455" "2019/01/21 21:18:05.655" -"2019/01/21 21:18:17.455" "2019/01/21 21:18:17.655" -"2019/01/21 21:18:29.455" "2019/01/21 21:18:29.655" -"2019/01/21 21:18:41.455" "2019/01/21 21:18:41.655" -"2019/01/21 21:18:53.455" "2019/01/21 21:18:53.655" -"2019/01/21 21:19:05.455" "2019/01/21 21:19:05.655" -"2019/01/21 21:19:17.455" "2019/01/21 21:19:17.655" -"2019/01/21 21:19:29.455" "2019/01/21 21:19:29.655" -"2019/01/21 21:19:41.455" "2019/01/21 21:19:41.655" -"2019/01/21 21:19:53.455" "2019/01/21 21:19:53.655" -"2019/01/21 21:20:05.455" "2019/01/21 21:20:05.655" -"2019/01/21 21:20:43.909" "2019/01/21 21:20:44.109" -"2019/01/21 21:20:55.909" "2019/01/21 21:20:56.109" -"2019/01/21 21:21:07.909" "2019/01/21 21:21:08.109" -"2019/01/21 21:21:19.909" "2019/01/21 21:21:20.109" -"2019/01/21 21:21:31.909" "2019/01/21 21:21:32.109" -"2019/01/21 21:21:43.909" "2019/01/21 21:21:44.109" -"2019/01/21 21:21:55.909" "2019/01/21 21:21:56.109" -"2019/01/21 21:22:07.909" "2019/01/21 21:22:08.109" -"2019/01/21 21:22:19.909" "2019/01/21 21:22:20.109" -"2019/01/21 21:22:31.909" "2019/01/21 21:22:32.109" -"2019/01/21 21:22:43.909" "2019/01/21 21:22:44.109" -"2019/01/21 21:22:55.909" "2019/01/21 21:22:56.109" -"2019/01/21 21:23:07.909" "2019/01/21 21:23:08.109" -"2019/01/21 21:27:40.000" "2019/01/21 21:27:40.200" -"2019/01/21 21:27:52.000" "2019/01/21 21:27:52.200" -"2019/01/21 21:28:04.000" "2019/01/21 21:28:04.200" -"2019/01/21 21:28:16.000" "2019/01/21 21:28:16.200" -"2019/01/21 21:28:28.000" "2019/01/21 21:28:28.200" -"2019/01/21 21:28:40.000" "2019/01/21 21:28:40.200" -"2019/01/21 21:28:52.000" "2019/01/21 21:28:52.200" -"2019/01/21 21:29:04.000" "2019/01/21 21:29:04.200" -"2019/01/21 21:29:16.000" "2019/01/21 21:29:16.200" -"2019/01/21 21:29:28.000" "2019/01/21 21:29:28.200" -"2019/01/21 21:29:40.000" "2019/01/21 21:29:40.200" -"2019/01/21 21:29:52.000" "2019/01/21 21:29:52.200" -"2019/01/21 21:30:04.000" "2019/01/21 21:30:04.200" -"2019/01/21 21:30:42.455" "2019/01/21 21:30:42.655" -"2019/01/21 21:30:54.455" "2019/01/21 21:30:54.655" -"2019/01/21 21:31:06.455" "2019/01/21 21:31:06.655" -"2019/01/21 21:31:18.455" "2019/01/21 21:31:18.655" -"2019/01/21 21:31:30.455" "2019/01/21 21:31:30.655" -"2019/01/21 21:31:42.455" "2019/01/21 21:31:42.655" -"2019/01/21 21:31:54.455" "2019/01/21 21:31:54.655" -"2019/01/21 21:32:06.455" "2019/01/21 21:32:06.655" -"2019/01/21 21:32:18.455" "2019/01/21 21:32:18.655" -"2019/01/21 21:32:30.455" "2019/01/21 21:32:30.655" -"2019/01/21 21:32:42.455" "2019/01/21 21:32:42.655" -"2019/01/21 21:32:54.455" "2019/01/21 21:32:54.655" -"2019/01/21 21:33:06.455" "2019/01/21 21:33:06.655" -"2019/01/21 21:37:38.545" "2019/01/21 21:37:38.745" -"2019/01/21 21:37:50.545" "2019/01/21 21:37:50.745" -"2019/01/21 21:38:02.545" "2019/01/21 21:38:02.745" -"2019/01/21 21:38:14.545" "2019/01/21 21:38:14.745" -"2019/01/21 21:38:26.545" "2019/01/21 21:38:26.745" -"2019/01/21 21:38:38.545" "2019/01/21 21:38:38.745" -"2019/01/21 21:38:50.545" "2019/01/21 21:38:50.745" -"2019/01/21 21:39:02.545" "2019/01/21 21:39:02.745" -"2019/01/21 21:39:14.545" "2019/01/21 21:39:14.745" -"2019/01/21 21:39:26.545" "2019/01/21 21:39:26.745" -"2019/01/21 21:39:38.545" "2019/01/21 21:39:38.745" -"2019/01/21 21:39:50.545" "2019/01/21 21:39:50.745" -"2019/01/21 21:40:02.545" "2019/01/21 21:40:02.745" -"2019/01/21 21:40:41.000" "2019/01/21 21:40:41.200" -"2019/01/21 21:40:53.000" "2019/01/21 21:40:53.200" -"2019/01/21 21:41:05.000" "2019/01/21 21:41:05.200" -"2019/01/21 21:41:17.000" "2019/01/21 21:41:17.200" -"2019/01/21 21:41:29.000" "2019/01/21 21:41:29.200" -"2019/01/21 21:41:41.000" "2019/01/21 21:41:41.200" -"2019/01/21 21:41:53.000" "2019/01/21 21:41:53.200" -"2019/01/21 21:42:05.000" "2019/01/21 21:42:05.200" -"2019/01/21 21:42:17.000" "2019/01/21 21:42:17.200" -"2019/01/21 21:42:29.000" "2019/01/21 21:42:29.200" -"2019/01/21 21:42:41.000" "2019/01/21 21:42:41.200" -"2019/01/21 21:42:53.000" "2019/01/21 21:42:53.200" -"2019/01/21 21:43:05.000" "2019/01/21 21:43:05.200" -"2019/01/21 21:47:37.091" "2019/01/21 21:47:37.291" -"2019/01/21 21:47:49.091" "2019/01/21 21:47:49.291" -"2019/01/21 21:48:01.091" "2019/01/21 21:48:01.291" -"2019/01/21 21:48:13.091" "2019/01/21 21:48:13.291" -"2019/01/21 21:48:25.091" "2019/01/21 21:48:25.291" -"2019/01/21 21:48:37.091" "2019/01/21 21:48:37.291" -"2019/01/21 21:48:49.091" "2019/01/21 21:48:49.291" -"2019/01/21 21:49:01.091" "2019/01/21 21:49:01.291" -"2019/01/21 21:49:13.091" "2019/01/21 21:49:13.291" -"2019/01/21 21:49:25.091" "2019/01/21 21:49:25.291" -"2019/01/21 21:49:37.091" "2019/01/21 21:49:37.291" -"2019/01/21 21:49:49.091" "2019/01/21 21:49:49.291" -"2019/01/21 21:50:01.091" "2019/01/21 21:50:01.291" -"2019/01/21 21:50:39.545" "2019/01/21 21:50:39.745" -"2019/01/21 21:50:51.545" "2019/01/21 21:50:51.745" -"2019/01/21 21:51:03.545" "2019/01/21 21:51:03.745" -"2019/01/21 21:51:15.545" "2019/01/21 21:51:15.745" -"2019/01/21 21:51:27.545" "2019/01/21 21:51:27.745" -"2019/01/21 21:51:39.545" "2019/01/21 21:51:39.745" -"2019/01/21 21:51:51.545" "2019/01/21 21:51:51.745" -"2019/01/21 21:52:03.545" "2019/01/21 21:52:03.745" -"2019/01/21 21:52:15.545" "2019/01/21 21:52:15.745" -"2019/01/21 21:52:27.545" "2019/01/21 21:52:27.745" -"2019/01/21 21:52:39.545" "2019/01/21 21:52:39.745" -"2019/01/21 21:52:51.545" "2019/01/21 21:52:51.745" -"2019/01/21 21:53:03.545" "2019/01/21 21:53:03.745" -"2019/01/21 21:57:35.636" "2019/01/21 21:57:35.836" -"2019/01/21 21:57:47.636" "2019/01/21 21:57:47.836" -"2019/01/21 21:57:59.636" "2019/01/21 21:57:59.836" -"2019/01/21 21:58:11.636" "2019/01/21 21:58:11.836" -"2019/01/21 21:58:23.636" "2019/01/21 21:58:23.836" -"2019/01/21 21:58:35.636" "2019/01/21 21:58:35.836" -"2019/01/21 21:58:47.636" "2019/01/21 21:58:47.836" -"2019/01/21 21:58:59.636" "2019/01/21 21:58:59.836" -"2019/01/21 21:59:11.636" "2019/01/21 21:59:11.836" -"2019/01/21 21:59:23.636" "2019/01/21 21:59:23.836" -"2019/01/21 21:59:35.636" "2019/01/21 21:59:35.836" -"2019/01/21 21:59:47.636" "2019/01/21 21:59:47.836" -"2019/01/21 21:59:59.636" "2019/01/21 21:59:59.836" -"2019/01/21 22:00:38.091" "2019/01/21 22:00:38.291" -"2019/01/21 22:00:50.091" "2019/01/21 22:00:50.291" -"2019/01/21 22:01:02.091" "2019/01/21 22:01:02.291" -"2019/01/21 22:01:14.091" "2019/01/21 22:01:14.291" -"2019/01/21 22:01:26.091" "2019/01/21 22:01:26.291" -"2019/01/21 22:01:38.091" "2019/01/21 22:01:38.291" -"2019/01/21 22:01:50.091" "2019/01/21 22:01:50.291" -"2019/01/21 22:02:02.091" "2019/01/21 22:02:02.291" -"2019/01/21 22:02:14.091" "2019/01/21 22:02:14.291" -"2019/01/21 22:02:26.091" "2019/01/21 22:02:26.291" -"2019/01/21 22:02:38.091" "2019/01/21 22:02:38.291" -"2019/01/21 22:02:50.091" "2019/01/21 22:02:50.291" -"2019/01/21 22:03:02.091" "2019/01/21 22:03:02.291" -"2019/01/21 22:07:34.182" "2019/01/21 22:07:34.382" -"2019/01/21 22:07:46.182" "2019/01/21 22:07:46.382" -"2019/01/21 22:07:58.182" "2019/01/21 22:07:58.382" -"2019/01/21 22:08:10.182" "2019/01/21 22:08:10.382" -"2019/01/21 22:08:22.182" "2019/01/21 22:08:22.382" -"2019/01/21 22:08:34.182" "2019/01/21 22:08:34.382" -"2019/01/21 22:08:46.182" "2019/01/21 22:08:46.382" -"2019/01/21 22:08:58.182" "2019/01/21 22:08:58.382" -"2019/01/21 22:09:10.182" "2019/01/21 22:09:10.382" -"2019/01/21 22:09:22.182" "2019/01/21 22:09:22.382" -"2019/01/21 22:09:34.182" "2019/01/21 22:09:34.382" -"2019/01/21 22:09:46.182" "2019/01/21 22:09:46.382" -"2019/01/21 22:09:58.182" "2019/01/21 22:09:58.382" -"2019/01/21 22:10:36.636" "2019/01/21 22:10:36.836" -"2019/01/21 22:10:48.636" "2019/01/21 22:10:48.836" -"2019/01/21 22:11:00.636" "2019/01/21 22:11:00.836" -"2019/01/21 22:11:12.636" "2019/01/21 22:11:12.836" -"2019/01/21 22:11:24.636" "2019/01/21 22:11:24.836" -"2019/01/21 22:11:36.636" "2019/01/21 22:11:36.836" -"2019/01/21 22:11:48.636" "2019/01/21 22:11:48.836" -"2019/01/21 22:12:00.636" "2019/01/21 22:12:00.836" -"2019/01/21 22:12:12.636" "2019/01/21 22:12:12.836" -"2019/01/21 22:12:24.636" "2019/01/21 22:12:24.836" -"2019/01/21 22:12:36.636" "2019/01/21 22:12:36.836" -"2019/01/21 22:12:48.636" "2019/01/21 22:12:48.836" -"2019/01/21 22:13:00.636" "2019/01/21 22:13:00.836" -"2019/01/21 22:17:32.727" "2019/01/21 22:17:32.927" -"2019/01/21 22:17:44.727" "2019/01/21 22:17:44.927" -"2019/01/21 22:17:56.727" "2019/01/21 22:17:56.927" -"2019/01/21 22:18:08.727" "2019/01/21 22:18:08.927" -"2019/01/21 22:18:20.727" "2019/01/21 22:18:20.927" -"2019/01/21 22:18:32.727" "2019/01/21 22:18:32.927" -"2019/01/21 22:18:44.727" "2019/01/21 22:18:44.927" -"2019/01/21 22:18:56.727" "2019/01/21 22:18:56.927" -"2019/01/21 22:19:08.727" "2019/01/21 22:19:08.927" -"2019/01/21 22:19:20.727" "2019/01/21 22:19:20.927" -"2019/01/21 22:19:32.727" "2019/01/21 22:19:32.927" -"2019/01/21 22:19:44.727" "2019/01/21 22:19:44.927" -"2019/01/21 22:19:56.727" "2019/01/21 22:19:56.927" -"2019/01/21 22:20:35.182" "2019/01/21 22:20:35.382" -"2019/01/21 22:20:47.182" "2019/01/21 22:20:47.382" -"2019/01/21 22:20:59.182" "2019/01/21 22:20:59.382" -"2019/01/21 22:21:11.182" "2019/01/21 22:21:11.382" -"2019/01/21 22:21:23.182" "2019/01/21 22:21:23.382" -"2019/01/21 22:21:35.182" "2019/01/21 22:21:35.382" -"2019/01/21 22:21:47.182" "2019/01/21 22:21:47.382" -"2019/01/21 22:21:59.182" "2019/01/21 22:21:59.382" -"2019/01/21 22:22:11.182" "2019/01/21 22:22:11.382" -"2019/01/21 22:22:23.182" "2019/01/21 22:22:23.382" -"2019/01/21 22:22:35.182" "2019/01/21 22:22:35.382" -"2019/01/21 22:22:47.182" "2019/01/21 22:22:47.382" -"2019/01/21 22:22:59.182" "2019/01/21 22:22:59.382" -"2019/01/21 22:27:31.273" "2019/01/21 22:27:31.473" -"2019/01/21 22:27:43.273" "2019/01/21 22:27:43.473" -"2019/01/21 22:27:55.273" "2019/01/21 22:27:55.473" -"2019/01/21 22:28:07.273" "2019/01/21 22:28:07.473" -"2019/01/21 22:28:19.273" "2019/01/21 22:28:19.473" -"2019/01/21 22:28:31.273" "2019/01/21 22:28:31.473" -"2019/01/21 22:28:43.273" "2019/01/21 22:28:43.473" -"2019/01/21 22:28:55.273" "2019/01/21 22:28:55.473" -"2019/01/21 22:29:07.273" "2019/01/21 22:29:07.473" -"2019/01/21 22:29:19.273" "2019/01/21 22:29:19.473" -"2019/01/21 22:29:31.273" "2019/01/21 22:29:31.473" -"2019/01/21 22:29:43.273" "2019/01/21 22:29:43.473" -"2019/01/21 22:29:55.273" "2019/01/21 22:29:55.473" -"2019/01/21 22:30:33.727" "2019/01/21 22:30:33.927" -"2019/01/21 22:30:45.727" "2019/01/21 22:30:45.927" -"2019/01/21 22:30:57.727" "2019/01/21 22:30:57.927" -"2019/01/21 22:31:09.727" "2019/01/21 22:31:09.927" -"2019/01/21 22:31:21.727" "2019/01/21 22:31:21.927" -"2019/01/21 22:31:33.727" "2019/01/21 22:31:33.927" -"2019/01/21 22:31:45.727" "2019/01/21 22:31:45.927" -"2019/01/21 22:31:57.727" "2019/01/21 22:31:57.927" -"2019/01/21 22:32:09.727" "2019/01/21 22:32:09.927" -"2019/01/21 22:32:21.727" "2019/01/21 22:32:21.927" -"2019/01/21 22:32:33.727" "2019/01/21 22:32:33.927" -"2019/01/21 22:32:45.727" "2019/01/21 22:32:45.927" -"2019/01/21 22:32:57.727" "2019/01/21 22:32:57.927" -"2019/01/21 22:37:29.818" "2019/01/21 22:37:30.018" -"2019/01/21 22:37:41.818" "2019/01/21 22:37:42.018" -"2019/01/21 22:37:53.818" "2019/01/21 22:37:54.018" -"2019/01/21 22:38:05.818" "2019/01/21 22:38:06.018" -"2019/01/21 22:38:17.818" "2019/01/21 22:38:18.018" -"2019/01/21 22:38:29.818" "2019/01/21 22:38:30.018" -"2019/01/21 22:38:41.818" "2019/01/21 22:38:42.018" -"2019/01/21 22:38:53.818" "2019/01/21 22:38:54.018" -"2019/01/21 22:39:05.818" "2019/01/21 22:39:06.018" -"2019/01/21 22:39:17.818" "2019/01/21 22:39:18.018" -"2019/01/21 22:39:29.818" "2019/01/21 22:39:30.018" -"2019/01/21 22:39:41.818" "2019/01/21 22:39:42.018" -"2019/01/21 22:39:53.818" "2019/01/21 22:39:54.018" -"2019/01/21 22:40:32.273" "2019/01/21 22:40:32.473" -"2019/01/21 22:40:44.273" "2019/01/21 22:40:44.473" -"2019/01/21 22:40:56.273" "2019/01/21 22:40:56.473" -"2019/01/21 22:41:08.273" "2019/01/21 22:41:08.473" -"2019/01/21 22:41:20.273" "2019/01/21 22:41:20.473" -"2019/01/21 22:41:32.273" "2019/01/21 22:41:32.473" -"2019/01/21 22:41:44.273" "2019/01/21 22:41:44.473" -"2019/01/21 22:41:56.273" "2019/01/21 22:41:56.473" -"2019/01/21 22:42:08.273" "2019/01/21 22:42:08.473" -"2019/01/21 22:42:20.273" "2019/01/21 22:42:20.473" -"2019/01/21 22:42:32.273" "2019/01/21 22:42:32.473" -"2019/01/21 22:42:44.273" "2019/01/21 22:42:44.473" -"2019/01/21 22:42:56.273" "2019/01/21 22:42:56.473" -"2019/01/21 22:47:29.364" "2019/01/21 22:47:29.564" -"2019/01/21 22:47:41.364" "2019/01/21 22:47:41.564" -"2019/01/21 22:47:53.364" "2019/01/21 22:47:53.564" -"2019/01/21 22:48:05.364" "2019/01/21 22:48:05.564" -"2019/01/21 22:48:17.364" "2019/01/21 22:48:17.564" -"2019/01/21 22:48:29.364" "2019/01/21 22:48:29.564" -"2019/01/21 22:48:41.364" "2019/01/21 22:48:41.564" -"2019/01/21 22:48:53.364" "2019/01/21 22:48:53.564" -"2019/01/21 22:49:05.364" "2019/01/21 22:49:05.564" -"2019/01/21 22:49:17.364" "2019/01/21 22:49:17.564" -"2019/01/21 22:49:29.364" "2019/01/21 22:49:29.564" -"2019/01/21 22:49:41.364" "2019/01/21 22:49:41.564" -"2019/01/21 22:49:53.364" "2019/01/21 22:49:53.564" -"2019/01/21 22:50:31.818" "2019/01/21 22:50:32.018" -"2019/01/21 22:50:43.818" "2019/01/21 22:50:44.018" -"2019/01/21 22:50:55.818" "2019/01/21 22:50:56.018" -"2019/01/21 22:51:07.818" "2019/01/21 22:51:08.018" -"2019/01/21 22:51:19.818" "2019/01/21 22:51:20.018" -"2019/01/21 22:51:31.818" "2019/01/21 22:51:32.018" -"2019/01/21 22:51:43.818" "2019/01/21 22:51:44.018" -"2019/01/21 22:51:55.818" "2019/01/21 22:51:56.018" -"2019/01/21 22:52:07.818" "2019/01/21 22:52:08.018" -"2019/01/21 22:52:19.818" "2019/01/21 22:52:20.018" -"2019/01/21 22:52:31.818" "2019/01/21 22:52:32.018" -"2019/01/21 22:52:43.818" "2019/01/21 22:52:44.018" -"2019/01/21 22:52:55.818" "2019/01/21 22:52:56.018" -"2019/01/21 22:57:28.909" "2019/01/21 22:57:29.109" -"2019/01/21 22:57:40.909" "2019/01/21 22:57:41.109" -"2019/01/21 22:57:52.909" "2019/01/21 22:57:53.109" -"2019/01/21 22:58:04.909" "2019/01/21 22:58:05.109" -"2019/01/21 22:58:16.909" "2019/01/21 22:58:17.109" -"2019/01/21 22:58:28.909" "2019/01/21 22:58:29.109" -"2019/01/21 22:58:40.909" "2019/01/21 22:58:41.109" -"2019/01/21 22:58:52.909" "2019/01/21 22:58:53.109" -"2019/01/21 22:59:04.909" "2019/01/21 22:59:05.109" -"2019/01/21 22:59:16.909" "2019/01/21 22:59:17.109" -"2019/01/21 22:59:28.909" "2019/01/21 22:59:29.109" -"2019/01/21 22:59:40.909" "2019/01/21 22:59:41.109" -"2019/01/21 22:59:52.909" "2019/01/21 22:59:53.109" -"2019/01/21 23:00:31.364" "2019/01/21 23:00:31.564" -"2019/01/21 23:00:43.364" "2019/01/21 23:00:43.564" -"2019/01/21 23:00:55.364" "2019/01/21 23:00:55.564" -"2019/01/21 23:01:07.364" "2019/01/21 23:01:07.564" -"2019/01/21 23:01:19.364" "2019/01/21 23:01:19.564" -"2019/01/21 23:01:31.364" "2019/01/21 23:01:31.564" -"2019/01/21 23:01:43.364" "2019/01/21 23:01:43.564" -"2019/01/21 23:01:55.364" "2019/01/21 23:01:55.564" -"2019/01/21 23:02:07.364" "2019/01/21 23:02:07.564" -"2019/01/21 23:02:19.364" "2019/01/21 23:02:19.564" -"2019/01/21 23:02:31.364" "2019/01/21 23:02:31.564" -"2019/01/21 23:02:43.364" "2019/01/21 23:02:43.564" -"2019/01/21 23:02:55.364" "2019/01/21 23:02:55.564" -"2019/01/21 23:07:28.455" "2019/01/21 23:07:28.655" -"2019/01/21 23:07:40.455" "2019/01/21 23:07:40.655" -"2019/01/21 23:07:52.455" "2019/01/21 23:07:52.655" -"2019/01/21 23:08:04.455" "2019/01/21 23:08:04.655" -"2019/01/21 23:08:16.455" "2019/01/21 23:08:16.655" -"2019/01/21 23:08:28.455" "2019/01/21 23:08:28.655" -"2019/01/21 23:08:40.455" "2019/01/21 23:08:40.655" -"2019/01/21 23:08:52.455" "2019/01/21 23:08:52.655" -"2019/01/21 23:09:04.455" "2019/01/21 23:09:04.655" -"2019/01/21 23:09:16.455" "2019/01/21 23:09:16.655" -"2019/01/21 23:09:28.455" "2019/01/21 23:09:28.655" -"2019/01/21 23:09:40.455" "2019/01/21 23:09:40.655" -"2019/01/21 23:09:52.455" "2019/01/21 23:09:52.655" -"2019/01/21 23:10:30.909" "2019/01/21 23:10:31.109" -"2019/01/21 23:10:42.909" "2019/01/21 23:10:43.109" -"2019/01/21 23:10:54.909" "2019/01/21 23:10:55.109" -"2019/01/21 23:11:06.909" "2019/01/21 23:11:07.109" -"2019/01/21 23:11:18.909" "2019/01/21 23:11:19.109" -"2019/01/21 23:11:30.909" "2019/01/21 23:11:31.109" -"2019/01/21 23:11:42.909" "2019/01/21 23:11:43.109" -"2019/01/21 23:11:54.909" "2019/01/21 23:11:55.109" -"2019/01/21 23:12:06.909" "2019/01/21 23:12:07.109" -"2019/01/21 23:12:18.909" "2019/01/21 23:12:19.109" -"2019/01/21 23:12:30.909" "2019/01/21 23:12:31.109" -"2019/01/21 23:12:42.909" "2019/01/21 23:12:43.109" -"2019/01/21 23:12:54.909" "2019/01/21 23:12:55.109" -"2019/01/21 23:17:28.000" "2019/01/21 23:17:28.200" -"2019/01/21 23:17:40.000" "2019/01/21 23:17:40.200" -"2019/01/21 23:17:52.000" "2019/01/21 23:17:52.200" -"2019/01/21 23:18:04.000" "2019/01/21 23:18:04.200" -"2019/01/21 23:18:16.000" "2019/01/21 23:18:16.200" -"2019/01/21 23:18:28.000" "2019/01/21 23:18:28.200" -"2019/01/21 23:18:40.000" "2019/01/21 23:18:40.200" -"2019/01/21 23:18:52.000" "2019/01/21 23:18:52.200" -"2019/01/21 23:19:04.000" "2019/01/21 23:19:04.200" -"2019/01/21 23:19:16.000" "2019/01/21 23:19:16.200" -"2019/01/21 23:19:28.000" "2019/01/21 23:19:28.200" -"2019/01/21 23:19:40.000" "2019/01/21 23:19:40.200" -"2019/01/21 23:19:52.000" "2019/01/21 23:19:52.200" -"2019/01/21 23:20:31.455" "2019/01/21 23:20:31.655" -"2019/01/21 23:20:43.455" "2019/01/21 23:20:43.655" -"2019/01/21 23:20:55.455" "2019/01/21 23:20:55.655" -"2019/01/21 23:21:07.455" "2019/01/21 23:21:07.655" -"2019/01/21 23:21:19.455" "2019/01/21 23:21:19.655" -"2019/01/21 23:21:31.455" "2019/01/21 23:21:31.655" -"2019/01/21 23:21:43.455" "2019/01/21 23:21:43.655" -"2019/01/21 23:21:55.455" "2019/01/21 23:21:55.655" -"2019/01/21 23:22:07.455" "2019/01/21 23:22:07.655" -"2019/01/21 23:22:19.455" "2019/01/21 23:22:19.655" -"2019/01/21 23:22:31.455" "2019/01/21 23:22:31.655" -"2019/01/21 23:22:43.455" "2019/01/21 23:22:43.655" -"2019/01/21 23:22:55.455" "2019/01/21 23:22:55.655" -"2019/01/21 23:27:28.545" "2019/01/21 23:27:28.745" -"2019/01/21 23:27:40.545" "2019/01/21 23:27:40.745" -"2019/01/21 23:27:52.545" "2019/01/21 23:27:52.745" -"2019/01/21 23:28:04.545" "2019/01/21 23:28:04.745" -"2019/01/21 23:28:16.545" "2019/01/21 23:28:16.745" -"2019/01/21 23:28:28.545" "2019/01/21 23:28:28.745" -"2019/01/21 23:28:40.545" "2019/01/21 23:28:40.745" -"2019/01/21 23:28:52.545" "2019/01/21 23:28:52.745" -"2019/01/21 23:29:04.545" "2019/01/21 23:29:04.745" -"2019/01/21 23:29:16.545" "2019/01/21 23:29:16.745" -"2019/01/21 23:29:28.545" "2019/01/21 23:29:28.745" -"2019/01/21 23:29:40.545" "2019/01/21 23:29:40.745" -"2019/01/21 23:29:52.545" "2019/01/21 23:29:52.745" -"2019/01/21 23:30:32.000" "2019/01/21 23:30:32.200" -"2019/01/21 23:30:44.000" "2019/01/21 23:30:44.200" -"2019/01/21 23:30:56.000" "2019/01/21 23:30:56.200" -"2019/01/21 23:31:08.000" "2019/01/21 23:31:08.200" -"2019/01/21 23:31:20.000" "2019/01/21 23:31:20.200" -"2019/01/21 23:31:32.000" "2019/01/21 23:31:32.200" -"2019/01/21 23:31:44.000" "2019/01/21 23:31:44.200" -"2019/01/21 23:31:56.000" "2019/01/21 23:31:56.200" -"2019/01/21 23:32:08.000" "2019/01/21 23:32:08.200" -"2019/01/21 23:32:20.000" "2019/01/21 23:32:20.200" -"2019/01/21 23:32:32.000" "2019/01/21 23:32:32.200" -"2019/01/21 23:32:44.000" "2019/01/21 23:32:44.200" -"2019/01/21 23:32:56.000" "2019/01/21 23:32:56.200" -"2019/01/21 23:37:29.091" "2019/01/21 23:37:29.291" -"2019/01/21 23:37:41.091" "2019/01/21 23:37:41.291" -"2019/01/21 23:37:53.091" "2019/01/21 23:37:53.291" -"2019/01/21 23:38:05.091" "2019/01/21 23:38:05.291" -"2019/01/21 23:38:17.091" "2019/01/21 23:38:17.291" -"2019/01/21 23:38:29.091" "2019/01/21 23:38:29.291" -"2019/01/21 23:38:41.091" "2019/01/21 23:38:41.291" -"2019/01/21 23:38:53.091" "2019/01/21 23:38:53.291" -"2019/01/21 23:39:05.091" "2019/01/21 23:39:05.291" -"2019/01/21 23:39:17.091" "2019/01/21 23:39:17.291" -"2019/01/21 23:39:29.091" "2019/01/21 23:39:29.291" -"2019/01/21 23:39:41.091" "2019/01/21 23:39:41.291" -"2019/01/21 23:39:53.091" "2019/01/21 23:39:53.291" -"2019/01/21 23:40:32.545" "2019/01/21 23:40:32.745" -"2019/01/21 23:40:44.545" "2019/01/21 23:40:44.745" -"2019/01/21 23:40:56.545" "2019/01/21 23:40:56.745" -"2019/01/21 23:41:08.545" "2019/01/21 23:41:08.745" -"2019/01/21 23:41:20.545" "2019/01/21 23:41:20.745" -"2019/01/21 23:41:32.545" "2019/01/21 23:41:32.745" -"2019/01/21 23:41:44.545" "2019/01/21 23:41:44.745" -"2019/01/21 23:41:56.545" "2019/01/21 23:41:56.745" -"2019/01/21 23:42:08.545" "2019/01/21 23:42:08.745" -"2019/01/21 23:42:20.545" "2019/01/21 23:42:20.745" -"2019/01/21 23:42:32.545" "2019/01/21 23:42:32.745" -"2019/01/21 23:42:44.545" "2019/01/21 23:42:44.745" -"2019/01/21 23:42:56.545" "2019/01/21 23:42:56.745" -"2019/01/21 23:47:29.636" "2019/01/21 23:47:29.836" -"2019/01/21 23:47:41.636" "2019/01/21 23:47:41.836" -"2019/01/21 23:47:53.636" "2019/01/21 23:47:53.836" -"2019/01/21 23:48:05.636" "2019/01/21 23:48:05.836" -"2019/01/21 23:48:17.636" "2019/01/21 23:48:17.836" -"2019/01/21 23:48:29.636" "2019/01/21 23:48:29.836" -"2019/01/21 23:48:41.636" "2019/01/21 23:48:41.836" -"2019/01/21 23:48:53.636" "2019/01/21 23:48:53.836" -"2019/01/21 23:49:05.636" "2019/01/21 23:49:05.836" -"2019/01/21 23:49:17.636" "2019/01/21 23:49:17.836" -"2019/01/21 23:49:29.636" "2019/01/21 23:49:29.836" -"2019/01/21 23:49:41.636" "2019/01/21 23:49:41.836" -"2019/01/21 23:49:53.636" "2019/01/21 23:49:53.836" -"2019/01/21 23:50:33.091" "2019/01/21 23:50:33.291" -"2019/01/21 23:50:45.091" "2019/01/21 23:50:45.291" -"2019/01/21 23:50:57.091" "2019/01/21 23:50:57.291" -"2019/01/21 23:51:09.091" "2019/01/21 23:51:09.291" -"2019/01/21 23:51:21.091" "2019/01/21 23:51:21.291" -"2019/01/21 23:51:33.091" "2019/01/21 23:51:33.291" -"2019/01/21 23:51:45.091" "2019/01/21 23:51:45.291" -"2019/01/21 23:51:57.091" "2019/01/21 23:51:57.291" -"2019/01/21 23:52:09.091" "2019/01/21 23:52:09.291" -"2019/01/21 23:52:21.091" "2019/01/21 23:52:21.291" -"2019/01/21 23:52:33.091" "2019/01/21 23:52:33.291" -"2019/01/21 23:52:45.091" "2019/01/21 23:52:45.291" -"2019/01/21 23:52:57.091" "2019/01/21 23:52:57.291" -"2019/01/21 23:57:30.182" "2019/01/21 23:57:30.382" -"2019/01/21 23:57:42.182" "2019/01/21 23:57:42.382" -"2019/01/21 23:57:54.182" "2019/01/21 23:57:54.382" -"2019/01/21 23:58:06.182" "2019/01/21 23:58:06.382" -"2019/01/21 23:58:18.182" "2019/01/21 23:58:18.382" -"2019/01/21 23:58:30.182" "2019/01/21 23:58:30.382" -"2019/01/21 23:58:42.182" "2019/01/21 23:58:42.382" -"2019/01/21 23:58:54.182" "2019/01/21 23:58:54.382" -"2019/01/21 23:59:06.182" "2019/01/21 23:59:06.382" -"2019/01/21 23:59:18.182" "2019/01/21 23:59:18.382" -"2019/01/21 23:59:30.182" "2019/01/21 23:59:30.382" -"2019/01/21 23:59:42.182" "2019/01/21 23:59:42.382" -"2019/01/21 23:59:54.182" "2019/01/21 23:59:54.382" -"2019/01/22 00:00:33.636" "2019/01/22 00:00:33.836" -"2019/01/22 00:00:45.636" "2019/01/22 00:00:45.836" -"2019/01/22 00:00:57.636" "2019/01/22 00:00:57.836" -"2019/01/22 00:01:09.636" "2019/01/22 00:01:09.836" -"2019/01/22 00:01:21.636" "2019/01/22 00:01:21.836" -"2019/01/22 00:01:33.636" "2019/01/22 00:01:33.836" -"2019/01/22 00:01:45.636" "2019/01/22 00:01:45.836" -"2019/01/22 00:01:57.636" "2019/01/22 00:01:57.836" -"2019/01/22 00:02:09.636" "2019/01/22 00:02:09.836" -"2019/01/22 00:02:21.636" "2019/01/22 00:02:21.836" -"2019/01/22 00:02:33.636" "2019/01/22 00:02:33.836" -"2019/01/22 00:02:45.636" "2019/01/22 00:02:45.836" -"2019/01/22 00:02:57.636" "2019/01/22 00:02:57.836" -"2019/01/22 00:07:30.727" "2019/01/22 00:07:30.927" -"2019/01/22 00:07:42.727" "2019/01/22 00:07:42.927" -"2019/01/22 00:07:54.727" "2019/01/22 00:07:54.927" -"2019/01/22 00:08:06.727" "2019/01/22 00:08:06.927" -"2019/01/22 00:08:18.727" "2019/01/22 00:08:18.927" -"2019/01/22 00:08:30.727" "2019/01/22 00:08:30.927" -"2019/01/22 00:08:42.727" "2019/01/22 00:08:42.927" -"2019/01/22 00:08:54.727" "2019/01/22 00:08:54.927" -"2019/01/22 00:09:06.727" "2019/01/22 00:09:06.927" -"2019/01/22 00:09:18.727" "2019/01/22 00:09:18.927" -"2019/01/22 00:09:30.727" "2019/01/22 00:09:30.927" -"2019/01/22 00:09:42.727" "2019/01/22 00:09:42.927" -"2019/01/22 00:09:54.727" "2019/01/22 00:09:54.927" - -END Intervals -END IntervalList diff --git a/data/assets/scene/solarsystem/missions/osirisrex/InstrumentTimes/DetailedSurvey_EquatorialStations_Spectrometers.txt b/data/assets/scene/solarsystem/missions/osirisrex/InstrumentTimes/DetailedSurvey_EquatorialStations_Spectrometers.txt deleted file mode 100644 index 8be499112b..0000000000 --- a/data/assets/scene/solarsystem/missions/osirisrex/InstrumentTimes/DetailedSurvey_EquatorialStations_Spectrometers.txt +++ /dev/null @@ -1,7 +0,0 @@ -"2019/01/27 10:42:00.000" "2019/01/27 15:12:00.000" -"2019/02/03 10:43:00.000" "2019/02/03 15:13:00.000" -"2019/02/10 11:05:00.000" "2019/02/10 15:35:00.000" -"2019/02/17 10:43:00.000" "2019/02/17 15:13:00.000" -"2019/02/24 10:22:00.000" "2019/02/24 14:52:00.000" -"2019/03/03 10:01:00.000" "2019/03/03 14:31:00.000" -"2019/03/10 10:01:00.000" "2019/03/10 14:31:00.000" \ No newline at end of file diff --git a/data/assets/scene/solarsystem/missions/osirisrex/InstrumentTimes/OrbitalB_Site08_PolyCamImages.txt b/data/assets/scene/solarsystem/missions/osirisrex/InstrumentTimes/OrbitalB_Site08_PolyCamImages.txt deleted file mode 100644 index 1c841aeed8..0000000000 --- a/data/assets/scene/solarsystem/missions/osirisrex/InstrumentTimes/OrbitalB_Site08_PolyCamImages.txt +++ /dev/null @@ -1,173 +0,0 @@ -"2019/04/16 12:03:15.000" "2019/04/16 12:03:15.800" -"2019/04/16 12:03:25.000" "2019/04/16 12:03:25.800" -"2019/04/16 12:03:35.000" "2019/04/16 12:03:35.800" -"2019/04/16 12:03:45.000" "2019/04/16 12:03:45.800" -"2019/04/16 12:03:55.000" "2019/04/16 12:03:55.800" -"2019/04/16 12:04:05.000" "2019/04/16 12:04:05.800" -"2019/04/16 12:04:15.000" "2019/04/16 12:04:15.800" -"2019/04/16 12:04:53.000" "2019/04/16 12:04:53.800" -"2019/04/16 12:05:03.000" "2019/04/16 12:05:03.800" -"2019/04/16 12:05:13.000" "2019/04/16 12:05:13.800" -"2019/04/16 12:05:23.000" "2019/04/16 12:05:23.800" -"2019/04/16 12:05:33.000" "2019/04/16 12:05:33.800" -"2019/04/16 12:05:43.000" "2019/04/16 12:05:43.800" -"2019/04/16 12:05:53.000" "2019/04/16 12:05:53.800" -"2019/04/16 12:06:03.000" "2019/04/16 12:06:03.800" -"2019/04/16 12:06:13.000" "2019/04/16 12:06:13.800" -"2019/04/16 12:06:23.000" "2019/04/16 12:06:23.800" -"2019/04/16 12:07:13.000" "2019/04/16 12:07:13.800" -"2019/04/16 12:07:23.000" "2019/04/16 12:07:23.800" -"2019/04/16 12:07:33.000" "2019/04/16 12:07:33.800" -"2019/04/16 12:07:43.000" "2019/04/16 12:07:43.800" -"2019/04/16 12:07:53.000" "2019/04/16 12:07:53.800" -"2019/04/16 12:08:03.000" "2019/04/16 12:08:03.800" -"2019/04/16 12:08:13.000" "2019/04/16 12:08:13.800" -"2019/04/16 12:08:23.000" "2019/04/16 12:08:23.800" -"2019/04/16 12:08:33.000" "2019/04/16 12:08:33.800" -"2019/04/16 12:08:43.000" "2019/04/16 12:08:43.800" -"2019/04/16 12:09:34.000" "2019/04/16 12:09:34.800" -"2019/04/16 12:09:44.000" "2019/04/16 12:09:44.800" -"2019/04/16 12:09:54.000" "2019/04/16 12:09:54.800" -"2019/04/16 12:10:04.000" "2019/04/16 12:10:04.800" -"2019/04/16 12:10:14.000" "2019/04/16 12:10:14.800" -"2019/04/16 12:10:24.000" "2019/04/16 12:10:24.800" -"2019/04/16 12:10:34.000" "2019/04/16 12:10:34.800" -"2019/04/16 12:10:44.000" "2019/04/16 12:10:44.800" -"2019/04/16 12:10:54.000" "2019/04/16 12:10:54.800" -"2019/04/16 12:11:04.000" "2019/04/16 12:11:04.800" -"2019/04/16 12:11:51.000" "2019/04/16 12:11:51.800" -"2019/04/16 12:12:01.000" "2019/04/16 12:12:01.800" -"2019/04/16 12:12:11.000" "2019/04/16 12:12:11.800" -"2019/04/16 12:12:21.000" "2019/04/16 12:12:21.800" -"2019/04/16 12:12:31.000" "2019/04/16 12:12:31.800" -"2019/04/16 12:12:41.000" "2019/04/16 12:12:41.800" -"2019/04/16 12:12:51.000" "2019/04/16 12:12:51.800" -"2019/04/16 12:13:01.000" "2019/04/16 12:13:01.800" -"2019/04/16 12:13:56.000" "2019/04/16 12:13:56.800" -"2019/04/16 12:14:06.000" "2019/04/16 12:14:06.800" -"2019/04/16 12:14:16.000" "2019/04/16 12:14:16.800" -"2019/04/16 12:14:26.000" "2019/04/16 12:14:26.800" -"2019/04/16 12:14:36.000" "2019/04/16 12:14:36.800" -"2019/04/16 12:14:46.000" "2019/04/16 12:14:46.800" -"2019/04/16 12:14:56.000" "2019/04/16 12:14:56.800" -"2019/04/16 12:15:06.000" "2019/04/16 12:15:06.800" -"2019/04/16 12:15:40.000" "2019/04/16 12:15:40.800" -"2019/04/16 12:15:50.000" "2019/04/16 12:15:50.800" -"2019/04/16 12:16:00.000" "2019/04/16 12:16:00.800" -"2019/04/16 12:16:10.000" "2019/04/16 12:16:10.800" -"2019/04/16 12:16:20.000" "2019/04/16 12:16:20.800" -"2019/04/16 17:49:37.000" "2019/04/16 17:49:37.800" -"2019/04/16 17:49:47.000" "2019/04/16 17:49:47.800" -"2019/04/16 17:49:57.000" "2019/04/16 17:49:57.800" -"2019/04/16 17:50:07.000" "2019/04/16 17:50:07.800" -"2019/04/16 17:50:17.000" "2019/04/16 17:50:17.800" -"2019/04/16 17:50:27.000" "2019/04/16 17:50:27.800" -"2019/04/16 17:50:37.000" "2019/04/16 17:50:37.800" -"2019/04/16 17:50:47.000" "2019/04/16 17:50:47.800" -"2019/04/16 17:50:57.000" "2019/04/16 17:50:57.800" -"2019/04/16 17:51:07.000" "2019/04/16 17:51:07.800" -"2019/04/16 17:51:17.000" "2019/04/16 17:51:17.800" -"2019/04/16 17:51:27.000" "2019/04/16 17:51:27.800" -"2019/04/16 17:51:37.000" "2019/04/16 17:51:37.800" -"2019/04/16 17:51:47.000" "2019/04/16 17:51:47.800" -"2019/04/16 17:52:48.000" "2019/04/16 17:52:48.800" -"2019/04/16 17:52:58.000" "2019/04/16 17:52:58.800" -"2019/04/16 17:53:08.000" "2019/04/16 17:53:08.800" -"2019/04/16 17:53:18.000" "2019/04/16 17:53:18.800" -"2019/04/16 17:53:28.000" "2019/04/16 17:53:28.800" -"2019/04/16 17:53:38.000" "2019/04/16 17:53:38.800" -"2019/04/16 17:53:48.000" "2019/04/16 17:53:48.800" -"2019/04/16 17:53:58.000" "2019/04/16 17:53:58.800" -"2019/04/16 17:54:08.000" "2019/04/16 17:54:08.800" -"2019/04/16 17:54:18.000" "2019/04/16 17:54:18.800" -"2019/04/16 17:54:28.000" "2019/04/16 17:54:28.800" -"2019/04/16 17:54:38.000" "2019/04/16 17:54:38.800" -"2019/04/16 17:54:48.000" "2019/04/16 17:54:48.800" -"2019/04/16 17:55:35.000" "2019/04/16 17:55:35.800" -"2019/04/16 17:55:45.000" "2019/04/16 17:55:45.800" -"2019/04/16 17:55:55.000" "2019/04/16 17:55:55.800" -"2019/04/16 17:56:05.000" "2019/04/16 17:56:05.800" -"2019/04/16 17:56:15.000" "2019/04/16 17:56:15.800" -"2019/04/16 17:56:25.000" "2019/04/16 17:56:25.800" -"2019/04/16 17:56:35.000" "2019/04/16 17:56:35.800" -"2019/04/16 17:56:45.000" "2019/04/16 17:56:45.800" -"2019/04/16 17:56:55.000" "2019/04/16 17:56:55.800" -"2019/04/16 17:57:05.000" "2019/04/16 17:57:05.800" -"2019/04/16 17:57:15.000" "2019/04/16 17:57:15.800" -"2019/04/16 17:57:25.000" "2019/04/16 17:57:25.800" -"2019/04/16 17:57:35.000" "2019/04/16 17:57:35.800" -"2019/04/16 17:57:45.000" "2019/04/16 17:57:45.800" -"2019/04/16 17:57:55.000" "2019/04/16 17:57:55.800" -"2019/04/16 17:58:05.000" "2019/04/16 17:58:05.800" -"2019/04/16 17:58:15.000" "2019/04/16 17:58:15.800" -"2019/04/16 17:58:48.000" "2019/04/16 17:58:48.800" -"2019/04/16 17:58:58.000" "2019/04/16 17:58:58.800" -"2019/04/16 17:59:08.000" "2019/04/16 17:59:08.800" -"2019/04/16 17:59:18.000" "2019/04/16 17:59:18.800" -"2019/04/16 17:59:28.000" "2019/04/16 17:59:28.800" -"2019/04/16 17:59:38.000" "2019/04/16 17:59:38.800" -"2019/04/16 17:59:48.000" "2019/04/16 17:59:48.800" -"2019/04/16 17:59:58.000" "2019/04/16 17:59:58.800" -"2019/04/16 18:00:08.000" "2019/04/16 18:00:08.800" -"2019/04/16 18:00:18.000" "2019/04/16 18:00:18.800" -"2019/04/16 18:00:28.000" "2019/04/16 18:00:28.800" -"2019/04/16 18:00:38.000" "2019/04/16 18:00:38.800" -"2019/04/16 18:01:41.000" "2019/04/16 18:01:41.800" -"2019/04/16 18:01:51.000" "2019/04/16 18:01:51.800" -"2019/04/16 18:02:01.000" "2019/04/16 18:02:01.800" -"2019/04/16 18:02:11.000" "2019/04/16 18:02:11.800" -"2019/04/16 18:02:21.000" "2019/04/16 18:02:21.800" -"2019/04/16 18:02:31.000" "2019/04/16 18:02:31.800" -"2019/04/16 18:02:41.000" "2019/04/16 18:02:41.800" -"2019/04/16 18:02:51.000" "2019/04/16 18:02:51.800" -"2019/04/16 18:03:01.000" "2019/04/16 18:03:01.800" -"2019/04/16 18:03:11.000" "2019/04/16 18:03:11.800" -"2019/04/16 18:03:21.000" "2019/04/16 18:03:21.800" -"2019/04/30 21:02:07.000" "2019/04/30 21:02:07.800" -"2019/04/30 21:02:17.000" "2019/04/30 21:02:17.800" -"2019/04/30 21:02:27.000" "2019/04/30 21:02:27.800" -"2019/04/30 21:02:37.000" "2019/04/30 21:02:37.800" -"2019/04/30 21:02:47.000" "2019/04/30 21:02:47.800" -"2019/04/30 21:02:57.000" "2019/04/30 21:02:57.800" -"2019/04/30 21:03:07.000" "2019/04/30 21:03:07.800" -"2019/04/30 21:03:17.000" "2019/04/30 21:03:17.800" -"2019/04/30 21:03:27.000" "2019/04/30 21:03:27.800" -"2019/04/30 21:03:37.000" "2019/04/30 21:03:37.800" -"2019/04/30 21:03:47.000" "2019/04/30 21:03:47.800" -"2019/04/30 21:03:57.000" "2019/04/30 21:03:57.800" -"2019/04/30 21:04:42.000" "2019/04/30 21:04:42.800" -"2019/04/30 21:04:52.000" "2019/04/30 21:04:52.800" -"2019/04/30 21:05:02.000" "2019/04/30 21:05:02.800" -"2019/04/30 21:05:12.000" "2019/04/30 21:05:12.800" -"2019/04/30 21:05:22.000" "2019/04/30 21:05:22.800" -"2019/04/30 21:05:32.000" "2019/04/30 21:05:32.800" -"2019/04/30 21:05:42.000" "2019/04/30 21:05:42.800" -"2019/04/30 21:05:52.000" "2019/04/30 21:05:52.800" -"2019/04/30 21:06:02.000" "2019/04/30 21:06:02.800" -"2019/04/30 21:06:12.000" "2019/04/30 21:06:12.800" -"2019/04/30 21:06:22.000" "2019/04/30 21:06:22.800" -"2019/04/30 21:06:32.000" "2019/04/30 21:06:32.800" -"2019/04/30 21:07:04.000" "2019/04/30 21:07:04.800" -"2019/04/30 21:07:14.000" "2019/04/30 21:07:14.800" -"2019/04/30 21:07:24.000" "2019/04/30 21:07:24.800" -"2019/04/30 21:07:34.000" "2019/04/30 21:07:34.800" -"2019/04/30 21:07:44.000" "2019/04/30 21:07:44.800" -"2019/04/30 21:07:54.000" "2019/04/30 21:07:54.800" -"2019/04/30 21:08:04.000" "2019/04/30 21:08:04.800" -"2019/04/30 21:08:14.000" "2019/04/30 21:08:14.800" -"2019/04/30 21:08:24.000" "2019/04/30 21:08:24.800" -"2019/04/30 21:08:34.000" "2019/04/30 21:08:34.800" -"2019/04/30 21:08:44.000" "2019/04/30 21:08:44.800" -"2019/04/30 21:08:54.000" "2019/04/30 21:08:54.800" -"2019/04/30 21:09:04.000" "2019/04/30 21:09:04.800" -"2019/04/30 21:09:14.000" "2019/04/30 21:09:14.800" -"2019/04/30 21:09:24.000" "2019/04/30 21:09:24.800" -"2019/04/30 21:10:13.000" "2019/04/30 21:10:13.800" -"2019/04/30 21:10:23.000" "2019/04/30 21:10:23.800" -"2019/04/30 21:10:33.000" "2019/04/30 21:10:33.800" -"2019/04/30 21:10:43.000" "2019/04/30 21:10:43.800" -"2019/04/30 21:10:53.000" "2019/04/30 21:10:53.800" -"2019/04/30 21:11:03.000" "2019/04/30 21:11:03.800" -"2019/04/30 21:11:13.000" "2019/04/30 21:11:13.800" -"2019/04/30 21:11:23.000" "2019/04/30 21:11:23.800" -"2019/04/30 21:11:33.000" "2019/04/30 21:11:33.800" \ No newline at end of file diff --git a/data/assets/scene/solarsystem/missions/osirisrex/InstrumentTimes/Recon_225m_Equatorial_PolyCam.txt b/data/assets/scene/solarsystem/missions/osirisrex/InstrumentTimes/Recon_225m_Equatorial_PolyCam.txt deleted file mode 100644 index 09dae43c21..0000000000 --- a/data/assets/scene/solarsystem/missions/osirisrex/InstrumentTimes/Recon_225m_Equatorial_PolyCam.txt +++ /dev/null @@ -1,110 +0,0 @@ -"2019/05/25 03:57:58.000" "2019/05/25 03:57:58.800" -"2019/05/25 03:58:08.000" "2019/05/25 03:58:08.800" -"2019/05/25 03:58:18.000" "2019/05/25 03:58:18.800" -"2019/05/25 03:58:28.000" "2019/05/25 03:58:28.800" -"2019/05/25 03:58:38.000" "2019/05/25 03:58:38.800" -"2019/05/25 03:58:48.000" "2019/05/25 03:58:48.800" -"2019/05/25 03:58:58.000" "2019/05/25 03:58:58.800" -"2019/05/25 03:59:08.000" "2019/05/25 03:59:08.800" -"2019/05/25 04:00:14.000" "2019/05/25 04:00:14.800" -"2019/05/25 04:00:24.000" "2019/05/25 04:00:24.800" -"2019/05/25 04:00:34.000" "2019/05/25 04:00:34.800" -"2019/05/25 04:00:44.000" "2019/05/25 04:00:44.800" -"2019/05/25 04:00:54.000" "2019/05/25 04:00:54.800" -"2019/05/25 04:01:04.000" "2019/05/25 04:01:04.800" -"2019/05/25 04:01:14.000" "2019/05/25 04:01:14.800" -"2019/05/25 04:01:24.000" "2019/05/25 04:01:24.800" -"2019/05/25 04:01:34.000" "2019/05/25 04:01:34.800" -"2019/05/25 04:01:44.000" "2019/05/25 04:01:44.800" -"2019/05/25 04:01:54.000" "2019/05/25 04:01:54.800" -"2019/05/25 04:02:04.000" "2019/05/25 04:02:04.800" -"2019/05/25 04:02:14.000" "2019/05/25 04:02:14.800" -"2019/05/25 04:03:05.000" "2019/05/25 04:03:05.800" -"2019/05/25 04:03:15.000" "2019/05/25 04:03:15.800" -"2019/05/25 04:03:25.000" "2019/05/25 04:03:25.800" -"2019/05/25 04:03:35.000" "2019/05/25 04:03:35.800" -"2019/05/25 04:03:45.000" "2019/05/25 04:03:45.800" -"2019/05/25 04:03:55.000" "2019/05/25 04:03:55.800" -"2019/05/25 04:04:05.000" "2019/05/25 04:04:05.800" -"2019/05/25 04:04:15.000" "2019/05/25 04:04:15.800" -"2019/05/25 04:04:25.000" "2019/05/25 04:04:25.800" -"2019/05/25 04:04:35.000" "2019/05/25 04:04:35.800" -"2019/05/25 04:04:45.000" "2019/05/25 04:04:45.800" -"2019/05/25 04:04:55.000" "2019/05/25 04:04:55.800" -"2019/05/25 04:05:05.000" "2019/05/25 04:05:05.800" -"2019/05/25 04:05:15.000" "2019/05/25 04:05:15.800" -"2019/05/25 04:05:25.000" "2019/05/25 04:05:25.800" -"2019/05/25 04:06:19.000" "2019/05/25 04:06:19.800" -"2019/05/25 04:06:29.000" "2019/05/25 04:06:29.800" -"2019/05/25 04:06:39.000" "2019/05/25 04:06:39.800" -"2019/05/25 04:06:49.000" "2019/05/25 04:06:49.800" -"2019/05/25 04:06:59.000" "2019/05/25 04:06:59.800" -"2019/05/25 04:07:09.000" "2019/05/25 04:07:09.800" -"2019/05/25 04:07:19.000" "2019/05/25 04:07:19.800" -"2019/05/25 04:07:29.000" "2019/05/25 04:07:29.800" -"2019/05/25 04:07:39.000" "2019/05/25 04:07:39.800" -"2019/05/25 04:07:49.000" "2019/05/25 04:07:49.800" -"2019/05/25 04:07:59.000" "2019/05/25 04:07:59.800" -"2019/05/25 04:08:09.000" "2019/05/25 04:08:09.800" -"2019/05/25 04:08:19.000" "2019/05/25 04:08:19.800" -"2019/05/25 04:08:29.000" "2019/05/25 04:08:29.800" -"2019/05/25 04:08:39.000" "2019/05/25 04:08:39.800" -"2019/05/25 04:08:49.000" "2019/05/25 04:08:49.800" -"2019/05/25 04:08:59.000" "2019/05/25 04:08:59.800" -"2019/05/25 04:09:47.000" "2019/05/25 04:09:47.800" -"2019/05/25 04:09:57.000" "2019/05/25 04:09:57.800" -"2019/05/25 04:10:07.000" "2019/05/25 04:10:07.800" -"2019/05/25 04:10:17.000" "2019/05/25 04:10:17.800" -"2019/05/25 04:10:27.000" "2019/05/25 04:10:27.800" -"2019/05/25 04:10:37.000" "2019/05/25 04:10:37.800" -"2019/05/25 04:10:47.000" "2019/05/25 04:10:47.800" -"2019/05/25 04:10:57.000" "2019/05/25 04:10:57.800" -"2019/05/25 04:11:07.000" "2019/05/25 04:11:07.800" -"2019/05/25 04:11:17.000" "2019/05/25 04:11:17.800" -"2019/05/25 04:11:27.000" "2019/05/25 04:11:27.800" -"2019/05/25 04:11:37.000" "2019/05/25 04:11:37.800" -"2019/05/25 04:11:47.000" "2019/05/25 04:11:47.800" -"2019/05/25 04:11:57.000" "2019/05/25 04:11:57.800" -"2019/05/25 04:12:07.000" "2019/05/25 04:12:07.800" -"2019/05/25 04:12:17.000" "2019/05/25 04:12:17.800" -"2019/05/25 04:12:27.000" "2019/05/25 04:12:27.800" -"2019/05/25 04:13:28.000" "2019/05/25 04:13:28.800" -"2019/05/25 04:13:38.000" "2019/05/25 04:13:38.800" -"2019/05/25 04:13:48.000" "2019/05/25 04:13:48.800" -"2019/05/25 04:13:58.000" "2019/05/25 04:13:58.800" -"2019/05/25 04:14:08.000" "2019/05/25 04:14:08.800" -"2019/05/25 04:14:18.000" "2019/05/25 04:14:18.800" -"2019/05/25 04:14:28.000" "2019/05/25 04:14:28.800" -"2019/05/25 04:14:38.000" "2019/05/25 04:14:38.800" -"2019/05/25 04:14:48.000" "2019/05/25 04:14:48.800" -"2019/05/25 04:14:58.000" "2019/05/25 04:14:58.800" -"2019/05/25 04:15:08.000" "2019/05/25 04:15:08.800" -"2019/05/25 04:15:18.000" "2019/05/25 04:15:18.800" -"2019/05/25 04:15:28.000" "2019/05/25 04:15:28.800" -"2019/05/25 04:15:38.000" "2019/05/25 04:15:38.800" -"2019/05/25 04:15:48.000" "2019/05/25 04:15:48.800" -"2019/05/25 04:15:58.000" "2019/05/25 04:15:58.800" -"2019/05/25 04:17:00.000" "2019/05/25 04:17:00.800" -"2019/05/25 04:17:10.000" "2019/05/25 04:17:10.800" -"2019/05/25 04:17:20.000" "2019/05/25 04:17:20.800" -"2019/05/25 04:17:30.000" "2019/05/25 04:17:30.800" -"2019/05/25 04:17:40.000" "2019/05/25 04:17:40.800" -"2019/05/25 04:17:50.000" "2019/05/25 04:17:50.800" -"2019/05/25 04:18:00.000" "2019/05/25 04:18:00.800" -"2019/05/25 04:18:10.000" "2019/05/25 04:18:10.800" -"2019/05/25 04:18:20.000" "2019/05/25 04:18:20.800" -"2019/05/25 04:18:30.000" "2019/05/25 04:18:30.800" -"2019/05/25 04:18:40.000" "2019/05/25 04:18:40.800" -"2019/05/25 04:18:50.000" "2019/05/25 04:18:50.800" -"2019/05/25 04:19:00.000" "2019/05/25 04:19:00.800" -"2019/05/25 04:19:59.000" "2019/05/25 04:19:59.800" -"2019/05/25 04:20:09.000" "2019/05/25 04:20:09.800" -"2019/05/25 04:20:19.000" "2019/05/25 04:20:19.800" -"2019/05/25 04:20:29.000" "2019/05/25 04:20:29.800" -"2019/05/25 04:20:39.000" "2019/05/25 04:20:39.800" -"2019/05/25 04:20:49.000" "2019/05/25 04:20:49.800" -"2019/05/25 04:20:59.000" "2019/05/25 04:20:59.800" -"2019/05/25 04:21:09.000" "2019/05/25 04:21:09.800" -"2019/05/25 04:21:19.000" "2019/05/25 04:21:19.800" -"2019/05/25 04:21:29.000" "2019/05/25 04:21:29.800" -"2019/05/25 04:21:39.000" "2019/05/25 04:21:39.800" \ No newline at end of file diff --git a/data/assets/scene/solarsystem/missions/osirisrex/InstrumentTimes/Recon_225m_Equatorial_spectrometers.txt b/data/assets/scene/solarsystem/missions/osirisrex/InstrumentTimes/Recon_225m_Equatorial_spectrometers.txt deleted file mode 100644 index 02efe1cd35..0000000000 --- a/data/assets/scene/solarsystem/missions/osirisrex/InstrumentTimes/Recon_225m_Equatorial_spectrometers.txt +++ /dev/null @@ -1 +0,0 @@ -"2019/05/25 03:57:58.000" "2019/05/25 04:21:40.000" \ No newline at end of file diff --git a/data/assets/scene/solarsystem/missions/osirisrex/InstrumentTimes/Recon_525m_Equatorial_spectrometers.txt b/data/assets/scene/solarsystem/missions/osirisrex/InstrumentTimes/Recon_525m_Equatorial_spectrometers.txt deleted file mode 100644 index f15cff2eb3..0000000000 --- a/data/assets/scene/solarsystem/missions/osirisrex/InstrumentTimes/Recon_525m_Equatorial_spectrometers.txt +++ /dev/null @@ -1,1559 +0,0 @@ -"2019/05/25 04:19:02.000" "2019/05/25 04:19:02.500" -"2019/05/25 04:19:03.000" "2019/05/25 04:19:03.500" -"2019/05/25 04:19:04.000" "2019/05/25 04:19:04.500" -"2019/05/25 04:19:05.000" "2019/05/25 04:19:05.500" -"2019/05/25 04:19:06.000" "2019/05/25 04:19:06.500" -"2019/05/25 04:19:07.000" "2019/05/25 04:19:07.500" -"2019/05/25 04:19:08.000" "2019/05/25 04:19:08.500" -"2019/05/25 04:19:09.000" "2019/05/25 04:19:09.500" -"2019/05/25 04:19:10.000" "2019/05/25 04:19:10.500" -"2019/05/25 04:19:11.000" "2019/05/25 04:19:11.500" -"2019/05/25 04:19:12.000" "2019/05/25 04:19:12.500" -"2019/05/25 04:19:13.000" "2019/05/25 04:19:13.500" -"2019/05/25 04:19:14.000" "2019/05/25 04:19:14.500" -"2019/05/25 04:19:15.000" "2019/05/25 04:19:15.500" -"2019/05/25 04:19:16.000" "2019/05/25 04:19:16.500" -"2019/05/25 04:19:17.000" "2019/05/25 04:19:17.500" -"2019/05/25 04:19:18.000" "2019/05/25 04:19:18.500" -"2019/05/25 04:19:19.000" "2019/05/25 04:19:19.500" -"2019/05/25 04:19:20.000" "2019/05/25 04:19:20.500" -"2019/05/25 04:19:21.000" "2019/05/25 04:19:21.500" -"2019/05/25 04:19:22.000" "2019/05/25 04:19:22.500" -"2019/05/25 04:19:23.000" "2019/05/25 04:19:23.500" -"2019/05/25 04:19:24.000" "2019/05/25 04:19:24.500" -"2019/05/25 04:19:25.000" "2019/05/25 04:19:25.500" -"2019/05/25 04:19:26.000" "2019/05/25 04:19:26.500" -"2019/05/25 04:19:27.000" "2019/05/25 04:19:27.500" -"2019/05/25 04:19:28.000" "2019/05/25 04:19:28.500" -"2019/05/25 04:19:29.000" "2019/05/25 04:19:29.500" -"2019/05/25 04:19:30.000" "2019/05/25 04:19:30.500" -"2019/05/25 04:19:31.000" "2019/05/25 04:19:31.500" -"2019/05/25 04:19:32.000" "2019/05/25 04:19:32.500" -"2019/05/25 04:19:33.000" "2019/05/25 04:19:33.500" -"2019/05/25 04:19:34.000" "2019/05/25 04:19:34.500" -"2019/05/25 04:19:35.000" "2019/05/25 04:19:35.500" -"2019/05/25 04:19:36.000" "2019/05/25 04:19:36.500" -"2019/05/25 04:19:37.000" "2019/05/25 04:19:37.500" -"2019/05/25 04:19:38.000" "2019/05/25 04:19:38.500" -"2019/05/25 04:19:39.000" "2019/05/25 04:19:39.500" -"2019/05/25 04:19:40.000" "2019/05/25 04:19:40.500" -"2019/05/25 04:19:41.000" "2019/05/25 04:19:41.500" -"2019/05/25 04:19:43.000" "2019/05/25 04:19:43.500" -"2019/05/25 04:19:44.000" "2019/05/25 04:19:44.500" -"2019/05/25 04:19:45.000" "2019/05/25 04:19:45.500" -"2019/05/25 04:19:46.000" "2019/05/25 04:19:46.500" -"2019/05/25 04:19:47.000" "2019/05/25 04:19:47.500" -"2019/05/25 04:19:48.000" "2019/05/25 04:19:48.500" -"2019/05/25 04:19:49.000" "2019/05/25 04:19:49.500" -"2019/05/25 04:19:50.000" "2019/05/25 04:19:50.500" -"2019/05/25 04:19:51.000" "2019/05/25 04:19:51.500" -"2019/05/25 04:19:52.000" "2019/05/25 04:19:52.500" -"2019/05/25 04:19:53.000" "2019/05/25 04:19:53.500" -"2019/05/25 04:19:54.000" "2019/05/25 04:19:54.500" -"2019/05/25 04:19:55.000" "2019/05/25 04:19:55.500" -"2019/05/25 04:19:56.000" "2019/05/25 04:19:56.500" -"2019/05/25 04:19:57.000" "2019/05/25 04:19:57.500" -"2019/05/25 04:19:58.000" "2019/05/25 04:19:58.500" -"2019/05/25 04:19:59.000" "2019/05/25 04:19:59.500" -"2019/05/25 04:20:00.000" "2019/05/25 04:20:00.500" -"2019/05/25 04:20:01.000" "2019/05/25 04:20:01.500" -"2019/05/25 04:20:02.000" "2019/05/25 04:20:02.500" -"2019/05/25 04:20:03.000" "2019/05/25 04:20:03.500" -"2019/05/25 04:20:04.000" "2019/05/25 04:20:04.500" -"2019/05/25 04:20:05.000" "2019/05/25 04:20:05.500" -"2019/05/25 04:20:06.000" "2019/05/25 04:20:06.500" -"2019/05/25 04:20:07.000" "2019/05/25 04:20:07.500" -"2019/05/25 04:20:08.000" "2019/05/25 04:20:08.500" -"2019/05/25 04:20:09.000" "2019/05/25 04:20:09.500" -"2019/05/25 04:20:10.000" "2019/05/25 04:20:10.500" -"2019/05/25 04:20:11.000" "2019/05/25 04:20:11.500" -"2019/05/25 04:20:12.000" "2019/05/25 04:20:12.500" -"2019/05/25 04:20:13.000" "2019/05/25 04:20:13.500" -"2019/05/25 04:20:15.000" "2019/05/25 04:20:15.500" -"2019/05/25 04:20:16.000" "2019/05/25 04:20:16.500" -"2019/05/25 04:20:17.000" "2019/05/25 04:20:17.500" -"2019/05/25 04:20:18.000" "2019/05/25 04:20:18.500" -"2019/05/25 04:20:19.000" "2019/05/25 04:20:19.500" -"2019/05/25 04:20:20.000" "2019/05/25 04:20:20.500" -"2019/05/25 04:20:21.000" "2019/05/25 04:20:21.500" -"2019/05/25 04:20:22.000" "2019/05/25 04:20:22.500" -"2019/05/25 04:20:23.000" "2019/05/25 04:20:23.500" -"2019/05/25 04:20:24.000" "2019/05/25 04:20:24.500" -"2019/05/25 04:20:25.000" "2019/05/25 04:20:25.500" -"2019/05/25 04:20:26.000" "2019/05/25 04:20:26.500" -"2019/05/25 04:20:27.000" "2019/05/25 04:20:27.500" -"2019/05/25 04:20:28.000" "2019/05/25 04:20:28.500" -"2019/05/25 04:20:29.000" "2019/05/25 04:20:29.500" -"2019/05/25 04:20:30.000" "2019/05/25 04:20:30.500" -"2019/05/25 04:20:31.000" "2019/05/25 04:20:31.500" -"2019/05/25 04:20:32.000" "2019/05/25 04:20:32.500" -"2019/05/25 04:20:33.000" "2019/05/25 04:20:33.500" -"2019/05/25 04:20:34.000" "2019/05/25 04:20:34.500" -"2019/05/25 04:20:35.000" "2019/05/25 04:20:35.500" -"2019/05/25 04:20:36.000" "2019/05/25 04:20:36.500" -"2019/05/25 04:20:37.000" "2019/05/25 04:20:37.500" -"2019/05/25 04:20:38.000" "2019/05/25 04:20:38.500" -"2019/05/25 04:20:39.000" "2019/05/25 04:20:39.500" -"2019/05/25 04:20:40.000" "2019/05/25 04:20:40.500" -"2019/05/25 04:20:41.000" "2019/05/25 04:20:41.500" -"2019/05/25 04:20:42.000" "2019/05/25 04:20:42.500" -"2019/05/25 04:20:43.000" "2019/05/25 04:20:43.500" -"2019/05/25 04:20:44.000" "2019/05/25 04:20:44.500" -"2019/05/25 04:20:45.000" "2019/05/25 04:20:45.500" -"2019/05/25 04:20:46.000" "2019/05/25 04:20:46.500" -"2019/05/25 04:20:47.000" "2019/05/25 04:20:47.500" -"2019/05/25 04:20:48.000" "2019/05/25 04:20:48.500" -"2019/05/25 04:20:49.000" "2019/05/25 04:20:49.500" -"2019/05/25 04:20:50.000" "2019/05/25 04:20:50.500" -"2019/05/25 04:20:51.000" "2019/05/25 04:20:51.500" -"2019/05/25 04:20:52.000" "2019/05/25 04:20:52.500" -"2019/05/25 04:20:53.000" "2019/05/25 04:20:53.500" -"2019/05/25 04:20:54.000" "2019/05/25 04:20:54.500" -"2019/05/25 04:20:55.000" "2019/05/25 04:20:55.500" -"2019/05/25 04:20:56.000" "2019/05/25 04:20:56.500" -"2019/05/25 04:20:57.000" "2019/05/25 04:20:57.500" -"2019/05/25 04:20:58.000" "2019/05/25 04:20:58.500" -"2019/05/25 04:20:59.000" "2019/05/25 04:20:59.500" -"2019/05/25 04:21:00.000" "2019/05/25 04:21:00.500" -"2019/05/25 04:21:01.000" "2019/05/25 04:21:01.500" -"2019/05/25 04:21:02.000" "2019/05/25 04:21:02.500" -"2019/05/25 04:21:03.000" "2019/05/25 04:21:03.500" -"2019/05/25 04:21:04.000" "2019/05/25 04:21:04.500" -"2019/05/25 04:21:05.000" "2019/05/25 04:21:05.500" -"2019/05/25 04:21:06.000" "2019/05/25 04:21:06.500" -"2019/05/25 04:21:07.000" "2019/05/25 04:21:07.500" -"2019/05/25 04:21:08.000" "2019/05/25 04:21:08.500" -"2019/05/25 04:21:09.000" "2019/05/25 04:21:09.500" -"2019/05/25 04:21:10.000" "2019/05/25 04:21:10.500" -"2019/05/25 04:21:11.000" "2019/05/25 04:21:11.500" -"2019/05/25 04:21:12.000" "2019/05/25 04:21:12.500" -"2019/05/25 04:21:13.000" "2019/05/25 04:21:13.500" -"2019/05/25 04:21:14.000" "2019/05/25 04:21:14.500" -"2019/05/25 04:21:15.000" "2019/05/25 04:21:15.500" -"2019/05/25 04:21:16.000" "2019/05/25 04:21:16.500" -"2019/05/25 04:21:17.000" "2019/05/25 04:21:17.500" -"2019/05/25 04:21:18.000" "2019/05/25 04:21:18.500" -"2019/05/25 04:21:19.000" "2019/05/25 04:21:19.500" -"2019/05/25 04:21:20.000" "2019/05/25 04:21:20.500" -"2019/05/25 04:21:21.000" "2019/05/25 04:21:21.500" -"2019/05/25 04:21:22.000" "2019/05/25 04:21:22.500" -"2019/05/25 04:21:23.000" "2019/05/25 04:21:23.500" -"2019/05/25 04:21:24.000" "2019/05/25 04:21:24.500" -"2019/05/25 04:21:25.000" "2019/05/25 04:21:25.500" -"2019/05/25 04:21:26.000" "2019/05/25 04:21:26.500" -"2019/05/25 04:21:27.000" "2019/05/25 04:21:27.500" -"2019/05/25 04:21:28.000" "2019/05/25 04:21:28.500" -"2019/05/25 04:21:29.000" "2019/05/25 04:21:29.500" -"2019/05/25 04:21:31.000" "2019/05/25 04:21:31.500" -"2019/05/25 04:21:32.000" "2019/05/25 04:21:32.500" -"2019/05/25 04:21:33.000" "2019/05/25 04:21:33.500" -"2019/05/25 04:21:34.000" "2019/05/25 04:21:34.500" -"2019/05/25 04:21:35.000" "2019/05/25 04:21:35.500" -"2019/05/25 04:21:36.000" "2019/05/25 04:21:36.500" -"2019/05/25 04:21:37.000" "2019/05/25 04:21:37.500" -"2019/05/25 04:21:38.000" "2019/05/25 04:21:38.500" -"2019/05/25 04:21:39.000" "2019/05/25 04:21:39.500" -"2019/05/25 04:21:40.000" "2019/05/25 04:21:40.500" -"2019/05/25 04:21:41.000" "2019/05/25 04:21:41.500" -"2019/05/25 04:21:42.000" "2019/05/25 04:21:42.500" -"2019/05/25 04:21:43.000" "2019/05/25 04:21:43.500" -"2019/05/25 04:21:44.000" "2019/05/25 04:21:44.500" -"2019/05/25 04:21:45.000" "2019/05/25 04:21:45.500" -"2019/05/25 04:21:46.000" "2019/05/25 04:21:46.500" -"2019/05/25 04:21:47.000" "2019/05/25 04:21:47.500" -"2019/05/25 04:21:48.000" "2019/05/25 04:21:48.500" -"2019/05/25 04:21:49.000" "2019/05/25 04:21:49.500" -"2019/05/25 04:21:50.000" "2019/05/25 04:21:50.500" -"2019/05/25 04:21:51.000" "2019/05/25 04:21:51.500" -"2019/05/25 04:21:52.000" "2019/05/25 04:21:52.500" -"2019/05/25 04:21:53.000" "2019/05/25 04:21:53.500" -"2019/05/25 04:21:54.000" "2019/05/25 04:21:54.500" -"2019/05/25 04:21:55.000" "2019/05/25 04:21:55.500" -"2019/05/25 04:21:56.000" "2019/05/25 04:21:56.500" -"2019/05/25 04:21:57.000" "2019/05/25 04:21:57.500" -"2019/05/25 04:21:58.000" "2019/05/25 04:21:58.500" -"2019/05/25 04:21:59.000" "2019/05/25 04:21:59.500" -"2019/05/25 04:22:00.000" "2019/05/25 04:22:00.500" -"2019/05/25 04:22:01.000" "2019/05/25 04:22:01.500" -"2019/05/25 04:22:02.000" "2019/05/25 04:22:02.500" -"2019/05/25 04:22:03.000" "2019/05/25 04:22:03.500" -"2019/05/25 04:22:04.000" "2019/05/25 04:22:04.500" -"2019/05/25 04:22:05.000" "2019/05/25 04:22:05.500" -"2019/05/25 04:22:06.000" "2019/05/25 04:22:06.500" -"2019/05/25 04:22:07.000" "2019/05/25 04:22:07.500" -"2019/05/25 04:22:08.000" "2019/05/25 04:22:08.500" -"2019/05/25 04:22:09.000" "2019/05/25 04:22:09.500" -"2019/05/25 04:22:10.000" "2019/05/25 04:22:10.500" -"2019/05/25 04:22:12.000" "2019/05/25 04:22:12.500" -"2019/05/25 04:22:13.000" "2019/05/25 04:22:13.500" -"2019/05/25 04:22:14.000" "2019/05/25 04:22:14.500" -"2019/05/25 04:22:15.000" "2019/05/25 04:22:15.500" -"2019/05/25 04:22:16.000" "2019/05/25 04:22:16.500" -"2019/05/25 04:22:17.000" "2019/05/25 04:22:17.500" -"2019/05/25 04:22:18.000" "2019/05/25 04:22:18.500" -"2019/05/25 04:22:19.000" "2019/05/25 04:22:19.500" -"2019/05/25 04:22:20.000" "2019/05/25 04:22:20.500" -"2019/05/25 04:22:21.000" "2019/05/25 04:22:21.500" -"2019/05/25 04:22:22.000" "2019/05/25 04:22:22.500" -"2019/05/25 04:22:23.000" "2019/05/25 04:22:23.500" -"2019/05/25 04:22:24.000" "2019/05/25 04:22:24.500" -"2019/05/25 04:22:25.000" "2019/05/25 04:22:25.500" -"2019/05/25 04:22:26.000" "2019/05/25 04:22:26.500" -"2019/05/25 04:22:27.000" "2019/05/25 04:22:27.500" -"2019/05/25 04:22:28.000" "2019/05/25 04:22:28.500" -"2019/05/25 04:22:29.000" "2019/05/25 04:22:29.500" -"2019/05/25 04:22:30.000" "2019/05/25 04:22:30.500" -"2019/05/25 04:22:31.000" "2019/05/25 04:22:31.500" -"2019/05/25 04:22:32.000" "2019/05/25 04:22:32.500" -"2019/05/25 04:22:33.000" "2019/05/25 04:22:33.500" -"2019/05/25 04:22:34.000" "2019/05/25 04:22:34.500" -"2019/05/25 04:22:35.000" "2019/05/25 04:22:35.500" -"2019/05/25 04:22:36.000" "2019/05/25 04:22:36.500" -"2019/05/25 04:22:37.000" "2019/05/25 04:22:37.500" -"2019/05/25 04:22:38.000" "2019/05/25 04:22:38.500" -"2019/05/25 04:22:39.000" "2019/05/25 04:22:39.500" -"2019/05/25 04:22:40.000" "2019/05/25 04:22:40.500" -"2019/05/25 04:22:41.000" "2019/05/25 04:22:41.500" -"2019/05/25 04:22:42.000" "2019/05/25 04:22:42.500" -"2019/05/25 04:22:43.000" "2019/05/25 04:22:43.500" -"2019/05/25 04:22:44.000" "2019/05/25 04:22:44.500" -"2019/05/25 04:22:45.000" "2019/05/25 04:22:45.500" -"2019/05/25 04:22:46.000" "2019/05/25 04:22:46.500" -"2019/05/25 04:22:47.000" "2019/05/25 04:22:47.500" -"2019/05/25 04:22:48.000" "2019/05/25 04:22:48.500" -"2019/05/25 04:22:49.000" "2019/05/25 04:22:49.500" -"2019/05/25 04:22:50.000" "2019/05/25 04:22:50.500" -"2019/05/25 04:22:51.000" "2019/05/25 04:22:51.500" -"2019/05/25 04:22:52.000" "2019/05/25 04:22:52.500" -"2019/05/25 04:22:53.000" "2019/05/25 04:22:53.500" -"2019/05/25 04:22:54.000" "2019/05/25 04:22:54.500" -"2019/05/25 04:22:55.000" "2019/05/25 04:22:55.500" -"2019/05/25 04:22:56.000" "2019/05/25 04:22:56.500" -"2019/05/25 04:22:57.000" "2019/05/25 04:22:57.500" -"2019/05/25 04:22:58.000" "2019/05/25 04:22:58.500" -"2019/05/25 04:22:59.000" "2019/05/25 04:22:59.500" -"2019/05/25 04:23:00.000" "2019/05/25 04:23:00.500" -"2019/05/25 04:23:01.000" "2019/05/25 04:23:01.500" -"2019/05/25 04:23:02.000" "2019/05/25 04:23:02.500" -"2019/05/25 04:23:03.000" "2019/05/25 04:23:03.500" -"2019/05/25 04:23:04.000" "2019/05/25 04:23:04.500" -"2019/05/25 04:23:05.000" "2019/05/25 04:23:05.500" -"2019/05/25 04:23:06.000" "2019/05/25 04:23:06.500" -"2019/05/25 04:23:07.000" "2019/05/25 04:23:07.500" -"2019/05/25 04:23:08.000" "2019/05/25 04:23:08.500" -"2019/05/25 04:23:09.000" "2019/05/25 04:23:09.500" -"2019/05/25 04:23:10.000" "2019/05/25 04:23:10.500" -"2019/05/25 04:23:11.000" "2019/05/25 04:23:11.500" -"2019/05/25 04:23:12.000" "2019/05/25 04:23:12.500" -"2019/05/25 04:23:13.000" "2019/05/25 04:23:13.500" -"2019/05/25 04:23:14.000" "2019/05/25 04:23:14.500" -"2019/05/25 04:23:15.000" "2019/05/25 04:23:15.500" -"2019/05/25 04:23:16.000" "2019/05/25 04:23:16.500" -"2019/05/25 04:23:17.000" "2019/05/25 04:23:17.500" -"2019/05/25 04:23:18.000" "2019/05/25 04:23:18.500" -"2019/05/25 04:23:19.000" "2019/05/25 04:23:19.500" -"2019/05/25 04:23:20.000" "2019/05/25 04:23:20.500" -"2019/05/25 04:23:21.000" "2019/05/25 04:23:21.500" -"2019/05/25 04:23:22.000" "2019/05/25 04:23:22.500" -"2019/05/25 04:23:23.000" "2019/05/25 04:23:23.500" -"2019/05/25 04:23:24.000" "2019/05/25 04:23:24.500" -"2019/05/25 04:23:25.000" "2019/05/25 04:23:25.500" -"2019/05/25 04:23:26.000" "2019/05/25 04:23:26.500" -"2019/05/25 04:23:27.000" "2019/05/25 04:23:27.500" -"2019/05/25 04:23:28.000" "2019/05/25 04:23:28.500" -"2019/05/25 04:23:29.000" "2019/05/25 04:23:29.500" -"2019/05/25 04:23:30.000" "2019/05/25 04:23:30.500" -"2019/05/25 04:23:32.000" "2019/05/25 04:23:32.500" -"2019/05/25 04:23:33.000" "2019/05/25 04:23:33.500" -"2019/05/25 04:23:34.000" "2019/05/25 04:23:34.500" -"2019/05/25 04:23:35.000" "2019/05/25 04:23:35.500" -"2019/05/25 04:23:36.000" "2019/05/25 04:23:36.500" -"2019/05/25 04:23:37.000" "2019/05/25 04:23:37.500" -"2019/05/25 04:23:38.000" "2019/05/25 04:23:38.500" -"2019/05/25 04:23:39.000" "2019/05/25 04:23:39.500" -"2019/05/25 04:23:40.000" "2019/05/25 04:23:40.500" -"2019/05/25 04:23:41.000" "2019/05/25 04:23:41.500" -"2019/05/25 04:23:42.000" "2019/05/25 04:23:42.500" -"2019/05/25 04:23:43.000" "2019/05/25 04:23:43.500" -"2019/05/25 04:23:44.000" "2019/05/25 04:23:44.500" -"2019/05/25 04:23:45.000" "2019/05/25 04:23:45.500" -"2019/05/25 04:23:46.000" "2019/05/25 04:23:46.500" -"2019/05/25 04:23:47.000" "2019/05/25 04:23:47.500" -"2019/05/25 04:23:48.000" "2019/05/25 04:23:48.500" -"2019/05/25 04:23:49.000" "2019/05/25 04:23:49.500" -"2019/05/25 04:23:50.000" "2019/05/25 04:23:50.500" -"2019/05/25 04:23:51.000" "2019/05/25 04:23:51.500" -"2019/05/25 04:23:52.000" "2019/05/25 04:23:52.500" -"2019/05/25 04:23:53.000" "2019/05/25 04:23:53.500" -"2019/05/25 04:23:54.000" "2019/05/25 04:23:54.500" -"2019/05/25 04:23:55.000" "2019/05/25 04:23:55.500" -"2019/05/25 04:23:56.000" "2019/05/25 04:23:56.500" -"2019/05/25 04:23:57.000" "2019/05/25 04:23:57.500" -"2019/05/25 04:23:58.000" "2019/05/25 04:23:58.500" -"2019/05/25 04:24:00.000" "2019/05/25 04:24:00.500" -"2019/05/25 04:24:01.000" "2019/05/25 04:24:01.500" -"2019/05/25 04:24:02.000" "2019/05/25 04:24:02.500" -"2019/05/25 04:24:03.000" "2019/05/25 04:24:03.500" -"2019/05/25 04:24:04.000" "2019/05/25 04:24:04.500" -"2019/05/25 04:24:05.000" "2019/05/25 04:24:05.500" -"2019/05/25 04:24:06.000" "2019/05/25 04:24:06.500" -"2019/05/25 04:24:07.000" "2019/05/25 04:24:07.500" -"2019/05/25 04:24:08.000" "2019/05/25 04:24:08.500" -"2019/05/25 04:24:09.000" "2019/05/25 04:24:09.500" -"2019/05/25 04:24:10.000" "2019/05/25 04:24:10.500" -"2019/05/25 04:24:11.000" "2019/05/25 04:24:11.500" -"2019/05/25 04:24:12.000" "2019/05/25 04:24:12.500" -"2019/05/25 04:24:13.000" "2019/05/25 04:24:13.500" -"2019/05/25 04:24:14.000" "2019/05/25 04:24:14.500" -"2019/05/25 04:24:15.000" "2019/05/25 04:24:15.500" -"2019/05/25 04:24:16.000" "2019/05/25 04:24:16.500" -"2019/05/25 04:24:17.000" "2019/05/25 04:24:17.500" -"2019/05/25 04:24:18.000" "2019/05/25 04:24:18.500" -"2019/05/25 04:24:19.000" "2019/05/25 04:24:19.500" -"2019/05/25 04:24:20.000" "2019/05/25 04:24:20.500" -"2019/05/25 04:24:21.000" "2019/05/25 04:24:21.500" -"2019/05/25 04:24:22.000" "2019/05/25 04:24:22.500" -"2019/05/25 04:24:23.000" "2019/05/25 04:24:23.500" -"2019/05/25 04:24:24.000" "2019/05/25 04:24:24.500" -"2019/05/25 04:24:25.000" "2019/05/25 04:24:25.500" -"2019/05/25 04:24:26.000" "2019/05/25 04:24:26.500" -"2019/05/25 04:24:27.000" "2019/05/25 04:24:27.500" -"2019/05/25 04:24:28.000" "2019/05/25 04:24:28.500" -"2019/05/25 04:24:29.000" "2019/05/25 04:24:29.500" -"2019/05/25 04:24:30.000" "2019/05/25 04:24:30.500" -"2019/05/25 04:24:31.000" "2019/05/25 04:24:31.500" -"2019/05/25 04:24:32.000" "2019/05/25 04:24:32.500" -"2019/05/25 04:24:33.000" "2019/05/25 04:24:33.500" -"2019/05/25 04:24:34.000" "2019/05/25 04:24:34.500" -"2019/05/25 04:24:35.000" "2019/05/25 04:24:35.500" -"2019/05/25 04:24:36.000" "2019/05/25 04:24:36.500" -"2019/05/25 04:24:37.000" "2019/05/25 04:24:37.500" -"2019/05/25 04:24:38.000" "2019/05/25 04:24:38.500" -"2019/05/25 04:24:39.000" "2019/05/25 04:24:39.500" -"2019/05/25 04:24:40.000" "2019/05/25 04:24:40.500" -"2019/05/25 04:24:41.000" "2019/05/25 04:24:41.500" -"2019/05/25 04:24:42.000" "2019/05/25 04:24:42.500" -"2019/05/25 04:24:43.000" "2019/05/25 04:24:43.500" -"2019/05/25 04:24:44.000" "2019/05/25 04:24:44.500" -"2019/05/25 04:24:45.000" "2019/05/25 04:24:45.500" -"2019/05/25 04:24:46.000" "2019/05/25 04:24:46.500" -"2019/05/25 04:24:47.000" "2019/05/25 04:24:47.500" -"2019/05/25 04:24:48.000" "2019/05/25 04:24:48.500" -"2019/05/25 04:24:49.000" "2019/05/25 04:24:49.500" -"2019/05/25 04:24:50.000" "2019/05/25 04:24:50.500" -"2019/05/25 04:24:51.000" "2019/05/25 04:24:51.500" -"2019/05/25 04:24:52.000" "2019/05/25 04:24:52.500" -"2019/05/25 04:24:53.000" "2019/05/25 04:24:53.500" -"2019/05/25 04:24:54.000" "2019/05/25 04:24:54.500" -"2019/05/25 04:24:55.000" "2019/05/25 04:24:55.500" -"2019/05/25 04:24:56.000" "2019/05/25 04:24:56.500" -"2019/05/25 04:24:57.000" "2019/05/25 04:24:57.500" -"2019/05/25 04:24:58.000" "2019/05/25 04:24:58.500" -"2019/05/25 04:24:59.000" "2019/05/25 04:24:59.500" -"2019/05/25 04:25:00.000" "2019/05/25 04:25:00.500" -"2019/05/25 04:25:01.000" "2019/05/25 04:25:01.500" -"2019/05/25 04:25:02.000" "2019/05/25 04:25:02.500" -"2019/05/25 04:25:03.000" "2019/05/25 04:25:03.500" -"2019/05/25 04:25:04.000" "2019/05/25 04:25:04.500" -"2019/05/25 04:25:05.000" "2019/05/25 04:25:05.500" -"2019/05/25 04:25:06.000" "2019/05/25 04:25:06.500" -"2019/05/25 04:25:07.000" "2019/05/25 04:25:07.500" -"2019/05/25 04:25:08.000" "2019/05/25 04:25:08.500" -"2019/05/25 04:25:09.000" "2019/05/25 04:25:09.500" -"2019/05/25 04:25:10.000" "2019/05/25 04:25:10.500" -"2019/05/25 04:25:11.000" "2019/05/25 04:25:11.500" -"2019/05/25 04:25:12.000" "2019/05/25 04:25:12.500" -"2019/05/25 04:25:13.000" "2019/05/25 04:25:13.500" -"2019/05/25 04:25:14.000" "2019/05/25 04:25:14.500" -"2019/05/25 04:25:15.000" "2019/05/25 04:25:15.500" -"2019/05/25 04:25:16.000" "2019/05/25 04:25:16.500" -"2019/05/25 04:25:17.000" "2019/05/25 04:25:17.500" -"2019/05/25 04:25:18.000" "2019/05/25 04:25:18.500" -"2019/05/25 04:25:19.000" "2019/05/25 04:25:19.500" -"2019/05/25 04:25:20.000" "2019/05/25 04:25:20.500" -"2019/05/25 04:25:21.000" "2019/05/25 04:25:21.500" -"2019/05/25 04:25:22.000" "2019/05/25 04:25:22.500" -"2019/05/25 04:25:23.000" "2019/05/25 04:25:23.500" -"2019/05/25 04:25:24.000" "2019/05/25 04:25:24.500" -"2019/05/25 04:25:25.000" "2019/05/25 04:25:25.500" -"2019/05/25 04:25:26.000" "2019/05/25 04:25:26.500" -"2019/05/25 04:25:27.000" "2019/05/25 04:25:27.500" -"2019/05/25 04:25:28.000" "2019/05/25 04:25:28.500" -"2019/05/25 04:25:29.000" "2019/05/25 04:25:29.500" -"2019/05/25 04:25:30.000" "2019/05/25 04:25:30.500" -"2019/05/25 04:25:31.000" "2019/05/25 04:25:31.500" -"2019/05/25 04:25:32.000" "2019/05/25 04:25:32.500" -"2019/05/25 04:25:34.000" "2019/05/25 04:25:34.500" -"2019/05/25 04:25:35.000" "2019/05/25 04:25:35.500" -"2019/05/25 04:25:36.000" "2019/05/25 04:25:36.500" -"2019/05/25 04:25:37.000" "2019/05/25 04:25:37.500" -"2019/05/25 04:25:38.000" "2019/05/25 04:25:38.500" -"2019/05/25 04:25:39.000" "2019/05/25 04:25:39.500" -"2019/05/25 04:25:40.000" "2019/05/25 04:25:40.500" -"2019/05/25 04:25:41.000" "2019/05/25 04:25:41.500" -"2019/05/25 04:25:42.000" "2019/05/25 04:25:42.500" -"2019/05/25 04:25:43.000" "2019/05/25 04:25:43.500" -"2019/05/25 04:25:44.000" "2019/05/25 04:25:44.500" -"2019/05/25 04:25:45.000" "2019/05/25 04:25:45.500" -"2019/05/25 04:25:46.000" "2019/05/25 04:25:46.500" -"2019/05/25 04:25:47.000" "2019/05/25 04:25:47.500" -"2019/05/25 04:25:48.000" "2019/05/25 04:25:48.500" -"2019/05/25 04:25:49.000" "2019/05/25 04:25:49.500" -"2019/05/25 04:25:50.000" "2019/05/25 04:25:50.500" -"2019/05/25 04:25:51.000" "2019/05/25 04:25:51.500" -"2019/05/25 04:25:52.000" "2019/05/25 04:25:52.500" -"2019/05/25 04:25:53.000" "2019/05/25 04:25:53.500" -"2019/05/25 04:25:54.000" "2019/05/25 04:25:54.500" -"2019/05/25 04:25:55.000" "2019/05/25 04:25:55.500" -"2019/05/25 04:25:56.000" "2019/05/25 04:25:56.500" -"2019/05/25 04:25:57.000" "2019/05/25 04:25:57.500" -"2019/05/25 04:25:58.000" "2019/05/25 04:25:58.500" -"2019/05/25 04:25:59.000" "2019/05/25 04:25:59.500" -"2019/05/25 04:26:00.000" "2019/05/25 04:26:00.500" -"2019/05/25 04:26:01.000" "2019/05/25 04:26:01.500" -"2019/05/25 04:26:02.000" "2019/05/25 04:26:02.500" -"2019/05/25 04:26:03.000" "2019/05/25 04:26:03.500" -"2019/05/25 04:26:04.000" "2019/05/25 04:26:04.500" -"2019/05/25 04:26:05.000" "2019/05/25 04:26:05.500" -"2019/05/25 04:26:06.000" "2019/05/25 04:26:06.500" -"2019/05/25 04:26:07.000" "2019/05/25 04:26:07.500" -"2019/05/25 04:26:08.000" "2019/05/25 04:26:08.500" -"2019/05/25 04:26:10.000" "2019/05/25 04:26:10.500" -"2019/05/25 04:26:11.000" "2019/05/25 04:26:11.500" -"2019/05/25 04:26:12.000" "2019/05/25 04:26:12.500" -"2019/05/25 04:26:13.000" "2019/05/25 04:26:13.500" -"2019/05/25 04:26:14.000" "2019/05/25 04:26:14.500" -"2019/05/25 04:26:15.000" "2019/05/25 04:26:15.500" -"2019/05/25 04:26:16.000" "2019/05/25 04:26:16.500" -"2019/05/25 04:26:17.000" "2019/05/25 04:26:17.500" -"2019/05/25 04:26:18.000" "2019/05/25 04:26:18.500" -"2019/05/25 04:26:19.000" "2019/05/25 04:26:19.500" -"2019/05/25 04:26:20.000" "2019/05/25 04:26:20.500" -"2019/05/25 04:26:21.000" "2019/05/25 04:26:21.500" -"2019/05/25 04:26:22.000" "2019/05/25 04:26:22.500" -"2019/05/25 04:26:23.000" "2019/05/25 04:26:23.500" -"2019/05/25 04:26:24.000" "2019/05/25 04:26:24.500" -"2019/05/25 04:26:25.000" "2019/05/25 04:26:25.500" -"2019/05/25 04:26:26.000" "2019/05/25 04:26:26.500" -"2019/05/25 04:26:27.000" "2019/05/25 04:26:27.500" -"2019/05/25 04:26:28.000" "2019/05/25 04:26:28.500" -"2019/05/25 04:26:29.000" "2019/05/25 04:26:29.500" -"2019/05/25 04:26:30.000" "2019/05/25 04:26:30.500" -"2019/05/25 04:26:31.000" "2019/05/25 04:26:31.500" -"2019/05/25 04:26:32.000" "2019/05/25 04:26:32.500" -"2019/05/25 04:26:33.000" "2019/05/25 04:26:33.500" -"2019/05/25 04:26:34.000" "2019/05/25 04:26:34.500" -"2019/05/25 04:26:35.000" "2019/05/25 04:26:35.500" -"2019/05/25 04:26:36.000" "2019/05/25 04:26:36.500" -"2019/05/25 04:26:37.000" "2019/05/25 04:26:37.500" -"2019/05/25 04:26:38.000" "2019/05/25 04:26:38.500" -"2019/05/25 04:26:39.000" "2019/05/25 04:26:39.500" -"2019/05/25 04:26:40.000" "2019/05/25 04:26:40.500" -"2019/05/25 04:26:41.000" "2019/05/25 04:26:41.500" -"2019/05/25 04:26:42.000" "2019/05/25 04:26:42.500" -"2019/05/25 04:26:43.000" "2019/05/25 04:26:43.500" -"2019/05/25 04:26:44.000" "2019/05/25 04:26:44.500" -"2019/05/25 04:26:45.000" "2019/05/25 04:26:45.500" -"2019/05/25 04:26:46.000" "2019/05/25 04:26:46.500" -"2019/05/25 04:26:47.000" "2019/05/25 04:26:47.500" -"2019/05/25 04:26:48.000" "2019/05/25 04:26:48.500" -"2019/05/25 04:26:49.000" "2019/05/25 04:26:49.500" -"2019/05/25 04:26:50.000" "2019/05/25 04:26:50.500" -"2019/05/25 04:26:51.000" "2019/05/25 04:26:51.500" -"2019/05/25 04:26:52.000" "2019/05/25 04:26:52.500" -"2019/05/25 04:26:53.000" "2019/05/25 04:26:53.500" -"2019/05/25 04:26:54.000" "2019/05/25 04:26:54.500" -"2019/05/25 04:26:55.000" "2019/05/25 04:26:55.500" -"2019/05/25 04:26:56.000" "2019/05/25 04:26:56.500" -"2019/05/25 04:26:57.000" "2019/05/25 04:26:57.500" -"2019/05/25 04:26:58.000" "2019/05/25 04:26:58.500" -"2019/05/25 04:26:59.000" "2019/05/25 04:26:59.500" -"2019/05/25 04:27:00.000" "2019/05/25 04:27:00.500" -"2019/05/25 04:27:01.000" "2019/05/25 04:27:01.500" -"2019/05/25 04:27:02.000" "2019/05/25 04:27:02.500" -"2019/05/25 04:27:03.000" "2019/05/25 04:27:03.500" -"2019/05/25 04:27:04.000" "2019/05/25 04:27:04.500" -"2019/05/25 04:27:05.000" "2019/05/25 04:27:05.500" -"2019/05/25 04:27:06.000" "2019/05/25 04:27:06.500" -"2019/05/25 04:27:07.000" "2019/05/25 04:27:07.500" -"2019/05/25 04:27:08.000" "2019/05/25 04:27:08.500" -"2019/05/25 04:27:09.000" "2019/05/25 04:27:09.500" -"2019/05/25 04:27:10.000" "2019/05/25 04:27:10.500" -"2019/05/25 04:27:11.000" "2019/05/25 04:27:11.500" -"2019/05/25 04:27:12.000" "2019/05/25 04:27:12.500" -"2019/05/25 04:27:13.000" "2019/05/25 04:27:13.500" -"2019/05/25 04:27:14.000" "2019/05/25 04:27:14.500" -"2019/05/25 04:27:15.000" "2019/05/25 04:27:15.500" -"2019/05/25 04:27:16.000" "2019/05/25 04:27:16.500" -"2019/05/25 04:27:17.000" "2019/05/25 04:27:17.500" -"2019/05/25 04:27:18.000" "2019/05/25 04:27:18.500" -"2019/05/25 04:27:19.000" "2019/05/25 04:27:19.500" -"2019/05/25 04:27:20.000" "2019/05/25 04:27:20.500" -"2019/05/25 04:27:21.000" "2019/05/25 04:27:21.500" -"2019/05/25 04:27:22.000" "2019/05/25 04:27:22.500" -"2019/05/25 04:27:23.000" "2019/05/25 04:27:23.500" -"2019/05/25 04:27:24.000" "2019/05/25 04:27:24.500" -"2019/05/25 04:27:25.000" "2019/05/25 04:27:25.500" -"2019/05/25 04:27:26.000" "2019/05/25 04:27:26.500" -"2019/05/25 04:27:27.000" "2019/05/25 04:27:27.500" -"2019/05/25 04:27:28.000" "2019/05/25 04:27:28.500" -"2019/05/25 04:27:29.000" "2019/05/25 04:27:29.500" -"2019/05/25 04:27:30.000" "2019/05/25 04:27:30.500" -"2019/05/25 04:27:31.000" "2019/05/25 04:27:31.500" -"2019/05/25 04:27:32.000" "2019/05/25 04:27:32.500" -"2019/05/25 04:27:33.000" "2019/05/25 04:27:33.500" -"2019/05/25 04:27:34.000" "2019/05/25 04:27:34.500" -"2019/05/25 04:27:35.000" "2019/05/25 04:27:35.500" -"2019/05/25 04:27:36.000" "2019/05/25 04:27:36.500" -"2019/05/25 04:27:37.000" "2019/05/25 04:27:37.500" -"2019/05/25 04:27:38.000" "2019/05/25 04:27:38.500" -"2019/05/25 04:27:39.000" "2019/05/25 04:27:39.500" -"2019/05/25 04:27:40.000" "2019/05/25 04:27:40.500" -"2019/05/25 04:27:41.000" "2019/05/25 04:27:41.500" -"2019/05/25 04:27:43.000" "2019/05/25 04:27:43.500" -"2019/05/25 04:27:44.000" "2019/05/25 04:27:44.500" -"2019/05/25 04:27:45.000" "2019/05/25 04:27:45.500" -"2019/05/25 04:27:46.000" "2019/05/25 04:27:46.500" -"2019/05/25 04:27:47.000" "2019/05/25 04:27:47.500" -"2019/05/25 04:27:48.000" "2019/05/25 04:27:48.500" -"2019/05/25 04:27:49.000" "2019/05/25 04:27:49.500" -"2019/05/25 04:27:50.000" "2019/05/25 04:27:50.500" -"2019/05/25 04:27:51.000" "2019/05/25 04:27:51.500" -"2019/05/25 04:27:52.000" "2019/05/25 04:27:52.500" -"2019/05/25 04:27:53.000" "2019/05/25 04:27:53.500" -"2019/05/25 04:27:54.000" "2019/05/25 04:27:54.500" -"2019/05/25 04:27:55.000" "2019/05/25 04:27:55.500" -"2019/05/25 04:27:56.000" "2019/05/25 04:27:56.500" -"2019/05/25 04:27:57.000" "2019/05/25 04:27:57.500" -"2019/05/25 04:27:58.000" "2019/05/25 04:27:58.500" -"2019/05/25 04:27:59.000" "2019/05/25 04:27:59.500" -"2019/05/25 04:28:00.000" "2019/05/25 04:28:00.500" -"2019/05/25 04:28:01.000" "2019/05/25 04:28:01.500" -"2019/05/25 04:28:02.000" "2019/05/25 04:28:02.500" -"2019/05/25 04:28:03.000" "2019/05/25 04:28:03.500" -"2019/05/25 04:28:04.000" "2019/05/25 04:28:04.500" -"2019/05/25 04:28:05.000" "2019/05/25 04:28:05.500" -"2019/05/25 04:28:06.000" "2019/05/25 04:28:06.500" -"2019/05/25 04:28:07.000" "2019/05/25 04:28:07.500" -"2019/05/25 04:28:08.000" "2019/05/25 04:28:08.500" -"2019/05/25 04:28:09.000" "2019/05/25 04:28:09.500" -"2019/05/25 04:28:10.000" "2019/05/25 04:28:10.500" -"2019/05/25 04:28:11.000" "2019/05/25 04:28:11.500" -"2019/05/25 04:28:12.000" "2019/05/25 04:28:12.500" -"2019/05/25 04:28:14.000" "2019/05/25 04:28:14.500" -"2019/05/25 04:28:15.000" "2019/05/25 04:28:15.500" -"2019/05/25 04:28:16.000" "2019/05/25 04:28:16.500" -"2019/05/25 04:28:17.000" "2019/05/25 04:28:17.500" -"2019/05/25 04:28:18.000" "2019/05/25 04:28:18.500" -"2019/05/25 04:28:19.000" "2019/05/25 04:28:19.500" -"2019/05/25 04:28:20.000" "2019/05/25 04:28:20.500" -"2019/05/25 04:28:21.000" "2019/05/25 04:28:21.500" -"2019/05/25 04:28:22.000" "2019/05/25 04:28:22.500" -"2019/05/25 04:28:23.000" "2019/05/25 04:28:23.500" -"2019/05/25 04:28:24.000" "2019/05/25 04:28:24.500" -"2019/05/25 04:28:25.000" "2019/05/25 04:28:25.500" -"2019/05/25 04:28:26.000" "2019/05/25 04:28:26.500" -"2019/05/25 04:28:27.000" "2019/05/25 04:28:27.500" -"2019/05/25 04:28:28.000" "2019/05/25 04:28:28.500" -"2019/05/25 04:28:29.000" "2019/05/25 04:28:29.500" -"2019/05/25 04:28:30.000" "2019/05/25 04:28:30.500" -"2019/05/25 04:28:31.000" "2019/05/25 04:28:31.500" -"2019/05/25 04:28:32.000" "2019/05/25 04:28:32.500" -"2019/05/25 04:28:33.000" "2019/05/25 04:28:33.500" -"2019/05/25 04:28:34.000" "2019/05/25 04:28:34.500" -"2019/05/25 04:28:35.000" "2019/05/25 04:28:35.500" -"2019/05/25 04:28:36.000" "2019/05/25 04:28:36.500" -"2019/05/25 04:28:37.000" "2019/05/25 04:28:37.500" -"2019/05/25 04:28:38.000" "2019/05/25 04:28:38.500" -"2019/05/25 04:28:39.000" "2019/05/25 04:28:39.500" -"2019/05/25 04:28:40.000" "2019/05/25 04:28:40.500" -"2019/05/25 04:28:41.000" "2019/05/25 04:28:41.500" -"2019/05/25 04:28:42.000" "2019/05/25 04:28:42.500" -"2019/05/25 04:28:43.000" "2019/05/25 04:28:43.500" -"2019/05/25 04:28:44.000" "2019/05/25 04:28:44.500" -"2019/05/25 04:28:45.000" "2019/05/25 04:28:45.500" -"2019/05/25 04:28:46.000" "2019/05/25 04:28:46.500" -"2019/05/25 04:28:47.000" "2019/05/25 04:28:47.500" -"2019/05/25 04:28:48.000" "2019/05/25 04:28:48.500" -"2019/05/25 04:28:49.000" "2019/05/25 04:28:49.500" -"2019/05/25 04:28:50.000" "2019/05/25 04:28:50.500" -"2019/05/25 04:28:51.000" "2019/05/25 04:28:51.500" -"2019/05/25 04:28:52.000" "2019/05/25 04:28:52.500" -"2019/05/25 04:28:53.000" "2019/05/25 04:28:53.500" -"2019/05/25 04:28:54.000" "2019/05/25 04:28:54.500" -"2019/05/25 04:28:55.000" "2019/05/25 04:28:55.500" -"2019/05/25 04:28:56.000" "2019/05/25 04:28:56.500" -"2019/05/25 04:28:57.000" "2019/05/25 04:28:57.500" -"2019/05/25 04:28:58.000" "2019/05/25 04:28:58.500" -"2019/05/25 04:28:59.000" "2019/05/25 04:28:59.500" -"2019/05/25 04:29:00.000" "2019/05/25 04:29:00.500" -"2019/05/25 04:29:01.000" "2019/05/25 04:29:01.500" -"2019/05/25 04:29:02.000" "2019/05/25 04:29:02.500" -"2019/05/25 04:29:03.000" "2019/05/25 04:29:03.500" -"2019/05/25 04:29:04.000" "2019/05/25 04:29:04.500" -"2019/05/25 04:29:05.000" "2019/05/25 04:29:05.500" -"2019/05/25 04:29:06.000" "2019/05/25 04:29:06.500" -"2019/05/25 04:29:07.000" "2019/05/25 04:29:07.500" -"2019/05/25 04:29:08.000" "2019/05/25 04:29:08.500" -"2019/05/25 04:29:09.000" "2019/05/25 04:29:09.500" -"2019/05/25 04:29:10.000" "2019/05/25 04:29:10.500" -"2019/05/25 04:29:11.000" "2019/05/25 04:29:11.500" -"2019/05/25 04:29:12.000" "2019/05/25 04:29:12.500" -"2019/05/25 04:29:13.000" "2019/05/25 04:29:13.500" -"2019/05/25 04:29:14.000" "2019/05/25 04:29:14.500" -"2019/05/25 04:29:15.000" "2019/05/25 04:29:15.500" -"2019/05/25 04:29:16.000" "2019/05/25 04:29:16.500" -"2019/05/25 04:29:17.000" "2019/05/25 04:29:17.500" -"2019/05/25 04:29:18.000" "2019/05/25 04:29:18.500" -"2019/05/25 04:29:19.000" "2019/05/25 04:29:19.500" -"2019/05/25 04:29:20.000" "2019/05/25 04:29:20.500" -"2019/05/25 04:29:21.000" "2019/05/25 04:29:21.500" -"2019/05/25 04:29:22.000" "2019/05/25 04:29:22.500" -"2019/05/25 04:29:23.000" "2019/05/25 04:29:23.500" -"2019/05/25 04:29:24.000" "2019/05/25 04:29:24.500" -"2019/05/25 04:29:25.000" "2019/05/25 04:29:25.500" -"2019/05/25 04:29:26.000" "2019/05/25 04:29:26.500" -"2019/05/25 04:29:27.000" "2019/05/25 04:29:27.500" -"2019/05/25 04:29:28.000" "2019/05/25 04:29:28.500" -"2019/05/25 04:29:29.000" "2019/05/25 04:29:29.500" -"2019/05/25 04:29:30.000" "2019/05/25 04:29:30.500" -"2019/05/25 04:29:31.000" "2019/05/25 04:29:31.500" -"2019/05/25 04:29:32.000" "2019/05/25 04:29:32.500" -"2019/05/25 04:29:33.000" "2019/05/25 04:29:33.500" -"2019/05/25 04:29:34.000" "2019/05/25 04:29:34.500" -"2019/05/25 04:29:35.000" "2019/05/25 04:29:35.500" -"2019/05/25 04:29:36.000" "2019/05/25 04:29:36.500" -"2019/05/25 04:29:37.000" "2019/05/25 04:29:37.500" -"2019/05/25 04:29:38.000" "2019/05/25 04:29:38.500" -"2019/05/25 04:29:39.000" "2019/05/25 04:29:39.500" -"2019/05/25 04:29:40.000" "2019/05/25 04:29:40.500" -"2019/05/25 04:29:41.000" "2019/05/25 04:29:41.500" -"2019/05/25 04:29:42.000" "2019/05/25 04:29:42.500" -"2019/05/25 04:29:43.000" "2019/05/25 04:29:43.500" -"2019/05/25 04:29:44.000" "2019/05/25 04:29:44.500" -"2019/05/25 04:29:45.000" "2019/05/25 04:29:45.500" -"2019/05/25 04:29:46.000" "2019/05/25 04:29:46.500" -"2019/05/25 04:29:47.000" "2019/05/25 04:29:47.500" -"2019/05/25 04:29:48.000" "2019/05/25 04:29:48.500" -"2019/05/25 04:29:49.000" "2019/05/25 04:29:49.500" -"2019/05/25 04:29:50.000" "2019/05/25 04:29:50.500" -"2019/05/25 04:29:51.000" "2019/05/25 04:29:51.500" -"2019/05/25 04:29:52.000" "2019/05/25 04:29:52.500" -"2019/05/25 04:29:54.000" "2019/05/25 04:29:54.500" -"2019/05/25 04:29:55.000" "2019/05/25 04:29:55.500" -"2019/05/25 04:29:56.000" "2019/05/25 04:29:56.500" -"2019/05/25 04:29:57.000" "2019/05/25 04:29:57.500" -"2019/05/25 04:29:58.000" "2019/05/25 04:29:58.500" -"2019/05/25 04:29:59.000" "2019/05/25 04:29:59.500" -"2019/05/25 04:30:00.000" "2019/05/25 04:30:00.500" -"2019/05/25 04:30:01.000" "2019/05/25 04:30:01.500" -"2019/05/25 04:30:02.000" "2019/05/25 04:30:02.500" -"2019/05/25 04:30:03.000" "2019/05/25 04:30:03.500" -"2019/05/25 04:30:04.000" "2019/05/25 04:30:04.500" -"2019/05/25 04:30:05.000" "2019/05/25 04:30:05.500" -"2019/05/25 04:30:06.000" "2019/05/25 04:30:06.500" -"2019/05/25 04:30:07.000" "2019/05/25 04:30:07.500" -"2019/05/25 04:30:08.000" "2019/05/25 04:30:08.500" -"2019/05/25 04:30:09.000" "2019/05/25 04:30:09.500" -"2019/05/25 04:30:10.000" "2019/05/25 04:30:10.500" -"2019/05/25 04:30:11.000" "2019/05/25 04:30:11.500" -"2019/05/25 04:30:12.000" "2019/05/25 04:30:12.500" -"2019/05/25 04:30:13.000" "2019/05/25 04:30:13.500" -"2019/05/25 04:30:14.000" "2019/05/25 04:30:14.500" -"2019/05/25 04:30:15.000" "2019/05/25 04:30:15.500" -"2019/05/25 04:30:16.000" "2019/05/25 04:30:16.500" -"2019/05/25 04:30:17.000" "2019/05/25 04:30:17.500" -"2019/05/25 04:30:18.000" "2019/05/25 04:30:18.500" -"2019/05/25 04:30:19.000" "2019/05/25 04:30:19.500" -"2019/05/25 04:30:20.000" "2019/05/25 04:30:20.500" -"2019/05/25 04:30:21.000" "2019/05/25 04:30:21.500" -"2019/05/25 04:30:22.000" "2019/05/25 04:30:22.500" -"2019/05/25 04:30:23.000" "2019/05/25 04:30:23.500" -"2019/05/25 04:30:24.000" "2019/05/25 04:30:24.500" -"2019/05/25 04:30:25.000" "2019/05/25 04:30:25.500" -"2019/05/25 04:30:27.000" "2019/05/25 04:30:27.500" -"2019/05/25 04:30:28.000" "2019/05/25 04:30:28.500" -"2019/05/25 04:30:29.000" "2019/05/25 04:30:29.500" -"2019/05/25 04:30:30.000" "2019/05/25 04:30:30.500" -"2019/05/25 04:30:31.000" "2019/05/25 04:30:31.500" -"2019/05/25 04:30:32.000" "2019/05/25 04:30:32.500" -"2019/05/25 04:30:33.000" "2019/05/25 04:30:33.500" -"2019/05/25 04:30:34.000" "2019/05/25 04:30:34.500" -"2019/05/25 04:30:35.000" "2019/05/25 04:30:35.500" -"2019/05/25 04:30:36.000" "2019/05/25 04:30:36.500" -"2019/05/25 04:30:37.000" "2019/05/25 04:30:37.500" -"2019/05/25 04:30:38.000" "2019/05/25 04:30:38.500" -"2019/05/25 04:30:39.000" "2019/05/25 04:30:39.500" -"2019/05/25 04:30:40.000" "2019/05/25 04:30:40.500" -"2019/05/25 04:30:41.000" "2019/05/25 04:30:41.500" -"2019/05/25 04:30:42.000" "2019/05/25 04:30:42.500" -"2019/05/25 04:30:43.000" "2019/05/25 04:30:43.500" -"2019/05/25 04:30:44.000" "2019/05/25 04:30:44.500" -"2019/05/25 04:30:45.000" "2019/05/25 04:30:45.500" -"2019/05/25 04:30:46.000" "2019/05/25 04:30:46.500" -"2019/05/25 04:30:47.000" "2019/05/25 04:30:47.500" -"2019/05/25 04:30:48.000" "2019/05/25 04:30:48.500" -"2019/05/25 04:30:49.000" "2019/05/25 04:30:49.500" -"2019/05/25 04:30:50.000" "2019/05/25 04:30:50.500" -"2019/05/25 04:30:51.000" "2019/05/25 04:30:51.500" -"2019/05/25 04:30:52.000" "2019/05/25 04:30:52.500" -"2019/05/25 04:30:53.000" "2019/05/25 04:30:53.500" -"2019/05/25 04:30:54.000" "2019/05/25 04:30:54.500" -"2019/05/25 04:30:55.000" "2019/05/25 04:30:55.500" -"2019/05/25 04:30:56.000" "2019/05/25 04:30:56.500" -"2019/05/25 04:30:57.000" "2019/05/25 04:30:57.500" -"2019/05/25 04:30:58.000" "2019/05/25 04:30:58.500" -"2019/05/25 04:30:59.000" "2019/05/25 04:30:59.500" -"2019/05/25 04:31:00.000" "2019/05/25 04:31:00.500" -"2019/05/25 04:31:01.000" "2019/05/25 04:31:01.500" -"2019/05/25 04:31:02.000" "2019/05/25 04:31:02.500" -"2019/05/25 04:31:03.000" "2019/05/25 04:31:03.500" -"2019/05/25 04:31:04.000" "2019/05/25 04:31:04.500" -"2019/05/25 04:31:05.000" "2019/05/25 04:31:05.500" -"2019/05/25 04:31:06.000" "2019/05/25 04:31:06.500" -"2019/05/25 04:31:07.000" "2019/05/25 04:31:07.500" -"2019/05/25 04:31:08.000" "2019/05/25 04:31:08.500" -"2019/05/25 04:31:09.000" "2019/05/25 04:31:09.500" -"2019/05/25 04:31:10.000" "2019/05/25 04:31:10.500" -"2019/05/25 04:31:11.000" "2019/05/25 04:31:11.500" -"2019/05/25 04:31:12.000" "2019/05/25 04:31:12.500" -"2019/05/25 04:31:13.000" "2019/05/25 04:31:13.500" -"2019/05/25 04:31:14.000" "2019/05/25 04:31:14.500" -"2019/05/25 04:31:15.000" "2019/05/25 04:31:15.500" -"2019/05/25 04:31:16.000" "2019/05/25 04:31:16.500" -"2019/05/25 04:31:17.000" "2019/05/25 04:31:17.500" -"2019/05/25 04:31:18.000" "2019/05/25 04:31:18.500" -"2019/05/25 04:31:19.000" "2019/05/25 04:31:19.500" -"2019/05/25 04:31:20.000" "2019/05/25 04:31:20.500" -"2019/05/25 04:31:21.000" "2019/05/25 04:31:21.500" -"2019/05/25 04:31:22.000" "2019/05/25 04:31:22.500" -"2019/05/25 04:31:23.000" "2019/05/25 04:31:23.500" -"2019/05/25 04:31:24.000" "2019/05/25 04:31:24.500" -"2019/05/25 04:31:25.000" "2019/05/25 04:31:25.500" -"2019/05/25 04:31:26.000" "2019/05/25 04:31:26.500" -"2019/05/25 04:31:27.000" "2019/05/25 04:31:27.500" -"2019/05/25 04:31:28.000" "2019/05/25 04:31:28.500" -"2019/05/25 04:31:29.000" "2019/05/25 04:31:29.500" -"2019/05/25 04:31:30.000" "2019/05/25 04:31:30.500" -"2019/05/25 04:31:31.000" "2019/05/25 04:31:31.500" -"2019/05/25 04:31:32.000" "2019/05/25 04:31:32.500" -"2019/05/25 04:31:33.000" "2019/05/25 04:31:33.500" -"2019/05/25 04:31:34.000" "2019/05/25 04:31:34.500" -"2019/05/25 04:31:35.000" "2019/05/25 04:31:35.500" -"2019/05/25 04:31:36.000" "2019/05/25 04:31:36.500" -"2019/05/25 04:31:37.000" "2019/05/25 04:31:37.500" -"2019/05/25 04:31:38.000" "2019/05/25 04:31:38.500" -"2019/05/25 04:31:39.000" "2019/05/25 04:31:39.500" -"2019/05/25 04:31:40.000" "2019/05/25 04:31:40.500" -"2019/05/25 04:31:41.000" "2019/05/25 04:31:41.500" -"2019/05/25 04:31:42.000" "2019/05/25 04:31:42.500" -"2019/05/25 04:31:43.000" "2019/05/25 04:31:43.500" -"2019/05/25 04:31:44.000" "2019/05/25 04:31:44.500" -"2019/05/25 04:31:45.000" "2019/05/25 04:31:45.500" -"2019/05/25 04:31:46.000" "2019/05/25 04:31:46.500" -"2019/05/25 04:31:47.000" "2019/05/25 04:31:47.500" -"2019/05/25 04:31:48.000" "2019/05/25 04:31:48.500" -"2019/05/25 04:31:49.000" "2019/05/25 04:31:49.500" -"2019/05/25 04:31:50.000" "2019/05/25 04:31:50.500" -"2019/05/25 04:31:51.000" "2019/05/25 04:31:51.500" -"2019/05/25 04:31:52.000" "2019/05/25 04:31:52.500" -"2019/05/25 04:31:53.000" "2019/05/25 04:31:53.500" -"2019/05/25 04:31:54.000" "2019/05/25 04:31:54.500" -"2019/05/25 04:31:55.000" "2019/05/25 04:31:55.500" -"2019/05/25 04:31:56.000" "2019/05/25 04:31:56.500" -"2019/05/25 04:31:57.000" "2019/05/25 04:31:57.500" -"2019/05/25 04:31:58.000" "2019/05/25 04:31:58.500" -"2019/05/25 04:31:59.000" "2019/05/25 04:31:59.500" -"2019/05/25 04:32:00.000" "2019/05/25 04:32:00.500" -"2019/05/25 04:32:02.000" "2019/05/25 04:32:02.500" -"2019/05/25 04:32:03.000" "2019/05/25 04:32:03.500" -"2019/05/25 04:32:04.000" "2019/05/25 04:32:04.500" -"2019/05/25 04:32:05.000" "2019/05/25 04:32:05.500" -"2019/05/25 04:32:06.000" "2019/05/25 04:32:06.500" -"2019/05/25 04:32:07.000" "2019/05/25 04:32:07.500" -"2019/05/25 04:32:08.000" "2019/05/25 04:32:08.500" -"2019/05/25 04:32:09.000" "2019/05/25 04:32:09.500" -"2019/05/25 04:32:10.000" "2019/05/25 04:32:10.500" -"2019/05/25 04:32:11.000" "2019/05/25 04:32:11.500" -"2019/05/25 04:32:12.000" "2019/05/25 04:32:12.500" -"2019/05/25 04:32:13.000" "2019/05/25 04:32:13.500" -"2019/05/25 04:32:14.000" "2019/05/25 04:32:14.500" -"2019/05/25 04:32:15.000" "2019/05/25 04:32:15.500" -"2019/05/25 04:32:16.000" "2019/05/25 04:32:16.500" -"2019/05/25 04:32:17.000" "2019/05/25 04:32:17.500" -"2019/05/25 04:32:18.000" "2019/05/25 04:32:18.500" -"2019/05/25 04:32:19.000" "2019/05/25 04:32:19.500" -"2019/05/25 04:32:20.000" "2019/05/25 04:32:20.500" -"2019/05/25 04:32:21.000" "2019/05/25 04:32:21.500" -"2019/05/25 04:32:22.000" "2019/05/25 04:32:22.500" -"2019/05/25 04:32:23.000" "2019/05/25 04:32:23.500" -"2019/05/25 04:32:24.000" "2019/05/25 04:32:24.500" -"2019/05/25 04:32:25.000" "2019/05/25 04:32:25.500" -"2019/05/25 04:32:26.000" "2019/05/25 04:32:26.500" -"2019/05/25 04:32:27.000" "2019/05/25 04:32:27.500" -"2019/05/25 04:32:28.000" "2019/05/25 04:32:28.500" -"2019/05/25 04:32:29.000" "2019/05/25 04:32:29.500" -"2019/05/25 04:32:30.000" "2019/05/25 04:32:30.500" -"2019/05/25 04:32:31.000" "2019/05/25 04:32:31.500" -"2019/05/25 04:32:32.000" "2019/05/25 04:32:32.500" -"2019/05/25 04:32:33.000" "2019/05/25 04:32:33.500" -"2019/05/25 04:32:34.000" "2019/05/25 04:32:34.500" -"2019/05/25 04:32:35.000" "2019/05/25 04:32:35.500" -"2019/05/25 04:32:37.000" "2019/05/25 04:32:37.500" -"2019/05/25 04:32:38.000" "2019/05/25 04:32:38.500" -"2019/05/25 04:32:39.000" "2019/05/25 04:32:39.500" -"2019/05/25 04:32:40.000" "2019/05/25 04:32:40.500" -"2019/05/25 04:32:41.000" "2019/05/25 04:32:41.500" -"2019/05/25 04:32:42.000" "2019/05/25 04:32:42.500" -"2019/05/25 04:32:43.000" "2019/05/25 04:32:43.500" -"2019/05/25 04:32:44.000" "2019/05/25 04:32:44.500" -"2019/05/25 04:32:45.000" "2019/05/25 04:32:45.500" -"2019/05/25 04:32:46.000" "2019/05/25 04:32:46.500" -"2019/05/25 04:32:47.000" "2019/05/25 04:32:47.500" -"2019/05/25 04:32:48.000" "2019/05/25 04:32:48.500" -"2019/05/25 04:32:49.000" "2019/05/25 04:32:49.500" -"2019/05/25 04:32:50.000" "2019/05/25 04:32:50.500" -"2019/05/25 04:32:51.000" "2019/05/25 04:32:51.500" -"2019/05/25 04:32:52.000" "2019/05/25 04:32:52.500" -"2019/05/25 04:32:53.000" "2019/05/25 04:32:53.500" -"2019/05/25 04:32:54.000" "2019/05/25 04:32:54.500" -"2019/05/25 04:32:55.000" "2019/05/25 04:32:55.500" -"2019/05/25 04:32:56.000" "2019/05/25 04:32:56.500" -"2019/05/25 04:32:57.000" "2019/05/25 04:32:57.500" -"2019/05/25 04:32:58.000" "2019/05/25 04:32:58.500" -"2019/05/25 04:32:59.000" "2019/05/25 04:32:59.500" -"2019/05/25 04:33:00.000" "2019/05/25 04:33:00.500" -"2019/05/25 04:33:01.000" "2019/05/25 04:33:01.500" -"2019/05/25 04:33:02.000" "2019/05/25 04:33:02.500" -"2019/05/25 04:33:03.000" "2019/05/25 04:33:03.500" -"2019/05/25 04:33:04.000" "2019/05/25 04:33:04.500" -"2019/05/25 04:33:05.000" "2019/05/25 04:33:05.500" -"2019/05/25 04:33:06.000" "2019/05/25 04:33:06.500" -"2019/05/25 04:33:07.000" "2019/05/25 04:33:07.500" -"2019/05/25 04:33:08.000" "2019/05/25 04:33:08.500" -"2019/05/25 04:33:09.000" "2019/05/25 04:33:09.500" -"2019/05/25 04:33:10.000" "2019/05/25 04:33:10.500" -"2019/05/25 04:33:11.000" "2019/05/25 04:33:11.500" -"2019/05/25 04:33:12.000" "2019/05/25 04:33:12.500" -"2019/05/25 04:33:13.000" "2019/05/25 04:33:13.500" -"2019/05/25 04:33:14.000" "2019/05/25 04:33:14.500" -"2019/05/25 04:33:15.000" "2019/05/25 04:33:15.500" -"2019/05/25 04:33:16.000" "2019/05/25 04:33:16.500" -"2019/05/25 04:33:17.000" "2019/05/25 04:33:17.500" -"2019/05/25 04:33:18.000" "2019/05/25 04:33:18.500" -"2019/05/25 04:33:19.000" "2019/05/25 04:33:19.500" -"2019/05/25 04:33:20.000" "2019/05/25 04:33:20.500" -"2019/05/25 04:33:21.000" "2019/05/25 04:33:21.500" -"2019/05/25 04:33:22.000" "2019/05/25 04:33:22.500" -"2019/05/25 04:33:23.000" "2019/05/25 04:33:23.500" -"2019/05/25 04:33:24.000" "2019/05/25 04:33:24.500" -"2019/05/25 04:33:25.000" "2019/05/25 04:33:25.500" -"2019/05/25 04:33:26.000" "2019/05/25 04:33:26.500" -"2019/05/25 04:33:27.000" "2019/05/25 04:33:27.500" -"2019/05/25 04:33:28.000" "2019/05/25 04:33:28.500" -"2019/05/25 04:33:29.000" "2019/05/25 04:33:29.500" -"2019/05/25 04:33:30.000" "2019/05/25 04:33:30.500" -"2019/05/25 04:33:31.000" "2019/05/25 04:33:31.500" -"2019/05/25 04:33:32.000" "2019/05/25 04:33:32.500" -"2019/05/25 04:33:33.000" "2019/05/25 04:33:33.500" -"2019/05/25 04:33:34.000" "2019/05/25 04:33:34.500" -"2019/05/25 04:33:35.000" "2019/05/25 04:33:35.500" -"2019/05/25 04:33:36.000" "2019/05/25 04:33:36.500" -"2019/05/25 04:33:37.000" "2019/05/25 04:33:37.500" -"2019/05/25 04:33:38.000" "2019/05/25 04:33:38.500" -"2019/05/25 04:33:39.000" "2019/05/25 04:33:39.500" -"2019/05/25 04:33:40.000" "2019/05/25 04:33:40.500" -"2019/05/25 04:33:41.000" "2019/05/25 04:33:41.500" -"2019/05/25 04:33:42.000" "2019/05/25 04:33:42.500" -"2019/05/25 04:33:43.000" "2019/05/25 04:33:43.500" -"2019/05/25 04:33:44.000" "2019/05/25 04:33:44.500" -"2019/05/25 04:33:45.000" "2019/05/25 04:33:45.500" -"2019/05/25 04:33:46.000" "2019/05/25 04:33:46.500" -"2019/05/25 04:33:47.000" "2019/05/25 04:33:47.500" -"2019/05/25 04:33:48.000" "2019/05/25 04:33:48.500" -"2019/05/25 04:33:49.000" "2019/05/25 04:33:49.500" -"2019/05/25 04:33:50.000" "2019/05/25 04:33:50.500" -"2019/05/25 04:33:51.000" "2019/05/25 04:33:51.500" -"2019/05/25 04:33:52.000" "2019/05/25 04:33:52.500" -"2019/05/25 04:33:53.000" "2019/05/25 04:33:53.500" -"2019/05/25 04:33:54.000" "2019/05/25 04:33:54.500" -"2019/05/25 04:33:55.000" "2019/05/25 04:33:55.500" -"2019/05/25 04:33:56.000" "2019/05/25 04:33:56.500" -"2019/05/25 04:33:57.000" "2019/05/25 04:33:57.500" -"2019/05/25 04:33:58.000" "2019/05/25 04:33:58.500" -"2019/05/25 04:33:59.000" "2019/05/25 04:33:59.500" -"2019/05/25 04:34:00.000" "2019/05/25 04:34:00.500" -"2019/05/25 04:34:01.000" "2019/05/25 04:34:01.500" -"2019/05/25 04:34:02.000" "2019/05/25 04:34:02.500" -"2019/05/25 04:34:03.000" "2019/05/25 04:34:03.500" -"2019/05/25 04:34:04.000" "2019/05/25 04:34:04.500" -"2019/05/25 04:34:05.000" "2019/05/25 04:34:05.500" -"2019/05/25 04:34:06.000" "2019/05/25 04:34:06.500" -"2019/05/25 04:34:07.000" "2019/05/25 04:34:07.500" -"2019/05/25 04:34:08.000" "2019/05/25 04:34:08.500" -"2019/05/25 04:34:09.000" "2019/05/25 04:34:09.500" -"2019/05/25 04:34:10.000" "2019/05/25 04:34:10.500" -"2019/05/25 04:34:11.000" "2019/05/25 04:34:11.500" -"2019/05/25 04:34:12.000" "2019/05/25 04:34:12.500" -"2019/05/25 04:34:14.000" "2019/05/25 04:34:14.500" -"2019/05/25 04:34:15.000" "2019/05/25 04:34:15.500" -"2019/05/25 04:34:16.000" "2019/05/25 04:34:16.500" -"2019/05/25 04:34:17.000" "2019/05/25 04:34:17.500" -"2019/05/25 04:34:18.000" "2019/05/25 04:34:18.500" -"2019/05/25 04:34:19.000" "2019/05/25 04:34:19.500" -"2019/05/25 04:34:20.000" "2019/05/25 04:34:20.500" -"2019/05/25 04:34:21.000" "2019/05/25 04:34:21.500" -"2019/05/25 04:34:22.000" "2019/05/25 04:34:22.500" -"2019/05/25 04:34:23.000" "2019/05/25 04:34:23.500" -"2019/05/25 04:34:24.000" "2019/05/25 04:34:24.500" -"2019/05/25 04:34:25.000" "2019/05/25 04:34:25.500" -"2019/05/25 04:34:26.000" "2019/05/25 04:34:26.500" -"2019/05/25 04:34:27.000" "2019/05/25 04:34:27.500" -"2019/05/25 04:34:28.000" "2019/05/25 04:34:28.500" -"2019/05/25 04:34:29.000" "2019/05/25 04:34:29.500" -"2019/05/25 04:34:30.000" "2019/05/25 04:34:30.500" -"2019/05/25 04:34:31.000" "2019/05/25 04:34:31.500" -"2019/05/25 04:34:32.000" "2019/05/25 04:34:32.500" -"2019/05/25 04:34:33.000" "2019/05/25 04:34:33.500" -"2019/05/25 04:34:34.000" "2019/05/25 04:34:34.500" -"2019/05/25 04:34:35.000" "2019/05/25 04:34:35.500" -"2019/05/25 04:34:36.000" "2019/05/25 04:34:36.500" -"2019/05/25 04:34:37.000" "2019/05/25 04:34:37.500" -"2019/05/25 04:34:38.000" "2019/05/25 04:34:38.500" -"2019/05/25 04:34:39.000" "2019/05/25 04:34:39.500" -"2019/05/25 04:34:40.000" "2019/05/25 04:34:40.500" -"2019/05/25 04:34:41.000" "2019/05/25 04:34:41.500" -"2019/05/25 04:34:42.000" "2019/05/25 04:34:42.500" -"2019/05/25 04:34:43.000" "2019/05/25 04:34:43.500" -"2019/05/25 04:34:45.000" "2019/05/25 04:34:45.500" -"2019/05/25 04:34:46.000" "2019/05/25 04:34:46.500" -"2019/05/25 04:34:47.000" "2019/05/25 04:34:47.500" -"2019/05/25 04:34:48.000" "2019/05/25 04:34:48.500" -"2019/05/25 04:34:49.000" "2019/05/25 04:34:49.500" -"2019/05/25 04:34:50.000" "2019/05/25 04:34:50.500" -"2019/05/25 04:34:51.000" "2019/05/25 04:34:51.500" -"2019/05/25 04:34:52.000" "2019/05/25 04:34:52.500" -"2019/05/25 04:34:53.000" "2019/05/25 04:34:53.500" -"2019/05/25 04:34:54.000" "2019/05/25 04:34:54.500" -"2019/05/25 04:34:55.000" "2019/05/25 04:34:55.500" -"2019/05/25 04:34:56.000" "2019/05/25 04:34:56.500" -"2019/05/25 04:34:57.000" "2019/05/25 04:34:57.500" -"2019/05/25 04:34:58.000" "2019/05/25 04:34:58.500" -"2019/05/25 04:34:59.000" "2019/05/25 04:34:59.500" -"2019/05/25 04:35:00.000" "2019/05/25 04:35:00.500" -"2019/05/25 04:35:01.000" "2019/05/25 04:35:01.500" -"2019/05/25 04:35:02.000" "2019/05/25 04:35:02.500" -"2019/05/25 04:35:03.000" "2019/05/25 04:35:03.500" -"2019/05/25 04:35:04.000" "2019/05/25 04:35:04.500" -"2019/05/25 04:35:05.000" "2019/05/25 04:35:05.500" -"2019/05/25 04:35:06.000" "2019/05/25 04:35:06.500" -"2019/05/25 04:35:07.000" "2019/05/25 04:35:07.500" -"2019/05/25 04:35:08.000" "2019/05/25 04:35:08.500" -"2019/05/25 04:35:09.000" "2019/05/25 04:35:09.500" -"2019/05/25 04:35:10.000" "2019/05/25 04:35:10.500" -"2019/05/25 04:35:11.000" "2019/05/25 04:35:11.500" -"2019/05/25 04:35:12.000" "2019/05/25 04:35:12.500" -"2019/05/25 04:35:13.000" "2019/05/25 04:35:13.500" -"2019/05/25 04:35:14.000" "2019/05/25 04:35:14.500" -"2019/05/25 04:35:15.000" "2019/05/25 04:35:15.500" -"2019/05/25 04:35:16.000" "2019/05/25 04:35:16.500" -"2019/05/25 04:35:17.000" "2019/05/25 04:35:17.500" -"2019/05/25 04:35:18.000" "2019/05/25 04:35:18.500" -"2019/05/25 04:35:19.000" "2019/05/25 04:35:19.500" -"2019/05/25 04:35:20.000" "2019/05/25 04:35:20.500" -"2019/05/25 04:35:21.000" "2019/05/25 04:35:21.500" -"2019/05/25 04:35:22.000" "2019/05/25 04:35:22.500" -"2019/05/25 04:35:23.000" "2019/05/25 04:35:23.500" -"2019/05/25 04:35:24.000" "2019/05/25 04:35:24.500" -"2019/05/25 04:35:25.000" "2019/05/25 04:35:25.500" -"2019/05/25 04:35:26.000" "2019/05/25 04:35:26.500" -"2019/05/25 04:35:27.000" "2019/05/25 04:35:27.500" -"2019/05/25 04:35:28.000" "2019/05/25 04:35:28.500" -"2019/05/25 04:35:29.000" "2019/05/25 04:35:29.500" -"2019/05/25 04:35:30.000" "2019/05/25 04:35:30.500" -"2019/05/25 04:35:31.000" "2019/05/25 04:35:31.500" -"2019/05/25 04:35:32.000" "2019/05/25 04:35:32.500" -"2019/05/25 04:35:33.000" "2019/05/25 04:35:33.500" -"2019/05/25 04:35:34.000" "2019/05/25 04:35:34.500" -"2019/05/25 04:35:35.000" "2019/05/25 04:35:35.500" -"2019/05/25 04:35:36.000" "2019/05/25 04:35:36.500" -"2019/05/25 04:35:37.000" "2019/05/25 04:35:37.500" -"2019/05/25 04:35:38.000" "2019/05/25 04:35:38.500" -"2019/05/25 04:35:39.000" "2019/05/25 04:35:39.500" -"2019/05/25 04:35:40.000" "2019/05/25 04:35:40.500" -"2019/05/25 04:35:41.000" "2019/05/25 04:35:41.500" -"2019/05/25 04:35:42.000" "2019/05/25 04:35:42.500" -"2019/05/25 04:35:43.000" "2019/05/25 04:35:43.500" -"2019/05/25 04:35:44.000" "2019/05/25 04:35:44.500" -"2019/05/25 04:35:45.000" "2019/05/25 04:35:45.500" -"2019/05/25 04:35:46.000" "2019/05/25 04:35:46.500" -"2019/05/25 04:35:47.000" "2019/05/25 04:35:47.500" -"2019/05/25 04:35:48.000" "2019/05/25 04:35:48.500" -"2019/05/25 04:35:49.000" "2019/05/25 04:35:49.500" -"2019/05/25 04:35:50.000" "2019/05/25 04:35:50.500" -"2019/05/25 04:35:51.000" "2019/05/25 04:35:51.500" -"2019/05/25 04:35:52.000" "2019/05/25 04:35:52.500" -"2019/05/25 04:35:53.000" "2019/05/25 04:35:53.500" -"2019/05/25 04:35:54.000" "2019/05/25 04:35:54.500" -"2019/05/25 04:35:55.000" "2019/05/25 04:35:55.500" -"2019/05/25 04:35:56.000" "2019/05/25 04:35:56.500" -"2019/05/25 04:35:57.000" "2019/05/25 04:35:57.500" -"2019/05/25 04:35:58.000" "2019/05/25 04:35:58.500" -"2019/05/25 04:35:59.000" "2019/05/25 04:35:59.500" -"2019/05/25 04:36:00.000" "2019/05/25 04:36:00.500" -"2019/05/25 04:36:01.000" "2019/05/25 04:36:01.500" -"2019/05/25 04:36:02.000" "2019/05/25 04:36:02.500" -"2019/05/25 04:36:03.000" "2019/05/25 04:36:03.500" -"2019/05/25 04:36:04.000" "2019/05/25 04:36:04.500" -"2019/05/25 04:36:05.000" "2019/05/25 04:36:05.500" -"2019/05/25 04:36:06.000" "2019/05/25 04:36:06.500" -"2019/05/25 04:36:07.000" "2019/05/25 04:36:07.500" -"2019/05/25 04:36:08.000" "2019/05/25 04:36:08.500" -"2019/05/25 04:36:09.000" "2019/05/25 04:36:09.500" -"2019/05/25 04:36:10.000" "2019/05/25 04:36:10.500" -"2019/05/25 04:36:12.000" "2019/05/25 04:36:12.500" -"2019/05/25 04:36:13.000" "2019/05/25 04:36:13.500" -"2019/05/25 04:36:14.000" "2019/05/25 04:36:14.500" -"2019/05/25 04:36:15.000" "2019/05/25 04:36:15.500" -"2019/05/25 04:36:16.000" "2019/05/25 04:36:16.500" -"2019/05/25 04:36:17.000" "2019/05/25 04:36:17.500" -"2019/05/25 04:36:18.000" "2019/05/25 04:36:18.500" -"2019/05/25 04:36:19.000" "2019/05/25 04:36:19.500" -"2019/05/25 04:36:20.000" "2019/05/25 04:36:20.500" -"2019/05/25 04:36:21.000" "2019/05/25 04:36:21.500" -"2019/05/25 04:36:22.000" "2019/05/25 04:36:22.500" -"2019/05/25 04:36:23.000" "2019/05/25 04:36:23.500" -"2019/05/25 04:36:24.000" "2019/05/25 04:36:24.500" -"2019/05/25 04:36:25.000" "2019/05/25 04:36:25.500" -"2019/05/25 04:36:26.000" "2019/05/25 04:36:26.500" -"2019/05/25 04:36:27.000" "2019/05/25 04:36:27.500" -"2019/05/25 04:36:28.000" "2019/05/25 04:36:28.500" -"2019/05/25 04:36:29.000" "2019/05/25 04:36:29.500" -"2019/05/25 04:36:30.000" "2019/05/25 04:36:30.500" -"2019/05/25 04:36:31.000" "2019/05/25 04:36:31.500" -"2019/05/25 04:36:32.000" "2019/05/25 04:36:32.500" -"2019/05/25 04:36:33.000" "2019/05/25 04:36:33.500" -"2019/05/25 04:36:34.000" "2019/05/25 04:36:34.500" -"2019/05/25 04:36:35.000" "2019/05/25 04:36:35.500" -"2019/05/25 04:36:36.000" "2019/05/25 04:36:36.500" -"2019/05/25 04:36:37.000" "2019/05/25 04:36:37.500" -"2019/05/25 04:36:38.000" "2019/05/25 04:36:38.500" -"2019/05/25 04:36:39.000" "2019/05/25 04:36:39.500" -"2019/05/25 04:36:40.000" "2019/05/25 04:36:40.500" -"2019/05/25 04:36:41.000" "2019/05/25 04:36:41.500" -"2019/05/25 04:36:42.000" "2019/05/25 04:36:42.500" -"2019/05/25 04:36:43.000" "2019/05/25 04:36:43.500" -"2019/05/25 04:36:44.000" "2019/05/25 04:36:44.500" -"2019/05/25 04:36:45.000" "2019/05/25 04:36:45.500" -"2019/05/25 04:36:46.000" "2019/05/25 04:36:46.500" -"2019/05/25 04:36:47.000" "2019/05/25 04:36:47.500" -"2019/05/25 04:36:48.000" "2019/05/25 04:36:48.500" -"2019/05/25 04:36:49.000" "2019/05/25 04:36:49.500" -"2019/05/25 04:36:50.000" "2019/05/25 04:36:50.500" -"2019/05/25 04:36:52.000" "2019/05/25 04:36:52.500" -"2019/05/25 04:36:53.000" "2019/05/25 04:36:53.500" -"2019/05/25 04:36:54.000" "2019/05/25 04:36:54.500" -"2019/05/25 04:36:55.000" "2019/05/25 04:36:55.500" -"2019/05/25 04:36:56.000" "2019/05/25 04:36:56.500" -"2019/05/25 04:36:57.000" "2019/05/25 04:36:57.500" -"2019/05/25 04:36:58.000" "2019/05/25 04:36:58.500" -"2019/05/25 04:36:59.000" "2019/05/25 04:36:59.500" -"2019/05/25 04:37:00.000" "2019/05/25 04:37:00.500" -"2019/05/25 04:37:01.000" "2019/05/25 04:37:01.500" -"2019/05/25 04:37:02.000" "2019/05/25 04:37:02.500" -"2019/05/25 04:37:03.000" "2019/05/25 04:37:03.500" -"2019/05/25 04:37:04.000" "2019/05/25 04:37:04.500" -"2019/05/25 04:37:05.000" "2019/05/25 04:37:05.500" -"2019/05/25 04:37:06.000" "2019/05/25 04:37:06.500" -"2019/05/25 04:37:07.000" "2019/05/25 04:37:07.500" -"2019/05/25 04:37:08.000" "2019/05/25 04:37:08.500" -"2019/05/25 04:37:09.000" "2019/05/25 04:37:09.500" -"2019/05/25 04:37:10.000" "2019/05/25 04:37:10.500" -"2019/05/25 04:37:11.000" "2019/05/25 04:37:11.500" -"2019/05/25 04:37:12.000" "2019/05/25 04:37:12.500" -"2019/05/25 04:37:13.000" "2019/05/25 04:37:13.500" -"2019/05/25 04:37:14.000" "2019/05/25 04:37:14.500" -"2019/05/25 04:37:15.000" "2019/05/25 04:37:15.500" -"2019/05/25 04:37:16.000" "2019/05/25 04:37:16.500" -"2019/05/25 04:37:17.000" "2019/05/25 04:37:17.500" -"2019/05/25 04:37:18.000" "2019/05/25 04:37:18.500" -"2019/05/25 04:37:19.000" "2019/05/25 04:37:19.500" -"2019/05/25 04:37:20.000" "2019/05/25 04:37:20.500" -"2019/05/25 04:37:21.000" "2019/05/25 04:37:21.500" -"2019/05/25 04:37:22.000" "2019/05/25 04:37:22.500" -"2019/05/25 04:37:23.000" "2019/05/25 04:37:23.500" -"2019/05/25 04:37:24.000" "2019/05/25 04:37:24.500" -"2019/05/25 04:37:25.000" "2019/05/25 04:37:25.500" -"2019/05/25 04:37:26.000" "2019/05/25 04:37:26.500" -"2019/05/25 04:37:27.000" "2019/05/25 04:37:27.500" -"2019/05/25 04:37:28.000" "2019/05/25 04:37:28.500" -"2019/05/25 04:37:29.000" "2019/05/25 04:37:29.500" -"2019/05/25 04:37:30.000" "2019/05/25 04:37:30.500" -"2019/05/25 04:37:31.000" "2019/05/25 04:37:31.500" -"2019/05/25 04:37:32.000" "2019/05/25 04:37:32.500" -"2019/05/25 04:37:33.000" "2019/05/25 04:37:33.500" -"2019/05/25 04:37:34.000" "2019/05/25 04:37:34.500" -"2019/05/25 04:37:35.000" "2019/05/25 04:37:35.500" -"2019/05/25 04:37:36.000" "2019/05/25 04:37:36.500" -"2019/05/25 04:37:37.000" "2019/05/25 04:37:37.500" -"2019/05/25 04:37:38.000" "2019/05/25 04:37:38.500" -"2019/05/25 04:37:39.000" "2019/05/25 04:37:39.500" -"2019/05/25 04:37:40.000" "2019/05/25 04:37:40.500" -"2019/05/25 04:37:41.000" "2019/05/25 04:37:41.500" -"2019/05/25 04:37:42.000" "2019/05/25 04:37:42.500" -"2019/05/25 04:37:43.000" "2019/05/25 04:37:43.500" -"2019/05/25 04:37:44.000" "2019/05/25 04:37:44.500" -"2019/05/25 04:37:45.000" "2019/05/25 04:37:45.500" -"2019/05/25 04:37:46.000" "2019/05/25 04:37:46.500" -"2019/05/25 04:37:47.000" "2019/05/25 04:37:47.500" -"2019/05/25 04:37:48.000" "2019/05/25 04:37:48.500" -"2019/05/25 04:37:49.000" "2019/05/25 04:37:49.500" -"2019/05/25 04:37:50.000" "2019/05/25 04:37:50.500" -"2019/05/25 04:37:51.000" "2019/05/25 04:37:51.500" -"2019/05/25 04:37:52.000" "2019/05/25 04:37:52.500" -"2019/05/25 04:37:53.000" "2019/05/25 04:37:53.500" -"2019/05/25 04:37:54.000" "2019/05/25 04:37:54.500" -"2019/05/25 04:37:55.000" "2019/05/25 04:37:55.500" -"2019/05/25 04:37:56.000" "2019/05/25 04:37:56.500" -"2019/05/25 04:37:57.000" "2019/05/25 04:37:57.500" -"2019/05/25 04:37:58.000" "2019/05/25 04:37:58.500" -"2019/05/25 04:37:59.000" "2019/05/25 04:37:59.500" -"2019/05/25 04:38:00.000" "2019/05/25 04:38:00.500" -"2019/05/25 04:38:01.000" "2019/05/25 04:38:01.500" -"2019/05/25 04:38:02.000" "2019/05/25 04:38:02.500" -"2019/05/25 04:38:03.000" "2019/05/25 04:38:03.500" -"2019/05/25 04:38:04.000" "2019/05/25 04:38:04.500" -"2019/05/25 04:38:05.000" "2019/05/25 04:38:05.500" -"2019/05/25 04:38:06.000" "2019/05/25 04:38:06.500" -"2019/05/25 04:38:07.000" "2019/05/25 04:38:07.500" -"2019/05/25 04:38:08.000" "2019/05/25 04:38:08.500" -"2019/05/25 04:38:09.000" "2019/05/25 04:38:09.500" -"2019/05/25 04:38:10.000" "2019/05/25 04:38:10.500" -"2019/05/25 04:38:11.000" "2019/05/25 04:38:11.500" -"2019/05/25 04:38:12.000" "2019/05/25 04:38:12.500" -"2019/05/25 04:38:13.000" "2019/05/25 04:38:13.500" -"2019/05/25 04:38:14.000" "2019/05/25 04:38:14.500" -"2019/05/25 04:38:16.000" "2019/05/25 04:38:16.500" -"2019/05/25 04:38:17.000" "2019/05/25 04:38:17.500" -"2019/05/25 04:38:18.000" "2019/05/25 04:38:18.500" -"2019/05/25 04:38:19.000" "2019/05/25 04:38:19.500" -"2019/05/25 04:38:20.000" "2019/05/25 04:38:20.500" -"2019/05/25 04:38:21.000" "2019/05/25 04:38:21.500" -"2019/05/25 04:38:22.000" "2019/05/25 04:38:22.500" -"2019/05/25 04:38:23.000" "2019/05/25 04:38:23.500" -"2019/05/25 04:38:24.000" "2019/05/25 04:38:24.500" -"2019/05/25 04:38:25.000" "2019/05/25 04:38:25.500" -"2019/05/25 04:38:26.000" "2019/05/25 04:38:26.500" -"2019/05/25 04:38:27.000" "2019/05/25 04:38:27.500" -"2019/05/25 04:38:28.000" "2019/05/25 04:38:28.500" -"2019/05/25 04:38:29.000" "2019/05/25 04:38:29.500" -"2019/05/25 04:38:30.000" "2019/05/25 04:38:30.500" -"2019/05/25 04:38:31.000" "2019/05/25 04:38:31.500" -"2019/05/25 04:38:32.000" "2019/05/25 04:38:32.500" -"2019/05/25 04:38:33.000" "2019/05/25 04:38:33.500" -"2019/05/25 04:38:34.000" "2019/05/25 04:38:34.500" -"2019/05/25 04:38:35.000" "2019/05/25 04:38:35.500" -"2019/05/25 04:38:36.000" "2019/05/25 04:38:36.500" -"2019/05/25 04:38:37.000" "2019/05/25 04:38:37.500" -"2019/05/25 04:38:38.000" "2019/05/25 04:38:38.500" -"2019/05/25 04:38:39.000" "2019/05/25 04:38:39.500" -"2019/05/25 04:38:40.000" "2019/05/25 04:38:40.500" -"2019/05/25 04:38:41.000" "2019/05/25 04:38:41.500" -"2019/05/25 04:38:42.000" "2019/05/25 04:38:42.500" -"2019/05/25 04:38:43.000" "2019/05/25 04:38:43.500" -"2019/05/25 04:38:44.000" "2019/05/25 04:38:44.500" -"2019/05/25 04:38:45.000" "2019/05/25 04:38:45.500" -"2019/05/25 04:38:47.000" "2019/05/25 04:38:47.500" -"2019/05/25 04:38:48.000" "2019/05/25 04:38:48.500" -"2019/05/25 04:38:49.000" "2019/05/25 04:38:49.500" -"2019/05/25 04:38:50.000" "2019/05/25 04:38:50.500" -"2019/05/25 04:38:51.000" "2019/05/25 04:38:51.500" -"2019/05/25 04:38:52.000" "2019/05/25 04:38:52.500" -"2019/05/25 04:38:53.000" "2019/05/25 04:38:53.500" -"2019/05/25 04:38:54.000" "2019/05/25 04:38:54.500" -"2019/05/25 04:38:55.000" "2019/05/25 04:38:55.500" -"2019/05/25 04:38:56.000" "2019/05/25 04:38:56.500" -"2019/05/25 04:38:57.000" "2019/05/25 04:38:57.500" -"2019/05/25 04:38:58.000" "2019/05/25 04:38:58.500" -"2019/05/25 04:38:59.000" "2019/05/25 04:38:59.500" -"2019/05/25 04:39:00.000" "2019/05/25 04:39:00.500" -"2019/05/25 04:39:01.000" "2019/05/25 04:39:01.500" -"2019/05/25 04:39:02.000" "2019/05/25 04:39:02.500" -"2019/05/25 04:39:03.000" "2019/05/25 04:39:03.500" -"2019/05/25 04:39:04.000" "2019/05/25 04:39:04.500" -"2019/05/25 04:39:05.000" "2019/05/25 04:39:05.500" -"2019/05/25 04:39:06.000" "2019/05/25 04:39:06.500" -"2019/05/25 04:39:07.000" "2019/05/25 04:39:07.500" -"2019/05/25 04:39:08.000" "2019/05/25 04:39:08.500" -"2019/05/25 04:39:09.000" "2019/05/25 04:39:09.500" -"2019/05/25 04:39:10.000" "2019/05/25 04:39:10.500" -"2019/05/25 04:39:11.000" "2019/05/25 04:39:11.500" -"2019/05/25 04:39:12.000" "2019/05/25 04:39:12.500" -"2019/05/25 04:39:13.000" "2019/05/25 04:39:13.500" -"2019/05/25 04:39:14.000" "2019/05/25 04:39:14.500" -"2019/05/25 04:39:15.000" "2019/05/25 04:39:15.500" -"2019/05/25 04:39:16.000" "2019/05/25 04:39:16.500" -"2019/05/25 04:39:17.000" "2019/05/25 04:39:17.500" -"2019/05/25 04:39:18.000" "2019/05/25 04:39:18.500" -"2019/05/25 04:39:19.000" "2019/05/25 04:39:19.500" -"2019/05/25 04:39:20.000" "2019/05/25 04:39:20.500" -"2019/05/25 04:39:21.000" "2019/05/25 04:39:21.500" -"2019/05/25 04:39:22.000" "2019/05/25 04:39:22.500" -"2019/05/25 04:39:23.000" "2019/05/25 04:39:23.500" -"2019/05/25 04:39:24.000" "2019/05/25 04:39:24.500" -"2019/05/25 04:39:25.000" "2019/05/25 04:39:25.500" -"2019/05/25 04:39:26.000" "2019/05/25 04:39:26.500" -"2019/05/25 04:39:27.000" "2019/05/25 04:39:27.500" -"2019/05/25 04:39:28.000" "2019/05/25 04:39:28.500" -"2019/05/25 04:39:29.000" "2019/05/25 04:39:29.500" -"2019/05/25 04:39:30.000" "2019/05/25 04:39:30.500" -"2019/05/25 04:39:31.000" "2019/05/25 04:39:31.500" -"2019/05/25 04:39:32.000" "2019/05/25 04:39:32.500" -"2019/05/25 04:39:33.000" "2019/05/25 04:39:33.500" -"2019/05/25 04:39:34.000" "2019/05/25 04:39:34.500" -"2019/05/25 04:39:35.000" "2019/05/25 04:39:35.500" -"2019/05/25 04:39:36.000" "2019/05/25 04:39:36.500" -"2019/05/25 04:39:37.000" "2019/05/25 04:39:37.500" -"2019/05/25 04:39:38.000" "2019/05/25 04:39:38.500" -"2019/05/25 04:39:39.000" "2019/05/25 04:39:39.500" -"2019/05/25 04:39:40.000" "2019/05/25 04:39:40.500" -"2019/05/25 04:39:41.000" "2019/05/25 04:39:41.500" -"2019/05/25 04:39:42.000" "2019/05/25 04:39:42.500" -"2019/05/25 04:39:43.000" "2019/05/25 04:39:43.500" -"2019/05/25 04:39:44.000" "2019/05/25 04:39:44.500" -"2019/05/25 04:39:45.000" "2019/05/25 04:39:45.500" -"2019/05/25 04:39:46.000" "2019/05/25 04:39:46.500" -"2019/05/25 04:39:47.000" "2019/05/25 04:39:47.500" -"2019/05/25 04:39:48.000" "2019/05/25 04:39:48.500" -"2019/05/25 04:39:49.000" "2019/05/25 04:39:49.500" -"2019/05/25 04:39:50.000" "2019/05/25 04:39:50.500" -"2019/05/25 04:39:52.000" "2019/05/25 04:39:52.500" -"2019/05/25 04:39:53.000" "2019/05/25 04:39:53.500" -"2019/05/25 04:39:54.000" "2019/05/25 04:39:54.500" -"2019/05/25 04:39:55.000" "2019/05/25 04:39:55.500" -"2019/05/25 04:39:56.000" "2019/05/25 04:39:56.500" -"2019/05/25 04:39:57.000" "2019/05/25 04:39:57.500" -"2019/05/25 04:39:58.000" "2019/05/25 04:39:58.500" -"2019/05/25 04:39:59.000" "2019/05/25 04:39:59.500" -"2019/05/25 04:40:00.000" "2019/05/25 04:40:00.500" -"2019/05/25 04:40:01.000" "2019/05/25 04:40:01.500" -"2019/05/25 04:40:02.000" "2019/05/25 04:40:02.500" -"2019/05/25 04:40:03.000" "2019/05/25 04:40:03.500" -"2019/05/25 04:40:04.000" "2019/05/25 04:40:04.500" -"2019/05/25 04:40:05.000" "2019/05/25 04:40:05.500" -"2019/05/25 04:40:06.000" "2019/05/25 04:40:06.500" -"2019/05/25 04:40:07.000" "2019/05/25 04:40:07.500" -"2019/05/25 04:40:08.000" "2019/05/25 04:40:08.500" -"2019/05/25 04:40:09.000" "2019/05/25 04:40:09.500" -"2019/05/25 04:40:10.000" "2019/05/25 04:40:10.500" -"2019/05/25 04:40:11.000" "2019/05/25 04:40:11.500" -"2019/05/25 04:40:12.000" "2019/05/25 04:40:12.500" -"2019/05/25 04:40:13.000" "2019/05/25 04:40:13.500" -"2019/05/25 04:40:14.000" "2019/05/25 04:40:14.500" -"2019/05/25 04:40:15.000" "2019/05/25 04:40:15.500" -"2019/05/25 04:40:16.000" "2019/05/25 04:40:16.500" -"2019/05/25 04:40:17.000" "2019/05/25 04:40:17.500" -"2019/05/25 04:40:18.000" "2019/05/25 04:40:18.500" -"2019/05/25 04:40:19.000" "2019/05/25 04:40:19.500" -"2019/05/25 04:40:20.000" "2019/05/25 04:40:20.500" -"2019/05/25 04:40:21.000" "2019/05/25 04:40:21.500" -"2019/05/25 04:40:22.000" "2019/05/25 04:40:22.500" -"2019/05/25 04:40:23.000" "2019/05/25 04:40:23.500" -"2019/05/25 04:40:24.000" "2019/05/25 04:40:24.500" -"2019/05/25 04:40:25.000" "2019/05/25 04:40:25.500" -"2019/05/25 04:40:26.000" "2019/05/25 04:40:26.500" -"2019/05/25 04:40:27.000" "2019/05/25 04:40:27.500" -"2019/05/25 04:40:28.000" "2019/05/25 04:40:28.500" -"2019/05/25 04:40:29.000" "2019/05/25 04:40:29.500" -"2019/05/25 04:40:30.000" "2019/05/25 04:40:30.500" -"2019/05/25 04:40:31.000" "2019/05/25 04:40:31.500" -"2019/05/25 04:40:32.000" "2019/05/25 04:40:32.500" -"2019/05/25 04:40:33.000" "2019/05/25 04:40:33.500" -"2019/05/25 04:40:34.000" "2019/05/25 04:40:34.500" -"2019/05/25 04:40:35.000" "2019/05/25 04:40:35.500" -"2019/05/25 04:40:36.000" "2019/05/25 04:40:36.500" -"2019/05/25 04:40:37.000" "2019/05/25 04:40:37.500" -"2019/05/25 04:40:38.000" "2019/05/25 04:40:38.500" -"2019/05/25 04:40:39.000" "2019/05/25 04:40:39.500" -"2019/05/25 04:40:40.000" "2019/05/25 04:40:40.500" -"2019/05/25 04:40:41.000" "2019/05/25 04:40:41.500" -"2019/05/25 04:40:42.000" "2019/05/25 04:40:42.500" -"2019/05/25 04:40:43.000" "2019/05/25 04:40:43.500" -"2019/05/25 04:40:44.000" "2019/05/25 04:40:44.500" -"2019/05/25 04:40:45.000" "2019/05/25 04:40:45.500" -"2019/05/25 04:40:46.000" "2019/05/25 04:40:46.500" -"2019/05/25 04:40:47.000" "2019/05/25 04:40:47.500" -"2019/05/25 04:40:48.000" "2019/05/25 04:40:48.500" -"2019/05/25 04:40:49.000" "2019/05/25 04:40:49.500" -"2019/05/25 04:40:50.000" "2019/05/25 04:40:50.500" -"2019/05/25 04:40:51.000" "2019/05/25 04:40:51.500" -"2019/05/25 04:40:52.000" "2019/05/25 04:40:52.500" -"2019/05/25 04:40:53.000" "2019/05/25 04:40:53.500" -"2019/05/25 04:40:54.000" "2019/05/25 04:40:54.500" -"2019/05/25 04:40:55.000" "2019/05/25 04:40:55.500" -"2019/05/25 04:40:56.000" "2019/05/25 04:40:56.500" -"2019/05/25 04:40:57.000" "2019/05/25 04:40:57.500" -"2019/05/25 04:40:58.000" "2019/05/25 04:40:58.500" -"2019/05/25 04:40:59.000" "2019/05/25 04:40:59.500" -"2019/05/25 04:41:00.000" "2019/05/25 04:41:00.500" -"2019/05/25 04:41:01.000" "2019/05/25 04:41:01.500" -"2019/05/25 04:41:02.000" "2019/05/25 04:41:02.500" -"2019/05/25 04:41:03.000" "2019/05/25 04:41:03.500" -"2019/05/25 04:41:04.000" "2019/05/25 04:41:04.500" -"2019/05/25 04:41:05.000" "2019/05/25 04:41:05.500" -"2019/05/25 04:41:06.000" "2019/05/25 04:41:06.500" -"2019/05/25 04:41:07.000" "2019/05/25 04:41:07.500" -"2019/05/25 04:41:08.000" "2019/05/25 04:41:08.500" -"2019/05/25 04:41:09.000" "2019/05/25 04:41:09.500" -"2019/05/25 04:41:10.000" "2019/05/25 04:41:10.500" -"2019/05/25 04:41:11.000" "2019/05/25 04:41:11.500" -"2019/05/25 04:41:12.000" "2019/05/25 04:41:12.500" -"2019/05/25 04:41:13.000" "2019/05/25 04:41:13.500" -"2019/05/25 04:41:14.000" "2019/05/25 04:41:14.500" -"2019/05/25 04:41:15.000" "2019/05/25 04:41:15.500" -"2019/05/25 04:41:16.000" "2019/05/25 04:41:16.500" -"2019/05/25 04:41:17.000" "2019/05/25 04:41:17.500" -"2019/05/25 04:41:18.000" "2019/05/25 04:41:18.500" -"2019/05/25 04:41:19.000" "2019/05/25 04:41:19.500" -"2019/05/25 04:41:20.000" "2019/05/25 04:41:20.500" -"2019/05/25 04:41:21.000" "2019/05/25 04:41:21.500" -"2019/05/25 04:41:22.000" "2019/05/25 04:41:22.500" -"2019/05/25 04:41:23.000" "2019/05/25 04:41:23.500" -"2019/05/25 04:41:24.000" "2019/05/25 04:41:24.500" -"2019/05/25 04:41:25.000" "2019/05/25 04:41:25.500" -"2019/05/25 04:41:26.000" "2019/05/25 04:41:26.500" -"2019/05/25 04:41:27.000" "2019/05/25 04:41:27.500" -"2019/05/25 04:41:28.000" "2019/05/25 04:41:28.500" -"2019/05/25 04:41:29.000" "2019/05/25 04:41:29.500" -"2019/05/25 04:41:30.000" "2019/05/25 04:41:30.500" -"2019/05/25 04:41:31.000" "2019/05/25 04:41:31.500" -"2019/05/25 04:41:32.000" "2019/05/25 04:41:32.500" -"2019/05/25 04:41:33.000" "2019/05/25 04:41:33.500" -"2019/05/25 04:41:34.000" "2019/05/25 04:41:34.500" -"2019/05/25 04:41:35.000" "2019/05/25 04:41:35.500" -"2019/05/25 04:41:36.000" "2019/05/25 04:41:36.500" -"2019/05/25 04:41:37.000" "2019/05/25 04:41:37.500" -"2019/05/25 04:41:38.000" "2019/05/25 04:41:38.500" -"2019/05/25 04:41:39.000" "2019/05/25 04:41:39.500" -"2019/05/25 04:41:40.000" "2019/05/25 04:41:40.500" -"2019/05/25 04:41:41.000" "2019/05/25 04:41:41.500" -"2019/05/25 04:41:42.000" "2019/05/25 04:41:42.500" -"2019/05/25 04:41:43.000" "2019/05/25 04:41:43.500" -"2019/05/25 04:41:44.000" "2019/05/25 04:41:44.500" -"2019/05/25 04:41:45.000" "2019/05/25 04:41:45.500" -"2019/05/25 04:41:46.000" "2019/05/25 04:41:46.500" -"2019/05/25 04:41:47.000" "2019/05/25 04:41:47.500" -"2019/05/25 04:41:48.000" "2019/05/25 04:41:48.500" -"2019/05/25 04:41:49.000" "2019/05/25 04:41:49.500" -"2019/05/25 04:41:50.000" "2019/05/25 04:41:50.500" -"2019/05/25 04:41:51.000" "2019/05/25 04:41:51.500" -"2019/05/25 04:41:52.000" "2019/05/25 04:41:52.500" -"2019/05/25 04:41:53.000" "2019/05/25 04:41:53.500" -"2019/05/25 04:41:54.000" "2019/05/25 04:41:54.500" -"2019/05/25 04:41:55.000" "2019/05/25 04:41:55.500" -"2019/05/25 04:41:56.000" "2019/05/25 04:41:56.500" -"2019/05/25 04:41:57.000" "2019/05/25 04:41:57.500" -"2019/05/25 04:41:58.000" "2019/05/25 04:41:58.500" -"2019/05/25 04:41:59.000" "2019/05/25 04:41:59.500" -"2019/05/25 04:42:00.000" "2019/05/25 04:42:00.500" -"2019/05/25 04:42:01.000" "2019/05/25 04:42:01.500" -"2019/05/25 04:42:02.000" "2019/05/25 04:42:02.500" -"2019/05/25 04:42:03.000" "2019/05/25 04:42:03.500" -"2019/05/25 04:42:04.000" "2019/05/25 04:42:04.500" -"2019/05/25 04:42:05.000" "2019/05/25 04:42:05.500" -"2019/05/25 04:42:06.000" "2019/05/25 04:42:06.500" -"2019/05/25 04:42:07.000" "2019/05/25 04:42:07.500" -"2019/05/25 04:42:08.000" "2019/05/25 04:42:08.500" -"2019/05/25 04:42:09.000" "2019/05/25 04:42:09.500" -"2019/05/25 04:42:10.000" "2019/05/25 04:42:10.500" -"2019/05/25 04:42:11.000" "2019/05/25 04:42:11.500" -"2019/05/25 04:42:12.000" "2019/05/25 04:42:12.500" -"2019/05/25 04:42:13.000" "2019/05/25 04:42:13.500" -"2019/05/25 04:42:14.000" "2019/05/25 04:42:14.500" -"2019/05/25 04:42:15.000" "2019/05/25 04:42:15.500" -"2019/05/25 04:42:16.000" "2019/05/25 04:42:16.500" -"2019/05/25 04:42:17.000" "2019/05/25 04:42:17.500" -"2019/05/25 04:42:18.000" "2019/05/25 04:42:18.500" -"2019/05/25 04:42:19.000" "2019/05/25 04:42:19.500" -"2019/05/25 04:42:20.000" "2019/05/25 04:42:20.500" -"2019/05/25 04:42:21.000" "2019/05/25 04:42:21.500" -"2019/05/25 04:42:22.000" "2019/05/25 04:42:22.500" -"2019/05/25 04:42:23.000" "2019/05/25 04:42:23.500" -"2019/05/25 04:42:24.000" "2019/05/25 04:42:24.500" -"2019/05/25 04:42:25.000" "2019/05/25 04:42:25.500" -"2019/05/25 04:42:26.000" "2019/05/25 04:42:26.500" -"2019/05/25 04:42:27.000" "2019/05/25 04:42:27.500" -"2019/05/25 04:42:28.000" "2019/05/25 04:42:28.500" -"2019/05/25 04:42:29.000" "2019/05/25 04:42:29.500" -"2019/05/25 04:42:30.000" "2019/05/25 04:42:30.500" -"2019/05/25 04:42:31.000" "2019/05/25 04:42:31.500" -"2019/05/25 04:42:32.000" "2019/05/25 04:42:32.500" -"2019/05/25 04:42:33.000" "2019/05/25 04:42:33.500" -"2019/05/25 04:42:34.000" "2019/05/25 04:42:34.500" -"2019/05/25 04:42:35.000" "2019/05/25 04:42:35.500" -"2019/05/25 04:42:36.000" "2019/05/25 04:42:36.500" -"2019/05/25 04:42:37.000" "2019/05/25 04:42:37.500" -"2019/05/25 04:42:38.000" "2019/05/25 04:42:38.500" -"2019/05/25 04:42:39.000" "2019/05/25 04:42:39.500" -"2019/05/25 04:42:40.000" "2019/05/25 04:42:40.500" -"2019/05/25 04:42:41.000" "2019/05/25 04:42:41.500" -"2019/05/25 04:42:42.000" "2019/05/25 04:42:42.500" -"2019/05/25 04:42:43.000" "2019/05/25 04:42:43.500" -"2019/05/25 04:42:44.000" "2019/05/25 04:42:44.500" -"2019/05/25 04:42:45.000" "2019/05/25 04:42:45.500" -"2019/05/25 04:42:46.000" "2019/05/25 04:42:46.500" -"2019/05/25 04:42:47.000" "2019/05/25 04:42:47.500" -"2019/05/25 04:42:48.000" "2019/05/25 04:42:48.500" -"2019/05/25 04:42:49.000" "2019/05/25 04:42:49.500" -"2019/05/25 04:42:50.000" "2019/05/25 04:42:50.500" -"2019/05/25 04:42:51.000" "2019/05/25 04:42:51.500" -"2019/05/25 04:42:52.000" "2019/05/25 04:42:52.500" -"2019/05/25 04:42:53.000" "2019/05/25 04:42:53.500" -"2019/05/25 04:42:54.000" "2019/05/25 04:42:54.500" -"2019/05/25 04:42:55.000" "2019/05/25 04:42:55.500" -"2019/05/25 04:42:56.000" "2019/05/25 04:42:56.500" -"2019/05/25 04:42:57.000" "2019/05/25 04:42:57.500" -"2019/05/25 04:42:58.000" "2019/05/25 04:42:58.500" -"2019/05/25 04:42:59.000" "2019/05/25 04:42:59.500" -"2019/05/25 04:43:00.000" "2019/05/25 04:43:00.500" -"2019/05/25 04:43:01.000" "2019/05/25 04:43:01.500" -"2019/05/25 04:43:02.000" "2019/05/25 04:43:02.500" -"2019/05/25 04:43:03.000" "2019/05/25 04:43:03.500" -"2019/05/25 04:43:04.000" "2019/05/25 04:43:04.500" -"2019/05/25 04:43:05.000" "2019/05/25 04:43:05.500" -"2019/05/25 04:43:06.000" "2019/05/25 04:43:06.500" -"2019/05/25 04:43:07.000" "2019/05/25 04:43:07.500" -"2019/05/25 04:43:08.000" "2019/05/25 04:43:08.500" -"2019/05/25 04:43:09.000" "2019/05/25 04:43:09.500" -"2019/05/25 04:43:10.000" "2019/05/25 04:43:10.500" -"2019/05/25 04:43:11.000" "2019/05/25 04:43:11.500" -"2019/05/25 04:43:12.000" "2019/05/25 04:43:12.500" -"2019/05/25 04:43:13.000" "2019/05/25 04:43:13.500" -"2019/05/25 04:43:14.000" "2019/05/25 04:43:14.500" -"2019/05/25 04:43:15.000" "2019/05/25 04:43:15.500" -"2019/05/25 04:43:16.000" "2019/05/25 04:43:16.500" -"2019/05/25 04:43:17.000" "2019/05/25 04:43:17.500" -"2019/05/25 04:43:18.000" "2019/05/25 04:43:18.500" -"2019/05/25 04:43:19.000" "2019/05/25 04:43:19.500" -"2019/05/25 04:43:20.000" "2019/05/25 04:43:20.500" -"2019/05/25 04:43:21.000" "2019/05/25 04:43:21.500" -"2019/05/25 04:43:22.000" "2019/05/25 04:43:22.500" -"2019/05/25 04:43:23.000" "2019/05/25 04:43:23.500" -"2019/05/25 04:43:24.000" "2019/05/25 04:43:24.500" -"2019/05/25 04:43:25.000" "2019/05/25 04:43:25.500" -"2019/05/25 04:43:26.000" "2019/05/25 04:43:26.500" -"2019/05/25 04:43:27.000" "2019/05/25 04:43:27.500" -"2019/05/25 04:43:28.000" "2019/05/25 04:43:28.500" -"2019/05/25 04:43:29.000" "2019/05/25 04:43:29.500" -"2019/05/25 04:43:30.000" "2019/05/25 04:43:30.500" -"2019/05/25 04:43:31.000" "2019/05/25 04:43:31.500" -"2019/05/25 04:43:32.000" "2019/05/25 04:43:32.500" -"2019/05/25 04:43:33.000" "2019/05/25 04:43:33.500" -"2019/05/25 04:43:34.000" "2019/05/25 04:43:34.500" -"2019/05/25 04:43:35.000" "2019/05/25 04:43:35.500" -"2019/05/25 04:43:36.000" "2019/05/25 04:43:36.500" -"2019/05/25 04:43:37.000" "2019/05/25 04:43:37.500" -"2019/05/25 04:43:38.000" "2019/05/25 04:43:38.500" -"2019/05/25 04:43:39.000" "2019/05/25 04:43:39.500" -"2019/05/25 04:43:40.000" "2019/05/25 04:43:40.500" -"2019/05/25 04:43:41.000" "2019/05/25 04:43:41.500" -"2019/05/25 04:43:42.000" "2019/05/25 04:43:42.500" -"2019/05/25 04:43:43.000" "2019/05/25 04:43:43.500" -"2019/05/25 04:43:44.000" "2019/05/25 04:43:44.500" -"2019/05/25 04:43:45.000" "2019/05/25 04:43:45.500" -"2019/05/25 04:43:46.000" "2019/05/25 04:43:46.500" -"2019/05/25 04:43:47.000" "2019/05/25 04:43:47.500" -"2019/05/25 04:43:48.000" "2019/05/25 04:43:48.500" -"2019/05/25 04:43:49.000" "2019/05/25 04:43:49.500" -"2019/05/25 04:43:50.000" "2019/05/25 04:43:50.500" -"2019/05/25 04:43:51.000" "2019/05/25 04:43:51.500" -"2019/05/25 04:43:52.000" "2019/05/25 04:43:52.500" -"2019/05/25 04:43:53.000" "2019/05/25 04:43:53.500" -"2019/05/25 04:43:54.000" "2019/05/25 04:43:54.500" -"2019/05/25 04:43:55.000" "2019/05/25 04:43:55.500" -"2019/05/25 04:43:56.000" "2019/05/25 04:43:56.500" -"2019/05/25 04:43:57.000" "2019/05/25 04:43:57.500" -"2019/05/25 04:43:58.000" "2019/05/25 04:43:58.500" -"2019/05/25 04:43:59.000" "2019/05/25 04:43:59.500" -"2019/05/25 04:44:00.000" "2019/05/25 04:44:00.500" -"2019/05/25 04:44:01.000" "2019/05/25 04:44:01.500" -"2019/05/25 04:44:02.000" "2019/05/25 04:44:02.500" -"2019/05/25 04:44:03.000" "2019/05/25 04:44:03.500" -"2019/05/25 04:44:04.000" "2019/05/25 04:44:04.500" -"2019/05/25 04:44:05.000" "2019/05/25 04:44:05.500" -"2019/05/25 04:44:06.000" "2019/05/25 04:44:06.500" -"2019/05/25 04:44:07.000" "2019/05/25 04:44:07.500" -"2019/05/25 04:44:08.000" "2019/05/25 04:44:08.500" -"2019/05/25 04:44:09.000" "2019/05/25 04:44:09.500" -"2019/05/25 04:44:10.000" "2019/05/25 04:44:10.500" -"2019/05/25 04:44:11.000" "2019/05/25 04:44:11.500" -"2019/05/25 04:44:12.000" "2019/05/25 04:44:12.500" -"2019/05/25 04:44:13.000" "2019/05/25 04:44:13.500" -"2019/05/25 04:44:14.000" "2019/05/25 04:44:14.500" -"2019/05/25 04:44:15.000" "2019/05/25 04:44:15.500" -"2019/05/25 04:44:16.000" "2019/05/25 04:44:16.500" -"2019/05/25 04:44:17.000" "2019/05/25 04:44:17.500" -"2019/05/25 04:44:18.000" "2019/05/25 04:44:18.500" -"2019/05/25 04:44:19.000" "2019/05/25 04:44:19.500" -"2019/05/25 04:44:20.000" "2019/05/25 04:44:20.500" -"2019/05/25 04:44:21.000" "2019/05/25 04:44:21.500" -"2019/05/25 04:44:22.000" "2019/05/25 04:44:22.500" -"2019/05/25 04:44:23.000" "2019/05/25 04:44:23.500" -"2019/05/25 04:44:24.000" "2019/05/25 04:44:24.500" -"2019/05/25 04:44:25.000" "2019/05/25 04:44:25.500" -"2019/05/25 04:44:26.000" "2019/05/25 04:44:26.500" -"2019/05/25 04:44:27.000" "2019/05/25 04:44:27.500" -"2019/05/25 04:44:28.000" "2019/05/25 04:44:28.500" -"2019/05/25 04:44:29.000" "2019/05/25 04:44:29.500" -"2019/05/25 04:44:30.000" "2019/05/25 04:44:30.500" -"2019/05/25 04:44:31.000" "2019/05/25 04:44:31.500" -"2019/05/25 04:44:32.000" "2019/05/25 04:44:32.500" -"2019/05/25 04:44:33.000" "2019/05/25 04:44:33.500" -"2019/05/25 04:44:34.000" "2019/05/25 04:44:34.500" -"2019/05/25 04:44:35.000" "2019/05/25 04:44:35.500" -"2019/05/25 04:44:36.000" "2019/05/25 04:44:36.500" -"2019/05/25 04:44:37.000" "2019/05/25 04:44:37.500" -"2019/05/25 04:44:38.000" "2019/05/25 04:44:38.500" -"2019/05/25 04:44:39.000" "2019/05/25 04:44:39.500" -"2019/05/25 04:44:40.000" "2019/05/25 04:44:40.500" -"2019/05/25 04:44:41.000" "2019/05/25 04:44:41.500" -"2019/05/25 04:44:42.000" "2019/05/25 04:44:42.500" -"2019/05/25 04:44:43.000" "2019/05/25 04:44:43.500" -"2019/05/25 04:44:44.000" "2019/05/25 04:44:44.500" -"2019/05/25 04:44:45.000" "2019/05/25 04:44:45.500" -"2019/05/25 04:44:46.000" "2019/05/25 04:44:46.500" -"2019/05/25 04:44:47.000" "2019/05/25 04:44:47.500" -"2019/05/25 04:44:48.000" "2019/05/25 04:44:48.500" -"2019/05/25 04:44:49.000" "2019/05/25 04:44:49.500" -"2019/05/25 04:44:50.000" "2019/05/25 04:44:50.500" -"2019/05/25 04:44:51.000" "2019/05/25 04:44:51.500" -"2019/05/25 04:44:52.000" "2019/05/25 04:44:52.500" -"2019/05/25 04:44:53.000" "2019/05/25 04:44:53.500" -"2019/05/25 04:44:54.000" "2019/05/25 04:44:54.500" -"2019/05/25 04:44:55.000" "2019/05/25 04:44:55.500" -"2019/05/25 04:44:56.000" "2019/05/25 04:44:56.500" -"2019/05/25 04:44:57.000" "2019/05/25 04:44:57.500" -"2019/05/25 04:44:58.000" "2019/05/25 04:44:58.500" -"2019/05/25 04:44:59.000" "2019/05/25 04:44:59.500" -"2019/05/25 04:45:00.000" "2019/05/25 04:45:00.500" -"2019/05/25 04:45:01.000" "2019/05/25 04:45:01.500" -"2019/05/25 04:45:02.000" "2019/05/25 04:45:02.500" -"2019/05/25 04:45:03.000" "2019/05/25 04:45:03.500" -"2019/05/25 04:45:04.000" "2019/05/25 04:45:04.500" -"2019/05/25 04:45:05.000" "2019/05/25 04:45:05.500" -"2019/05/25 04:45:06.000" "2019/05/25 04:45:06.500" -"2019/05/25 04:45:07.000" "2019/05/25 04:45:07.500" -"2019/05/25 04:45:08.000" "2019/05/25 04:45:08.500" -"2019/05/25 04:45:09.000" "2019/05/25 04:45:09.500" -"2019/05/25 04:45:10.000" "2019/05/25 04:45:10.500" -"2019/05/25 04:45:11.000" "2019/05/25 04:45:11.500" -"2019/05/25 04:45:12.000" "2019/05/25 04:45:12.500" -"2019/05/25 04:45:13.000" "2019/05/25 04:45:13.500" -"2019/05/25 04:45:14.000" "2019/05/25 04:45:14.500" -"2019/05/25 04:45:15.000" "2019/05/25 04:45:15.500" -"2019/05/25 04:45:16.000" "2019/05/25 04:45:16.500" -"2019/05/25 04:45:17.000" "2019/05/25 04:45:17.500" -"2019/05/25 04:45:18.000" "2019/05/25 04:45:18.500" -"2019/05/25 04:45:19.000" "2019/05/25 04:45:19.500" -"2019/05/25 04:45:20.000" "2019/05/25 04:45:20.500" -"2019/05/25 04:45:21.000" "2019/05/25 04:45:21.500" \ No newline at end of file diff --git a/data/assets/scene/solarsystem/missions/osirisrex/bennu.asset b/data/assets/scene/solarsystem/missions/osirisrex/bennu.asset deleted file mode 100644 index a935cc6fcf..0000000000 --- a/data/assets/scene/solarsystem/missions/osirisrex/bennu.asset +++ /dev/null @@ -1,115 +0,0 @@ -local assetHelper = asset.require('util/asset_helper') -local transforms = asset.require('./transforms') -local sunTransforms = asset.require('scene/solarsystem/sun/transforms') - - - -local textures = asset.syncedResource({ - Name = "Bennu Textures", - Type = "HttpSynchronization", - Identifier = "bennu_textures", - Version = 1 -}) - -local models = asset.syncedResource({ - Name = "Bennu Models", - Type = "HttpSynchronization", - Identifier = "bennu_models", - Version = 1 -}) - -local BENNU_BODY = "2101955" - - -local Bennu = { - Identifier = "Bennu", - Parent = transforms.BennuBarycenter.Identifier, - Transform = { - Rotation = { - Type = "SpiceRotation", - SourceFrame = "IAU_BENNU", - DestinationFrame = "GALACTIC" - }, - }, - Renderable = { - Type = "RenderableModelProjection", - Body = BENNU_BODY, - Geometry = { - Type = "MultiModelGeometry", - GeometryFile = models .. "/BennuTextured.obj" - }, - ColorTexture = textures .. "/gray.png", - Projection = { - Sequence = asset.localResource('InstrumentTimes'), - SequenceType = "instrument-times", - Observer = "OSIRIS-REX", - Target = BENNU_BODY, - Aberration = "NONE", - AspectRatio = 2, - - DataInputTranslation = { - Instruments = { - ORX_OCAMS_POLYCAM = { - DetectorType = "Camera", - Spice = { "ORX_OCAMS_POLYCAM" }, - Files = { - "BaseballDiamond_PolyCam.txt", - --"OrbitalB_Site08_PolyCamImages.txt", - "Recon_225m_Equatorial_PolyCam.txt", - }, - }, - ORX_REXIS = { - DetectorType = "Camera", - Spice = { "ORX_REXIS" }, - Files = { - "DetailedSurvey_EquatorialStations_Spectrometers.txt", - "Recon_225m_Equatorial_spectrometers.txt", - "Recon_525m_Equatorial_spectrometers.txt", - } - } - }, - Target = { - Body = BENNU_BODY - }, - }, - - Instrument = { -- INVALID DATA - JUST FOR TESTING - Name = "ORX_OCAMS_POLYCAM", - Method = "ELLIPSOID", - Aberration = "NONE", - Fovy = 0.792, - Aspect = 1, - Near = 0.01, - Far = 1000000 - } - } - }, - GUI = { - Path = "/Solar System/Asteroid" - } -} - -local BennuTrail = { - Identifier = "BennuTrail", - Parent = sunTransforms.SolarSystemBarycenter.Identifier, - Renderable = { - Type = "RenderableTrailTrajectory", - Translation = { - Type = "SpiceTranslation", - Target = BENNU_BODY, - Observer = "SUN" - }, - Color = { 0.4, 0.0, 0.7 }, - StartTime = "2015 JAN 01 00:00:00.000", - EndTime = "2023 MAY 31 00:00:00.000", - SampleInterval = 3600 - }, - GUI = { - Name = "Bennu Trail", - Path = "/Solar System/Asteroid" - } - -} - - -assetHelper.registerSceneGraphNodesAndExport(asset, { Bennu, BennuTrail }) diff --git a/data/assets/scene/solarsystem/missions/osirisrex/model.asset b/data/assets/scene/solarsystem/missions/osirisrex/model.asset deleted file mode 100644 index 30a81b344c..0000000000 --- a/data/assets/scene/solarsystem/missions/osirisrex/model.asset +++ /dev/null @@ -1,345 +0,0 @@ -local assetHelper = asset.require('util/asset_helper') -local transforms = asset.require('./transforms') -local sunTransforms = asset.require('scene/solarsystem/sun/transforms') -local earthTransforms = asset.require('scene/solarsystem/planets/earth/transforms') - - - -local kernels = asset.syncedResource({ - Name = "Osiris Rex Kernels", - Type = "HttpSynchronization", - Identifier = "osirisrex_kernels", - Version = 1 -}) - -local textures = asset.syncedResource({ - Name = "Osiris Rex Textures", - Type = "HttpSynchronization", - Identifier = "osirisrex_textures", - Version = 1 -}) - -local models = asset.syncedResource({ - Name = "Osiris Rex Models", - Type = "HttpSynchronization", - Identifier = "osirisrex_models", - Version = 1 -}) - -local BENNU_BODY = "2101955" - -KernelCase = 2 -- Right now we only have the image times for case 2 - -local CaseDependentKernels -if KernelCase == 2 then - CaseDependentKernels = { - kernels .. "/ORX_Recon_525mSortie_Case02.bsp", - kernels .. "/Recon_525mSortie_Case02_0Latitude.bc", - kernels .. "/Recon_525mSortie_Case02_atl_19145_04.atf", - - kernels .. "/ORX_Recon_225mSortie_Case02.bsp", - kernels .. "/Recon_225mSortie_Case02_0Latitude.bc" - } -elseif KernelCase == 5 then - CaseDependentKernels = { - kernels .. "/ORX_Recon_525mSortie_Case05.bsp", - kernels .. "/Recon_525mSortie_Case05_20negLatitude.bc", - kernels .. "/Recon_525mSortie_Case05_atl_19145_04.atf", - kernels .. "/Recon_525mSortie_Case05_NominalProfile.bc", - - kernels .. "/ORX_Recon_225mSortie_Case05.bsp", - kernels .. "/Recon_225mSortie_Case05_20negLatitude.bc" - } -elseif KernelCase == 8 then - CaseDependentKernels = { - kernels .. "/Recon_525mSortie_Case08_NominalProfile.bc", - kernels .. "/ORX_Recon_225mSortie_Case08.bsp", - kernels .. "/Recon_225mSortie_Case08_40negLatitude.bc" - } -elseif KernelCase == 11 then - CaseDependentKernels = { - kernels .. "/ORX_Recon_225mSortie_Case11.bsp", - kernels .. "/Recon_225mSortie_Case11_60negLatitude.bc" - } -end - -local OsirisRexKernels = { - -- background - -- SCLK kernels needs to be loaded before CK kernels (and generally first) - kernels .. "/ORX_SCLKSCET.00000.tsc", - - -- This cannot be loaded correctly for some reason! - --openspace.spice.loadKernel(kernels .. "/OsirisRexKernels/background/dsk/RQ36mod.oct12_CCv0001.bds") - - kernels .. "/orx_v04.tf", - kernels .. "/orx_lidar_v00.ti", - kernels .. "/orx_ocams_v03.ti", - kernels .. "/orx_otes_v00.ti", - kernels .. "/orx_rexis_v00.ti", - kernels .. "/orx_struct_v00.ti", - kernels .. "/orx_navcam_v00.ti", - kernels .. "/orx_ola_v00.ti", - kernels .. "/orx_ovirs_v00.ti", - kernels .. "/orx_stowcam_v00.ti", - -- kernels .. "/naif0011.tls", - kernels .. "/bennu_SPH250m.tpc", - kernels .. "/bennu_v10.tpc", - - -- Low res SPK - kernels .. "/orx_160917_231024_pgaa3_day15m60_v1.bsp", - kernels .. "/orx_160914_231024_pgaa3_day12m60_v1.bsp", - - kernels .. "/orx_160908_231024_pgaa3_day06m60_v1.bsp", - kernels .. "/spk_orx_160908_231024_pgaa2_day06m60_v3.bsp", - kernels .. "/orx_160908_231024_pgaa2_day06m60.bsp", - - kernels .. "/OREX_20160908_M60_complete.bsp", - kernels .. "/OREX_20160904_M45_complete.bsp", - - -- SPK - kernels .. "/de421.bsp", - kernels .. "/sb-101955-76.bsp", - - -- Nominal_Profile_LowRes - kernels .. "/Approach_600s_20180816T230000_20181119T010000.bsp", - kernels .. "/Approach_NominalProfile_600s_20180816T230000_20181119T010000.bc", - kernels .. "/DetailedSurvey_600s_20190108T000000_20190317T000000.bsp", - kernels .. "/OrbitalA_600s_20181203T230000_20190109T000000.bsp", - kernels .. "/OrbitalA_NominalProfile_600s_20181203T230000_20190109T000000.bc", - kernels .. "/OrbitalB_600s_20190316T000000_20190521T000000.bsp", - kernels .. "/DetailedSurvey_NominalProfile_600s_20190108T000000_20190317T000000.bc", - kernels .. "/OrbitalB_NominalProfile600s_20190316T000000_20190521T000000.bc", - kernels .. "/PrelimSurvey_600s_20181119T230000_20181204T010000.bsp", - kernels .. "/PrelimSurvey_NominalProfile_600s_20181119T230000_20181204T010000.bc", - kernels .. "/Recon_600s_20190519T000000_20190830T000000.bsp", - kernels .. "/Recon_NominalProfile_600s_20190519T000000_20190830T000000.bc", - - -- Nominal_Observations_Science - kernels .. "/Phase03_AP_DustSearch_1.bc", - kernels .. "/Phase03_AP_LightCurve_1.bc", - kernels .. "/Phase03_AP_LightCurve_2.bc", - kernels .. "/Phase03_AP_SatSearch_1.bc", - kernels .. "/Phase03_AP_SatSearch_2.bc", - kernels .. "/Phase03_AP_PhaseFunction_1.bc", - kernels .. "/Phase03_AP_ShapeModel_1.bc", - kernels .. "/Phase03_AP_ShapeModel_2.bc", - kernels .. "/Phase03_AP_ShapeModel_3.bc", - kernels .. "/Phase03_AP_ShapeModel_4.bc", - kernels .. "/Phase03_AP_ShapeModel_5.bc", - kernels .. "/Phase03_AP_ShapeModel_6.bc", - kernels .. "/Phase03_AP_ShapeModel_7.bc", - kernels .. "/Phase03_AP_ShapeModel_8.bc", - kernels .. "/Phase03_AP_ShapeModel_9_Forced4x4.bc", - kernels .. "/Phase03_AP_SpectraMap_1.bc", - kernels .. "/Phase04_PS_MC_1_v1_1a.bc", - kernels .. "/Phase04_PS_MC_2_v1_1a.bc", - kernels .. "/Phase04_PS_OLA_Nominal_1.bc", - kernels .. "/Phase04_PS_OLA_Nominal_2.bc", - kernels .. "/Phase04_PS_OLA_Nominal_3.bc", - kernels .. "/Phase04_PS_OLA_Nominal_4.bc", - kernels .. "/Phase04_PS_PolyCam_1.bc", - kernels .. "/Phase04_PS_PolyCam_2.bc", - kernels .. "/Phase04_PS_PolyCam_3.bc", - kernels .. "/Phase04_PS_PolyCam_4.bc", - kernels .. "/Phase04_PS_PolyCam_5.bc", - kernels .. "/Phase04_PS_PolyCam_6.bc", - - --openspace.spice.loadKernel(kernels .. "/OsirisRexKernels/Nominal_Observations_Science/06_DetailedSurvey/BaseballDiamond_v2/atl_19013_18_BBD1_info.TXT") - --openspace.spice.loadKernel(kernels .. "/OsirisRexKernels/Nominal_Observations_Science/06_DetailedSurvey/BaseballDiamond_v2/atl_19014_16_BBD2_info.TXT") - --openspace.spice.loadKernel(kernels .. "/OsirisRexKernels/Nominal_Observations_Science/06_DetailedSurvey/BaseballDiamond_v2/atl_19020_18_BBD3_info.TXT") - --openspace.spice.loadKernel(kernels .. "/OsirisRexKernels/Nominal_Observations_Science/06_DetailedSurvey/BaseballDiamond_v2/atl_19021_19_BBD4_info.TXT") - --openspace.spice.loadKernel(kernels .. "/OsirisRexKernels/Nominal_Observations_Science/06_DetailedSurvey/BaseballDiamond_v2/README.txt") - - kernels .. "/atl_19013_18_BBD1_v2.bc", - kernels .. "/atl_19014_16_BBD2_v2.bc", - kernels .. "/atl_19020_18_BBD3_v2.bc", - kernels .. "/atl_19021_19_BBD4_v2.bc", - - - kernels .. "/Phase06_DS_Equatorial_Stations_1.bc", - kernels .. "/Phase06_DS_Equatorial_Stations_2.bc", - kernels .. "/Phase06_DS_Equatorial_Stations_3.bc", - kernels .. "/Phase06_DS_Equatorial_Stations_4.bc", - kernels .. "/Phase06_DS_Equatorial_Stations_5.bc", - kernels .. "/Phase06_DS_Equatorial_Stations_6.bc", - kernels .. "/Phase06_DS_Equatorial_Stations_7.bc", - kernels .. "/Phase06_DS_Plume_Search_1.bc", - kernels .. "/Phase06_DS_Plume_Search_2.bc", - kernels .. "/Phase07_OB_CSS_Mapping_1.bc", - kernels .. "/Phase07_OB_CSS_Mapping_2.bc", - kernels .. "/Phase07_OB_CSS_Mapping_3.bc", - kernels .. "/CSS_Mapping_1.a", - kernels .. "/CSS_Mapping_2.a", - kernels .. "/CSS_Mapping_3.a", - - --openspace.spice.loadKernel(kernels .. "/Case02_0Latitude.wmv") - --openspace.spice.loadKernel(kernels .. "/Case05_20negLatitude.wmv") - --openspace.spice.loadKernel(kernels .. "/Case08_40negLatitude.wmv") - --openspace.spice.loadKernel(kernels .. "/Case11_60negLatitude.wmv") -} - -local LightSources = { - { - Type = "SceneGraphLightSource", - Identifier = "Sun", - Node = sunTransforms.SolarSystemBarycenter.Identifier, - Intensity = 1.0 - }, - { - Identifier = "Camera", - Type = "CameraLightSource", - Intensity = 0.5 - } -} - --- Append the CaseDependentKernels at the end of the OsirisRexKernels set -for i = 0, #CaseDependentKernels do - OsirisRexKernels[#OsirisRexKernels + 1] = CaseDependentKernels[i] -end - -local OsirisRex = { - Identifier = "OsirisRex", - Parent = sunTransforms.SolarSystemBarycenter.Identifier, - Transform = { - Translation = { - Type = "SpiceTranslation", - Target = "OSIRIS-REX", - Observer = "SUN", - Kernels = OsirisRexKernels - }, - Rotation = { - Type = "SpiceRotation", - SourceFrame = "ORX_SPACECRAFT", - DestinationFrame = "GALACTIC" - }, - }, - Renderable = { - Type = "RenderableModel", - Body = "OSIRIS-REX", - Geometry = { - Type = "MultiModelGeometry", - GeometryFile = models .. "/orx_base_resized_12_sep_2016.obj" - }, - ColorTexture = textures .. "/osirisTex.png", - LightSources = LightSources - }, - GUI = { - Name = "OSIRIS REx", - Path = "/Solar System/Missions/OSIRIS REx" - } -} - -local PolyCam = { - Identifier = "ORX_OCAMS_POLYCAM", - Parent = OsirisRex.Identifier, - Transform = { - Translation = { - Type = "StaticTranslation", - Position = { -0.2476, 0.2710, 0.3364 } - }, - Rotation = { - Type = "SpiceRotation", - SourceFrame = "ORX_OCAMS_POLYCAM", - DestinationFrame = "ORX_SPACECRAFT" - } - }, - Renderable = { - Type = "RenderableModel", - Body = "OSIRIS-REX", - Geometry = { - Type = "MultiModelGeometry", - GeometryFile = models .. "/orx_polycam_resized_12_sep_2016.obj" - }, - ColorTexture = textures .. "/osirisTex.png", - LightSources = LightSources - }, - GUI = { - Name = "OCAMS POLYCAM", - Path = "/Solar System/Missions/OSIRIS REx/Instruments" - } -} - -local Rexis = { - Identifier = "ORX_REXIS", - Parent = OsirisRex.Identifier, - Renderable = { - Type = "RenderableModel", - Body = "OSIRIS-REX", - Geometry = { - Type = "MultiModelGeometry", - GeometryFile = models .. "/orx_rexis_resized_12_sep_2016.obj" - }, - ColorTexture = textures .. "/osirisTex.png", - LightSources = LightSources - }, - Transform = { - Translation = { - Type = "StaticTranslation", - Position = { 0, 0.3371, 0.2712 } - }, - Rotation = { - Type = "SpiceRotation", - SourceFrame = "ORX_REXIS", - DestinationFrame = "ORX_SPACECRAFT" - }, - }, - GUI = { - Name = "REXIS", - Path = "/Solar System/Missions/OSIRIS REx/Instruments" - } -} - -local PolyCamFov = { - Identifier = "POLYCAM FOV", - Parent = PolyCam.Identifier, - Renderable = { - Type = "RenderableFov", - Body = "OSIRIS-REX", - Frame = "ORX_OCAMS_POLYCAM", - RGB = { 0.8, 0.7, 0.7 }, - Instrument = { - Name = "ORX_OCAMS_POLYCAM", - Method = "ELLIPSOID", - Aberration = "NONE" - }, - PotentialTargets = { BENNU_BODY } - }, - GUI = { - Name = "POLYCAM FOV", - Path = "/Solar System/Missions/OSIRIS REx/Instruments" - } -} - -local RexisFov = { - Identifier = "REXIS FOV", - Parent = Rexis.Identifier, - Renderable = { - Type = "RenderableFov", - Body = "OSIRIS-REX", - Frame = "ORX_REXIS", - RGB = { 0.8, 0.7, 0.7 }, - Instrument = { - Name = "ORX_REXIS", - Method = "ELLIPSOID", - Aberration = "NONE" - }, - PotentialTargets = { BENNU_BODY }, - FrameConversions = { - [BENNU_BODY] = "IAU_BENNU" - } - }, - GUI = { - Name = "REXIS FOV", - Path = "/Solar System/Missions/OSIRIS REx/Instruments" - } -} - - - -assetHelper.registerSceneGraphNodesAndExport(asset, { - OsirisRex, - PolyCam, - Rexis, - PolyCamFov, - RexisFov -}) diff --git a/data/assets/scene/solarsystem/missions/osirisrex/osirisrex.asset b/data/assets/scene/solarsystem/missions/osirisrex/osirisrex.asset deleted file mode 100644 index 1444106adc..0000000000 --- a/data/assets/scene/solarsystem/missions/osirisrex/osirisrex.asset +++ /dev/null @@ -1,16 +0,0 @@ -asset.request('./bennu') -asset.request('./model') -asset.request('./trail') - -asset.require('./script_schedule') - -local mission = asset.localResource('osirisrex.mission') -local missionName - -asset.onInitialize(function() - missionName = openspace.loadMission(mission) -end) - -asset.onDeinitialize(function() - openspace.unloadMission(missionName) -end) diff --git a/data/assets/scene/solarsystem/missions/osirisrex/osirisrex.mission b/data/assets/scene/solarsystem/missions/osirisrex/osirisrex.mission deleted file mode 100644 index 3e35cffd28..0000000000 --- a/data/assets/scene/solarsystem/missions/osirisrex/osirisrex.mission +++ /dev/null @@ -1,386 +0,0 @@ ---[[ - -References: -[1] Source : http://www.asteroidmission.org/about-mission/ - Date : 2016-08-23 - Comment : Precision is not even month - it just defines the overall mission approach - -[2] Source : http://brinktest.lpl.arizona.edu/mission/ - Date : 2016-08-23 - Comment : Data taken from text descriptions of the visualizations. There is a little time bar up - in the upper right corner. - -[3] Source : SPICE kernel data coverage - Date : 2016-08-23 - Comment : The spice data is split up into across different files. These files - seems to represent different phases. A script was used to extract the - SPICE coverage from all .bc files and use the names of the files as - mission names and associate the name with the time coverage. - Script used: support/mission/ckbrief2mission.js - -[4] Source : Visual interpretation of SPICE kernel data coverage - Date : 2016-08-23 - Comment : Based on observation of the visualized spice data through OpenSpace. - ---]] - -return { - Name = "OSIRIS-REx", - Phases = { - -- All 1-level phases based on [1] - { - Name = "Planning and Fabrication", - TimeRange = { Start = "2012 JAN 01 00:00:00", End = "2016 SEP 08 23:05:00" } - }, - { - Name = "Outbound Cruise", - TimeRange = { Start = "2016 SEP 03 00:00:00", End = "2018 SEP 01 01:00:00" }, - Phases = { - -- Phases from [4] - { - Name = "Pre Launch", - TimeRange = { Start = "2016 SEP 03 01:00:00", End = "2016 SEP 08 23:05:05" } - }, - { - Name = "Launch", TimeRange = { Start = "2016 SEP 08 23:05:05", End = "2016 SEP 08 23:09:00" } - }, - { - Name = "Earth Orbit", TimeRange = { Start = "2016 SEP 08 23:09:00", End = "2016 SEP 08 23:45:00" } - }, - { - Name = "Solar Orbit", TimeRange = { Start = "2016 SEP 08 23:45:00", End = "2018 SEP 01 00:00:00" } - }, - { - Name = "Upcoming Gravity Assist", TimeRange = { Start = "2017 JAN 22 15:00:00", End = "2017 SEP 22 15:00:00" } - }, - { - Name = "Gravity Assist", TimeRange = { Start = "2017 SEP 22 15:00:00", End = "2017 SEP 22 21:00:00" } - } - } - }, - { - Name = "Asteroid Operations", - Phases = { - -- Nested Levels from [3] - { - Name = "03_Approach", Phases = { - { - Name = "DustSearch_v1", - Phases = { - { - Name = "Phase03_AP_DustSearch_1.bc", - TimeRange = { Start = "2018-SEP-11 21:31:01.183", End = "2018-SEP-12 02:18:41.183" } - } - } - }, - { - Name = "LightCurve_v1", - Phases = { - { - Name = "Phase03_AP_LightCurve_1.bc", - TimeRange = { Start = "2018-OCT-09 21:50:48.182", End = "2018-OCT-10 02:33:16.183" } - }, - { - Name = "Phase03_AP_LightCurve_2.bc", - TimeRange = { Start = "2018-OCT-10 21:50:48.182", End = "2018-OCT-11 02:33:16.183" } - } - } - }, - { - Name = "NatSatSearch_v1", - Phases = { - { - Name = "Phase03_AP_SatSearch_1.bc", - TimeRange = { Start = "2018-OCT-26 19:38:30.183", End = "2018-OCT-27 00:22:34.183" } - }, - { - Name = "Phase03_AP_SatSearch_2.bc", - TimeRange = { Start = "2018-NOV-05 17:10:20.183", End = "2018-NOV-05 21:59:48.183" } - } - } - }, - { - Name = "PhaseFunction_v1", - Phases = { - { - Name = "Phase03_AP_PhaseFunction_1.bc", - TimeRange = { Start = "2018-OCT-12 21:42:26.183", End = "2018-OCT-13 02:24:54.183" } - } - } - }, - { - Name = "ShapeModel_v1", Phases = { - { - Name = "Phase03_AP_ShapeModel_1.bc", - TimeRange = { Start = "2018-NOV-09 11:02:59.183", End = "2018-NOV-09 15:52:27.183" } - }, - { - Name = "Phase03_AP_ShapeModel_2.bc", - TimeRange = { Start = "2018-NOV-10 11:02:59.183", End = "2018-NOV-10 15:52:27.183" } - }, - { - Name = "Phase03_AP_ShapeModel_3.bc", - TimeRange = { Start = "2018-NOV-11 11:02:59.183", End = "2018-NOV-11 15:52:27.183" } - }, - { - Name = "Phase03_AP_ShapeModel_4.bc", - TimeRange = { Start = "2018-NOV-12 11:02:59.183", End = "2018-NOV-12 15:52:27.183" } - }, - { - Name = "Phase03_AP_ShapeModel_5.bc", - TimeRange = { Start = "2018-NOV-13 11:02:59.183", End = "2018-NOV-13 15:52:27.183" } - }, - { - Name = "Phase03_AP_ShapeModel_6.bc", - TimeRange = { Start = "2018-NOV-14 11:03:53.183", End = "2018-NOV-14 15:51:33.183" } - }, - { - Name = "Phase03_AP_ShapeModel_7.bc", - TimeRange = { Start = "2018-NOV-15 11:03:53.183", End = "2018-NOV-15 15:51:33.183" } - }, - { - Name = "Phase03_AP_ShapeModel_8.bc", - TimeRange = { Start = "2018-NOV-16 11:03:53.183", End = "2018-NOV-16 15:51:33.183" } - }, - { - Name = "Phase03_AP_ShapeModel_9_Forced4x4.bc", - TimeRange = { Start = "2018-NOV-17 11:03:54.183", End = "2018-NOV-17 15:51:34.183" } - } - } - }, - { - Name = "SpectraMap_v1", - Phases = { - { - Name = "Phase03_AP_SpectraMap_1.bc", - TimeRange = { Start = "2018-OCT-30 20:44:53.183", End = "2018-OCT-31 01:34:21.183" } - } - } - } - } - }, - { - Name = "04_PrelimSurvey", - Phases = { - { - Name = "MapCamOLA_v1", - Phases = { - { - Name = "Phase04_PS_MC_1_v1_1a.bc", - TimeRange = { Start = "2018-NOV-20 01:13:12.183", End = "2018-NOV-20 06:13:04.183" } - }, - { - Name = "Phase04_PS_MC_2_v1_1a.bc", - TimeRange = { Start = "2018-NOV-28 01:13:12.183", End = "2018-NOV-28 06:13:04.183" } - } - } - }, - { - Name = "OLA_v1", - Phases = { - { - Name = "Phase04_PS_OLA_Nominal_1.bc", - TimeRange = { Start = "2018-NOV-19 22:30:00.184", End = "2018-NOV-19 23:19:28.183" } - }, - { - Name = "Phase04_PS_OLA_Nominal_2.bc", - TimeRange = { Start = "2018-NOV-23 22:19:34.184", End = "2018-NOV-23 23:19:26.183" } - }, - { - Name = "Phase04_PS_OLA_Nominal_3.bc", - TimeRange = { Start = "2018-NOV-24 00:48:38.184", End = "2018-NOV-24 01:38:06.184" } - }, - { - Name = "Phase04_PS_OLA_Nominal_4.bc", - TimeRange = { Start = "2018-NOV-27 22:29:58.184", End = "2018-NOV-27 23:19:26.183" } - } - } - }, - { - Name = "PolyCam_v1", - Phases = { - { - Name = "Phase04_PS_PolyCam_1.bc", - TimeRange = { Start = "2018-NOV-19 12:00:33.183", End = "2018-NOV-19 16:46:25.183" } - }, - { - Name = "Phase04_PS_PolyCam_2.bc", - TimeRange = { Start = "2018-NOV-20 07:10:26.183", End = "2018-NOV-20 12:10:18.183" } - }, - { - Name = "Phase04_PS_PolyCam_3.bc", - TimeRange = { Start = "2018-NOV-23 11:51:29.184", End = "2018-NOV-23 16:51:21.184" } - }, - { - Name = "Phase04_PS_PolyCam_4.bc", - TimeRange = { Start = "2018-NOV-24 07:17:39.184", End = "2018-NOV-24 12:03:31.184" } - }, - { - Name = "Phase04_PS_PolyCam_5.bc", - TimeRange = { Start = "2018-NOV-27 12:00:20.184", End = "2018-NOV-27 16:46:12.184" } - }, - { - Name = "Phase04_PS_PolyCam_6.bc", - TimeRange = { Start = "2018-NOV-28 07:10:35.183", End = "2018-NOV-28 12:10:27.183" } - } - } - }, - } - }, - { - Name = "06_DetailedSurvey", - Phases = { - { - Name = "BaseballDiamond_v2", - Phases = { - { - Name = "atl_19013_18_BBD1_v2.bc", - TimeRange = { Start = "2019-JAN-13 18:59:31.195", End = "2019-JAN-13 23:59:29.179" } - }, - { - Name = "atl_19014_16_BBD2_v2.bc", - TimeRange = { Start = "2019-JAN-14 16:56:01.185", End = "2019-JAN-14 21:55:58.219" } - }, - { - Name = "atl_19020_18_BBD3_v2.bc", - TimeRange = { Start = "2019-JAN-20 18:59:15.211", End = "2019-JAN-20 23:59:13.195" } - }, - { - Name = "atl_19021_19_BBD4_v2.bc", - TimeRange = { Start = "2019-JAN-21 19:26:47.179", End = "2019-JAN-22 00:26:44.213" } - } - } - }, - { - Name = "EquatorialStations_v1", - Phases = { - { - Name = "Phase06_DS_Equatorial_Stations_1.bc", - TimeRange = { Start = "2019-JAN-27 10:36:24.185", End = "2019-JAN-27 15:20:28.185" } - }, - { - Name = "Phase06_DS_Equatorial_Stations_2.bc", - TimeRange = { Start = "2019-FEB-03 10:35:30.185", End = "2019-FEB-03 15:21:22.185" } - }, - { - Name = "Phase06_DS_Equatorial_Stations_3.bc", - TimeRange = { Start = "2019-FEB-10 10:51:50.185", End = "2019-FEB-10 15:51:42.185" } - }, - { - Name = "Phase06_DS_Equatorial_Stations_4.bc", - TimeRange = { Start = "2019-FEB-17 10:29:11.186", End = "2019-FEB-17 15:29:03.186" } - }, - { - Name = "Phase06_DS_Equatorial_Stations_5.bc", - TimeRange = { Start = "2019-FEB-24 10:08:28.186", End = "2019-FEB-24 15:08:20.185" } - }, - { - Name = "Phase06_DS_Equatorial_Stations_6.bc", - TimeRange = { Start = "2019-MAR-03 09:52:58.186", End = "2019-MAR-03 14:42:26.186" } - }, - { - Name = "Phase06_DS_Equatorial_Stations_7.bc", - TimeRange = { Start = "2019-MAR-10 09:57:47.186", End = "2019-MAR-10 14:36:33.186" } - } - } - }, - { - Name = "PlumeSearch_v1", - Phases = { - { - Name = "Phase06_DS_Plume_Search_1.bc", - TimeRange = { Start = "2019-JAN-28 10:34:36.185", End = "2019-JAN-28 15:22:16.185" } - }, - { - Name = "Phase06_DS_Plume_Search_2.bc", - TimeRange = { Start = "2019-FEB-18 10:29:11.186", End = "2019-FEB-18 15:29:03.186" } - } - } - } - } - }, - { - Name = "07_OrbitalB", - Phases = { - { - Name = "CandidateSampleSite_v1", - Phases = { - { - Name = "Phase07_OB_CSS_Mapping_1.bc", - TimeRange = { Start = "2019-APR-08 10:35:27.186", End = "2019-APR-08 15:22:06.186" } - }, - { - Name = "Phase07_OB_CSS_Mapping_2.bc", - TimeRange = { Start = "2019-APR-08 16:16:06.186", End = "2019-APR-11 10:38:58.186" } - }, - { - Name = "Phase07_OB_CSS_Mapping_3.bc", - TimeRange = { Start = "2019-APR-22 17:51:23.186", End = "2019-APR-29 19:41:03.186" } - } - } - } - } - }, - { - Name = "08_Recon", - Phases = { - { - Name = "225m_Sortie_v2", - Phases = { - { - Name = "Recon_225mSortie_Case02_0Latitude.bc", - TimeRange = { Start = "2019-MAY-25 03:50:31.195", End = "2019-MAY-25 04:32:17.227" } - }, - { - Name = "Recon_225mSortie_Case05_20negLatitude.bc", - TimeRange = { Start = "2019-MAY-25 03:50:48.216", End = "2019-MAY-25 04:37:10.209" } - }, - { - Name = "Recon_225mSortie_Case08_40negLatitude.bc", - TimeRange = { Start = "2019-MAY-25 04:02:43.176", End = "2019-MAY-25 04:54:41.179" } - }, - { - Name = "Recon_225mSortie_Case11_60negLatitude.bc", - TimeRange = { Start = "2019-MAY-25 04:21:46.161", End = "2019-MAY-25 05:18:44.232" } - } - } - }, - { - Name = "525m_Sortie_v2", - Phases = { - { - Name = "Recon_525mSortie_Case02_0Latitude.bc", - TimeRange = { Start = "2019-MAY-25 04:06:39.220", End = "2019-MAY-25 04:44:17.198" } - }, - { - Name = "Recon_525mSortie_Case05_20negLatitude.bc", - TimeRange = { Start = "2019-MAY-25 04:11:39.201", End = "2019-MAY-25 04:49:37.224" } - }, - { - Name = "Recon_525mSortie_Case05_NominalProfile.bc", - TimeRange = { Start = "2019-MAY-25 03:01:50.184", End = "2019-MAY-25 06:38:50.232" } - }, - { - Name = "Recon_525mSortie_Case08_NominalProfile.bc", - TimeRange = { Start = "2019-MAY-25 03:01:50.184", End = "2019-MAY-25 06:38:50.232" } - } - } - } - } - } - -- End of [3] - } - }, - { - Name = "Backup Time", - TimeRange = { Start = "2020 JAN 01 00:00:00", End = "2021 JAN 01 00:00:00" } - }, - { - Name = "Return Cruise", - TimeRange = { Start = "2021 JAN 01 00:00:00", End = "2023 SEP 20 00:00:00"} - }, - -- Not too interesting in terms of space visualization --> out commented - -- { Name = "Sample Analysis", TimeRange = { Start = "2023 JAN 01 00:00:00", End = "2025 JUN 01 00:00:00" } }, - -- End of [1] - } -} diff --git a/data/assets/scene/solarsystem/missions/osirisrex/script_schedule.asset b/data/assets/scene/solarsystem/missions/osirisrex/script_schedule.asset deleted file mode 100644 index 4bbf29979c..0000000000 --- a/data/assets/scene/solarsystem/missions/osirisrex/script_schedule.asset +++ /dev/null @@ -1,18 +0,0 @@ -local scriptSchedulerHelper = asset.require('util/script_scheduler_helper') - -asset.onInitialize(function () - scriptSchedulerHelper.scheduleRenderableEnabled("2016 SEP 08 23:05:00", "Scene.OsirisRexTrailSolarSystem", false) - scriptSchedulerHelper.scheduleRenderableEnabled("2016 SEP 08 23:05:00", "Scene.OsirisRexTrailBennu", false) - scriptSchedulerHelper.scheduleRenderableEnabledReversable("2016 SEP 08 23:05:01", "Scene.OsirisRexTrailEarth", true) - scriptSchedulerHelper.scheduleRenderableEnabledReversable("2016 SEP 09 00:00:00", "Scene.OsirisRexTrailSolarSystem", true) - scriptSchedulerHelper.scheduleRenderableEnabledReversable("2016 SEP 09 02:00:00", "Scene.OsirisRexTrailEarth", false) - scriptSchedulerHelper.scheduleRenderableEnabledReversable("2018 OCT 11 00:00:00", "Scene.OsirisRexTrailBennu", true) - scriptSchedulerHelper.scheduleRenderableEnabledReversable("2018 OCT 15 00:00:00", "Scene.OsirisRexTrailSolarSystem", false) - scriptSchedulerHelper.scheduleRenderableEnabledReversable("2019 AUG 01 00:00:00", "Scene.OsirisRexTrailSolarSystem", true) - scriptSchedulerHelper.scheduleRenderableEnabledReversable("2019 AUG 01 00:00:00", "Scene.OsirisRexTrailBennu", false) -end) - - -asset.onDeinitialize(function () - openspace.scriptScheduler.clear() -end) \ No newline at end of file diff --git a/data/assets/scene/solarsystem/missions/osirisrex/spice_kernel_times.mission b/data/assets/scene/solarsystem/missions/osirisrex/spice_kernel_times.mission deleted file mode 100644 index 4032141bd6..0000000000 --- a/data/assets/scene/solarsystem/missions/osirisrex/spice_kernel_times.mission +++ /dev/null @@ -1,95 +0,0 @@ -return -{ Name = "Nominal_Observations_Science", Phases = { - { Name = "03_Approach", Phases = { - { Name = "DustSearch_v1", Phases = { - { Name = "Phase03_AP_DustSearch_1.bc", TimeRange = { Start = "2018-SEP-11 21:31:01.183", End = "2018-SEP-12 02:18:41.183" }}, - }}, - { Name = "LightCurve_v1", Phases = { - { Name = "Phase03_AP_LightCurve_1.bc", TimeRange = { Start = "2018-OCT-09 21:50:48.182", End = "2018-OCT-10 02:33:16.183" }}, - { Name = "Phase03_AP_LightCurve_2.bc", TimeRange = { Start = "2018-OCT-10 21:50:48.182", End = "2018-OCT-11 02:33:16.183" }}, - }}, - { Name = "NatSatSearch_v1", Phases = { - { Name = "Phase03_AP_SatSearch_1.bc", TimeRange = { Start = "2018-OCT-26 19:38:30.183", End = "2018-OCT-27 00:22:34.183" }}, - { Name = "Phase03_AP_SatSearch_2.bc", TimeRange = { Start = "2018-NOV-05 17:10:20.183", End = "2018-NOV-05 21:59:48.183" }}, - }}, - { Name = "PhaseFunction_v1", Phases = { - { Name = "Phase03_AP_PhaseFunction_1.bc", TimeRange = { Start = "2018-OCT-12 21:42:26.183", End = "2018-OCT-13 02:24:54.183" }}, - }}, - { Name = "ShapeModel_v1", Phases = { - { Name = "Phase03_AP_ShapeModel_1.bc", TimeRange = { Start = "2018-NOV-09 11:02:59.183", End = "2018-NOV-09 15:52:27.183" }}, - { Name = "Phase03_AP_ShapeModel_2.bc", TimeRange = { Start = "2018-NOV-10 11:02:59.183", End = "2018-NOV-10 15:52:27.183" }}, - { Name = "Phase03_AP_ShapeModel_3.bc", TimeRange = { Start = "2018-NOV-11 11:02:59.183", End = "2018-NOV-11 15:52:27.183" }}, - { Name = "Phase03_AP_ShapeModel_4.bc", TimeRange = { Start = "2018-NOV-12 11:02:59.183", End = "2018-NOV-12 15:52:27.183" }}, - { Name = "Phase03_AP_ShapeModel_5.bc", TimeRange = { Start = "2018-NOV-13 11:02:59.183", End = "2018-NOV-13 15:52:27.183" }}, - { Name = "Phase03_AP_ShapeModel_6.bc", TimeRange = { Start = "2018-NOV-14 11:03:53.183", End = "2018-NOV-14 15:51:33.183" }}, - { Name = "Phase03_AP_ShapeModel_7.bc", TimeRange = { Start = "2018-NOV-15 11:03:53.183", End = "2018-NOV-15 15:51:33.183" }}, - { Name = "Phase03_AP_ShapeModel_8.bc", TimeRange = { Start = "2018-NOV-16 11:03:53.183", End = "2018-NOV-16 15:51:33.183" }}, - { Name = "Phase03_AP_ShapeModel_9_Forced4x4.bc", TimeRange = { Start = "2018-NOV-17 11:03:54.183", End = "2018-NOV-17 15:51:34.183" }}, - }}, - { Name = "SpectraMap_v1", Phases = { - { Name = "Phase03_AP_SpectraMap_1.bc", TimeRange = { Start = "2018-OCT-30 20:44:53.183", End = "2018-OCT-31 01:34:21.183" }}, - }}, - }}, - { Name = "04_PrelimSurvey", Phases = { - { Name = "MapCamOLA_v1", Phases = { - { Name = "Phase04_PS_MC_1_v1_1a.bc", TimeRange = { Start = "2018-NOV-20 01:13:12.183", End = "2018-NOV-20 06:13:04.183" }}, - { Name = "Phase04_PS_MC_2_v1_1a.bc", TimeRange = { Start = "2018-NOV-28 01:13:12.183", End = "2018-NOV-28 06:13:04.183" }}, - }}, - { Name = "OLA_v1", Phases = { - { Name = "Phase04_PS_OLA_Nominal_1.bc", TimeRange = { Start = "2018-NOV-19 22:30:00.184", End = "2018-NOV-19 23:19:28.183" }}, - { Name = "Phase04_PS_OLA_Nominal_2.bc", TimeRange = { Start = "2018-NOV-23 22:19:34.184", End = "2018-NOV-23 23:19:26.183" }}, - { Name = "Phase04_PS_OLA_Nominal_3.bc", TimeRange = { Start = "2018-NOV-24 00:48:38.184", End = "2018-NOV-24 01:38:06.184" }}, - { Name = "Phase04_PS_OLA_Nominal_4.bc", TimeRange = { Start = "2018-NOV-27 22:29:58.184", End = "2018-NOV-27 23:19:26.183" }}, - }}, - { Name = "PolyCam_v1", Phases = { - { Name = "Phase04_PS_PolyCam_1.bc", TimeRange = { Start = "2018-NOV-19 12:00:33.183", End = "2018-NOV-19 16:46:25.183" }}, - { Name = "Phase04_PS_PolyCam_2.bc", TimeRange = { Start = "2018-NOV-20 07:10:26.183", End = "2018-NOV-20 12:10:18.183" }}, - { Name = "Phase04_PS_PolyCam_3.bc", TimeRange = { Start = "2018-NOV-23 11:51:29.184", End = "2018-NOV-23 16:51:21.184" }}, - { Name = "Phase04_PS_PolyCam_4.bc", TimeRange = { Start = "2018-NOV-24 07:17:39.184", End = "2018-NOV-24 12:03:31.184" }}, - { Name = "Phase04_PS_PolyCam_5.bc", TimeRange = { Start = "2018-NOV-27 12:00:20.184", End = "2018-NOV-27 16:46:12.184" }}, - { Name = "Phase04_PS_PolyCam_6.bc", TimeRange = { Start = "2018-NOV-28 07:10:35.183", End = "2018-NOV-28 12:10:27.183" }}, - }}, - }}, - { Name = "06_DetailedSurvey", Phases = { - { Name = "BaseballDiamond_v2", Phases = { - { Name = "atl_19013_18_BBD1_v2.bc", TimeRange = { Start = "2019-JAN-13 18:59:31.195", End = "2019-JAN-13 23:59:29.179" }}, - { Name = "atl_19014_16_BBD2_v2.bc", TimeRange = { Start = "2019-JAN-14 16:56:01.185", End = "2019-JAN-14 21:55:58.219" }}, - { Name = "atl_19020_18_BBD3_v2.bc", TimeRange = { Start = "2019-JAN-20 18:59:15.211", End = "2019-JAN-20 23:59:13.195" }}, - { Name = "atl_19021_19_BBD4_v2.bc", TimeRange = { Start = "2019-JAN-21 19:26:47.179", End = "2019-JAN-22 00:26:44.213" }}, - }}, - { Name = "EquatorialStations_v1", Phases = { - { Name = "Phase06_DS_Equatorial_Stations_1.bc", TimeRange = { Start = "2019-JAN-27 10:36:24.185", End = "2019-JAN-27 15:20:28.185" }}, - { Name = "Phase06_DS_Equatorial_Stations_2.bc", TimeRange = { Start = "2019-FEB-03 10:35:30.185", End = "2019-FEB-03 15:21:22.185" }}, - { Name = "Phase06_DS_Equatorial_Stations_3.bc", TimeRange = { Start = "2019-FEB-10 10:51:50.185", End = "2019-FEB-10 15:51:42.185" }}, - { Name = "Phase06_DS_Equatorial_Stations_4.bc", TimeRange = { Start = "2019-FEB-17 10:29:11.186", End = "2019-FEB-17 15:29:03.186" }}, - { Name = "Phase06_DS_Equatorial_Stations_5.bc", TimeRange = { Start = "2019-FEB-24 10:08:28.186", End = "2019-FEB-24 15:08:20.185" }}, - { Name = "Phase06_DS_Equatorial_Stations_6.bc", TimeRange = { Start = "2019-MAR-03 09:52:58.186", End = "2019-MAR-03 14:42:26.186" }}, - { Name = "Phase06_DS_Equatorial_Stations_7.bc", TimeRange = { Start = "2019-MAR-10 09:57:47.186", End = "2019-MAR-10 14:36:33.186" }}, - }}, - { Name = "PlumeSearch_v1", Phases = { - { Name = "Phase06_DS_Plume_Search_1.bc", TimeRange = { Start = "2019-JAN-28 10:34:36.185", End = "2019-JAN-28 15:22:16.185" }}, - { Name = "Phase06_DS_Plume_Search_2.bc", TimeRange = { Start = "2019-FEB-18 10:29:11.186", End = "2019-FEB-18 15:29:03.186" }}, - }}, - }}, - { Name = "07_OrbitalB", Phases = { - { Name = "CandidateSampleSite_v1", Phases = { - { Name = "Phase07_OB_CSS_Mapping_1.bc", TimeRange = { Start = "2019-APR-08 10:35:27.186", End = "2019-APR-08 15:22:06.186" }}, - { Name = "Phase07_OB_CSS_Mapping_2.bc", TimeRange = { Start = "2019-APR-08 16:16:06.186", End = "2019-APR-11 10:38:58.186" }}, - { Name = "Phase07_OB_CSS_Mapping_3.bc", TimeRange = { Start = "2019-APR-22 17:51:23.186", End = "2019-APR-29 19:41:03.186" }}, - }}, - }}, - { Name = "08_Recon", Phases = { - { Name = "225m_Sortie_v2", Phases = { - { Name = "Recon_225mSortie_Case02_0Latitude.bc", TimeRange = { Start = "2019-MAY-25 03:50:31.195", End = "2019-MAY-25 04:32:17.227" }}, - { Name = "Recon_225mSortie_Case05_20negLatitude.bc", TimeRange = { Start = "2019-MAY-25 03:50:48.216", End = "2019-MAY-25 04:37:10.209" }}, - { Name = "Recon_225mSortie_Case08_40negLatitude.bc", TimeRange = { Start = "2019-MAY-25 04:02:43.176", End = "2019-MAY-25 04:54:41.179" }}, - { Name = "Recon_225mSortie_Case11_60negLatitude.bc", TimeRange = { Start = "2019-MAY-25 04:21:46.161", End = "2019-MAY-25 05:18:44.232" }}, - }}, - { Name = "525m_Sortie_v2", Phases = { - { Name = "Recon_525mSortie_Case02_0Latitude.bc", TimeRange = { Start = "2019-MAY-25 04:06:39.220", End = "2019-MAY-25 04:44:17.198" }}, - { Name = "Recon_525mSortie_Case05_20negLatitude.bc", TimeRange = { Start = "2019-MAY-25 04:11:39.201", End = "2019-MAY-25 04:49:37.224" }}, - { Name = "Recon_525mSortie_Case05_NominalProfile.bc", TimeRange = { Start = "2019-MAY-25 03:01:50.184", End = "2019-MAY-25 06:38:50.232" }}, - { Name = "Recon_525mSortie_Case08_NominalProfile.bc", TimeRange = { Start = "2019-MAY-25 03:01:50.184", End = "2019-MAY-25 06:38:50.232" }}, - }}, - }}, -}} \ No newline at end of file diff --git a/data/assets/scene/solarsystem/missions/osirisrex/trail.asset b/data/assets/scene/solarsystem/missions/osirisrex/trail.asset deleted file mode 100644 index b156ee96c6..0000000000 --- a/data/assets/scene/solarsystem/missions/osirisrex/trail.asset +++ /dev/null @@ -1,80 +0,0 @@ -local assetHelper = asset.require('util/asset_helper') -local transforms = asset.require('./transforms') -local sunTransforms = asset.require('scene/solarsystem/sun/transforms') -local earthTransforms = asset.require('scene/solarsystem/planets/earth/transforms') - - - -local BENNU_BODY = "2101955" - -local OsirisRexTrailEarth = { - Identifier = "OsirisRexTrailEarth", - Parent = earthTransforms.EarthIAU.Identifier, - Renderable = { - Type = "RenderableTrailTrajectory", - Translation = { - Type = "SpiceTranslation", - Target = "OSIRIS-REX", - Frame = "IAU_EARTH", - Observer = "EARTH" - }, - Color = { 0.9, 0.9, 0.0 }, - StartTime = "2016 SEP 8 23:05:00.50", - EndTime = "2016 SEP 9 00:05:00", - SampleInterval = 60 - }, - GUI = { - Name = "OSIRIS REx Trail Earth", - Path = "/Solar System/Missions/OSIRIS REx" - } -} - -local OsirisRexTrailSolarSystem = { - Identifier = "OsirisRexTrailSolarSystem", - Parent = sunTransforms.SolarSystemBarycenter.Identifier, - Renderable = { - Type = "RenderableTrailTrajectory", - Translation = { - Type = "SpiceTranslation", - Target = "OSIRIS-REX", - Observer = "SUN" - }, - Color = { 0.2, 0.9, 0.2 }, - StartTime = "2016 SEP 8 23:05:00.50", - EndTime = "2023 SEP 24 12:00:00", - SampleInterval = 3600 - }, - GUI = { - Name = "OSIRIS REx Trail Solar System", - Path = "/Solar System/Missions/OSIRIS REx" - } -} - -local OsirisRexTrailBennu = { - Identifier = "OsirisRexTrailBennu", - Parent = transforms.BennuBarycenter.Identifier, - Renderable = { - Type = "RenderableTrailTrajectory", - Translation = { - Type = "SpiceTranslation", - Target = "OSIRIS-REX", - Observer = BENNU_BODY - }, - Color = { 0.9, 0.2, 0.9 }, - StartTime = "2018 SEP 4 00:00:00", - EndTime = "2023 SEP 24 12:00:00", - SampleInterval = 3600 - }, - GUI = { - Name = "OSIRIS REx Trail Bennu", - Path = "/Solar System/Missions/OSIRIS REx" - } -} - - - -assetHelper.registerSceneGraphNodesAndExport(asset, { - OsirisRexTrailEarth, - OsirisRexTrailSolarSystem, - OsirisRexTrailBennu -}) diff --git a/data/assets/scene/solarsystem/missions/osirisrex/transforms.asset b/data/assets/scene/solarsystem/missions/osirisrex/transforms.asset deleted file mode 100644 index e464ab5e20..0000000000 --- a/data/assets/scene/solarsystem/missions/osirisrex/transforms.asset +++ /dev/null @@ -1,26 +0,0 @@ -local assetHelper = asset.require('util/asset_helper') -local transforms = asset.require('scene/solarsystem/sun/transforms') - - - -local BENNU_BODY = "2101955" - -local BennuBarycenter = { - Identifier = "BennuBarycenter", - Parent = transforms.SolarSystemBarycenter.Identifier, - Transform = { - Translation = { - Type = "SpiceTranslation", - Target = BENNU_BODY, - Observer = "SUN" - } - }, - GUI = { - Name = "Bennu Barycenter", - Path = "/Solar System/Missions/OSIRIS REx" - } -} - - - -assetHelper.registerSceneGraphNodesAndExport(asset, { BennuBarycenter }) diff --git a/data/assets/scene/solarsystem/missions/pioneer/pioneer10.asset b/data/assets/scene/solarsystem/missions/pioneer/pioneer10.asset deleted file mode 100644 index 40ec1f9334..0000000000 --- a/data/assets/scene/solarsystem/missions/pioneer/pioneer10.asset +++ /dev/null @@ -1,75 +0,0 @@ -local assetHelper = asset.require('util/asset_helper') -local sunTransforms = asset.require('scene/solarsystem/sun/transforms') - -local modelFolder = asset.syncedResource({ - Name = "Pioneer 10/11 Models", - Type = "HttpSynchronization", - Identifier = "pioneer_10_11_model", - Version = 2 -}) - -local kernelsFolder = asset.syncedResource({ - Name = "Pioneer Kernels", - Type = "HttpSynchronization", - Identifier = "pioneer_10_spice", - Version = 1 -}) - -local kernelsList = {kernelsFolder .. '/p10-a.bsp'} - -local Pioneer10NAIF = "-23" - -local Pioneer10 = { - Identifier = "Pioneer10", - Parent = sunTransforms.SolarSystemBarycenter.Identifier, - Transform = { - Translation = { - Type = "SpiceTranslation", - Target = Pioneer10NAIF, - Observer = "SUN", - Kernels = kernelsList - }, - }, - Renderable = { - Type = "RenderableModel", - Geometry = { - Type = "MultiModelGeometry", - GeometryFile = modelFolder .. "/Pioneer.obj" - }, - ColorTexture = modelFolder .. "/gray.png", - LightSources = assetHelper.getDefaultLightSources(sunTransforms.SolarSystemBarycenter.Identifier) - }, - GUI = { - Name = "Pioneer 10", - Path = "/Solar System/Missions/Pioneer/10" - } -} - -local Pioneer10Trail = { - Identifier = "Pioneer10Trail", - Parent = sunTransforms.SolarSystemBarycenter.Identifier, - Renderable = { - Type = "RenderableTrailTrajectory", - Translation = { - Type = "SpiceTranslation", - Target = Pioneer10NAIF, - Observer = "SUN", - Kernels = kernelsList - }, - Color = { 0.70, 0.50, 0.20 }, - StartTime = "1972 MAR 03 02:04:00", - EndTime = "1990 JAN 02 00:00:00", - EnableFade = false, - SampleInterval = 6545 * 2 - -- 6545 is the number of days between the Start and End time (aka sample every 2d) - }, - GUI = { - Name = "Pioneer 10 Trail", - Path = "/Solar System/Missions/Pioneer/10" - } -} - -assetHelper.registerSceneGraphNodesAndExport(asset, { - Pioneer10, - Pioneer10Trail, -}) diff --git a/data/assets/scene/solarsystem/missions/pioneer/pioneer11.asset b/data/assets/scene/solarsystem/missions/pioneer/pioneer11.asset deleted file mode 100644 index 2b97f8e720..0000000000 --- a/data/assets/scene/solarsystem/missions/pioneer/pioneer11.asset +++ /dev/null @@ -1,78 +0,0 @@ -local assetHelper = asset.require('util/asset_helper') -local sunTransforms = asset.require('scene/solarsystem/sun/transforms') - -local modelFolder = asset.syncedResource({ - Name = "Pioneer 10/11 Models", - Type = "HttpSynchronization", - Identifier = "pioneer_10_11_model", - Version = 2 -}) - -local kernelsFolder = asset.syncedResource({ - Name = "Pioneer Kernels", - Type = "HttpSynchronization", - Identifier = "pioneer_11_spice", - Version = 1 -}) - -local kernelsList = { - kernelsFolder .. '/p11-a.bsp', - kernelsFolder .. '/p11_sat336.bsp' -} - -local Pioneer11NAIF = "-24" - -local Pioneer11 = { - Identifier = "Pioneer_11", - Parent = sunTransforms.SolarSystemBarycenter.Identifier, - Transform = { - Translation = { - Type = "SpiceTranslation", - Target = Pioneer11NAIF, - Observer = "SUN", - Kernels = kernelsList - }, - }, - Renderable = { - Type = "RenderableModel", - Geometry = { - Type = "MultiModelGeometry", - GeometryFile = modelFolder .. "/Pioneer.obj" - }, - ColorTexture = modelFolder .. "/gray.png", - LightSources = assetHelper.getDefaultLightSources(sunTransforms.SolarSystemBarycenter.Identifier) - }, - GUI = { - Name = "Pioneer 11", - Path = "/Solar System/Missions/Pioneer/11" - } -} - -local Pioneer11Trail = { - Identifier = "Pioneer11Trail", - Parent = sunTransforms.SolarSystemBarycenter.Identifier, - Renderable = { - Type = "RenderableTrailTrajectory", - Translation = { - Type = "SpiceTranslation", - Target = Pioneer11NAIF, - Observer = "SUN", - Kernels = kernelsList - }, - Color = { 0.70, 0.50, 0.20 }, - StartTime = "1973 APR 06 02:25:00.000", - EndTime = "1990 JAN 02 00:00:00.000", - EnableFade = false, - SampleInterval = 6087 * 2 - --6087 is the number of days between the Start and End time (so sample every 2d) - }, - GUI = { - Name = "Pioneer 11 Trail", - Path = "/Solar System/Missions/Pioneer/11" - } -} - -assetHelper.registerSceneGraphNodesAndExport(asset, { - Pioneer11, - Pioneer11Trail, -}) diff --git a/data/assets/scene/solarsystem/missions/rosetta/67p.asset b/data/assets/scene/solarsystem/missions/rosetta/67p.asset deleted file mode 100644 index c5882719df..0000000000 --- a/data/assets/scene/solarsystem/missions/rosetta/67p.asset +++ /dev/null @@ -1,154 +0,0 @@ -local assetHelper = asset.require('util/asset_helper') -local transforms = asset.require('scene/solarsystem/sun/transforms') - - - -local textures = asset.syncedResource({ - Name = "67P Textures", - Type = "HttpSynchronization", - Identifier = "67p_textures", - Version = 2 -}) - -local models = asset.syncedResource({ - Name = "67P Models", - Type = "HttpSynchronization", - Identifier = "67p_models", - Version = 1 -}) - -local images = asset.syncedResource({ - Name = "Rosetta Images", - Type = "HttpSynchronization", - Identifier = "rosettaimages", - Version = 2 -}) - -local imagesDestination = images .. "/images" - -local Barycenter = { - Identifier = "67PBarycenter", - Parent = transforms.SolarSystemBarycenter.Identifier, - Transform = { - Translation = { - Type = "SpiceTranslation", - Target = "CHURYUMOV-GERASIMENKO", - Observer = "SUN" - } - }, - GUI = { - Name = "67P Barycenter", - Path = "/Solar System/Comets/67P Churymov-Gerasimenko" - } -} - -local Comet67P = { - Identifier = "67P", - Parent = Barycenter.Identifier, - Transform = { - Rotation = { - Type = "SpiceRotation", - SourceFrame = "67P/C-G_CK", - DestinationFrame = "GALACTIC" - } - }, - Renderable = { - Type = "RenderableModelProjection", - Geometry = { - Type = "MultiModelGeometry", - GeometryFile = models .. "/67P_rotated_5_130.obj" - }, - ColorTexture = textures .. "/gray.jpg", - Projection = { - Sequence = { imagesDestination }, - SequenceType = "image-sequence", - Observer = "ROSETTA", - Target = "CHURYUMOV-GERASIMENKO", - Aberration = "NONE", - TextureMap = true, - ShadowMap = true, - - DataInputTranslation = { - Instrument = { - NAVCAM = { - DetectorType = "Camera", - Spice = { "ROS_NAVCAM-A" } - }, - }, - Target = { - Read = { - "TARGET_NAME", - "INSTRUMENT_HOST_NAME", - "INSTRUMENT_ID", - "START_TIME", - "STOP_TIME" - }, - Convert = { - CHURYUMOV = { "CHURYUMOV-GERASIMENKO" }, - ROSETTA = { "ROSETTA" }, - ["ROSETTA-ORBITER"] = { "ROSETTA" }, - CHURYUMOVGERASIMENKO11969R1 = { "CHURYUMOV-GERASIMENKO" }, - CHURYUMOVGERASIMENKO = { "CHURYUMOV-GERASIMENKO" }, - ["CHURYUMOV-GERASIMENKO1(1969R1)"] = { "CHURYUMOV-GERASIMENKO" }, - CALIBRATION = { "CALIBRATION" }, - ALPHALYR = { "ALPHALYR" }, - ZETACAS = { "ZETACAS" } - } - } - }, - - Instrument = { - Name = "ROS_NAVCAM-A", - Method = "ELLIPSOID", - Aberration = "NONE", - Fovy = 5.00, - Aspect = 1 - } - }, - - BoundingSphereRadius = 5000.0 - }, - GUI = { - Name = "67P Churymov-Gerasimenko", - Path = "/Solar System/Comets/67P Churymov-Gerasimenko" - } -} - -local Trail67P = { - Identifier = "67PTrail", - Parent = transforms.SolarSystemBarycenter.Identifier, - Renderable = { - Type = "RenderableTrailTrajectory", - Translation = { - Type = "SpiceTranslation", - Target = "CHURYUMOV-GERASIMENKO", - Observer = "SUN" - }, - Color = { 0.1, 0.9, 0.2 }, - StartTime = "2014 JAN 01 00:00:00.000", - EndTime = "2017 JAN 01 00:00:00.000", - SampleInterval = 3600 - }, - GUI = { - Name = "67P Trail", - Path = "/Solar System/Comets/67P Churymov-Gerasimenko" - } -} - -asset.onInitialize(function() - if not openspace.directoryExists(imagesDestination) then - openspace.printInfo("Extracting Rosetta images") - openspace.unzipFile(images .. "/images_v1_v2.zip", imagesDestination, true) - end -end) - - - -assetHelper.registerSceneGraphNodesAndExport(asset, { - Barycenter, - Comet67P, - Trail67P -}) - -asset.export("Barycenter", Barycenter) -asset.export("Comet67P", Comet67P) \ No newline at end of file diff --git a/data/assets/scene/solarsystem/missions/rosetta/rosetta.asset b/data/assets/scene/solarsystem/missions/rosetta/rosetta.asset deleted file mode 100644 index cac99bdd49..0000000000 --- a/data/assets/scene/solarsystem/missions/rosetta/rosetta.asset +++ /dev/null @@ -1,543 +0,0 @@ -local assetHelper = asset.require('util/asset_helper') -local sunTransforms = asset.require('scene/solarsystem/sun/transforms') -local transforms = asset.require('./67p') - - - -local textures = asset.syncedResource({ - Name = "Rosetta Textures", - Type = "HttpSynchronization", - Identifier = "rosetta_textures", - Version = 2 -}) - -local models = asset.syncedResource({ - Name = "Rosetta Models", - Type = "HttpSynchronization", - Identifier = "rosetta_model", - Version = 3 -}) - -local kernels = asset.syncedResource({ - Name = "Rosetta Kernels", - Type = "HttpSynchronization", - Identifier = "rosetta_kernels", - Version = 1 -}) - -local RosettaKernels = { - kernels .. "/ROS_160718_STEP.TSC", - kernels .. "/ros_triv.tsc", - - kernels .. "/CORB_DV_243_01___T19_00325.BSP", - kernels .. "/CORB_DV_223_01___T19_00302.BSP", - kernels .. "/CORB_DV_145_01___T19_00216.BSP", - - kernels .. "/LORB_DV_236_01___T19_00318.BSP", - kernels .. "/LORB_DV_223_01___T19_00302.BSP", - kernels .. "/LORB_DV_145_01___T19_00216.BSP", - - kernels .. "/RORB_DV_243_01___T19_00325.BSP", - kernels .. "/RORB_DV_223_01___T19_00302.BSP", - kernels .. "/RORB_DV_145_01___T19_00216.BSP", - - kernels .. "/ATNR_P040302093352_00127.BC", - - kernels .. "/ROS_STRUCT_V5.BSP", - - kernels .. "/ROS_NAVCAM_V01.TI", - - kernels .. "/ROS_CHURYUMOV_V01.TF", - kernels .. "/ROS_V26.TF", - - -- CK - -- Rosetta attitude - kernels .. "/RATT_DV_243_01_01____00325.BC", - kernels .. "/RATT_DV_223_01_01____00302.BC", - kernels .. "/RATT_DV_145_01_01____00216.BC", - - -- Comet attitude - kernels .. "/CATT_DV_243_01_______00325.BC", - kernels .. "/CATT_DV_223_01_______00302.BC", - kernels .. "/CATT_DV_145_01_______00216.BC", - - -- High gain antenna - kernels .. "/ROS_HGA_2016_V0035.BC", - kernels .. "/ROS_HGA_2015_V0053.BC", - kernels .. "/ROS_HGA_2014_V0044.BC", - - -- Solar arrays - kernels .. "/ROS_SA_2016_V0034.BC", - kernels .. "/ROS_SA_2015_V0042.BC", - kernels .. "/ROS_SA_2014_V0047.BC", - - - kernels .. "/ROS_CGS_RSOC_V03.TPC" -} - -local LightSources = { - { - Type = "SceneGraphLightSource", - Identifier = "Sun", - Node = sunTransforms.SolarSystemBarycenter.Identifier, - Intensity = 1.0 - }, - { - Identifier = "Camera", - Type = "CameraLightSource", - Intensity = 0.5 - } -} - -local RotationMatrix = { - 0, 1, 0, - 0, 0, 1, - 1, 0, 0 -} - -local Rosetta = { - Identifier = "Rosetta", - Parent = sunTransforms.SolarSystemBarycenter.Identifier, - Transform = { - Translation = { - Type = "SpiceTranslation", - Target = "ROSETTA", - Observer = "SUN", - Kernels = RosettaKernels - }, - Rotation = { - Type = "SpiceRotation", - SourceFrame = "ROS_SPACECRAFT", - DestinationFrame = "GALACTIC" - } - }, - GUI = { - Path = "/Solar System/Missions/Rosetta" - } -} - -local RosettaModel = { - Identifier = "RosettaModel", - Parent = Rosetta.Identifier, - Transform = { - Scale = { - Type = "StaticScale", - -- The scale of the model is in cm; OpenSpace is in m - Scale = 0.01 - } - }, - GUI = { - Name = "Rosetta Model", - Path = "/Solar System/Missions/Rosetta" - } -} - -local RosettaBlackFoil = { - Identifier = "Rosetta_black_foil", - Parent = RosettaModel.Identifier, - Renderable = { - Type = "RenderableModel", - Body = "ROSETTA", - Geometry = { - Type = "MultiModelGeometry", - GeometryFile = models .. "/black_foil.obj" - }, - ColorTexture = textures .. "/foil_silver_ramp.png", - ModelTransform = RotationMatrix, - LightSources = LightSources - }, - GUI = { - Name = "Rosetta Model Part Black Foil", - Path = "/Solar System/Missions/Rosetta" - } -} - -local RosettaBlackParts = { - Identifier = "Rosetta_black_parts", - Parent = RosettaModel.Identifier, - Renderable = { - Type = "RenderableModel", - Body = "ROSETTA", - Geometry = { - Type = "MultiModelGeometry", - GeometryFile = models .. "/black_parts.obj" - }, - ColorTexture = textures .. "/foil_silver_ramp.png", - ModelTransform = RotationMatrix, - LightSources = LightSources - }, - GUI = { - Name = "Rosetta Model Part Black Parts", - Path = "/Solar System/Missions/Rosetta" - } -} - -local RosettaDish = { - Identifier = "Rosetta_dish", - Parent = RosettaModel.Identifier, - Renderable = { - Type = "RenderableModel", - Body = "ROSETTA", - Geometry = { - Type = "MultiModelGeometry", - GeometryFile = models .. "/dish.obj" - }, - ColorTexture = textures .. "/dish_AO.png", - ModelTransform = RotationMatrix, - LightSources = LightSources - }, - GUI = { - Name = "Rosetta Model Part Dish", - Path = "/Solar System/Missions/Rosetta" - } -} - -local RosettaParts = { - Identifier = "Rosetta_parts", - Parent = RosettaModel.Identifier, - Renderable = { - Type = "RenderableModel", - Body = "ROSETTA", - Geometry = { - Type = "MultiModelGeometry", - GeometryFile = models .. "/parts.obj" - }, - ColorTexture = textures .. "/parts2_AO.png", - ModelTransform = RotationMatrix, - LightSources = LightSources - }, - GUI = { - Name = "Rosetta Model Part Parts", - Path = "/Solar System/Missions/Rosetta" - } -} - -local RosettaSilverFoil = { - Identifier = "Rosetta_silver_foil", - Parent = RosettaModel.Identifier, - Renderable = { - Type = "RenderableModel", - Body = "ROSETTA", - Geometry = { - Type = "MultiModelGeometry", - GeometryFile = models .. "/silver_foil.obj" - }, - ColorTexture = textures .. "/foil_silver_ramp.png", - ModelTransform = RotationMatrix, - LightSources = LightSources - }, - GUI = { - Name = "Rosetta Model Part Silver Foil", - Path = "/Solar System/Missions/Rosetta" - } -} - -local RosettaVents = { - Identifier = "Rosetta_vents", - Parent = RosettaModel.Identifier, - Renderable = { - Type = "RenderableModel", - Body = "ROSETTA", - Geometry = { - Type = "MultiModelGeometry", - GeometryFile = models .. "/vents.obj" - }, - ColorTexture = textures .. "/tex_01.png", - ModelTransform = RotationMatrix, - LightSources = LightSources - }, - GUI = { - Name = "Rosetta Model Part Vents", - Path = "/Solar System/Missions/Rosetta" - } -} - -local RosettaWingA = { - Identifier = "Rosetta_wing_a", - Parent = RosettaModel.Identifier, - Renderable = { - Type = "RenderableModel", - Body = "ROSETTA", - Geometry = { - Type = "MultiModelGeometry", - GeometryFile = models .."/wingA.obj" - }, - ColorTexture = textures .. "/tex_01.png", - ModelTransform = RotationMatrix, - LightSources = LightSources - }, - GUI = { - Name = "Rosetta Model Part Wing A", - Path = "/Solar System/Missions/Rosetta" - } -} - -local RosettaWingB = { - Identifier = "Rosetta_wing_b", - Parent = RosettaModel.Identifier, - Renderable = { - Type = "RenderableModel", - Body = "ROSETTA", - Geometry = { - Type = "MultiModelGeometry", - GeometryFile = models .. "/wingB.obj" - }, - ColorTexture = textures .. "/tex_01.png", - ModelTransform = RotationMatrix, - LightSources = LightSources - }, - GUI = { - Name = "Rosetta Model Part Wing B", - Path = "/Solar System/Missions/Rosetta" - } -} - -local RosettaYellowFoil = { - Identifier = "Rosetta_yellow_foil", - Parent = RosettaModel.Identifier, - Renderable = { - Type = "RenderableModel", - Body = "ROSETTA", - Geometry = { - Type = "MultiModelGeometry", - GeometryFile = models .. "/yellow_foil.obj" - }, - ColorTexture = textures .. "/foil_gold_ramp.png", - ModelTransform = RotationMatrix, - LightSources = LightSources - }, - GUI = { - Name = "Rosetta Model Part Yellow Foil", - Path = "/Solar System/Missions/Rosetta" - } -} - -local Philae = { - Identifier = "Philae", - Parent = transforms.Barycenter.Identifier, - -- This should need a transform, but currently the model is intrinsically - -- translated - Transform = { - Translation = { - Type = "SpiceTranslation", - Target = "PHILAE", - Observer = "CHURYUMOV-GERASIMENKO", - Kernels = RosettaKernels - }, - Rotation = { - Type = "SpiceRotation", - SourceFrame = "ROS_SPACECRAFT", - DestinationFrame = "GALACTIC", - }, - Scale = { - Type = "StaticScale", - -- The scale of the model is in cm; OpenSpace is in m - Scale = 0.01 - } - }, - GUI = { - Name = "Philae Model", - Path = "/Solar System/Missions/Rosetta" - } -} - -local PhilaeFoil = { - Identifier = "Philae_foil", - Parent = Philae.Identifier, - Renderable = { - Type = "RenderableModel", - Body = "ROSETTA", - Geometry = { - Type = "MultiModelGeometry", - GeometryFile = models .. "/lander_foil.obj" - }, - ColorTexture = textures .. "/foil_silver_ramp.png", - ModelTransform = RotationMatrix, - LightSources = LightSources - }, - GUI = { - Name = "Philae Model Part Foil", - Path = "/Solar System/Missions/Rosetta" - } -} - -local PhilaeLids = { - Identifier = "Philae_lids", - Parent = Philae.Identifier, - Renderable = { - Type = "RenderableModel", - Body = "ROSETTA", - Geometry = { - Type = "MultiModelGeometry", - GeometryFile = models .. "/lander_lids.obj" - }, - ColorTexture = textures .. "/parts2_AO.png", - ModelTransform = RotationMatrix, - LightSources = LightSources - }, - GUI = { - Name = "Philae Model Part Lids", - Path = "/Solar System/Missions/Rosetta" - } -} - -local PhilaeParts = { - Identifier = "Philae_parts", - Parent = Philae.Identifier, - Renderable = { - Type = "RenderableModel", - Body = "ROSETTA", - Geometry = { - Type = "MultiModelGeometry", - GeometryFile = models .. "/lander_parts.obj" - }, - ColorTexture = textures .. "/foil_silver_ramp.png", - ModelTransform = RotationMatrix, - LightSources = LightSources - }, - GUI = { - Name = "Philae Model Part Parts", - Path = "/Solar System/Missions/Rosetta" - } -} - -local PhilaeSolarPanels = { - Identifier = "Philae_solarp", - Parent = Philae.Identifier, - Renderable = { - Type = "RenderableModel", - Body = "ROSETTA", - Geometry = { - Type = "MultiModelGeometry", - GeometryFile = models .. "/lander_solarp.obj" - }, - ColorTexture = textures .. "/tex_01.png", - ModelTransform = RotationMatrix, - LightSources = LightSources - }, - GUI = { - Name = "Philae Model Parts Solar Panels", - Path = "/Solar System/Missions/Rosetta" - } -} - -local NavCam = { - Identifier = "NAVCAM", - Parent = Rosetta.Identifier, - GUI = { - Path = "/Solar System/Missions/Rosetta/Instruments" - } -} - -local NavCamFov = { - Identifier = "NAVCAM_FOV", - Parent = NavCam.Identifier, - Renderable = { - Type = "RenderableFov", - Body = "ROSETTA", - Frame = "ROS_NAVCAM-A", - RGB = { 0.8, 0.7, 0.7 }, - Instrument = { - Name = "ROS_NAVCAM-A", - Method = "ELLIPSOID", - Aberration = "NONE" - }, - PotentialTargets = { "CHURYUMOV-GERASIMENKO" }, - FrameConversions = { - ["CHURYUMOV-GERASIMENKO"] = "67P/C-G_CK" - } - }, - GUI = { - Name = "NAVCAM FOV", - Path = "/Solar System/Missions/Rosetta/Instruments" - } -} - -local ImagePlane = { - Identifier = "ImagePlaneRosetta", - Parent = transforms.Comet67P.Identifier, - Renderable = { - Type = "RenderablePlaneProjection", - Frame = "67P/C-G_CK", - DefaultTarget = "CHURYUMOV-GERASIMENKO", - Spacecraft = "ROSETTA", - Instrument = "ROS_NAVCAM-A", - Moving = false, - Texture = textures .. "/defaultProj.png" - }, - GUI = { - Name = "Rosetta Image Plane", - Path = "/Solar System/Missions/Rosetta" - } -} - -local RosettaCometTrail = { - Identifier = "RosettaCometTrail", - Parent = transforms.Barycenter.Identifier, - Renderable = { - Type = "RenderableTrailTrajectory", - Translation = { - Type = "SpiceTranslation", - Target = "ROSETTA", - Observer = "CHURYUMOV-GERASIMENKO" - }, - Color = { 0.288, 0.375, 0.934 }, - StartTime = "2014 AUG 01 12:00:00", - EndTime = "2016 SEP 30 12:00:00", - SampleInterval = 3600 - }, - GUI = { - Name = "Rosetta Comet Trail", - Path = "/Solar System/Missions/Rosetta" - } -} - -local PhilaeTrail = { - Identifier = "PhilaeTrail", - Parent = transforms.Barycenter.Identifier, - Renderable = { - Type = "RenderableTrailTrajectory", - Translation = { - Type = "SpiceTranslation", - Target = "PHILAE", - Observer = "CHURYUMOV-GERASIMENKO" - }, - Color = { 0.8, 0.5, 1.0 }, - StartTime = "2014 NOV 12 08:35:00", - EndTime = "2014 NOV 12 17:00:00", - SampleInterval = 2 - }, - GUI = { - Name = "Philae Trail", - Path = "/Solar System/Missions/Rosetta" - } -} - - - -assetHelper.registerSceneGraphNodesAndExport(asset, { - Rosetta, - RosettaModel, - RosettaBlackFoil, - RosettaBlackParts, - RosettaDish, - RosettaParts, - RosettaSilverFoil, - RosettaVents, - RosettaWingA, - RosettaWingB, - RosettaYellowFoil, - - NavCam, - NavCamFov, - ImagePlane, - - Philae, - PhilaeFoil, - PhilaeLids, - PhilaeParts, - PhilaeSolarPanels, - - RosettaCometTrail, - PhilaeTrail -}) diff --git a/data/assets/scene/solarsystem/missions/voyager/voyager1.asset b/data/assets/scene/solarsystem/missions/voyager/voyager1.asset deleted file mode 100644 index f206b8a6b4..0000000000 --- a/data/assets/scene/solarsystem/missions/voyager/voyager1.asset +++ /dev/null @@ -1,239 +0,0 @@ -local assetHelper = asset.require('util/asset_helper') -local sunTransforms = asset.require('scene/solarsystem/sun/transforms') - - - -local models = asset.syncedResource({ - Name = "Voyager 1 Models", - Type = "HttpSynchronization", - Identifier = "voyager1_model", - Version = 1 -}) - -local kernels = asset.syncedResource({ - Name = "Voyager 1 Kernels", - Type = "HttpSynchronization", - Identifier = "voyager1_spice", - Version = 1 -}) - -local Kernels = { - kernels .. '/vg1_v02.tf', - kernels .. '/vg100019.tsc', - kernels .. '/Voyager_1.a54206u_V0.2_merged.bsp', - kernels .. '/voyager_1.ST+1991_a54418u.merged.bsp', - kernels .. '/vgr1_jup230.bsp', - kernels .. '/vgr1_sat337.bsp', - kernels .. '/vgr1_super.bc', - kernels .. '/vgr1_super_v2.bc' -} - -local RotationMatrix = { - -1, 0, 0, - 0, 0, -1, - 0, -1, 0 -} - -local LightSources = { - { - Type = "SceneGraphLightSource", - Identifier = "Sun", - Node = sunTransforms.SolarSystemBarycenter.Identifier, - Intensity = 1.0 - }, - { - Identifier = "Camera", - Type = "CameraLightSource", - Intensity = 0.5 - } -} - -local Voyager1 = { - Identifier = "Voyager_1", - Parent = sunTransforms.SolarSystemBarycenter.Identifier, - Transform = { - Translation = { - Type = "SpiceTranslation", - Target = "VOYAGER 1", - Observer = "SUN", - Kernels = Kernels - }, - Rotation = { - Type = "SpiceRotation", - SourceFrame = "VG1_SC_BUS", - DestinationFrame = "GALACTIC" - } - }, - GUI = { - Name = "Voyager 1", - Path = "/Solar System/Missions/Voyager 1" - } -} - -local Voyager1Main = { - Identifier = "Voyager_1_Main", - Parent = Voyager1.Identifier, - Renderable = { - Type = "RenderableModel", - Geometry = { - Type = "MultiModelGeometry", - GeometryFile = models .. "/voyager-main.obj" - }, - ColorTexture = models .. "/voyager-main.jpg", - ModelTransform = RotationMatrix, - LightSources = LightSources - }, - GUI = { - Name = "Voyager 1 Main", - Path = "/Solar System/Missions/Voyager 1" - } -} - -local Voyager1Antenna = { - Identifier = "Voyager_1_Antanna", - Parent = Voyager1.Identifier, - Renderable = { - Type = "RenderableModel", - Geometry = { - Type = "MultiModelGeometry", - GeometryFile = models .. "/voyager-antenna.obj" - }, - ColorTexture = models .. "/voyager-antenna.png", - ModelTransform = RotationMatrix, - LightSources = LightSources - }, - GUI = { - Name = "Voyager 1 Antanna", - Path = "/Solar System/Missions/Voyager 1" - } -} - - -- The trails are organized as follows. The cruise phases can be resolved in relatively - -- low resolution since they are just straight lines - -- The encounter phases should be much higher resolution or otherwise artifacts would appear -local VoyagerTrailCruiseEarthJupiter = { - Identifier = "Voyager_1_Trail_Cruise_Earth_Jupiter", - Parent = sunTransforms.SolarSystemBarycenter.Identifier, - Renderable = { - Type = "RenderableTrailTrajectory", - Translation = { - Type = "SpiceTranslation", - Target = "VOYAGER 1", - Observer = "SUN", - Kernels = Kernels - }, - Color = { 0.70, 0.50, 0.20 }, - StartTime = "1977 SEP 05", - EndTime = "1979 MAR 04", - SampleInterval = 545 * 2 -- 545 is the number of days between the Start and End time - }, - GUI = { - Name = "Voyager 1 Trail Cruise Earth-Jupiter", - Path = "/Solar System/Missions/Voyager 1" - } -} - -local VoyagerTrailEncounterJupiter = { - Identifier = "Voyager_1_Trail_Encounter_Jupiter", - Parent = sunTransforms.SolarSystemBarycenter.Identifier, - Renderable = { - Type = "RenderableTrailTrajectory", - Translation = { - Type = "SpiceTranslation", - Target = "VOYAGER 1", - Observer = "SUN", - Kernels = Kernels - }, - Color = { 0.70, 0.50, 0.20 }, - EnableFade = false, - StartTime = "1979 MAR 03 23:24:00", -- @TODO: Probably an off-by-one bug in RenderableTrailTrajectory? - EndTime = "1979 MAR 09", - SampleInterval = 100 - }, - GUI = { - Name = "Voyager 1 Trail Encounter Jupiter", - Path = "/Solar System/Missions/Voyager 1" - } -} - -local VoyagerTrailCruiseJupiterSaturn = { - Identifier = "Voyager_1_Trail_Cruise_Jupiter_Saturn", - Parent = sunTransforms.SolarSystemBarycenter.Identifier, - Renderable = { - Type = "RenderableTrailTrajectory", - Translation = { - Type = "SpiceTranslation", - Target = "VOYAGER 1", - Observer = "SUN", - Kernels = Kernels - }, - EnableFade = false, - Color = { 0.70, 0.50, 0.20 }, - StartTime = "1979 MAR 09", - EndTime = "1980 NOV 11", - SampleInterval = 618 * 2 -- 618 is the number of days between the Start and End time - }, - GUI = { - Name = "Voyager 1 Trail Cruise Jupiter-Saturn", - Path = "/Solar System/Missions/Voyager 1" - } -} - -local VoyagerTrailEncounterSaturn = { - Identifier = "Voyager_1_Trail_Encounter_Saturn", - Parent = sunTransforms.SolarSystemBarycenter.Identifier, - Renderable = { - Type = "RenderableTrailTrajectory", - Translation = { - Type = "SpiceTranslation", - Target = "VOYAGER 1", - Observer = "SUN", - Kernels = Kernels - }, - EnableFade = false, - Color = { 0.70, 0.50, 0.20 }, - StartTime = "1980 NOV 10 23:08:30", -- @TODO: Probably an off-by-one bug in RenderableTrailTrajectory? - EndTime = "1980 NOV 16", - SampleInterval = 100 - }, - GUI = { - Name = "Voyager 1 Trail Encounter Saturn", - Path = "/Solar System/Missions/Voyager 1" - } -} - -local VoyagerTrailCruiseSaturnInf = { - Identifier = "Voyager_1_Trail_Cruise_Saturn_Inf", - Parent = sunTransforms.SolarSystemBarycenter.Identifier, - Renderable = { - Type = "RenderableTrailTrajectory", - Translation = { - Type = "SpiceTranslation", - Target = "VOYAGER 1", - Observer = "SUN", - Kernels = Kernels - }, - EnableFade = false, - Color = { 0.70, 0.50, 0.20 }, - StartTime = "1980 NOV 16", - EndTime = "2021 JAN 01", - SampleInterval = 14656 * 2 -- 14656 is the number of days between the Start and End time - }, - GUI = { - Name = "Voyager 1 Trail Cruise Saturn-Inf", - Path = "/Solar System/Missions/Voyager 1" - } -} - - - -assetHelper.registerSceneGraphNodesAndExport(asset, { - Voyager1, - Voyager1Main, - Voyager1Antenna, - VoyagerTrailCruiseEarthJupiter, - VoyagerTrailEncounterJupiter, - VoyagerTrailCruiseJupiterSaturn, - VoyagerTrailEncounterSaturn, - VoyagerTrailCruiseSaturnInf -}) diff --git a/data/assets/scene/solarsystem/missions/voyager/voyager2.asset b/data/assets/scene/solarsystem/missions/voyager/voyager2.asset deleted file mode 100644 index 36f3d74089..0000000000 --- a/data/assets/scene/solarsystem/missions/voyager/voyager2.asset +++ /dev/null @@ -1,338 +0,0 @@ -local assetHelper = asset.require('util/asset_helper') -local sunTransforms = asset.require('scene/solarsystem/sun/transforms') - - - -local models = asset.syncedResource({ - Name = "Voyager 2 Models", - Type = "HttpSynchronization", - Identifier = "voyager2_model", - Version = 1 -}) - -local kernels = asset.syncedResource({ - Name = "Voyager 2 Kernels", - Type = "HttpSynchronization", - Identifier = "voyager2_spice", - Version = 1 -}) - -local Kernels = { - kernels .. '/vg2_v02.tf', - kernels .. '/vg200022.tsc', - kernels .. '/Voyager_2.m05016u.merged.bsp', - kernels .. '/voyager_2.ST+1992_m05208u.merged.bsp', - kernels .. '/vgr2_jup230.bsp', - kernels .. '/vgr2_sat337.bsp', - kernels .. '/vgr2_ura083.bsp', - kernels .. '/vgr2_nep081.bsp', - kernels .. '/vgr2_super.bc', - kernels .. '/vgr2_super_v2.bc' -} - -local RotationMatrix = { - -1, 0, 0, - 0, 0, -1, - 0, -1, 0 -} - - -local LightSources = { - { - Type = "SceneGraphLightSource", - Identifier = "Sun", - Node = sunTransforms.SolarSystemBarycenter.Identifier, - Intensity = 1.0 - }, - { - Identifier = "Camera", - Type = "CameraLightSource", - Intensity = 0.5 - } -} - -local Voyager2 = { - Identifier = "Voyager_2", - Parent = sunTransforms.SolarSystemBarycenter.Identifier, - Transform = { - Translation = { - Type = "SpiceTranslation", - Target = "VOYAGER 2", - Observer = "SUN", - Kernels = Kernels - }, - Rotation = { - Type = "SpiceRotation", - SourceFrame = "VG2_SC_BUS", - DestinationFrame = "GALACTIC" - } - }, - GUI = { - Name = "Voyager 2", - Path = "/Solar System/Missions/Voyager 2" - } -} - -local Voyager2Main = { - Identifier = "Voyager_2_Main", - Parent = Voyager2.Identifier, - Renderable = { - Type = "RenderableModel", - Geometry = { - Type = "MultiModelGeometry", - GeometryFile = models .. "/voyager-main.obj" - }, - ColorTexture = models .. "/voyager-main.jpg", - ModelTransform = RotationMatrix, - LightSources = LightSources - }, - GUI = { - Name = "Voyager 2 Main", - Path = "/Solar System/Missions/Voyager 2" - } -} - -local Voyager2Antenna = { - Identifier = "Voyager_2_Antanna", - Parent = Voyager2.Identifier, - Renderable = { - Type = "RenderableModel", - Geometry = { - Type = "MultiModelGeometry", - GeometryFile = models .. "/voyager-antenna.obj" - }, - ColorTexture = models .. "/voyager-antenna.png", - ModelTransform = RotationMatrix, - LightSources = LightSources - }, - GUI = { - Name = "Voyager 2 Antanna", - Path = "/Solar System/Missions/Voyager 2" - } -} - - -- The trails are organized as follows. The cruise phases can be resolved in relatively - -- low resolution since they are just straight lines - -- The encounter phases should be much higher resolution or otherwise artifacts would appear -local VoyagerTrailCruiseEarthJupiter = { - Identifier = "Voyager_2_Trail_Cruise_Earth_Jupiter", - Parent = sunTransforms.SolarSystemBarycenter.Identifier, - Renderable = { - Type = "RenderableTrailTrajectory", - Translation = { - Type = "SpiceTranslation", - Target = "VOYAGER 2", - Observer = "SUN", - Kernels = Kernels - }, - Color = { 0.70, 0.50, 0.20 }, - StartTime = "1977 SEP 05", - EndTime = "1979 JUL 06", - SampleInterval = 669 * 2 -- 669 is the number of days between the Start and End time - }, - GUI = { - Name = "Voyager 2 Trail Cruise Earth-Jupiter", - Path = "/Solar System/Missions/Voyager 2" - } -} - -local VoyagerTrailEncounterJupiter = { - Identifier = "Voyager_2_Trail_Encounter_Jupiter", - Parent = sunTransforms.SolarSystemBarycenter.Identifier, - Renderable = { - Type = "RenderableTrailTrajectory", - Translation = { - Type = "SpiceTranslation", - Target = "VOYAGER 2", - Observer = "SUN", - Kernels = Kernels - }, - Color = { 0.70, 0.50, 0.20 }, - EnableFade = false, - StartTime = "1979 JUL 05 23:24:00", -- @TODO: Probably an off-by-one bug in RenderableTrailTrajectory? - EndTime = "1979 JUL 15", - SampleInterval = 100 - }, - GUI = { - Name = "Voyager 2 Trail Encounter Jupiter", - Path = "/Solar System/Missions/Voyager 2" - } -} - -local VoyagerTrailCruiseJupiterSaturn = { - Identifier = "Voyager_2_Trail_Cruise_Jupiter_Saturn", - Parent = sunTransforms.SolarSystemBarycenter.Identifier, - Renderable = { - Type = "RenderableTrailTrajectory", - Translation = { - Type = "SpiceTranslation", - Target = "VOYAGER 2", - Observer = "SUN", - Kernels = Kernels - }, - EnableFade = false, - Color = { 0.70, 0.50, 0.20 }, - StartTime = "1979 JUL 15", - EndTime = "1981 AUG 23", - SampleInterval = 770 * 2 -- 770 is the number of days between the Start and End time - }, - GUI = { - Name = "Voyager 2 Trail Cruise Jupiter-Saturn", - Path = "/Solar System/Missions/Voyager 2" - } -} - -local VoyagerTrailEncounterSaturn = { - Identifier = "Voyager_2_Trail_Encounter_Saturn", - Parent = sunTransforms.SolarSystemBarycenter.Identifier, - Renderable = { - Type = "RenderableTrailTrajectory", - Translation = { - Type = "SpiceTranslation", - Target = "VOYAGER 2", - Observer = "SUN", - Kernels = Kernels - }, - EnableFade = false, - Color = { 0.70, 0.50, 0.20 }, - StartTime = "1981 AUG 22 23:08:30", -- @TODO: Probably an off-by-one bug in RenderableTrailTrajectory? - EndTime = "1981 AUG 30", - SampleInterval = 100 - }, - GUI = { - Name = "Voyager 2 Trail Encounter Saturn", - Path = "/Solar System/Missions/Voyager 2" - } -} - -local VoyagerTrailCruiseSaturnUranus = { - Identifier = "Voyager_2_Trail_Cruise_Saturn_Uranus", - Parent = sunTransforms.SolarSystemBarycenter.Identifier, - Renderable = { - Type = "RenderableTrailTrajectory", - Translation = { - Type = "SpiceTranslation", - Target = "VOYAGER 2", - Observer = "SUN", - Kernels = Kernels - }, - EnableFade = false, - Color = { 0.70, 0.50, 0.20 }, - StartTime = "1981 AUG 30", - EndTime = "1986 JAN 22", - SampleInterval = 1971 * 2 -- 1971 is the number of days between the Start and End time - }, - GUI = { - Name = "Voyager 2 Trail Cruise Saturn-Uranus", - Path = "/Solar System/Missions/Voyager 2" - } -} - -local VoyagerTrailEncounterUranus = { - Identifier = "Voyager_2_Trail_Encounter_Uranus", - Parent = sunTransforms.SolarSystemBarycenter.Identifier, - Renderable = { - Type = "RenderableTrailTrajectory", - Translation = { - Type = "SpiceTranslation", - Target = "VOYAGER 2", - Observer = "SUN", - Kernels = Kernels - }, - EnableFade = false, - Color = { 0.70, 0.50, 0.20 }, - StartTime = "1986 JAN 21 23:30:00", -- @TODO: Probably an off-by-one bug in RenderableTrailTrajectory? - EndTime = "1986 JAN 27", - SampleInterval = 100 - }, - GUI = { - Name = "Voyager 2 Trail Encounter Uranus", - Path = "/Solar System/Missions/Voyager 2" - } -} - -local VoyagerTrailCruiseUranusNeptune = { - Identifier = "Voyager_2_Trail_Cruise_Uranus_Neptune", - Parent = sunTransforms.SolarSystemBarycenter.Identifier, - Renderable = { - Type = "RenderableTrailTrajectory", - Translation = { - Type = "SpiceTranslation", - Target = "VOYAGER 2", - Observer = "SUN", - Kernels = Kernels - }, - EnableFade = false, - Color = { 0.70, 0.50, 0.20 }, - StartTime = "1986 JAN 27", - EndTime = "1989 AUG 24", - SampleInterval = 1305 * 2 -- 1305 is the number of days between the Start and End time - }, - GUI = { - Name = "Voyager 2 Trail Cruise Uranus-Neptune", - Path = "/Solar System/Missions/Voyager 2" - } -} - -local VoyagerTrailEncounterNeptune = { - Identifier = "Voyager_2_Trail_Encounter_Neptune", - Parent = sunTransforms.SolarSystemBarycenter.Identifier, - Renderable = { - Type = "RenderableTrailTrajectory", - Translation = { - Type = "SpiceTranslation", - Target = "VOYAGER 2", - Observer = "SUN", - Kernels = Kernels - }, - EnableFade = false, - Color = { 0.70, 0.50, 0.20 }, - StartTime = "1989 AUG 23 23:30:00", -- @TODO: Probably an off-by-one bug in RenderableTrailTrajectory? - EndTime = "1989 AUG 26", - SampleInterval = 100 - }, - GUI = { - Name = "Voyager 2 Trail Encounter Neptune", - Path = "/Solar System/Missions/Voyager 2" - } -} - -local VoyagerTrailCruiseNeptuneInf = { - Identifier = "Voyager_2_Trail_Cruise_Neptune_Inf", - Parent = sunTransforms.SolarSystemBarycenter.Identifier, - Renderable = { - Type = "RenderableTrailTrajectory", - Translation = { - Type = "SpiceTranslation", - Target = "VOYAGER 2", - Observer = "SUN", - Kernels = Kernels - }, - EnableFade = false, - Color = { 0.70, 0.50, 0.20 }, - StartTime = "1989 AUG 26", - EndTime = "2021 JAN 01", - SampleInterval = 11451 * 2 -- 11451 is the number of days between the Start and End time - }, - GUI = { - Name = "Voyager 2 Trail Cruise Neptune-Inf", - Path = "/Solar System/Missions/Voyager 2" - } -} - - - -assetHelper.registerSceneGraphNodesAndExport(asset, { - Voyager2, - Voyager2Main, - Voyager2Antenna, - VoyagerTrailCruiseEarthJupiter, - VoyagerTrailEncounterJupiter, - VoyagerTrailCruiseJupiterSaturn, - VoyagerTrailEncounterSaturn, - VoyagerTrailCruiseSaturnUranus, - VoyagerTrailEncounterUranus, - VoyagerTrailCruiseUranusNeptune, - VoyagerTrailEncounterNeptune, - VoyagerTrailCruiseNeptuneInf -}) diff --git a/include/openspace/rendering/framebufferrenderer.h b/include/openspace/rendering/framebufferrenderer.h index fa7b7e1756..39d8583971 100644 --- a/include/openspace/rendering/framebufferrenderer.h +++ b/include/openspace/rendering/framebufferrenderer.h @@ -128,23 +128,17 @@ public: void updateRaycastData(); void updateDeferredcastData(); void updateHDRAndFiltering(); - void updateMSAASamplingPattern(); - + void setResolution(glm::ivec2 res) override; void setNAaSamples(int nAaSamples) override; void setHDRExposure(float hdrExposure) override; void setGamma(float gamma) override; - void setMaxWhite(float maxWhite) override; - void setToneMapOperator(int tmOp) override; void setHue(float hue) override; void setValue(float value) override; void setSaturation(float sat) override; - void setLightness(float lightness) override; - void setColorSpace(unsigned int colorspace) override; - + int nAaSamples() const override; - const std::vector& mSSAPattern() const override; - + void update() override; void performRaycasterTasks(const std::vector& tasks); void performDeferredTasks(const std::vector& tasks); @@ -181,8 +175,7 @@ private: UniformCache(mainColorTexture, blackoutFactor, nAaSamples) _uniformCache; UniformCache(hdrFeedingTexture, blackoutFactor, hdrExposure, gamma, - toneMapOperator, maxWhite, Hue, Saturation, Value, - Lightness, colorSpace, nAaSamples) _hdrUniformCache; + Hue, Saturation, Value, nAaSamples) _hdrUniformCache; GLint _defaultFBO; GLuint _screenQuad; @@ -204,20 +197,14 @@ private: glm::ivec2 _resolution = glm::ivec2(0); int _nAaSamples; + float _hdrExposure = 3.7f; float _gamma = 0.95f; float _maxWhite = 5.0f; - int _toneMapOperator = 8; - bool _histogramEnabled = false; float _hue = 1.f; - float _saturation = 1.2f; + float _saturation = 1.f; float _value = 1.f; - float _lightness = 1.1f; - unsigned int _colorSpace = 1; - - std::vector _mSAAPattern; - std::vector _histoPoints; - + ghoul::Dictionary _rendererData; }; diff --git a/include/openspace/rendering/renderengine.h b/include/openspace/rendering/renderengine.h index 09dc55e09b..56caf5a961 100644 --- a/include/openspace/rendering/renderengine.h +++ b/include/openspace/rendering/renderengine.h @@ -65,26 +65,6 @@ public: Invalid }; - // The next enum should be synchronized with the - // defines in hdr.glsl file. - enum class ToneMapOperators { - EXPONENTIAL = 0, - LINEAR, //1 - SIMPLE_REINHARD, //2 - LUM_BASED_REINHARD, //3 - WHITE_PRESERVING, //4 - ROM_BIN_DA_HOUSE, //5 - FILMIC, //6 - UNCHARTED, //7 - COSTA, //8 - PHOTOGRAPHIC_REINHARD, //9 - }; - - enum class COLORSPACE { - HSV = 0, - HSL - }; - RenderEngine(); ~RenderEngine(); @@ -229,26 +209,19 @@ private: properties::FloatProperty _globalBlackOutFactor; properties::IntProperty _nAaSamples; - properties::PropertyOwner _tmoOwner; + properties::BoolProperty _disableHDRPipeline; properties::FloatProperty _hdrExposure; - properties::FloatProperty _maxWhite; - properties::OptionProperty _toneMapOperator; - - properties::PropertyOwner _imageOwner; properties::FloatProperty _gamma; properties::FloatProperty _hue; properties::FloatProperty _saturation; properties::FloatProperty _value; - properties::FloatProperty _lightness; - + properties::FloatProperty _horizFieldOfView; properties::Vec3Property _globalRotation; properties::Vec3Property _screenSpaceRotation; properties::Vec3Property _masterRotation; - - properties::OptionProperty _colorSpace; uint64_t _frameNumber = 0; diff --git a/include/openspace/rendering/renderer.h b/include/openspace/rendering/renderer.h index b17e0f613b..d8b40042b2 100644 --- a/include/openspace/rendering/renderer.h +++ b/include/openspace/rendering/renderer.h @@ -52,16 +52,10 @@ public: virtual void setNAaSamples(int nAaSamples) = 0; virtual void setHDRExposure(float hdrExposure) = 0; virtual void setGamma(float gamma) = 0; - virtual void setMaxWhite(float maxWhite) = 0; - virtual void setToneMapOperator(int tmOp) = 0; virtual void setHue(float hue) = 0; virtual void setValue(float value) = 0; virtual void setSaturation(float sat) = 0; - virtual void setLightness(float lightness) = 0; - virtual void setColorSpace(unsigned int colorspace) = 0; - virtual int nAaSamples() const = 0; - virtual const std::vector& mSSAPattern() const = 0; /** * Set raycasting uniforms on the program object, and setup raycasting. diff --git a/modules/atmosphere/shaders/atmosphere_deferred_fs.glsl b/modules/atmosphere/shaders/atmosphere_deferred_fs.glsl index cc55e3fb08..b7a033c77f 100644 --- a/modules/atmosphere/shaders/atmosphere_deferred_fs.glsl +++ b/modules/atmosphere/shaders/atmosphere_deferred_fs.glsl @@ -67,7 +67,6 @@ out vec4 renderTarget; in vec3 interpolatedNDCPos; uniform int nAaSamples; -uniform double msaaSamplePatter[48]; uniform int cullAtmosphere; uniform sampler2D irradianceTexture; @@ -234,13 +233,6 @@ bool dAtmosphereIntersection(const dvec3 planetPosition, const dRay ray, const d void dCalculateRayRenderableGlobe(in int mssaSample, out dRay ray, out dvec4 planetPositionObjectCoords, out dvec4 cameraPositionInObject) { - // ====================================== - // ======= Avoiding Some Matrices ======= - - // Compute positions and directions in object space. - dvec2 samplePos = dvec2(msaaSamplePatter[mssaSample], - msaaSamplePatter[mssaSample+1]); - dvec4 clipCoords = dvec4(interpolatedNDCPos.xy, 1.0, 1.0); // Clip to Object Coords diff --git a/shaders/framebuffer/hdrAndFiltering.frag b/shaders/framebuffer/hdrAndFiltering.frag index c1da56002c..cd943e2e14 100644 --- a/shaders/framebuffer/hdrAndFiltering.frag +++ b/shaders/framebuffer/hdrAndFiltering.frag @@ -31,17 +31,13 @@ layout (location = 0) out vec4 finalColor; -uniform float backgroundConstant; uniform float hdrExposure; uniform float blackoutFactor; uniform float gamma; -uniform float maxWhite; uniform float Hue; uniform float Saturation; uniform float Value; uniform float Lightness; -uniform int toneMapOperator; -uniform uint colorSpace; uniform int nAaSamples; uniform sampler2DMS hdrFeedingTexture; @@ -59,42 +55,15 @@ void main() { color /= nAaSamples; color.rgb *= blackoutFactor; - vec3 tColor = vec3(0.0); - if (toneMapOperator == EXPONENTIAL) { - tColor = exponentialToneMapping(color.rgb, hdrExposure, gamma); - } else if (toneMapOperator == LINEAR) { - tColor = linearToneMapping(color.rgb, hdrExposure); - } else if (toneMapOperator == SIMPLE_REINHARD) { - tColor = simpleReinhardToneMapping(color.rgb, hdrExposure); - } else if (toneMapOperator == LUM_BASED_REINHARD) { - tColor = lumaBasedReinhardToneMapping(color.rgb); - } else if (toneMapOperator == WHITE_PRESERVING) { - tColor = whitePreservingLumaBasedReinhardToneMapping(color.rgb, maxWhite); - } else if (toneMapOperator == ROM_BIN_DA_HOUSE) { - tColor = RomBinDaHouseToneMapping(color.rgb); - } else if (toneMapOperator == FILMIC) { - tColor = filmicToneMapping(color.rgb); - } else if (toneMapOperator == UNCHARTED) { - tColor = Uncharted2ToneMapping(color.rgb, hdrExposure); - } else if (toneMapOperator == COSTA) { - tColor = jToneMapping(color.rgb, hdrExposure); - } else if (toneMapOperator == PHOTOGRAPHIC_REINHARD) { - tColor = photographicReinhardToneMapping(color.rgb); - } + // Applies TMO + vec3 tColor = toneMappingOperator(color.rgb, hdrExposure); + + // Color control + vec3 hsvColor = rgb2hsv(tColor); + hsvColor.x = (hsvColor.x * Hue) > 360.f ? 360.f : (hsvColor.x * Hue); + hsvColor.y = (hsvColor.y * Saturation) > 1.f ? 1.f : (hsvColor.y * Saturation); + hsvColor.z = (hsvColor.z * Value) > 1.f ? 1.f : (hsvColor.z * Value); - if (colorSpace == HSL_COLOR) { - vec3 hslColor = rgb2hsl(tColor); - hslColor.x = (hslColor.x * Hue) > 360.f ? 360.f : (hslColor.x * Hue); - hslColor.y = (hslColor.y * Saturation) > 1.f ? 1.f : (hslColor.y * Saturation); - hslColor.z = (hslColor.z * Lightness) > 1.f ? 1.f : (hslColor.z * Lightness); - - finalColor = vec4(gammaCorrection(hsl2rgb(hslColor), gamma), color.a); - } else if (colorSpace == HSV_COLOR) { - vec3 hsvColor = rgb2hsv(tColor); - hsvColor.x = (hsvColor.x * Hue) > 360.f ? 360.f : (hsvColor.x * Hue); - hsvColor.y = (hsvColor.y * Saturation) > 1.f ? 1.f : (hsvColor.y * Saturation); - hsvColor.z = (hsvColor.z * Value) > 1.f ? 1.f : (hsvColor.z * Value); - - finalColor = vec4(gammaCorrection(hsv2rgb(hsvColor), gamma), color.a); - } + // Gamma Correction + finalColor = vec4(gammaCorrection(hsv2rgb(hsvColor), gamma), color.a); } \ No newline at end of file diff --git a/shaders/framebuffer/renderframebuffer.frag b/shaders/framebuffer/renderframebuffer.frag index ed9f8c4dca..f5d8761afa 100644 --- a/shaders/framebuffer/renderframebuffer.frag +++ b/shaders/framebuffer/renderframebuffer.frag @@ -36,8 +36,7 @@ layout(location = 3) out vec4 filterBuffer; void main() { Fragment f = getFragment(); - _out_color_ = vec4((log2(vec3(1.0) - (f.color.rgb - vec3(DeltaError)))/(-exposure)), f.color.a); - + _out_color_ = vec4((log2(vec3(1.0) - (f.color.rgb - vec3(DeltaError)))/(-exposure)), f.color.a); _out_color_.x = isnan(_out_color_.x) ? MaxValueColorBuffer : _out_color_.x; _out_color_.y = isnan(_out_color_.y) ? MaxValueColorBuffer : _out_color_.y; _out_color_.z = isnan(_out_color_.z) ? MaxValueColorBuffer : _out_color_.z; diff --git a/shaders/framebuffer/resolveframebuffer.vert b/shaders/framebuffer/resolveframebuffer.vert index ed5a92fde4..9167d4c640 100644 --- a/shaders/framebuffer/resolveframebuffer.vert +++ b/shaders/framebuffer/resolveframebuffer.vert @@ -26,14 +26,6 @@ in vec4 position; -// out vec2 texCoord; -// out vec3 vPosition; -// out vec4 worldPosition; - void main() { gl_Position = position; - // texCoord = 0.5 + position.xy * 0.5; - - // vPosition = position.xyz; - // worldPosition = position; } diff --git a/shaders/hdr.glsl b/shaders/hdr.glsl index b3cdb1e322..033f805b48 100644 --- a/shaders/hdr.glsl +++ b/shaders/hdr.glsl @@ -22,18 +22,6 @@ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * ****************************************************************************************/ -// The next defines must being synchronized with the enum defined in file renderengine.h -#define EXPONENTIAL 0 -#define LINEAR 1 -#define SIMPLE_REINHARD 2 -#define LUM_BASED_REINHARD 3 -#define WHITE_PRESERVING 4 -#define ROM_BIN_DA_HOUSE 5 -#define FILMIC 6 -#define UNCHARTED 7 -#define COSTA 8 -#define PHOTOGRAPHIC_REINHARD 9 - const float HCV_EPSILON = 1e-7; const float HSL_EPSILON = 1e-7; const float HCY_EPSILON = 1e-7; @@ -155,27 +143,6 @@ vec3 rgb2hsl(vec3 rgb) return vec3(HCV.x, S, L); } -vec3 globalToneMappingOperatorRTR(vec3 color, const float exposure, const float maxWhite, const float aveLum) { - // Convert color to XYZ - vec3 xyzCol = RGB2XYZ * color; - - // Convert from XYZ to xyY - float xyzSum = xyzCol.x + xyzCol.y + xyzCol.z; - vec3 xyYCol = vec3( xyzCol.x / xyzSum, xyzCol.y / xyzSum, xyzCol.y); - - // Apply the tone mapping operation to the luminance (xyYCol.z or xyzCol.y) - float L = (exposure * xyYCol.z) / aveLum; - L = (L * ( 1 + L / (maxWhite * maxWhite) )) / ( 1 + L ); - - // Using the new luminance, convert back to XYZ - xyzCol.x = (L * xyYCol.x) / (xyYCol.y); - xyzCol.y = L; - xyzCol.z = (L * (1 - xyYCol.x - xyYCol.y))/xyYCol.y; - - // Convert back to RGB and send to output buffer - return XYZ2RGB * xyzCol; -} - vec3 exponentialToneMapping(vec3 color, const float exposure, const float gamma) { color *= exposure; @@ -186,64 +153,7 @@ vec3 exponentialToneMapping(vec3 color, const float exposure, const float gamma) return color; } -vec3 linearToneMapping(vec3 color, const float exposure) { - color = clamp(exposure * color, 0.f, 1.f); - return color; -} - -vec3 simpleReinhardToneMapping(vec3 color, const float exposure) { - color *= exposure/(1.f + color / exposure); - return color; -} - -vec3 lumaBasedReinhardToneMapping(vec3 color) { - - float luma = dot(color, vec3(0.2126f, 0.7152f, 0.0722f)); - float toneMappedLuma = luma / (1.f + luma); - color *= toneMappedLuma / luma; - return color; -} - -vec3 photographicReinhardToneMapping(vec3 color) { - return color / (color + vec3(1.0)); -} - -vec3 whitePreservingLumaBasedReinhardToneMapping(vec3 color, const float maxWhite) { - //float luma = dot(color, vec3(0.2126f, 0.7152f, 0.0722f)); - float luma = dot(color, vec3(0.4126f, 0.9152f, 0.2722f)); - float toneMappedLuma = luma * (1.f + luma / (maxWhite * maxWhite)) / (1.f + luma); - color *= toneMappedLuma / luma; - return color; -} - -vec3 RomBinDaHouseToneMapping(vec3 color) { - color = exp2( -1.f / ( 2.72f * color + 0.15f ) ); - return color; -} - -vec3 filmicToneMapping(vec3 color) -{ - color = max(vec3(0.f), color - vec3(0.04f)); - color = (color * (6.2f * color + 0.5f)) / (color * (6.2f * color + 20.f) + 0.06f); - return color; -} - -vec3 Uncharted2ToneMapping(vec3 color, const float exposure) { - float A = 0.15f; - float B = 0.5f; - float C = 0.1f; - float D = 0.2f; - float E = 0.02f; - float F = 0.3f; - float W = 11.2f; - color *= exposure; - color = ((color * (A * color + C * B) + D * E) / (color * (A * color + B) + D * F)) - E / F; - float white = ((W * (A * W + C * B) + D * E) / (W * (A * W + B) + D * F)) - E / F; - color /= white; - return color; -} - -vec3 jToneMapping(vec3 color, const float exposure) { +vec3 toneMappingOperator(vec3 color, const float exposure) { return 1.0 - exp2(-exposure * color); } diff --git a/src/rendering/framebufferrenderer.cpp b/src/rendering/framebufferrenderer.cpp index 0637db5db2..cf5966a725 100644 --- a/src/rendering/framebufferrenderer.cpp +++ b/src/rendering/framebufferrenderer.cpp @@ -54,10 +54,9 @@ namespace { "mainColorTexture", "blackoutFactor", "nAaSamples" }; - constexpr const std::array HDRUniformNames = { + constexpr const std::array HDRUniformNames = { "hdrFeedingTexture", "blackoutFactor", "hdrExposure", "gamma", - "toneMapOperator", "maxWhite", "Hue", "Saturation", "Value", - "Lightness", "colorSpace", "nAaSamples" + "Hue", "Saturation", "Value", "nAaSamples" }; constexpr const char* ExitFragmentShaderPath = @@ -385,13 +384,9 @@ void FramebufferRenderer::applyTMO(float blackoutFactor) { _hdrFilteringProgram->setUniform(_hdrUniformCache.blackoutFactor, blackoutFactor); _hdrFilteringProgram->setUniform(_hdrUniformCache.hdrExposure, _hdrExposure); _hdrFilteringProgram->setUniform(_hdrUniformCache.gamma, _gamma); - _hdrFilteringProgram->setUniform(_hdrUniformCache.toneMapOperator, _toneMapOperator); - _hdrFilteringProgram->setUniform(_hdrUniformCache.maxWhite, _maxWhite); _hdrFilteringProgram->setUniform(_hdrUniformCache.Hue, _hue); _hdrFilteringProgram->setUniform(_hdrUniformCache.Saturation, _saturation); _hdrFilteringProgram->setUniform(_hdrUniformCache.Value, _value); - _hdrFilteringProgram->setUniform(_hdrUniformCache.Lightness, _lightness); - _hdrFilteringProgram->setUniform(_hdrUniformCache.colorSpace, _colorSpace); _hdrFilteringProgram->setUniform(_hdrUniformCache.nAaSamples, _nAaSamples); @@ -403,13 +398,8 @@ void FramebufferRenderer::applyTMO(float blackoutFactor) { } void FramebufferRenderer::update() { - if (_dirtyMsaaSamplingPattern) { - updateMSAASamplingPattern(); - } - if (_dirtyResolution) { updateResolution(); - updateMSAASamplingPattern(); } if (_dirtyRaycastData) { @@ -733,330 +723,6 @@ void FramebufferRenderer::updateHDRAndFiltering() { //_hdrFilteringProgram->setIgnoreUniformLocationError(IgnoreError::Yes); } -void FramebufferRenderer::updateMSAASamplingPattern() { - // JCC: All code below can be replaced by - // void GetMultisamplefv( enum pname, uint index, float *val ); - - LDEBUG("Updating MSAA Sampling Pattern"); - - constexpr const int GridSize = 32; - GLfloat step = 2.f / static_cast(GridSize); - GLfloat sizeX = -1.f; - GLfloat sizeY = 1.0; - - constexpr const int NVertex = 4 * 6; - // openPixelSizeVertexData - GLfloat vertexData[GridSize * GridSize * NVertex]; - - // @CLEANUP(abock): Is this necessary? I was mucking about with the shader and it - // didn't make any visual difference. If it is necessary, the z and w - // components can be removed for sure since they are always 0, 1 and - // not used in the shader either - for (int y = 0; y < GridSize; ++y) { - for (int x = 0; x < GridSize; ++x) { - vertexData[y * GridSize * NVertex + x * NVertex] = sizeX; - vertexData[y * GridSize * NVertex + x * NVertex + 1] = sizeY - step; - vertexData[y * GridSize * NVertex + x * NVertex + 2] = 0.f; - vertexData[y * GridSize * NVertex + x * NVertex + 3] = 1.f; - - vertexData[y * GridSize * NVertex + x * NVertex + 4] = sizeX + step; - vertexData[y * GridSize * NVertex + x * NVertex + 5] = sizeY; - vertexData[y * GridSize * NVertex + x * NVertex + 6] = 0.f; - vertexData[y * GridSize * NVertex + x * NVertex + 7] = 1.f; - - vertexData[y * GridSize * NVertex + x * NVertex + 8] = sizeX; - vertexData[y * GridSize * NVertex + x * NVertex + 9] = sizeY; - vertexData[y * GridSize * NVertex + x * NVertex + 10] = 0.f; - vertexData[y * GridSize * NVertex + x * NVertex + 11] = 1.f; - - vertexData[y * GridSize * NVertex + x * NVertex + 12] = sizeX; - vertexData[y * GridSize * NVertex + x * NVertex + 13] = sizeY - step; - vertexData[y * GridSize * NVertex + x * NVertex + 14] = 0.f; - vertexData[y * GridSize * NVertex + x * NVertex + 15] = 1.f; - - vertexData[y * GridSize * NVertex + x * NVertex + 16] = sizeX + step; - vertexData[y * GridSize * NVertex + x * NVertex + 17] = sizeY - step; - vertexData[y * GridSize * NVertex + x * NVertex + 18] = 0.f; - vertexData[y * GridSize * NVertex + x * NVertex + 19] = 1.f; - - vertexData[y * GridSize * NVertex + x * NVertex + 20] = sizeX + step; - vertexData[y * GridSize * NVertex + x * NVertex + 21] = sizeY; - vertexData[y * GridSize * NVertex + x * NVertex + 22] = 0.f; - vertexData[y * GridSize * NVertex + x * NVertex + 23] = 1.f; - - sizeX += step; - } - sizeX = -1.f; - sizeY -= step; - } - - GLuint pixelSizeQuadVAO = 0; - glGenVertexArrays(1, &pixelSizeQuadVAO); - glBindVertexArray(pixelSizeQuadVAO); - - GLuint pixelSizeQuadVBO = 0; - glGenBuffers(1, &pixelSizeQuadVBO); - glBindBuffer(GL_ARRAY_BUFFER, pixelSizeQuadVBO); - - glBufferData( - GL_ARRAY_BUFFER, - sizeof(GLfloat) * GridSize * GridSize * NVertex, - vertexData, - GL_STATIC_DRAW - ); - - // Position - glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, nullptr); - glEnableVertexAttribArray(0); - - // Saves current state - GLint defaultFbo; - glGetIntegerv(GL_FRAMEBUFFER_BINDING, &defaultFbo); - GLint viewport[4]; - glGetIntegerv(GL_VIEWPORT, viewport); - - // Main framebuffer - GLuint pixelSizeTexture = 0; - GLuint pixelSizeFramebuffer = 0; - - glGenTextures(1, &pixelSizeTexture); - glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, pixelSizeTexture); - - constexpr const GLsizei OnePixel = 1; - glTexImage2DMultisample( - GL_TEXTURE_2D_MULTISAMPLE, - _nAaSamples, - GL_RGBA32F, - OnePixel, - OnePixel, - true - ); - - glViewport(0, 0, OnePixel, OnePixel); - - glGenFramebuffers(1, &pixelSizeFramebuffer); - glBindFramebuffer(GL_FRAMEBUFFER, pixelSizeFramebuffer); - glFramebufferTexture2D( - GL_FRAMEBUFFER, - GL_COLOR_ATTACHMENT0, - GL_TEXTURE_2D_MULTISAMPLE, - pixelSizeTexture, - 0 - ); - - GLenum textureBuffers[1] = { GL_COLOR_ATTACHMENT0 }; - glDrawBuffers(1, textureBuffers); - - glClearColor(0.f, 0.f, 0.f, 1.f); - glClear(GL_COLOR_BUFFER_BIT); - - GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); - if (status != GL_FRAMEBUFFER_COMPLETE) { - LERROR("MSAA Sampling pattern framebuffer is not complete"); - return; - } - - std::unique_ptr pixelSizeProgram = - ghoul::opengl::ProgramObject::Build( - "OnePixel MSAA", - absPath("${SHADERS}/framebuffer/pixelSizeMSAA.vert"), - absPath("${SHADERS}/framebuffer/pixelSizeMSAA.frag") - ); - - pixelSizeProgram->activate(); - - // Draw sub-pixel grid - glEnable(GL_SAMPLE_SHADING); - glBindVertexArray(pixelSizeQuadVAO); - glDisable(GL_DEPTH_TEST); - glDepthMask(false); - glDrawArrays(GL_TRIANGLES, 0, GridSize * GridSize * 6); - glBindVertexArray(0); - glDepthMask(true); - glEnable(GL_DEPTH_TEST); - glDisable(GL_SAMPLE_SHADING); - - pixelSizeProgram->deactivate(); - - // Now we render the Nx1 quad strip - GLuint nOneStripFramebuffer = 0; - GLuint nOneStripVAO = 0; - GLuint nOneStripVBO = 0; - GLuint nOneStripTexture = 0; - - sizeX = -1.f; - step = 2.f / static_cast(_nAaSamples); - - std::vectornOneStripVertexData(_nAaSamples * (NVertex + 12)); - - for (int x = 0; x < _nAaSamples; ++x) { - nOneStripVertexData[x * (NVertex + 12)] = sizeX; - nOneStripVertexData[x * (NVertex + 12) + 1] = -1.f; - nOneStripVertexData[x * (NVertex + 12) + 2] = 0.f; - nOneStripVertexData[x * (NVertex + 12) + 3] = 1.f; - nOneStripVertexData[x * (NVertex + 12) + 4] = 0.f; - nOneStripVertexData[x * (NVertex + 12) + 5] = 0.f; - - nOneStripVertexData[x * (NVertex + 12) + 6] = sizeX + step; - nOneStripVertexData[x * (NVertex + 12) + 7] = 1.f; - nOneStripVertexData[x * (NVertex + 12) + 8] = 0.f; - nOneStripVertexData[x * (NVertex + 12) + 9] = 1.f; - nOneStripVertexData[x * (NVertex + 12) + 10] = 1.f; - nOneStripVertexData[x * (NVertex + 12) + 11] = 1.f; - - nOneStripVertexData[x * (NVertex + 12) + 12] = sizeX; - nOneStripVertexData[x * (NVertex + 12) + 13] = 1.f; - nOneStripVertexData[x * (NVertex + 12) + 14] = 0.f; - nOneStripVertexData[x * (NVertex + 12) + 15] = 1.f; - nOneStripVertexData[x * (NVertex + 12) + 16] = 1.f; - nOneStripVertexData[x * (NVertex + 12) + 17] = 0.f; - - nOneStripVertexData[x * (NVertex + 12) + 18] = sizeX; - nOneStripVertexData[x * (NVertex + 12) + 19] = -1.f; - nOneStripVertexData[x * (NVertex + 12) + 20] = 0.f; - nOneStripVertexData[x * (NVertex + 12) + 21] = 1.f; - nOneStripVertexData[x * (NVertex + 12) + 22] = 0.f; - nOneStripVertexData[x * (NVertex + 12) + 23] = 0.f; - - nOneStripVertexData[x * (NVertex + 12) + 24] = sizeX + step; - nOneStripVertexData[x * (NVertex + 12) + 25] = -1.f; - nOneStripVertexData[x * (NVertex + 12) + 26] = 0.f; - nOneStripVertexData[x * (NVertex + 12) + 27] = 1.f; - nOneStripVertexData[x * (NVertex + 12) + 28] = 0.f; - nOneStripVertexData[x * (NVertex + 12) + 29] = 1.f; - - nOneStripVertexData[x * (NVertex + 12) + 30] = sizeX + step; - nOneStripVertexData[x * (NVertex + 12) + 31] = 1.f; - nOneStripVertexData[x * (NVertex + 12) + 32] = 0.f; - nOneStripVertexData[x * (NVertex + 12) + 33] = 1.f; - nOneStripVertexData[x * (NVertex + 12) + 34] = 1.f; - nOneStripVertexData[x * (NVertex + 12) + 35] = 1.f; - - sizeX += step; - } - - glGenVertexArrays(1, &nOneStripVAO); - glBindVertexArray(nOneStripVAO); - glGenBuffers(1, &nOneStripVBO); - glBindBuffer(GL_ARRAY_BUFFER, nOneStripVBO); - glBufferData( - GL_ARRAY_BUFFER, - sizeof(GLfloat) * _nAaSamples * (NVertex + 12), - nOneStripVertexData.data(), - GL_STATIC_DRAW - ); - - // position - glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 6, nullptr); - glEnableVertexAttribArray(0); - - // texture coords - glVertexAttribPointer( - 1, - 2, - GL_FLOAT, - GL_FALSE, - sizeof(GLfloat) * 6, - reinterpret_cast(sizeof(GLfloat) * 4) - ); - glEnableVertexAttribArray(1); - - // fbo texture buffer - glGenTextures(1, &nOneStripTexture); - glBindTexture(GL_TEXTURE_2D, nOneStripTexture); - glTexImage2D( - GL_TEXTURE_2D, - 0, - GL_RGBA32F, - _nAaSamples, - OnePixel, - 0, - GL_RGBA, - GL_FLOAT, - nullptr - ); - - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - - glGenFramebuffers(1, &nOneStripFramebuffer); - glBindFramebuffer(GL_FRAMEBUFFER, nOneStripFramebuffer); - glFramebufferTexture2D( - GL_FRAMEBUFFER, - GL_COLOR_ATTACHMENT0, - GL_TEXTURE_2D, - nOneStripTexture, - 0 - ); - - status = glCheckFramebufferStatus(GL_FRAMEBUFFER); - if (status != GL_FRAMEBUFFER_COMPLETE) { - LERROR("nOneStrip framebuffer is not complete"); - } - - glViewport(0, 0, _nAaSamples, OnePixel); - - std::unique_ptr nOneStripProgram = - ghoul::opengl::ProgramObject::Build( - "OneStrip MSAA", - absPath("${SHADERS}/framebuffer/nOneStripMSAA.vert"), - absPath("${SHADERS}/framebuffer/nOneStripMSAA.frag") - ); - - nOneStripProgram->activate(); - - ghoul::opengl::TextureUnit pixelSizeTextureUnit; - pixelSizeTextureUnit.activate(); - glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, pixelSizeTexture); - nOneStripProgram->setUniform("pixelSizeTexture", pixelSizeTextureUnit); - - // render strip - glDrawBuffers(1, textureBuffers); - - glClearColor(0.f, 1.f, 0.f, 1.f); - glClear(GL_COLOR_BUFFER_BIT); - glBindVertexArray(nOneStripVAO); - glDisable(GL_DEPTH_TEST); - glDepthMask(false); - - for (int sample = 0; sample < _nAaSamples; ++sample) { - nOneStripProgram->setUniform("currentSample", sample); - glDrawArrays(GL_TRIANGLES, sample * 6, 6); - } - glDepthMask(true); - glEnable(GL_DEPTH_TEST); - glBindVertexArray(0); - - saveTextureToMemory(GL_COLOR_ATTACHMENT0, _nAaSamples, 1, _mSAAPattern); - // Convert back to [-1, 1] range and then scale for the current viewport size: - for (int d = 0; d < _nAaSamples; ++d) { - _mSAAPattern[d * 3] = (2.0 * _mSAAPattern[d * 3] - 1.0) / - static_cast(viewport[1]); - _mSAAPattern[(d * 3) + 1] = (2.0 * _mSAAPattern[(d * 3) + 1] - 1.0) / - static_cast(viewport[3]); - _mSAAPattern[(d * 3) + 2] = 0.0; - } - - nOneStripProgram->deactivate(); - - // Restores default state - glBindFramebuffer(GL_FRAMEBUFFER, defaultFbo); - glViewport(viewport[0], viewport[1], viewport[2], viewport[3]); - - // Deletes unused buffers - glDeleteFramebuffers(1, &pixelSizeFramebuffer); - glDeleteTextures(1, &pixelSizeTexture); - glDeleteBuffers(1, &pixelSizeQuadVBO); - glDeleteVertexArrays(1, &pixelSizeQuadVAO); - - glDeleteFramebuffers(1, &nOneStripFramebuffer); - glDeleteTextures(1, &nOneStripTexture); - glDeleteBuffers(1, &nOneStripVBO); - glDeleteVertexArrays(1, &nOneStripVAO); - - _dirtyMsaaSamplingPattern = false; -} - void FramebufferRenderer::render(Scene* scene, Camera* camera, float blackoutFactor) { // Set OpenGL default rendering state glGetIntegerv(GL_FRAMEBUFFER_BINDING, &_defaultFBO); @@ -1297,9 +963,6 @@ void FramebufferRenderer::performDeferredTasks( deferredcastProgram->setUniform("nAaSamples", _nAaSamples); - // 48 = 16 samples * 3 coords - deferredcastProgram->setUniform("msaaSamplePatter", &_mSAAPattern[0], 48); - deferredcaster->preRaycast( deferredcasterTask.renderData, _deferredcastData[deferredcaster], @@ -1364,15 +1027,6 @@ void FramebufferRenderer::setGamma(float gamma) { _gamma = gamma; } -void FramebufferRenderer::setMaxWhite(float maxWhite) { - ghoul_assert(maxWhite > 0.f, "Max White value must be greater than zero"); - _maxWhite = maxWhite; -} - -void FramebufferRenderer::setToneMapOperator(int tmOp) { - _toneMapOperator = tmOp; -} - void FramebufferRenderer::setHue(float hue) { _hue = hue; } @@ -1385,22 +1039,10 @@ void FramebufferRenderer::setSaturation(float sat) { _saturation = sat; } -void FramebufferRenderer::setLightness(float lightness) { - _lightness = lightness; -} - -void FramebufferRenderer::setColorSpace(unsigned int colorspace) { - _colorSpace = colorspace; -} - int FramebufferRenderer::nAaSamples() const { return _nAaSamples; } -const std::vector& FramebufferRenderer::mSSAPattern() const { - return _mSAAPattern; -} - void FramebufferRenderer::updateRendererData() { ghoul::Dictionary dict; dict.setValue("fragmentRendererPath", std::string(RenderFragmentShaderPath)); diff --git a/src/rendering/renderengine.cpp b/src/rendering/renderengine.cpp index d150e0b8fc..213b65c5eb 100644 --- a/src/rendering/renderengine.cpp +++ b/src/rendering/renderengine.cpp @@ -199,6 +199,14 @@ namespace { "rendering for the MSAA method." }; + constexpr openspace::properties::Property::PropertyInfo DisableHDRPipelineInfo = { + "DisableHDRPipeline", + "Disable HDR Rendering", + "If this value is enabled, the rendering will disable the HDR color handling " + "and the LDR color pipeline will be used. Be aware of possible over exposure " + "in the final colors." + }; + constexpr openspace::properties::Property::PropertyInfo HDRExposureInfo = { "HDRExposure", "HDR Exposure", @@ -213,19 +221,6 @@ namespace { "tristimulus values in the image." }; - constexpr openspace::properties::Property::PropertyInfo MaxWhiteInfo = { - "MaxWhite", - "Max White Value", - "Max value for white color [0.01-10.0] to be used by tone mapping operators." - }; - - constexpr openspace::properties::Property::PropertyInfo ToneMapOperatorInfo = { - "ToneMapOperator", - "ToneMap Operator", - "ToneMap Operator is the method used to tranform the pixels using a HDR to" - "pixels using a LDR distribution." - }; - constexpr openspace::properties::Property::PropertyInfo HueInfo = { "Hue", "Hue", @@ -244,30 +239,6 @@ namespace { "Value" }; - constexpr openspace::properties::Property::PropertyInfo LightnessInfo = { - "Lightness", - "Lightness", - "Lightness" - }; - - openspace::properties::PropertyOwner::PropertyOwnerInfo TMOInfo = { - "ToneMappingOp", - "Tone Mapping Options", - "" - }; - - openspace::properties::PropertyOwner::PropertyOwnerInfo ImageInfo = { - "ImageOp", - "Rendered Image Options", - "" - }; - - constexpr openspace::properties::Property::PropertyInfo ColorSpaceInfo = { - "ColorSpace", - "Color Space", - "Sets the color space for image adjusts." - }; - constexpr openspace::properties::Property::PropertyInfo HorizFieldOfViewInfo = { "HorizFieldOfView", "Horizontal Field of View", @@ -303,17 +274,12 @@ RenderEngine::RenderEngine() , _disableMasterRendering(DisableMasterInfo, false) , _globalBlackOutFactor(GlobalBlackoutFactorInfo, 1.f, 0.f, 1.f) , _nAaSamples(AaSamplesInfo, 4, 1, 8) - , _tmoOwner(TMOInfo) - , _hdrExposure(HDRExposureInfo, 1.68f, 0.01f, 10.0f) - , _maxWhite(MaxWhiteInfo, 4.f, 0.001f, 100.0f) - , _toneMapOperator(ToneMapOperatorInfo, properties::OptionProperty::DisplayType::Dropdown) - , _imageOwner(ImageInfo) + , _disableHDRPipeline(DisableHDRPipelineInfo, false) + , _hdrExposure(HDRExposureInfo, 3.7f, 0.01f, 10.0f) , _gamma(GammaInfo, 0.86f, 0.01f, 5.0f) , _hue(HueInfo, 1.f, 0.0f, 5.0f) - , _saturation(SaturationInfo, 1.45f, 0.0f, 5.0f) - , _value(ValueInfo, 1.f, 0.0f, 5.0f) - , _lightness(LightnessInfo, 1.1f, 0.0f, 5.0f) - , _colorSpace(ColorSpaceInfo, properties::OptionProperty::DisplayType::Dropdown) + , _saturation(SaturationInfo, 1.f, 0.0f, 2.0f) + , _value(ValueInfo, 1.f, 0.0f, 2.0f) , _horizFieldOfView(HorizFieldOfViewInfo, 80.f, 1.f, 179.0f) , _globalRotation( GlobalRotationInfo, @@ -351,6 +317,13 @@ RenderEngine::RenderEngine() }); addProperty(_nAaSamples); + _disableHDRPipeline.onChange([this]() { + if (_renderer) { + //_renderer->setHDRExposure(_hdrExposure); + } + }); + addProperty(_disableHDRPipeline); + _hdrExposure.onChange([this]() { if (_renderer) { @@ -358,34 +331,6 @@ RenderEngine::RenderEngine() } }); addProperty(_hdrExposure); - - _maxWhite.onChange([this]() { - if (_renderer) { - _renderer->setMaxWhite(_maxWhite); - } - }); - - addProperty(_maxWhite); - - _toneMapOperator.addOption(static_cast(ToneMapOperators::EXPONENTIAL), "Exponential"); - _toneMapOperator.addOption(static_cast(ToneMapOperators::LINEAR), "Linear"); - _toneMapOperator.addOption(static_cast(ToneMapOperators::SIMPLE_REINHARD), "Simple Reinhard"); - _toneMapOperator.addOption(static_cast(ToneMapOperators::LUM_BASED_REINHARD), "Lum based Reinhard"); - _toneMapOperator.addOption(static_cast(ToneMapOperators::WHITE_PRESERVING), "White Preserving"); - _toneMapOperator.addOption(static_cast(ToneMapOperators::ROM_BIN_DA_HOUSE), "RomBin da House"); - _toneMapOperator.addOption(static_cast(ToneMapOperators::FILMIC), "Filmic"); - _toneMapOperator.addOption(static_cast(ToneMapOperators::UNCHARTED), "Uncharted 2"); - _toneMapOperator.addOption(static_cast(ToneMapOperators::COSTA), "Costa"); - _toneMapOperator.addOption(static_cast(ToneMapOperators::PHOTOGRAPHIC_REINHARD), "Photographic Reinhard"); - _toneMapOperator.set(8); - - _toneMapOperator.onChange([this]() { - if (_renderer) { - _renderer->setToneMapOperator(_toneMapOperator); - } - }); - - addProperty(_toneMapOperator); _gamma.onChange([this]() { if (_renderer) { @@ -394,18 +339,6 @@ RenderEngine::RenderEngine() }); addProperty(_gamma); - _colorSpace.addOption(static_cast(COLORSPACE::HSV), "HSV"); - _colorSpace.addOption(static_cast(COLORSPACE::HSL), "HSL"); - _colorSpace.set(1); - - _colorSpace.onChange([this]() { - if (_renderer) { - _renderer->setColorSpace(_colorSpace); - } - }); - - addProperty(_colorSpace); - _hue.onChange([this]() { if (_renderer) { _renderer->setHue(_hue); @@ -429,15 +362,6 @@ RenderEngine::RenderEngine() }); addProperty(_value); - - _lightness.onChange([this]() { - if (_renderer) { - _renderer->setLightness(_lightness); - } - }); - addProperty(_lightness); - - //this->addPropertySubOwner(_imageOwner); addProperty(_globalBlackOutFactor); addProperty(_applyWarping); From 312cbab3b5d5a646c32eb8a2c27434a4ddd2f2c5 Mon Sep 17 00:00:00 2001 From: Jonathas Costa Date: Thu, 15 Aug 2019 14:36:04 -0400 Subject: [PATCH 33/39] Fixed scale for hue. --- src/rendering/renderengine.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/rendering/renderengine.cpp b/src/rendering/renderengine.cpp index 213b65c5eb..0f2936c173 100644 --- a/src/rendering/renderengine.cpp +++ b/src/rendering/renderengine.cpp @@ -277,7 +277,7 @@ RenderEngine::RenderEngine() , _disableHDRPipeline(DisableHDRPipelineInfo, false) , _hdrExposure(HDRExposureInfo, 3.7f, 0.01f, 10.0f) , _gamma(GammaInfo, 0.86f, 0.01f, 5.0f) - , _hue(HueInfo, 1.f, 0.0f, 5.0f) + , _hue(HueInfo, 180.f, 0.0f, 360.0f) , _saturation(SaturationInfo, 1.f, 0.0f, 2.0f) , _value(ValueInfo, 1.f, 0.0f, 2.0f) , _horizFieldOfView(HorizFieldOfViewInfo, 80.f, 1.f, 179.0f) @@ -341,7 +341,8 @@ RenderEngine::RenderEngine() _hue.onChange([this]() { if (_renderer) { - _renderer->setHue(_hue); + float pHue = (_hue + 180.f) / 360.f; + _renderer->setHue(pHue); } }); From 8a66c0d3ee61afa384b2afe6f144f13aa55e6fd3 Mon Sep 17 00:00:00 2001 From: Jonathas Costa Date: Thu, 15 Aug 2019 14:46:44 -0400 Subject: [PATCH 34/39] Added flag for disable LDR to HDR for true HDR color values. --- shaders/fragment.glsl | 1 + shaders/framebuffer/renderframebuffer.frag | 8 +++++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/shaders/fragment.glsl b/shaders/fragment.glsl index 6e5c67a9e0..95efdb25ab 100644 --- a/shaders/fragment.glsl +++ b/shaders/fragment.glsl @@ -35,6 +35,7 @@ struct Fragment { float depth; uint blend; bool forceFboRendering; + bool disableLDR2HDR; }; #endif diff --git a/shaders/framebuffer/renderframebuffer.frag b/shaders/framebuffer/renderframebuffer.frag index f5d8761afa..3fb3a216ae 100644 --- a/shaders/framebuffer/renderframebuffer.frag +++ b/shaders/framebuffer/renderframebuffer.frag @@ -36,7 +36,13 @@ layout(location = 3) out vec4 filterBuffer; void main() { Fragment f = getFragment(); - _out_color_ = vec4((log2(vec3(1.0) - (f.color.rgb - vec3(DeltaError)))/(-exposure)), f.color.a); + + if (f.disableLDR2HDR) { + _out_color_ = f.color; + } else { + _out_color_ = vec4((log2(vec3(1.0) - (f.color.rgb - vec3(DeltaError)))/(-exposure)), f.color.a); + } + _out_color_.x = isnan(_out_color_.x) ? MaxValueColorBuffer : _out_color_.x; _out_color_.y = isnan(_out_color_.y) ? MaxValueColorBuffer : _out_color_.y; _out_color_.z = isnan(_out_color_.z) ? MaxValueColorBuffer : _out_color_.z; From a713403a09785772dc670fb39dc2065833f2c0ad Mon Sep 17 00:00:00 2001 From: Jonathas Costa Date: Thu, 15 Aug 2019 16:15:32 -0400 Subject: [PATCH 35/39] Removed interpolation from ATM. --- modules/atmosphere/shaders/atmosphere_deferred_fs.glsl | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/modules/atmosphere/shaders/atmosphere_deferred_fs.glsl b/modules/atmosphere/shaders/atmosphere_deferred_fs.glsl index b7a033c77f..f566b9055b 100644 --- a/modules/atmosphere/shaders/atmosphere_deferred_fs.glsl +++ b/modules/atmosphere/shaders/atmosphere_deferred_fs.glsl @@ -413,11 +413,9 @@ vec3 inscatterRadiance(inout vec3 x, inout float t, inout float irradianceFactor return finalScatteringRadiance; } else { //return ((r-Rg) * invRtMinusRg)*spaceColor.rgb + finalScatteringRadiance; - //return attenuation * spaceColor.rgb + finalScatteringRadiance; - // JCC: Review next step. I don't like it. - return attenuation * spaceColor.rgb + - 1.0 * attenuation * finalScatteringRadiance + - (vec3(1.0) - attenuation) * finalScatteringRadiance; + return attenuation * spaceColor.rgb + finalScatteringRadiance; + // return attenuation * spaceColor.rgb + + // (vec3(1.0) - attenuation) * finalScatteringRadiance; } } From 19a321e9a8dea1ce85a118e72917c3bde3cab672 Mon Sep 17 00:00:00 2001 From: Jonathas Costa Date: Thu, 15 Aug 2019 16:18:17 -0400 Subject: [PATCH 36/39] Move back to old glare texture for the Sun. --- data/assets/scene/solarsystem/sun/glare.asset | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/assets/scene/solarsystem/sun/glare.asset b/data/assets/scene/solarsystem/sun/glare.asset index e61537b1d2..8d13f5fa9a 100644 --- a/data/assets/scene/solarsystem/sun/glare.asset +++ b/data/assets/scene/solarsystem/sun/glare.asset @@ -13,7 +13,7 @@ local SunGlare = { Size = 1.3*10^10.5, Origin = "Center", Billboard = true, - Texture = textures .. "/test6.png", + Texture = textures .. "/halo.png", BlendMode = "Additive", Opacity = 0.65, RenderableType = "Transparency" From 93e45002112a9f6cd3bc9ecee158510b9313a21a Mon Sep 17 00:00:00 2001 From: Jonathas Costa Date: Thu, 15 Aug 2019 16:27:54 -0400 Subject: [PATCH 37/39] Added back files removed. --- .../solarsystem/missions/apollo/a15.asset | 203 ++ .../missions/apollo/a15kernels.asset | 86 + .../solarsystem/missions/apollo/apollo8.asset | 234 ++ .../apollo/apollo_11_lem_flipbook.asset | 39 + .../missions/apollo/apollo_csm.asset | 280 ++ .../missions/apollo/apollo_lem.asset | 51 + .../solarsystem/missions/dawn/ceres.asset | 60 + .../solarsystem/missions/dawn/dawn.asset | 795 +++++ .../missions/dawn/dawn_kernels.asset | 8 + .../solarsystem/missions/gaia/gaia.asset | 67 + .../solarsystem/missions/gaia/trail.asset | 64 + .../missions/gaia/transforms.asset | 27 + .../solarsystem/missions/insight/edl.asset | 981 ++++++ .../solarsystem/missions/juno/juno.asset | 202 ++ .../messenger/mercurymagnetosphere.asset | 59 + .../missions/messenger/messengerSC.asset | 220 ++ .../missions/messenger/openspace_mercury.ti | 33 + .../missions/messenger/transferfunction.txt | 8 + .../missions/newhorizons/charon.asset | 120 + .../missions/newhorizons/fov.asset | 386 +++ .../missions/newhorizons/kernels.asset | 48 + .../missions/newhorizons/label.asset | 31 + .../missions/newhorizons/model.asset | 57 + .../missions/newhorizons/newhorizons.asset | 20 + .../missions/newhorizons/newhorizons.mission | 122 + .../missions/newhorizons/othermoons.asset | 126 + .../missions/newhorizons/pluto.asset | 251 ++ .../missions/newhorizons/trail.asset | 36 + .../missions/newhorizons/transforms.asset | 54 + .../BaseballDiamond_PolyCam.txt | 2640 +++++++++++++++++ ...urvey_EquatorialStations_Spectrometers.txt | 7 + .../OrbitalB_Site08_PolyCamImages.txt | 173 ++ .../Recon_225m_Equatorial_PolyCam.txt | 110 + .../Recon_225m_Equatorial_spectrometers.txt | 1 + .../Recon_525m_Equatorial_spectrometers.txt | 1559 ++++++++++ .../missions/osirisrex/bennu.asset | 115 + .../missions/osirisrex/model.asset | 345 +++ .../missions/osirisrex/osirisrex.asset | 16 + .../missions/osirisrex/osirisrex.mission | 386 +++ .../missions/osirisrex/script_schedule.asset | 18 + .../osirisrex/spice_kernel_times.mission | 95 + .../missions/osirisrex/trail.asset | 80 + .../missions/osirisrex/transforms.asset | 26 + .../missions/pioneer/pioneer10.asset | 75 + .../missions/pioneer/pioneer11.asset | 78 + .../solarsystem/missions/rosetta/67p.asset | 154 + .../missions/rosetta/rosetta.asset | 543 ++++ .../missions/voyager/voyager1.asset | 239 ++ .../missions/voyager/voyager2.asset | 338 +++ 49 files changed, 11666 insertions(+) create mode 100644 data/assets/scene/solarsystem/missions/apollo/a15.asset create mode 100644 data/assets/scene/solarsystem/missions/apollo/a15kernels.asset create mode 100644 data/assets/scene/solarsystem/missions/apollo/apollo8.asset create mode 100644 data/assets/scene/solarsystem/missions/apollo/apollo_11_lem_flipbook.asset create mode 100644 data/assets/scene/solarsystem/missions/apollo/apollo_csm.asset create mode 100644 data/assets/scene/solarsystem/missions/apollo/apollo_lem.asset create mode 100644 data/assets/scene/solarsystem/missions/dawn/ceres.asset create mode 100644 data/assets/scene/solarsystem/missions/dawn/dawn.asset create mode 100644 data/assets/scene/solarsystem/missions/dawn/dawn_kernels.asset create mode 100644 data/assets/scene/solarsystem/missions/gaia/gaia.asset create mode 100644 data/assets/scene/solarsystem/missions/gaia/trail.asset create mode 100644 data/assets/scene/solarsystem/missions/gaia/transforms.asset create mode 100644 data/assets/scene/solarsystem/missions/insight/edl.asset create mode 100644 data/assets/scene/solarsystem/missions/juno/juno.asset create mode 100644 data/assets/scene/solarsystem/missions/messenger/mercurymagnetosphere.asset create mode 100644 data/assets/scene/solarsystem/missions/messenger/messengerSC.asset create mode 100644 data/assets/scene/solarsystem/missions/messenger/openspace_mercury.ti create mode 100644 data/assets/scene/solarsystem/missions/messenger/transferfunction.txt create mode 100644 data/assets/scene/solarsystem/missions/newhorizons/charon.asset create mode 100644 data/assets/scene/solarsystem/missions/newhorizons/fov.asset create mode 100644 data/assets/scene/solarsystem/missions/newhorizons/kernels.asset create mode 100644 data/assets/scene/solarsystem/missions/newhorizons/label.asset create mode 100644 data/assets/scene/solarsystem/missions/newhorizons/model.asset create mode 100644 data/assets/scene/solarsystem/missions/newhorizons/newhorizons.asset create mode 100644 data/assets/scene/solarsystem/missions/newhorizons/newhorizons.mission create mode 100644 data/assets/scene/solarsystem/missions/newhorizons/othermoons.asset create mode 100644 data/assets/scene/solarsystem/missions/newhorizons/pluto.asset create mode 100644 data/assets/scene/solarsystem/missions/newhorizons/trail.asset create mode 100644 data/assets/scene/solarsystem/missions/newhorizons/transforms.asset create mode 100644 data/assets/scene/solarsystem/missions/osirisrex/InstrumentTimes/BaseballDiamond_PolyCam.txt create mode 100644 data/assets/scene/solarsystem/missions/osirisrex/InstrumentTimes/DetailedSurvey_EquatorialStations_Spectrometers.txt create mode 100644 data/assets/scene/solarsystem/missions/osirisrex/InstrumentTimes/OrbitalB_Site08_PolyCamImages.txt create mode 100644 data/assets/scene/solarsystem/missions/osirisrex/InstrumentTimes/Recon_225m_Equatorial_PolyCam.txt create mode 100644 data/assets/scene/solarsystem/missions/osirisrex/InstrumentTimes/Recon_225m_Equatorial_spectrometers.txt create mode 100644 data/assets/scene/solarsystem/missions/osirisrex/InstrumentTimes/Recon_525m_Equatorial_spectrometers.txt create mode 100644 data/assets/scene/solarsystem/missions/osirisrex/bennu.asset create mode 100644 data/assets/scene/solarsystem/missions/osirisrex/model.asset create mode 100644 data/assets/scene/solarsystem/missions/osirisrex/osirisrex.asset create mode 100644 data/assets/scene/solarsystem/missions/osirisrex/osirisrex.mission create mode 100644 data/assets/scene/solarsystem/missions/osirisrex/script_schedule.asset create mode 100644 data/assets/scene/solarsystem/missions/osirisrex/spice_kernel_times.mission create mode 100644 data/assets/scene/solarsystem/missions/osirisrex/trail.asset create mode 100644 data/assets/scene/solarsystem/missions/osirisrex/transforms.asset create mode 100644 data/assets/scene/solarsystem/missions/pioneer/pioneer10.asset create mode 100644 data/assets/scene/solarsystem/missions/pioneer/pioneer11.asset create mode 100644 data/assets/scene/solarsystem/missions/rosetta/67p.asset create mode 100644 data/assets/scene/solarsystem/missions/rosetta/rosetta.asset create mode 100644 data/assets/scene/solarsystem/missions/voyager/voyager1.asset create mode 100644 data/assets/scene/solarsystem/missions/voyager/voyager2.asset diff --git a/data/assets/scene/solarsystem/missions/apollo/a15.asset b/data/assets/scene/solarsystem/missions/apollo/a15.asset new file mode 100644 index 0000000000..659edf4fd2 --- /dev/null +++ b/data/assets/scene/solarsystem/missions/apollo/a15.asset @@ -0,0 +1,203 @@ +local assetHelper = asset.require('util/asset_helper') +local sunTransforms = asset.require('scene/solarsystem/sun/transforms') +asset.require('spice/base') + +--asset.require('scene/solarsystem/missions/apollo/a15kernels') + + +local models = asset.syncedResource({ + Name = "Apollo 15 Models", + Type = "HttpSynchronization", + Identifier = "apollo_models", + Version = 1 +}) + +local kernels = asset.syncedResource({ + Name = "Apollo Kernels", + Type = "HttpSynchronization", + Identifier = "apollo_spice", + Version = 1 +}) + +local Kernels = { + kernels .. "/apollo15.0001.tsc", + + -- kernels .. '/AS15-P_v01.bc', + kernels .. '/apollo15.0001.tf', + kernels .. '/apollo15MetricAddendum002.ti', + -- kernels .. '/apollo15PanoramicAddendum001.ti', + kernels .. '/apollo15_metric.0002.ti', + -- kernels .. '/apollo15_panoramic.0001.ti', + kernels .. '/apollo15-1.bsp', + kernels .. '/AS15-M_v01.bc', + -- kernels .. '/AS15-M_v01.bsp', +} + + + +-- local Apollo15Kernels = { +-- --sclk +-- ApolloKernels .. "/apollo15.0001.tsc", + +-- --pck +-- ApolloKernels .. "/moon_080317.tf", +-- ApolloKernels .. "/moon_assoc_me.tf", + +-- --ik +-- ApolloKernels .. "/apollo15_metric_v2.0001.ti", +-- ApolloKernels .. "/apollo15_panoramic.0001.ti", + +-- --tspk +-- ApolloKernels .. "/de421.bsp", +-- ApolloKernels .. "/moon_pa_de421_1900-2050.bpc", + +-- --iak +-- ApolloKernels .. "/apollo15MetricAddendum002.ti", +-- ApolloKernels .. "/apolloPanAddendum001.ti", + +-- --fk +-- ApolloKernels .. "/apollo15_v2.0001.tf", +-- ApolloKernels .. "/apollo15_v2.0002.tf", + +-- --spk +-- ApolloKernels .. "/AS15_M_REV23_SMITHED_V01.bsp", +-- ApolloKernels .. "/AS15_M_REV4.bsp ", +-- ApolloKernels .. "/AS15_M_REV70_SMITHED_V01.bsp", +-- ApolloKernels .. "/AS15_M_REV04_v2.bsp ", +-- ApolloKernels .. "/AS15_M_REV27_SMITHED_V01.bsp", +-- ApolloKernels .. "/AS15_M_REV44_SMITHED_V01.bsp", +-- ApolloKernels .. "/AS15_M_REV71_SMITHED_V01.bsp", +-- ApolloKernels .. "/AS15_M_REV15_SMITHED_V01.bsp", +-- ApolloKernels .. "/AS15_M_REV33_SMITHED_V01.bsp", +-- ApolloKernels .. "/AS15_M_REV50_SMITHED_V01.bsp", +-- ApolloKernels .. "/AS15_M_REV71_SMITHED_V02.bsp", +-- ApolloKernels .. "/AS15_M_REV15_v2.bsp ", +-- ApolloKernels .. "/AS15_M_REV34_SMITHED_V01.bsp", +-- ApolloKernels .. "/AS15_M_REV60_SMITHED_V01.bsp", +-- ApolloKernels .. "/AS15_M_REV72_v2.bsp", +-- ApolloKernels .. "/AS15_M_REV16_SMITHED_V01.bsp", +-- ApolloKernels .. "/AS15_M_REV35_SMITHED_V02.bsp", +-- ApolloKernels .. "/AS15_M_REV62_SMITHED_V01.bsp", +-- ApolloKernels .. "/AS15_M_REV22_SMITHED_V01.bsp", +-- ApolloKernels .. "/AS15_M_REV38_SMITHED_V01.bsp", +-- ApolloKernels .. "/AS15_M_REV63_SMITHED_V01.bsp", + +-- --ck +-- ApolloKernels .. "/AS15_M_REV04_SMITHED_V01.bc", +-- ApolloKernels .. "/AS15_M_REV15_SMITHED_V01.bc", +-- ApolloKernels .. "/AS15_M_REV16_SMITHED_V01.bc", +-- ApolloKernels .. "/AS15_M_REV22_SMITHED_V01.bc", +-- ApolloKernels .. "/AS15_M_REV23_SMITHED_V01.bc", +-- ApolloKernels .. "/AS15_M_REV27_SMITHED_V01.bc", +-- ApolloKernels .. "/AS15_M_REV33_SMITHED_V01.bc", +-- ApolloKernels .. "/AS15_M_REV34_SMITHED_V01.bc", +-- ApolloKernels .. "/AS15_M_REV35_SMITHED_V01.bc", +-- ApolloKernels .. "/AS15_M_REV35_SMITHED_V02.bc", +-- ApolloKernels .. "/AS15_M_REV38_SMITHED_V01.bc", +-- ApolloKernels .. "/AS15_M_REV44_SMITHED_V01.bc", +-- ApolloKernels .. "/AS15_M_REV50_SMITHED_V01.bc", +-- ApolloKernels .. "/AS15_M_REV60_SMITHED_V01.bc", +-- ApolloKernels .. "/AS15_M_REV62_SMITHED_V01.bc", +-- ApolloKernels .. "/AS15_M_REV63_SMITHED_V01.bc", +-- ApolloKernels .. "/AS15_M_REV70_SMITHED_V01.bc", +-- ApolloKernels .. "/AS15_M_REV71_SMITHED_V01.bc", +-- ApolloKernels .. "/AS15_M_REV71_SMITHED_V02.bc", +-- ApolloKernels .. "/AS15_M_REV72_v2.bc", +-- } + + + + +local LightSources = { + { + Type = "SceneGraphLightSource", + Identifier = "Sun", + Node = sunTransforms.SolarSystemBarycenter.Identifier, + Intensity = 1.0 + }, + -- { + -- Identifier = "Camera", + -- Type = "CameraLightSource", + -- Intensity = 0.5, + -- Enabled = false + -- } +} + + +local Apollo15 = { + Identifier = "Apollo15", + Parent = "Moon", + Transform = { + Translation = { + Type = "SpiceTranslation", + Target = "APOLLO 15", + Observer = "MOON", + Frame = "IAU_MOON", + Kernels = Kernels + }, + Rotation = { + Type = "SpiceRotation", + SourceFrame = "A15_METRIC", + DestinationFrame = "GALACTIC" + } + }, + TimeFrame = { -- Using Spice kernels for 1850-2150 + Type = "TimeFrameInterval", + Start = "1971-07-30T02:22:00.00", + End = "1971-08-01T18:05:00.00" + }, + GUI = { + Name = "Apollo 15", + Path = "/Solar System/Missions/Apollo 15" + } +} + +local Apollo15Main = { + Identifier = "Apollo15Main", + Parent = Apollo15.Identifier, + Renderable = { + Type = "RenderableModel", + Geometry = { + Type = "MultiModelGeometry", +-- GeometryFile = models .. "/Apollo_Spacecraft.obj" + GeometryFile = models .. "/Apollo_CSM_shrunk_rotated_xy_doubble_size.obj" + }, + ColorTexture = models .. "/gray.png", + LightSources = LightSources, + DisableFaceCulling = true + }, + GUI = { + Name = "Apollo 15 Main", + Path = "/Solar System/Missions/Apollo 15" + } +} + +local Apollo15Trail = { + Identifier = "Apollo15Trail", + Parent = "Moon", + Renderable = { + Type = "RenderableTrailTrajectory", + Translation = { + Type = "SpiceTranslation", + Target = "APOLLO 15", + Observer = "MOON", + Frame = "IAU_MOON", + Kernels = Kernels + }, + Color = { 0.70, 0.50, 0.20 }, + StartTime = "1971 JUL 26", + EndTime = "1971 AUG 01 14:30:41.680", + SampleInterval = 2 + }, + GUI = { + Name = "Apollo 15 Trail", + Path = "/Solar System/Missions/Apollo 15" + } +} + +assetHelper.registerSceneGraphNodesAndExport(asset, { + Apollo15, + Apollo15Main, + Apollo15Trail +}) + diff --git a/data/assets/scene/solarsystem/missions/apollo/a15kernels.asset b/data/assets/scene/solarsystem/missions/apollo/a15kernels.asset new file mode 100644 index 0000000000..eca91e2614 --- /dev/null +++ b/data/assets/scene/solarsystem/missions/apollo/a15kernels.asset @@ -0,0 +1,86 @@ +local ApolloKernels = asset.syncedResource({ + Name = "Apollo Kernels", + Type = "HttpSynchronization", + Identifier = "apollo_spice", + Version = 1 +}) + +local Apollo15Kernels = { + + + + --sclk + ApolloKernels .. "apollo15.0001.tsc", + + --pck + ApolloKernels .. "moon_080317.tf", + ApolloKernels .. "moon_assoc_me.tf", + + --ik + ApolloKernels .. "apollo15_metric_v2.0001.ti", + ApolloKernels .. "apollo15_panoramic.0001.ti", + + --tspk + ApolloKernels .. "de421.bsp", + ApolloKernels .. "moon_pa_de421_1900-2050.bpc", + + --iak + ApolloKernels .. "apollo15MetricAddendum002.ti", + ApolloKernels .. "apolloPanAddendum001.ti", + + --fk + ApolloKernels .. "apollo15_v2.0001.tf", + ApolloKernels .. "apollo15_v2.0002.tf", + + --spk + ApolloKernels .. "AS15_M_REV23_SMITHED_V01.bsp", + ApolloKernels .. "AS15_M_REV4.bsp ", + ApolloKernels .. "AS15_M_REV70_SMITHED_V01.bsp", + ApolloKernels .. "AS15_M_REV04_v2.bsp ", + ApolloKernels .. "AS15_M_REV27_SMITHED_V01.bsp", + ApolloKernels .. "AS15_M_REV44_SMITHED_V01.bsp", + ApolloKernels .. "AS15_M_REV71_SMITHED_V01.bsp", + ApolloKernels .. "AS15_M_REV15_SMITHED_V01.bsp", + ApolloKernels .. "AS15_M_REV33_SMITHED_V01.bsp", + ApolloKernels .. "AS15_M_REV50_SMITHED_V01.bsp", + ApolloKernels .. "AS15_M_REV71_SMITHED_V02.bsp", + ApolloKernels .. "AS15_M_REV15_v2.bsp ", + ApolloKernels .. "AS15_M_REV34_SMITHED_V01.bsp", + ApolloKernels .. "AS15_M_REV60_SMITHED_V01.bsp", + ApolloKernels .. "AS15_M_REV72_v2.bsp", + ApolloKernels .. "AS15_M_REV16_SMITHED_V01.bsp", + ApolloKernels .. "AS15_M_REV35_SMITHED_V02.bsp", + ApolloKernels .. "AS15_M_REV62_SMITHED_V01.bsp", + ApolloKernels .. "AS15_M_REV22_SMITHED_V01.bsp", + ApolloKernels .. "AS15_M_REV38_SMITHED_V01.bsp", + ApolloKernels .. "AS15_M_REV63_SMITHED_V01.bsp", + + --ck + ApolloKernels .. "AS15_M_REV04_SMITHED_V01.bc", + ApolloKernels .. "AS15_M_REV15_SMITHED_V01.bc", + ApolloKernels .. "AS15_M_REV16_SMITHED_V01.bc", + ApolloKernels .. "AS15_M_REV22_SMITHED_V01.bc", + ApolloKernels .. "AS15_M_REV23_SMITHED_V01.bc", + ApolloKernels .. "AS15_M_REV27_SMITHED_V01.bc", + ApolloKernels .. "AS15_M_REV33_SMITHED_V01.bc", + ApolloKernels .. "AS15_M_REV34_SMITHED_V01.bc", + ApolloKernels .. "AS15_M_REV35_SMITHED_V01.bc", + ApolloKernels .. "AS15_M_REV35_SMITHED_V02.bc", + ApolloKernels .. "AS15_M_REV38_SMITHED_V01.bc", + ApolloKernels .. "AS15_M_REV44_SMITHED_V01.bc", + ApolloKernels .. "AS15_M_REV50_SMITHED_V01.bc", + ApolloKernels .. "AS15_M_REV60_SMITHED_V01.bc", + ApolloKernels .. "AS15_M_REV62_SMITHED_V01.bc", + ApolloKernels .. "AS15_M_REV63_SMITHED_V01.bc", + ApolloKernels .. "AS15_M_REV70_SMITHED_V01.bc", + ApolloKernels .. "AS15_M_REV71_SMITHED_V01.bc", + ApolloKernels .. "AS15_M_REV71_SMITHED_V02.bc", + ApolloKernels .. "AS15_M_REV72_v2.bc", + + +} + + + +--asset.export("ApolloKernels", Kernels) +asset.export("Apollo15Kernels", Apollo15Kernels) diff --git a/data/assets/scene/solarsystem/missions/apollo/apollo8.asset b/data/assets/scene/solarsystem/missions/apollo/apollo8.asset new file mode 100644 index 0000000000..27e86fd80d --- /dev/null +++ b/data/assets/scene/solarsystem/missions/apollo/apollo8.asset @@ -0,0 +1,234 @@ +local assetHelper = asset.require('util/asset_helper') +local sunTransforms = asset.require('scene/solarsystem/sun/transforms') +local csm = asset.require('./apollo_csm') + +asset.require('spice/base') + +local kernelsFolder = asset.syncedResource({ + Name = "Apollo Kernels", + Type = "HttpSynchronization", + Identifier = "apollo_spice", + Version = 1 +}) + +local kernels = { + kernelsFolder .. "/moon_080317.tf", + kernelsFolder .. "/apollo8.tf", + kernelsFolder .. "/moon_pa_de421_1900-2050.bpc", + kernelsFolder .. '/apollo8.tsc', + kernelsFolder .. '/apollo8.bsp', + kernelsFolder .. '/apollo8_earthrise.bc', +} + +local apolloSpiceId = "-908" + +local Apollo8Launch = { + Identifier = "Apollo8Launch", + Parent = "Earth", + TimeFrame = { -- Using Spice kernels for 1850-2150 + Type = "TimeFrameInterval", + Start = "1968 DEC 21", + End = "1968 DEC 28" + }, + Transform = { + Translation = { + Type = "SpiceTranslation", + Target = apolloSpiceId, + Observer = "EARTH", + Frame = "IAU_EARTH", + Kernels = kernels + }, + }, + GUI = { + Name = "Apollo 8 Launch Capsule", + Path = "/Solar System/Missions/Apollo" + } +} + + +local Apollo8 = { + Identifier = "Apollo8", + Parent = "EarthBarycenter", + TimeFrame = { -- Using Spice kernels for 1850-2150 + Type = "TimeFrameInterval", + Start = "1968 DEC 21", + End = "1968 DEC 28" + }, + Transform = { + Translation = { + Type = "SpiceTranslation", + Target = apolloSpiceId, + Observer = "EARTH BARYCENTER", + Frame = "GALACTIC", + Kernels = kernels + }, + Rotation = { + Type = "SpiceRotation", + SourceFrame = "A8_EARTHRISE", + DestinationFrame = "GALACTIC", + TimeFrame = { + -- The orientation of Apollo 8 is only + -- available during the few minutes when + -- the famous Earthrise picture was taken. + Type = "TimeFrameInterval", + Start = "1968 DEC 24 16:37:19", + End = "1968 DEC 24 16:40:15" + } + } + }, + GUI = { + Name = "Apollo 8", + Path = "/Solar System/Missions/Apollo" + } +} + +local Apollo8LaunchModel = { + Identifier = "Apollo8LaunchModel", + Parent = Apollo8Launch.Identifier, + Transform = { + Scale = { + Type = "StaticScale", + -- The scale of the model is in cm; OpenSpace is in m + Scale = 0.01 + }, + Rotation = { + Type = "StaticRotation", + Rotation = {0.0, 0.0, -3.1415/2} + } + }, + GUI = { + Hidden = true, + Name = "Apollo 8 Launch Model", + Path = "/Solar System/Missions/Apollo" + } +} + +local Apollo8Model = { + Identifier = "Apollo8Model", + Parent = Apollo8.Identifier, + Transform = { + Scale = { + Type = "StaticScale", + -- The scale of the model is in cm; OpenSpace is in m + Scale = 0.01 + }, + Rotation = { + Type = "StaticRotation", + Rotation = {0.0, 0.0, -3.1415/2} + } + }, + GUI = { + Hidden = true, + Name = "Apollo 8 Model", + Path = "/Solar System/Missions/Apollo" + } +} + +local PivotOffset = { 0, 2.5, 0} + +-- The pivot node is used for navigation inside the spacecraft + +local Apollo8Pivot = { + Identifier = "Apollo8Pivot", + Parent = Apollo8.Identifier, + Transform = { + Translation = { + Type = "StaticTranslation", + Position = PivotOffset + }, + }, + GUI = { + Name = "Apollo 8 Pivot", + Path = "/Solar System/Missions/Apollo" + } +} + + +local Apollo8LaunchTrail = { + Identifier = "Apollo8LaunchTrail", + Parent = "Earth", + Renderable = { + Type = "RenderableTrailTrajectory", + Translation = { + Type = "SpiceTranslation", + Target = apolloSpiceId, + Observer = "EARTH", + Frame = "IAU_EARTH", + Kernels = kernels + }, + Color = { 0.70, 0.50, 0.20 }, + StartTime = "1968 DEC 21 12:51:00", + EndTime = "1968 DEC 21 23:23:22", + SampleInterval = 30 + }, + GUI = { + Name = "Apollo 8 Launch Trail", + Path = "/Solar System/Missions/Apollo" + } +} + +local Apollo8MoonTrail = { + Identifier = "Apollo8MoonTrail", + Parent = "Moon", + Renderable = { + Type = "RenderableTrailTrajectory", + Translation = { + Type = "SpiceTranslation", + Target = apolloSpiceId, + Observer = "MOON", + Frame = "IAU_MOON", + Kernels = kernels + }, + Color = { 0.70, 0.50, 0.20 }, + StartTime = "1968 DEC 23", + EndTime = "1968 DEC 26", + SampleInterval = 30, + Enabled = false, + }, + GUI = { + Name = "Apollo 8 Moon Trail", + Path = "/Solar System/Missions/Apollo" + } +} + +local Apollo8EarthBarycenterTrail = { + Identifier = "Apollo8EarthBarycenterTrail", + Parent = "EarthBarycenter", + Renderable = { + Type = "RenderableTrailTrajectory", + Translation = { + Type = "SpiceTranslation", + Target = apolloSpiceId, + Observer = "EARTH BARYCENTER", + Frame = "GALACTIC", + Kernels = kernels + }, + Color = { 1, 0.0, 0.0 }, + StartTime = "1968 DEC 21", + EndTime = "1968 DEC 28", + SampleInterval = 30, + Enabled = false, + }, + GUI = { + Name = "Apollo 8 Earth Barycenter Trail", + Path = "/Solar System/Missions/Apollo" + } +} + +local exportList = { + Apollo8, + Apollo8Model, + Apollo8Launch, + Apollo8LaunchModel, + Apollo8Pivot, + + Apollo8LaunchTrail, + Apollo8MoonTrail, + Apollo8EarthBarycenterTrail +} + +assetHelper.registerSceneGraphNodesAndExport(asset, exportList) +-- Registering Command and Service module needs to happen fter the export list +-- has been registered, since it depends on the Apollo8Model scene graph node. +csm.registerCsm(asset, Apollo8Model.Identifier) +csm.registerCsm(asset, Apollo8LaunchModel.Identifier) diff --git a/data/assets/scene/solarsystem/missions/apollo/apollo_11_lem_flipbook.asset b/data/assets/scene/solarsystem/missions/apollo/apollo_11_lem_flipbook.asset new file mode 100644 index 0000000000..4a342dd10f --- /dev/null +++ b/data/assets/scene/solarsystem/missions/apollo/apollo_11_lem_flipbook.asset @@ -0,0 +1,39 @@ +--apollo_11_lem_flipbook.asset +local helper = asset.require('util/vrt_flipbook_helper') + +local assetPrefix = "A11flip"; +local assetGlobe = "Moon"; +local flipbookCount = 19; + +local flipbook = nil; + +local vrts = asset.syncedResource({ + Name = "Apollo 11 Flipbook", + Type = "HttpSynchronization", + Identifier = "apollo_11_flipbook", + Version = 1 +}) + +asset.onInitialize(function () + openspace.globebrowsing.addBlendingLayersFromDirectory(vrts, assetGlobe); + flipbook = helper.createFlipbook(assetPrefix, assetGlobe, 19); + + function nextFlip() + helper.nextFlipbookPage(flipbook); + end + + function previousFlip() + helper.previousFlipbookPage(flipbook); + end + + openspace.bindKey("RIGHT", "nextFlip()", "Show the next Apollo 11 flipbook image.", "Next A11 flip", "/Missions/Apollo/11") + openspace.bindKey("LEFT", "previousFlip()","Show the previous Apollo 11 flipbook image.", "Prev A11 flip", "/Missions/Apollo/11") +end) + + +asset.onDeinitialize(function () + flipbook = nil; + + openspace.clearKey("RIGHT") + openspace.clearKey("LEFT") +end) diff --git a/data/assets/scene/solarsystem/missions/apollo/apollo_csm.asset b/data/assets/scene/solarsystem/missions/apollo/apollo_csm.asset new file mode 100644 index 0000000000..3f5a1e012e --- /dev/null +++ b/data/assets/scene/solarsystem/missions/apollo/apollo_csm.asset @@ -0,0 +1,280 @@ +-- This asset exports a function to create an Apollo Command and Service Module (CSM). +-- Instead of hard-coding the scene graph node parent, +-- client assets can decide which object that the CSM should be attached to. +-- Usage example: registerCsm(asset, Apollo8.Idenfitier) +-- ...where Apollo8 is the scene graph node identifier to attach the CSM to. + +local assetHelper = asset.require('util/asset_helper') +local sunTransforms = asset.require('scene/solarsystem/sun/transforms') + +local models = asset.syncedResource({ + Name = "Apollo Models", + Type = "HttpSynchronization", + Identifier = "apollo_models", + Version = 1 +}) + +local partsInfo = { + -- Data is structured as: Geometry file name (except .obj suffix), texture file name, shading + + -- Exterior + {"AP08_cone_command_module", "Command_module_diff.png", true}, + {"AP08_cone_hatchdoor_handle_scratched_metal", "scratched_metal_gloss.png", true}, + {"AP08_cone_vent_ports_black", "black.png", true}, + {"AP08_cone_vent_ports_red", "red.png", true}, + {"AP08_cone_hatchdoor_interior", "apollo_hatchdoor_interior.jpg", false}, + + {"AP08_service_black", "black.png", true}, + {"AP08_service_brown", "brown.png", true}, + {"AP08_service_grey", "gray.png", true}, + {"AP08_service_high_gain_antenna", "Antenna_diff.png", true}, + {"AP08_service_module", "Service_module_diff.png", true}, + {"AP08_service_nozzle", "Nozzle_diff.png", true}, + {"AP08_service_pink", "pink.png", true}, + {"AP08_service_red", "red.png", true}, + {"AP08_service_scratched_metal", "scratched_metal_gloss.png", true}, + {"AP08_service_white", "white.png", true}, + + -- Interior + -- {"AP11_int_back_wall_left", "AP11_int_back_wall_left.png", false}, + -- {"AP11_int_back_wall_right", "AP11_int_back_wall_right.png", false}, + -- {"AP11_interior_back_wall_top_0Shape3", "back_wall_top_0Shape3_tpAmbient_paint_03.png", false}, + -- {"AP11_interior_belt_buckles_02_L2", "belt_buckles_02_L2Shape_tpAmbient.png", false}, + -- {"AP11_interior_belt_straps_02", "belt_straps_02Shape_tpAmbient_paint_01.png", false}, + -- {"AP11_interior_black_push_buttons", "push_buttonsShape_tpAmbient.png", false}, + -- {"AP11_interior_bottom_boxes_03", "bottom_boxes_03_paint_01.png", false}, + -- {"AP11_interior_bottom_floor_tp", "bottom_floor_tpAmbient_paint_v002.png", false}, + -- {"AP11_interior_box_back_01", "box_back_01_paint_v001.png", false}, + -- {"AP11_interior_box_back_02", "box_back_02_paint_v001.png", false}, + -- {"AP11_interior_box_back_04", "box_back_04_paint_v001.png", false}, + -- {"AP11_interior_box_lft_lower_01", "box_lft_lower_01Shape_Diffuse_paint_v002.png", false}, + -- {"AP11_interior_box_lft_top", "box_lft_topShape_Diffuse_paint_v009.png", false}, + -- {"AP11_interior_box_mid_tp", "box_mid_tpDiffuse_paint_v001.png", false}, + -- {"AP11_interior_box_rt_top_02", "box_rt_top_02_paint_04.png", false}, + -- {"AP11_interior_brushed_blue_ano", "brushed_blue_ano_paint_01.png", false}, + -- {"AP11_interior_brushed_brass", "brushed_brass_paint_01.png", false}, + -- {"AP11_interior_brushed_grey_ano", "brushed_grey_ano_paint_02.png", false}, + -- {"AP11_interior_canvas_cover", "canvas_coverShape_tpAmbient_paint_01.png", false}, + -- {"AP11_interior_Channel_attachment", "Channel_attachment_Diffuse.png", false}, + -- {"AP11_interior_Channel_baseMetal", "Channel_baseMetal_Diffuse.png", false}, + -- {"AP11_interior_Channel_Material", "Channel_Material_Diffuse.png", false}, + -- {"AP11_interior_Channel_rsMaterial2", "Channel_rsMaterial2_Diffuse.png", false}, + -- {"AP11_interior_cloth_01", "cloth_01Shape_tpAmbient_paint_01.png", false}, + -- {"AP11_interior_coiled_hose", "coiled_hoseShape_tpAmbient.png", false}, + -- {"AP11_interior_control_panel_left_win_plates", "control_panel_left_win_platesShape_tpAmbient.png", false}, + -- {"AP11_interior_control_panel_rt_win_plates", "control_panel_rt_win_platesShape_tpAmbient.png", false}, + -- {"AP11_interior_copper_parts_main_cp", "copper_parts_main_cpShape_tpAmbient.png", false}, + -- {"AP11_interior_dials_main2", "dials_main2Shape_tpAmbient.png", false}, + -- {"AP11_interior_dials_t2", "dials_t2Shape_tpAmbient.png", false}, + -- {"AP11_interior_dial_fixes_01", "dial_fixes_01Shape_tpAmbient.png", false}, + -- {"AP11_interior_fire_ex_02", "fire_ex_02_paint_v001.png", false}, + -- {"AP11_interior_floor_panels_3", "floor_panels_3Shape_tpAmbient_paint_01.png", false}, + -- {"AP11_interior_floor_tile_tex_01", "floor_tile_tex_01.png", false}, + -- {"AP11_interior_grey", "gray.png", false}, + -- {"AP11_interior_handholds_cp", "handholds_cpShape_tpAmbient_paint_05.png", false}, + -- {"AP11_interior_hatch_release_0Shape5", "hatch_release_0Shape5_tpAmbient_paint_02.png", false}, + -- {"AP11_interior_headrests_02", "headrests_02Shape_tpAmbient_paint_01.png", false}, + -- {"AP11_interior_hoses_black_01", "hoses_black_01Shape_tpAmbient_paint_01.png", false}, + -- {"AP11_interior_hoses_white_0Shape1", "hoses_white_0Shape1_tpAmbient_paint_01.png", false}, + -- {"AP11_interior_josticks1", "joysticks1Shape_tpAmbient_paint_01.png", false}, + -- {"AP11_interior_joysticks_fabric1", "joysticks_fabric1_Shape_tpAmbient_paint_01.png", false}, + -- {"AP11_interior_joystick_poles_lft_05", "joystick_poles_lft_05_paint_v002.png", false}, + -- {"AP11_interior_joystick_poles_lft_long_05", "joystick_poles_lft_long_05_paint_v002.png", false}, + -- {"AP11_interior_joystick_poles_rt_05", "joystick_poles_rt_05_paint_v002.png", false}, + -- {"AP11_interior_latch_mechanisms_01", "latch_mechanisms_01Shape_tpAmbient.png", false}, + -- {"AP11_interior_lower_push_buttons", "lower_push_buttonsShape_tpAmbient.png", false}, + -- {"AP11_interior_lower_walls_back", "lower_walls_back_paint_04.png", false}, + -- {"AP11_interior_lower_walls_boxes_head", "lower_walls_boxes_headShape_tpAmbient_paint_v001.png", false}, + -- {"AP11_interior_main_cp_left_smth_03", "main_cp_left_0Shape3_tpAmbient_paint_02.png", false}, + -- {"AP11_interior_main_cp_mid_smth_02", "main_cp_mid_smth_02Shape_tpAmbient_paint_02.png", false}, + -- {"AP11_interior_main_cp_rt_smth", "main_cp_rt_smthShape_tpAmbient_paint_02.png", false}, + -- {"AP11_interior_main_cp_wheels", "main_cp_wheelsShape_tpAmbient.png", false}, + -- {"AP11_interior_metal_brackets_under_hatch", "metal_brackets_under_hatchShape_tpAmbient.png", false}, + -- {"AP11_interior_metal_tunnel_parts", "metal_tunnel_partsShape_tpAmbient_paint_01.png", false}, + -- {"AP11_interior_metal_window_parts", "metal_window_partsShape_tpAmbient_paint_01.png", false}, + -- {"AP11_interior_middle_walls_05", "middle_walls_05_tpAmbient_paint_02.png", false}, + -- {"AP11_interior_middle_walls_0Shape8", "middle_walls_0Shape8_tpAmbient_paint_01.png", false}, + -- {"AP11_interior_mid_tunnel_parts", "mid_tunnel_parts_03Shape_tpAmbient_paint_02.png", false}, + -- {"AP11_interior_new_switch_rails1", "new_switch_rails1Shape_tpAmbient.png", false}, + -- {"AP11_interior_nozzles_02", "nozzles_02Shape_tpAmbient_paint_01.png", false}, + -- {"AP11_interior_outlet_fabric3", "outlet_fabric3Shape_tpAmbient_paint_02.png", false}, + -- {"AP11_interior_pole_end_02", "pole_end_02.png", false}, + -- {"AP11_interior_pole_end_03", "pole_end_03.png", false}, + -- {"AP11_interior_pole_tex_03", "pole_tex_03.png", false}, + -- {"AP11_interior_pole_tex_04", "pole_tex_04.png", false}, + -- {"AP11_interior_pole_tex_05", "pole_tex_05.png", false}, + -- {"AP11_interior_pole_tex_lower_01", "pole_tex_lower_01.png", false}, + -- {"AP11_interior_pole_under_seat_paint_01", "pole_under_seat_paint_01.png", false}, + -- {"AP11_interior_pole_under_seat_square_bar", "pole_under_seat_square_bar_paint_01.png", false}, + -- {"AP11_interior_push_switches_lft1", "push_switches_lft1Shape_tpAmbient.png", false}, + -- {"AP11_interior_random_small_parts_01", "random_small_parts_01Shape_tpAmbient_paint_02.png", false}, + -- {"AP11_interior_red", "red.png", false}, + -- {"AP11_interior_reticle_wheel_tp", "reticle_wheel_tpAmbient_paint_01.png", false}, + -- {"AP11_interior_rivet_paint_v001", "rivet_paint_v001.png", false}, + -- {"AP11_interior_seats_fabric", "seats_fabric_paint_01.png", false}, + -- {"AP11_interior_seat_left_tp", "seat_left_tpAmbient_paint_v001.png", false}, + -- {"AP11_interior_seat_lights_left", "seat_lights_left_Shape_tpAmbient_paint_v001.png", false}, + -- {"AP11_interior_seat_lights_rt", "seat_lights_rt_Shape_tpAmbient_paint_v001.png", false}, + -- {"AP11_interior_seat_middle_tp", "seat_middle_tpAmbient_paint_v001.png", false}, + -- {"AP11_interior_seat_poles_0Shape1", "seat_poles_0Shape1_tpAmbient_paint_01.png", false}, + -- {"AP11_interior_seat_pole_mirror_0Shape1", "seat_pole_mirror_0Shape1_tpAmbient_paint_01.png", false}, + -- {"AP11_interior_seat_rt_tp", "seat_rt_tpAmbient_paint_v001.png", false}, + -- {"AP11_interior_sextant_0Shape2", "sextant_0Shape2_tpAmbient.png", false}, + -- {"AP11_interior_switch_covers_main_middle1", "switch_covers_main_middle1Shape_tpAmbient.png", false}, + -- {"AP11_interior_switch_rails_lft", "switch_rails_lftShape_tpAmbient.png", false}, + -- {"AP11_interior_tunnel_main_cylinder1", "switch_rails_lftShape_tpAmbient.png", false}, + -- {"AP11_interior_tunnel_switches_01", "tunnel_switches_01Shape_tpAmbient.png", false}, + -- {"AP11_interior_tunnel_wheelsShape", "tunnel_wheelsShape_tpAmbient.png", false}, + -- {"AP11_interior_walls_mid_left", "walls_mid_leftShape_tpAmbient_paint_01.png", false}, + -- {"AP11_interior_windows_front_0Shape4", "windows_front_0Shape4_tpAmbient_paint_01.png", false} +} + + +local partsInfoFull = { + -- Data is structured as: Geometry file name (except .obj suffix), texture file name, shading + + -- Exterior + {"AP08_cone_command_module", "Command_module_diff.png", true}, + {"AP08_cone_hatchdoor_handle_scratched_metal", "scratched_metal_gloss.png", true}, + {"AP08_cone_vent_ports_black", "black.png", true}, + {"AP08_cone_vent_ports_red", "red.png", true}, + {"AP08_cone_hatchdoor_interior", "apollo_hatchdoor_interior.jpg", false}, + + {"AP08_service_black", "black.png", true}, + {"AP08_service_brown", "brown.png", true}, + {"AP08_service_grey", "gray.png", true}, + {"AP08_service_high_gain_antenna", "Antenna_diff.png", true}, + {"AP08_service_module", "Service_module_diff.png", true}, + {"AP08_service_nozzle", "Nozzle_diff.png", true}, + {"AP08_service_pink", "pink.png", true}, + {"AP08_service_red", "red.png", true}, + {"AP08_service_scratched_metal", "scratched_metal_gloss.png", true}, + {"AP08_service_white", "white.png", true}, + + -- Interior + {"AP11_int_back_wall_left", "AP11_int_back_wall_left.png", false}, + {"AP11_int_back_wall_right", "AP11_int_back_wall_right.png", false}, + {"AP11_interior_back_wall_top_0Shape3", "back_wall_top_0Shape3_tpAmbient_paint_03.png", false}, + {"AP11_interior_belt_buckles_02_L2", "belt_buckles_02_L2Shape_tpAmbient.png", false}, + {"AP11_interior_belt_straps_02", "belt_straps_02Shape_tpAmbient_paint_01.png", false}, + {"AP11_interior_black_push_buttons", "push_buttonsShape_tpAmbient.png", false}, + {"AP11_interior_bottom_boxes_03", "bottom_boxes_03_paint_01.png", false}, + {"AP11_interior_bottom_floor_tp", "bottom_floor_tpAmbient_paint_v002.png", false}, + {"AP11_interior_box_back_01", "box_back_01_paint_v001.png", false}, + {"AP11_interior_box_back_02", "box_back_02_paint_v001.png", false}, + {"AP11_interior_box_back_04", "box_back_04_paint_v001.png", false}, + {"AP11_interior_box_lft_lower_01", "box_lft_lower_01Shape_Diffuse_paint_v002.png", false}, + {"AP11_interior_box_lft_top", "box_lft_topShape_Diffuse_paint_v009.png", false}, + {"AP11_interior_box_mid_tp", "box_mid_tpDiffuse_paint_v001.png", false}, + {"AP11_interior_box_rt_top_02", "box_rt_top_02_paint_04.png", false}, + {"AP11_interior_brushed_blue_ano", "brushed_blue_ano_paint_01.png", false}, + {"AP11_interior_brushed_brass", "brushed_brass_paint_01.png", false}, + {"AP11_interior_brushed_grey_ano", "brushed_grey_ano_paint_02.png", false}, + {"AP11_interior_canvas_cover", "canvas_coverShape_tpAmbient_paint_01.png", false}, + {"AP11_interior_Channel_attachment", "Channel_attachment_Diffuse.png", false}, + {"AP11_interior_Channel_baseMetal", "Channel_baseMetal_Diffuse.png", false}, + {"AP11_interior_Channel_Material", "Channel_Material_Diffuse.png", false}, + {"AP11_interior_Channel_rsMaterial2", "Channel_rsMaterial2_Diffuse.png", false}, + {"AP11_interior_cloth_01", "cloth_01Shape_tpAmbient_paint_01.png", false}, + {"AP11_interior_coiled_hose", "coiled_hoseShape_tpAmbient.png", false}, + {"AP11_interior_control_panel_left_win_plates", "control_panel_left_win_platesShape_tpAmbient.png", false}, + {"AP11_interior_control_panel_rt_win_plates", "control_panel_rt_win_platesShape_tpAmbient.png", false}, + {"AP11_interior_copper_parts_main_cp", "copper_parts_main_cpShape_tpAmbient.png", false}, + {"AP11_interior_dials_main2", "dials_main2Shape_tpAmbient.png", false}, + {"AP11_interior_dials_t2", "dials_t2Shape_tpAmbient.png", false}, + {"AP11_interior_dial_fixes_01", "dial_fixes_01Shape_tpAmbient.png", false}, + {"AP11_interior_fire_ex_02", "fire_ex_02_paint_v001.png", false}, + {"AP11_interior_floor_panels_3", "floor_panels_3Shape_tpAmbient_paint_01.png", false}, + {"AP11_interior_floor_tile_tex_01", "floor_tile_tex_01.png", false}, + {"AP11_interior_grey", "gray.png", false}, + {"AP11_interior_handholds_cp", "handholds_cpShape_tpAmbient_paint_05.png", false}, + {"AP11_interior_hatch_release_0Shape5", "hatch_release_0Shape5_tpAmbient_paint_02.png", false}, + {"AP11_interior_headrests_02", "headrests_02Shape_tpAmbient_paint_01.png", false}, + {"AP11_interior_hoses_black_01", "hoses_black_01Shape_tpAmbient_paint_01.png", false}, + {"AP11_interior_hoses_white_0Shape1", "hoses_white_0Shape1_tpAmbient_paint_01.png", false}, + {"AP11_interior_josticks1", "joysticks1Shape_tpAmbient_paint_01.png", false}, + {"AP11_interior_joysticks_fabric1", "joysticks_fabric1_Shape_tpAmbient_paint_01.png", false}, + {"AP11_interior_joystick_poles_lft_05", "joystick_poles_lft_05_paint_v002.png", false}, + {"AP11_interior_joystick_poles_lft_long_05", "joystick_poles_lft_long_05_paint_v002.png", false}, + {"AP11_interior_joystick_poles_rt_05", "joystick_poles_rt_05_paint_v002.png", false}, + {"AP11_interior_latch_mechanisms_01", "latch_mechanisms_01Shape_tpAmbient.png", false}, + {"AP11_interior_lower_push_buttons", "lower_push_buttonsShape_tpAmbient.png", false}, + {"AP11_interior_lower_walls_back", "lower_walls_back_paint_04.png", false}, + {"AP11_interior_lower_walls_boxes_head", "lower_walls_boxes_headShape_tpAmbient_paint_v001.png", false}, + {"AP11_interior_main_cp_left_smth_03", "main_cp_left_0Shape3_tpAmbient_paint_02.png", false}, + {"AP11_interior_main_cp_mid_smth_02", "main_cp_mid_smth_02Shape_tpAmbient_paint_02.png", false}, + {"AP11_interior_main_cp_rt_smth", "main_cp_rt_smthShape_tpAmbient_paint_02.png", false}, + {"AP11_interior_main_cp_wheels", "main_cp_wheelsShape_tpAmbient.png", false}, + {"AP11_interior_metal_brackets_under_hatch", "metal_brackets_under_hatchShape_tpAmbient.png", false}, + {"AP11_interior_metal_tunnel_parts", "metal_tunnel_partsShape_tpAmbient_paint_01.png", false}, + {"AP11_interior_metal_window_parts", "metal_window_partsShape_tpAmbient_paint_01.png", false}, + {"AP11_interior_middle_walls_05", "middle_walls_05_tpAmbient_paint_02.png", false}, + {"AP11_interior_middle_walls_0Shape8", "middle_walls_0Shape8_tpAmbient_paint_01.png", false}, + {"AP11_interior_mid_tunnel_parts", "mid_tunnel_parts_03Shape_tpAmbient_paint_02.png", false}, + {"AP11_interior_new_switch_rails1", "new_switch_rails1Shape_tpAmbient.png", false}, + {"AP11_interior_nozzles_02", "nozzles_02Shape_tpAmbient_paint_01.png", false}, + {"AP11_interior_outlet_fabric3", "outlet_fabric3Shape_tpAmbient_paint_02.png", false}, + {"AP11_interior_pole_end_02", "pole_end_02.png", false}, + {"AP11_interior_pole_end_03", "pole_end_03.png", false}, + {"AP11_interior_pole_tex_03", "pole_tex_03.png", false}, + {"AP11_interior_pole_tex_04", "pole_tex_04.png", false}, + {"AP11_interior_pole_tex_05", "pole_tex_05.png", false}, + {"AP11_interior_pole_tex_lower_01", "pole_tex_lower_01.png", false}, + {"AP11_interior_pole_under_seat_paint_01", "pole_under_seat_paint_01.png", false}, + {"AP11_interior_pole_under_seat_square_bar", "pole_under_seat_square_bar_paint_01.png", false}, + {"AP11_interior_push_switches_lft1", "push_switches_lft1Shape_tpAmbient.png", false}, + {"AP11_interior_random_small_parts_01", "random_small_parts_01Shape_tpAmbient_paint_02.png", false}, + {"AP11_interior_red", "red.png", false}, + {"AP11_interior_reticle_wheel_tp", "reticle_wheel_tpAmbient_paint_01.png", false}, + {"AP11_interior_rivet_paint_v001", "rivet_paint_v001.png", false}, + {"AP11_interior_seats_fabric", "seats_fabric_paint_01.png", false}, + {"AP11_interior_seat_left_tp", "seat_left_tpAmbient_paint_v001.png", false}, + {"AP11_interior_seat_lights_left", "seat_lights_left_Shape_tpAmbient_paint_v001.png", false}, + {"AP11_interior_seat_lights_rt", "seat_lights_rt_Shape_tpAmbient_paint_v001.png", false}, + {"AP11_interior_seat_middle_tp", "seat_middle_tpAmbient_paint_v001.png", false}, + {"AP11_interior_seat_poles_0Shape1", "seat_poles_0Shape1_tpAmbient_paint_01.png", false}, + {"AP11_interior_seat_pole_mirror_0Shape1", "seat_pole_mirror_0Shape1_tpAmbient_paint_01.png", false}, + {"AP11_interior_seat_rt_tp", "seat_rt_tpAmbient_paint_v001.png", false}, + {"AP11_interior_sextant_0Shape2", "sextant_0Shape2_tpAmbient.png", false}, + {"AP11_interior_switch_covers_main_middle1", "switch_covers_main_middle1Shape_tpAmbient.png", false}, + {"AP11_interior_switch_rails_lft", "switch_rails_lftShape_tpAmbient.png", false}, + {"AP11_interior_tunnel_main_cylinder1", "switch_rails_lftShape_tpAmbient.png", false}, + {"AP11_interior_tunnel_switches_01", "tunnel_switches_01Shape_tpAmbient.png", false}, + {"AP11_interior_tunnel_wheelsShape", "tunnel_wheelsShape_tpAmbient.png", false}, + {"AP11_interior_walls_mid_left", "walls_mid_leftShape_tpAmbient_paint_01.png", false}, + {"AP11_interior_windows_front_0Shape4", "windows_front_0Shape4_tpAmbient_paint_01.png", false} +} + + + +asset.export("registerCsm", function (asset, parentNodeIdentifier) + local parts = {} + for i, info in ipairs(partsInfo) do + parts[#parts + 1] = assetHelper.createModelPart( + parentNodeIdentifier, + sunTransforms.SolarSystemBarycenter.Identifier, + models, + info[1], + info[2], + info[3] + ) + end + assetHelper.registerSceneGraphNodesAndExport(asset, parts) +end) + + + +asset.export("registerCsmFull", function (asset, parentNodeIdentifier) + local parts = {} + for i, info in ipairs(partsInfoFull) do + parts[#parts + 1] = assetHelper.createModelPart( + parentNodeIdentifier, + sunTransforms.SolarSystemBarycenter.Identifier, + models, + info[1], + info[2], + info[3] + ) + end + assetHelper.registerSceneGraphNodesAndExport(asset, parts) +end) \ No newline at end of file diff --git a/data/assets/scene/solarsystem/missions/apollo/apollo_lem.asset b/data/assets/scene/solarsystem/missions/apollo/apollo_lem.asset new file mode 100644 index 0000000000..4a7a820d76 --- /dev/null +++ b/data/assets/scene/solarsystem/missions/apollo/apollo_lem.asset @@ -0,0 +1,51 @@ +--apollo_lem.asset (hopeful title) + +-- This asset exports a function to create an Apollo Lunar Excursion Module (LEM). +-- Instead of hard-coding the scene graph node parent, +-- client assets can decide which object that the LEM should be attached to. +-- Usage example: registerLem(asset, Apollo11Lem.Idenfitier) +-- ...where Apollo11Lem is the scene graph node identifier to attach the LEM to. + +local assetHelper = asset.require('util/asset_helper') +local sunTransforms = asset.require('scene/solarsystem/sun/transforms') + +local models = asset.syncedResource({ + Name = "Apollo Models", + Type = "HttpSynchronization", + Identifier = "apollo_lem_model", + Version = 1 +}) + +local partsInfo = { + -- Data is structured as: Geometry file name (except .obj suffix), texture file name, shading + -- Exterior + { "black", "black.png", true }, + { "blue_glass", "blue_glass.png", true }, + { "booster", "booster3.png", true }, + { "bright_white", "white.png", true }, + { "dark_grey_dish", "dark_gray.png", true }, + { "dull_white", "dull_white.png", true }, + { "gold", "gold.png", true }, + { "light_grey", "light_gray.png", true }, + { "mid_grey", "gray.png", true }, + { "orange", "orange.png", true }, + { "texture_lem_flag", "texture_lem_flag.png", true }, + { "texture_lem_unitedstates", "texture_lem_unitedstates.png", true }, + { "yellow_buttons", "yellow.png", true } +} + + +asset.export("registerLem", function (asset, parentNodeIdentifier) + local parts = {} + for i, info in ipairs(partsInfo) do + parts[#parts + 1] = assetHelper.createModelPart( + parentNodeIdentifier, + sunTransforms.SolarSystemBarycenter.Identifier, + models, + info[1], + info[2], + info[3] + ) + end + assetHelper.registerSceneGraphNodesAndExport(asset, parts) +end) diff --git a/data/assets/scene/solarsystem/missions/dawn/ceres.asset b/data/assets/scene/solarsystem/missions/dawn/ceres.asset new file mode 100644 index 0000000000..0e7fd2fead --- /dev/null +++ b/data/assets/scene/solarsystem/missions/dawn/ceres.asset @@ -0,0 +1,60 @@ +local assetHelper = asset.require('util/asset_helper') +local transforms = asset.require('scene/solarsystem/sun/transforms') +local kernels = asset.require('./dawn_kernels').Kernels + + + +local textures = asset.syncedResource({ + Name = "Ceres Textures", + Type = "HttpSynchronization", + Identifier = "ceres_textures", + Version = 1 +}) + +local Ceres = { + Identifier = "Ceres", + Parent = transforms.SolarSystemBarycenter.Identifier, + Transform = { + Rotation = { + Type = "SpiceRotation", + SourceFrame = "IAU_CERES", + DestinationFrame = "GALACTIC", + Kernels = { + kernels .. "/dawn_ceres_v01.tpc", + kernels .. "/sb_ceres_140724.bsp", + kernels .. "/sb_ceres_110211.bsp" + } + }, + Translation = { + Type = "SpiceTranslation", + Target = "CERES", + Observer = "SSB", + Kernels = { + kernels .. "/dawn_ceres_v01.tpc", + kernels .. "/sb_ceres_140724.bsp", + kernels .. "/sb_ceres_110211.bsp" + } + } + }, + Renderable = { + Type = "RenderableGlobe", + Radii = { 6.390E5, 6.390E5, 6.390E5 }, + SegmentsPerPatch = 64, + Layers = { + ColorLayers = { + { + Name = "Texture", + FilePath = textures .. "/gray.png", + Enabled = true + } + } + } + }, + GUI = { + Path = "/Solar System/Dwarf Planets/Ceres" + } +} + + + +assetHelper.registerSceneGraphNodesAndExport(asset, { Ceres }) diff --git a/data/assets/scene/solarsystem/missions/dawn/dawn.asset b/data/assets/scene/solarsystem/missions/dawn/dawn.asset new file mode 100644 index 0000000000..f630ad8b8f --- /dev/null +++ b/data/assets/scene/solarsystem/missions/dawn/dawn.asset @@ -0,0 +1,795 @@ +local assetHelper = asset.require('util/asset_helper') +local transforms = asset.require('scene/solarsystem/sun/transforms') +local kernels = asset.require('./dawn_kernels').Kernels +local sunTransforms = asset.require('scene/solarsystem/sun/transforms') + + +local textures = asset.syncedResource({ + Name = "Dawn Textures", + Type = "HttpSynchronization", + Identifier = "dawn_textures", + Version = 1 +}) + +local models = asset.syncedResource({ + Name = "Dawn Models", + Type = "HttpSynchronization", + Identifier = "dawn_model", + Version = 1 +}) + +local KernelFiles = { + kernels .. "/dawn_ref_070926-150201_070829.bsp", + + --ik + kernels .. "/dawn_fc_v10.ti", + + -- SPK + kernels .. "/sb_ceres_110211.bsp", + kernels .. "/sb_ceres_140724.bsp", + kernels .. "/sb_vesta_071107.bsp", + + kernels .. "/dawn_rec_070927_070930_081218_v1.bsp", + --[[kernels .. "/dawn_rec_070930_071201_081218_v1.bsp", + kernels .. "/dawn_rec_071201_080205_081218_v1.bsp", + kernels .. "/dawn_rec_080205_080325_081218_v1.bsp", + kernels .. "/dawn_rec_080325_080503_081218_v1.bsp", + kernels .. "/dawn_rec_080503_080601_081218_v1.bsp", + kernels .. "/dawn_rec_080601_080718_081218_v1.bsp", + kernels .. "/dawn_rec_080718_080910_081218_v1.bsp", + kernels .. "/dawn_rec_080910_081022_090218_v1.bsp", + kernels .. "/dawn_rec_081022_081109_090218_v1.bsp", + kernels .. "/dawn_rec_081109_090228_090306_v1.bsp", + kernels .. "/dawn_rec_090228_090501_090702_v1.bsp", + kernels .. "/dawn_rec_090501_090801_090916_v1.bsp", + kernels .. "/dawn_rec_090801_090915_090923_v1.bsp", + kernels .. "/dawn_rec_090915_091201_091202_v1.bsp", + kernels .. "/dawn_rec_091201_100208_100209_v1.bsp", + kernels .. "/dawn_rec_100208_100316_100323_v1.bsp", + kernels .. "/dawn_rec_100316_100413_100422_v1.bsp", + kernels .. "/dawn_rec_100413_100622_100830_v1.bsp", + kernels .. "/dawn_rec_100622_100824_100830_v1.bsp", + kernels .. "/dawn_rec_100824_101130_101202_v1.bsp", + kernels .. "/dawn_rec_101130_110201_110201_v1.bsp", + kernels .. "/dawn_rec_110201_110328_110328_v1.bsp", + kernels .. "/dawn_rec_110328_110419_110420_v1.bsp",--]] + + kernels .. "/dawn_rec_110416_110802_110913_v1.bsp", + kernels .. "/dawn_rec_110802_110831_110922_v1.bsp", + --[[kernels .. "/spk/dawn_rec_110831_110928_111221_v1.bsp", + kernels .. "/dawn_rec_110928_111102_120615_v1.bsp", + kernels .. "/dawn_rec_111102_111210_120618_v1.bsp", + kernels .. "/dawn_rec_111211_120501_120620_v1.bsp", + kernels .. "/dawn_rec_120501_120611_120625_v1.bsp", + kernels .. "/dawn_rec_120611_120724_121101_v1.bsp",--]] + kernels .. "/dawn_rec_120724_120913_121213_v1.bsp", + + --PCK + --kernels .. "/dawn_vesta_v06.tpc", + --kernels .. "/dawn_ceres_v01.tpc", + --kernels .. "/pck00008.tpc", + + -- FK + kernels .. "/dawn_vesta_v00.tf", + kernels .. "/dawn_v12.tf", + + --SCLK + kernels .. "/dawn_203_sclkscet_00039.tsc", + + -- CK + kernels .. "/dawn_sc_070927_070930.bc", + kernels .. "/dawn_sc_110801_110807.bc", + kernels .. "/dawn_sc_110808_110814.bc", + kernels .. "/dawn_sc_120910_120916.bc", + -- kernels .. "/dawn_sc_111226_120101.bc", + -- kernels .. "/dawn_sc_120102_120108.bc", + -- kernels .. "/dawn_sc_120109_120115.bc", + -- kernels .. "/dawn_sc_120116_120122.bc", + -- kernels .. "/dawn_sc_120123_120129.bc", + + -- all space craft CK files, ~10 gb + -- kernels .. "/dawn_sc_120123_120129.bc", + -- kernels .. "/dawn_sc_070927_070930.bc", + --[[kernels .. "/ck/dawn_sc_071001_071007.bc", + kernels .. "/dawn_sc_071008_071014_v2.bc", + kernels .. "/dawn_sc_071015_071021.bc", + kernels .. "/dawn_sc_071022_071028_v2.bc", + kernels .. "/dawn_sc_071029_071104.bc", + kernels .. "/dawn_sc_071105_071111.bc", + kernels .. "/dawn_sc_071112_071118.bc", + kernels .. "/dawn_sc_071119_071125.bc", + kernels .. "/dawn_sc_071126_071202.bc", + kernels .. "/dawn_sc_071203_071209.bc", + kernels .. "/dawn_sc_071210_071216.bc", + kernels .. "/dawn_sc_071217_071223.bc", + kernels .. "/dawn_sc_071224_071230.bc", + kernels .. "/dawn_sc_071231_080106.bc", + kernels .. "/dawn_sc_080107_080113.bc", + kernels .. "/dawn_sc_080114_080120.bc", + kernels .. "/dawn_sc_080121_080127.bc", + kernels .. "/dawn_sc_080128_080203.bc", + kernels .. "/dawn_sc_080204_080210.bc", + kernels .. "/dawn_sc_080211_080217.bc", + kernels .. "/dawn_sc_080218_080224.bc", + kernels .. "/dawn_sc_080225_080302.bc", + kernels .. "/dawn_sc_080303_080309.bc", + kernels .. "/dawn_sc_080310_080316.bc", + kernels .. "/dawn_sc_080317_080323.bc", + kernels .. "/dawn_sc_080324_080330.bc", + kernels .. "/dawn_sc_080331_080406.bc", + kernels .. "/dawn_sc_080407_080413.bc", + kernels .. "/dawn_sc_080414_080420.bc", + kernels .. "/dawn_sc_080421_080427.bc", + kernels .. "/dawn_sc_080428_080504.bc", + kernels .. "/dawn_sc_080505_080511.bc", + kernels .. "/dawn_sc_080512_080518.bc", + kernels .. "/dawn_sc_080519_080525.bc", + kernels .. "/dawn_sc_080526_080601.bc", + kernels .. "/dawn_sc_080602_080608.bc", + kernels .. "/dawn_sc_080609_080615.bc", + kernels .. "/dawn_sc_080616_080622.bc", + kernels .. "/dawn_sc_080623_080629.bc", + kernels .. "/dawn_sc_080630_080706.bc", + kernels .. "/dawn_sc_080707_080713.bc", + kernels .. "/dawn_sc_080714_080720.bc", + kernels .. "/dawn_sc_080721_080727.bc", + kernels .. "/dawn_sc_080728_080803.bc", + kernels .. "/dawn_sc_080804_080810.bc", + kernels .. "/dawn_sc_080811_080817.bc", + kernels .. "/dawn_sc_080818_080824.bc", + kernels .. "/dawn_sc_080825_080831.bc", + kernels .. "/dawn_sc_080901_080907.bc", + kernels .. "/dawn_sc_080908_080914.bc", + kernels .. "/dawn_sc_080915_080921.bc", + kernels .. "/dawn_sc_080922_080928.bc", + kernels .. "/dawn_sc_080929_081005.bc", + kernels .. "/dawn_sc_081006_081012.bc", + kernels .. "/dawn_sc_081013_081019.bc", + kernels .. "/dawn_sc_081020_081026.bc", + kernels .. "/dawn_sc_081027_081102.bc", + kernels .. "/dawn_sc_081103_081109.bc", + kernels .. "/dawn_sc_081110_081116.bc", + kernels .. "/dawn_sc_081117_081123.bc", + kernels .. "/dawn_sc_081124_081130.bc", + kernels .. "/dawn_sc_081201_081207.bc", + kernels .. "/dawn_sc_081208_081214.bc", + kernels .. "/dawn_sc_081215_081221.bc", + kernels .. "/dawn_sc_081222_081228.bc", + kernels .. "/dawn_sc_081229_090104.bc", + kernels .. "/dawn_sc_090105_090111.bc", + kernels .. "/dawn_sc_090112_090118.bc", + kernels .. "/dawn_sc_090119_090125.bc", + kernels .. "/dawn_sc_090126_090201.bc", + kernels .. "/dawn_sc_090202_090208.bc", + kernels .. "/dawn_sc_090209_090215.bc", + kernels .. "/dawn_sc_090216_090222.bc", + kernels .. "/dawn_sc_090223_090301.bc", + kernels .. "/dawn_sc_090302_090308.bc", + kernels .. "/dawn_sc_090309_090315.bc", + kernels .. "/dawn_sc_090316_090322.bc", + kernels .. "/dawn_sc_090323_090329.bc", + kernels .. "/dawn_sc_090330_090405.bc", + kernels .. "/dawn_sc_090406_090412.bc", + kernels .. "/dawn_sc_090413_090419.bc", + kernels .. "/dawn_sc_090420_090426.bc", + kernels .. "/dawn_sc_090427_090503.bc", + kernels .. "/dawn_sc_090504_090510.bc", + kernels .. "/dawn_sc_090511_090517.bc", + kernels .. "/dawn_sc_090518_090524.bc", + kernels .. "/dawn_sc_090525_090531.bc", + kernels .. "/dawn_sc_090601_090607.bc", + kernels .. "/dawn_sc_090608_090614.bc", + kernels .. "/dawn_sc_090615_090621.bc", + kernels .. "/dawn_sc_090622_090628.bc", + kernels .. "/dawn_sc_090629_090705.bc", + kernels .. "/dawn_sc_090706_090712.bc", + kernels .. "/dawn_sc_090713_090719.bc", + kernels .. "/dawn_sc_090720_090726.bc", + kernels .. "/dawn_sc_090727_090802.bc", + kernels .. "/dawn_sc_090803_090809.bc", + kernels .. "/dawn_sc_090810_090816.bc", + kernels .. "/dawn_sc_090817_090823.bc", + kernels .. "/dawn_sc_090824_090830.bc", + kernels .. "/dawn_sc_090831_090906.bc", + kernels .. "/dawn_sc_090907_090913.bc", + kernels .. "/dawn_sc_090914_090920.bc", + kernels .. "/dawn_sc_090921_090927.bc", + kernels .. "/dawn_sc_090928_091004.bc", + kernels .. "/dawn_sc_091005_091011.bc", + kernels .. "/dawn_sc_091012_091018.bc", + kernels .. "/dawn_sc_091019_091025.bc", + kernels .. "/dawn_sc_091026_091101.bc", + kernels .. "/dawn_sc_091102_091108.bc", + kernels .. "/dawn_sc_091109_091115.bc", + kernels .. "/dawn_sc_091116_091122.bc", + kernels .. "/dawn_sc_091123_091129.bc", + kernels .. "/dawn_sc_091130_091206.bc", + kernels .. "/dawn_sc_091207_091213.bc", + kernels .. "/dawn_sc_091214_091220.bc", + kernels .. "/dawn_sc_091221_091227.bc", + kernels .. "/dawn_sc_091228_100103.bc", + kernels .. "/dawn_sc_100104_100110_v2.bc", + kernels .. "/dawn_sc_100111_100117_v2.bc",--]] + -- kernels .. "/dawn_sc_100118_100124.bc", + -- kernels .. "/dawn_sc_100125_100131.bc", + -- kernels .. "/dawn_sc_100201_100207.bc", + -- kernels .. "/dawn_sc_100208_100214.bc", + -- kernels .. "/dawn_sc_100215_100221.bc", + -- kernels .. "/dawn_sc_100222_100228.bc", + -- kernels .. "/dawn_sc_100301_100307.bc", + -- kernels .. "/dawn_sc_100308_100314.bc", + -- kernels .. "/dawn_sc_100315_100321.bc", + -- kernels .. "/dawn_sc_100322_100328.bc", + -- kernels .. "/dawn_sc_100329_100404.bc", + -- kernels .. "/dawn_sc_100405_100411.bc", + -- kernels .. "/dawn_sc_100412_100418.bc", + -- kernels .. "/dawn_sc_100419_100425.bc", + -- kernels .. "/dawn_sc_100426_100502.bc", + -- kernels .. "/dawn_sc_100503_100509.bc", + -- kernels .. "/dawn_sc_100510_100516.bc", + -- kernels .. "/dawn_sc_100517_100523.bc", + -- kernels .. "/dawn_sc_100524_100530.bc", + -- kernels .. "/dawn_sc_100531_100606.bc", + -- kernels .. "/dawn_sc_100607_100613.bc", + -- kernels .. "/dawn_sc_100614_100620.bc", + -- kernels .. "/dawn_sc_100621_100627.bc", + -- kernels .. "/dawn_sc_100628_100704.bc", + -- kernels .. "/dawn_sc_100705_100711.bc", + -- kernels .. "/dawn_sc_100712_100718.bc", + -- kernels .. "/dawn_sc_100719_100725.bc", + -- kernels .. "/dawn_sc_100726_100801.bc", + -- kernels .. "/dawn_sc_100802_100808.bc", + -- kernels .. "/dawn_sc_100809_100815.bc", + -- kernels .. "/dawn_sc_100816_100822.bc", + -- kernels .. "/dawn_sc_100823_100829.bc", + -- kernels .. "/dawn_sc_100830_100905.bc", + -- kernels .. "/dawn_sc_100906_100912.bc", + -- kernels .. "/dawn_sc_100913_100919.bc", + -- kernels .. "/dawn_sc_100920_100926.bc", + -- kernels .. "/dawn_sc_100927_101003.bc", + -- kernels .. "/dawn_sc_101004_101010.bc", + -- kernels .. "/dawn_sc_101011_101017.bc", + -- kernels .. "/dawn_sc_101018_101024.bc", + -- kernels .. "/dawn_sc_101025_101031.bc", + -- kernels .. "/dawn_sc_101101_101107.bc", + -- kernels .. "/dawn_sc_101108_101114.bc", + -- kernels .. "/dawn_sc_101115_101121.bc", + -- kernels .. "/dawn_sc_101122_101128.bc", + -- kernels .. "/dawn_sc_101129_101205.bc", + -- kernels .. "/dawn_sc_101206_101212.bc", + -- kernels .. "/dawn_sc_101213_101219.bc", + -- kernels .. "/dawn_sc_101220_101226.bc", + -- kernels .. "/dawn_sc_101227_110102.bc", + -- kernels .. "/dawn_sc_110103_110109.bc", + -- kernels .. "/dawn_sc_110110_110116.bc", + -- kernels .. "/dawn_sc_110117_110123.bc", + -- kernels .. "/dawn_sc_110124_110130.bc", + -- kernels .. "/dawn_sc_110131_110206.bc", + -- kernels .. "/dawn_sc_110207_110213.bc", + -- kernels .. "/dawn_sc_110214_110220.bc", + -- kernels .. "/dawn_sc_110221_110227.bc", + -- kernels .. "/dawn_sc_110228_110306.bc", + -- kernels .. "/dawn_sc_110307_110313.bc", + -- kernels .. "/dawn_sc_110314_110320.bc", + -- kernels .. "/dawn_sc_110321_110327.bc", + -- kernels .. "/dawn_sc_110328_110403.bc", + -- kernels .. "/dawn_sc_110404_110410.bc", + -- kernels .. "/dawn_sc_110411_110417.bc", + -- kernels .. "/dawn_sc_110418_110424.bc", + -- kernels .. "/dawn_sc_110425_110501.bc", + -- kernels .. "/dawn_sc_110502_110508.bc", + -- kernels .. "/dawn_sc_110509_110515.bc", + -- kernels .. "/dawn_sc_110516_110522.bc", + -- kernels .. "/dawn_sc_110523_110529.bc", + -- kernels .. "/dawn_sc_110530_110605.bc", + -- kernels .. "/dawn_sc_110606_110612.bc", + -- kernels .. "/dawn_sc_110613_110619.bc", + -- kernels .. "/dawn_sc_110620_110626.bc", + -- kernels .. "/dawn_sc_110627_110703.bc", + -- kernels .. "/dawn_sc_110704_110710.bc", + -- kernels .. "/dawn_sc_110711_110717.bc", + -- kernels .. "/dawn_sc_110718_110724.bc", + -- kernels .. "/dawn_sc_110725_110731.bc", + -- kernels .. "/dawn_sc_110801_110807.bc", + -- kernels .. "/dawn_sc_110808_110814.bc", + -- kernels .. "/dawn_sc_110815_110821.bc", + -- kernels .. "/dawn_sc_110822_110828.bc", + -- kernels .. "/dawn_sc_110829_110904.bc", + -- kernels .. "/dawn_sc_110905_110911.bc", + -- kernels .. "/dawn_sc_110912_110918.bc", + -- kernels .. "/dawn_sc_110919_110925.bc", + -- kernels .. "/dawn_sc_110926_111002.bc", + -- kernels .. "/dawn_sc_111003_111009.bc", + -- kernels .. "/dawn_sc_111010_111016.bc", + -- kernels .. "/dawn_sc_111017_111023.bc", + -- kernels .. "/dawn_sc_111024_111030.bc", + -- kernels .. "/dawn_sc_111031_111106.bc", + -- kernels .. "/dawn_sc_111107_111113.bc", + -- kernels .. "/dawn_sc_111114_111120.bc", + -- kernels .. "/dawn_sc_111121_111127.bc", + -- kernels .. "/dawn_sc_111128_111204.bc", + -- kernels .. "/dawn_sc_111205_111211.bc", + -- kernels .. "/dawn_sc_111212_111218.bc", + -- kernels .. "/dawn_sc_111219_111225.bc", + -- kernels .. "/dawn_sc_111226_120101.bc", + -- kernels .. "/dawn_sc_120102_120108.bc", + -- kernels .. "/dawn_sc_120109_120115.bc", + -- kernels .. "/dawn_sc_120116_120122.bc", + -- kernels .. "/dawn_sc_120123_120129.bc", + -- kernels .. "/dawn_sc_120130_120205.bc", + -- kernels .. "/dawn_sc_120206_120212.bc", + -- kernels .. "/dawn_sc_120213_120219.bc", + -- kernels .. "/dawn_sc_120220_120226.bc", + -- kernels .. "/dawn_sc_120227_120304.bc", + -- kernels .. "/dawn_sc_120305_120311.bc", + -- kernels .. "/dawn_sc_120312_120318.bc", + -- kernels .. "/dawn_sc_120319_120325.bc", + -- kernels .. "/dawn_sc_120326_120401.bc", + -- kernels .. "/dawn_sc_120402_120408.bc", + -- kernels .. "/dawn_sc_120409_120415.bc", + -- kernels .. "/dawn_sc_120416_120422.bc", + -- kernels .. "/dawn_sc_120423_120429.bc", + -- kernels .. "/dawn_sc_120430_120506.bc", + -- kernels .. "/dawn_sc_120507_120513.bc", + -- kernels .. "/dawn_sc_120514_120520.bc", + -- kernels .. "/dawn_sc_120521_120527.bc", + -- kernels .. "/dawn_sc_120528_120603.bc", + -- kernels .. "/dawn_sc_120604_120610.bc", + -- kernels .. "/dawn_sc_120611_120617.bc", + -- kernels .. "/dawn_sc_120618_120624.bc", + -- kernels .. "/dawn_sc_120625_120701.bc", + -- kernels .. "/dawn_sc_120702_120708.bc", + -- kernels .. "/dawn_sc_120709_120715.bc", + -- kernels .. "/dawn_sc_120716_120722.bc", + -- kernels .. "/dawn_sc_120723_120729.bc", + -- kernels .. "/dawn_sc_120730_120805.bc", + -- kernels .. "/dawn_sc_120806_120812.bc", + -- kernels .. "/dawn_sc_120813_120819.bc", + -- kernels .. "/dawn_sc_120820_120826.bc", + -- kernels .. "/dawn_sc_120827_120902.bc", + -- kernels .. "/dawn_sc_120903_120909.bc", + -- kernels .. "/dawn_sc_120910_120916.bc", + -- kernels .. "/dawn_sc_f2_3942xxxxx.bc", + -- kernels .. "/dawn_sc_pred_da028b_00_eu.bc", + -- kernels .. "/dawn_sc_pred_dc041a_00.bc", + + -- Solar array rotation kernels ~ 2gb + kernels .. "/dawn_sa_070927_070930.bc", + --[[kernels .. "/ck/dawn_sa_071001_071007.bc", + kernels .. "/dawn_sa_071008_071014.bc", + kernels .. "/dawn_sa_071015_071021.bc", + kernels .. "/dawn_sa_071022_071028_v2.bc", + kernels .. "/dawn_sa_071029_071104.bc", + kernels .. "/dawn_sa_071105_071111.bc", + kernels .. "/dawn_sa_071112_071118.bc", + kernels .. "/dawn_sa_071119_071125.bc", + kernels .. "/dawn_sa_071126_071202.bc", + kernels .. "/dawn_sa_071203_071209.bc", + kernels .. "/dawn_sa_071210_071216.bc", + kernels .. "/dawn_sa_071217_071223.bc", + kernels .. "/dawn_sa_071224_071230.bc", + kernels .. "/dawn_sa_071231_080106.bc", + kernels .. "/dawn_sa_080107_080113.bc", + kernels .. "/dawn_sa_080114_080120.bc", + kernels .. "/dawn_sa_080121_080127.bc", + kernels .. "/dawn_sa_080128_080203.bc", + kernels .. "/dawn_sa_080204_080210.bc", + kernels .. "/dawn_sa_080211_080217.bc", + kernels .. "/dawn_sa_080218_080224.bc", + kernels .. "/dawn_sa_080225_080302.bc", + kernels .. "/dawn_sa_080303_080309.bc", + kernels .. "/dawn_sa_080310_080316.bc", + kernels .. "/dawn_sa_080317_080323.bc", + kernels .. "/dawn_sa_080324_080330.bc", + kernels .. "/dawn_sa_080331_080406.bc", + kernels .. "/dawn_sa_080407_080413.bc", + kernels .. "/dawn_sa_080414_080420.bc", + kernels .. "/dawn_sa_080421_080427.bc", + kernels .. "/dawn_sa_080428_080504.bc", + kernels .. "/dawn_sa_080505_080511.bc", + kernels .. "/dawn_sa_080512_080518.bc", + kernels .. "/dawn_sa_080519_080525.bc", + kernels .. "/dawn_sa_080526_080601.bc", + kernels .. "/dawn_sa_080602_080608.bc", + kernels .. "/dawn_sa_080609_080615.bc", + kernels .. "/dawn_sa_080616_080622.bc", + kernels .. "/dawn_sa_080623_080629.bc", + kernels .. "/dawn_sa_080630_080706.bc", + kernels .. "/dawn_sa_080707_080713.bc", + kernels .. "/dawn_sa_080714_080720.bc", + kernels .. "/dawn_sa_080721_080727.bc", + kernels .. "/dawn_sa_080728_080803.bc", + kernels .. "/dawn_sa_080804_080810.bc", + kernels .. "/dawn_sa_080811_080817.bc", + kernels .. "/dawn_sa_080818_080824.bc", + kernels .. "/dawn_sa_080825_080831.bc", + kernels .. "/dawn_sa_080901_080907.bc", + kernels .. "/dawn_sa_080908_080914.bc", + kernels .. "/dawn_sa_080915_080921.bc", + kernels .. "/dawn_sa_080922_080928.bc", + kernels .. "/dawn_sa_080929_081005.bc", + kernels .. "/dawn_sa_081006_081012.bc", + kernels .. "/dawn_sa_081013_081019.bc", + kernels .. "/dawn_sa_081020_081026.bc", + kernels .. "/dawn_sa_081027_081102.bc", + kernels .. "/dawn_sa_081103_081109.bc", + kernels .. "/dawn_sa_081110_081116.bc", + kernels .. "/dawn_sa_081117_081123.bc", + kernels .. "/dawn_sa_081124_081130.bc", + kernels .. "/dawn_sa_081201_081207.bc", + kernels .. "/dawn_sa_081208_081214.bc", + kernels .. "/dawn_sa_081215_081221.bc", + kernels .. "/dawn_sa_081222_081228.bc", + kernels .. "/dawn_sa_081229_090104.bc", + kernels .. "/dawn_sa_090105_090111.bc", + kernels .. "/dawn_sa_090112_090118.bc", + kernels .. "/dawn_sa_090119_090125.bc", + kernels .. "/dawn_sa_090126_090201.bc", + kernels .. "/dawn_sa_090202_090208.bc", + kernels .. "/dawn_sa_090209_090215.bc", + kernels .. "/dawn_sa_090216_090222.bc", + kernels .. "/dawn_sa_090223_090301.bc", + kernels .. "/dawn_sa_090302_090308.bc", + kernels .. "/dawn_sa_090309_090315.bc", + kernels .. "/dawn_sa_090316_090322.bc", + kernels .. "/dawn_sa_090323_090329.bc", + kernels .. "/dawn_sa_090330_090405.bc", + kernels .. "/dawn_sa_090406_090412.bc", + kernels .. "/dawn_sa_090413_090419.bc", + kernels .. "/dawn_sa_090420_090426.bc", + kernels .. "/dawn_sa_090427_090503.bc", + kernels .. "/dawn_sa_090504_090510.bc", + kernels .. "/dawn_sa_090511_090517.bc", + kernels .. "/dawn_sa_090518_090524.bc", + kernels .. "/dawn_sa_090525_090531.bc", + kernels .. "/dawn_sa_090601_090607.bc", + kernels .. "/dawn_sa_090608_090614.bc", + kernels .. "/dawn_sa_090615_090621.bc", + kernels .. "/dawn_sa_090622_090628.bc", + kernels .. "/dawn_sa_090629_090705.bc", + kernels .. "/dawn_sa_090706_090712.bc", + kernels .. "/dawn_sa_090713_090719.bc", + kernels .. "/dawn_sa_090720_090726.bc", + kernels .. "/dawn_sa_090727_090802.bc", + kernels .. "/dawn_sa_090803_090809.bc", + kernels .. "/dawn_sa_090810_090816.bc", + kernels .. "/dawn_sa_090817_090823.bc", + kernels .. "/dawn_sa_090824_090830.bc", + kernels .. "/dawn_sa_090831_090906.bc", + kernels .. "/dawn_sa_090907_090913.bc", + kernels .. "/dawn_sa_090914_090920.bc", + kernels .. "/dawn_sa_090921_090927.bc", + kernels .. "/dawn_sa_090928_091004.bc", + kernels .. "/dawn_sa_091005_091011.bc", + kernels .. "/dawn_sa_091012_091018.bc", + kernels .. "/dawn_sa_091019_091025.bc", + kernels .. "/dawn_sa_091026_091101.bc", + kernels .. "/dawn_sa_091102_091108.bc", + kernels .. "/dawn_sa_091109_091115.bc", + kernels .. "/dawn_sa_091116_091122.bc", + kernels .. "/dawn_sa_091123_091129.bc", + kernels .. "/dawn_sa_091130_091206.bc", + kernels .. "/dawn_sa_091207_091213.bc", + kernels .. "/dawn_sa_091214_091220.bc", + kernels .. "/dawn_sa_091221_091227.bc", + kernels .. "/dawn_sa_091228_100103.bc", + kernels .. "/dawn_sa_100104_100110_v2.bc", + kernels .. "/dawn_sa_100111_100117_v2.bc", + kernels .. "/dawn_sa_100118_100124.bc", + kernels .. "/dawn_sa_100125_100131.bc", + kernels .. "/dawn_sa_100201_100207.bc", + kernels .. "/dawn_sa_100208_100214.bc", + kernels .. "/dawn_sa_100215_100221.bc", + kernels .. "/dawn_sa_100222_100228.bc", + kernels .. "/dawn_sa_100301_100307.bc", + kernels .. "/dawn_sa_100308_100314.bc", + kernels .. "/dawn_sa_100315_100321.bc", + kernels .. "/dawn_sa_100322_100328.bc", + kernels .. "/dawn_sa_100329_100404.bc", + kernels .. "/dawn_sa_100405_100411.bc", + kernels .. "/dawn_sa_100412_100418.bc", + kernels .. "/dawn_sa_100419_100425.bc", + kernels .. "/dawn_sa_100426_100502.bc", + kernels .. "/dawn_sa_100503_100509.bc", + kernels .. "/dawn_sa_100510_100516.bc", + kernels .. "/dawn_sa_100517_100523.bc", + kernels .. "/dawn_sa_100524_100530.bc", + kernels .. "/dawn_sa_100531_100606.bc", + kernels .. "/dawn_sa_100607_100613.bc", + kernels .. "/dawn_sa_100614_100620.bc", + kernels .. "/dawn_sa_100621_100627.bc", + kernels .. "/dawn_sa_100628_100704.bc", + kernels .. "/dawn_sa_100705_100711.bc", + kernels .. "/dawn_sa_100712_100718.bc", + kernels .. "/dawn_sa_100719_100725.bc", + kernels .. "/dawn_sa_100726_100801.bc", + kernels .. "/dawn_sa_100802_100808.bc", + kernels .. "/dawn_sa_100809_100815.bc", + kernels .. "/dawn_sa_100816_100822.bc", + kernels .. "/dawn_sa_100823_100829.bc", + kernels .. "/dawn_sa_100830_100905.bc", + kernels .. "/dawn_sa_100906_100912.bc", + kernels .. "/dawn_sa_100913_100919.bc", + kernels .. "/dawn_sa_100920_100926.bc", + kernels .. "/dawn_sa_100927_101003.bc", + kernels .. "/dawn_sa_101004_101010.bc", + kernels .. "/dawn_sa_101011_101017.bc", --]] + -- kernels .. "/dawn_sa_101018_101024.bc", + -- kernels .. "/dawn_sa_101025_101031.bc", + -- kernels .. "/dawn_sa_101101_101107.bc", + -- kernels .. "/dawn_sa_101108_101114.bc", + -- kernels .. "/dawn_sa_101115_101121.bc", + -- kernels .. "/dawn_sa_101122_101128.bc", + -- kernels .. "/dawn_sa_101129_101205.bc", + -- kernels .. "/dawn_sa_101206_101212.bc", + -- kernels .. "/dawn_sa_101213_101219.bc", + -- kernels .. "/dawn_sa_101220_101226.bc", + -- kernels .. "/dawn_sa_101227_110102.bc", + -- kernels .. "/dawn_sa_110103_110109.bc", + -- kernels .. "/dawn_sa_110110_110116.bc", + -- kernels .. "/dawn_sa_110117_110123.bc", + -- kernels .. "/dawn_sa_110124_110130.bc", + -- kernels .. "/dawn_sa_110131_110206.bc", + -- kernels .. "/dawn_sa_110207_110213.bc", + -- kernels .. "/dawn_sa_110214_110220.bc", + -- kernels .. "/dawn_sa_110221_110227.bc", + -- kernels .. "/dawn_sa_110228_110306.bc", + -- kernels .. "/dawn_sa_110307_110313.bc", + -- kernels .. "/dawn_sa_110314_110320.bc", + -- kernels .. "/dawn_sa_110321_110327.bc", + -- kernels .. "/dawn_sa_110328_110403.bc", + -- kernels .. "/dawn_sa_110404_110410.bc", + -- kernels .. "/dawn_sa_110411_110417.bc", + -- kernels .. "/dawn_sa_110418_110424.bc", + -- kernels .. "/dawn_sa_110425_110501.bc", + -- kernels .. "/dawn_sa_110502_110508.bc", + -- kernels .. "/dawn_sa_110509_110515.bc", + -- kernels .. "/dawn_sa_110516_110522.bc", + -- kernels .. "/dawn_sa_110523_110529.bc", + -- kernels .. "/dawn_sa_110530_110605.bc", + -- kernels .. "/dawn_sa_110606_110612.bc", + -- kernels .. "/dawn_sa_110613_110619.bc", + -- kernels .. "/dawn_sa_110620_110626.bc", + -- kernels .. "/dawn_sa_110627_110703.bc", + -- kernels .. "/dawn_sa_110704_110710.bc", + -- kernels .. "/dawn_sa_110711_110717.bc", + -- kernels .. "/dawn_sa_110718_110724.bc", + -- kernels .. "/dawn_sa_110725_110731.bc", + -- kernels .. "/dawn_sa_110801_110807.bc", + -- kernels .. "/dawn_sa_110808_110814.bc", + -- kernels .. "/dawn_sa_110815_110821.bc", + -- kernels .. "/dawn_sa_110822_110828.bc", + -- kernels .. "/dawn_sa_110829_110904.bc", + -- kernels .. "/dawn_sa_110905_110911.bc", + -- kernels .. "/dawn_sa_110912_110918.bc", + -- kernels .. "/dawn_sa_110919_110925.bc", + -- kernels .. "/dawn_sa_110926_111002.bc", + -- kernels .. "/dawn_sa_111003_111009.bc", + -- kernels .. "/dawn_sa_111010_111016.bc", + -- kernels .. "/dawn_sa_111017_111023.bc", + -- kernels .. "/dawn_sa_111024_111030.bc", + -- kernels .. "/dawn_sa_111031_111106.bc", + -- kernels .. "/dawn_sa_111107_111113.bc", + -- kernels .. "/dawn_sa_111114_111120.bc", + -- kernels .. "/dawn_sa_111121_111127.bc", + -- kernels .. "/dawn_sa_111128_111204.bc", + -- kernels .. "/dawn_sa_111205_111211.bc", + -- kernels .. "/dawn_sa_111212_111218.bc", + -- kernels .. "/dawn_sa_111219_111225.bc", + -- kernels .. "/dawn_sa_111226_120101.bc", + -- kernels .. "/dawn_sa_120102_120108.bc", + -- kernels .. "/dawn_sa_120109_120115.bc", + -- kernels .. "/dawn_sa_120116_120122.bc", + -- kernels .. "/dawn_sa_120123_120129.bc", + -- kernels .. "/dawn_sa_120130_120205.bc", + -- kernels .. "/dawn_sa_120206_120212.bc", + -- kernels .. "/dawn_sa_120213_120219.bc", + -- kernels .. "/dawn_sa_120220_120226.bc", + -- kernels .. "/dawn_sa_120227_120304.bc", + -- kernels .. "/dawn_sa_120305_120311.bc", + -- kernels .. "/dawn_sa_120312_120318.bc", + -- kernels .. "/dawn_sa_120319_120325.bc", + -- kernels .. "/dawn_sa_120326_120401.bc", + -- kernels .. "/dawn_sa_120402_120408.bc", + -- kernels .. "/dawn_sa_120409_120415.bc", + -- kernels .. "/dawn_sa_120416_120422.bc", + -- kernels .. "/dawn_sa_120423_120429.bc", + -- kernels .. "/dawn_sa_120430_120506.bc", + -- kernels .. "/dawn_sa_120507_120513.bc", + -- kernels .. "/dawn_sa_120514_120520.bc", + -- kernels .. "/dawn_sa_120521_120527.bc", + -- kernels .. "/dawn_sa_120528_120603.bc", + -- kernels .. "/dawn_sa_120604_120610.bc", + -- kernels .. "/dawn_sa_120611_120617.bc", + -- kernels .. "/dawn_sa_120618_120624.bc", + -- kernels .. "/dawn_sa_120625_120701.bc", + -- kernels .. "/dawn_sa_120702_120708.bc", + -- kernels .. "/dawn_sa_120709_120715.bc", + -- kernels .. "/dawn_sa_120716_120722.bc", + -- kernels .. "/dawn_sa_120723_120729.bc", + -- kernels .. "/dawn_sa_120730_120805.bc", + -- kernels .. "/dawn_sa_120806_120812.bc", + -- kernels .. "/dawn_sa_120813_120819.bc", + -- kernels .. "/dawn_sa_120820_120826.bc", + -- kernels .. "/dawn_sa_120827_120902.bc", + -- kernels .. "/dawn_sa_120903_120909.bc", + -- kernels .. "/dawn_sa_120910_120916.bc", +} + +local LightSources = { + { + Type = "SceneGraphLightSource", + Identifier = "Sun", + Node = sunTransforms.SolarSystemBarycenter.Identifier, + Intensity = 1.0 + }, + { + Identifier = "Camera", + Type = "CameraLightSource", + Intensity = 0.5 + } +} + +local Dawn = { + Identifier = "Dawn", + Parent = transforms.SolarSystemBarycenter.Identifier, + Transform = { + Translation = { + Type = "SpiceTranslation", + Target = "DAWN", + Observer = "SUN", + Kernels = KernelFiles + }, + Rotation = { + Type = "SpiceRotation", + SourceFrame = "DAWN_SPACECRAFT", + DestinationFrame = "GALACTIC", + Kernels = KernelFiles + } + }, + Renderable = { + Type = "RenderableModel", + Body = "DAWN", + Geometry = { + Type = "MultiModelGeometry", + GeometryFile = models .. "/mainbodydawn.obj" + }, + ColorTexture = textures .. "/gray.png", + LightSources = LightSources + }, + GUI = { + Path = "/Solar System/Missions/Dawn" + } +} + +-- Dawn Solar Array module 1 +local DawnSolarArray1 = { + Identifier = "DawnSolar1", + Parent = Dawn.Identifier, + Transformation = { + Rotation = { + Type = "SpiceRotation", + SourceFrame = "DAWN_SA-Y", + DestinationFrame = "DAWN_SPACECRAFT" + } + }, + Renderable = { + Type = "RenderableModel", + Body = "DAWN", + Geometry = { + Type = "MultiModelGeometry", + GeometryFile = models .. "/solarpanelleft.obj" + }, + ColorTexture = textures .. "/gray.png", + LightSources = LightSources + }, + GUI = { + Name = "Dawn Solar 1", + Path = "/Solar System/Missions/Dawn" + } +} + +-- Dawn Solar Array module 2 +local DawnSolarArray2 = { + Identifier = "DawnSolar2", + Parent = Dawn.Identifier, + Transformation = { + Rotation = { + Type = "SpiceRotation", + SourceFrame = "DAWN_SA+Y", + DestinationFrame = "DAWN_SPACECRAFT" + } + }, + Renderable = { + Type = "RenderableModel", + Body = "DAWN", + Geometry = { + Type = "MultiModelGeometry", + GeometryFile = models .. "/solarpanelright.obj" + }, + ColorTexture = textures .. "/gray.png", + LightSources = LightSources + }, + GUI = { + Name = "Dawn Solar 2", + Path = "/Solar System/Missions/Dawn" + } +} + +local DawnTrail = { + Identifier = "DawnTrail", + Parent = transforms.SolarSystemBarycenter.Identifier, + Renderable = { + Type = "RenderableTrailTrajectory", + Translation = { + Type = "SpiceTranslation", + Target = "DAWN", + Observer = "SUN" + }, + Color = { 1.0, 0.8, 0.4 }, + ShowFullTrail = true, + StartTime = "2007 SEP 26 13:28:00", + EndTime = "2012 SEP 12 12:00:00", + PointSize = 5, + SampleInterval = 3600, + TimeStampSubsampleFactor = 4, + EnableFade = false, + Rendering = "Lines+Points" + }, + GUI = { + Name = "Dawn Trail", + Path = "/Solar System/Missions/Dawn" + } +} + +-- DawnFov 1 +local DawnFramingCamera1 = { + Identifier = "Dawn_framing_camera_1", + Parent = Dawn.Identifier, + Renderable = { + Type = "RenderableFov", + Body = "DAWN", + Frame = "DAWN_SPACECRAFT", + Color = { 0.8, 0.7, 0.7 }, + Instrument = { + Name = "DAWN_FC1", + Method = "ELLIPSOID", + Aberration = "NONE" + }, + PotentialTargets = { "VESTA", "CERES" } + }, + GUI = { + Name = "Dawn Framing Camera 1", + Path = "/Solar System/Missions/Dawn" + } +} + +local DawnFramingCamera2 = { + Identifier = "Dawn_framing_camera_2", + Parent = Dawn.Identifier, + Renderable = { + Type = "RenderableFov", + Body = "DAWN", + Frame = "DAWN_SPACECRAFT", + Color = { 0.8, 0.7, 0.7 }, + Instrument = { + Name = "DAWN_FC2", + Method = "ELLIPSOID", + Aberration = "NONE" + }, + PotentialTargets = { "VESTA", "CERES" } + }, + GUI = { + Name = "Dawn Framing Camera 2", + Path = "/Solar System/Missions/Dawn" + } +} + +assetHelper.registerSceneGraphNodesAndExport(asset, { + Dawn, + DawnSolarArray1, + DawnSolarArray2, + DawnTrail, + DawnFramingCamera1, + DawnFramingCamera2 +}) diff --git a/data/assets/scene/solarsystem/missions/dawn/dawn_kernels.asset b/data/assets/scene/solarsystem/missions/dawn/dawn_kernels.asset new file mode 100644 index 0000000000..6ee7f55abc --- /dev/null +++ b/data/assets/scene/solarsystem/missions/dawn/dawn_kernels.asset @@ -0,0 +1,8 @@ +local Kernels = asset.syncedResource({ + Name = "Dawn Kernels", + Type = "HttpSynchronization", + Identifier = "dawn_kernels", + Version = 1 +}) + +asset.export("Kernels", Kernels) \ No newline at end of file diff --git a/data/assets/scene/solarsystem/missions/gaia/gaia.asset b/data/assets/scene/solarsystem/missions/gaia/gaia.asset new file mode 100644 index 0000000000..b5c6d6a18d --- /dev/null +++ b/data/assets/scene/solarsystem/missions/gaia/gaia.asset @@ -0,0 +1,67 @@ +local assetHelper = asset.require('util/asset_helper') +local transforms = asset.require('./transforms') +local sunTransforms = asset.require('scene/solarsystem/sun/transforms') + + +local textures = asset.syncedResource({ + Name = "Gaia Textures", + Type = "HttpSynchronization", + Identifier = "gaia_textures", + Version = 1 +}) + +local model = asset.syncedResource({ + Name = "Gaia Model", + Type = "HttpSynchronization", + Identifier = "gaia_model", + Version = 1 +}) + + +local Gaia = { + Identifier = "Gaia", + Parent = transforms.GaiaPosition.Identifier, + Transform = { + Rotation = { + Type = "FixedRotation", + Attached = "Gaia", + XAxis = { 1.0, 0.0, 0.0 }, + XAxisOrthogonal = true, + YAxis = "Sun", + YAxisInverted = true + }, + Scale = { + Type = "StaticScale", + Scale = 10.0 + } + }, + -- X Orthogonal + Renderable = { + Type = "RenderableModel", + Body = "GAIA", + Geometry = { + Type = "MultiModelGeometry", + GeometryFile = model .. "/gaia.obj" + }, + ColorTexture = textures .. "/gaia-baked.png", + LightSources = { + { + Type = "SceneGraphLightSource", + Identifier = "Sun", + Node = sunTransforms.SolarSystemBarycenter.Identifier, + Intensity = 0.3 + }, + { + Identifier = "Camera", + Type = "CameraLightSource", + Intensity = 0.4 + } + } + }, + GUI = { + Name = "Gaia", + Path = "/Solar System/Missions/Gaia" + } +} + +assetHelper.registerSceneGraphNodesAndExport(asset, { Gaia }) diff --git a/data/assets/scene/solarsystem/missions/gaia/trail.asset b/data/assets/scene/solarsystem/missions/gaia/trail.asset new file mode 100644 index 0000000000..0ca2041067 --- /dev/null +++ b/data/assets/scene/solarsystem/missions/gaia/trail.asset @@ -0,0 +1,64 @@ +local assetHelper = asset.require('util/asset_helper') +local earthTransforms = asset.require('scene/solarsystem/planets/earth/transforms') +local sunTransforms = asset.require('scene/solarsystem/sun/transforms') + +local trail = asset.syncedResource({ + Name = "Gaia Trail", + Type = "HttpSynchronization", + Identifier = "gaia_trail", + Version = 2 +}) + +local GaiaTrail = { + Identifier = "GaiaTrail", + Parent = earthTransforms.EarthBarycenter.Identifier, + Renderable = { + Type = "RenderableTrailTrajectory", + Enabled = false, + Translation = { + Type = "HorizonsTranslation", + HorizonsTextFile = trail .. "/gaia_orbit_horizons.dat" + }, + Color = { 0.0, 0.8, 0.7 }, + ShowFullTrail = false, + StartTime = "2013 DEC 19 09:55:10", + EndTime = "2019 JUN 20 05:55:10", + PointSize = 5, + SampleInterval = 12000, + TimeStampSubsampleFactor = 1, + EnableFade = false, + Rendering = "Lines" + }, + GUI = { + Name = "Gaia Trail", + Path = "/Solar System/Missions/Gaia" + } +} + +local GaiaTrailEclip = { + Identifier = "GaiaTrail_Eclip", + Parent = sunTransforms.SolarSystemBarycenter.Identifier, + Renderable = { + Type = "RenderableTrailTrajectory", + Enabled = false, + Translation = { + Type = "HorizonsTranslation", + HorizonsTextFile = trail .. "/gaia_orbit_horizons_sun.dat" + }, + Color = { 1.0, 0.0, 0.0 }, + ShowFullTrail = false, + StartTime = "2013 DEC 19 09:55:10", + EndTime = "2019 JUN 20 05:55:10", + PointSize = 5, + SampleInterval = 6000, + TimeStampSubsampleFactor = 1, + EnableFade = false, + Rendering = "Lines" + }, + GUI = { + Name = "Gaia Ecliptic Trail", + Path = "/Solar System/Missions/Gaia" + } +} + +assetHelper.registerSceneGraphNodesAndExport(asset, { GaiaTrail, GaiaTrailEclip } ) diff --git a/data/assets/scene/solarsystem/missions/gaia/transforms.asset b/data/assets/scene/solarsystem/missions/gaia/transforms.asset new file mode 100644 index 0000000000..a06ed09a95 --- /dev/null +++ b/data/assets/scene/solarsystem/missions/gaia/transforms.asset @@ -0,0 +1,27 @@ +local assetHelper = asset.require('util/asset_helper') +local earthTransforms = asset.require('scene/solarsystem/planets/earth/transforms') + + +local trail = asset.syncedResource({ + Name = "Gaia Trail", + Type = "HttpSynchronization", + Identifier = "gaia_trail", + Version = 1 +}) + +local GaiaPosition = { + Identifier = "GaiaPosition", + Parent = earthTransforms.EarthBarycenter.Identifier, + Transform = { + Translation = { + Type = "HorizonsTranslation", + HorizonsTextFile = trail .. "/gaia_orbit_horizons.dat" + }, + }, + GUI = { + Name = "Position", + Path = "/Solar System/Missions/Gaia" + } +} + +assetHelper.registerSceneGraphNodesAndExport(asset, { GaiaPosition }) diff --git a/data/assets/scene/solarsystem/missions/insight/edl.asset b/data/assets/scene/solarsystem/missions/insight/edl.asset new file mode 100644 index 0000000000..5ede98786a --- /dev/null +++ b/data/assets/scene/solarsystem/missions/insight/edl.asset @@ -0,0 +1,981 @@ +asset.require('spice/base') +local sunTransforms = asset.require('scene/solarsystem/sun/transforms') +local assetHelper = asset.require('util/asset_helper') + +local models_chutes = asset.syncedResource({ + Name = "Insight Models Chutes", + Type = "HttpSynchronization", + Identifier = "insight_models_chutes", + Version = 1 +}) + +local models_cruise_arrays = asset.syncedResource({ + Name = "Insight Models Cruise Arrays", + Type = "HttpSynchronization", + Identifier = "insight_models_cruise_arrays", + Version = 1 +}) + +local models_cruise_cone = asset.syncedResource({ + Name = "Insight Models Cruise Cone", + Type = "HttpSynchronization", + Identifier = "insight_models_cruise_cone", + Version = 1 +}) + +local models_lander_lander_deck = asset.syncedResource({ + Name = "Insight Models Lander Deck", + Type = "HttpSynchronization", + Identifier = "insight_models_lander_lander_deck", + Version = 1 +}) + +local models_lander_legs_deploy = asset.syncedResource({ + Name = "Insight Models Lander Legs Deploy", + Type = "HttpSynchronization", + Identifier = "insight_models_lander_legs_deploy", + Version = 1 +}) + +local models_lander_legs_stow = asset.syncedResource({ + Name = "Insight Models Lander Legs Stow", + Type = "HttpSynchronization", + Identifier = "insight_models_lander_legs_stow", + Version = 1 +}) + +local models_lander_panels_deploy = asset.syncedResource({ + Name = "Insight Models Lander Panels Deploy", + Type = "HttpSynchronization", + Identifier = "insight_models_lander_panels_deploy", + Version = 1 +}) + +local models_lander_panels_stow = asset.syncedResource({ + Name = "Insight Models Lander Panels Stow", + Type = "HttpSynchronization", + Identifier = "insight_models_lander_panels_stow", + Version = 1 +}) + + + + +local ikernels = asset.syncedResource({ + Name = "Insight Kernels", + Type = "HttpSynchronization", + Identifier = "insight_kernels", + Version = 1 +}) + +local iKernels = { + ikernels .. '/nsyt_spk_cruise_od063_v1_approach2surface_SC_Lander.tsc', + ikernels .. '/insight_v02.tfr', + ikernels .. '/mar085s.bsp', + ikernels .. '/nsyt_spk_cruise_POST_approach2surface_SC_Lander.bsp', + ikernels .. '/nsyt_spk_cruise_POST_approach2surface_SC_Lander.bck', +} + +local RotationMatrix = { + -1, 0, 0, + 0, 0, -1, + 0, -1, 0 +} + +local LightSources = { + { + Type = "SceneGraphLightSource", + Identifier = "Sun", + Node = sunTransforms.SolarSystemBarycenter.Identifier, + Intensity = 1.0 + }, + { + Type = "SceneGraphLightSource", + Identifier = "Mars", + Node = "Mars", + Intensity = 1.0 + }, + { + Identifier = "Camera", + Type = "CameraLightSource", + Intensity = 0.5 + } +} + +--expected timeline +local entryTimeStart = "2018 NOV 26 19:39:03.68"; --(-00:08:07.32 less then pdf) +local parachuteDeployTime1 = "2018 NOV 26 19:42:41.68" -- entry + 218s +local parachuteDeployTime20 = "2018 NOV 26 19:42:42.18" -- entry + 218.5s +local parachuteDeployTime40 = "2018 NOV 26 19:42:42.68" -- entry + 219s +local heatShieldSeperationTime = "2018 NOV 26 19:42:56.68" -- entry + 233s +local legDeployTime = "2018 NOV 26 19:43:06.68" -- entry + 243s +local landerSeperationTime = "2018 NOV 26 19:44:51.68" -- entry + 348s +local touchdownTime = "2018 NOV 26 19:45:32.68" -- entry + 389s +local panelDeployTime = "2018 NOV 26 19:45:33.68" -- entry + 390s +local foreverTime = "2018 NOV 26 20:17:50.68" -- entry + 2327s + +local kernelTouchdownTime = "2018 NOV 26 19:45:32.3" +local spiceRotationEndTime = "2018 NOV 26 19:51:39" + +local InsightParent = { + Identifier = "InsightParent", + Parent = "MarsBarycenter", + Transform = { + Translation = { + Type = "SpiceTranslation", + Target = "INSIGHT", + Observer = "MARS", + Frame = "GALACTIC", + Kernels = iKernels + }, + Rotation = { + Type = "SpiceRotation", + SourceFrame = "INSIGHT_LANDER_CRUISE", + DestinationFrame = "GALACTIC" + }, + }, + TimeFrame = { + Type = "TimeFrameInterval", + Start = entryTimeStart, + End = spiceRotationEndTime + }, + GUI = { + Hidden = true, + Name = "InsightParent", + Path = "/Solar System/Missions/Insight" + } +} + +-- -1397 offset for MOLA +local Insight = { + Identifier = "Insight", + Parent = "InsightParent", + Transform = { + Rotation = { + Type = "StaticRotation", + Rotation = {0.0, 0.0, -3.1415} + } + }, + GUI = { + Name = "Insight", + Path = "/Solar System/Missions/Insight" + } +} + +local Insight_Entry_CapsuleA = { + Identifier = "Insight_Entry_CapsuleA", + Parent = Insight.Identifier, + Renderable = { + Type = "RenderableModel", + Geometry = { + Type = "MultiModelGeometry", + GeometryFile = models_cruise_cone .. "/cruise_insight_doubleside2_newcapsule_diffuse.obj" + }, + ColorTexture = models_cruise_cone .. "/insight_newcapsule_diffuse.jpg", + ModelTransform = RotationMatrix, + LightSources = LightSources, + }, + TimeFrame = { + Type = "TimeFrameInterval", + Start = entryTimeStart, + End = landerSeperationTime + }, + GUI = { + Hidden = true, + Name = "Insight Entry CapsuleA", + Path = "/Solar System/Missions/Insight" + } +} + +local Insight_Entry_Capsule_Ring = { + Identifier = "Insight_Entry_Capsule_Ring", + Parent = Insight.Identifier, + Renderable = { + Type = "RenderableModel", + Geometry = { + Type = "MultiModelGeometry", + GeometryFile = models_cruise_cone .. "/insight_cruise_cone_ring_foil_gold.obj" + }, + ColorTexture = models_cruise_cone .. "/foil_gold_ramp.png", + ModelTransform = RotationMatrix, + LightSources = LightSources, + }, + TimeFrame = { + Type = "TimeFrameInterval", + Start = entryTimeStart, + End = landerSeperationTime + }, + GUI = { + Hidden = true, + Name = "Insight Entry Capsule Ring", + Path = "/Solar System/Missions/Insight" + } +} + +local Insight_Entry_Capsule_Plugs = { + Identifier = "Insight_Entry_Capsule_Plugs", + Parent = Insight.Identifier, + Renderable = { + Type = "RenderableModel", + Geometry = { + Type = "MultiModelGeometry", + GeometryFile = models_cruise_cone .. "/insight_cruise_cone_capsule_diffuse.obj" + }, + ColorTexture = models_cruise_cone .. "/insight_capsule_diffuse.png", + ModelTransform = RotationMatrix, + LightSources = LightSources, + }, + TimeFrame = { + Type = "TimeFrameInterval", + Start = entryTimeStart, + End = landerSeperationTime + }, + GUI = { + Hidden = true, + Name = "Insight Entry Capsule Plugs", + Path = "/Solar System/Missions/Insight" + } +} + +local Insight_Entry_Heatshield = { + Identifier = "Insight_Entry_Heatshield", + Parent = Insight.Identifier, + Renderable = { + Type = "RenderableModel", + Geometry = { + Type = "MultiModelGeometry", + GeometryFile = models_cruise_cone .. "/insight_cruise_heatshield_foil_gold.obj" + }, + ColorTexture = models_cruise_cone .. "/foil_gold_ramp.png", + ModelTransform = RotationMatrix, + LightSources = LightSources, + }, + TimeFrame = { + Type = "TimeFrameInterval", + Start = entryTimeStart, + End = heatShieldSeperationTime + }, + GUI = { + Hidden = true, + Name = "Insight Entry Heatshield", + Path = "/Solar System/Missions/Insight" + } +} + +local Insight_Parachute_0 = { + Identifier = "Insight_Parachute_0", + Parent = Insight.Identifier, + Renderable = { + Type = "RenderableModel", + Geometry = { + Type = "MultiModelGeometry", + GeometryFile = models_chutes .. "/insight_chute_frame01_diff1.obj" + }, + ColorTexture = models_chutes .. "/chute_diff.png", + ModelTransform = RotationMatrix, + LightSources = LightSources, + }, + TimeFrame = { + Type = "TimeFrameInterval", + Start = parachuteDeployTime1, + End = parachuteDeployTime20 + }, + GUI = { + Hidden = true, + Name = "Insight Parachute0", + Path = "/Solar System/Missions/Insight" + } +} + +local Insight_Parachute_Cords_0 = { + Identifier = "Insight_Parachute_Cords_0", + Parent = Insight.Identifier, + Renderable = { + Type = "RenderableModel", + Geometry = { + Type = "MultiModelGeometry", + GeometryFile = models_chutes .. "/insight_chute_frame01_cords1.obj" + }, + ColorTexture = models_chutes .. "/foil_gold_ramp.png", + ModelTransform = RotationMatrix, + LightSources = LightSources, + }, + TimeFrame = { + Type = "TimeFrameInterval", + Start = parachuteDeployTime1, + End = parachuteDeployTime20 + }, + GUI = { + Hidden = true, + Name = "Insight ParachuteC0", + Path = "/Solar System/Missions/Insight" + } +} + +local Insight_Parachute_20 = { + Identifier = "Insight_Parachute_20", + Parent = Insight.Identifier, + Renderable = { + Type = "RenderableModel", + Geometry = { + Type = "MultiModelGeometry", + GeometryFile = models_chutes .. "/insight_chute_frame20_diff1.obj" + }, + ColorTexture = models_chutes .. "/chute_diff.png", + ModelTransform = RotationMatrix, + LightSources = LightSources, + }, + TimeFrame = { + Type = "TimeFrameInterval", + Start = parachuteDeployTime20, + End = parachuteDeployTime40 + }, + GUI = { + Hidden = true, + Name = "Insight Parachute20", + Path = "/Solar System/Missions/Insight" + } +} + +local Insight_Parachute_Cords_20 = { + Identifier = "Insight_Parachute_Cords_20", + Parent = Insight.Identifier, + Renderable = { + Type = "RenderableModel", + Geometry = { + Type = "MultiModelGeometry", + GeometryFile = models_chutes .. "/insight_chute_frame20_cords1.obj" + }, + ColorTexture = models_chutes .. "/foil_gold_ramp.png", + ModelTransform = RotationMatrix, + LightSources = LightSources, + }, + TimeFrame = { + Type = "TimeFrameInterval", + Start = parachuteDeployTime20, + End = parachuteDeployTime40 + }, + GUI = { + Hidden = true, + Name = "Insight ParachuteC20", + Path = "/Solar System/Missions/Insight" + } +} + +local Insight_Parachute_40 = { + Identifier = "Insight_Parachute_40", + Parent = Insight.Identifier, + Renderable = { + Type = "RenderableModel", + Geometry = { + Type = "MultiModelGeometry", + GeometryFile = models_chutes .. "/chute_doubleside_frame40_diff.obj" + }, + ColorTexture = models_chutes .. "/chute_diff.png", + ModelTransform = RotationMatrix, + LightSources = LightSources, + }, + TimeFrame = { + Type = "TimeFrameInterval", + Start = parachuteDeployTime40, + End = landerSeperationTime + }, + GUI = { + Hidden = true, + Name = "Insight Parachute40", + Path = "/Solar System/Missions/Insight" + } +} + +local Insight_Parachute_Cords_40 = { + Identifier = "Insight_Parachute_Cords_40", + Parent = Insight.Identifier, + Renderable = { + Type = "RenderableModel", + Geometry = { + Type = "MultiModelGeometry", + GeometryFile = models_chutes .. "/insight_chute_frame40_cords1.obj" + }, + ColorTexture = models_chutes .. "/foil_gold_ramp.png", + ModelTransform = RotationMatrix, + LightSources = LightSources, + }, + TimeFrame = { + Type = "TimeFrameInterval", + Start = parachuteDeployTime40, + End = landerSeperationTime + }, + GUI = { + Hidden = true, + Name = "Insight ParachuteC40", + Path = "/Solar System/Missions/Insight" + } +} + +local Insight_Lander_A001 = { + Identifier = "Insight_Lander_A001", + Parent = Insight.Identifier, + Renderable = { + Type = "RenderableModel", + Geometry = { + Type = "MultiModelGeometry", + GeometryFile = models_lander_lander_deck .. "/insight_lander_deck_AO01.obj" + }, + ColorTexture = models_lander_lander_deck .. "/InSIGHT_AO_01.jpg", + ModelTransform = RotationMatrix, + LightSources = LightSources, + }, + TimeFrame = { + Type = "TimeFrameInterval", + Start = entryTimeStart, + End = foreverTime + }, + GUI = { + Hidden = true, + Name = "Insight Lander A001", + Path = "/Solar System/Missions/Insight" + } +} + +local Insight_Lander_A002 = { + Identifier = "Insight_Lander_A002", + Parent = Insight.Identifier, + Renderable = { + Type = "RenderableModel", + Geometry = { + Type = "MultiModelGeometry", + GeometryFile = models_lander_lander_deck .. "/insight_lander_deck_AO02.obj" + }, + ColorTexture = models_lander_lander_deck .. "/InSIGHT_AO_02.jpg", + ModelTransform = RotationMatrix, + LightSources = LightSources, + }, + TimeFrame = { + Type = "TimeFrameInterval", + Start = entryTimeStart, + End = foreverTime + }, + GUI = { + Hidden = true, + Name = "Insight Lander A002", + Path = "/Solar System/Missions/Insight" + } +} + +local Insight_Lander_A003 = { + Identifier = "Insight_Lander_A003", + Parent = Insight.Identifier, + Renderable = { + Type = "RenderableModel", + Geometry = { + Type = "MultiModelGeometry", + GeometryFile = models_lander_lander_deck .. "/insight_lander_deck_AO03.obj" + }, + ColorTexture = models_lander_lander_deck .. "/InSIGHT_AO_03.jpg", + ModelTransform = RotationMatrix, + LightSources = LightSources, + }, + TimeFrame = { + Type = "TimeFrameInterval", + Start = entryTimeStart, + End = foreverTime + }, + GUI = { + Hidden = true, + Name = "Insight Lander A003", + Path = "/Solar System/Missions/Insight" + } +} + +local Insight_Lander_A004 = { + Identifier = "Insight_Lander_A004", + Parent = Insight.Identifier, + Renderable = { + Type = "RenderableModel", + Geometry = { + Type = "MultiModelGeometry", + GeometryFile = models_lander_lander_deck .. "/insight_lander_deck_AO04.obj" + }, + ColorTexture = models_lander_lander_deck .. "/InSIGHT_AO_04.jpg", + ModelTransform = RotationMatrix, + LightSources = LightSources, + }, + TimeFrame = { + Type = "TimeFrameInterval", + Start = entryTimeStart, + End = foreverTime + }, + GUI = { + Hidden = true, + Name = "Insight Lander A004", + Path = "/Solar System/Missions/Insight" + } +} + +local Insight_Lander_A005 = { + Identifier = "Insight_Lander_A005", + Parent = Insight.Identifier, + Renderable = { + Type = "RenderableModel", + Geometry = { + Type = "MultiModelGeometry", + GeometryFile = models_lander_lander_deck .. "/insight_lander_deck_AO05.obj" + }, + ColorTexture = models_lander_lander_deck .. "/InSIGHT_AO_05.jpg", + ModelTransform = RotationMatrix, + LightSources = LightSources, + }, + TimeFrame = { + Type = "TimeFrameInterval", + Start = entryTimeStart, + End = foreverTime + }, + GUI = { + Hidden = true, + Name = "Insight Lander A005", + Path = "/Solar System/Missions/Insight" + } +} + +local Insight_Lander_A006 = { + Identifier = "Insight_Lander_A006", + Parent = Insight.Identifier, + Renderable = { + Type = "RenderableModel", + Geometry = { + Type = "MultiModelGeometry", + GeometryFile = models_lander_lander_deck .. "/insight_lander_deck_AO06.obj" + }, + ColorTexture = models_lander_lander_deck .. "/InSIGHT_AO_06.jpg", + ModelTransform = RotationMatrix, + LightSources = LightSources, + }, + TimeFrame = { + Type = "TimeFrameInterval", + Start = entryTimeStart, + End = foreverTime + }, + GUI = { + Hidden = true, + Name = "Insight Lander A006", + Path = "/Solar System/Missions/Insight" + } +} + +local Insight_Lander_A007 = { + Identifier = "Insight_Lander_A007", + Parent = Insight.Identifier, + Renderable = { + Type = "RenderableModel", + Geometry = { + Type = "MultiModelGeometry", + GeometryFile = models_lander_lander_deck .. "/insight_lander_deck_AO07.obj" + }, + ColorTexture = models_lander_lander_deck .. "/InSIGHT_AO_07.jpg", + ModelTransform = RotationMatrix, + LightSources = LightSources, + }, + TimeFrame = { + Type = "TimeFrameInterval", + Start = entryTimeStart, + End = foreverTime + }, + GUI = { + Hidden = true, + Name = "Insight Lander A007", + Path = "/Solar System/Missions/Insight" + } +} + +local Insight_Lander_A008 = { + Identifier = "Insight_Lander_A008", + Parent = Insight.Identifier, + Renderable = { + Type = "RenderableModel", + Geometry = { + Type = "MultiModelGeometry", + GeometryFile = models_lander_lander_deck .. "/insight_lander_deck_AO08.obj" + }, + ColorTexture = models_lander_lander_deck .. "/InSIGHT_AO_08.jpg", + ModelTransform = RotationMatrix, + LightSources = LightSources, + }, + TimeFrame = { + Type = "TimeFrameInterval", + Start = entryTimeStart, + End = foreverTime + }, + GUI = { + Hidden = true, + Name = "Insight Lander A008", + Path = "/Solar System/Missions/Insight" + } +} + +local Insight_Lander_foil1 = { + Identifier = "Insight_Lander_foil1", + Parent = Insight.Identifier, + Renderable = { + Type = "RenderableModel", + Geometry = { + Type = "MultiModelGeometry", + GeometryFile = models_lander_lander_deck .. "/insight_lander_deck_foil1.obj" + }, + ColorTexture = models_lander_lander_deck .. "/foil_silver_ramp.jpg", + ModelTransform = RotationMatrix, + LightSources = LightSources, + }, + TimeFrame = { + Type = "TimeFrameInterval", + Start = entryTimeStart, + End = foreverTime + }, + GUI = { + Hidden = true, + Name = "Insight Lander foil", + Path = "/Solar System/Missions/Insight" + } +} + +local Insight_Lander_Tex01 = { + Identifier = "Insight_Lander_Tex01", + Parent = Insight.Identifier, + Renderable = { + Type = "RenderableModel", + Geometry = { + Type = "MultiModelGeometry", + GeometryFile = models_lander_lander_deck .. "/insight_lander_deck_tex01.obj" + }, + ColorTexture = models_lander_lander_deck .. "/InSIGHT_tex_01.jpg", + ModelTransform = RotationMatrix, + LightSources = LightSources, + }, + TimeFrame = { + Type = "TimeFrameInterval", + Start = entryTimeStart, + End = foreverTime + }, + GUI = { + Hidden = true, + Name = "Insight Lander Tex01", + Path = "/Solar System/Missions/Insight" + } +} + +local Insight_Lander_Tex02 = { + Identifier = "Insight_Lander_Tex02", + Parent = Insight.Identifier, + Renderable = { + Type = "RenderableModel", + Geometry = { + Type = "MultiModelGeometry", + GeometryFile = models_lander_lander_deck .. "/insight_lander_deck_tex02.obj" + }, + ColorTexture = models_lander_lander_deck .. "/InSIGHT_tex_02.jpg", + ModelTransform = RotationMatrix, + LightSources = LightSources, + }, + TimeFrame = { + Type = "TimeFrameInterval", + Start = entryTimeStart, + End = foreverTime + }, + GUI = { + Hidden = true, + Name = "Insight Lander Tex02", + Path = "/Solar System/Missions/Insight" + } +} + +local Insight_Legs_Stowed_tex = { + Identifier = "Insight_Legs_Stowed_tex", + Parent = Insight.Identifier, + Renderable = { + Type = "RenderableModel", + Geometry = { + Type = "MultiModelGeometry", + GeometryFile = models_lander_legs_stow .. "/insight_lander_legs_stow_tex01.obj" + }, + ColorTexture = models_lander_legs_stow .. "/InSIGHT_tex_01.jpg", + ModelTransform = RotationMatrix, + LightSources = LightSources, + }, + TimeFrame = { + Type = "TimeFrameInterval", + Start = heatShieldSeperationTime, + End = legDeployTime + }, + GUI = { + Hidden = true, + Name = "Insight legs_stow_tex", + Path = "/Solar System/Missions/Insight" + } +} + +local Insight_Legs_Stowed_AO06 = { + Identifier = "Insight_Legs_Stowed_AO", + Parent = Insight.Identifier, + Renderable = { + Type = "RenderableModel", + Geometry = { + Type = "MultiModelGeometry", + GeometryFile = models_lander_legs_stow .. "/insight_lander_legs_stow_AO06.obj" + }, + ColorTexture = models_lander_legs_stow .. "/InSIGHT_AO_06.jpg", + ModelTransform = RotationMatrix, + LightSources = LightSources, + }, + TimeFrame = { + Type = "TimeFrameInterval", + Start = heatShieldSeperationTime, + End = legDeployTime + }, + GUI = { + Hidden = true, + Name = "Insight legs_stow_AO", + Path = "/Solar System/Missions/Insight" + } +} + +local Insight_Legs_Deployed_tex = { + Identifier = "Insight_Legs_Deployed_tex", + Parent = Insight.Identifier, + Renderable = { + Type = "RenderableModel", + Geometry = { + Type = "MultiModelGeometry", + GeometryFile = models_lander_legs_deploy .. "/insight_lander_legs_deploy_tex01.obj" + }, + ColorTexture = models_lander_legs_deploy .. "/InSIGHT_tex_01.jpg", + ModelTransform = RotationMatrix, + LightSources = LightSources, + }, + TimeFrame = { + Type = "TimeFrameInterval", + Start = legDeployTime, + End = foreverTime + }, + GUI = { + Hidden = true, + Name = "Insight legs_deploy_tex", + Path = "/Solar System/Missions/Insight" + } +} + +local Insight_Legs_Deployed_AO06 = { + Identifier = "Insight_Legs_Deployed_AO", + Parent = Insight.Identifier, + Renderable = { + Type = "RenderableModel", + Geometry = { + Type = "MultiModelGeometry", + GeometryFile = models_lander_legs_deploy .. "/insight_lander_legs_deploy_AO06.obj" + }, + ColorTexture = models_lander_legs_deploy .. "/InSIGHT_AO_06.jpg", + ModelTransform = RotationMatrix, + LightSources = LightSources, + }, + TimeFrame = { + Type = "TimeFrameInterval", + Start = legDeployTime, + End = foreverTime + }, + GUI = { + Hidden = true, + Name = "Insight legs_deploy_AO", + Path = "/Solar System/Missions/Insight" + } +} + +local Insight_Panels_Stowed_tex = { + Identifier = "Insight_Panels_Stowed_tex", + Parent = Insight.Identifier, + Renderable = { + Type = "RenderableModel", + Geometry = { + Type = "MultiModelGeometry", + GeometryFile = models_lander_panels_stow .. "/insight_lander_panels_stow_tex01.obj" + }, + ColorTexture = models_lander_panels_stow .. "/InSIGHT_tex_01.jpg", + ModelTransform = RotationMatrix, + LightSources = LightSources, + }, + TimeFrame = { + Type = "TimeFrameInterval", + Start = entryTimeStart, + End = foreverTime + }, + GUI = { + Hidden = true, + Name = "Insight panels_stow_tex", + Path = "/Solar System/Missions/Insight" + } +} + +local Insight_Panels_Stowed_tex2 = { + Identifier = "Insight_Panels_Stowed_tex2", + Parent = Insight.Identifier, + Renderable = { + Type = "RenderableModel", + Geometry = { + Type = "MultiModelGeometry", + GeometryFile = models_lander_panels_stow .. "/insight_lander_panels_stow_tex02.obj" + }, + ColorTexture = models_lander_panels_stow .. "/InSIGHT_tex_02.jpg", + ModelTransform = RotationMatrix, + LightSources = LightSources, + }, + TimeFrame = { + Type = "TimeFrameInterval", + Start = entryTimeStart, + End = foreverTime + }, + GUI = { + Hidden = true, + Name = "Insight panels_stow_tex2", + Path = "/Solar System/Missions/Insight" + } +} + +local Insight_Panels_Stowed_AO01 = { + Identifier = "Insight_Panels_Stowed_AO", + Parent = Insight.Identifier, + Renderable = { + Type = "RenderableModel", + Geometry = { + Type = "MultiModelGeometry", + GeometryFile = models_lander_panels_stow .. "/insight_lander_panels_stow_AO01.obj" + }, + ColorTexture = models_lander_panels_stow .. "/InSIGHT_AO_01.jpg", + ModelTransform = RotationMatrix, + LightSources = LightSources, + }, + TimeFrame = { + Type = "TimeFrameInterval", + Start = entryTimeStart, + End = foreverTime + }, + GUI = { + Hidden = true, + Name = "Insight panels_stow_AO", + Path = "/Solar System/Missions/Insight" + } +} + +local Insight_Panels_Deployed_tex = { + Identifier = "Insight_panels_Deployed_tex", + Parent = Insight.Identifier, + Renderable = { + Type = "RenderableModel", + Geometry = { + Type = "MultiModelGeometry", + GeometryFile = models_lander_panels_deploy .. "/insight_lander_panels_deploy_tex01.obj" + }, + ColorTexture = models_lander_panels_deploy .. "/InSIGHT_tex_01.jpg", + ModelTransform = RotationMatrix, + LightSources = LightSources, + }, + TimeFrame = { + Type = "TimeFrameInterval", + Start = panelDeployTime, + End = foreverTime + }, + GUI = { + Hidden = true, + Name = "Insight panels_deploy_tex", + Path = "/Solar System/Missions/Insight" + } +} + +local Insight_Panels_Deployed_tex2 = { + Identifier = "Insight_panels_Deployed_tex2", + Parent = Insight.Identifier, + Renderable = { + Type = "RenderableModel", + Geometry = { + Type = "MultiModelGeometry", + GeometryFile = models_lander_panels_deploy .. "/insight_lander_panels_deploy_tex02.obj" + }, + ColorTexture = models_lander_panels_deploy .. "/InSIGHT_tex_02.jpg", + ModelTransform = RotationMatrix, + LightSources = LightSources, + }, + TimeFrame = { + Type = "TimeFrameInterval", + Start = panelDeployTime, + End = foreverTime + }, + GUI = { + Hidden = true, + Name = "Insight panels_deploy_tex2", + Path = "/Solar System/Missions/Insight" + } +} + +local Insight_Panels_Deployed_AO06 = { + Identifier = "Insight_panels_Deployed_AO", + Parent = Insight.Identifier, + Renderable = { + Type = "RenderableModel", + Geometry = { + Type = "MultiModelGeometry", + GeometryFile = models_lander_panels_deploy .. "/insight_lander_panels_deploy_AO01.obj" + }, + ColorTexture = models_lander_panels_deploy .. "/InSIGHT_AO_01.jpg", + ModelTransform = RotationMatrix, + LightSources = LightSources, + }, + TimeFrame = { + Type = "TimeFrameInterval", + Start = panelDeployTime, + End = foreverTime + }, + GUI = { + Hidden = true, + Name = "Insight panels_deploy_AO", + Path = "/Solar System/Missions/Insight" + } +} + +local Insight_Trail = { + Identifier = "InsightTrail", + Parent = "Mars", + Renderable = { + Enabled = false, + Type = "RenderableTrailTrajectory", + Translation = { + Type = "SpiceTranslation", + Target = "-189", + Observer = "MARS", + Frame = "IAU_MARS", + Kernels = iKernels + }, + Color = { 0.70, 0.50, 0.20 }, + StartTime = "2018 NOV 26 19:30:13.390", + EndTime = "2018 NOV 26 19:51:40.890", + SampleInterval = 2 + }, + TimeFrame = { + Type = "TimeFrameInterval", + Start = entryTimeStart, + End = landerSeperationTime + }, + GUI = { + Name = "Insight Trail", + Path = "/Solar System/Missions/Insight" + } +} + +assetHelper.registerSceneGraphNodesAndExport(asset, { + InsightParent, Insight, Insight_Entry_CapsuleA, Insight_Entry_Capsule_Ring, + Insight_Entry_Capsule_Plugs, Insight_Entry_Heatshield, Insight_Parachute_0, + Insight_Parachute_Cords_0, Insight_Parachute_20, Insight_Parachute_Cords_20, + Insight_Parachute_40, Insight_Parachute_Cords_40, Insight_Lander_A001, + Insight_Lander_A002, Insight_Lander_A003, Insight_Lander_A004, Insight_Lander_A005, + Insight_Lander_A006, Insight_Lander_A007, Insight_Lander_A008, Insight_Lander_foil1, + Insight_Lander_Tex01, Insight_Lander_Tex02, Insight_Legs_Stowed_tex, + Insight_Legs_Stowed_AO06, Insight_Legs_Deployed_tex, Insight_Legs_Deployed_AO06, + Insight_Panels_Stowed_tex, Insight_Panels_Stowed_tex2, Insight_Panels_Stowed_AO01, + Insight_Panels_Deployed_tex, Insight_Panels_Deployed_tex2, + Insight_Panels_Deployed_AO06, Insight_Trail +}) diff --git a/data/assets/scene/solarsystem/missions/juno/juno.asset b/data/assets/scene/solarsystem/missions/juno/juno.asset new file mode 100644 index 0000000000..78d0296a6f --- /dev/null +++ b/data/assets/scene/solarsystem/missions/juno/juno.asset @@ -0,0 +1,202 @@ +local assetHelper = asset.require('util/asset_helper') +local transforms = asset.require('scene/solarsystem/planets/jupiter/transforms') +local sunTransforms = asset.require('scene/solarsystem/sun/transforms') + + +local textures = asset.syncedResource({ + Name = "Juno Textures", + Type = "HttpSynchronization", + Identifier = "juno_textures", + Version = 1 +}) + +local model = asset.syncedResource({ + Name = "Juno Model", + Type = "HttpSynchronization", + Identifier = "juno_model", + Version = 1 +}) + + +local kernels = asset.syncedResource({ + Name = "Juno Kernels", + Type = "HttpSynchronization", + Identifier = "juno_kernels", + Version = 2 +}) + +local JunoKernels = { + kernels .. "/juno_v12.tf", + kernels .. "/JNO_SCLKSCET.00039.tsc", + kernels .. "/juno_jade_v00.ti", + kernels .. "/juno_jedi_v00.ti", + kernels .. "/juno_jiram_v01.ti", + kernels .. "/juno_junocam_v00.ti", + kernels .. "/juno_mag_v00.ti", + kernels .. "/juno_mwr_v01.ti", + kernels .. "/juno_struct_v01.ti", + kernels .. "/juno_uvs_v00.ti", + kernels .. "/juno_waves_v00.ti", + kernels .. "/juno_mwr_v01.ti", + kernels .. "/spk_merge_110805_171017_130515.bsp", + kernels .. "/juno_sc_nom_110807_171016_v01.bc", + kernels .. "/juno_sc_prl_110930_111028_jc003c01_v01.bc", + kernels .. "/juno_sc_prl_111028_111125_jc004b00_v01.bc", + kernels .. "/juno_sc_prl_111125_111223_jc005b00_v01.bc", + kernels .. "/juno_sc_prl_111223_120127_jc006a02_v01.bc", + kernels .. "/juno_sc_prl_120127_120217_jc007a00_v01.bc", + kernels .. "/juno_sc_prl_120217_120316_jc008b00_v02.bc", + kernels .. "/juno_sc_prl_120316_120413_jc009a00_v01.bc", + kernels .. "/juno_sc_prl_120413_120511_jc010a04_v01.bc", + kernels .. "/juno_sc_prl_120511_120608_jc011a01_v02.bc", + kernels .. "/juno_sc_prl_120608_120706_jc012b01_v01.bc", + kernels .. "/juno_sc_prl_120706_120802_jc013a01_v01.bc", + kernels .. "/juno_sc_prl_120802_120824_jc014b01_v01.bc", + kernels .. "/juno_sc_prl_120824_120928_jc015m00_v01.bc", + kernels .. "/juno_sc_prl_120919_120928_jc015o00_v01.bc", + kernels .. "/juno_sc_prl_120928_121026_jc016c03_v01.bc", + kernels .. "/juno_sc_prl_121026_121123_jc017a01_v01.bc", + kernels .. "/juno_sc_prl_121123_121221_jc018b01_v01.bc", + kernels .. "/juno_sc_prl_121221_130118_jc019a01_v01.bc", + kernels .. "/juno_sc_prl_130118_130215_jc020b01_v01.bc", + kernels .. "/juno_sc_prl_130315_130412_jc022b01_v01.bc", + kernels .. "/juno_sc_prl_130412_130510_jc023b03_v01.bc", + kernels .. "/juno_sc_prl_130510_130607_jc024a01_v01.bc", + kernels .. "/juno_sc_prl_130607_130705_jc025a00_v01.bc", + kernels .. "/juno_sc_prl_130705_130802_jc026a01_v01.bc", + kernels .. "/juno_sc_prl_130726_131020_jx024a02_EFB_v03.bc", + kernels .. "/juno_sc_prl_130802_130830_jc027a02_v01.bc", + kernels .. "/juno_sc_prl_130830_130927_jc028a01_v01.bc", + kernels .. "/juno_sc_prl_130926_131025_jc029a00_v01.bc", + kernels .. "/juno_sc_prl_130927_131025_jc029c01_v01.bc", + kernels .. "/juno_sc_prl_131022_131025_jc029f00_v01.bc", + kernels .. "/juno_sc_prl_131025_131122_jc030b04_v01.bc", + kernels .. "/juno_sc_prl_131122_131220_jc031b01_v01.bc", + kernels .. "/juno_sc_prl_131220_140124_jc032a01_v01.bc", + kernels .. "/juno_sc_prl_140124_140214_jc033a01_v01.bc", + kernels .. "/juno_sc_prl_140214_140314_jc034b01_v01.bc", + kernels .. "/juno_sc_prl_140314_140411_jc035a01_v01.bc", + kernels .. "/juno_sc_prl_140411_140509_jc036b01_v01.bc", + kernels .. "/juno_sc_prl_140509_140606_jc037b02_v01.bc", + kernels .. "/juno_sc_prl_140606_140704_jc038a01_v01.bc", + kernels .. "/juno_sc_prl_140704_140801_jc039b01_v01.bc", + kernels .. "/juno_sc_prl_140801_140829_jc040a01_v01.bc", + kernels .. "/juno_sc_prl_140829_140926_jc041a01_v01.bc", + kernels .. "/juno_sc_prl_140926_141024_jc042a01_v01.bc", + kernels .. "/juno_sc_prl_141024_141121_jc043a01_v01.bc", + kernels .. "/juno_sc_prl_141105_141121_jc043m01_v01.bc", + kernels .. "/juno_sc_prl_141107_141121_jc043s01_v01.bc", + kernels .. "/juno_sc_prl_141121_141219_jc044a01_v01.bc", + kernels .. "/juno_sc_prl_141219_150123_jc045a01_v01.bc", + kernels .. "/juno_sc_prl_150123_150213_jc046a01_v01.bc", + kernels .. "/juno_sc_prl_150213_150313_jc047a01_v01.bc", + kernels .. "/juno_sc_prl_150312_150409_jc048a01_v01.bc", + kernels .. "/juno_sc_prl_150410_150508_jc049a01_v01.bc", + kernels .. "/juno_sc_prl_150508_150605_jc050a01_v01.bc", + kernels .. "/juno_sc_prl_150605_150703_jc051a01_v01.bc", + kernels .. "/juno_sc_prl_150703_150731_jc052a01_v01.bc", + kernels .. "/juno_sc_prl_150731_150828_jc053a01_v01.bc", + kernels .. "/juno_sc_prl_150805_150828_jc053m00_v01.bc", + kernels .. "/juno_sc_prl_150807_150828_jc053s00_v01.bc", + kernels .. "/juno_sc_prl_150828_150924_jc054a00_v01.bc", + kernels .. "/juno_sc_prl_150924_151023_jc055a00_v01.bc", + kernels .. "/juno_sc_prl_151023_151120_jc056a00_v01.bc", + kernels .. "/juno_sc_prl_151120_151218_jc057a00_v01.bc", + kernels .. "/juno_sc_prl_151218_160115_jc058a00_v01.bc", + kernels .. "/juno_sc_prl_160115_160212_jc059a00_v01.bc", + kernels .. "/juno_sc_prl_160212_160311_jc060a00_v01.bc", + kernels .. "/juno_sc_prl_160311_160408_jc061a00_v01.bc", + kernels .. "/juno_sc_prl_160408_160506_jc062a00_v01.bc", + kernels .. "/juno_sc_prl_160506_160603_jc063a00_v01.bc", + kernels .. "/juno_sc_prl_160603_160630_jc064a00_v01.bc", + kernels .. "/juno_sc_prl_160708_160729_jm0001rp_v02.bc", + kernels .. "/juno_sc_prl_160729_160826_jm0002rp_v01.bc", + kernels .. "/juno_sc_prl_160827_160920_jm0003a00_v01.bc", + kernels .. "/juno_sc_prl_160924_161019_jm0004a00_v01.bc", + kernels .. "/juno_sc_prl_161014_161115_jm0005a00_v01.bc", + kernels .. "/juno_sc_prl_161022_161115_jm0005b00_v01.bc", + kernels .. "/juno_sc_prl_161115_161213_jx0405rp_v01.bc", + kernels .. "/juno_sc_prl_161210_170115_jm0031a00_v01.bc", + kernels .. "/juno_sc_prl_170115_170201_jm0032a00_v01.bc", + kernels .. "/juno_sc_prl_170201_170309_jm0041a00_v01.bc", + kernels .. "/juno_sc_prl_170309_170326_jm0042rp_v01.bc", + kernels .. "/juno_sc_prl_170326_170427_jm0051rp_v01.bc", + kernels .. "/juno_sc_prl_170427_170518_jm0052rp_v01.bc", + kernels .. "/juno_sc_prl_170518_170615_jm0061a00_v01.bc", + kernels .. "/juno_sc_prl_170615_170710_jm0062a00_v01.bc", + kernels .. "/juno_sc_prl_170710_170805_jm0071a00_v01.bc", + kernels .. "/juno_sc_prl_170805_170831_jm0072a00_v01.bc", + kernels .. "/juno_sc_prl_170831_170927_jm0081a00_v01.bc", + kernels .. "/juno_sc_prl_170927_171023_jm0082a00_v01.bc", + kernels .. "/juno_sc_prl_171023_171030_jm0091a00_v01.bc", + kernels .. "/juno_sc_prl_171023_171030_jm0091a00_v01.bc" +} + +local RotationMatrix = { + 0, 1, 0, + 0, 0, 1, + 1, 0, 0 +} + +local Juno = { + Identifier = "Juno", + Parent = transforms.JupiterBarycenter.Identifier, + Transform = { + Translation = { + Type = "SpiceTranslation", + Target = "JUNO", + Observer = "JUPITER BARYCENTER", + Kernels = JunoKernels + }, + Rotation = { + Type = "SpiceRotation", + SourceFrame = "JUNO_SPACECRAFT", + DestinationFrame = "GALACTIC", + Kernels = JunoKernels + } + }, + Renderable = { + Type = "RenderableModel", + Geometry = { + Type = "MultiModelGeometry", + GeometryFile = model .. "/Juno.obj" + }, + ColorTexture = textures .. "/gray.png", + ModelTransform = RotationMatrix, + LightSources = assetHelper.getDefaultLightSources(sunTransforms.SolarSystemBarycenter.Identifier) + }, + TimeFrame = { + Type = "TimeFrameInterval", + Start = "2011-08-07T17:15:00", + End = "2017-10-16T19:29:24" + }, + GUI = { + Path = "/Solar System/Missions/Juno" + } +} + +local JunoTrail = { + Identifier = "JunoTrail", + Parent = transforms.JupiterBarycenter.Identifier, + Renderable = { + Type = "RenderableTrailTrajectory", + Translation = { + Type = "SpiceTranslation", + Target = "JUNO", + Observer = "JUPITER BARYCENTER", + Kernels = JunoKernels + }, + Color = { 0.70, 0.50, 0.20 }, + StartTime = "2016 JUL 01", + EndTime = "2016 DEC 13", + SampleInterval = 2 + }, + GUI = { + Name = "Juno Trail", + Path = "/Solar System/Missions/Juno" + } +} + + + +assetHelper.registerSceneGraphNodesAndExport(asset, { Juno, JunoTrail }) diff --git a/data/assets/scene/solarsystem/missions/messenger/mercurymagnetosphere.asset b/data/assets/scene/solarsystem/missions/messenger/mercurymagnetosphere.asset new file mode 100644 index 0000000000..9a8713faf6 --- /dev/null +++ b/data/assets/scene/solarsystem/missions/messenger/mercurymagnetosphere.asset @@ -0,0 +1,59 @@ +-- mercurymagnetosphere.asset + +local assetHelper = asset.require('util/asset_helper') + +local localFolder = asset.syncedResource({ + Name = "Mercury Magnetosphere", + Type = "HttpSynchronization", + Identifier = "mercury_magnetosphere", + Version = 1 +}) + + +local MercuryRadius = 2.4397E6 + +local Magnetosphere = { + Name = "Mercury Magnetosphere", + Identifier = "MercuryMagnetosphere", + Parent = "MercuryBarycenter", + SceneRadius = 0.8E+5, + Renderable = { + Type = "RenderableTimeVaryingVolume", + SourceDirectory = localFolder, + TransferFunction = localFolder .. "/transferfunction.txt", + Variable = "rho", + StepSize = "0.003", + Dimensions = {64, 64, 64}, + GridType = "Cartesian", + SecondsBefore = 24*60*60*365*100, + SecondsAfter = 24*60*60*365*100, + Enabled = false + }, + Transform = { + Translation = { + Type = "SpiceTranslation", + Target = "MERCURY", + Observer = "MERCURY BARYCENTER", + }, + Rotation = { + Type = "SpiceRotation", + SourceFrame = "MERCURYSE", + DestinationFrame = "GALACTIC", + Kernels = { + localFolder .. "/openspace_mercury.ti" + } + }, + Scale = { + Type = "StaticScale", + Scale = MercuryRadius, + }, + }, + GUI = { + Name = "Mercury Magnetosphere", + Path = "/Solar System/Missions/Messenger" + } +} + +assetHelper.registerSceneGraphNodesAndExport(asset, { + Magnetosphere +}) diff --git a/data/assets/scene/solarsystem/missions/messenger/messengerSC.asset b/data/assets/scene/solarsystem/missions/messenger/messengerSC.asset new file mode 100644 index 0000000000..70861f014e --- /dev/null +++ b/data/assets/scene/solarsystem/missions/messenger/messengerSC.asset @@ -0,0 +1,220 @@ +local assetHelper = asset.require('util/asset_helper') +local sunTransforms = asset.require('scene/solarsystem/sun/transforms') +local mercuryTransforms = asset.require('scene/solarsystem/planets/mercury/transforms') + + +local models = asset.syncedResource({ + Name = "Messenger Models", + Type = "HttpSynchronization", + Identifier = "messenger_model", + Version = 1 +}) + +local kernels = asset.syncedResource({ + Name = "Messenger Kernels", + Type = "HttpSynchronization", + Identifier = "messenger_spice", + Version = 2 +}) + + +local LocalKernels = { + kernels .. '/messenger_2548.tsc', + kernels .. '/msgr_v231.tf', + + kernels .. '/de405.bsp', + kernels .. '/msgr_040803_150430_150430_od431sc_2.bsp', + kernels .. '/msgr_antenna_v000.bsp', + kernels .. '/msgr_de405_de423s.bsp', + + kernels .. '/msgr_epps_v100.ti', + kernels .. '/msgr_grns_v110.ti', + kernels .. '/msgr_mag_v021.ti', + kernels .. '/msgr_mascs_v100.ti', + kernels .. '/msgr_mdis_v160.ti', + kernels .. '/msgr_mla_v010.ti', + kernels .. '/msgr_rs_v111.ti', + kernels .. '/msgr_xrs_v001.ti', + + + kernels .. '/pck00008.tpc', + kernels .. '/pck00008_msgr.tpc', + kernels .. '/pck00009_msgr_v10.tpc', + kernels .. '/pck00010_msgr_v10.tpc', + kernels .. '/pck00010_msgr_v23.tpc', + kernels .. '/pck00010.tpc', + + kernels .. '/msgr_1103_v02.bc', + kernels .. '/msgr_1104_v02.bc', + kernels .. '/msgr_1105_v02.bc', + kernels .. '/msgr_1106_v02.bc', +} + + +local RotationMatrix = { + 1, 0, 0, + 0, 0, -1, + 0, 1, 0 +} + + +local LightSources = assetHelper.getDefaultLightSources(sunTransforms.SolarSystemBarycenter.Identifier) + +local Messenger = { + Identifier = "Messenger", + Parent = sunTransforms.SolarSystemBarycenter.Identifier, + Transform = { + Translation = { + Type = "SpiceTranslation", + Target = "MESSENGER", + Observer = "SUN", + Kernels = LocalKernels + }, + Rotation = { + Type = "SpiceRotation", + SourceFrame = "MSGR_SPACECRAFT", + DestinationFrame = "GALACTIC", + }, + }, + TimeFrame = { + Type = "TimeFrameInterval", + Start = "2011-03-01", + End = "2011-06-30" + }, + GUI = { + Name = "Messenger", + Path = "/Solar System/Missions/Messenger" + } +} + +local MessengerProbeBlack = { + Identifier = "MessengerProbe_black", + Parent = Messenger.Identifier, + Renderable = { + Type = "RenderableModel", + Geometry = { + Type = "MultiModelGeometry", + GeometryFile = models .. "/MessengerProbe_black.obj" + }, + ColorTexture = models .. "/Tex_black.png", + ModelTransform = RotationMatrix, + LightSources = LightSources + }, + GUI = { + Name = "MessengerProbe Black", + Path = "/Solar System/Missions/Messenger" + } +} + +local MessengerProbeFoil = { + Identifier = "MessengerProbe_foil", + Parent = Messenger.Identifier, + Renderable = { + Type = "RenderableModel", + Geometry = { + Type = "MultiModelGeometry", + GeometryFile = models .. "/MessengerProbe_foil.obj" + }, + ColorTexture = models .. "/foil_n2.png", + ModelTransform = RotationMatrix, + LightSources = LightSources + }, + GUI = { + Name = "MessengerProbe foil", + Path = "/Solar System/Missions/Messenger" + } +} + +local MessengerProbeHeatShield = { + Identifier = "MessengerProbe_heatShield", + Parent = Messenger.Identifier, + Renderable = { + Type = "RenderableModel", + Geometry = { + Type = "MultiModelGeometry", + GeometryFile = models .. "/MessengerProbe_heatShield.obj" + }, + ColorTexture = models .. "/AO_heatshield4.png", + ModelTransform = RotationMatrix, + LightSources = LightSources + }, + GUI = { + Name = "MessengerProbe Heat Sheild", + Path = "/Solar System/Missions/Messenger" + } +} + +local MessengerProbeMetal = { + Identifier = "MessengerProbe_Metal", + Parent = Messenger.Identifier, + Renderable = { + Type = "RenderableModel", + Geometry = { + Type = "MultiModelGeometry", + GeometryFile = models .. "/MessengerProbe_metal.obj" + }, + ColorTexture = models .. "/Tex_grey.png", + ModelTransform = RotationMatrix, + LightSources = LightSources + }, + GUI = { + Name = "MessengerProbe Metal", + Path = "/Solar System/Missions/Messenger" + } +} + + +local MessengerProbePanels = { + Identifier = "MessengerProbe_panels", + Parent = Messenger.Identifier, + Renderable = { + Type = "RenderableModel", + Geometry = { + Type = "MultiModelGeometry", + GeometryFile = models .. "/MessengerProbe_panels.obj" + }, + ColorTexture = models .. "/Messenger_tex.png", + ModelTransform = RotationMatrix, + LightSources = LightSources + }, + GUI = { + Name = "MessengerProbe Panels", + Path = "/Solar System/Missions/Messenger" + } +} + +local MessengerTrail = { + Identifier = "MessengerTrail", + Parent = mercuryTransforms.MercuryBarycenter.Identifier, + Renderable = { + Type = "RenderableTrailOrbit", + Translation = { + Type = "SpiceTranslation", + Target = "MESSENGER", + Observer = "MERCURY BARYCENTER", + Kernels = Kernels + }, + Color = { 0.288, 0.375, 0.934 }, + EnableFade = false, + StartTime = "2011 MARCH 01 12:00:00", + EndTime = "2011 MAY 30 12:00:00", + Period = 12, + Resolution = 10000 + + }, + GUI = { + Name = "Messenger Trail", + Path = "/Solar System/Missions/Messenger" + } +} + + +assetHelper.registerSceneGraphNodesAndExport(asset, { + Messenger, + MessengerProbeBlack, + MessengerProbeFoil, + MessengerProbeHeatShield, + MessengerProbeMetal, + MessengerProbePanels, + MessengerTrail +}) diff --git a/data/assets/scene/solarsystem/missions/messenger/openspace_mercury.ti b/data/assets/scene/solarsystem/missions/messenger/openspace_mercury.ti new file mode 100644 index 0000000000..218f8c3ec2 --- /dev/null +++ b/data/assets/scene/solarsystem/missions/messenger/openspace_mercury.ti @@ -0,0 +1,33 @@ +OpenSpace ecliptic frames: +Mercury-centric Solar Ecliptic (MERCURYSE) frame + +These frames are only defined as helper frames for OpenSpace. + + +X is parallel to the geometric planet-sun position vector. + + -Y axis is the normalized component of the planet's orbital vector + + +Z axis is parallel to the cross product of the frame's +X axis + and the frame's +Y axis. + +\begindata + + FRAME_MERCURYSE = 4600199 + FRAME_4600199_NAME = 'MERCURYSE' + FRAME_4600199_CLASS = 5 + FRAME_4600199_CLASS_ID = 4600199 + FRAME_4600199_CENTER = 199 + FRAME_4600199_RELATIVE = 'J2000' + FRAME_4600199_DEF_STYLE = 'PARAMETERIZED' + FRAME_4600199_FAMILY = 'TWO-VECTOR' + FRAME_4600199_PRI_AXIS = 'X' + FRAME_4600199_PRI_VECTOR_DEF = 'OBSERVER_TARGET_POSITION' + FRAME_4600199_PRI_OBSERVER = 'MERCURY' + FRAME_4600199_PRI_TARGET = 'SUN' + FRAME_4600199_PRI_ABCORR = 'NONE' + FRAME_4600199_SEC_AXIS = 'Y' + FRAME_4600199_SEC_VECTOR_DEF = 'OBSERVER_TARGET_VELOCITY' + FRAME_4600199_SEC_OBSERVER = 'MERCURY' + FRAME_4600199_SEC_TARGET = 'SUN' + FRAME_4600199_SEC_ABCORR = 'NONE' + FRAME_4600199_SEC_FRAME = 'J2000' diff --git a/data/assets/scene/solarsystem/missions/messenger/transferfunction.txt b/data/assets/scene/solarsystem/missions/messenger/transferfunction.txt new file mode 100644 index 0000000000..7174117a1e --- /dev/null +++ b/data/assets/scene/solarsystem/missions/messenger/transferfunction.txt @@ -0,0 +1,8 @@ +width 1024 +lower 0.0 +upper 0.1 +mappingkey 0.0 255 0 0 0 +mappingkey 0.01 255 0 0 0 +mappingkey 0.1 255 255 0 100 + +mappingkey 0.5 255 255 0 255 \ No newline at end of file diff --git a/data/assets/scene/solarsystem/missions/newhorizons/charon.asset b/data/assets/scene/solarsystem/missions/newhorizons/charon.asset new file mode 100644 index 0000000000..3929571670 --- /dev/null +++ b/data/assets/scene/solarsystem/missions/newhorizons/charon.asset @@ -0,0 +1,120 @@ +local assetHelper = asset.require('util/asset_helper') +local transforms = asset.require('./transforms') +local sunTransforms = asset.require('scene/solarsystem/sun/transforms') + + + +local textures = asset.syncedResource({ + Name = "Charon Textures", + Type = "HttpSynchronization", + Identifier = "charon_textures", + Version = 3 +}) + +local charonRadius = 6.035E5 + +local CharonProjection = { + Identifier = "CharonProjection", + Parent = transforms.PlutoBarycenterAccurate.Identifier, + Transform = { + Translation = { + Type = "SpiceTranslation", + Target = "CHARON", + Observer = "PLUTO BARYCENTER" + }, + Rotation = { + Type = "SpiceRotation", + SourceFrame = "IAU_CHARON", + DestinationFrame = "GALACTIC" + } + }, + Renderable = { + Type = "RenderablePlanetProjection", + Geometry = { + Type = "SimpleSphere", + Radius = charonRadius, + Segments = 350 + }, + ColorTexturePaths = { + textures .. "/NH_Charon_mosaic.png", + textures .. "/NH_Charon_mosaic_8192.png" + }, + HeightTexturePaths = { + textures .. "/NH_Charon_DTM.png", + textures .. "/NH_Charon_DTM_8192.png" + }, + MeridianShift = true, + Projection = { + Observer = "NEW HORIZONS", + Target = "CHARON", + Aberration = "NONE", + AspectRatio = 2, + + Instrument = { + Name = "NH_LORRI", + Method = "ELLIPSOID", + Aberration = "NONE", + Fovy = 0.2907, + Aspect = 1, + Near = 0.2, + Far = 10000 + }, + + PotentialTargets = { + "PLUTO", + "CHARON" + } + } + }, + GUI = { + Path = "/Solar System/Dwarf Planets/Pluto", + Name = "Charon Projection" + } +} + +local CharonText = { + Identifier = "CharonText", + Parent = CharonProjection.Identifier, + Transform = { + Translation = { + Type = "StaticTranslation", + Position = {0, -1000000.0, 0} + } + }, + Renderable = { + Type = "RenderablePlaneImageLocal", + Size = 10^6.3, + Origin = "Center", + Billboard = true, + Texture = textures .. "/Charon-Text.png", + BlendMode = "Additive" + }, + GUI = { + Name = "Charon Text", + Path = "/Solar System/Dwarf Planets/Pluto" + } +} + +local CharonShadow = { + Identifier = "CharonShadow", + Parent = CharonProjection .Identifier, + Renderable = { + Type = "RenderableShadowCylinder", + TerminatorType = "PENUMBRAL", + LightSource = "SUN", + Observer = "NEW HORIZONS", + Body = "CHARON", + BodyFrame = "IAU_CHARON", + Aberration = "NONE" + }, + GUI = { + Name = "Charon Shadow", + Path = "/Solar System/Dwarf Planets/Pluto" + } +} + +assetHelper.registerSceneGraphNodesAndExport(asset, { + CharonProjection, + CharonText, + CharonShadow +}) diff --git a/data/assets/scene/solarsystem/missions/newhorizons/fov.asset b/data/assets/scene/solarsystem/missions/newhorizons/fov.asset new file mode 100644 index 0000000000..45c7f7ba7e --- /dev/null +++ b/data/assets/scene/solarsystem/missions/newhorizons/fov.asset @@ -0,0 +1,386 @@ +local assetHelper = asset.require('util/asset_helper') +local transforms = asset.require('./transforms') + + + +local LorriOffset = { -6.626, -4.1, -3.23 } +local RalphOffset = { -6.9, -4.6, 8.7 } +local AliceOffset = { -7.9, -1.7, 8.3 } +local RexOffset = { 0, 0, 0 } + +local Lorri = { + Identifier = "NH_LORRI", + Parent = transforms.NewHorizonsPosition.Identifier, + Renderable = { + Type = "RenderableFov", + Body = "NEW HORIZONS", + Frame = "NH_SPACECRAFT", + Color = { 0.8, 0.7, 0.7 }, + Instrument = { + Name = "NH_LORRI", + Aberration = "NONE" + }, + PotentialTargets = { + "Pluto", + "Charon", + -- "Jupiter", "Io", "Europa", "Ganymede", "Callisto" + } + }, + Transform = { + Translation = { + Type = "StaticTranslation", + Position = LorriOffset + } + }, + GUI = { + Name = "LORRI", + Path = "/Solar System/Missions/New Horizons/Instruments" + } +} + +local RalphLeisa = { + Identifier = "NH_RALPH_LEISA", + Parent = transforms.NewHorizonsPosition.Identifier, + Renderable = { + Type = "RenderableFov", + Body = "NEW HORIZONS", + Frame = "NH_SPACECRAFT", + RGB = { 0.8, 0.7, 0.7 }, + Instrument = { + Name = "NH_RALPH_LEISA", + Aberration = "NONE" + }, + PotentialTargets = { + "Pluto", + "Charon", + -- "Jupiter", "Io", "Europa", "Ganymede", "Callisto" + } + }, + Transform = { + Translation = { + Type = "StaticTranslation", + Position = RalphOffset + } + }, + GUI = { + Name = "RALPH LEISA", + Path = "/Solar System/Missions/New Horizons/Instruments" + } +} + +local RalphMvicPan1 = { + Identifier = "NH_RALPH_MVIC_PAN1", + Parent = transforms.NewHorizonsPosition.Identifier, + Renderable = { + Type = "RenderableFov", + Body = "NEW HORIZONS", + Frame = "NH_SPACECRAFT", + RGB = { 0.8, 0.7, 0.7 }, + Instrument = { + Name = "NH_RALPH_MVIC_PAN1", + Aberration = "NONE" + }, + PotentialTargets = { + "Pluto", + "Charon", + -- "Jupiter", "Io", "Europa", "Ganymede", "Callisto" + } + }, + Transform = { + Translation = { + Type = "StaticTranslation", + Position = RalphOffset + } + }, + GUI = { + Name = "RALPH MVIC PAN 1", + Path = "/Solar System/Missions/New Horizons/Instruments" + } +} + +local RalphMvicPan2 = { + Identifier = "NH_RALPH_MVIC_PAN2", + Parent = transforms.NewHorizonsPosition.Identifier, + Renderable = { + Type = "RenderableFov", + Body = "NEW HORIZONS", + Frame = "NH_SPACECRAFT", + RGB = { 0.8, 0.7, 0.7 }, + Instrument = { + Name = "NH_RALPH_MVIC_PAN2", + Aberration = "NONE" + }, + PotentialTargets = { + "Pluto", + "Charon", + -- "Jupiter", "Io", "Europa", "Ganymede", "Callisto" + } + }, + Transform = { + Translation = { + Type = "StaticTranslation", + Position = RalphOffset + } + }, + GUI = { + Name = "RALPH MVIC PAN 2", + Path = "/Solar System/Missions/New Horizons/Instruments" + } +} + +local RalphMvicRed = { + Identifier = "NH_RALPH_MVIC_RED", + Parent = transforms.NewHorizonsPosition.Identifier, + Renderable = { + Type = "RenderableFov", + Body = "NEW HORIZONS", + Frame = "NH_SPACECRAFT", + RGB = { 0.8, 0.7, 0.7 }, + Instrument = { + Name = "NH_RALPH_MVIC_RED", + Aberration = "NONE" + }, + PotentialTargets = { + "Pluto", + "Charon", + -- "Jupiter", "Io", "Europa", "Ganymede", "Callisto" + } + }, + Transform = { + Translation = { + Type = "StaticTranslation", + Position = RalphOffset + } + }, + GUI = { + Name = "RALPH MVIC RED", + Path = "/Solar System/Missions/New Horizons/Instruments" + } +} + +local RalphMvicBlue = { + Identifier = "NH_RALPH_MVIC_BLUE", + Parent = transforms.NewHorizonsPosition.Identifier, + Renderable = { + Type = "RenderableFov", + Body = "NEW HORIZONS", + Frame = "NH_SPACECRAFT", + RGB = { 0.8, 0.7, 0.7 }, + Instrument = { + Name = "NH_RALPH_MVIC_BLUE", + Aberration = "NONE" + }, + PotentialTargets = { + "Pluto", + "Charon", + -- "Jupiter", "Io", "Europa", "Ganymede", "Callisto" + } + }, + Transform = { + Translation = { + Type = "StaticTranslation", + Position = RalphOffset + } + }, + GUI = { + Name = "RALPH MVIC BLUE", + Path = "/Solar System/Missions/New Horizons/Instruments" + } +} + +local RalphMvicFt = { + Identifier = "NH_RALPH_MVIC_FT", + Parent = transforms.NewHorizonsPosition.Identifier, + Renderable = { + Type = "RenderableFov", + Body = "NEW HORIZONS", + Frame = "NH_SPACECRAFT", + RGB = { 0.8, 0.7, 0.7 }, + Instrument = { + Name = "NH_RALPH_MVIC_FT", + Aberration = "NONE" + }, + PotentialTargets = { + "Pluto", + "Charon", + -- "Jupiter", "Io", "Europa", "Ganymede", "Callisto" + } + }, + Transform = { + Translation = { + Type = "StaticTranslation", + Position = RalphOffset + } + }, + GUI = { + Name = "RALPH MVIC FT", + Path = "/Solar System/Missions/New Horizons/Instruments" + } +} + +local RalphMvicMethane = { + Identifier = "NH_RALPH_MVIC_METHANE", + Parent = transforms.NewHorizonsPosition.Identifier, + Renderable = { + Type = "RenderableFov", + Body = "NEW HORIZONS", + Frame = "NH_SPACECRAFT", + RGB = { 0.8, 0.7, 0.7 }, + Instrument = { + Name = "NH_RALPH_MVIC_METHANE", + Aberration = "NONE" + }, + PotentialTargets = { + "Pluto", + "Charon", + -- "Jupiter", "Io", "Europa", "Ganymede", "Callisto" + } + }, + Transform = { + Translation = { + Type = "StaticTranslation", + Position = RalphOffset + } + }, + GUI = { + Name = "RALPH MVIC METHANE", + Path = "/Solar System/Missions/New Horizons/Instruments" + } +} + +local RalphMvicNir = { + Identifier = "NH_RALPH_MVIC_NIR", + Parent = transforms.NewHorizonsPosition.Identifier, + Renderable = { + Type = "RenderableFov", + Body = "NEW HORIZONS", + Frame = "NH_SPACECRAFT", + RGB = { 0.8, 0.7, 0.7 }, + Instrument = { + Name = "NH_RALPH_MVIC_NIR", + Aberration = "NONE" + }, + PotentialTargets = { + "Pluto", + "Charon", + -- "Jupiter", "Io", "Europa", "Ganymede", "Callisto" + } + }, + Transform = { + Translation = { + Type = "StaticTranslation", + Position = RalphOffset + } + }, + GUI = { + Name = "RALPH MVIC NIR", + Path = "/Solar System/Missions/New Horizons/Instruments" + } +} + +local AliceAirglow = { + Identifier = "NH_ALICE_AIRGLOW", + Parent = transforms.NewHorizonsPosition.Identifier, + Renderable = { + Type = "RenderableFov", + Body = "NEW HORIZONS", + Frame = "NH_SPACECRAFT", + RGB = { 0.8, 0.7, 0.7 }, + Instrument = { + Name = "NH_ALICE_AIRGLOW", + Aberration = "NONE" + }, + PotentialTargets = { + "Pluto", + "Charon", + -- "Jupiter", "Io", "Europa", "Ganymede", "Callisto" + }, + SimplifyBounds = true + }, + Transform = { + Translation = { + Type = "StaticTranslation", + Position = AliceOffset + } + }, + GUI = { + Name = "ALICE AIRGLOW", + Path = "/Solar System/Missions/New Horizons/Instruments" + } +} + +local AliceSoc = { + Identifier = "NH_ALICE_SOC", + Parent = transforms.NewHorizonsPosition.Identifier, + Renderable = { + Type = "RenderableFov", + Body = "NEW HORIZONS", + Frame = "NH_SPACECRAFT", + RGB = { 0.8, 0.7, 0.7 }, + Instrument = { + Name = "NH_ALICE_SOC", + Aberration = "NONE" + }, + PotentialTargets = { + "Pluto", + "Charon", + -- "Jupiter", "Io", "Europa", "Ganymede", "Callisto" + } + }, + Transform = { + Translation = { + Type = "StaticTranslation", + Position = AliceOffset + } + }, + GUI = { + Name = "ALICE SOC", + Path = "/Solar System/Missions/New Horizons/Instruments" + } +} + +local Rex = { + Identifier = "NH_REX", + Parent = transforms.NewHorizonsPosition.Identifier, + Renderable = { + Type = "RenderableCrawlingLine", + Source = "NH_REX", + Target = "EARTH", + Instrument = "NH_REX", + Color = { + Start = { 1.0, 0.7, 0.0, 1.0}, + End = {0.0, 0.0, 0.0, 0.0 } + } + }, + Transform = { + Rotation = { + Type = "StaticRotation", + Rotation = {-3.141502/2, 0, -3.141502/2} + }, + Translation = { + Type = "StaticTranslation", + Position = RexOffset + } + }, + GUI = { + Name = "REX", + Path = "/Solar System/Missions/New Horizons/Instruments" + } +} + + + +assetHelper.registerSceneGraphNodesAndExport(asset, { + Lorri, + RalphLeisa, + RalphMvicPan1, + RalphMvicPan2, + RalphMvicRed, + RalphMvicBlue, + RalphMvicFt, + RalphMvicMethane, + RalphMvicNir, + AliceAirglow, + AliceSoc, + Rex +}) diff --git a/data/assets/scene/solarsystem/missions/newhorizons/kernels.asset b/data/assets/scene/solarsystem/missions/newhorizons/kernels.asset new file mode 100644 index 0000000000..ed6816032b --- /dev/null +++ b/data/assets/scene/solarsystem/missions/newhorizons/kernels.asset @@ -0,0 +1,48 @@ +local Kernels = asset.syncedResource({ + Name = "New Horizons Kernels", + Type = "HttpSynchronization", + Identifier = "newhorizons_kernels", + Version = 1 +}) + +local NewHorizonsKernels = { + Kernels .. "/nh_pred_20141201_20190301_od122.bsp", + Kernels .. "/NavSE_plu047_od122.bsp", + Kernels .. "/NavPE_de433_od122.bsp", + + Kernels .. "/new-horizons_1121.tsc", + + Kernels .. "/nh_scispi_2015_pred.bc", + Kernels .. "/nh_scispi_2015_recon.bc", + Kernels .. "/nh_lorri_wcs.bc", + + Kernels .. "/PLU_LORRI_ALL_161216.bc", + + Kernels .. "/nh_targets_v001.tpc", + Kernels .. "/nh_pcnh_005.tpc", + + Kernels .. "/nh_v220.tf", + Kernels .. "/nh_allinstruments_v002.ti", + Kernels .. "/nh_alice_v200.ti", + Kernels .. "/nh_lorri_v201.ti", + Kernels .. "/nh_pepssi_v110.ti", + Kernels .. "/nh_ralph_v100.ti", + Kernels .. "/nh_rex_v100.ti", + Kernels .. "/nh_sdc_v101.ti", + Kernels .. "/nh_swap_v100.ti", + Kernels .. "/nh_astr_v000.ti", + Kernels .. "/nh_fss_v000.ti", + Kernels .. "/nh_soc_misc_v001.tf", + Kernels .. "/nh_stars.bsp", +} + +local PlutoKernels = { + Kernels .. "/NavPE_de433_od122.bsp", + Kernels .. "/NavSE_plu047_od122.bsp" +} + + + +asset.export("Kernels", Kernels) +asset.export("NewHorizonsKernels", NewHorizonsKernels) +asset.export("PlutoKernels", PlutoKernels) diff --git a/data/assets/scene/solarsystem/missions/newhorizons/label.asset b/data/assets/scene/solarsystem/missions/newhorizons/label.asset new file mode 100644 index 0000000000..8353a01be9 --- /dev/null +++ b/data/assets/scene/solarsystem/missions/newhorizons/label.asset @@ -0,0 +1,31 @@ +local assetHelper = asset.require('util/asset_helper') +local sunTransforms = asset.require('scene/solarsystem/sun/transforms') +local transforms = asset.require('./transforms') +local NewHorizonsModel = asset.require('./model') + + + +local textures = NewHorizonsModel.NewHorizonsTextures +local models = NewHorizonsModel.NewHorizonsModels + +local Labels = { + Identifier = "Labels", + Parent = NewHorizonsModel.NewHorizons.Identifier, + Renderable = { + Type = "RenderableModel", + Body = "NEW HORIZONS", + Geometry = { + Type = "MultiModelGeometry", + GeometryFile = models .. "/Labels.obj" + }, + ColorTexture = textures .. "/labels.png", + AmbientIntensity = 0.8 + }, + GUI = { + Path = "/Solar System/Missions/New Horizons" + } +} + + + +assetHelper.registerSceneGraphNodesAndExport(asset, { Labels }) diff --git a/data/assets/scene/solarsystem/missions/newhorizons/model.asset b/data/assets/scene/solarsystem/missions/newhorizons/model.asset new file mode 100644 index 0000000000..57b6d401d8 --- /dev/null +++ b/data/assets/scene/solarsystem/missions/newhorizons/model.asset @@ -0,0 +1,57 @@ +local assetHelper = asset.require('util/asset_helper') +local transforms = asset.require('./transforms') +local sunTransforms = asset.require('scene/solarsystem/sun/transforms') + +local textures = asset.syncedResource({ + Name = "New Horizons Textures", + Type = "HttpSynchronization", + Identifier = "newhorizons_textures", + Version = 3 +}) + +local models = asset.syncedResource({ + Name = "New Horizons Model", + Type = "HttpSynchronization", + Identifier = "newhorizons_model", + Version = 1 +}) + +local NewHorizons = { + Identifier = "NewHorizons", + Parent = transforms.NewHorizonsPosition.Identifier, + Renderable = { + Type = "RenderableModel", + Body = "NEW HORIZONS", + Geometry = { + Type = "MultiModelGeometry", + GeometryFile = models .. "/NewHorizonsCleanModel.obj" + }, + ColorTexture = textures .. "/NHTexture.jpg", + AmbientIntensity = 0.0, + DiffuseIntensity = 1.0, + SpecularIntensity = 1.0, + LightSources = { + { + Type = "SceneGraphLightSource", + Identifier = "Sun", + Node = sunTransforms.SolarSystemBarycenter.Identifier, + Intensity = 1.0 + }, + { + Identifier = "Camera", + Type = "CameraLightSource", + Intensity = 0.5 + } + } + }, + GUI = { + Name = "New Horizons", + Path = "/Solar System/Missions/New Horizons" + } +} + + + +assetHelper.registerSceneGraphNodesAndExport(asset, { NewHorizons }) +asset.export("NewHorizonsTextures", textures) +asset.export("NewHorizonsModels", models) diff --git a/data/assets/scene/solarsystem/missions/newhorizons/newhorizons.asset b/data/assets/scene/solarsystem/missions/newhorizons/newhorizons.asset new file mode 100644 index 0000000000..cf35bc01c1 --- /dev/null +++ b/data/assets/scene/solarsystem/missions/newhorizons/newhorizons.asset @@ -0,0 +1,20 @@ +asset.require('./model') +asset.require('./label') +asset.require('./fov') +asset.require('./trail') + +asset.require('./pluto') +asset.require('./charon') + +asset.require('./othermoons') + +local mission = asset.localResource("newhorizons.mission") +local missionName + +asset.onInitialize(function() + missionName = openspace.loadMission(mission) +end) + +asset.onDeinitialize(function() + openspace.unloadMission(missionName) +end) diff --git a/data/assets/scene/solarsystem/missions/newhorizons/newhorizons.mission b/data/assets/scene/solarsystem/missions/newhorizons/newhorizons.mission new file mode 100644 index 0000000000..66923f4cc0 --- /dev/null +++ b/data/assets/scene/solarsystem/missions/newhorizons/newhorizons.mission @@ -0,0 +1,122 @@ +-- Source: http://pluto.jhuapl.edu/Mission/index.php +-- Many of the values (especially days of the month if 01 or 30 or 31 and hh::mm::ss if all 0) +-- are approximate and need fixing + +return { + Name = "New Horizons", + Phases = { + { + Name = "Cruise Phase", + TimeRange = { Start = "2006 JAN 19 00:00:00", End = "2015 JAN 15 00:00:00" }, + Phases = { + { + Name = "Jupiter fly-by", + TimeRange = { Start = "2007 FEB 28 00:00:00", End = "2007 FEB 28 23:59:59" } + }, + { + Name = "Annual checkout 1", + TimeRange = { Start = "2007 SEP 01 00:00:00", End = "2007 NOV 30 00:00:00" } + }, + { + Name = "Annual checkout 2", + TimeRange = { Start = "2008 JUL 01 00:00:00", End = "2008 AUG 31 00:00:00" } + }, + { + Name = "Annual checkout 3", + TimeRange = { Start = "2009 JUL 01 00:00:00", End = "2009 AUG 31 00:00:00" } + }, + { + Name = "Annual checkout 4", + TimeRange = { Start = "2010 MAY 01 00:00:00", End = "2010 JUL 31 00:00:00" } + }, + { + Name = "Annual checkout 5", + TimeRange = { Start = "2011 MAY 01 00:00:00", End = "2011 JUL 31 00:00:00" } + }, + { + Name = "Annual checkout 6", + TimeRange = { Start = "2012 MAY 01 00:00:00", End = "2012 JUL 31 00:00:00" } + }, + { + Name = "Annual checkout 7", + TimeRange = { Start = "2013 MAY 01 00:00:00", End = "2013 AUG 31 00:00:00" } + }, + { + Name = "Annual checkout 8 and Optical Navigation campaign 1", + TimeRange = { Start = "2014 JUN 01 00:00:00", End = "2014 AUG 31 00:00:00" } + }, + { + Name = "Final Wakeup from Hibernation", + TimeRange = { Start = "2014 DEC 06 00:00:00", End = "2014 DEC 06 23:59:59" } + } + } + }, + { + Name = "Pluto Encounter/Approach Phase 1", + TimeRange = { Start = "2015 JAN 15 00:00:00", End = "2015 APR 01 00:00:00" }, + Phases = { + { + Name = "Optical nagivation campaign 2", + TimeRange = { Start = "2015 JAN 25 00:00:00", End = "2015 APR 01 00:00:00" } + } + } + }, + { + Name = "Pluto Encounter/Approach Phase 2", + TimeRange = { Start = "2015 APR 01 00:00:00", End = "2015 JUN 01 00:00:00" }, + Phases = { + { + Name = "Best-ever images of Pluto", + TimeRange = { Start = "2015 MAY 01 00:00:00", End = "2015 JUN 01 00:00:00" } + } + } + }, + { + Name = "Pluto Encounter/Approach Phase 3", + TimeRange = { Start = "2015 JUN 01 00:00:00", End = "2015 JUL 15 00:00:00" }, + Phases = { + { + Name = "Closest approach to Pluto", + TimeRange = { Start = "2015 JUL 14 11:49:57", End = "2015 JUL 14 11:49:58" } + }, + { + Name = "Closest approach to Charon", + TimeRange = { Start = "2015 JUL 14 12:03:50", End = "2015 JUL 14 12:03:51" } + }, + { + Name = "Pluto-Sun Occultation", + TimeRange = { Start = "2015 JUL 14 12:51:25", End = "2015 JUL 14 12:52:00" } + }, + { + Name = "Pluto-Earth Occultation", + TimeRange = { Start = "2015 JUL 14 12:52:27", End = "2015 JUL 14 12:53:00" } + }, + { + Name = "Charon-Sun Occultation", + TimeRange = { Start = "2015 JUL 14 14:17:40", End = "2015 JUL 14 14:18:00" } + }, + { + Name = "Charon-Earth Occultation", + TimeRange = { Start = "2015 JUL 14 14:20:00", End = "2015 JUL 14 14:21:00" } + } + } + }, + { + Name = "Departure Phase 1", + TimeRange = { Start = "2015 JUL 15 00:00:00", End = "2015 AUG 01 00:00:00" } + }, + { + Name = "Departure Phase 2", + TimeRange = { Start = "2015 AUG 01 00:00:00", End = "2015 OCT 01 00:00:00" } + }, + { + Name = "Departure Phase 3", + TimeRange = { Start = "2015 OCT 01 00:00:00", End = "2016 JAN 01 00:00:00" } + }, + { + Name = "Data Playback Ends", + TimeRange = { Start = "2016 OCT 01 00:00:00", End = "2016 DEC 01 00:00:00" } + } + } +} + diff --git a/data/assets/scene/solarsystem/missions/newhorizons/othermoons.asset b/data/assets/scene/solarsystem/missions/newhorizons/othermoons.asset new file mode 100644 index 0000000000..010e8bc9cf --- /dev/null +++ b/data/assets/scene/solarsystem/missions/newhorizons/othermoons.asset @@ -0,0 +1,126 @@ +local Hydra = asset.require('scene/solarsystem/dwarf_planets/pluto/hydra') +local Kerberos = asset.require('scene/solarsystem/dwarf_planets/pluto/kerberos') +local Nix = asset.require('scene/solarsystem/dwarf_planets/pluto/nix') +local Styx = asset.require('scene/solarsystem/dwarf_planets/pluto/styx') +local assetHelper = asset.require('util/asset_helper') + +local hydraTextures = asset.syncedResource({ + Name = "Hydra Textures", + Type = "HttpSynchronization", + Identifier = "hydra_textures", + Version = 1 +}) + +local HydraText = { + Identifier = "HydraText", + Parent = Hydra.Hydra.Identifier, + Transform = { + Translation = { + Type = "StaticTranslation", + Position = { 1000000, 0, 1000000 }, + }, + }, + Renderable = { + Type = "RenderablePlaneImageLocal", + Size = 10.0^6.3, + Origin = "Center", + Billboard = true, + Texture = hydraTextures .. "/Hydra-Text.png", + BlendMode = "Additive" + }, + GUI = { + Name = "Hydra Text", + Path = "/Solar System/Dwarf Planets/Pluto" + } +} + +local kerberosTextures = asset.syncedResource({ + Name = "Kerberos Textures", + Type = "HttpSynchronization", + Identifier = "kerberos_textures", + Version = 1 +}) + +local KerberosText = { + Identifier = "KerberosText", + Parent = Kerberos.Kerberos.Identifier, + Transform = { + Translation = { + Type = "StaticTranslation", + Position = { 1000000.0, 0, 1000000.0 } + }, + }, + Renderable = { + Type = "RenderablePlaneImageLocal", + Size = 10^6.3, + Origin = "Center", + Billboard = true, + Texture = kerberosTextures .. "/Kerberos-Text.png", + BlendMode = "Additive" + }, + GUI = { + Name = "Kerberos Text", + Path = "/Solar System/Dwarf Planets/Pluto" + } +} + +local nixTextures = asset.syncedResource({ + Name = "Nix Textures", + Type = "HttpSynchronization", + Identifier = "nix_textures", + Version = 1 +}) + +local NixText = { + Identifier = "NixText", + Parent = Nix.Nix.Identifier, + Renderable = { + Type = "RenderablePlaneImageLocal", + Size = 10^6.3, + Origin = "Center", + Billboard = true, + Texture = nixTextures .. "/Nix-Text.png", + BlendMode = "Additive" + }, + GUI = { + Name = "Nix Text", + Path = "/Solar System/Dwarf Planets/Pluto" + } +} + +local styxTextures = asset.syncedResource({ + Name = "Styx Textures", + Type = "HttpSynchronization", + Identifier = "styx_textures", + Version = 1 +}) + +local StyxText = { + Identifier = "StyxText", + Parent = Styx.Styx.Identifier, + Transform = { + Translation = { + Type = "StaticTranslation", + Position = { 1000000.0, 0, 1000000.0 } + }, + }, + Renderable = { + Type = "RenderablePlaneImageLocal", + Size = 10^6.3, + Origin = "Center", + Billboard = true, + Texture = styxTextures .. "/Styx-Text.png", + BlendMode = "Additive" + }, + GUI = { + Name = "Styx Text", + Path = "/Solar System/Dwarf Planets/Pluto" + } +} + +assetHelper.registerSceneGraphNodesAndExport(asset, { + HydraText, + KerberosText, + NixText, + StyxText +}) diff --git a/data/assets/scene/solarsystem/missions/newhorizons/pluto.asset b/data/assets/scene/solarsystem/missions/newhorizons/pluto.asset new file mode 100644 index 0000000000..ec93de4ff5 --- /dev/null +++ b/data/assets/scene/solarsystem/missions/newhorizons/pluto.asset @@ -0,0 +1,251 @@ +local assetHelper = asset.require('util/asset_helper') +local transforms = asset.require('./transforms') +local sunTransforms = asset.require('scene/solarsystem/sun/transforms') + +local assets = asset.syncedResource({ + Name = "Pluto Assets", + Type = "HttpSynchronization", + Identifier = "newhorizons_plutoencounter_pluto_assets", + Version = 1 +}) + +local encounterTextures = asset.syncedResource({ + Name = "Pluto Encounter Textures", + Type = "HttpSynchronization", + Identifier = "newhorizons_plutoencounter_pluto_textures", + Version = 4 +}) + +local textures = asset.syncedResource({ + Name = "Pluto Textures", + Type = "HttpSynchronization", + Identifier = "pluto_textures", + Version = 5 +}) + +local images = asset.syncedResource({ + Name = "Pluto Images", + Type = "HttpSynchronization", + Identifier = "newhorizons_plutoencounter_pluto_images", + Version = 1 +}) + +local plutoRadius = 1.173E6 + +local PlutoProjection = { + Identifier = "PlutoProjection", + Parent = transforms.PlutoBarycenterAccurate.Identifier, + Transform = { + Translation = { + Type = "SpiceTranslation", + Target = "PLUTO", + Observer = "PLUTO BARYCENTER", + Kernels = NewHorizonsKernels + }, + Rotation = { + Type = "SpiceRotation", + SourceFrame = "IAU_PLUTO", + DestinationFrame = "GALACTIC" + }, + Scale = { + Type = "StaticScale", + Scale = 1.0 + } + }, + Renderable = { + Type = "RenderablePlanetProjection", + Radius = plutoRadius, + Geometry = { + Type = "SimpleSphere", + Radius = plutoRadius, + Segments = 400 + }, + ColorTexturePaths = { + textures .. "/pluto.png", + textures .. "/NH_Pluto_mosaic_16384.png", + textures .. "/NH_Pluto_mosaic_8192.png", + textures .. "/pmap_cyl_k201.jpg", + textures .. "/pmap_cyl_k201_4096.jpg" + }, + HeightTexturePaths = { + textures .. "/NH_Pluto_DTM_16384.png", + textures .. "/NH_Pluto_DTM_8192.png" + }, + MeridianShift = false, + Projection = { + Sequence = images, + EventFile = assets .. "/core_v9h_obs_getmets_v8_time_fix_nofrcd_mld.txt", + -- SequenceType = "hybrid", + SequenceType = "image-sequence", + Observer = "NEW HORIZONS", + Target = "PLUTO", + Aberration = "NONE", + AspectRatio = 2, + + DataInputTranslation = { + Instrument = { + LORRI = { + DetectorType = "Camera", + Spice = { "NH_LORRI" } + }, + RALPH_MVIC_PAN_FRAME = { + DetectorType = "Scanner", + StopCommand = "RALPH_ABORT", + Spice = { "NH_RALPH_MVIC_FT" } + }, + RALPH_MVIC_COLOR = { + DetectorType = "Scanner", + StopCommand = "END_NOM", + Spice = { "NH_RALPH_MVIC_NIR", + "NH_RALPH_MVIC_METHANE", + "NH_RALPH_MVIC_RED", + "NH_RALPH_MVIC_BLUE" } + }, + RALPH_LEISA = { + DetectorType = "Scanner", + StopCommand = "END_NOM", + Spice = { "NH_RALPH_LEISA" } + }, + RALPH_MVIC_PAN1 = { + DetectorType = "Scanner", + StopCommand = "END_NOM", + Spice = { "NH_RALPH_MVIC_PAN1" } + }, + RALPH_MVIC_PAN2 = { + DetectorType = "Scanner", + StopCommand = "END_NOM", + Spice = { "NH_RALPH_MVIC_PAN2" } + }, + ALICE_Use_AIRGLOW = { + DetectorType = "Scanner", + StopCommand = "ALICE_END_PIXELLIST", + Spice = { "NH_ALICE_AIRGLOW" } + }, + ALICE_Use_AIRGLOW = { + DetectorType = "Scanner", + StopCommand = "ALICE_END_HISTOGRAM", + Spice = { "NH_ALICE_AIRGLOW" } + }, + ALICE_Use_SOCC = { + DetectorType = "Scanner", + StopCommand = "ALICE_END_PIXELLIST", + Spice = { "NH_ALICE_SOC" } + }, + ALICE_Use_SOCC = { + DetectorType = "Scanner", + StopCommand = "ALICE_END_HISTOGRAM", + Spice = { "NH_ALICE_SOC" } + }, + REX_START = { + DetectorType = "Scanner", + StopCommand = "REX_MODE_OFF", + Spice = { "NH_REX" } + } + }, + Target ={ + Read = { + "TARGET_NAME", + "INSTRUMENT_HOST_NAME", + "INSTRUMENT_ID", + "START_TIME", + "STOP_TIME", + "DETECTOR_TYPE" + }, + Convert = { + PLUTO = { "PLUTO" }, + NEWHORIZONS = { "NEW HORIZONS" }, + CCD = { "CAMERA" }, + FRAMECCD = { "SCANNER" } + } + } + }, + + Instrument = { + Name = "NH_LORRI", + Method = "ELLIPSOID", + Aberration = "NONE", + Fovy = 0.2907, + Aspect = 1, + Near = 0.2, + Far = 10000 + }, + + PotentialTargets = { + "PLUTO", + "CHARON", + "NIX", + "HYDRA", + "P5", + "P4" + } + } + }, + GUI = { + Name = "Pluto Projection", + Path = "/Solar System/Dwarf Planets/Pluto" + } +} + +local PlutoBarycenterLabel = { + Identifier = "PlutoBarycenterLabel", + Parent = transforms.PlutoBarycenterAccurate.Identifier, + Renderable = { + Type = "RenderablePlaneImageLocal", + Billboard = true, + Size = 5E4, + Texture = encounterTextures .. "/barycenter.png", + BlendMode = "Additive" + }, + GUI = { + Name = "Pluto Barycenter Label", + Path = "/Solar System/Dwarf Planets/Pluto" + } +} + +local PlutoText = { + Identifier = "PlutoText", + Parent = PlutoProjection.Identifier, + Transform = { + Translation = { + Type = "StaticTranslation", + Position = {0, -2000000.0, 0} + }, + }, + Renderable = { + Type = "RenderablePlaneImageLocal", + Size = 10^6.3, + Origin = "Center", + Billboard = true, + Texture = encounterTextures .. "/Pluto-Text.png", + BlendMode = "Additive" + }, + GUI = { + Name = "Pluto Text", + Path = "/Solar System/Dwarf Planets/Pluto" + } +} + +local PlutoShadow = { + Identifier = "PlutoShadow", + Parent = PlutoProjection.Identifier, + Renderable = { + Type = "RenderableShadowCylinder", + TerminatorType = "PENUMBRAL", + LightSource = "SUN", + Observer = "NEW HORIZONS", + Body = "PLUTO", + BodyFrame = "IAU_PLUTO", + Aberration = "NONE", + }, + GUI = { + Name = "Pluto Shadow", + Path = "/Solar System/Dwarf Planets/Pluto" + } +} + +assetHelper.registerSceneGraphNodesAndExport(asset, { + PlutoProjection, + PlutoBarycenterLabel, + PlutoText, + PlutoShadow +}) diff --git a/data/assets/scene/solarsystem/missions/newhorizons/trail.asset b/data/assets/scene/solarsystem/missions/newhorizons/trail.asset new file mode 100644 index 0000000000..9ebb30c5d6 --- /dev/null +++ b/data/assets/scene/solarsystem/missions/newhorizons/trail.asset @@ -0,0 +1,36 @@ +local assetHelper = asset.require('util/asset_helper') +local transforms = asset.require('./transforms') + + + +local TrailAtPluto = { + Identifier = "NewHorizonsTrailPluto", + Parent = transforms.PlutoBarycenterAccurate.Identifier, + Renderable = { + Type = "RenderableTrailTrajectory", + Translation = { + Type = "SpiceTranslation", + Target = "NEW HORIZONS", + Observer = "PLUTO BARYCENTER" + }, + Color = { 1.0, 0.8, 0.4 }, + ShowFullTrail = true, + StartTime = "2015 JUL 07 12:00:00", + EndTime = "2015 JUL 17 12:00:00", + PointSize = 5, + SampleInterval = 3600, + TimeStampSubsampleFactor = 4, + EnableFade = false, + Rendering = "Lines+Points" + }, + GUI = { + Name = "New Horizons Trail Pluto", + Path = "/Solar System/Missions/New Horizons" + } +} + + + +assetHelper.registerSceneGraphNodesAndExport(asset, { + TrailAtPluto +}) diff --git a/data/assets/scene/solarsystem/missions/newhorizons/transforms.asset b/data/assets/scene/solarsystem/missions/newhorizons/transforms.asset new file mode 100644 index 0000000000..2ce8b47f00 --- /dev/null +++ b/data/assets/scene/solarsystem/missions/newhorizons/transforms.asset @@ -0,0 +1,54 @@ +local assetHelper = asset.require('util/asset_helper') +local sunTransforms = asset.require('scene/solarsystem/sun/transforms') +local kernels = asset.require('./kernels') + +local PlutoBarycenterAccurate = { + Identifier = "PlutoBarycenterAccurate", + Parent = sunTransforms.SolarSystemBarycenter.Identifier, + TimeFrame = { + Type = "TimeFrameInterval", + Start = "2015-JAN-01", + End = "2015-AUG-01" + }, + Transform = { + Translation = { + Type = "SpiceTranslation", + Target = "PLUTO BARYCENTER", + Observer = "SUN", + Kernels = kernels.PlutoKernels + }, + }, + GUI = { + Name = "Pluto Barycenter Accurate", + Path = "/Solar System/Dwarf Planets/Pluto" + } +} + +local NewHorizonsPosition = { + Identifier = "NewHorizonsPosition", + Parent = PlutoBarycenterAccurate.Identifier, + Transform = { + Translation = { + Type = "SpiceTranslation", + Target = "NEW HORIZONS", + Observer = "PLUTO BARYCENTER", + Kernels = kernels.NewHorizonsKernels + }, + Rotation = { + Type = "SpiceRotation", + SourceFrame = "NH_SPACECRAFT", + DestinationFrame = "GALACTIC" + } + }, + GUI = { + Name = "New Horizons Position", + Path = "/Solar System/Missions/New Horizons" + } +} + + + +assetHelper.registerSceneGraphNodesAndExport(asset, { + PlutoBarycenterAccurate, + NewHorizonsPosition +}) diff --git a/data/assets/scene/solarsystem/missions/osirisrex/InstrumentTimes/BaseballDiamond_PolyCam.txt b/data/assets/scene/solarsystem/missions/osirisrex/InstrumentTimes/BaseballDiamond_PolyCam.txt new file mode 100644 index 0000000000..343ab46e51 --- /dev/null +++ b/data/assets/scene/solarsystem/missions/osirisrex/InstrumentTimes/BaseballDiamond_PolyCam.txt @@ -0,0 +1,2640 @@ +stk.v.10.0 +BEGIN IntervalList +DateUnitAbrv yyyy/mm/dd +BEGIN Intervals + +"2019/01/13 19:18:29.750" "2019/01/13 19:18:29.950" +"2019/01/13 19:18:41.750" "2019/01/13 19:18:41.950" +"2019/01/13 19:18:53.750" "2019/01/13 19:18:53.950" +"2019/01/13 19:19:05.750" "2019/01/13 19:19:05.950" +"2019/01/13 19:19:17.750" "2019/01/13 19:19:17.950" +"2019/01/13 19:19:29.750" "2019/01/13 19:19:29.950" +"2019/01/13 19:19:41.750" "2019/01/13 19:19:41.950" +"2019/01/13 19:19:53.750" "2019/01/13 19:19:53.950" +"2019/01/13 19:20:05.750" "2019/01/13 19:20:05.950" +"2019/01/13 19:20:17.750" "2019/01/13 19:20:17.950" +"2019/01/13 19:20:29.750" "2019/01/13 19:20:29.950" +"2019/01/13 19:20:41.750" "2019/01/13 19:20:41.950" +"2019/01/13 19:20:53.750" "2019/01/13 19:20:53.950" +"2019/01/13 19:21:05.750" "2019/01/13 19:21:05.950" +"2019/01/13 19:21:46.500" "2019/01/13 19:21:46.700" +"2019/01/13 19:21:58.500" "2019/01/13 19:21:58.700" +"2019/01/13 19:22:10.500" "2019/01/13 19:22:10.700" +"2019/01/13 19:22:22.500" "2019/01/13 19:22:22.700" +"2019/01/13 19:22:34.500" "2019/01/13 19:22:34.700" +"2019/01/13 19:22:46.500" "2019/01/13 19:22:46.700" +"2019/01/13 19:22:58.500" "2019/01/13 19:22:58.700" +"2019/01/13 19:23:10.500" "2019/01/13 19:23:10.700" +"2019/01/13 19:23:22.500" "2019/01/13 19:23:22.700" +"2019/01/13 19:23:34.500" "2019/01/13 19:23:34.700" +"2019/01/13 19:23:46.500" "2019/01/13 19:23:46.700" +"2019/01/13 19:23:58.500" "2019/01/13 19:23:58.700" +"2019/01/13 19:24:10.500" "2019/01/13 19:24:10.700" +"2019/01/13 19:24:22.500" "2019/01/13 19:24:22.700" +"2019/01/13 19:29:37.250" "2019/01/13 19:29:37.450" +"2019/01/13 19:29:49.250" "2019/01/13 19:29:49.450" +"2019/01/13 19:30:01.250" "2019/01/13 19:30:01.450" +"2019/01/13 19:30:13.250" "2019/01/13 19:30:13.450" +"2019/01/13 19:30:25.250" "2019/01/13 19:30:25.450" +"2019/01/13 19:30:37.250" "2019/01/13 19:30:37.450" +"2019/01/13 19:30:49.250" "2019/01/13 19:30:49.450" +"2019/01/13 19:31:01.250" "2019/01/13 19:31:01.450" +"2019/01/13 19:31:13.250" "2019/01/13 19:31:13.450" +"2019/01/13 19:31:25.250" "2019/01/13 19:31:25.450" +"2019/01/13 19:31:37.250" "2019/01/13 19:31:37.450" +"2019/01/13 19:31:49.250" "2019/01/13 19:31:49.450" +"2019/01/13 19:32:01.250" "2019/01/13 19:32:01.450" +"2019/01/13 19:32:13.250" "2019/01/13 19:32:13.450" +"2019/01/13 19:32:54.000" "2019/01/13 19:32:54.200" +"2019/01/13 19:33:06.000" "2019/01/13 19:33:06.200" +"2019/01/13 19:33:18.000" "2019/01/13 19:33:18.200" +"2019/01/13 19:33:30.000" "2019/01/13 19:33:30.200" +"2019/01/13 19:33:42.000" "2019/01/13 19:33:42.200" +"2019/01/13 19:33:54.000" "2019/01/13 19:33:54.200" +"2019/01/13 19:34:06.000" "2019/01/13 19:34:06.200" +"2019/01/13 19:34:18.000" "2019/01/13 19:34:18.200" +"2019/01/13 19:34:30.000" "2019/01/13 19:34:30.200" +"2019/01/13 19:34:42.000" "2019/01/13 19:34:42.200" +"2019/01/13 19:34:54.000" "2019/01/13 19:34:54.200" +"2019/01/13 19:35:06.000" "2019/01/13 19:35:06.200" +"2019/01/13 19:35:18.000" "2019/01/13 19:35:18.200" +"2019/01/13 19:35:30.000" "2019/01/13 19:35:30.200" +"2019/01/13 19:40:44.750" "2019/01/13 19:40:44.950" +"2019/01/13 19:40:56.750" "2019/01/13 19:40:56.950" +"2019/01/13 19:41:08.750" "2019/01/13 19:41:08.950" +"2019/01/13 19:41:20.750" "2019/01/13 19:41:20.950" +"2019/01/13 19:41:32.750" "2019/01/13 19:41:32.950" +"2019/01/13 19:41:44.750" "2019/01/13 19:41:44.950" +"2019/01/13 19:41:56.750" "2019/01/13 19:41:56.950" +"2019/01/13 19:42:08.750" "2019/01/13 19:42:08.950" +"2019/01/13 19:42:20.750" "2019/01/13 19:42:20.950" +"2019/01/13 19:42:32.750" "2019/01/13 19:42:32.950" +"2019/01/13 19:42:44.750" "2019/01/13 19:42:44.950" +"2019/01/13 19:42:56.750" "2019/01/13 19:42:56.950" +"2019/01/13 19:43:08.750" "2019/01/13 19:43:08.950" +"2019/01/13 19:43:20.750" "2019/01/13 19:43:20.950" +"2019/01/13 19:44:00.500" "2019/01/13 19:44:00.700" +"2019/01/13 19:44:12.500" "2019/01/13 19:44:12.700" +"2019/01/13 19:44:24.500" "2019/01/13 19:44:24.700" +"2019/01/13 19:44:36.500" "2019/01/13 19:44:36.700" +"2019/01/13 19:44:48.500" "2019/01/13 19:44:48.700" +"2019/01/13 19:45:00.500" "2019/01/13 19:45:00.700" +"2019/01/13 19:45:12.500" "2019/01/13 19:45:12.700" +"2019/01/13 19:45:24.500" "2019/01/13 19:45:24.700" +"2019/01/13 19:45:36.500" "2019/01/13 19:45:36.700" +"2019/01/13 19:45:48.500" "2019/01/13 19:45:48.700" +"2019/01/13 19:46:00.500" "2019/01/13 19:46:00.700" +"2019/01/13 19:46:12.500" "2019/01/13 19:46:12.700" +"2019/01/13 19:46:24.500" "2019/01/13 19:46:24.700" +"2019/01/13 19:46:36.500" "2019/01/13 19:46:36.700" +"2019/01/13 19:51:51.250" "2019/01/13 19:51:51.450" +"2019/01/13 19:52:03.250" "2019/01/13 19:52:03.450" +"2019/01/13 19:52:15.250" "2019/01/13 19:52:15.450" +"2019/01/13 19:52:27.250" "2019/01/13 19:52:27.450" +"2019/01/13 19:52:39.250" "2019/01/13 19:52:39.450" +"2019/01/13 19:52:51.250" "2019/01/13 19:52:51.450" +"2019/01/13 19:53:03.250" "2019/01/13 19:53:03.450" +"2019/01/13 19:53:15.250" "2019/01/13 19:53:15.450" +"2019/01/13 19:53:27.250" "2019/01/13 19:53:27.450" +"2019/01/13 19:53:39.250" "2019/01/13 19:53:39.450" +"2019/01/13 19:53:51.250" "2019/01/13 19:53:51.450" +"2019/01/13 19:54:03.250" "2019/01/13 19:54:03.450" +"2019/01/13 19:54:15.250" "2019/01/13 19:54:15.450" +"2019/01/13 19:54:27.250" "2019/01/13 19:54:27.450" +"2019/01/13 19:55:07.000" "2019/01/13 19:55:07.200" +"2019/01/13 19:55:19.000" "2019/01/13 19:55:19.200" +"2019/01/13 19:55:31.000" "2019/01/13 19:55:31.200" +"2019/01/13 19:55:43.000" "2019/01/13 19:55:43.200" +"2019/01/13 19:55:55.000" "2019/01/13 19:55:55.200" +"2019/01/13 19:56:07.000" "2019/01/13 19:56:07.200" +"2019/01/13 19:56:19.000" "2019/01/13 19:56:19.200" +"2019/01/13 19:56:31.000" "2019/01/13 19:56:31.200" +"2019/01/13 19:56:43.000" "2019/01/13 19:56:43.200" +"2019/01/13 19:56:55.000" "2019/01/13 19:56:55.200" +"2019/01/13 19:57:07.000" "2019/01/13 19:57:07.200" +"2019/01/13 19:57:19.000" "2019/01/13 19:57:19.200" +"2019/01/13 19:57:31.000" "2019/01/13 19:57:31.200" +"2019/01/13 19:57:43.000" "2019/01/13 19:57:43.200" +"2019/01/13 20:02:57.750" "2019/01/13 20:02:57.950" +"2019/01/13 20:03:09.750" "2019/01/13 20:03:09.950" +"2019/01/13 20:03:21.750" "2019/01/13 20:03:21.950" +"2019/01/13 20:03:33.750" "2019/01/13 20:03:33.950" +"2019/01/13 20:03:45.750" "2019/01/13 20:03:45.950" +"2019/01/13 20:03:57.750" "2019/01/13 20:03:57.950" +"2019/01/13 20:04:09.750" "2019/01/13 20:04:09.950" +"2019/01/13 20:04:21.750" "2019/01/13 20:04:21.950" +"2019/01/13 20:04:33.750" "2019/01/13 20:04:33.950" +"2019/01/13 20:04:45.750" "2019/01/13 20:04:45.950" +"2019/01/13 20:04:57.750" "2019/01/13 20:04:57.950" +"2019/01/13 20:05:09.750" "2019/01/13 20:05:09.950" +"2019/01/13 20:05:21.750" "2019/01/13 20:05:21.950" +"2019/01/13 20:05:33.750" "2019/01/13 20:05:33.950" +"2019/01/13 20:06:13.500" "2019/01/13 20:06:13.700" +"2019/01/13 20:06:25.500" "2019/01/13 20:06:25.700" +"2019/01/13 20:06:37.500" "2019/01/13 20:06:37.700" +"2019/01/13 20:06:49.500" "2019/01/13 20:06:49.700" +"2019/01/13 20:07:01.500" "2019/01/13 20:07:01.700" +"2019/01/13 20:07:13.500" "2019/01/13 20:07:13.700" +"2019/01/13 20:07:25.500" "2019/01/13 20:07:25.700" +"2019/01/13 20:07:37.500" "2019/01/13 20:07:37.700" +"2019/01/13 20:07:49.500" "2019/01/13 20:07:49.700" +"2019/01/13 20:08:01.500" "2019/01/13 20:08:01.700" +"2019/01/13 20:08:13.500" "2019/01/13 20:08:13.700" +"2019/01/13 20:08:25.500" "2019/01/13 20:08:25.700" +"2019/01/13 20:08:37.500" "2019/01/13 20:08:37.700" +"2019/01/13 20:08:49.500" "2019/01/13 20:08:49.700" +"2019/01/13 20:14:04.250" "2019/01/13 20:14:04.450" +"2019/01/13 20:14:16.250" "2019/01/13 20:14:16.450" +"2019/01/13 20:14:28.250" "2019/01/13 20:14:28.450" +"2019/01/13 20:14:40.250" "2019/01/13 20:14:40.450" +"2019/01/13 20:14:52.250" "2019/01/13 20:14:52.450" +"2019/01/13 20:15:04.250" "2019/01/13 20:15:04.450" +"2019/01/13 20:15:16.250" "2019/01/13 20:15:16.450" +"2019/01/13 20:15:28.250" "2019/01/13 20:15:28.450" +"2019/01/13 20:15:40.250" "2019/01/13 20:15:40.450" +"2019/01/13 20:15:52.250" "2019/01/13 20:15:52.450" +"2019/01/13 20:16:04.250" "2019/01/13 20:16:04.450" +"2019/01/13 20:16:16.250" "2019/01/13 20:16:16.450" +"2019/01/13 20:16:28.250" "2019/01/13 20:16:28.450" +"2019/01/13 20:16:40.250" "2019/01/13 20:16:40.450" +"2019/01/13 20:17:20.000" "2019/01/13 20:17:20.200" +"2019/01/13 20:17:32.000" "2019/01/13 20:17:32.200" +"2019/01/13 20:17:44.000" "2019/01/13 20:17:44.200" +"2019/01/13 20:17:56.000" "2019/01/13 20:17:56.200" +"2019/01/13 20:18:08.000" "2019/01/13 20:18:08.200" +"2019/01/13 20:18:20.000" "2019/01/13 20:18:20.200" +"2019/01/13 20:18:32.000" "2019/01/13 20:18:32.200" +"2019/01/13 20:18:44.000" "2019/01/13 20:18:44.200" +"2019/01/13 20:18:56.000" "2019/01/13 20:18:56.200" +"2019/01/13 20:19:08.000" "2019/01/13 20:19:08.200" +"2019/01/13 20:19:20.000" "2019/01/13 20:19:20.200" +"2019/01/13 20:19:32.000" "2019/01/13 20:19:32.200" +"2019/01/13 20:19:44.000" "2019/01/13 20:19:44.200" +"2019/01/13 20:19:56.000" "2019/01/13 20:19:56.200" +"2019/01/13 20:25:10.750" "2019/01/13 20:25:10.950" +"2019/01/13 20:25:22.750" "2019/01/13 20:25:22.950" +"2019/01/13 20:25:34.750" "2019/01/13 20:25:34.950" +"2019/01/13 20:25:46.750" "2019/01/13 20:25:46.950" +"2019/01/13 20:25:58.750" "2019/01/13 20:25:58.950" +"2019/01/13 20:26:10.750" "2019/01/13 20:26:10.950" +"2019/01/13 20:26:22.750" "2019/01/13 20:26:22.950" +"2019/01/13 20:26:34.750" "2019/01/13 20:26:34.950" +"2019/01/13 20:26:46.750" "2019/01/13 20:26:46.950" +"2019/01/13 20:26:58.750" "2019/01/13 20:26:58.950" +"2019/01/13 20:27:10.750" "2019/01/13 20:27:10.950" +"2019/01/13 20:27:22.750" "2019/01/13 20:27:22.950" +"2019/01/13 20:27:34.750" "2019/01/13 20:27:34.950" +"2019/01/13 20:27:46.750" "2019/01/13 20:27:46.950" +"2019/01/13 20:28:26.500" "2019/01/13 20:28:26.700" +"2019/01/13 20:28:38.500" "2019/01/13 20:28:38.700" +"2019/01/13 20:28:50.500" "2019/01/13 20:28:50.700" +"2019/01/13 20:29:02.500" "2019/01/13 20:29:02.700" +"2019/01/13 20:29:14.500" "2019/01/13 20:29:14.700" +"2019/01/13 20:29:26.500" "2019/01/13 20:29:26.700" +"2019/01/13 20:29:38.500" "2019/01/13 20:29:38.700" +"2019/01/13 20:29:50.500" "2019/01/13 20:29:50.700" +"2019/01/13 20:30:02.500" "2019/01/13 20:30:02.700" +"2019/01/13 20:30:14.500" "2019/01/13 20:30:14.700" +"2019/01/13 20:30:26.500" "2019/01/13 20:30:26.700" +"2019/01/13 20:30:38.500" "2019/01/13 20:30:38.700" +"2019/01/13 20:30:50.500" "2019/01/13 20:30:50.700" +"2019/01/13 20:31:02.500" "2019/01/13 20:31:02.700" +"2019/01/13 20:36:16.250" "2019/01/13 20:36:16.450" +"2019/01/13 20:36:28.250" "2019/01/13 20:36:28.450" +"2019/01/13 20:36:40.250" "2019/01/13 20:36:40.450" +"2019/01/13 20:36:52.250" "2019/01/13 20:36:52.450" +"2019/01/13 20:37:04.250" "2019/01/13 20:37:04.450" +"2019/01/13 20:37:16.250" "2019/01/13 20:37:16.450" +"2019/01/13 20:37:28.250" "2019/01/13 20:37:28.450" +"2019/01/13 20:37:40.250" "2019/01/13 20:37:40.450" +"2019/01/13 20:37:52.250" "2019/01/13 20:37:52.450" +"2019/01/13 20:38:04.250" "2019/01/13 20:38:04.450" +"2019/01/13 20:38:16.250" "2019/01/13 20:38:16.450" +"2019/01/13 20:38:28.250" "2019/01/13 20:38:28.450" +"2019/01/13 20:38:40.250" "2019/01/13 20:38:40.450" +"2019/01/13 20:38:52.250" "2019/01/13 20:38:52.450" +"2019/01/13 20:39:32.000" "2019/01/13 20:39:32.200" +"2019/01/13 20:39:44.000" "2019/01/13 20:39:44.200" +"2019/01/13 20:39:56.000" "2019/01/13 20:39:56.200" +"2019/01/13 20:40:08.000" "2019/01/13 20:40:08.200" +"2019/01/13 20:40:20.000" "2019/01/13 20:40:20.200" +"2019/01/13 20:40:32.000" "2019/01/13 20:40:32.200" +"2019/01/13 20:40:44.000" "2019/01/13 20:40:44.200" +"2019/01/13 20:40:56.000" "2019/01/13 20:40:56.200" +"2019/01/13 20:41:08.000" "2019/01/13 20:41:08.200" +"2019/01/13 20:41:20.000" "2019/01/13 20:41:20.200" +"2019/01/13 20:41:32.000" "2019/01/13 20:41:32.200" +"2019/01/13 20:41:44.000" "2019/01/13 20:41:44.200" +"2019/01/13 20:41:56.000" "2019/01/13 20:41:56.200" +"2019/01/13 20:42:08.000" "2019/01/13 20:42:08.200" +"2019/01/13 20:47:21.750" "2019/01/13 20:47:21.950" +"2019/01/13 20:47:33.750" "2019/01/13 20:47:33.950" +"2019/01/13 20:47:45.750" "2019/01/13 20:47:45.950" +"2019/01/13 20:47:57.750" "2019/01/13 20:47:57.950" +"2019/01/13 20:48:09.750" "2019/01/13 20:48:09.950" +"2019/01/13 20:48:21.750" "2019/01/13 20:48:21.950" +"2019/01/13 20:48:33.750" "2019/01/13 20:48:33.950" +"2019/01/13 20:48:45.750" "2019/01/13 20:48:45.950" +"2019/01/13 20:48:57.750" "2019/01/13 20:48:57.950" +"2019/01/13 20:49:09.750" "2019/01/13 20:49:09.950" +"2019/01/13 20:49:21.750" "2019/01/13 20:49:21.950" +"2019/01/13 20:49:33.750" "2019/01/13 20:49:33.950" +"2019/01/13 20:49:45.750" "2019/01/13 20:49:45.950" +"2019/01/13 20:49:57.750" "2019/01/13 20:49:57.950" +"2019/01/13 20:50:37.500" "2019/01/13 20:50:37.700" +"2019/01/13 20:50:49.500" "2019/01/13 20:50:49.700" +"2019/01/13 20:51:01.500" "2019/01/13 20:51:01.700" +"2019/01/13 20:51:13.500" "2019/01/13 20:51:13.700" +"2019/01/13 20:51:25.500" "2019/01/13 20:51:25.700" +"2019/01/13 20:51:37.500" "2019/01/13 20:51:37.700" +"2019/01/13 20:51:49.500" "2019/01/13 20:51:49.700" +"2019/01/13 20:52:01.500" "2019/01/13 20:52:01.700" +"2019/01/13 20:52:13.500" "2019/01/13 20:52:13.700" +"2019/01/13 20:52:25.500" "2019/01/13 20:52:25.700" +"2019/01/13 20:52:37.500" "2019/01/13 20:52:37.700" +"2019/01/13 20:52:49.500" "2019/01/13 20:52:49.700" +"2019/01/13 20:53:01.500" "2019/01/13 20:53:01.700" +"2019/01/13 20:53:13.500" "2019/01/13 20:53:13.700" +"2019/01/13 20:58:27.250" "2019/01/13 20:58:27.450" +"2019/01/13 20:58:39.250" "2019/01/13 20:58:39.450" +"2019/01/13 20:58:51.250" "2019/01/13 20:58:51.450" +"2019/01/13 20:59:03.250" "2019/01/13 20:59:03.450" +"2019/01/13 20:59:15.250" "2019/01/13 20:59:15.450" +"2019/01/13 20:59:27.250" "2019/01/13 20:59:27.450" +"2019/01/13 20:59:39.250" "2019/01/13 20:59:39.450" +"2019/01/13 20:59:51.250" "2019/01/13 20:59:51.450" +"2019/01/13 21:00:03.250" "2019/01/13 21:00:03.450" +"2019/01/13 21:00:15.250" "2019/01/13 21:00:15.450" +"2019/01/13 21:00:27.250" "2019/01/13 21:00:27.450" +"2019/01/13 21:00:39.250" "2019/01/13 21:00:39.450" +"2019/01/13 21:00:51.250" "2019/01/13 21:00:51.450" +"2019/01/13 21:01:03.250" "2019/01/13 21:01:03.450" +"2019/01/13 21:01:43.000" "2019/01/13 21:01:43.200" +"2019/01/13 21:01:55.000" "2019/01/13 21:01:55.200" +"2019/01/13 21:02:07.000" "2019/01/13 21:02:07.200" +"2019/01/13 21:02:19.000" "2019/01/13 21:02:19.200" +"2019/01/13 21:02:31.000" "2019/01/13 21:02:31.200" +"2019/01/13 21:02:43.000" "2019/01/13 21:02:43.200" +"2019/01/13 21:02:55.000" "2019/01/13 21:02:55.200" +"2019/01/13 21:03:07.000" "2019/01/13 21:03:07.200" +"2019/01/13 21:03:19.000" "2019/01/13 21:03:19.200" +"2019/01/13 21:03:31.000" "2019/01/13 21:03:31.200" +"2019/01/13 21:03:43.000" "2019/01/13 21:03:43.200" +"2019/01/13 21:03:55.000" "2019/01/13 21:03:55.200" +"2019/01/13 21:04:07.000" "2019/01/13 21:04:07.200" +"2019/01/13 21:04:19.000" "2019/01/13 21:04:19.200" +"2019/01/13 21:09:32.750" "2019/01/13 21:09:32.950" +"2019/01/13 21:09:44.750" "2019/01/13 21:09:44.950" +"2019/01/13 21:09:56.750" "2019/01/13 21:09:56.950" +"2019/01/13 21:10:08.750" "2019/01/13 21:10:08.950" +"2019/01/13 21:10:20.750" "2019/01/13 21:10:20.950" +"2019/01/13 21:10:32.750" "2019/01/13 21:10:32.950" +"2019/01/13 21:10:44.750" "2019/01/13 21:10:44.950" +"2019/01/13 21:10:56.750" "2019/01/13 21:10:56.950" +"2019/01/13 21:11:08.750" "2019/01/13 21:11:08.950" +"2019/01/13 21:11:20.750" "2019/01/13 21:11:20.950" +"2019/01/13 21:11:32.750" "2019/01/13 21:11:32.950" +"2019/01/13 21:11:44.750" "2019/01/13 21:11:44.950" +"2019/01/13 21:11:56.750" "2019/01/13 21:11:56.950" +"2019/01/13 21:12:08.750" "2019/01/13 21:12:08.950" +"2019/01/13 21:12:47.500" "2019/01/13 21:12:47.700" +"2019/01/13 21:12:59.500" "2019/01/13 21:12:59.700" +"2019/01/13 21:13:11.500" "2019/01/13 21:13:11.700" +"2019/01/13 21:13:23.500" "2019/01/13 21:13:23.700" +"2019/01/13 21:13:35.500" "2019/01/13 21:13:35.700" +"2019/01/13 21:13:47.500" "2019/01/13 21:13:47.700" +"2019/01/13 21:13:59.500" "2019/01/13 21:13:59.700" +"2019/01/13 21:14:11.500" "2019/01/13 21:14:11.700" +"2019/01/13 21:14:23.500" "2019/01/13 21:14:23.700" +"2019/01/13 21:14:35.500" "2019/01/13 21:14:35.700" +"2019/01/13 21:14:47.500" "2019/01/13 21:14:47.700" +"2019/01/13 21:14:59.500" "2019/01/13 21:14:59.700" +"2019/01/13 21:15:11.500" "2019/01/13 21:15:11.700" +"2019/01/13 21:15:23.500" "2019/01/13 21:15:23.700" +"2019/01/13 21:20:37.250" "2019/01/13 21:20:37.450" +"2019/01/13 21:20:49.250" "2019/01/13 21:20:49.450" +"2019/01/13 21:21:01.250" "2019/01/13 21:21:01.450" +"2019/01/13 21:21:13.250" "2019/01/13 21:21:13.450" +"2019/01/13 21:21:25.250" "2019/01/13 21:21:25.450" +"2019/01/13 21:21:37.250" "2019/01/13 21:21:37.450" +"2019/01/13 21:21:49.250" "2019/01/13 21:21:49.450" +"2019/01/13 21:22:01.250" "2019/01/13 21:22:01.450" +"2019/01/13 21:22:13.250" "2019/01/13 21:22:13.450" +"2019/01/13 21:22:25.250" "2019/01/13 21:22:25.450" +"2019/01/13 21:22:37.250" "2019/01/13 21:22:37.450" +"2019/01/13 21:22:49.250" "2019/01/13 21:22:49.450" +"2019/01/13 21:23:01.250" "2019/01/13 21:23:01.450" +"2019/01/13 21:23:13.250" "2019/01/13 21:23:13.450" +"2019/01/13 21:23:52.000" "2019/01/13 21:23:52.200" +"2019/01/13 21:24:04.000" "2019/01/13 21:24:04.200" +"2019/01/13 21:24:16.000" "2019/01/13 21:24:16.200" +"2019/01/13 21:24:28.000" "2019/01/13 21:24:28.200" +"2019/01/13 21:24:40.000" "2019/01/13 21:24:40.200" +"2019/01/13 21:24:52.000" "2019/01/13 21:24:52.200" +"2019/01/13 21:25:04.000" "2019/01/13 21:25:04.200" +"2019/01/13 21:25:16.000" "2019/01/13 21:25:16.200" +"2019/01/13 21:25:28.000" "2019/01/13 21:25:28.200" +"2019/01/13 21:25:40.000" "2019/01/13 21:25:40.200" +"2019/01/13 21:25:52.000" "2019/01/13 21:25:52.200" +"2019/01/13 21:26:04.000" "2019/01/13 21:26:04.200" +"2019/01/13 21:26:16.000" "2019/01/13 21:26:16.200" +"2019/01/13 21:26:28.000" "2019/01/13 21:26:28.200" +"2019/01/13 21:31:41.750" "2019/01/13 21:31:41.950" +"2019/01/13 21:31:53.750" "2019/01/13 21:31:53.950" +"2019/01/13 21:32:05.750" "2019/01/13 21:32:05.950" +"2019/01/13 21:32:17.750" "2019/01/13 21:32:17.950" +"2019/01/13 21:32:29.750" "2019/01/13 21:32:29.950" +"2019/01/13 21:32:41.750" "2019/01/13 21:32:41.950" +"2019/01/13 21:32:53.750" "2019/01/13 21:32:53.950" +"2019/01/13 21:33:05.750" "2019/01/13 21:33:05.950" +"2019/01/13 21:33:17.750" "2019/01/13 21:33:17.950" +"2019/01/13 21:33:29.750" "2019/01/13 21:33:29.950" +"2019/01/13 21:33:41.750" "2019/01/13 21:33:41.950" +"2019/01/13 21:33:53.750" "2019/01/13 21:33:53.950" +"2019/01/13 21:34:05.750" "2019/01/13 21:34:05.950" +"2019/01/13 21:34:17.750" "2019/01/13 21:34:17.950" +"2019/01/13 21:34:56.500" "2019/01/13 21:34:56.700" +"2019/01/13 21:35:08.500" "2019/01/13 21:35:08.700" +"2019/01/13 21:35:20.500" "2019/01/13 21:35:20.700" +"2019/01/13 21:35:32.500" "2019/01/13 21:35:32.700" +"2019/01/13 21:35:44.500" "2019/01/13 21:35:44.700" +"2019/01/13 21:35:56.500" "2019/01/13 21:35:56.700" +"2019/01/13 21:36:08.500" "2019/01/13 21:36:08.700" +"2019/01/13 21:36:20.500" "2019/01/13 21:36:20.700" +"2019/01/13 21:36:32.500" "2019/01/13 21:36:32.700" +"2019/01/13 21:36:44.500" "2019/01/13 21:36:44.700" +"2019/01/13 21:36:56.500" "2019/01/13 21:36:56.700" +"2019/01/13 21:37:08.500" "2019/01/13 21:37:08.700" +"2019/01/13 21:37:20.500" "2019/01/13 21:37:20.700" +"2019/01/13 21:37:32.500" "2019/01/13 21:37:32.700" +"2019/01/13 21:42:46.250" "2019/01/13 21:42:46.450" +"2019/01/13 21:42:58.250" "2019/01/13 21:42:58.450" +"2019/01/13 21:43:10.250" "2019/01/13 21:43:10.450" +"2019/01/13 21:43:22.250" "2019/01/13 21:43:22.450" +"2019/01/13 21:43:34.250" "2019/01/13 21:43:34.450" +"2019/01/13 21:43:46.250" "2019/01/13 21:43:46.450" +"2019/01/13 21:43:58.250" "2019/01/13 21:43:58.450" +"2019/01/13 21:44:10.250" "2019/01/13 21:44:10.450" +"2019/01/13 21:44:22.250" "2019/01/13 21:44:22.450" +"2019/01/13 21:44:34.250" "2019/01/13 21:44:34.450" +"2019/01/13 21:44:46.250" "2019/01/13 21:44:46.450" +"2019/01/13 21:44:58.250" "2019/01/13 21:44:58.450" +"2019/01/13 21:45:10.250" "2019/01/13 21:45:10.450" +"2019/01/13 21:45:22.250" "2019/01/13 21:45:22.450" +"2019/01/13 21:46:01.000" "2019/01/13 21:46:01.200" +"2019/01/13 21:46:13.000" "2019/01/13 21:46:13.200" +"2019/01/13 21:46:25.000" "2019/01/13 21:46:25.200" +"2019/01/13 21:46:37.000" "2019/01/13 21:46:37.200" +"2019/01/13 21:46:49.000" "2019/01/13 21:46:49.200" +"2019/01/13 21:47:01.000" "2019/01/13 21:47:01.200" +"2019/01/13 21:47:13.000" "2019/01/13 21:47:13.200" +"2019/01/13 21:47:25.000" "2019/01/13 21:47:25.200" +"2019/01/13 21:47:37.000" "2019/01/13 21:47:37.200" +"2019/01/13 21:47:49.000" "2019/01/13 21:47:49.200" +"2019/01/13 21:48:01.000" "2019/01/13 21:48:01.200" +"2019/01/13 21:48:13.000" "2019/01/13 21:48:13.200" +"2019/01/13 21:48:25.000" "2019/01/13 21:48:25.200" +"2019/01/13 21:48:37.000" "2019/01/13 21:48:37.200" +"2019/01/13 21:53:49.750" "2019/01/13 21:53:49.950" +"2019/01/13 21:54:01.750" "2019/01/13 21:54:01.950" +"2019/01/13 21:54:13.750" "2019/01/13 21:54:13.950" +"2019/01/13 21:54:25.750" "2019/01/13 21:54:25.950" +"2019/01/13 21:54:37.750" "2019/01/13 21:54:37.950" +"2019/01/13 21:54:49.750" "2019/01/13 21:54:49.950" +"2019/01/13 21:55:01.750" "2019/01/13 21:55:01.950" +"2019/01/13 21:55:13.750" "2019/01/13 21:55:13.950" +"2019/01/13 21:55:25.750" "2019/01/13 21:55:25.950" +"2019/01/13 21:55:37.750" "2019/01/13 21:55:37.950" +"2019/01/13 21:55:49.750" "2019/01/13 21:55:49.950" +"2019/01/13 21:56:01.750" "2019/01/13 21:56:01.950" +"2019/01/13 21:56:13.750" "2019/01/13 21:56:13.950" +"2019/01/13 21:56:25.750" "2019/01/13 21:56:25.950" +"2019/01/13 21:57:04.500" "2019/01/13 21:57:04.700" +"2019/01/13 21:57:16.500" "2019/01/13 21:57:16.700" +"2019/01/13 21:57:28.500" "2019/01/13 21:57:28.700" +"2019/01/13 21:57:40.500" "2019/01/13 21:57:40.700" +"2019/01/13 21:57:52.500" "2019/01/13 21:57:52.700" +"2019/01/13 21:58:04.500" "2019/01/13 21:58:04.700" +"2019/01/13 21:58:16.500" "2019/01/13 21:58:16.700" +"2019/01/13 21:58:28.500" "2019/01/13 21:58:28.700" +"2019/01/13 21:58:40.500" "2019/01/13 21:58:40.700" +"2019/01/13 21:58:52.500" "2019/01/13 21:58:52.700" +"2019/01/13 21:59:04.500" "2019/01/13 21:59:04.700" +"2019/01/13 21:59:16.500" "2019/01/13 21:59:16.700" +"2019/01/13 21:59:28.500" "2019/01/13 21:59:28.700" +"2019/01/13 21:59:40.500" "2019/01/13 21:59:40.700" +"2019/01/13 22:04:53.250" "2019/01/13 22:04:53.450" +"2019/01/13 22:05:05.250" "2019/01/13 22:05:05.450" +"2019/01/13 22:05:17.250" "2019/01/13 22:05:17.450" +"2019/01/13 22:05:29.250" "2019/01/13 22:05:29.450" +"2019/01/13 22:05:41.250" "2019/01/13 22:05:41.450" +"2019/01/13 22:05:53.250" "2019/01/13 22:05:53.450" +"2019/01/13 22:06:05.250" "2019/01/13 22:06:05.450" +"2019/01/13 22:06:17.250" "2019/01/13 22:06:17.450" +"2019/01/13 22:06:29.250" "2019/01/13 22:06:29.450" +"2019/01/13 22:06:41.250" "2019/01/13 22:06:41.450" +"2019/01/13 22:06:53.250" "2019/01/13 22:06:53.450" +"2019/01/13 22:07:05.250" "2019/01/13 22:07:05.450" +"2019/01/13 22:07:17.250" "2019/01/13 22:07:17.450" +"2019/01/13 22:07:29.250" "2019/01/13 22:07:29.450" +"2019/01/13 22:08:08.000" "2019/01/13 22:08:08.200" +"2019/01/13 22:08:20.000" "2019/01/13 22:08:20.200" +"2019/01/13 22:08:32.000" "2019/01/13 22:08:32.200" +"2019/01/13 22:08:44.000" "2019/01/13 22:08:44.200" +"2019/01/13 22:08:56.000" "2019/01/13 22:08:56.200" +"2019/01/13 22:09:08.000" "2019/01/13 22:09:08.200" +"2019/01/13 22:09:20.000" "2019/01/13 22:09:20.200" +"2019/01/13 22:09:32.000" "2019/01/13 22:09:32.200" +"2019/01/13 22:09:44.000" "2019/01/13 22:09:44.200" +"2019/01/13 22:09:56.000" "2019/01/13 22:09:56.200" +"2019/01/13 22:10:08.000" "2019/01/13 22:10:08.200" +"2019/01/13 22:10:20.000" "2019/01/13 22:10:20.200" +"2019/01/13 22:10:32.000" "2019/01/13 22:10:32.200" +"2019/01/13 22:10:44.000" "2019/01/13 22:10:44.200" +"2019/01/13 22:15:56.750" "2019/01/13 22:15:56.950" +"2019/01/13 22:16:08.750" "2019/01/13 22:16:08.950" +"2019/01/13 22:16:20.750" "2019/01/13 22:16:20.950" +"2019/01/13 22:16:32.750" "2019/01/13 22:16:32.950" +"2019/01/13 22:16:44.750" "2019/01/13 22:16:44.950" +"2019/01/13 22:16:56.750" "2019/01/13 22:16:56.950" +"2019/01/13 22:17:08.750" "2019/01/13 22:17:08.950" +"2019/01/13 22:17:20.750" "2019/01/13 22:17:20.950" +"2019/01/13 22:17:32.750" "2019/01/13 22:17:32.950" +"2019/01/13 22:17:44.750" "2019/01/13 22:17:44.950" +"2019/01/13 22:17:56.750" "2019/01/13 22:17:56.950" +"2019/01/13 22:18:08.750" "2019/01/13 22:18:08.950" +"2019/01/13 22:18:20.750" "2019/01/13 22:18:20.950" +"2019/01/13 22:18:32.750" "2019/01/13 22:18:32.950" +"2019/01/13 22:19:10.500" "2019/01/13 22:19:10.700" +"2019/01/13 22:19:22.500" "2019/01/13 22:19:22.700" +"2019/01/13 22:19:34.500" "2019/01/13 22:19:34.700" +"2019/01/13 22:19:46.500" "2019/01/13 22:19:46.700" +"2019/01/13 22:19:58.500" "2019/01/13 22:19:58.700" +"2019/01/13 22:20:10.500" "2019/01/13 22:20:10.700" +"2019/01/13 22:20:22.500" "2019/01/13 22:20:22.700" +"2019/01/13 22:20:34.500" "2019/01/13 22:20:34.700" +"2019/01/13 22:20:46.500" "2019/01/13 22:20:46.700" +"2019/01/13 22:20:58.500" "2019/01/13 22:20:58.700" +"2019/01/13 22:21:10.500" "2019/01/13 22:21:10.700" +"2019/01/13 22:21:22.500" "2019/01/13 22:21:22.700" +"2019/01/13 22:21:34.500" "2019/01/13 22:21:34.700" +"2019/01/13 22:21:46.500" "2019/01/13 22:21:46.700" +"2019/01/13 22:26:59.250" "2019/01/13 22:26:59.450" +"2019/01/13 22:27:11.250" "2019/01/13 22:27:11.450" +"2019/01/13 22:27:23.250" "2019/01/13 22:27:23.450" +"2019/01/13 22:27:35.250" "2019/01/13 22:27:35.450" +"2019/01/13 22:27:47.250" "2019/01/13 22:27:47.450" +"2019/01/13 22:27:59.250" "2019/01/13 22:27:59.450" +"2019/01/13 22:28:11.250" "2019/01/13 22:28:11.450" +"2019/01/13 22:28:23.250" "2019/01/13 22:28:23.450" +"2019/01/13 22:28:35.250" "2019/01/13 22:28:35.450" +"2019/01/13 22:28:47.250" "2019/01/13 22:28:47.450" +"2019/01/13 22:28:59.250" "2019/01/13 22:28:59.450" +"2019/01/13 22:29:11.250" "2019/01/13 22:29:11.450" +"2019/01/13 22:29:23.250" "2019/01/13 22:29:23.450" +"2019/01/13 22:29:35.250" "2019/01/13 22:29:35.450" +"2019/01/13 22:30:13.000" "2019/01/13 22:30:13.200" +"2019/01/13 22:30:25.000" "2019/01/13 22:30:25.200" +"2019/01/13 22:30:37.000" "2019/01/13 22:30:37.200" +"2019/01/13 22:30:49.000" "2019/01/13 22:30:49.200" +"2019/01/13 22:31:01.000" "2019/01/13 22:31:01.200" +"2019/01/13 22:31:13.000" "2019/01/13 22:31:13.200" +"2019/01/13 22:31:25.000" "2019/01/13 22:31:25.200" +"2019/01/13 22:31:37.000" "2019/01/13 22:31:37.200" +"2019/01/13 22:31:49.000" "2019/01/13 22:31:49.200" +"2019/01/13 22:32:01.000" "2019/01/13 22:32:01.200" +"2019/01/13 22:32:13.000" "2019/01/13 22:32:13.200" +"2019/01/13 22:32:25.000" "2019/01/13 22:32:25.200" +"2019/01/13 22:32:37.000" "2019/01/13 22:32:37.200" +"2019/01/13 22:32:49.000" "2019/01/13 22:32:49.200" +"2019/01/13 22:38:01.750" "2019/01/13 22:38:01.950" +"2019/01/13 22:38:13.750" "2019/01/13 22:38:13.950" +"2019/01/13 22:38:25.750" "2019/01/13 22:38:25.950" +"2019/01/13 22:38:37.750" "2019/01/13 22:38:37.950" +"2019/01/13 22:38:49.750" "2019/01/13 22:38:49.950" +"2019/01/13 22:39:01.750" "2019/01/13 22:39:01.950" +"2019/01/13 22:39:13.750" "2019/01/13 22:39:13.950" +"2019/01/13 22:39:25.750" "2019/01/13 22:39:25.950" +"2019/01/13 22:39:37.750" "2019/01/13 22:39:37.950" +"2019/01/13 22:39:49.750" "2019/01/13 22:39:49.950" +"2019/01/13 22:40:01.750" "2019/01/13 22:40:01.950" +"2019/01/13 22:40:13.750" "2019/01/13 22:40:13.950" +"2019/01/13 22:40:25.750" "2019/01/13 22:40:25.950" +"2019/01/13 22:40:37.750" "2019/01/13 22:40:37.950" +"2019/01/13 22:41:15.500" "2019/01/13 22:41:15.700" +"2019/01/13 22:41:27.500" "2019/01/13 22:41:27.700" +"2019/01/13 22:41:39.500" "2019/01/13 22:41:39.700" +"2019/01/13 22:41:51.500" "2019/01/13 22:41:51.700" +"2019/01/13 22:42:03.500" "2019/01/13 22:42:03.700" +"2019/01/13 22:42:15.500" "2019/01/13 22:42:15.700" +"2019/01/13 22:42:27.500" "2019/01/13 22:42:27.700" +"2019/01/13 22:42:39.500" "2019/01/13 22:42:39.700" +"2019/01/13 22:42:51.500" "2019/01/13 22:42:51.700" +"2019/01/13 22:43:03.500" "2019/01/13 22:43:03.700" +"2019/01/13 22:43:15.500" "2019/01/13 22:43:15.700" +"2019/01/13 22:43:27.500" "2019/01/13 22:43:27.700" +"2019/01/13 22:43:39.500" "2019/01/13 22:43:39.700" +"2019/01/13 22:43:51.500" "2019/01/13 22:43:51.700" +"2019/01/13 22:49:03.250" "2019/01/13 22:49:03.450" +"2019/01/13 22:49:15.250" "2019/01/13 22:49:15.450" +"2019/01/13 22:49:27.250" "2019/01/13 22:49:27.450" +"2019/01/13 22:49:39.250" "2019/01/13 22:49:39.450" +"2019/01/13 22:49:51.250" "2019/01/13 22:49:51.450" +"2019/01/13 22:50:03.250" "2019/01/13 22:50:03.450" +"2019/01/13 22:50:15.250" "2019/01/13 22:50:15.450" +"2019/01/13 22:50:27.250" "2019/01/13 22:50:27.450" +"2019/01/13 22:50:39.250" "2019/01/13 22:50:39.450" +"2019/01/13 22:50:51.250" "2019/01/13 22:50:51.450" +"2019/01/13 22:51:03.250" "2019/01/13 22:51:03.450" +"2019/01/13 22:51:15.250" "2019/01/13 22:51:15.450" +"2019/01/13 22:51:27.250" "2019/01/13 22:51:27.450" +"2019/01/13 22:51:39.250" "2019/01/13 22:51:39.450" +"2019/01/13 22:52:17.000" "2019/01/13 22:52:17.200" +"2019/01/13 22:52:29.000" "2019/01/13 22:52:29.200" +"2019/01/13 22:52:41.000" "2019/01/13 22:52:41.200" +"2019/01/13 22:52:53.000" "2019/01/13 22:52:53.200" +"2019/01/13 22:53:05.000" "2019/01/13 22:53:05.200" +"2019/01/13 22:53:17.000" "2019/01/13 22:53:17.200" +"2019/01/13 22:53:29.000" "2019/01/13 22:53:29.200" +"2019/01/13 22:53:41.000" "2019/01/13 22:53:41.200" +"2019/01/13 22:53:53.000" "2019/01/13 22:53:53.200" +"2019/01/13 22:54:05.000" "2019/01/13 22:54:05.200" +"2019/01/13 22:54:17.000" "2019/01/13 22:54:17.200" +"2019/01/13 22:54:29.000" "2019/01/13 22:54:29.200" +"2019/01/13 22:54:41.000" "2019/01/13 22:54:41.200" +"2019/01/13 22:54:53.000" "2019/01/13 22:54:53.200" +"2019/01/13 23:00:04.750" "2019/01/13 23:00:04.950" +"2019/01/13 23:00:16.750" "2019/01/13 23:00:16.950" +"2019/01/13 23:00:28.750" "2019/01/13 23:00:28.950" +"2019/01/13 23:00:40.750" "2019/01/13 23:00:40.950" +"2019/01/13 23:00:52.750" "2019/01/13 23:00:52.950" +"2019/01/13 23:01:04.750" "2019/01/13 23:01:04.950" +"2019/01/13 23:01:16.750" "2019/01/13 23:01:16.950" +"2019/01/13 23:01:28.750" "2019/01/13 23:01:28.950" +"2019/01/13 23:01:40.750" "2019/01/13 23:01:40.950" +"2019/01/13 23:01:52.750" "2019/01/13 23:01:52.950" +"2019/01/13 23:02:04.750" "2019/01/13 23:02:04.950" +"2019/01/13 23:02:16.750" "2019/01/13 23:02:16.950" +"2019/01/13 23:02:28.750" "2019/01/13 23:02:28.950" +"2019/01/13 23:03:17.500" "2019/01/13 23:03:17.700" +"2019/01/13 23:03:29.500" "2019/01/13 23:03:29.700" +"2019/01/13 23:03:41.500" "2019/01/13 23:03:41.700" +"2019/01/13 23:03:53.500" "2019/01/13 23:03:53.700" +"2019/01/13 23:04:05.500" "2019/01/13 23:04:05.700" +"2019/01/13 23:04:17.500" "2019/01/13 23:04:17.700" +"2019/01/13 23:04:29.500" "2019/01/13 23:04:29.700" +"2019/01/13 23:04:41.500" "2019/01/13 23:04:41.700" +"2019/01/13 23:04:53.500" "2019/01/13 23:04:53.700" +"2019/01/13 23:05:05.500" "2019/01/13 23:05:05.700" +"2019/01/13 23:05:17.500" "2019/01/13 23:05:17.700" +"2019/01/13 23:05:29.500" "2019/01/13 23:05:29.700" +"2019/01/13 23:05:41.500" "2019/01/13 23:05:41.700" +"2019/01/13 23:05:53.500" "2019/01/13 23:05:53.700" +"2019/01/13 23:11:05.250" "2019/01/13 23:11:05.450" +"2019/01/13 23:11:17.250" "2019/01/13 23:11:17.450" +"2019/01/13 23:11:29.250" "2019/01/13 23:11:29.450" +"2019/01/13 23:11:41.250" "2019/01/13 23:11:41.450" +"2019/01/13 23:11:53.250" "2019/01/13 23:11:53.450" +"2019/01/13 23:12:05.250" "2019/01/13 23:12:05.450" +"2019/01/13 23:12:17.250" "2019/01/13 23:12:17.450" +"2019/01/13 23:12:29.250" "2019/01/13 23:12:29.450" +"2019/01/13 23:12:41.250" "2019/01/13 23:12:41.450" +"2019/01/13 23:12:53.250" "2019/01/13 23:12:53.450" +"2019/01/13 23:13:05.250" "2019/01/13 23:13:05.450" +"2019/01/13 23:13:17.250" "2019/01/13 23:13:17.450" +"2019/01/13 23:13:29.250" "2019/01/13 23:13:29.450" +"2019/01/13 23:14:18.000" "2019/01/13 23:14:18.200" +"2019/01/13 23:14:30.000" "2019/01/13 23:14:30.200" +"2019/01/13 23:14:42.000" "2019/01/13 23:14:42.200" +"2019/01/13 23:14:54.000" "2019/01/13 23:14:54.200" +"2019/01/13 23:15:06.000" "2019/01/13 23:15:06.200" +"2019/01/13 23:15:18.000" "2019/01/13 23:15:18.200" +"2019/01/13 23:15:30.000" "2019/01/13 23:15:30.200" +"2019/01/13 23:15:42.000" "2019/01/13 23:15:42.200" +"2019/01/13 23:15:54.000" "2019/01/13 23:15:54.200" +"2019/01/13 23:16:06.000" "2019/01/13 23:16:06.200" +"2019/01/13 23:16:18.000" "2019/01/13 23:16:18.200" +"2019/01/13 23:16:30.000" "2019/01/13 23:16:30.200" +"2019/01/13 23:16:42.000" "2019/01/13 23:16:42.200" +"2019/01/13 23:16:54.000" "2019/01/13 23:16:54.200" +"2019/01/13 23:22:05.750" "2019/01/13 23:22:05.950" +"2019/01/13 23:22:17.750" "2019/01/13 23:22:17.950" +"2019/01/13 23:22:29.750" "2019/01/13 23:22:29.950" +"2019/01/13 23:22:41.750" "2019/01/13 23:22:41.950" +"2019/01/13 23:22:53.750" "2019/01/13 23:22:53.950" +"2019/01/13 23:23:05.750" "2019/01/13 23:23:05.950" +"2019/01/13 23:23:17.750" "2019/01/13 23:23:17.950" +"2019/01/13 23:23:29.750" "2019/01/13 23:23:29.950" +"2019/01/13 23:23:41.750" "2019/01/13 23:23:41.950" +"2019/01/13 23:23:53.750" "2019/01/13 23:23:53.950" +"2019/01/13 23:24:05.750" "2019/01/13 23:24:05.950" +"2019/01/13 23:24:17.750" "2019/01/13 23:24:17.950" +"2019/01/13 23:24:29.750" "2019/01/13 23:24:29.950" +"2019/01/13 23:25:18.500" "2019/01/13 23:25:18.700" +"2019/01/13 23:25:30.500" "2019/01/13 23:25:30.700" +"2019/01/13 23:25:42.500" "2019/01/13 23:25:42.700" +"2019/01/13 23:25:54.500" "2019/01/13 23:25:54.700" +"2019/01/13 23:26:06.500" "2019/01/13 23:26:06.700" +"2019/01/13 23:26:18.500" "2019/01/13 23:26:18.700" +"2019/01/13 23:26:30.500" "2019/01/13 23:26:30.700" +"2019/01/13 23:26:42.500" "2019/01/13 23:26:42.700" +"2019/01/13 23:26:54.500" "2019/01/13 23:26:54.700" +"2019/01/13 23:27:06.500" "2019/01/13 23:27:06.700" +"2019/01/13 23:27:18.500" "2019/01/13 23:27:18.700" +"2019/01/13 23:27:30.500" "2019/01/13 23:27:30.700" +"2019/01/13 23:27:42.500" "2019/01/13 23:27:42.700" +"2019/01/13 23:27:54.500" "2019/01/13 23:27:54.700" +"2019/01/13 23:33:05.250" "2019/01/13 23:33:05.450" +"2019/01/13 23:33:17.250" "2019/01/13 23:33:17.450" +"2019/01/13 23:33:29.250" "2019/01/13 23:33:29.450" +"2019/01/13 23:33:41.250" "2019/01/13 23:33:41.450" +"2019/01/13 23:33:53.250" "2019/01/13 23:33:53.450" +"2019/01/13 23:34:05.250" "2019/01/13 23:34:05.450" +"2019/01/13 23:34:17.250" "2019/01/13 23:34:17.450" +"2019/01/13 23:34:29.250" "2019/01/13 23:34:29.450" +"2019/01/13 23:34:41.250" "2019/01/13 23:34:41.450" +"2019/01/13 23:34:53.250" "2019/01/13 23:34:53.450" +"2019/01/13 23:35:05.250" "2019/01/13 23:35:05.450" +"2019/01/13 23:35:17.250" "2019/01/13 23:35:17.450" +"2019/01/13 23:35:29.250" "2019/01/13 23:35:29.450" +"2019/01/14 17:14:47.600" "2019/01/14 17:14:47.800" +"2019/01/14 17:14:59.600" "2019/01/14 17:14:59.800" +"2019/01/14 17:15:11.600" "2019/01/14 17:15:11.800" +"2019/01/14 17:15:23.600" "2019/01/14 17:15:23.800" +"2019/01/14 17:15:35.600" "2019/01/14 17:15:35.800" +"2019/01/14 17:15:47.600" "2019/01/14 17:15:47.800" +"2019/01/14 17:15:59.600" "2019/01/14 17:15:59.800" +"2019/01/14 17:16:11.600" "2019/01/14 17:16:11.800" +"2019/01/14 17:16:23.600" "2019/01/14 17:16:23.800" +"2019/01/14 17:16:35.600" "2019/01/14 17:16:35.800" +"2019/01/14 17:16:47.600" "2019/01/14 17:16:47.800" +"2019/01/14 17:16:59.600" "2019/01/14 17:16:59.800" +"2019/01/14 17:17:11.600" "2019/01/14 17:17:11.800" +"2019/01/14 17:17:52.000" "2019/01/14 17:17:52.200" +"2019/01/14 17:18:04.000" "2019/01/14 17:18:04.200" +"2019/01/14 17:18:16.000" "2019/01/14 17:18:16.200" +"2019/01/14 17:18:28.000" "2019/01/14 17:18:28.200" +"2019/01/14 17:18:40.000" "2019/01/14 17:18:40.200" +"2019/01/14 17:18:52.000" "2019/01/14 17:18:52.200" +"2019/01/14 17:19:04.000" "2019/01/14 17:19:04.200" +"2019/01/14 17:19:16.000" "2019/01/14 17:19:16.200" +"2019/01/14 17:19:28.000" "2019/01/14 17:19:28.200" +"2019/01/14 17:19:40.000" "2019/01/14 17:19:40.200" +"2019/01/14 17:19:52.000" "2019/01/14 17:19:52.200" +"2019/01/14 17:20:04.000" "2019/01/14 17:20:04.200" +"2019/01/14 17:20:16.000" "2019/01/14 17:20:16.200" +"2019/01/14 17:25:13.600" "2019/01/14 17:25:13.800" +"2019/01/14 17:25:25.600" "2019/01/14 17:25:25.800" +"2019/01/14 17:25:37.600" "2019/01/14 17:25:37.800" +"2019/01/14 17:25:49.600" "2019/01/14 17:25:49.800" +"2019/01/14 17:26:01.600" "2019/01/14 17:26:01.800" +"2019/01/14 17:26:13.600" "2019/01/14 17:26:13.800" +"2019/01/14 17:26:25.600" "2019/01/14 17:26:25.800" +"2019/01/14 17:26:37.600" "2019/01/14 17:26:37.800" +"2019/01/14 17:26:49.600" "2019/01/14 17:26:49.800" +"2019/01/14 17:27:01.600" "2019/01/14 17:27:01.800" +"2019/01/14 17:27:13.600" "2019/01/14 17:27:13.800" +"2019/01/14 17:27:25.600" "2019/01/14 17:27:25.800" +"2019/01/14 17:27:37.600" "2019/01/14 17:27:37.800" +"2019/01/14 17:28:18.000" "2019/01/14 17:28:18.200" +"2019/01/14 17:28:30.000" "2019/01/14 17:28:30.200" +"2019/01/14 17:28:42.000" "2019/01/14 17:28:42.200" +"2019/01/14 17:28:54.000" "2019/01/14 17:28:54.200" +"2019/01/14 17:29:06.000" "2019/01/14 17:29:06.200" +"2019/01/14 17:29:18.000" "2019/01/14 17:29:18.200" +"2019/01/14 17:29:30.000" "2019/01/14 17:29:30.200" +"2019/01/14 17:29:42.000" "2019/01/14 17:29:42.200" +"2019/01/14 17:29:54.000" "2019/01/14 17:29:54.200" +"2019/01/14 17:30:06.000" "2019/01/14 17:30:06.200" +"2019/01/14 17:30:18.000" "2019/01/14 17:30:18.200" +"2019/01/14 17:30:30.000" "2019/01/14 17:30:30.200" +"2019/01/14 17:30:42.000" "2019/01/14 17:30:42.200" +"2019/01/14 17:35:39.600" "2019/01/14 17:35:39.800" +"2019/01/14 17:35:51.600" "2019/01/14 17:35:51.800" +"2019/01/14 17:36:03.600" "2019/01/14 17:36:03.800" +"2019/01/14 17:36:15.600" "2019/01/14 17:36:15.800" +"2019/01/14 17:36:27.600" "2019/01/14 17:36:27.800" +"2019/01/14 17:36:39.600" "2019/01/14 17:36:39.800" +"2019/01/14 17:36:51.600" "2019/01/14 17:36:51.800" +"2019/01/14 17:37:03.600" "2019/01/14 17:37:03.800" +"2019/01/14 17:37:15.600" "2019/01/14 17:37:15.800" +"2019/01/14 17:37:27.600" "2019/01/14 17:37:27.800" +"2019/01/14 17:37:39.600" "2019/01/14 17:37:39.800" +"2019/01/14 17:37:51.600" "2019/01/14 17:37:51.800" +"2019/01/14 17:38:03.600" "2019/01/14 17:38:03.800" +"2019/01/14 17:38:44.000" "2019/01/14 17:38:44.200" +"2019/01/14 17:38:56.000" "2019/01/14 17:38:56.200" +"2019/01/14 17:39:08.000" "2019/01/14 17:39:08.200" +"2019/01/14 17:39:20.000" "2019/01/14 17:39:20.200" +"2019/01/14 17:39:32.000" "2019/01/14 17:39:32.200" +"2019/01/14 17:39:44.000" "2019/01/14 17:39:44.200" +"2019/01/14 17:39:56.000" "2019/01/14 17:39:56.200" +"2019/01/14 17:40:08.000" "2019/01/14 17:40:08.200" +"2019/01/14 17:40:20.000" "2019/01/14 17:40:20.200" +"2019/01/14 17:40:32.000" "2019/01/14 17:40:32.200" +"2019/01/14 17:40:44.000" "2019/01/14 17:40:44.200" +"2019/01/14 17:40:56.000" "2019/01/14 17:40:56.200" +"2019/01/14 17:41:08.000" "2019/01/14 17:41:08.200" +"2019/01/14 17:46:05.600" "2019/01/14 17:46:05.800" +"2019/01/14 17:46:17.600" "2019/01/14 17:46:17.800" +"2019/01/14 17:46:29.600" "2019/01/14 17:46:29.800" +"2019/01/14 17:46:41.600" "2019/01/14 17:46:41.800" +"2019/01/14 17:46:53.600" "2019/01/14 17:46:53.800" +"2019/01/14 17:47:05.600" "2019/01/14 17:47:05.800" +"2019/01/14 17:47:17.600" "2019/01/14 17:47:17.800" +"2019/01/14 17:47:29.600" "2019/01/14 17:47:29.800" +"2019/01/14 17:47:41.600" "2019/01/14 17:47:41.800" +"2019/01/14 17:47:53.600" "2019/01/14 17:47:53.800" +"2019/01/14 17:48:05.600" "2019/01/14 17:48:05.800" +"2019/01/14 17:48:17.600" "2019/01/14 17:48:17.800" +"2019/01/14 17:48:29.600" "2019/01/14 17:48:29.800" +"2019/01/14 17:49:10.000" "2019/01/14 17:49:10.200" +"2019/01/14 17:49:22.000" "2019/01/14 17:49:22.200" +"2019/01/14 17:49:34.000" "2019/01/14 17:49:34.200" +"2019/01/14 17:49:46.000" "2019/01/14 17:49:46.200" +"2019/01/14 17:49:58.000" "2019/01/14 17:49:58.200" +"2019/01/14 17:50:10.000" "2019/01/14 17:50:10.200" +"2019/01/14 17:50:22.000" "2019/01/14 17:50:22.200" +"2019/01/14 17:50:34.000" "2019/01/14 17:50:34.200" +"2019/01/14 17:50:46.000" "2019/01/14 17:50:46.200" +"2019/01/14 17:50:58.000" "2019/01/14 17:50:58.200" +"2019/01/14 17:51:10.000" "2019/01/14 17:51:10.200" +"2019/01/14 17:51:22.000" "2019/01/14 17:51:22.200" +"2019/01/14 17:51:34.000" "2019/01/14 17:51:34.200" +"2019/01/14 17:56:31.600" "2019/01/14 17:56:31.800" +"2019/01/14 17:56:43.600" "2019/01/14 17:56:43.800" +"2019/01/14 17:56:55.600" "2019/01/14 17:56:55.800" +"2019/01/14 17:57:07.600" "2019/01/14 17:57:07.800" +"2019/01/14 17:57:19.600" "2019/01/14 17:57:19.800" +"2019/01/14 17:57:31.600" "2019/01/14 17:57:31.800" +"2019/01/14 17:57:43.600" "2019/01/14 17:57:43.800" +"2019/01/14 17:57:55.600" "2019/01/14 17:57:55.800" +"2019/01/14 17:58:07.600" "2019/01/14 17:58:07.800" +"2019/01/14 17:58:19.600" "2019/01/14 17:58:19.800" +"2019/01/14 17:58:31.600" "2019/01/14 17:58:31.800" +"2019/01/14 17:58:43.600" "2019/01/14 17:58:43.800" +"2019/01/14 17:58:55.600" "2019/01/14 17:58:55.800" +"2019/01/14 17:59:37.000" "2019/01/14 17:59:37.200" +"2019/01/14 17:59:49.000" "2019/01/14 17:59:49.200" +"2019/01/14 18:00:01.000" "2019/01/14 18:00:01.200" +"2019/01/14 18:00:13.000" "2019/01/14 18:00:13.200" +"2019/01/14 18:00:25.000" "2019/01/14 18:00:25.200" +"2019/01/14 18:00:37.000" "2019/01/14 18:00:37.200" +"2019/01/14 18:00:49.000" "2019/01/14 18:00:49.200" +"2019/01/14 18:01:01.000" "2019/01/14 18:01:01.200" +"2019/01/14 18:01:13.000" "2019/01/14 18:01:13.200" +"2019/01/14 18:01:25.000" "2019/01/14 18:01:25.200" +"2019/01/14 18:01:37.000" "2019/01/14 18:01:37.200" +"2019/01/14 18:01:49.000" "2019/01/14 18:01:49.200" +"2019/01/14 18:02:01.000" "2019/01/14 18:02:01.200" +"2019/01/14 18:06:58.600" "2019/01/14 18:06:58.800" +"2019/01/14 18:07:10.600" "2019/01/14 18:07:10.800" +"2019/01/14 18:07:22.600" "2019/01/14 18:07:22.800" +"2019/01/14 18:07:34.600" "2019/01/14 18:07:34.800" +"2019/01/14 18:07:46.600" "2019/01/14 18:07:46.800" +"2019/01/14 18:07:58.600" "2019/01/14 18:07:58.800" +"2019/01/14 18:08:10.600" "2019/01/14 18:08:10.800" +"2019/01/14 18:08:22.600" "2019/01/14 18:08:22.800" +"2019/01/14 18:08:34.600" "2019/01/14 18:08:34.800" +"2019/01/14 18:08:46.600" "2019/01/14 18:08:46.800" +"2019/01/14 18:08:58.600" "2019/01/14 18:08:58.800" +"2019/01/14 18:09:10.600" "2019/01/14 18:09:10.800" +"2019/01/14 18:09:22.600" "2019/01/14 18:09:22.800" +"2019/01/14 18:10:04.000" "2019/01/14 18:10:04.200" +"2019/01/14 18:10:16.000" "2019/01/14 18:10:16.200" +"2019/01/14 18:10:28.000" "2019/01/14 18:10:28.200" +"2019/01/14 18:10:40.000" "2019/01/14 18:10:40.200" +"2019/01/14 18:10:52.000" "2019/01/14 18:10:52.200" +"2019/01/14 18:11:04.000" "2019/01/14 18:11:04.200" +"2019/01/14 18:11:16.000" "2019/01/14 18:11:16.200" +"2019/01/14 18:11:28.000" "2019/01/14 18:11:28.200" +"2019/01/14 18:11:40.000" "2019/01/14 18:11:40.200" +"2019/01/14 18:11:52.000" "2019/01/14 18:11:52.200" +"2019/01/14 18:12:04.000" "2019/01/14 18:12:04.200" +"2019/01/14 18:12:16.000" "2019/01/14 18:12:16.200" +"2019/01/14 18:12:28.000" "2019/01/14 18:12:28.200" +"2019/01/14 18:17:26.600" "2019/01/14 18:17:26.800" +"2019/01/14 18:17:38.600" "2019/01/14 18:17:38.800" +"2019/01/14 18:17:50.600" "2019/01/14 18:17:50.800" +"2019/01/14 18:18:02.600" "2019/01/14 18:18:02.800" +"2019/01/14 18:18:14.600" "2019/01/14 18:18:14.800" +"2019/01/14 18:18:26.600" "2019/01/14 18:18:26.800" +"2019/01/14 18:18:38.600" "2019/01/14 18:18:38.800" +"2019/01/14 18:18:50.600" "2019/01/14 18:18:50.800" +"2019/01/14 18:19:02.600" "2019/01/14 18:19:02.800" +"2019/01/14 18:19:14.600" "2019/01/14 18:19:14.800" +"2019/01/14 18:19:26.600" "2019/01/14 18:19:26.800" +"2019/01/14 18:19:38.600" "2019/01/14 18:19:38.800" +"2019/01/14 18:19:50.600" "2019/01/14 18:19:50.800" +"2019/01/14 18:20:32.000" "2019/01/14 18:20:32.200" +"2019/01/14 18:20:44.000" "2019/01/14 18:20:44.200" +"2019/01/14 18:20:56.000" "2019/01/14 18:20:56.200" +"2019/01/14 18:21:08.000" "2019/01/14 18:21:08.200" +"2019/01/14 18:21:20.000" "2019/01/14 18:21:20.200" +"2019/01/14 18:21:32.000" "2019/01/14 18:21:32.200" +"2019/01/14 18:21:44.000" "2019/01/14 18:21:44.200" +"2019/01/14 18:21:56.000" "2019/01/14 18:21:56.200" +"2019/01/14 18:22:08.000" "2019/01/14 18:22:08.200" +"2019/01/14 18:22:20.000" "2019/01/14 18:22:20.200" +"2019/01/14 18:22:32.000" "2019/01/14 18:22:32.200" +"2019/01/14 18:22:44.000" "2019/01/14 18:22:44.200" +"2019/01/14 18:22:56.000" "2019/01/14 18:22:56.200" +"2019/01/14 18:27:54.600" "2019/01/14 18:27:54.800" +"2019/01/14 18:28:06.600" "2019/01/14 18:28:06.800" +"2019/01/14 18:28:18.600" "2019/01/14 18:28:18.800" +"2019/01/14 18:28:30.600" "2019/01/14 18:28:30.800" +"2019/01/14 18:28:42.600" "2019/01/14 18:28:42.800" +"2019/01/14 18:28:54.600" "2019/01/14 18:28:54.800" +"2019/01/14 18:29:06.600" "2019/01/14 18:29:06.800" +"2019/01/14 18:29:18.600" "2019/01/14 18:29:18.800" +"2019/01/14 18:29:30.600" "2019/01/14 18:29:30.800" +"2019/01/14 18:29:42.600" "2019/01/14 18:29:42.800" +"2019/01/14 18:29:54.600" "2019/01/14 18:29:54.800" +"2019/01/14 18:30:06.600" "2019/01/14 18:30:06.800" +"2019/01/14 18:30:18.600" "2019/01/14 18:30:18.800" +"2019/01/14 18:31:00.000" "2019/01/14 18:31:00.200" +"2019/01/14 18:31:12.000" "2019/01/14 18:31:12.200" +"2019/01/14 18:31:24.000" "2019/01/14 18:31:24.200" +"2019/01/14 18:31:36.000" "2019/01/14 18:31:36.200" +"2019/01/14 18:31:48.000" "2019/01/14 18:31:48.200" +"2019/01/14 18:32:00.000" "2019/01/14 18:32:00.200" +"2019/01/14 18:32:12.000" "2019/01/14 18:32:12.200" +"2019/01/14 18:32:24.000" "2019/01/14 18:32:24.200" +"2019/01/14 18:32:36.000" "2019/01/14 18:32:36.200" +"2019/01/14 18:32:48.000" "2019/01/14 18:32:48.200" +"2019/01/14 18:33:00.000" "2019/01/14 18:33:00.200" +"2019/01/14 18:33:12.000" "2019/01/14 18:33:12.200" +"2019/01/14 18:33:24.000" "2019/01/14 18:33:24.200" +"2019/01/14 18:38:22.600" "2019/01/14 18:38:22.800" +"2019/01/14 18:38:34.600" "2019/01/14 18:38:34.800" +"2019/01/14 18:38:46.600" "2019/01/14 18:38:46.800" +"2019/01/14 18:38:58.600" "2019/01/14 18:38:58.800" +"2019/01/14 18:39:10.600" "2019/01/14 18:39:10.800" +"2019/01/14 18:39:22.600" "2019/01/14 18:39:22.800" +"2019/01/14 18:39:34.600" "2019/01/14 18:39:34.800" +"2019/01/14 18:39:46.600" "2019/01/14 18:39:46.800" +"2019/01/14 18:39:58.600" "2019/01/14 18:39:58.800" +"2019/01/14 18:40:10.600" "2019/01/14 18:40:10.800" +"2019/01/14 18:40:22.600" "2019/01/14 18:40:22.800" +"2019/01/14 18:40:34.600" "2019/01/14 18:40:34.800" +"2019/01/14 18:40:46.600" "2019/01/14 18:40:46.800" +"2019/01/14 18:41:28.000" "2019/01/14 18:41:28.200" +"2019/01/14 18:41:40.000" "2019/01/14 18:41:40.200" +"2019/01/14 18:41:52.000" "2019/01/14 18:41:52.200" +"2019/01/14 18:42:04.000" "2019/01/14 18:42:04.200" +"2019/01/14 18:42:16.000" "2019/01/14 18:42:16.200" +"2019/01/14 18:42:28.000" "2019/01/14 18:42:28.200" +"2019/01/14 18:42:40.000" "2019/01/14 18:42:40.200" +"2019/01/14 18:42:52.000" "2019/01/14 18:42:52.200" +"2019/01/14 18:43:04.000" "2019/01/14 18:43:04.200" +"2019/01/14 18:43:16.000" "2019/01/14 18:43:16.200" +"2019/01/14 18:43:28.000" "2019/01/14 18:43:28.200" +"2019/01/14 18:43:40.000" "2019/01/14 18:43:40.200" +"2019/01/14 18:43:52.000" "2019/01/14 18:43:52.200" +"2019/01/14 18:48:50.600" "2019/01/14 18:48:50.800" +"2019/01/14 18:49:02.600" "2019/01/14 18:49:02.800" +"2019/01/14 18:49:14.600" "2019/01/14 18:49:14.800" +"2019/01/14 18:49:26.600" "2019/01/14 18:49:26.800" +"2019/01/14 18:49:38.600" "2019/01/14 18:49:38.800" +"2019/01/14 18:49:50.600" "2019/01/14 18:49:50.800" +"2019/01/14 18:50:02.600" "2019/01/14 18:50:02.800" +"2019/01/14 18:50:14.600" "2019/01/14 18:50:14.800" +"2019/01/14 18:50:26.600" "2019/01/14 18:50:26.800" +"2019/01/14 18:50:38.600" "2019/01/14 18:50:38.800" +"2019/01/14 18:50:50.600" "2019/01/14 18:50:50.800" +"2019/01/14 18:51:02.600" "2019/01/14 18:51:02.800" +"2019/01/14 18:51:14.600" "2019/01/14 18:51:14.800" +"2019/01/14 18:51:57.000" "2019/01/14 18:51:57.200" +"2019/01/14 18:52:09.000" "2019/01/14 18:52:09.200" +"2019/01/14 18:52:21.000" "2019/01/14 18:52:21.200" +"2019/01/14 18:52:33.000" "2019/01/14 18:52:33.200" +"2019/01/14 18:52:45.000" "2019/01/14 18:52:45.200" +"2019/01/14 18:52:57.000" "2019/01/14 18:52:57.200" +"2019/01/14 18:53:09.000" "2019/01/14 18:53:09.200" +"2019/01/14 18:53:21.000" "2019/01/14 18:53:21.200" +"2019/01/14 18:53:33.000" "2019/01/14 18:53:33.200" +"2019/01/14 18:53:45.000" "2019/01/14 18:53:45.200" +"2019/01/14 18:53:57.000" "2019/01/14 18:53:57.200" +"2019/01/14 18:54:09.000" "2019/01/14 18:54:09.200" +"2019/01/14 18:54:21.000" "2019/01/14 18:54:21.200" +"2019/01/14 18:59:19.600" "2019/01/14 18:59:19.800" +"2019/01/14 18:59:31.600" "2019/01/14 18:59:31.800" +"2019/01/14 18:59:43.600" "2019/01/14 18:59:43.800" +"2019/01/14 18:59:55.600" "2019/01/14 18:59:55.800" +"2019/01/14 19:00:07.600" "2019/01/14 19:00:07.800" +"2019/01/14 19:00:19.600" "2019/01/14 19:00:19.800" +"2019/01/14 19:00:31.600" "2019/01/14 19:00:31.800" +"2019/01/14 19:00:43.600" "2019/01/14 19:00:43.800" +"2019/01/14 19:00:55.600" "2019/01/14 19:00:55.800" +"2019/01/14 19:01:07.600" "2019/01/14 19:01:07.800" +"2019/01/14 19:01:19.600" "2019/01/14 19:01:19.800" +"2019/01/14 19:01:31.600" "2019/01/14 19:01:31.800" +"2019/01/14 19:01:43.600" "2019/01/14 19:01:43.800" +"2019/01/14 19:02:26.000" "2019/01/14 19:02:26.200" +"2019/01/14 19:02:38.000" "2019/01/14 19:02:38.200" +"2019/01/14 19:02:50.000" "2019/01/14 19:02:50.200" +"2019/01/14 19:03:02.000" "2019/01/14 19:03:02.200" +"2019/01/14 19:03:14.000" "2019/01/14 19:03:14.200" +"2019/01/14 19:03:26.000" "2019/01/14 19:03:26.200" +"2019/01/14 19:03:38.000" "2019/01/14 19:03:38.200" +"2019/01/14 19:03:50.000" "2019/01/14 19:03:50.200" +"2019/01/14 19:04:02.000" "2019/01/14 19:04:02.200" +"2019/01/14 19:04:14.000" "2019/01/14 19:04:14.200" +"2019/01/14 19:04:26.000" "2019/01/14 19:04:26.200" +"2019/01/14 19:04:38.000" "2019/01/14 19:04:38.200" +"2019/01/14 19:04:50.000" "2019/01/14 19:04:50.200" +"2019/01/14 19:09:48.600" "2019/01/14 19:09:48.800" +"2019/01/14 19:10:00.600" "2019/01/14 19:10:00.800" +"2019/01/14 19:10:12.600" "2019/01/14 19:10:12.800" +"2019/01/14 19:10:24.600" "2019/01/14 19:10:24.800" +"2019/01/14 19:10:36.600" "2019/01/14 19:10:36.800" +"2019/01/14 19:10:48.600" "2019/01/14 19:10:48.800" +"2019/01/14 19:11:00.600" "2019/01/14 19:11:00.800" +"2019/01/14 19:11:12.600" "2019/01/14 19:11:12.800" +"2019/01/14 19:11:24.600" "2019/01/14 19:11:24.800" +"2019/01/14 19:11:36.600" "2019/01/14 19:11:36.800" +"2019/01/14 19:11:48.600" "2019/01/14 19:11:48.800" +"2019/01/14 19:12:00.600" "2019/01/14 19:12:00.800" +"2019/01/14 19:12:12.600" "2019/01/14 19:12:12.800" +"2019/01/14 19:12:55.000" "2019/01/14 19:12:55.200" +"2019/01/14 19:13:07.000" "2019/01/14 19:13:07.200" +"2019/01/14 19:13:19.000" "2019/01/14 19:13:19.200" +"2019/01/14 19:13:31.000" "2019/01/14 19:13:31.200" +"2019/01/14 19:13:43.000" "2019/01/14 19:13:43.200" +"2019/01/14 19:13:55.000" "2019/01/14 19:13:55.200" +"2019/01/14 19:14:07.000" "2019/01/14 19:14:07.200" +"2019/01/14 19:14:19.000" "2019/01/14 19:14:19.200" +"2019/01/14 19:14:31.000" "2019/01/14 19:14:31.200" +"2019/01/14 19:14:43.000" "2019/01/14 19:14:43.200" +"2019/01/14 19:14:55.000" "2019/01/14 19:14:55.200" +"2019/01/14 19:15:07.000" "2019/01/14 19:15:07.200" +"2019/01/14 19:15:19.000" "2019/01/14 19:15:19.200" +"2019/01/14 19:20:18.600" "2019/01/14 19:20:18.800" +"2019/01/14 19:20:30.600" "2019/01/14 19:20:30.800" +"2019/01/14 19:20:42.600" "2019/01/14 19:20:42.800" +"2019/01/14 19:20:54.600" "2019/01/14 19:20:54.800" +"2019/01/14 19:21:06.600" "2019/01/14 19:21:06.800" +"2019/01/14 19:21:18.600" "2019/01/14 19:21:18.800" +"2019/01/14 19:21:30.600" "2019/01/14 19:21:30.800" +"2019/01/14 19:21:42.600" "2019/01/14 19:21:42.800" +"2019/01/14 19:21:54.600" "2019/01/14 19:21:54.800" +"2019/01/14 19:22:06.600" "2019/01/14 19:22:06.800" +"2019/01/14 19:22:18.600" "2019/01/14 19:22:18.800" +"2019/01/14 19:22:30.600" "2019/01/14 19:22:30.800" +"2019/01/14 19:22:42.600" "2019/01/14 19:22:42.800" +"2019/01/14 19:23:25.000" "2019/01/14 19:23:25.200" +"2019/01/14 19:23:37.000" "2019/01/14 19:23:37.200" +"2019/01/14 19:23:49.000" "2019/01/14 19:23:49.200" +"2019/01/14 19:24:01.000" "2019/01/14 19:24:01.200" +"2019/01/14 19:24:13.000" "2019/01/14 19:24:13.200" +"2019/01/14 19:24:25.000" "2019/01/14 19:24:25.200" +"2019/01/14 19:24:37.000" "2019/01/14 19:24:37.200" +"2019/01/14 19:24:49.000" "2019/01/14 19:24:49.200" +"2019/01/14 19:25:01.000" "2019/01/14 19:25:01.200" +"2019/01/14 19:25:13.000" "2019/01/14 19:25:13.200" +"2019/01/14 19:25:25.000" "2019/01/14 19:25:25.200" +"2019/01/14 19:25:37.000" "2019/01/14 19:25:37.200" +"2019/01/14 19:25:49.000" "2019/01/14 19:25:49.200" +"2019/01/14 19:30:48.600" "2019/01/14 19:30:48.800" +"2019/01/14 19:31:00.600" "2019/01/14 19:31:00.800" +"2019/01/14 19:31:12.600" "2019/01/14 19:31:12.800" +"2019/01/14 19:31:24.600" "2019/01/14 19:31:24.800" +"2019/01/14 19:31:36.600" "2019/01/14 19:31:36.800" +"2019/01/14 19:31:48.600" "2019/01/14 19:31:48.800" +"2019/01/14 19:32:00.600" "2019/01/14 19:32:00.800" +"2019/01/14 19:32:12.600" "2019/01/14 19:32:12.800" +"2019/01/14 19:32:24.600" "2019/01/14 19:32:24.800" +"2019/01/14 19:32:36.600" "2019/01/14 19:32:36.800" +"2019/01/14 19:32:48.600" "2019/01/14 19:32:48.800" +"2019/01/14 19:33:00.600" "2019/01/14 19:33:00.800" +"2019/01/14 19:33:12.600" "2019/01/14 19:33:12.800" +"2019/01/14 19:33:55.000" "2019/01/14 19:33:55.200" +"2019/01/14 19:34:07.000" "2019/01/14 19:34:07.200" +"2019/01/14 19:34:19.000" "2019/01/14 19:34:19.200" +"2019/01/14 19:34:31.000" "2019/01/14 19:34:31.200" +"2019/01/14 19:34:43.000" "2019/01/14 19:34:43.200" +"2019/01/14 19:34:55.000" "2019/01/14 19:34:55.200" +"2019/01/14 19:35:07.000" "2019/01/14 19:35:07.200" +"2019/01/14 19:35:19.000" "2019/01/14 19:35:19.200" +"2019/01/14 19:35:31.000" "2019/01/14 19:35:31.200" +"2019/01/14 19:35:43.000" "2019/01/14 19:35:43.200" +"2019/01/14 19:35:55.000" "2019/01/14 19:35:55.200" +"2019/01/14 19:36:07.000" "2019/01/14 19:36:07.200" +"2019/01/14 19:36:19.000" "2019/01/14 19:36:19.200" +"2019/01/14 19:41:18.600" "2019/01/14 19:41:18.800" +"2019/01/14 19:41:30.600" "2019/01/14 19:41:30.800" +"2019/01/14 19:41:42.600" "2019/01/14 19:41:42.800" +"2019/01/14 19:41:54.600" "2019/01/14 19:41:54.800" +"2019/01/14 19:42:06.600" "2019/01/14 19:42:06.800" +"2019/01/14 19:42:18.600" "2019/01/14 19:42:18.800" +"2019/01/14 19:42:30.600" "2019/01/14 19:42:30.800" +"2019/01/14 19:42:42.600" "2019/01/14 19:42:42.800" +"2019/01/14 19:42:54.600" "2019/01/14 19:42:54.800" +"2019/01/14 19:43:06.600" "2019/01/14 19:43:06.800" +"2019/01/14 19:43:18.600" "2019/01/14 19:43:18.800" +"2019/01/14 19:43:30.600" "2019/01/14 19:43:30.800" +"2019/01/14 19:43:42.600" "2019/01/14 19:43:42.800" +"2019/01/14 19:44:25.000" "2019/01/14 19:44:25.200" +"2019/01/14 19:44:37.000" "2019/01/14 19:44:37.200" +"2019/01/14 19:44:49.000" "2019/01/14 19:44:49.200" +"2019/01/14 19:45:01.000" "2019/01/14 19:45:01.200" +"2019/01/14 19:45:13.000" "2019/01/14 19:45:13.200" +"2019/01/14 19:45:25.000" "2019/01/14 19:45:25.200" +"2019/01/14 19:45:37.000" "2019/01/14 19:45:37.200" +"2019/01/14 19:45:49.000" "2019/01/14 19:45:49.200" +"2019/01/14 19:46:01.000" "2019/01/14 19:46:01.200" +"2019/01/14 19:46:13.000" "2019/01/14 19:46:13.200" +"2019/01/14 19:46:25.000" "2019/01/14 19:46:25.200" +"2019/01/14 19:46:37.000" "2019/01/14 19:46:37.200" +"2019/01/14 19:46:49.000" "2019/01/14 19:46:49.200" +"2019/01/14 19:51:48.600" "2019/01/14 19:51:48.800" +"2019/01/14 19:52:00.600" "2019/01/14 19:52:00.800" +"2019/01/14 19:52:12.600" "2019/01/14 19:52:12.800" +"2019/01/14 19:52:24.600" "2019/01/14 19:52:24.800" +"2019/01/14 19:52:36.600" "2019/01/14 19:52:36.800" +"2019/01/14 19:52:48.600" "2019/01/14 19:52:48.800" +"2019/01/14 19:53:00.600" "2019/01/14 19:53:00.800" +"2019/01/14 19:53:12.600" "2019/01/14 19:53:12.800" +"2019/01/14 19:53:24.600" "2019/01/14 19:53:24.800" +"2019/01/14 19:53:36.600" "2019/01/14 19:53:36.800" +"2019/01/14 19:53:48.600" "2019/01/14 19:53:48.800" +"2019/01/14 19:54:00.600" "2019/01/14 19:54:00.800" +"2019/01/14 19:54:12.600" "2019/01/14 19:54:12.800" +"2019/01/14 19:54:55.000" "2019/01/14 19:54:55.200" +"2019/01/14 19:55:07.000" "2019/01/14 19:55:07.200" +"2019/01/14 19:55:19.000" "2019/01/14 19:55:19.200" +"2019/01/14 19:55:31.000" "2019/01/14 19:55:31.200" +"2019/01/14 19:55:43.000" "2019/01/14 19:55:43.200" +"2019/01/14 19:55:55.000" "2019/01/14 19:55:55.200" +"2019/01/14 19:56:07.000" "2019/01/14 19:56:07.200" +"2019/01/14 19:56:19.000" "2019/01/14 19:56:19.200" +"2019/01/14 19:56:31.000" "2019/01/14 19:56:31.200" +"2019/01/14 19:56:43.000" "2019/01/14 19:56:43.200" +"2019/01/14 19:56:55.000" "2019/01/14 19:56:55.200" +"2019/01/14 19:57:07.000" "2019/01/14 19:57:07.200" +"2019/01/14 19:57:19.000" "2019/01/14 19:57:19.200" +"2019/01/14 20:02:18.600" "2019/01/14 20:02:18.800" +"2019/01/14 20:02:30.600" "2019/01/14 20:02:30.800" +"2019/01/14 20:02:42.600" "2019/01/14 20:02:42.800" +"2019/01/14 20:02:54.600" "2019/01/14 20:02:54.800" +"2019/01/14 20:03:06.600" "2019/01/14 20:03:06.800" +"2019/01/14 20:03:18.600" "2019/01/14 20:03:18.800" +"2019/01/14 20:03:30.600" "2019/01/14 20:03:30.800" +"2019/01/14 20:03:42.600" "2019/01/14 20:03:42.800" +"2019/01/14 20:03:54.600" "2019/01/14 20:03:54.800" +"2019/01/14 20:04:06.600" "2019/01/14 20:04:06.800" +"2019/01/14 20:04:18.600" "2019/01/14 20:04:18.800" +"2019/01/14 20:04:30.600" "2019/01/14 20:04:30.800" +"2019/01/14 20:04:42.600" "2019/01/14 20:04:42.800" +"2019/01/14 20:05:26.000" "2019/01/14 20:05:26.200" +"2019/01/14 20:05:38.000" "2019/01/14 20:05:38.200" +"2019/01/14 20:05:50.000" "2019/01/14 20:05:50.200" +"2019/01/14 20:06:02.000" "2019/01/14 20:06:02.200" +"2019/01/14 20:06:14.000" "2019/01/14 20:06:14.200" +"2019/01/14 20:06:26.000" "2019/01/14 20:06:26.200" +"2019/01/14 20:06:38.000" "2019/01/14 20:06:38.200" +"2019/01/14 20:06:50.000" "2019/01/14 20:06:50.200" +"2019/01/14 20:07:02.000" "2019/01/14 20:07:02.200" +"2019/01/14 20:07:14.000" "2019/01/14 20:07:14.200" +"2019/01/14 20:07:26.000" "2019/01/14 20:07:26.200" +"2019/01/14 20:07:38.000" "2019/01/14 20:07:38.200" +"2019/01/14 20:07:50.000" "2019/01/14 20:07:50.200" +"2019/01/14 20:12:49.600" "2019/01/14 20:12:49.800" +"2019/01/14 20:13:01.600" "2019/01/14 20:13:01.800" +"2019/01/14 20:13:13.600" "2019/01/14 20:13:13.800" +"2019/01/14 20:13:25.600" "2019/01/14 20:13:25.800" +"2019/01/14 20:13:37.600" "2019/01/14 20:13:37.800" +"2019/01/14 20:13:49.600" "2019/01/14 20:13:49.800" +"2019/01/14 20:14:01.600" "2019/01/14 20:14:01.800" +"2019/01/14 20:14:13.600" "2019/01/14 20:14:13.800" +"2019/01/14 20:14:25.600" "2019/01/14 20:14:25.800" +"2019/01/14 20:14:37.600" "2019/01/14 20:14:37.800" +"2019/01/14 20:14:49.600" "2019/01/14 20:14:49.800" +"2019/01/14 20:15:01.600" "2019/01/14 20:15:01.800" +"2019/01/14 20:15:13.600" "2019/01/14 20:15:13.800" +"2019/01/14 20:15:57.000" "2019/01/14 20:15:57.200" +"2019/01/14 20:16:09.000" "2019/01/14 20:16:09.200" +"2019/01/14 20:16:21.000" "2019/01/14 20:16:21.200" +"2019/01/14 20:16:33.000" "2019/01/14 20:16:33.200" +"2019/01/14 20:16:45.000" "2019/01/14 20:16:45.200" +"2019/01/14 20:16:57.000" "2019/01/14 20:16:57.200" +"2019/01/14 20:17:09.000" "2019/01/14 20:17:09.200" +"2019/01/14 20:17:21.000" "2019/01/14 20:17:21.200" +"2019/01/14 20:17:33.000" "2019/01/14 20:17:33.200" +"2019/01/14 20:17:45.000" "2019/01/14 20:17:45.200" +"2019/01/14 20:17:57.000" "2019/01/14 20:17:57.200" +"2019/01/14 20:18:09.000" "2019/01/14 20:18:09.200" +"2019/01/14 20:18:21.000" "2019/01/14 20:18:21.200" +"2019/01/14 20:23:20.600" "2019/01/14 20:23:20.800" +"2019/01/14 20:23:32.600" "2019/01/14 20:23:32.800" +"2019/01/14 20:23:44.600" "2019/01/14 20:23:44.800" +"2019/01/14 20:23:56.600" "2019/01/14 20:23:56.800" +"2019/01/14 20:24:08.600" "2019/01/14 20:24:08.800" +"2019/01/14 20:24:20.600" "2019/01/14 20:24:20.800" +"2019/01/14 20:24:32.600" "2019/01/14 20:24:32.800" +"2019/01/14 20:24:44.600" "2019/01/14 20:24:44.800" +"2019/01/14 20:24:56.600" "2019/01/14 20:24:56.800" +"2019/01/14 20:25:08.600" "2019/01/14 20:25:08.800" +"2019/01/14 20:25:20.600" "2019/01/14 20:25:20.800" +"2019/01/14 20:25:32.600" "2019/01/14 20:25:32.800" +"2019/01/14 20:25:44.600" "2019/01/14 20:25:44.800" +"2019/01/14 20:26:28.000" "2019/01/14 20:26:28.200" +"2019/01/14 20:26:40.000" "2019/01/14 20:26:40.200" +"2019/01/14 20:26:52.000" "2019/01/14 20:26:52.200" +"2019/01/14 20:27:04.000" "2019/01/14 20:27:04.200" +"2019/01/14 20:27:16.000" "2019/01/14 20:27:16.200" +"2019/01/14 20:27:28.000" "2019/01/14 20:27:28.200" +"2019/01/14 20:27:40.000" "2019/01/14 20:27:40.200" +"2019/01/14 20:27:52.000" "2019/01/14 20:27:52.200" +"2019/01/14 20:28:04.000" "2019/01/14 20:28:04.200" +"2019/01/14 20:28:16.000" "2019/01/14 20:28:16.200" +"2019/01/14 20:28:28.000" "2019/01/14 20:28:28.200" +"2019/01/14 20:28:40.000" "2019/01/14 20:28:40.200" +"2019/01/14 20:28:52.000" "2019/01/14 20:28:52.200" +"2019/01/14 20:33:52.600" "2019/01/14 20:33:52.800" +"2019/01/14 20:34:04.600" "2019/01/14 20:34:04.800" +"2019/01/14 20:34:16.600" "2019/01/14 20:34:16.800" +"2019/01/14 20:34:28.600" "2019/01/14 20:34:28.800" +"2019/01/14 20:34:40.600" "2019/01/14 20:34:40.800" +"2019/01/14 20:34:52.600" "2019/01/14 20:34:52.800" +"2019/01/14 20:35:04.600" "2019/01/14 20:35:04.800" +"2019/01/14 20:35:16.600" "2019/01/14 20:35:16.800" +"2019/01/14 20:35:28.600" "2019/01/14 20:35:28.800" +"2019/01/14 20:35:40.600" "2019/01/14 20:35:40.800" +"2019/01/14 20:35:52.600" "2019/01/14 20:35:52.800" +"2019/01/14 20:36:04.600" "2019/01/14 20:36:04.800" +"2019/01/14 20:36:16.600" "2019/01/14 20:36:16.800" +"2019/01/14 20:37:00.000" "2019/01/14 20:37:00.200" +"2019/01/14 20:37:12.000" "2019/01/14 20:37:12.200" +"2019/01/14 20:37:24.000" "2019/01/14 20:37:24.200" +"2019/01/14 20:37:36.000" "2019/01/14 20:37:36.200" +"2019/01/14 20:37:48.000" "2019/01/14 20:37:48.200" +"2019/01/14 20:38:00.000" "2019/01/14 20:38:00.200" +"2019/01/14 20:38:12.000" "2019/01/14 20:38:12.200" +"2019/01/14 20:38:24.000" "2019/01/14 20:38:24.200" +"2019/01/14 20:38:36.000" "2019/01/14 20:38:36.200" +"2019/01/14 20:38:48.000" "2019/01/14 20:38:48.200" +"2019/01/14 20:39:00.000" "2019/01/14 20:39:00.200" +"2019/01/14 20:39:12.000" "2019/01/14 20:39:12.200" +"2019/01/14 20:39:24.000" "2019/01/14 20:39:24.200" +"2019/01/14 20:44:24.600" "2019/01/14 20:44:24.800" +"2019/01/14 20:44:36.600" "2019/01/14 20:44:36.800" +"2019/01/14 20:44:48.600" "2019/01/14 20:44:48.800" +"2019/01/14 20:45:00.600" "2019/01/14 20:45:00.800" +"2019/01/14 20:45:12.600" "2019/01/14 20:45:12.800" +"2019/01/14 20:45:24.600" "2019/01/14 20:45:24.800" +"2019/01/14 20:45:36.600" "2019/01/14 20:45:36.800" +"2019/01/14 20:45:48.600" "2019/01/14 20:45:48.800" +"2019/01/14 20:46:00.600" "2019/01/14 20:46:00.800" +"2019/01/14 20:46:12.600" "2019/01/14 20:46:12.800" +"2019/01/14 20:46:24.600" "2019/01/14 20:46:24.800" +"2019/01/14 20:46:36.600" "2019/01/14 20:46:36.800" +"2019/01/14 20:46:48.600" "2019/01/14 20:46:48.800" +"2019/01/14 20:47:32.000" "2019/01/14 20:47:32.200" +"2019/01/14 20:47:44.000" "2019/01/14 20:47:44.200" +"2019/01/14 20:47:56.000" "2019/01/14 20:47:56.200" +"2019/01/14 20:48:08.000" "2019/01/14 20:48:08.200" +"2019/01/14 20:48:20.000" "2019/01/14 20:48:20.200" +"2019/01/14 20:48:32.000" "2019/01/14 20:48:32.200" +"2019/01/14 20:48:44.000" "2019/01/14 20:48:44.200" +"2019/01/14 20:48:56.000" "2019/01/14 20:48:56.200" +"2019/01/14 20:49:08.000" "2019/01/14 20:49:08.200" +"2019/01/14 20:49:20.000" "2019/01/14 20:49:20.200" +"2019/01/14 20:49:32.000" "2019/01/14 20:49:32.200" +"2019/01/14 20:49:44.000" "2019/01/14 20:49:44.200" +"2019/01/14 20:49:56.000" "2019/01/14 20:49:56.200" +"2019/01/14 20:54:56.600" "2019/01/14 20:54:56.800" +"2019/01/14 20:55:08.600" "2019/01/14 20:55:08.800" +"2019/01/14 20:55:20.600" "2019/01/14 20:55:20.800" +"2019/01/14 20:55:32.600" "2019/01/14 20:55:32.800" +"2019/01/14 20:55:44.600" "2019/01/14 20:55:44.800" +"2019/01/14 20:55:56.600" "2019/01/14 20:55:56.800" +"2019/01/14 20:56:08.600" "2019/01/14 20:56:08.800" +"2019/01/14 20:56:20.600" "2019/01/14 20:56:20.800" +"2019/01/14 20:56:32.600" "2019/01/14 20:56:32.800" +"2019/01/14 20:56:44.600" "2019/01/14 20:56:44.800" +"2019/01/14 20:56:56.600" "2019/01/14 20:56:56.800" +"2019/01/14 20:57:08.600" "2019/01/14 20:57:08.800" +"2019/01/14 20:57:20.600" "2019/01/14 20:57:20.800" +"2019/01/14 20:58:04.000" "2019/01/14 20:58:04.200" +"2019/01/14 20:58:16.000" "2019/01/14 20:58:16.200" +"2019/01/14 20:58:28.000" "2019/01/14 20:58:28.200" +"2019/01/14 20:58:40.000" "2019/01/14 20:58:40.200" +"2019/01/14 20:58:52.000" "2019/01/14 20:58:52.200" +"2019/01/14 20:59:04.000" "2019/01/14 20:59:04.200" +"2019/01/14 20:59:16.000" "2019/01/14 20:59:16.200" +"2019/01/14 20:59:28.000" "2019/01/14 20:59:28.200" +"2019/01/14 20:59:40.000" "2019/01/14 20:59:40.200" +"2019/01/14 20:59:52.000" "2019/01/14 20:59:52.200" +"2019/01/14 21:00:04.000" "2019/01/14 21:00:04.200" +"2019/01/14 21:00:16.000" "2019/01/14 21:00:16.200" +"2019/01/14 21:00:28.000" "2019/01/14 21:00:28.200" +"2019/01/14 21:05:28.600" "2019/01/14 21:05:28.800" +"2019/01/14 21:05:40.600" "2019/01/14 21:05:40.800" +"2019/01/14 21:05:52.600" "2019/01/14 21:05:52.800" +"2019/01/14 21:06:04.600" "2019/01/14 21:06:04.800" +"2019/01/14 21:06:16.600" "2019/01/14 21:06:16.800" +"2019/01/14 21:06:28.600" "2019/01/14 21:06:28.800" +"2019/01/14 21:06:40.600" "2019/01/14 21:06:40.800" +"2019/01/14 21:06:52.600" "2019/01/14 21:06:52.800" +"2019/01/14 21:07:04.600" "2019/01/14 21:07:04.800" +"2019/01/14 21:07:16.600" "2019/01/14 21:07:16.800" +"2019/01/14 21:07:28.600" "2019/01/14 21:07:28.800" +"2019/01/14 21:07:40.600" "2019/01/14 21:07:40.800" +"2019/01/14 21:07:52.600" "2019/01/14 21:07:52.800" +"2019/01/14 21:08:36.000" "2019/01/14 21:08:36.200" +"2019/01/14 21:08:48.000" "2019/01/14 21:08:48.200" +"2019/01/14 21:09:00.000" "2019/01/14 21:09:00.200" +"2019/01/14 21:09:12.000" "2019/01/14 21:09:12.200" +"2019/01/14 21:09:24.000" "2019/01/14 21:09:24.200" +"2019/01/14 21:09:36.000" "2019/01/14 21:09:36.200" +"2019/01/14 21:09:48.000" "2019/01/14 21:09:48.200" +"2019/01/14 21:10:00.000" "2019/01/14 21:10:00.200" +"2019/01/14 21:10:12.000" "2019/01/14 21:10:12.200" +"2019/01/14 21:10:24.000" "2019/01/14 21:10:24.200" +"2019/01/14 21:10:36.000" "2019/01/14 21:10:36.200" +"2019/01/14 21:10:48.000" "2019/01/14 21:10:48.200" +"2019/01/14 21:11:00.000" "2019/01/14 21:11:00.200" +"2019/01/14 21:16:00.600" "2019/01/14 21:16:00.800" +"2019/01/14 21:16:12.600" "2019/01/14 21:16:12.800" +"2019/01/14 21:16:24.600" "2019/01/14 21:16:24.800" +"2019/01/14 21:16:36.600" "2019/01/14 21:16:36.800" +"2019/01/14 21:16:48.600" "2019/01/14 21:16:48.800" +"2019/01/14 21:17:00.600" "2019/01/14 21:17:00.800" +"2019/01/14 21:17:12.600" "2019/01/14 21:17:12.800" +"2019/01/14 21:17:24.600" "2019/01/14 21:17:24.800" +"2019/01/14 21:17:36.600" "2019/01/14 21:17:36.800" +"2019/01/14 21:17:48.600" "2019/01/14 21:17:48.800" +"2019/01/14 21:18:00.600" "2019/01/14 21:18:00.800" +"2019/01/14 21:18:12.600" "2019/01/14 21:18:12.800" +"2019/01/14 21:18:24.600" "2019/01/14 21:18:24.800" +"2019/01/14 21:19:08.000" "2019/01/14 21:19:08.200" +"2019/01/14 21:19:20.000" "2019/01/14 21:19:20.200" +"2019/01/14 21:19:32.000" "2019/01/14 21:19:32.200" +"2019/01/14 21:19:44.000" "2019/01/14 21:19:44.200" +"2019/01/14 21:19:56.000" "2019/01/14 21:19:56.200" +"2019/01/14 21:20:08.000" "2019/01/14 21:20:08.200" +"2019/01/14 21:20:20.000" "2019/01/14 21:20:20.200" +"2019/01/14 21:20:32.000" "2019/01/14 21:20:32.200" +"2019/01/14 21:20:44.000" "2019/01/14 21:20:44.200" +"2019/01/14 21:20:56.000" "2019/01/14 21:20:56.200" +"2019/01/14 21:21:08.000" "2019/01/14 21:21:08.200" +"2019/01/14 21:21:20.000" "2019/01/14 21:21:20.200" +"2019/01/14 21:21:32.000" "2019/01/14 21:21:32.200" +"2019/01/14 21:26:32.600" "2019/01/14 21:26:32.800" +"2019/01/14 21:26:44.600" "2019/01/14 21:26:44.800" +"2019/01/14 21:26:56.600" "2019/01/14 21:26:56.800" +"2019/01/14 21:27:08.600" "2019/01/14 21:27:08.800" +"2019/01/14 21:27:20.600" "2019/01/14 21:27:20.800" +"2019/01/14 21:27:32.600" "2019/01/14 21:27:32.800" +"2019/01/14 21:27:44.600" "2019/01/14 21:27:44.800" +"2019/01/14 21:27:56.600" "2019/01/14 21:27:56.800" +"2019/01/14 21:28:08.600" "2019/01/14 21:28:08.800" +"2019/01/14 21:28:20.600" "2019/01/14 21:28:20.800" +"2019/01/14 21:28:32.600" "2019/01/14 21:28:32.800" +"2019/01/14 21:28:44.600" "2019/01/14 21:28:44.800" +"2019/01/14 21:28:56.600" "2019/01/14 21:28:56.800" +"2019/01/20 19:13:45.468" "2019/01/20 19:13:45.668" +"2019/01/20 19:13:57.468" "2019/01/20 19:13:57.668" +"2019/01/20 19:14:09.468" "2019/01/20 19:14:09.668" +"2019/01/20 19:14:21.468" "2019/01/20 19:14:21.668" +"2019/01/20 19:14:33.468" "2019/01/20 19:14:33.668" +"2019/01/20 19:14:45.468" "2019/01/20 19:14:45.668" +"2019/01/20 19:14:57.468" "2019/01/20 19:14:57.668" +"2019/01/20 19:15:09.468" "2019/01/20 19:15:09.668" +"2019/01/20 19:15:21.468" "2019/01/20 19:15:21.668" +"2019/01/20 19:15:33.468" "2019/01/20 19:15:33.668" +"2019/01/20 19:15:45.468" "2019/01/20 19:15:45.668" +"2019/01/20 19:15:57.468" "2019/01/20 19:15:57.668" +"2019/01/20 19:16:09.468" "2019/01/20 19:16:09.668" +"2019/01/20 19:16:21.468" "2019/01/20 19:16:21.668" +"2019/01/20 19:21:42.681" "2019/01/20 19:21:42.881" +"2019/01/20 19:21:54.681" "2019/01/20 19:21:54.881" +"2019/01/20 19:22:06.681" "2019/01/20 19:22:06.881" +"2019/01/20 19:22:18.681" "2019/01/20 19:22:18.881" +"2019/01/20 19:22:30.681" "2019/01/20 19:22:30.881" +"2019/01/20 19:22:42.681" "2019/01/20 19:22:42.881" +"2019/01/20 19:22:54.681" "2019/01/20 19:22:54.881" +"2019/01/20 19:23:06.681" "2019/01/20 19:23:06.881" +"2019/01/20 19:23:18.681" "2019/01/20 19:23:18.881" +"2019/01/20 19:23:30.681" "2019/01/20 19:23:30.881" +"2019/01/20 19:23:42.681" "2019/01/20 19:23:42.881" +"2019/01/20 19:23:54.681" "2019/01/20 19:23:54.881" +"2019/01/20 19:24:06.681" "2019/01/20 19:24:06.881" +"2019/01/20 19:24:18.681" "2019/01/20 19:24:18.881" +"2019/01/20 19:25:00.149" "2019/01/20 19:25:00.349" +"2019/01/20 19:25:12.149" "2019/01/20 19:25:12.349" +"2019/01/20 19:25:24.149" "2019/01/20 19:25:24.349" +"2019/01/20 19:25:36.149" "2019/01/20 19:25:36.349" +"2019/01/20 19:25:48.149" "2019/01/20 19:25:48.349" +"2019/01/20 19:26:00.149" "2019/01/20 19:26:00.349" +"2019/01/20 19:26:12.149" "2019/01/20 19:26:12.349" +"2019/01/20 19:26:24.149" "2019/01/20 19:26:24.349" +"2019/01/20 19:26:36.149" "2019/01/20 19:26:36.349" +"2019/01/20 19:26:48.149" "2019/01/20 19:26:48.349" +"2019/01/20 19:27:00.149" "2019/01/20 19:27:00.349" +"2019/01/20 19:27:12.149" "2019/01/20 19:27:12.349" +"2019/01/20 19:27:24.149" "2019/01/20 19:27:24.349" +"2019/01/20 19:27:36.149" "2019/01/20 19:27:36.349" +"2019/01/20 19:32:57.362" "2019/01/20 19:32:57.562" +"2019/01/20 19:33:09.362" "2019/01/20 19:33:09.562" +"2019/01/20 19:33:21.362" "2019/01/20 19:33:21.562" +"2019/01/20 19:33:33.362" "2019/01/20 19:33:33.562" +"2019/01/20 19:33:45.362" "2019/01/20 19:33:45.562" +"2019/01/20 19:33:57.362" "2019/01/20 19:33:57.562" +"2019/01/20 19:34:09.362" "2019/01/20 19:34:09.562" +"2019/01/20 19:34:21.362" "2019/01/20 19:34:21.562" +"2019/01/20 19:34:33.362" "2019/01/20 19:34:33.562" +"2019/01/20 19:34:45.362" "2019/01/20 19:34:45.562" +"2019/01/20 19:34:57.362" "2019/01/20 19:34:57.562" +"2019/01/20 19:35:09.362" "2019/01/20 19:35:09.562" +"2019/01/20 19:35:21.362" "2019/01/20 19:35:21.562" +"2019/01/20 19:35:33.362" "2019/01/20 19:35:33.562" +"2019/01/20 19:36:14.830" "2019/01/20 19:36:15.030" +"2019/01/20 19:36:26.830" "2019/01/20 19:36:27.030" +"2019/01/20 19:36:38.830" "2019/01/20 19:36:39.030" +"2019/01/20 19:36:50.830" "2019/01/20 19:36:51.030" +"2019/01/20 19:37:02.830" "2019/01/20 19:37:03.030" +"2019/01/20 19:37:14.830" "2019/01/20 19:37:15.030" +"2019/01/20 19:37:26.830" "2019/01/20 19:37:27.030" +"2019/01/20 19:37:38.830" "2019/01/20 19:37:39.030" +"2019/01/20 19:37:50.830" "2019/01/20 19:37:51.030" +"2019/01/20 19:38:02.830" "2019/01/20 19:38:03.030" +"2019/01/20 19:38:14.830" "2019/01/20 19:38:15.030" +"2019/01/20 19:38:26.830" "2019/01/20 19:38:27.030" +"2019/01/20 19:38:38.830" "2019/01/20 19:38:39.030" +"2019/01/20 19:38:50.830" "2019/01/20 19:38:51.030" +"2019/01/20 19:44:12.043" "2019/01/20 19:44:12.243" +"2019/01/20 19:44:24.043" "2019/01/20 19:44:24.243" +"2019/01/20 19:44:36.043" "2019/01/20 19:44:36.243" +"2019/01/20 19:44:48.043" "2019/01/20 19:44:48.243" +"2019/01/20 19:45:00.043" "2019/01/20 19:45:00.243" +"2019/01/20 19:45:12.043" "2019/01/20 19:45:12.243" +"2019/01/20 19:45:24.043" "2019/01/20 19:45:24.243" +"2019/01/20 19:45:36.043" "2019/01/20 19:45:36.243" +"2019/01/20 19:45:48.043" "2019/01/20 19:45:48.243" +"2019/01/20 19:46:00.043" "2019/01/20 19:46:00.243" +"2019/01/20 19:46:12.043" "2019/01/20 19:46:12.243" +"2019/01/20 19:46:24.043" "2019/01/20 19:46:24.243" +"2019/01/20 19:46:36.043" "2019/01/20 19:46:36.243" +"2019/01/20 19:46:48.043" "2019/01/20 19:46:48.243" +"2019/01/20 19:47:29.511" "2019/01/20 19:47:29.711" +"2019/01/20 19:47:41.511" "2019/01/20 19:47:41.711" +"2019/01/20 19:47:53.511" "2019/01/20 19:47:53.711" +"2019/01/20 19:48:05.511" "2019/01/20 19:48:05.711" +"2019/01/20 19:48:17.511" "2019/01/20 19:48:17.711" +"2019/01/20 19:48:29.511" "2019/01/20 19:48:29.711" +"2019/01/20 19:48:41.511" "2019/01/20 19:48:41.711" +"2019/01/20 19:48:53.511" "2019/01/20 19:48:53.711" +"2019/01/20 19:49:05.511" "2019/01/20 19:49:05.711" +"2019/01/20 19:49:17.511" "2019/01/20 19:49:17.711" +"2019/01/20 19:49:29.511" "2019/01/20 19:49:29.711" +"2019/01/20 19:49:41.511" "2019/01/20 19:49:41.711" +"2019/01/20 19:49:53.511" "2019/01/20 19:49:53.711" +"2019/01/20 19:50:05.511" "2019/01/20 19:50:05.711" +"2019/01/20 19:55:26.723" "2019/01/20 19:55:26.923" +"2019/01/20 19:55:38.723" "2019/01/20 19:55:38.923" +"2019/01/20 19:55:50.723" "2019/01/20 19:55:50.923" +"2019/01/20 19:56:02.723" "2019/01/20 19:56:02.923" +"2019/01/20 19:56:14.723" "2019/01/20 19:56:14.923" +"2019/01/20 19:56:26.723" "2019/01/20 19:56:26.923" +"2019/01/20 19:56:38.723" "2019/01/20 19:56:38.923" +"2019/01/20 19:56:50.723" "2019/01/20 19:56:50.923" +"2019/01/20 19:57:02.723" "2019/01/20 19:57:02.923" +"2019/01/20 19:57:14.723" "2019/01/20 19:57:14.923" +"2019/01/20 19:57:26.723" "2019/01/20 19:57:26.923" +"2019/01/20 19:57:38.723" "2019/01/20 19:57:38.923" +"2019/01/20 19:57:50.723" "2019/01/20 19:57:50.923" +"2019/01/20 19:58:02.723" "2019/01/20 19:58:02.923" +"2019/01/20 19:58:43.192" "2019/01/20 19:58:43.392" +"2019/01/20 19:58:55.192" "2019/01/20 19:58:55.392" +"2019/01/20 19:59:07.192" "2019/01/20 19:59:07.392" +"2019/01/20 19:59:19.192" "2019/01/20 19:59:19.392" +"2019/01/20 19:59:31.192" "2019/01/20 19:59:31.392" +"2019/01/20 19:59:43.192" "2019/01/20 19:59:43.392" +"2019/01/20 19:59:55.192" "2019/01/20 19:59:55.392" +"2019/01/20 20:00:07.192" "2019/01/20 20:00:07.392" +"2019/01/20 20:00:19.192" "2019/01/20 20:00:19.392" +"2019/01/20 20:00:31.192" "2019/01/20 20:00:31.392" +"2019/01/20 20:00:43.192" "2019/01/20 20:00:43.392" +"2019/01/20 20:00:55.192" "2019/01/20 20:00:55.392" +"2019/01/20 20:01:07.192" "2019/01/20 20:01:07.392" +"2019/01/20 20:01:19.192" "2019/01/20 20:01:19.392" +"2019/01/20 20:06:40.404" "2019/01/20 20:06:40.604" +"2019/01/20 20:06:52.404" "2019/01/20 20:06:52.604" +"2019/01/20 20:07:04.404" "2019/01/20 20:07:04.604" +"2019/01/20 20:07:16.404" "2019/01/20 20:07:16.604" +"2019/01/20 20:07:28.404" "2019/01/20 20:07:28.604" +"2019/01/20 20:07:40.404" "2019/01/20 20:07:40.604" +"2019/01/20 20:07:52.404" "2019/01/20 20:07:52.604" +"2019/01/20 20:08:04.404" "2019/01/20 20:08:04.604" +"2019/01/20 20:08:16.404" "2019/01/20 20:08:16.604" +"2019/01/20 20:08:28.404" "2019/01/20 20:08:28.604" +"2019/01/20 20:08:40.404" "2019/01/20 20:08:40.604" +"2019/01/20 20:08:52.404" "2019/01/20 20:08:52.604" +"2019/01/20 20:09:04.404" "2019/01/20 20:09:04.604" +"2019/01/20 20:09:16.404" "2019/01/20 20:09:16.604" +"2019/01/20 20:09:56.872" "2019/01/20 20:09:57.072" +"2019/01/20 20:10:08.872" "2019/01/20 20:10:09.072" +"2019/01/20 20:10:20.872" "2019/01/20 20:10:21.072" +"2019/01/20 20:10:32.872" "2019/01/20 20:10:33.072" +"2019/01/20 20:10:44.872" "2019/01/20 20:10:45.072" +"2019/01/20 20:10:56.872" "2019/01/20 20:10:57.072" +"2019/01/20 20:11:08.872" "2019/01/20 20:11:09.072" +"2019/01/20 20:11:20.872" "2019/01/20 20:11:21.072" +"2019/01/20 20:11:32.872" "2019/01/20 20:11:33.072" +"2019/01/20 20:11:44.872" "2019/01/20 20:11:45.072" +"2019/01/20 20:11:56.872" "2019/01/20 20:11:57.072" +"2019/01/20 20:12:08.872" "2019/01/20 20:12:09.072" +"2019/01/20 20:12:20.872" "2019/01/20 20:12:21.072" +"2019/01/20 20:12:32.872" "2019/01/20 20:12:33.072" +"2019/01/20 20:17:54.085" "2019/01/20 20:17:54.285" +"2019/01/20 20:18:06.085" "2019/01/20 20:18:06.285" +"2019/01/20 20:18:18.085" "2019/01/20 20:18:18.285" +"2019/01/20 20:18:30.085" "2019/01/20 20:18:30.285" +"2019/01/20 20:18:42.085" "2019/01/20 20:18:42.285" +"2019/01/20 20:18:54.085" "2019/01/20 20:18:54.285" +"2019/01/20 20:19:06.085" "2019/01/20 20:19:06.285" +"2019/01/20 20:19:18.085" "2019/01/20 20:19:18.285" +"2019/01/20 20:19:30.085" "2019/01/20 20:19:30.285" +"2019/01/20 20:19:42.085" "2019/01/20 20:19:42.285" +"2019/01/20 20:19:54.085" "2019/01/20 20:19:54.285" +"2019/01/20 20:20:06.085" "2019/01/20 20:20:06.285" +"2019/01/20 20:20:18.085" "2019/01/20 20:20:18.285" +"2019/01/20 20:20:30.085" "2019/01/20 20:20:30.285" +"2019/01/20 20:21:10.553" "2019/01/20 20:21:10.753" +"2019/01/20 20:21:22.553" "2019/01/20 20:21:22.753" +"2019/01/20 20:21:34.553" "2019/01/20 20:21:34.753" +"2019/01/20 20:21:46.553" "2019/01/20 20:21:46.753" +"2019/01/20 20:21:58.553" "2019/01/20 20:21:58.753" +"2019/01/20 20:22:10.553" "2019/01/20 20:22:10.753" +"2019/01/20 20:22:22.553" "2019/01/20 20:22:22.753" +"2019/01/20 20:22:34.553" "2019/01/20 20:22:34.753" +"2019/01/20 20:22:46.553" "2019/01/20 20:22:46.753" +"2019/01/20 20:22:58.553" "2019/01/20 20:22:58.753" +"2019/01/20 20:23:10.553" "2019/01/20 20:23:10.753" +"2019/01/20 20:23:22.553" "2019/01/20 20:23:22.753" +"2019/01/20 20:23:34.553" "2019/01/20 20:23:34.753" +"2019/01/20 20:23:46.553" "2019/01/20 20:23:46.753" +"2019/01/20 20:29:07.766" "2019/01/20 20:29:07.966" +"2019/01/20 20:29:19.766" "2019/01/20 20:29:19.966" +"2019/01/20 20:29:31.766" "2019/01/20 20:29:31.966" +"2019/01/20 20:29:43.766" "2019/01/20 20:29:43.966" +"2019/01/20 20:29:55.766" "2019/01/20 20:29:55.966" +"2019/01/20 20:30:07.766" "2019/01/20 20:30:07.966" +"2019/01/20 20:30:19.766" "2019/01/20 20:30:19.966" +"2019/01/20 20:30:31.766" "2019/01/20 20:30:31.966" +"2019/01/20 20:30:43.766" "2019/01/20 20:30:43.966" +"2019/01/20 20:30:55.766" "2019/01/20 20:30:55.966" +"2019/01/20 20:31:07.766" "2019/01/20 20:31:07.966" +"2019/01/20 20:31:19.766" "2019/01/20 20:31:19.966" +"2019/01/20 20:31:31.766" "2019/01/20 20:31:31.966" +"2019/01/20 20:31:43.766" "2019/01/20 20:31:43.966" +"2019/01/20 20:32:24.234" "2019/01/20 20:32:24.434" +"2019/01/20 20:32:36.234" "2019/01/20 20:32:36.434" +"2019/01/20 20:32:48.234" "2019/01/20 20:32:48.434" +"2019/01/20 20:33:00.234" "2019/01/20 20:33:00.434" +"2019/01/20 20:33:12.234" "2019/01/20 20:33:12.434" +"2019/01/20 20:33:24.234" "2019/01/20 20:33:24.434" +"2019/01/20 20:33:36.234" "2019/01/20 20:33:36.434" +"2019/01/20 20:33:48.234" "2019/01/20 20:33:48.434" +"2019/01/20 20:34:00.234" "2019/01/20 20:34:00.434" +"2019/01/20 20:34:12.234" "2019/01/20 20:34:12.434" +"2019/01/20 20:34:24.234" "2019/01/20 20:34:24.434" +"2019/01/20 20:34:36.234" "2019/01/20 20:34:36.434" +"2019/01/20 20:34:48.234" "2019/01/20 20:34:48.434" +"2019/01/20 20:35:00.234" "2019/01/20 20:35:00.434" +"2019/01/20 20:40:21.447" "2019/01/20 20:40:21.647" +"2019/01/20 20:40:33.447" "2019/01/20 20:40:33.647" +"2019/01/20 20:40:45.447" "2019/01/20 20:40:45.647" +"2019/01/20 20:40:57.447" "2019/01/20 20:40:57.647" +"2019/01/20 20:41:09.447" "2019/01/20 20:41:09.647" +"2019/01/20 20:41:21.447" "2019/01/20 20:41:21.647" +"2019/01/20 20:41:33.447" "2019/01/20 20:41:33.647" +"2019/01/20 20:41:45.447" "2019/01/20 20:41:45.647" +"2019/01/20 20:41:57.447" "2019/01/20 20:41:57.647" +"2019/01/20 20:42:09.447" "2019/01/20 20:42:09.647" +"2019/01/20 20:42:21.447" "2019/01/20 20:42:21.647" +"2019/01/20 20:42:33.447" "2019/01/20 20:42:33.647" +"2019/01/20 20:42:45.447" "2019/01/20 20:42:45.647" +"2019/01/20 20:42:57.447" "2019/01/20 20:42:57.647" +"2019/01/20 20:43:37.915" "2019/01/20 20:43:38.115" +"2019/01/20 20:43:49.915" "2019/01/20 20:43:50.115" +"2019/01/20 20:44:01.915" "2019/01/20 20:44:02.115" +"2019/01/20 20:44:13.915" "2019/01/20 20:44:14.115" +"2019/01/20 20:44:25.915" "2019/01/20 20:44:26.115" +"2019/01/20 20:44:37.915" "2019/01/20 20:44:38.115" +"2019/01/20 20:44:49.915" "2019/01/20 20:44:50.115" +"2019/01/20 20:45:01.915" "2019/01/20 20:45:02.115" +"2019/01/20 20:45:13.915" "2019/01/20 20:45:14.115" +"2019/01/20 20:45:25.915" "2019/01/20 20:45:26.115" +"2019/01/20 20:45:37.915" "2019/01/20 20:45:38.115" +"2019/01/20 20:45:49.915" "2019/01/20 20:45:50.115" +"2019/01/20 20:46:01.915" "2019/01/20 20:46:02.115" +"2019/01/20 20:46:13.915" "2019/01/20 20:46:14.115" +"2019/01/20 20:51:34.128" "2019/01/20 20:51:34.328" +"2019/01/20 20:51:46.128" "2019/01/20 20:51:46.328" +"2019/01/20 20:51:58.128" "2019/01/20 20:51:58.328" +"2019/01/20 20:52:10.128" "2019/01/20 20:52:10.328" +"2019/01/20 20:52:22.128" "2019/01/20 20:52:22.328" +"2019/01/20 20:52:34.128" "2019/01/20 20:52:34.328" +"2019/01/20 20:52:46.128" "2019/01/20 20:52:46.328" +"2019/01/20 20:52:58.128" "2019/01/20 20:52:58.328" +"2019/01/20 20:53:10.128" "2019/01/20 20:53:10.328" +"2019/01/20 20:53:22.128" "2019/01/20 20:53:22.328" +"2019/01/20 20:53:34.128" "2019/01/20 20:53:34.328" +"2019/01/20 20:53:46.128" "2019/01/20 20:53:46.328" +"2019/01/20 20:53:58.128" "2019/01/20 20:53:58.328" +"2019/01/20 20:54:10.128" "2019/01/20 20:54:10.328" +"2019/01/20 20:54:50.596" "2019/01/20 20:54:50.796" +"2019/01/20 20:55:02.596" "2019/01/20 20:55:02.796" +"2019/01/20 20:55:14.596" "2019/01/20 20:55:14.796" +"2019/01/20 20:55:26.596" "2019/01/20 20:55:26.796" +"2019/01/20 20:55:38.596" "2019/01/20 20:55:38.796" +"2019/01/20 20:55:50.596" "2019/01/20 20:55:50.796" +"2019/01/20 20:56:02.596" "2019/01/20 20:56:02.796" +"2019/01/20 20:56:14.596" "2019/01/20 20:56:14.796" +"2019/01/20 20:56:26.596" "2019/01/20 20:56:26.796" +"2019/01/20 20:56:38.596" "2019/01/20 20:56:38.796" +"2019/01/20 20:56:50.596" "2019/01/20 20:56:50.796" +"2019/01/20 20:57:02.596" "2019/01/20 20:57:02.796" +"2019/01/20 20:57:14.596" "2019/01/20 20:57:14.796" +"2019/01/20 20:57:26.596" "2019/01/20 20:57:26.796" +"2019/01/20 21:02:46.809" "2019/01/20 21:02:47.009" +"2019/01/20 21:02:58.809" "2019/01/20 21:02:59.009" +"2019/01/20 21:03:10.809" "2019/01/20 21:03:11.009" +"2019/01/20 21:03:22.809" "2019/01/20 21:03:23.009" +"2019/01/20 21:03:34.809" "2019/01/20 21:03:35.009" +"2019/01/20 21:03:46.809" "2019/01/20 21:03:47.009" +"2019/01/20 21:03:58.809" "2019/01/20 21:03:59.009" +"2019/01/20 21:04:10.809" "2019/01/20 21:04:11.009" +"2019/01/20 21:04:22.809" "2019/01/20 21:04:23.009" +"2019/01/20 21:04:34.809" "2019/01/20 21:04:35.009" +"2019/01/20 21:04:46.809" "2019/01/20 21:04:47.009" +"2019/01/20 21:04:58.809" "2019/01/20 21:04:59.009" +"2019/01/20 21:05:10.809" "2019/01/20 21:05:11.009" +"2019/01/20 21:05:22.809" "2019/01/20 21:05:23.009" +"2019/01/20 21:06:02.277" "2019/01/20 21:06:02.477" +"2019/01/20 21:06:14.277" "2019/01/20 21:06:14.477" +"2019/01/20 21:06:26.277" "2019/01/20 21:06:26.477" +"2019/01/20 21:06:38.277" "2019/01/20 21:06:38.477" +"2019/01/20 21:06:50.277" "2019/01/20 21:06:50.477" +"2019/01/20 21:07:02.277" "2019/01/20 21:07:02.477" +"2019/01/20 21:07:14.277" "2019/01/20 21:07:14.477" +"2019/01/20 21:07:26.277" "2019/01/20 21:07:26.477" +"2019/01/20 21:07:38.277" "2019/01/20 21:07:38.477" +"2019/01/20 21:07:50.277" "2019/01/20 21:07:50.477" +"2019/01/20 21:08:02.277" "2019/01/20 21:08:02.477" +"2019/01/20 21:08:14.277" "2019/01/20 21:08:14.477" +"2019/01/20 21:08:26.277" "2019/01/20 21:08:26.477" +"2019/01/20 21:08:38.277" "2019/01/20 21:08:38.477" +"2019/01/20 21:13:58.489" "2019/01/20 21:13:58.689" +"2019/01/20 21:14:10.489" "2019/01/20 21:14:10.689" +"2019/01/20 21:14:22.489" "2019/01/20 21:14:22.689" +"2019/01/20 21:14:34.489" "2019/01/20 21:14:34.689" +"2019/01/20 21:14:46.489" "2019/01/20 21:14:46.689" +"2019/01/20 21:14:58.489" "2019/01/20 21:14:58.689" +"2019/01/20 21:15:10.489" "2019/01/20 21:15:10.689" +"2019/01/20 21:15:22.489" "2019/01/20 21:15:22.689" +"2019/01/20 21:15:34.489" "2019/01/20 21:15:34.689" +"2019/01/20 21:15:46.489" "2019/01/20 21:15:46.689" +"2019/01/20 21:15:58.489" "2019/01/20 21:15:58.689" +"2019/01/20 21:16:10.489" "2019/01/20 21:16:10.689" +"2019/01/20 21:16:22.489" "2019/01/20 21:16:22.689" +"2019/01/20 21:16:34.489" "2019/01/20 21:16:34.689" +"2019/01/20 21:17:13.958" "2019/01/20 21:17:14.158" +"2019/01/20 21:17:25.958" "2019/01/20 21:17:26.158" +"2019/01/20 21:17:37.958" "2019/01/20 21:17:38.158" +"2019/01/20 21:17:49.958" "2019/01/20 21:17:50.158" +"2019/01/20 21:18:01.958" "2019/01/20 21:18:02.158" +"2019/01/20 21:18:13.958" "2019/01/20 21:18:14.158" +"2019/01/20 21:18:25.958" "2019/01/20 21:18:26.158" +"2019/01/20 21:18:37.958" "2019/01/20 21:18:38.158" +"2019/01/20 21:18:49.958" "2019/01/20 21:18:50.158" +"2019/01/20 21:19:01.958" "2019/01/20 21:19:02.158" +"2019/01/20 21:19:13.958" "2019/01/20 21:19:14.158" +"2019/01/20 21:19:25.958" "2019/01/20 21:19:26.158" +"2019/01/20 21:19:37.958" "2019/01/20 21:19:38.158" +"2019/01/20 21:19:49.958" "2019/01/20 21:19:50.158" +"2019/01/20 21:25:10.170" "2019/01/20 21:25:10.370" +"2019/01/20 21:25:22.170" "2019/01/20 21:25:22.370" +"2019/01/20 21:25:34.170" "2019/01/20 21:25:34.370" +"2019/01/20 21:25:46.170" "2019/01/20 21:25:46.370" +"2019/01/20 21:25:58.170" "2019/01/20 21:25:58.370" +"2019/01/20 21:26:10.170" "2019/01/20 21:26:10.370" +"2019/01/20 21:26:22.170" "2019/01/20 21:26:22.370" +"2019/01/20 21:26:34.170" "2019/01/20 21:26:34.370" +"2019/01/20 21:26:46.170" "2019/01/20 21:26:46.370" +"2019/01/20 21:26:58.170" "2019/01/20 21:26:58.370" +"2019/01/20 21:27:10.170" "2019/01/20 21:27:10.370" +"2019/01/20 21:27:22.170" "2019/01/20 21:27:22.370" +"2019/01/20 21:27:34.170" "2019/01/20 21:27:34.370" +"2019/01/20 21:27:46.170" "2019/01/20 21:27:46.370" +"2019/01/20 21:28:25.638" "2019/01/20 21:28:25.838" +"2019/01/20 21:28:37.638" "2019/01/20 21:28:37.838" +"2019/01/20 21:28:49.638" "2019/01/20 21:28:49.838" +"2019/01/20 21:29:01.638" "2019/01/20 21:29:01.838" +"2019/01/20 21:29:13.638" "2019/01/20 21:29:13.838" +"2019/01/20 21:29:25.638" "2019/01/20 21:29:25.838" +"2019/01/20 21:29:37.638" "2019/01/20 21:29:37.838" +"2019/01/20 21:29:49.638" "2019/01/20 21:29:49.838" +"2019/01/20 21:30:01.638" "2019/01/20 21:30:01.838" +"2019/01/20 21:30:13.638" "2019/01/20 21:30:13.838" +"2019/01/20 21:30:25.638" "2019/01/20 21:30:25.838" +"2019/01/20 21:30:37.638" "2019/01/20 21:30:37.838" +"2019/01/20 21:30:49.638" "2019/01/20 21:30:49.838" +"2019/01/20 21:31:01.638" "2019/01/20 21:31:01.838" +"2019/01/20 21:36:21.851" "2019/01/20 21:36:22.051" +"2019/01/20 21:36:33.851" "2019/01/20 21:36:34.051" +"2019/01/20 21:36:45.851" "2019/01/20 21:36:46.051" +"2019/01/20 21:36:57.851" "2019/01/20 21:36:58.051" +"2019/01/20 21:37:09.851" "2019/01/20 21:37:10.051" +"2019/01/20 21:37:21.851" "2019/01/20 21:37:22.051" +"2019/01/20 21:37:33.851" "2019/01/20 21:37:34.051" +"2019/01/20 21:37:45.851" "2019/01/20 21:37:46.051" +"2019/01/20 21:37:57.851" "2019/01/20 21:37:58.051" +"2019/01/20 21:38:09.851" "2019/01/20 21:38:10.051" +"2019/01/20 21:38:21.851" "2019/01/20 21:38:22.051" +"2019/01/20 21:38:33.851" "2019/01/20 21:38:34.051" +"2019/01/20 21:38:45.851" "2019/01/20 21:38:46.051" +"2019/01/20 21:38:57.851" "2019/01/20 21:38:58.051" +"2019/01/20 21:39:37.319" "2019/01/20 21:39:37.519" +"2019/01/20 21:39:49.319" "2019/01/20 21:39:49.519" +"2019/01/20 21:40:01.319" "2019/01/20 21:40:01.519" +"2019/01/20 21:40:13.319" "2019/01/20 21:40:13.519" +"2019/01/20 21:40:25.319" "2019/01/20 21:40:25.519" +"2019/01/20 21:40:37.319" "2019/01/20 21:40:37.519" +"2019/01/20 21:40:49.319" "2019/01/20 21:40:49.519" +"2019/01/20 21:41:01.319" "2019/01/20 21:41:01.519" +"2019/01/20 21:41:13.319" "2019/01/20 21:41:13.519" +"2019/01/20 21:41:25.319" "2019/01/20 21:41:25.519" +"2019/01/20 21:41:37.319" "2019/01/20 21:41:37.519" +"2019/01/20 21:41:49.319" "2019/01/20 21:41:49.519" +"2019/01/20 21:42:01.319" "2019/01/20 21:42:01.519" +"2019/01/20 21:42:13.319" "2019/01/20 21:42:13.519" +"2019/01/20 21:47:33.532" "2019/01/20 21:47:33.732" +"2019/01/20 21:47:45.532" "2019/01/20 21:47:45.732" +"2019/01/20 21:47:57.532" "2019/01/20 21:47:57.732" +"2019/01/20 21:48:09.532" "2019/01/20 21:48:09.732" +"2019/01/20 21:48:21.532" "2019/01/20 21:48:21.732" +"2019/01/20 21:48:33.532" "2019/01/20 21:48:33.732" +"2019/01/20 21:48:45.532" "2019/01/20 21:48:45.732" +"2019/01/20 21:48:57.532" "2019/01/20 21:48:57.732" +"2019/01/20 21:49:09.532" "2019/01/20 21:49:09.732" +"2019/01/20 21:49:21.532" "2019/01/20 21:49:21.732" +"2019/01/20 21:49:33.532" "2019/01/20 21:49:33.732" +"2019/01/20 21:49:45.532" "2019/01/20 21:49:45.732" +"2019/01/20 21:49:57.532" "2019/01/20 21:49:57.732" +"2019/01/20 21:50:09.532" "2019/01/20 21:50:09.732" +"2019/01/20 21:50:49.000" "2019/01/20 21:50:49.200" +"2019/01/20 21:51:01.000" "2019/01/20 21:51:01.200" +"2019/01/20 21:51:13.000" "2019/01/20 21:51:13.200" +"2019/01/20 21:51:25.000" "2019/01/20 21:51:25.200" +"2019/01/20 21:51:37.000" "2019/01/20 21:51:37.200" +"2019/01/20 21:51:49.000" "2019/01/20 21:51:49.200" +"2019/01/20 21:52:01.000" "2019/01/20 21:52:01.200" +"2019/01/20 21:52:13.000" "2019/01/20 21:52:13.200" +"2019/01/20 21:52:25.000" "2019/01/20 21:52:25.200" +"2019/01/20 21:52:37.000" "2019/01/20 21:52:37.200" +"2019/01/20 21:52:49.000" "2019/01/20 21:52:49.200" +"2019/01/20 21:53:01.000" "2019/01/20 21:53:01.200" +"2019/01/20 21:53:13.000" "2019/01/20 21:53:13.200" +"2019/01/20 21:53:25.000" "2019/01/20 21:53:25.200" +"2019/01/20 21:58:44.213" "2019/01/20 21:58:44.413" +"2019/01/20 21:58:56.213" "2019/01/20 21:58:56.413" +"2019/01/20 21:59:08.213" "2019/01/20 21:59:08.413" +"2019/01/20 21:59:20.213" "2019/01/20 21:59:20.413" +"2019/01/20 21:59:32.213" "2019/01/20 21:59:32.413" +"2019/01/20 21:59:44.213" "2019/01/20 21:59:44.413" +"2019/01/20 21:59:56.213" "2019/01/20 21:59:56.413" +"2019/01/20 22:00:08.213" "2019/01/20 22:00:08.413" +"2019/01/20 22:00:20.213" "2019/01/20 22:00:20.413" +"2019/01/20 22:00:32.213" "2019/01/20 22:00:32.413" +"2019/01/20 22:00:44.213" "2019/01/20 22:00:44.413" +"2019/01/20 22:00:56.213" "2019/01/20 22:00:56.413" +"2019/01/20 22:01:08.213" "2019/01/20 22:01:08.413" +"2019/01/20 22:01:20.213" "2019/01/20 22:01:20.413" +"2019/01/20 22:01:58.681" "2019/01/20 22:01:58.881" +"2019/01/20 22:02:10.681" "2019/01/20 22:02:10.881" +"2019/01/20 22:02:22.681" "2019/01/20 22:02:22.881" +"2019/01/20 22:02:34.681" "2019/01/20 22:02:34.881" +"2019/01/20 22:02:46.681" "2019/01/20 22:02:46.881" +"2019/01/20 22:02:58.681" "2019/01/20 22:02:58.881" +"2019/01/20 22:03:10.681" "2019/01/20 22:03:10.881" +"2019/01/20 22:03:22.681" "2019/01/20 22:03:22.881" +"2019/01/20 22:03:34.681" "2019/01/20 22:03:34.881" +"2019/01/20 22:03:46.681" "2019/01/20 22:03:46.881" +"2019/01/20 22:03:58.681" "2019/01/20 22:03:58.881" +"2019/01/20 22:04:10.681" "2019/01/20 22:04:10.881" +"2019/01/20 22:04:22.681" "2019/01/20 22:04:22.881" +"2019/01/20 22:04:34.681" "2019/01/20 22:04:34.881" +"2019/01/20 22:09:53.894" "2019/01/20 22:09:54.094" +"2019/01/20 22:10:05.894" "2019/01/20 22:10:06.094" +"2019/01/20 22:10:17.894" "2019/01/20 22:10:18.094" +"2019/01/20 22:10:29.894" "2019/01/20 22:10:30.094" +"2019/01/20 22:10:41.894" "2019/01/20 22:10:42.094" +"2019/01/20 22:10:53.894" "2019/01/20 22:10:54.094" +"2019/01/20 22:11:05.894" "2019/01/20 22:11:06.094" +"2019/01/20 22:11:17.894" "2019/01/20 22:11:18.094" +"2019/01/20 22:11:29.894" "2019/01/20 22:11:30.094" +"2019/01/20 22:11:41.894" "2019/01/20 22:11:42.094" +"2019/01/20 22:11:53.894" "2019/01/20 22:11:54.094" +"2019/01/20 22:12:05.894" "2019/01/20 22:12:06.094" +"2019/01/20 22:12:17.894" "2019/01/20 22:12:18.094" +"2019/01/20 22:12:29.894" "2019/01/20 22:12:30.094" +"2019/01/20 22:13:08.362" "2019/01/20 22:13:08.562" +"2019/01/20 22:13:20.362" "2019/01/20 22:13:20.562" +"2019/01/20 22:13:32.362" "2019/01/20 22:13:32.562" +"2019/01/20 22:13:44.362" "2019/01/20 22:13:44.562" +"2019/01/20 22:13:56.362" "2019/01/20 22:13:56.562" +"2019/01/20 22:14:08.362" "2019/01/20 22:14:08.562" +"2019/01/20 22:14:20.362" "2019/01/20 22:14:20.562" +"2019/01/20 22:14:32.362" "2019/01/20 22:14:32.562" +"2019/01/20 22:14:44.362" "2019/01/20 22:14:44.562" +"2019/01/20 22:14:56.362" "2019/01/20 22:14:56.562" +"2019/01/20 22:15:08.362" "2019/01/20 22:15:08.562" +"2019/01/20 22:15:20.362" "2019/01/20 22:15:20.562" +"2019/01/20 22:15:32.362" "2019/01/20 22:15:32.562" +"2019/01/20 22:15:44.362" "2019/01/20 22:15:44.562" +"2019/01/20 22:21:03.574" "2019/01/20 22:21:03.774" +"2019/01/20 22:21:15.574" "2019/01/20 22:21:15.774" +"2019/01/20 22:21:27.574" "2019/01/20 22:21:27.774" +"2019/01/20 22:21:39.574" "2019/01/20 22:21:39.774" +"2019/01/20 22:21:51.574" "2019/01/20 22:21:51.774" +"2019/01/20 22:22:03.574" "2019/01/20 22:22:03.774" +"2019/01/20 22:22:15.574" "2019/01/20 22:22:15.774" +"2019/01/20 22:22:27.574" "2019/01/20 22:22:27.774" +"2019/01/20 22:22:39.574" "2019/01/20 22:22:39.774" +"2019/01/20 22:22:51.574" "2019/01/20 22:22:51.774" +"2019/01/20 22:23:03.574" "2019/01/20 22:23:03.774" +"2019/01/20 22:23:15.574" "2019/01/20 22:23:15.774" +"2019/01/20 22:23:27.574" "2019/01/20 22:23:27.774" +"2019/01/20 22:23:39.574" "2019/01/20 22:23:39.774" +"2019/01/20 22:24:18.043" "2019/01/20 22:24:18.243" +"2019/01/20 22:24:30.043" "2019/01/20 22:24:30.243" +"2019/01/20 22:24:42.043" "2019/01/20 22:24:42.243" +"2019/01/20 22:24:54.043" "2019/01/20 22:24:54.243" +"2019/01/20 22:25:06.043" "2019/01/20 22:25:06.243" +"2019/01/20 22:25:18.043" "2019/01/20 22:25:18.243" +"2019/01/20 22:25:30.043" "2019/01/20 22:25:30.243" +"2019/01/20 22:25:42.043" "2019/01/20 22:25:42.243" +"2019/01/20 22:25:54.043" "2019/01/20 22:25:54.243" +"2019/01/20 22:26:06.043" "2019/01/20 22:26:06.243" +"2019/01/20 22:26:18.043" "2019/01/20 22:26:18.243" +"2019/01/20 22:26:30.043" "2019/01/20 22:26:30.243" +"2019/01/20 22:26:42.043" "2019/01/20 22:26:42.243" +"2019/01/20 22:26:54.043" "2019/01/20 22:26:54.243" +"2019/01/20 22:32:13.255" "2019/01/20 22:32:13.455" +"2019/01/20 22:32:25.255" "2019/01/20 22:32:25.455" +"2019/01/20 22:32:37.255" "2019/01/20 22:32:37.455" +"2019/01/20 22:32:49.255" "2019/01/20 22:32:49.455" +"2019/01/20 22:33:01.255" "2019/01/20 22:33:01.455" +"2019/01/20 22:33:13.255" "2019/01/20 22:33:13.455" +"2019/01/20 22:33:25.255" "2019/01/20 22:33:25.455" +"2019/01/20 22:33:37.255" "2019/01/20 22:33:37.455" +"2019/01/20 22:33:49.255" "2019/01/20 22:33:49.455" +"2019/01/20 22:34:01.255" "2019/01/20 22:34:01.455" +"2019/01/20 22:34:13.255" "2019/01/20 22:34:13.455" +"2019/01/20 22:34:25.255" "2019/01/20 22:34:25.455" +"2019/01/20 22:34:37.255" "2019/01/20 22:34:37.455" +"2019/01/20 22:34:49.255" "2019/01/20 22:34:49.455" +"2019/01/20 22:35:27.723" "2019/01/20 22:35:27.923" +"2019/01/20 22:35:39.723" "2019/01/20 22:35:39.923" +"2019/01/20 22:35:51.723" "2019/01/20 22:35:51.923" +"2019/01/20 22:36:03.723" "2019/01/20 22:36:03.923" +"2019/01/20 22:36:15.723" "2019/01/20 22:36:15.923" +"2019/01/20 22:36:27.723" "2019/01/20 22:36:27.923" +"2019/01/20 22:36:39.723" "2019/01/20 22:36:39.923" +"2019/01/20 22:36:51.723" "2019/01/20 22:36:51.923" +"2019/01/20 22:37:03.723" "2019/01/20 22:37:03.923" +"2019/01/20 22:37:15.723" "2019/01/20 22:37:15.923" +"2019/01/20 22:37:27.723" "2019/01/20 22:37:27.923" +"2019/01/20 22:37:39.723" "2019/01/20 22:37:39.923" +"2019/01/20 22:37:51.723" "2019/01/20 22:37:51.923" +"2019/01/20 22:38:03.723" "2019/01/20 22:38:03.923" +"2019/01/20 22:43:21.936" "2019/01/20 22:43:22.136" +"2019/01/20 22:43:33.936" "2019/01/20 22:43:34.136" +"2019/01/20 22:43:45.936" "2019/01/20 22:43:46.136" +"2019/01/20 22:43:57.936" "2019/01/20 22:43:58.136" +"2019/01/20 22:44:09.936" "2019/01/20 22:44:10.136" +"2019/01/20 22:44:21.936" "2019/01/20 22:44:22.136" +"2019/01/20 22:44:33.936" "2019/01/20 22:44:34.136" +"2019/01/20 22:44:45.936" "2019/01/20 22:44:46.136" +"2019/01/20 22:44:57.936" "2019/01/20 22:44:58.136" +"2019/01/20 22:45:09.936" "2019/01/20 22:45:10.136" +"2019/01/20 22:45:21.936" "2019/01/20 22:45:22.136" +"2019/01/20 22:45:33.936" "2019/01/20 22:45:34.136" +"2019/01/20 22:45:45.936" "2019/01/20 22:45:46.136" +"2019/01/20 22:46:35.404" "2019/01/20 22:46:35.604" +"2019/01/20 22:46:47.404" "2019/01/20 22:46:47.604" +"2019/01/20 22:46:59.404" "2019/01/20 22:46:59.604" +"2019/01/20 22:47:11.404" "2019/01/20 22:47:11.604" +"2019/01/20 22:47:23.404" "2019/01/20 22:47:23.604" +"2019/01/20 22:47:35.404" "2019/01/20 22:47:35.604" +"2019/01/20 22:47:47.404" "2019/01/20 22:47:47.604" +"2019/01/20 22:47:59.404" "2019/01/20 22:47:59.604" +"2019/01/20 22:48:11.404" "2019/01/20 22:48:11.604" +"2019/01/20 22:48:23.404" "2019/01/20 22:48:23.604" +"2019/01/20 22:48:35.404" "2019/01/20 22:48:35.604" +"2019/01/20 22:48:47.404" "2019/01/20 22:48:47.604" +"2019/01/20 22:48:59.404" "2019/01/20 22:48:59.604" +"2019/01/20 22:49:11.404" "2019/01/20 22:49:11.604" +"2019/01/20 22:54:29.617" "2019/01/20 22:54:29.817" +"2019/01/20 22:54:41.617" "2019/01/20 22:54:41.817" +"2019/01/20 22:54:53.617" "2019/01/20 22:54:53.817" +"2019/01/20 22:55:05.617" "2019/01/20 22:55:05.817" +"2019/01/20 22:55:17.617" "2019/01/20 22:55:17.817" +"2019/01/20 22:55:29.617" "2019/01/20 22:55:29.817" +"2019/01/20 22:55:41.617" "2019/01/20 22:55:41.817" +"2019/01/20 22:55:53.617" "2019/01/20 22:55:53.817" +"2019/01/20 22:56:05.617" "2019/01/20 22:56:05.817" +"2019/01/20 22:56:17.617" "2019/01/20 22:56:17.817" +"2019/01/20 22:56:29.617" "2019/01/20 22:56:29.817" +"2019/01/20 22:56:41.617" "2019/01/20 22:56:41.817" +"2019/01/20 22:56:53.617" "2019/01/20 22:56:53.817" +"2019/01/20 22:57:43.085" "2019/01/20 22:57:43.285" +"2019/01/20 22:57:55.085" "2019/01/20 22:57:55.285" +"2019/01/20 22:58:07.085" "2019/01/20 22:58:07.285" +"2019/01/20 22:58:19.085" "2019/01/20 22:58:19.285" +"2019/01/20 22:58:31.085" "2019/01/20 22:58:31.285" +"2019/01/20 22:58:43.085" "2019/01/20 22:58:43.285" +"2019/01/20 22:58:55.085" "2019/01/20 22:58:55.285" +"2019/01/20 22:59:07.085" "2019/01/20 22:59:07.285" +"2019/01/20 22:59:19.085" "2019/01/20 22:59:19.285" +"2019/01/20 22:59:31.085" "2019/01/20 22:59:31.285" +"2019/01/20 22:59:43.085" "2019/01/20 22:59:43.285" +"2019/01/20 22:59:55.085" "2019/01/20 22:59:55.285" +"2019/01/20 23:00:07.085" "2019/01/20 23:00:07.285" +"2019/01/20 23:00:19.085" "2019/01/20 23:00:19.285" +"2019/01/20 23:05:37.298" "2019/01/20 23:05:37.498" +"2019/01/20 23:05:49.298" "2019/01/20 23:05:49.498" +"2019/01/20 23:06:01.298" "2019/01/20 23:06:01.498" +"2019/01/20 23:06:13.298" "2019/01/20 23:06:13.498" +"2019/01/20 23:06:25.298" "2019/01/20 23:06:25.498" +"2019/01/20 23:06:37.298" "2019/01/20 23:06:37.498" +"2019/01/20 23:06:49.298" "2019/01/20 23:06:49.498" +"2019/01/20 23:07:01.298" "2019/01/20 23:07:01.498" +"2019/01/20 23:07:13.298" "2019/01/20 23:07:13.498" +"2019/01/20 23:07:25.298" "2019/01/20 23:07:25.498" +"2019/01/20 23:07:37.298" "2019/01/20 23:07:37.498" +"2019/01/20 23:07:49.298" "2019/01/20 23:07:49.498" +"2019/01/20 23:08:01.298" "2019/01/20 23:08:01.498" +"2019/01/20 23:08:50.766" "2019/01/20 23:08:50.966" +"2019/01/20 23:09:02.766" "2019/01/20 23:09:02.966" +"2019/01/20 23:09:14.766" "2019/01/20 23:09:14.966" +"2019/01/20 23:09:26.766" "2019/01/20 23:09:26.966" +"2019/01/20 23:09:38.766" "2019/01/20 23:09:38.966" +"2019/01/20 23:09:50.766" "2019/01/20 23:09:50.966" +"2019/01/20 23:10:02.766" "2019/01/20 23:10:02.966" +"2019/01/20 23:10:14.766" "2019/01/20 23:10:14.966" +"2019/01/20 23:10:26.766" "2019/01/20 23:10:26.966" +"2019/01/20 23:10:38.766" "2019/01/20 23:10:38.966" +"2019/01/20 23:10:50.766" "2019/01/20 23:10:50.966" +"2019/01/20 23:11:02.766" "2019/01/20 23:11:02.966" +"2019/01/20 23:11:14.766" "2019/01/20 23:11:14.966" +"2019/01/20 23:11:26.766" "2019/01/20 23:11:26.966" +"2019/01/20 23:16:43.979" "2019/01/20 23:16:44.179" +"2019/01/20 23:16:55.979" "2019/01/20 23:16:56.179" +"2019/01/20 23:17:07.979" "2019/01/20 23:17:08.179" +"2019/01/20 23:17:19.979" "2019/01/20 23:17:20.179" +"2019/01/20 23:17:31.979" "2019/01/20 23:17:32.179" +"2019/01/20 23:17:43.979" "2019/01/20 23:17:44.179" +"2019/01/20 23:17:55.979" "2019/01/20 23:17:56.179" +"2019/01/20 23:18:07.979" "2019/01/20 23:18:08.179" +"2019/01/20 23:18:19.979" "2019/01/20 23:18:20.179" +"2019/01/20 23:18:31.979" "2019/01/20 23:18:32.179" +"2019/01/20 23:18:43.979" "2019/01/20 23:18:44.179" +"2019/01/20 23:18:55.979" "2019/01/20 23:18:56.179" +"2019/01/20 23:19:07.979" "2019/01/20 23:19:08.179" +"2019/01/20 23:19:57.447" "2019/01/20 23:19:57.647" +"2019/01/20 23:20:09.447" "2019/01/20 23:20:09.647" +"2019/01/20 23:20:21.447" "2019/01/20 23:20:21.647" +"2019/01/20 23:20:33.447" "2019/01/20 23:20:33.647" +"2019/01/20 23:20:45.447" "2019/01/20 23:20:45.647" +"2019/01/20 23:20:57.447" "2019/01/20 23:20:57.647" +"2019/01/20 23:21:09.447" "2019/01/20 23:21:09.647" +"2019/01/20 23:21:21.447" "2019/01/20 23:21:21.647" +"2019/01/20 23:21:33.447" "2019/01/20 23:21:33.647" +"2019/01/20 23:21:45.447" "2019/01/20 23:21:45.647" +"2019/01/20 23:21:57.447" "2019/01/20 23:21:57.647" +"2019/01/20 23:22:09.447" "2019/01/20 23:22:09.647" +"2019/01/20 23:22:21.447" "2019/01/20 23:22:21.647" +"2019/01/20 23:22:33.447" "2019/01/20 23:22:33.647" +"2019/01/20 23:27:50.660" "2019/01/20 23:27:50.860" +"2019/01/20 23:28:02.660" "2019/01/20 23:28:02.860" +"2019/01/20 23:28:14.660" "2019/01/20 23:28:14.860" +"2019/01/20 23:28:26.660" "2019/01/20 23:28:26.860" +"2019/01/20 23:28:38.660" "2019/01/20 23:28:38.860" +"2019/01/20 23:28:50.660" "2019/01/20 23:28:50.860" +"2019/01/20 23:29:02.660" "2019/01/20 23:29:02.860" +"2019/01/20 23:29:14.660" "2019/01/20 23:29:14.860" +"2019/01/20 23:29:26.660" "2019/01/20 23:29:26.860" +"2019/01/20 23:29:38.660" "2019/01/20 23:29:38.860" +"2019/01/20 23:29:50.660" "2019/01/20 23:29:50.860" +"2019/01/20 23:30:02.660" "2019/01/20 23:30:02.860" +"2019/01/20 23:30:14.660" "2019/01/20 23:30:14.860" +"2019/01/21 19:41:11.455" "2019/01/21 19:41:11.655" +"2019/01/21 19:41:23.455" "2019/01/21 19:41:23.655" +"2019/01/21 19:41:35.455" "2019/01/21 19:41:35.655" +"2019/01/21 19:41:47.455" "2019/01/21 19:41:47.655" +"2019/01/21 19:41:59.455" "2019/01/21 19:41:59.655" +"2019/01/21 19:42:11.455" "2019/01/21 19:42:11.655" +"2019/01/21 19:42:23.455" "2019/01/21 19:42:23.655" +"2019/01/21 19:42:35.455" "2019/01/21 19:42:35.655" +"2019/01/21 19:42:47.455" "2019/01/21 19:42:47.655" +"2019/01/21 19:42:59.455" "2019/01/21 19:42:59.655" +"2019/01/21 19:43:11.455" "2019/01/21 19:43:11.655" +"2019/01/21 19:43:23.455" "2019/01/21 19:43:23.655" +"2019/01/21 19:43:35.455" "2019/01/21 19:43:35.655" +"2019/01/21 19:48:06.545" "2019/01/21 19:48:06.745" +"2019/01/21 19:48:18.545" "2019/01/21 19:48:18.745" +"2019/01/21 19:48:30.545" "2019/01/21 19:48:30.745" +"2019/01/21 19:48:42.545" "2019/01/21 19:48:42.745" +"2019/01/21 19:48:54.545" "2019/01/21 19:48:54.745" +"2019/01/21 19:49:06.545" "2019/01/21 19:49:06.745" +"2019/01/21 19:49:18.545" "2019/01/21 19:49:18.745" +"2019/01/21 19:49:30.545" "2019/01/21 19:49:30.745" +"2019/01/21 19:49:42.545" "2019/01/21 19:49:42.745" +"2019/01/21 19:49:54.545" "2019/01/21 19:49:54.745" +"2019/01/21 19:50:06.545" "2019/01/21 19:50:06.745" +"2019/01/21 19:50:18.545" "2019/01/21 19:50:18.745" +"2019/01/21 19:50:30.545" "2019/01/21 19:50:30.745" +"2019/01/21 19:51:08.000" "2019/01/21 19:51:08.200" +"2019/01/21 19:51:20.000" "2019/01/21 19:51:20.200" +"2019/01/21 19:51:32.000" "2019/01/21 19:51:32.200" +"2019/01/21 19:51:44.000" "2019/01/21 19:51:44.200" +"2019/01/21 19:51:56.000" "2019/01/21 19:51:56.200" +"2019/01/21 19:52:08.000" "2019/01/21 19:52:08.200" +"2019/01/21 19:52:20.000" "2019/01/21 19:52:20.200" +"2019/01/21 19:52:32.000" "2019/01/21 19:52:32.200" +"2019/01/21 19:52:44.000" "2019/01/21 19:52:44.200" +"2019/01/21 19:52:56.000" "2019/01/21 19:52:56.200" +"2019/01/21 19:53:08.000" "2019/01/21 19:53:08.200" +"2019/01/21 19:53:20.000" "2019/01/21 19:53:20.200" +"2019/01/21 19:53:32.000" "2019/01/21 19:53:32.200" +"2019/01/21 19:58:03.091" "2019/01/21 19:58:03.291" +"2019/01/21 19:58:15.091" "2019/01/21 19:58:15.291" +"2019/01/21 19:58:27.091" "2019/01/21 19:58:27.291" +"2019/01/21 19:58:39.091" "2019/01/21 19:58:39.291" +"2019/01/21 19:58:51.091" "2019/01/21 19:58:51.291" +"2019/01/21 19:59:03.091" "2019/01/21 19:59:03.291" +"2019/01/21 19:59:15.091" "2019/01/21 19:59:15.291" +"2019/01/21 19:59:27.091" "2019/01/21 19:59:27.291" +"2019/01/21 19:59:39.091" "2019/01/21 19:59:39.291" +"2019/01/21 19:59:51.091" "2019/01/21 19:59:51.291" +"2019/01/21 20:00:03.091" "2019/01/21 20:00:03.291" +"2019/01/21 20:00:15.091" "2019/01/21 20:00:15.291" +"2019/01/21 20:00:27.091" "2019/01/21 20:00:27.291" +"2019/01/21 20:01:04.545" "2019/01/21 20:01:04.745" +"2019/01/21 20:01:16.545" "2019/01/21 20:01:16.745" +"2019/01/21 20:01:28.545" "2019/01/21 20:01:28.745" +"2019/01/21 20:01:40.545" "2019/01/21 20:01:40.745" +"2019/01/21 20:01:52.545" "2019/01/21 20:01:52.745" +"2019/01/21 20:02:04.545" "2019/01/21 20:02:04.745" +"2019/01/21 20:02:16.545" "2019/01/21 20:02:16.745" +"2019/01/21 20:02:28.545" "2019/01/21 20:02:28.745" +"2019/01/21 20:02:40.545" "2019/01/21 20:02:40.745" +"2019/01/21 20:02:52.545" "2019/01/21 20:02:52.745" +"2019/01/21 20:03:04.545" "2019/01/21 20:03:04.745" +"2019/01/21 20:03:16.545" "2019/01/21 20:03:16.745" +"2019/01/21 20:03:28.545" "2019/01/21 20:03:28.745" +"2019/01/21 20:07:59.636" "2019/01/21 20:07:59.836" +"2019/01/21 20:08:11.636" "2019/01/21 20:08:11.836" +"2019/01/21 20:08:23.636" "2019/01/21 20:08:23.836" +"2019/01/21 20:08:35.636" "2019/01/21 20:08:35.836" +"2019/01/21 20:08:47.636" "2019/01/21 20:08:47.836" +"2019/01/21 20:08:59.636" "2019/01/21 20:08:59.836" +"2019/01/21 20:09:11.636" "2019/01/21 20:09:11.836" +"2019/01/21 20:09:23.636" "2019/01/21 20:09:23.836" +"2019/01/21 20:09:35.636" "2019/01/21 20:09:35.836" +"2019/01/21 20:09:47.636" "2019/01/21 20:09:47.836" +"2019/01/21 20:09:59.636" "2019/01/21 20:09:59.836" +"2019/01/21 20:10:11.636" "2019/01/21 20:10:11.836" +"2019/01/21 20:10:23.636" "2019/01/21 20:10:23.836" +"2019/01/21 20:11:01.091" "2019/01/21 20:11:01.291" +"2019/01/21 20:11:13.091" "2019/01/21 20:11:13.291" +"2019/01/21 20:11:25.091" "2019/01/21 20:11:25.291" +"2019/01/21 20:11:37.091" "2019/01/21 20:11:37.291" +"2019/01/21 20:11:49.091" "2019/01/21 20:11:49.291" +"2019/01/21 20:12:01.091" "2019/01/21 20:12:01.291" +"2019/01/21 20:12:13.091" "2019/01/21 20:12:13.291" +"2019/01/21 20:12:25.091" "2019/01/21 20:12:25.291" +"2019/01/21 20:12:37.091" "2019/01/21 20:12:37.291" +"2019/01/21 20:12:49.091" "2019/01/21 20:12:49.291" +"2019/01/21 20:13:01.091" "2019/01/21 20:13:01.291" +"2019/01/21 20:13:13.091" "2019/01/21 20:13:13.291" +"2019/01/21 20:13:25.091" "2019/01/21 20:13:25.291" +"2019/01/21 20:17:56.182" "2019/01/21 20:17:56.382" +"2019/01/21 20:18:08.182" "2019/01/21 20:18:08.382" +"2019/01/21 20:18:20.182" "2019/01/21 20:18:20.382" +"2019/01/21 20:18:32.182" "2019/01/21 20:18:32.382" +"2019/01/21 20:18:44.182" "2019/01/21 20:18:44.382" +"2019/01/21 20:18:56.182" "2019/01/21 20:18:56.382" +"2019/01/21 20:19:08.182" "2019/01/21 20:19:08.382" +"2019/01/21 20:19:20.182" "2019/01/21 20:19:20.382" +"2019/01/21 20:19:32.182" "2019/01/21 20:19:32.382" +"2019/01/21 20:19:44.182" "2019/01/21 20:19:44.382" +"2019/01/21 20:19:56.182" "2019/01/21 20:19:56.382" +"2019/01/21 20:20:08.182" "2019/01/21 20:20:08.382" +"2019/01/21 20:20:20.182" "2019/01/21 20:20:20.382" +"2019/01/21 20:20:57.636" "2019/01/21 20:20:57.836" +"2019/01/21 20:21:09.636" "2019/01/21 20:21:09.836" +"2019/01/21 20:21:21.636" "2019/01/21 20:21:21.836" +"2019/01/21 20:21:33.636" "2019/01/21 20:21:33.836" +"2019/01/21 20:21:45.636" "2019/01/21 20:21:45.836" +"2019/01/21 20:21:57.636" "2019/01/21 20:21:57.836" +"2019/01/21 20:22:09.636" "2019/01/21 20:22:09.836" +"2019/01/21 20:22:21.636" "2019/01/21 20:22:21.836" +"2019/01/21 20:22:33.636" "2019/01/21 20:22:33.836" +"2019/01/21 20:22:45.636" "2019/01/21 20:22:45.836" +"2019/01/21 20:22:57.636" "2019/01/21 20:22:57.836" +"2019/01/21 20:23:09.636" "2019/01/21 20:23:09.836" +"2019/01/21 20:23:21.636" "2019/01/21 20:23:21.836" +"2019/01/21 20:27:52.727" "2019/01/21 20:27:52.927" +"2019/01/21 20:28:04.727" "2019/01/21 20:28:04.927" +"2019/01/21 20:28:16.727" "2019/01/21 20:28:16.927" +"2019/01/21 20:28:28.727" "2019/01/21 20:28:28.927" +"2019/01/21 20:28:40.727" "2019/01/21 20:28:40.927" +"2019/01/21 20:28:52.727" "2019/01/21 20:28:52.927" +"2019/01/21 20:29:04.727" "2019/01/21 20:29:04.927" +"2019/01/21 20:29:16.727" "2019/01/21 20:29:16.927" +"2019/01/21 20:29:28.727" "2019/01/21 20:29:28.927" +"2019/01/21 20:29:40.727" "2019/01/21 20:29:40.927" +"2019/01/21 20:29:52.727" "2019/01/21 20:29:52.927" +"2019/01/21 20:30:04.727" "2019/01/21 20:30:04.927" +"2019/01/21 20:30:16.727" "2019/01/21 20:30:16.927" +"2019/01/21 20:30:54.182" "2019/01/21 20:30:54.382" +"2019/01/21 20:31:06.182" "2019/01/21 20:31:06.382" +"2019/01/21 20:31:18.182" "2019/01/21 20:31:18.382" +"2019/01/21 20:31:30.182" "2019/01/21 20:31:30.382" +"2019/01/21 20:31:42.182" "2019/01/21 20:31:42.382" +"2019/01/21 20:31:54.182" "2019/01/21 20:31:54.382" +"2019/01/21 20:32:06.182" "2019/01/21 20:32:06.382" +"2019/01/21 20:32:18.182" "2019/01/21 20:32:18.382" +"2019/01/21 20:32:30.182" "2019/01/21 20:32:30.382" +"2019/01/21 20:32:42.182" "2019/01/21 20:32:42.382" +"2019/01/21 20:32:54.182" "2019/01/21 20:32:54.382" +"2019/01/21 20:33:06.182" "2019/01/21 20:33:06.382" +"2019/01/21 20:33:18.182" "2019/01/21 20:33:18.382" +"2019/01/21 20:37:49.273" "2019/01/21 20:37:49.473" +"2019/01/21 20:38:01.273" "2019/01/21 20:38:01.473" +"2019/01/21 20:38:13.273" "2019/01/21 20:38:13.473" +"2019/01/21 20:38:25.273" "2019/01/21 20:38:25.473" +"2019/01/21 20:38:37.273" "2019/01/21 20:38:37.473" +"2019/01/21 20:38:49.273" "2019/01/21 20:38:49.473" +"2019/01/21 20:39:01.273" "2019/01/21 20:39:01.473" +"2019/01/21 20:39:13.273" "2019/01/21 20:39:13.473" +"2019/01/21 20:39:25.273" "2019/01/21 20:39:25.473" +"2019/01/21 20:39:37.273" "2019/01/21 20:39:37.473" +"2019/01/21 20:39:49.273" "2019/01/21 20:39:49.473" +"2019/01/21 20:40:01.273" "2019/01/21 20:40:01.473" +"2019/01/21 20:40:13.273" "2019/01/21 20:40:13.473" +"2019/01/21 20:40:50.727" "2019/01/21 20:40:50.927" +"2019/01/21 20:41:02.727" "2019/01/21 20:41:02.927" +"2019/01/21 20:41:14.727" "2019/01/21 20:41:14.927" +"2019/01/21 20:41:26.727" "2019/01/21 20:41:26.927" +"2019/01/21 20:41:38.727" "2019/01/21 20:41:38.927" +"2019/01/21 20:41:50.727" "2019/01/21 20:41:50.927" +"2019/01/21 20:42:02.727" "2019/01/21 20:42:02.927" +"2019/01/21 20:42:14.727" "2019/01/21 20:42:14.927" +"2019/01/21 20:42:26.727" "2019/01/21 20:42:26.927" +"2019/01/21 20:42:38.727" "2019/01/21 20:42:38.927" +"2019/01/21 20:42:50.727" "2019/01/21 20:42:50.927" +"2019/01/21 20:43:02.727" "2019/01/21 20:43:02.927" +"2019/01/21 20:43:14.727" "2019/01/21 20:43:14.927" +"2019/01/21 20:47:46.818" "2019/01/21 20:47:47.018" +"2019/01/21 20:47:58.818" "2019/01/21 20:47:59.018" +"2019/01/21 20:48:10.818" "2019/01/21 20:48:11.018" +"2019/01/21 20:48:22.818" "2019/01/21 20:48:23.018" +"2019/01/21 20:48:34.818" "2019/01/21 20:48:35.018" +"2019/01/21 20:48:46.818" "2019/01/21 20:48:47.018" +"2019/01/21 20:48:58.818" "2019/01/21 20:48:59.018" +"2019/01/21 20:49:10.818" "2019/01/21 20:49:11.018" +"2019/01/21 20:49:22.818" "2019/01/21 20:49:23.018" +"2019/01/21 20:49:34.818" "2019/01/21 20:49:35.018" +"2019/01/21 20:49:46.818" "2019/01/21 20:49:47.018" +"2019/01/21 20:49:58.818" "2019/01/21 20:49:59.018" +"2019/01/21 20:50:10.818" "2019/01/21 20:50:11.018" +"2019/01/21 20:50:48.273" "2019/01/21 20:50:48.473" +"2019/01/21 20:51:00.273" "2019/01/21 20:51:00.473" +"2019/01/21 20:51:12.273" "2019/01/21 20:51:12.473" +"2019/01/21 20:51:24.273" "2019/01/21 20:51:24.473" +"2019/01/21 20:51:36.273" "2019/01/21 20:51:36.473" +"2019/01/21 20:51:48.273" "2019/01/21 20:51:48.473" +"2019/01/21 20:52:00.273" "2019/01/21 20:52:00.473" +"2019/01/21 20:52:12.273" "2019/01/21 20:52:12.473" +"2019/01/21 20:52:24.273" "2019/01/21 20:52:24.473" +"2019/01/21 20:52:36.273" "2019/01/21 20:52:36.473" +"2019/01/21 20:52:48.273" "2019/01/21 20:52:48.473" +"2019/01/21 20:53:00.273" "2019/01/21 20:53:00.473" +"2019/01/21 20:53:12.273" "2019/01/21 20:53:12.473" +"2019/01/21 20:57:44.364" "2019/01/21 20:57:44.564" +"2019/01/21 20:57:56.364" "2019/01/21 20:57:56.564" +"2019/01/21 20:58:08.364" "2019/01/21 20:58:08.564" +"2019/01/21 20:58:20.364" "2019/01/21 20:58:20.564" +"2019/01/21 20:58:32.364" "2019/01/21 20:58:32.564" +"2019/01/21 20:58:44.364" "2019/01/21 20:58:44.564" +"2019/01/21 20:58:56.364" "2019/01/21 20:58:56.564" +"2019/01/21 20:59:08.364" "2019/01/21 20:59:08.564" +"2019/01/21 20:59:20.364" "2019/01/21 20:59:20.564" +"2019/01/21 20:59:32.364" "2019/01/21 20:59:32.564" +"2019/01/21 20:59:44.364" "2019/01/21 20:59:44.564" +"2019/01/21 20:59:56.364" "2019/01/21 20:59:56.564" +"2019/01/21 21:00:08.364" "2019/01/21 21:00:08.564" +"2019/01/21 21:00:46.818" "2019/01/21 21:00:47.018" +"2019/01/21 21:00:58.818" "2019/01/21 21:00:59.018" +"2019/01/21 21:01:10.818" "2019/01/21 21:01:11.018" +"2019/01/21 21:01:22.818" "2019/01/21 21:01:23.018" +"2019/01/21 21:01:34.818" "2019/01/21 21:01:35.018" +"2019/01/21 21:01:46.818" "2019/01/21 21:01:47.018" +"2019/01/21 21:01:58.818" "2019/01/21 21:01:59.018" +"2019/01/21 21:02:10.818" "2019/01/21 21:02:11.018" +"2019/01/21 21:02:22.818" "2019/01/21 21:02:23.018" +"2019/01/21 21:02:34.818" "2019/01/21 21:02:35.018" +"2019/01/21 21:02:46.818" "2019/01/21 21:02:47.018" +"2019/01/21 21:02:58.818" "2019/01/21 21:02:59.018" +"2019/01/21 21:03:10.818" "2019/01/21 21:03:11.018" +"2019/01/21 21:07:42.909" "2019/01/21 21:07:43.109" +"2019/01/21 21:07:54.909" "2019/01/21 21:07:55.109" +"2019/01/21 21:08:06.909" "2019/01/21 21:08:07.109" +"2019/01/21 21:08:18.909" "2019/01/21 21:08:19.109" +"2019/01/21 21:08:30.909" "2019/01/21 21:08:31.109" +"2019/01/21 21:08:42.909" "2019/01/21 21:08:43.109" +"2019/01/21 21:08:54.909" "2019/01/21 21:08:55.109" +"2019/01/21 21:09:06.909" "2019/01/21 21:09:07.109" +"2019/01/21 21:09:18.909" "2019/01/21 21:09:19.109" +"2019/01/21 21:09:30.909" "2019/01/21 21:09:31.109" +"2019/01/21 21:09:42.909" "2019/01/21 21:09:43.109" +"2019/01/21 21:09:54.909" "2019/01/21 21:09:55.109" +"2019/01/21 21:10:06.909" "2019/01/21 21:10:07.109" +"2019/01/21 21:10:45.364" "2019/01/21 21:10:45.564" +"2019/01/21 21:10:57.364" "2019/01/21 21:10:57.564" +"2019/01/21 21:11:09.364" "2019/01/21 21:11:09.564" +"2019/01/21 21:11:21.364" "2019/01/21 21:11:21.564" +"2019/01/21 21:11:33.364" "2019/01/21 21:11:33.564" +"2019/01/21 21:11:45.364" "2019/01/21 21:11:45.564" +"2019/01/21 21:11:57.364" "2019/01/21 21:11:57.564" +"2019/01/21 21:12:09.364" "2019/01/21 21:12:09.564" +"2019/01/21 21:12:21.364" "2019/01/21 21:12:21.564" +"2019/01/21 21:12:33.364" "2019/01/21 21:12:33.564" +"2019/01/21 21:12:45.364" "2019/01/21 21:12:45.564" +"2019/01/21 21:12:57.364" "2019/01/21 21:12:57.564" +"2019/01/21 21:13:09.364" "2019/01/21 21:13:09.564" +"2019/01/21 21:17:41.455" "2019/01/21 21:17:41.655" +"2019/01/21 21:17:53.455" "2019/01/21 21:17:53.655" +"2019/01/21 21:18:05.455" "2019/01/21 21:18:05.655" +"2019/01/21 21:18:17.455" "2019/01/21 21:18:17.655" +"2019/01/21 21:18:29.455" "2019/01/21 21:18:29.655" +"2019/01/21 21:18:41.455" "2019/01/21 21:18:41.655" +"2019/01/21 21:18:53.455" "2019/01/21 21:18:53.655" +"2019/01/21 21:19:05.455" "2019/01/21 21:19:05.655" +"2019/01/21 21:19:17.455" "2019/01/21 21:19:17.655" +"2019/01/21 21:19:29.455" "2019/01/21 21:19:29.655" +"2019/01/21 21:19:41.455" "2019/01/21 21:19:41.655" +"2019/01/21 21:19:53.455" "2019/01/21 21:19:53.655" +"2019/01/21 21:20:05.455" "2019/01/21 21:20:05.655" +"2019/01/21 21:20:43.909" "2019/01/21 21:20:44.109" +"2019/01/21 21:20:55.909" "2019/01/21 21:20:56.109" +"2019/01/21 21:21:07.909" "2019/01/21 21:21:08.109" +"2019/01/21 21:21:19.909" "2019/01/21 21:21:20.109" +"2019/01/21 21:21:31.909" "2019/01/21 21:21:32.109" +"2019/01/21 21:21:43.909" "2019/01/21 21:21:44.109" +"2019/01/21 21:21:55.909" "2019/01/21 21:21:56.109" +"2019/01/21 21:22:07.909" "2019/01/21 21:22:08.109" +"2019/01/21 21:22:19.909" "2019/01/21 21:22:20.109" +"2019/01/21 21:22:31.909" "2019/01/21 21:22:32.109" +"2019/01/21 21:22:43.909" "2019/01/21 21:22:44.109" +"2019/01/21 21:22:55.909" "2019/01/21 21:22:56.109" +"2019/01/21 21:23:07.909" "2019/01/21 21:23:08.109" +"2019/01/21 21:27:40.000" "2019/01/21 21:27:40.200" +"2019/01/21 21:27:52.000" "2019/01/21 21:27:52.200" +"2019/01/21 21:28:04.000" "2019/01/21 21:28:04.200" +"2019/01/21 21:28:16.000" "2019/01/21 21:28:16.200" +"2019/01/21 21:28:28.000" "2019/01/21 21:28:28.200" +"2019/01/21 21:28:40.000" "2019/01/21 21:28:40.200" +"2019/01/21 21:28:52.000" "2019/01/21 21:28:52.200" +"2019/01/21 21:29:04.000" "2019/01/21 21:29:04.200" +"2019/01/21 21:29:16.000" "2019/01/21 21:29:16.200" +"2019/01/21 21:29:28.000" "2019/01/21 21:29:28.200" +"2019/01/21 21:29:40.000" "2019/01/21 21:29:40.200" +"2019/01/21 21:29:52.000" "2019/01/21 21:29:52.200" +"2019/01/21 21:30:04.000" "2019/01/21 21:30:04.200" +"2019/01/21 21:30:42.455" "2019/01/21 21:30:42.655" +"2019/01/21 21:30:54.455" "2019/01/21 21:30:54.655" +"2019/01/21 21:31:06.455" "2019/01/21 21:31:06.655" +"2019/01/21 21:31:18.455" "2019/01/21 21:31:18.655" +"2019/01/21 21:31:30.455" "2019/01/21 21:31:30.655" +"2019/01/21 21:31:42.455" "2019/01/21 21:31:42.655" +"2019/01/21 21:31:54.455" "2019/01/21 21:31:54.655" +"2019/01/21 21:32:06.455" "2019/01/21 21:32:06.655" +"2019/01/21 21:32:18.455" "2019/01/21 21:32:18.655" +"2019/01/21 21:32:30.455" "2019/01/21 21:32:30.655" +"2019/01/21 21:32:42.455" "2019/01/21 21:32:42.655" +"2019/01/21 21:32:54.455" "2019/01/21 21:32:54.655" +"2019/01/21 21:33:06.455" "2019/01/21 21:33:06.655" +"2019/01/21 21:37:38.545" "2019/01/21 21:37:38.745" +"2019/01/21 21:37:50.545" "2019/01/21 21:37:50.745" +"2019/01/21 21:38:02.545" "2019/01/21 21:38:02.745" +"2019/01/21 21:38:14.545" "2019/01/21 21:38:14.745" +"2019/01/21 21:38:26.545" "2019/01/21 21:38:26.745" +"2019/01/21 21:38:38.545" "2019/01/21 21:38:38.745" +"2019/01/21 21:38:50.545" "2019/01/21 21:38:50.745" +"2019/01/21 21:39:02.545" "2019/01/21 21:39:02.745" +"2019/01/21 21:39:14.545" "2019/01/21 21:39:14.745" +"2019/01/21 21:39:26.545" "2019/01/21 21:39:26.745" +"2019/01/21 21:39:38.545" "2019/01/21 21:39:38.745" +"2019/01/21 21:39:50.545" "2019/01/21 21:39:50.745" +"2019/01/21 21:40:02.545" "2019/01/21 21:40:02.745" +"2019/01/21 21:40:41.000" "2019/01/21 21:40:41.200" +"2019/01/21 21:40:53.000" "2019/01/21 21:40:53.200" +"2019/01/21 21:41:05.000" "2019/01/21 21:41:05.200" +"2019/01/21 21:41:17.000" "2019/01/21 21:41:17.200" +"2019/01/21 21:41:29.000" "2019/01/21 21:41:29.200" +"2019/01/21 21:41:41.000" "2019/01/21 21:41:41.200" +"2019/01/21 21:41:53.000" "2019/01/21 21:41:53.200" +"2019/01/21 21:42:05.000" "2019/01/21 21:42:05.200" +"2019/01/21 21:42:17.000" "2019/01/21 21:42:17.200" +"2019/01/21 21:42:29.000" "2019/01/21 21:42:29.200" +"2019/01/21 21:42:41.000" "2019/01/21 21:42:41.200" +"2019/01/21 21:42:53.000" "2019/01/21 21:42:53.200" +"2019/01/21 21:43:05.000" "2019/01/21 21:43:05.200" +"2019/01/21 21:47:37.091" "2019/01/21 21:47:37.291" +"2019/01/21 21:47:49.091" "2019/01/21 21:47:49.291" +"2019/01/21 21:48:01.091" "2019/01/21 21:48:01.291" +"2019/01/21 21:48:13.091" "2019/01/21 21:48:13.291" +"2019/01/21 21:48:25.091" "2019/01/21 21:48:25.291" +"2019/01/21 21:48:37.091" "2019/01/21 21:48:37.291" +"2019/01/21 21:48:49.091" "2019/01/21 21:48:49.291" +"2019/01/21 21:49:01.091" "2019/01/21 21:49:01.291" +"2019/01/21 21:49:13.091" "2019/01/21 21:49:13.291" +"2019/01/21 21:49:25.091" "2019/01/21 21:49:25.291" +"2019/01/21 21:49:37.091" "2019/01/21 21:49:37.291" +"2019/01/21 21:49:49.091" "2019/01/21 21:49:49.291" +"2019/01/21 21:50:01.091" "2019/01/21 21:50:01.291" +"2019/01/21 21:50:39.545" "2019/01/21 21:50:39.745" +"2019/01/21 21:50:51.545" "2019/01/21 21:50:51.745" +"2019/01/21 21:51:03.545" "2019/01/21 21:51:03.745" +"2019/01/21 21:51:15.545" "2019/01/21 21:51:15.745" +"2019/01/21 21:51:27.545" "2019/01/21 21:51:27.745" +"2019/01/21 21:51:39.545" "2019/01/21 21:51:39.745" +"2019/01/21 21:51:51.545" "2019/01/21 21:51:51.745" +"2019/01/21 21:52:03.545" "2019/01/21 21:52:03.745" +"2019/01/21 21:52:15.545" "2019/01/21 21:52:15.745" +"2019/01/21 21:52:27.545" "2019/01/21 21:52:27.745" +"2019/01/21 21:52:39.545" "2019/01/21 21:52:39.745" +"2019/01/21 21:52:51.545" "2019/01/21 21:52:51.745" +"2019/01/21 21:53:03.545" "2019/01/21 21:53:03.745" +"2019/01/21 21:57:35.636" "2019/01/21 21:57:35.836" +"2019/01/21 21:57:47.636" "2019/01/21 21:57:47.836" +"2019/01/21 21:57:59.636" "2019/01/21 21:57:59.836" +"2019/01/21 21:58:11.636" "2019/01/21 21:58:11.836" +"2019/01/21 21:58:23.636" "2019/01/21 21:58:23.836" +"2019/01/21 21:58:35.636" "2019/01/21 21:58:35.836" +"2019/01/21 21:58:47.636" "2019/01/21 21:58:47.836" +"2019/01/21 21:58:59.636" "2019/01/21 21:58:59.836" +"2019/01/21 21:59:11.636" "2019/01/21 21:59:11.836" +"2019/01/21 21:59:23.636" "2019/01/21 21:59:23.836" +"2019/01/21 21:59:35.636" "2019/01/21 21:59:35.836" +"2019/01/21 21:59:47.636" "2019/01/21 21:59:47.836" +"2019/01/21 21:59:59.636" "2019/01/21 21:59:59.836" +"2019/01/21 22:00:38.091" "2019/01/21 22:00:38.291" +"2019/01/21 22:00:50.091" "2019/01/21 22:00:50.291" +"2019/01/21 22:01:02.091" "2019/01/21 22:01:02.291" +"2019/01/21 22:01:14.091" "2019/01/21 22:01:14.291" +"2019/01/21 22:01:26.091" "2019/01/21 22:01:26.291" +"2019/01/21 22:01:38.091" "2019/01/21 22:01:38.291" +"2019/01/21 22:01:50.091" "2019/01/21 22:01:50.291" +"2019/01/21 22:02:02.091" "2019/01/21 22:02:02.291" +"2019/01/21 22:02:14.091" "2019/01/21 22:02:14.291" +"2019/01/21 22:02:26.091" "2019/01/21 22:02:26.291" +"2019/01/21 22:02:38.091" "2019/01/21 22:02:38.291" +"2019/01/21 22:02:50.091" "2019/01/21 22:02:50.291" +"2019/01/21 22:03:02.091" "2019/01/21 22:03:02.291" +"2019/01/21 22:07:34.182" "2019/01/21 22:07:34.382" +"2019/01/21 22:07:46.182" "2019/01/21 22:07:46.382" +"2019/01/21 22:07:58.182" "2019/01/21 22:07:58.382" +"2019/01/21 22:08:10.182" "2019/01/21 22:08:10.382" +"2019/01/21 22:08:22.182" "2019/01/21 22:08:22.382" +"2019/01/21 22:08:34.182" "2019/01/21 22:08:34.382" +"2019/01/21 22:08:46.182" "2019/01/21 22:08:46.382" +"2019/01/21 22:08:58.182" "2019/01/21 22:08:58.382" +"2019/01/21 22:09:10.182" "2019/01/21 22:09:10.382" +"2019/01/21 22:09:22.182" "2019/01/21 22:09:22.382" +"2019/01/21 22:09:34.182" "2019/01/21 22:09:34.382" +"2019/01/21 22:09:46.182" "2019/01/21 22:09:46.382" +"2019/01/21 22:09:58.182" "2019/01/21 22:09:58.382" +"2019/01/21 22:10:36.636" "2019/01/21 22:10:36.836" +"2019/01/21 22:10:48.636" "2019/01/21 22:10:48.836" +"2019/01/21 22:11:00.636" "2019/01/21 22:11:00.836" +"2019/01/21 22:11:12.636" "2019/01/21 22:11:12.836" +"2019/01/21 22:11:24.636" "2019/01/21 22:11:24.836" +"2019/01/21 22:11:36.636" "2019/01/21 22:11:36.836" +"2019/01/21 22:11:48.636" "2019/01/21 22:11:48.836" +"2019/01/21 22:12:00.636" "2019/01/21 22:12:00.836" +"2019/01/21 22:12:12.636" "2019/01/21 22:12:12.836" +"2019/01/21 22:12:24.636" "2019/01/21 22:12:24.836" +"2019/01/21 22:12:36.636" "2019/01/21 22:12:36.836" +"2019/01/21 22:12:48.636" "2019/01/21 22:12:48.836" +"2019/01/21 22:13:00.636" "2019/01/21 22:13:00.836" +"2019/01/21 22:17:32.727" "2019/01/21 22:17:32.927" +"2019/01/21 22:17:44.727" "2019/01/21 22:17:44.927" +"2019/01/21 22:17:56.727" "2019/01/21 22:17:56.927" +"2019/01/21 22:18:08.727" "2019/01/21 22:18:08.927" +"2019/01/21 22:18:20.727" "2019/01/21 22:18:20.927" +"2019/01/21 22:18:32.727" "2019/01/21 22:18:32.927" +"2019/01/21 22:18:44.727" "2019/01/21 22:18:44.927" +"2019/01/21 22:18:56.727" "2019/01/21 22:18:56.927" +"2019/01/21 22:19:08.727" "2019/01/21 22:19:08.927" +"2019/01/21 22:19:20.727" "2019/01/21 22:19:20.927" +"2019/01/21 22:19:32.727" "2019/01/21 22:19:32.927" +"2019/01/21 22:19:44.727" "2019/01/21 22:19:44.927" +"2019/01/21 22:19:56.727" "2019/01/21 22:19:56.927" +"2019/01/21 22:20:35.182" "2019/01/21 22:20:35.382" +"2019/01/21 22:20:47.182" "2019/01/21 22:20:47.382" +"2019/01/21 22:20:59.182" "2019/01/21 22:20:59.382" +"2019/01/21 22:21:11.182" "2019/01/21 22:21:11.382" +"2019/01/21 22:21:23.182" "2019/01/21 22:21:23.382" +"2019/01/21 22:21:35.182" "2019/01/21 22:21:35.382" +"2019/01/21 22:21:47.182" "2019/01/21 22:21:47.382" +"2019/01/21 22:21:59.182" "2019/01/21 22:21:59.382" +"2019/01/21 22:22:11.182" "2019/01/21 22:22:11.382" +"2019/01/21 22:22:23.182" "2019/01/21 22:22:23.382" +"2019/01/21 22:22:35.182" "2019/01/21 22:22:35.382" +"2019/01/21 22:22:47.182" "2019/01/21 22:22:47.382" +"2019/01/21 22:22:59.182" "2019/01/21 22:22:59.382" +"2019/01/21 22:27:31.273" "2019/01/21 22:27:31.473" +"2019/01/21 22:27:43.273" "2019/01/21 22:27:43.473" +"2019/01/21 22:27:55.273" "2019/01/21 22:27:55.473" +"2019/01/21 22:28:07.273" "2019/01/21 22:28:07.473" +"2019/01/21 22:28:19.273" "2019/01/21 22:28:19.473" +"2019/01/21 22:28:31.273" "2019/01/21 22:28:31.473" +"2019/01/21 22:28:43.273" "2019/01/21 22:28:43.473" +"2019/01/21 22:28:55.273" "2019/01/21 22:28:55.473" +"2019/01/21 22:29:07.273" "2019/01/21 22:29:07.473" +"2019/01/21 22:29:19.273" "2019/01/21 22:29:19.473" +"2019/01/21 22:29:31.273" "2019/01/21 22:29:31.473" +"2019/01/21 22:29:43.273" "2019/01/21 22:29:43.473" +"2019/01/21 22:29:55.273" "2019/01/21 22:29:55.473" +"2019/01/21 22:30:33.727" "2019/01/21 22:30:33.927" +"2019/01/21 22:30:45.727" "2019/01/21 22:30:45.927" +"2019/01/21 22:30:57.727" "2019/01/21 22:30:57.927" +"2019/01/21 22:31:09.727" "2019/01/21 22:31:09.927" +"2019/01/21 22:31:21.727" "2019/01/21 22:31:21.927" +"2019/01/21 22:31:33.727" "2019/01/21 22:31:33.927" +"2019/01/21 22:31:45.727" "2019/01/21 22:31:45.927" +"2019/01/21 22:31:57.727" "2019/01/21 22:31:57.927" +"2019/01/21 22:32:09.727" "2019/01/21 22:32:09.927" +"2019/01/21 22:32:21.727" "2019/01/21 22:32:21.927" +"2019/01/21 22:32:33.727" "2019/01/21 22:32:33.927" +"2019/01/21 22:32:45.727" "2019/01/21 22:32:45.927" +"2019/01/21 22:32:57.727" "2019/01/21 22:32:57.927" +"2019/01/21 22:37:29.818" "2019/01/21 22:37:30.018" +"2019/01/21 22:37:41.818" "2019/01/21 22:37:42.018" +"2019/01/21 22:37:53.818" "2019/01/21 22:37:54.018" +"2019/01/21 22:38:05.818" "2019/01/21 22:38:06.018" +"2019/01/21 22:38:17.818" "2019/01/21 22:38:18.018" +"2019/01/21 22:38:29.818" "2019/01/21 22:38:30.018" +"2019/01/21 22:38:41.818" "2019/01/21 22:38:42.018" +"2019/01/21 22:38:53.818" "2019/01/21 22:38:54.018" +"2019/01/21 22:39:05.818" "2019/01/21 22:39:06.018" +"2019/01/21 22:39:17.818" "2019/01/21 22:39:18.018" +"2019/01/21 22:39:29.818" "2019/01/21 22:39:30.018" +"2019/01/21 22:39:41.818" "2019/01/21 22:39:42.018" +"2019/01/21 22:39:53.818" "2019/01/21 22:39:54.018" +"2019/01/21 22:40:32.273" "2019/01/21 22:40:32.473" +"2019/01/21 22:40:44.273" "2019/01/21 22:40:44.473" +"2019/01/21 22:40:56.273" "2019/01/21 22:40:56.473" +"2019/01/21 22:41:08.273" "2019/01/21 22:41:08.473" +"2019/01/21 22:41:20.273" "2019/01/21 22:41:20.473" +"2019/01/21 22:41:32.273" "2019/01/21 22:41:32.473" +"2019/01/21 22:41:44.273" "2019/01/21 22:41:44.473" +"2019/01/21 22:41:56.273" "2019/01/21 22:41:56.473" +"2019/01/21 22:42:08.273" "2019/01/21 22:42:08.473" +"2019/01/21 22:42:20.273" "2019/01/21 22:42:20.473" +"2019/01/21 22:42:32.273" "2019/01/21 22:42:32.473" +"2019/01/21 22:42:44.273" "2019/01/21 22:42:44.473" +"2019/01/21 22:42:56.273" "2019/01/21 22:42:56.473" +"2019/01/21 22:47:29.364" "2019/01/21 22:47:29.564" +"2019/01/21 22:47:41.364" "2019/01/21 22:47:41.564" +"2019/01/21 22:47:53.364" "2019/01/21 22:47:53.564" +"2019/01/21 22:48:05.364" "2019/01/21 22:48:05.564" +"2019/01/21 22:48:17.364" "2019/01/21 22:48:17.564" +"2019/01/21 22:48:29.364" "2019/01/21 22:48:29.564" +"2019/01/21 22:48:41.364" "2019/01/21 22:48:41.564" +"2019/01/21 22:48:53.364" "2019/01/21 22:48:53.564" +"2019/01/21 22:49:05.364" "2019/01/21 22:49:05.564" +"2019/01/21 22:49:17.364" "2019/01/21 22:49:17.564" +"2019/01/21 22:49:29.364" "2019/01/21 22:49:29.564" +"2019/01/21 22:49:41.364" "2019/01/21 22:49:41.564" +"2019/01/21 22:49:53.364" "2019/01/21 22:49:53.564" +"2019/01/21 22:50:31.818" "2019/01/21 22:50:32.018" +"2019/01/21 22:50:43.818" "2019/01/21 22:50:44.018" +"2019/01/21 22:50:55.818" "2019/01/21 22:50:56.018" +"2019/01/21 22:51:07.818" "2019/01/21 22:51:08.018" +"2019/01/21 22:51:19.818" "2019/01/21 22:51:20.018" +"2019/01/21 22:51:31.818" "2019/01/21 22:51:32.018" +"2019/01/21 22:51:43.818" "2019/01/21 22:51:44.018" +"2019/01/21 22:51:55.818" "2019/01/21 22:51:56.018" +"2019/01/21 22:52:07.818" "2019/01/21 22:52:08.018" +"2019/01/21 22:52:19.818" "2019/01/21 22:52:20.018" +"2019/01/21 22:52:31.818" "2019/01/21 22:52:32.018" +"2019/01/21 22:52:43.818" "2019/01/21 22:52:44.018" +"2019/01/21 22:52:55.818" "2019/01/21 22:52:56.018" +"2019/01/21 22:57:28.909" "2019/01/21 22:57:29.109" +"2019/01/21 22:57:40.909" "2019/01/21 22:57:41.109" +"2019/01/21 22:57:52.909" "2019/01/21 22:57:53.109" +"2019/01/21 22:58:04.909" "2019/01/21 22:58:05.109" +"2019/01/21 22:58:16.909" "2019/01/21 22:58:17.109" +"2019/01/21 22:58:28.909" "2019/01/21 22:58:29.109" +"2019/01/21 22:58:40.909" "2019/01/21 22:58:41.109" +"2019/01/21 22:58:52.909" "2019/01/21 22:58:53.109" +"2019/01/21 22:59:04.909" "2019/01/21 22:59:05.109" +"2019/01/21 22:59:16.909" "2019/01/21 22:59:17.109" +"2019/01/21 22:59:28.909" "2019/01/21 22:59:29.109" +"2019/01/21 22:59:40.909" "2019/01/21 22:59:41.109" +"2019/01/21 22:59:52.909" "2019/01/21 22:59:53.109" +"2019/01/21 23:00:31.364" "2019/01/21 23:00:31.564" +"2019/01/21 23:00:43.364" "2019/01/21 23:00:43.564" +"2019/01/21 23:00:55.364" "2019/01/21 23:00:55.564" +"2019/01/21 23:01:07.364" "2019/01/21 23:01:07.564" +"2019/01/21 23:01:19.364" "2019/01/21 23:01:19.564" +"2019/01/21 23:01:31.364" "2019/01/21 23:01:31.564" +"2019/01/21 23:01:43.364" "2019/01/21 23:01:43.564" +"2019/01/21 23:01:55.364" "2019/01/21 23:01:55.564" +"2019/01/21 23:02:07.364" "2019/01/21 23:02:07.564" +"2019/01/21 23:02:19.364" "2019/01/21 23:02:19.564" +"2019/01/21 23:02:31.364" "2019/01/21 23:02:31.564" +"2019/01/21 23:02:43.364" "2019/01/21 23:02:43.564" +"2019/01/21 23:02:55.364" "2019/01/21 23:02:55.564" +"2019/01/21 23:07:28.455" "2019/01/21 23:07:28.655" +"2019/01/21 23:07:40.455" "2019/01/21 23:07:40.655" +"2019/01/21 23:07:52.455" "2019/01/21 23:07:52.655" +"2019/01/21 23:08:04.455" "2019/01/21 23:08:04.655" +"2019/01/21 23:08:16.455" "2019/01/21 23:08:16.655" +"2019/01/21 23:08:28.455" "2019/01/21 23:08:28.655" +"2019/01/21 23:08:40.455" "2019/01/21 23:08:40.655" +"2019/01/21 23:08:52.455" "2019/01/21 23:08:52.655" +"2019/01/21 23:09:04.455" "2019/01/21 23:09:04.655" +"2019/01/21 23:09:16.455" "2019/01/21 23:09:16.655" +"2019/01/21 23:09:28.455" "2019/01/21 23:09:28.655" +"2019/01/21 23:09:40.455" "2019/01/21 23:09:40.655" +"2019/01/21 23:09:52.455" "2019/01/21 23:09:52.655" +"2019/01/21 23:10:30.909" "2019/01/21 23:10:31.109" +"2019/01/21 23:10:42.909" "2019/01/21 23:10:43.109" +"2019/01/21 23:10:54.909" "2019/01/21 23:10:55.109" +"2019/01/21 23:11:06.909" "2019/01/21 23:11:07.109" +"2019/01/21 23:11:18.909" "2019/01/21 23:11:19.109" +"2019/01/21 23:11:30.909" "2019/01/21 23:11:31.109" +"2019/01/21 23:11:42.909" "2019/01/21 23:11:43.109" +"2019/01/21 23:11:54.909" "2019/01/21 23:11:55.109" +"2019/01/21 23:12:06.909" "2019/01/21 23:12:07.109" +"2019/01/21 23:12:18.909" "2019/01/21 23:12:19.109" +"2019/01/21 23:12:30.909" "2019/01/21 23:12:31.109" +"2019/01/21 23:12:42.909" "2019/01/21 23:12:43.109" +"2019/01/21 23:12:54.909" "2019/01/21 23:12:55.109" +"2019/01/21 23:17:28.000" "2019/01/21 23:17:28.200" +"2019/01/21 23:17:40.000" "2019/01/21 23:17:40.200" +"2019/01/21 23:17:52.000" "2019/01/21 23:17:52.200" +"2019/01/21 23:18:04.000" "2019/01/21 23:18:04.200" +"2019/01/21 23:18:16.000" "2019/01/21 23:18:16.200" +"2019/01/21 23:18:28.000" "2019/01/21 23:18:28.200" +"2019/01/21 23:18:40.000" "2019/01/21 23:18:40.200" +"2019/01/21 23:18:52.000" "2019/01/21 23:18:52.200" +"2019/01/21 23:19:04.000" "2019/01/21 23:19:04.200" +"2019/01/21 23:19:16.000" "2019/01/21 23:19:16.200" +"2019/01/21 23:19:28.000" "2019/01/21 23:19:28.200" +"2019/01/21 23:19:40.000" "2019/01/21 23:19:40.200" +"2019/01/21 23:19:52.000" "2019/01/21 23:19:52.200" +"2019/01/21 23:20:31.455" "2019/01/21 23:20:31.655" +"2019/01/21 23:20:43.455" "2019/01/21 23:20:43.655" +"2019/01/21 23:20:55.455" "2019/01/21 23:20:55.655" +"2019/01/21 23:21:07.455" "2019/01/21 23:21:07.655" +"2019/01/21 23:21:19.455" "2019/01/21 23:21:19.655" +"2019/01/21 23:21:31.455" "2019/01/21 23:21:31.655" +"2019/01/21 23:21:43.455" "2019/01/21 23:21:43.655" +"2019/01/21 23:21:55.455" "2019/01/21 23:21:55.655" +"2019/01/21 23:22:07.455" "2019/01/21 23:22:07.655" +"2019/01/21 23:22:19.455" "2019/01/21 23:22:19.655" +"2019/01/21 23:22:31.455" "2019/01/21 23:22:31.655" +"2019/01/21 23:22:43.455" "2019/01/21 23:22:43.655" +"2019/01/21 23:22:55.455" "2019/01/21 23:22:55.655" +"2019/01/21 23:27:28.545" "2019/01/21 23:27:28.745" +"2019/01/21 23:27:40.545" "2019/01/21 23:27:40.745" +"2019/01/21 23:27:52.545" "2019/01/21 23:27:52.745" +"2019/01/21 23:28:04.545" "2019/01/21 23:28:04.745" +"2019/01/21 23:28:16.545" "2019/01/21 23:28:16.745" +"2019/01/21 23:28:28.545" "2019/01/21 23:28:28.745" +"2019/01/21 23:28:40.545" "2019/01/21 23:28:40.745" +"2019/01/21 23:28:52.545" "2019/01/21 23:28:52.745" +"2019/01/21 23:29:04.545" "2019/01/21 23:29:04.745" +"2019/01/21 23:29:16.545" "2019/01/21 23:29:16.745" +"2019/01/21 23:29:28.545" "2019/01/21 23:29:28.745" +"2019/01/21 23:29:40.545" "2019/01/21 23:29:40.745" +"2019/01/21 23:29:52.545" "2019/01/21 23:29:52.745" +"2019/01/21 23:30:32.000" "2019/01/21 23:30:32.200" +"2019/01/21 23:30:44.000" "2019/01/21 23:30:44.200" +"2019/01/21 23:30:56.000" "2019/01/21 23:30:56.200" +"2019/01/21 23:31:08.000" "2019/01/21 23:31:08.200" +"2019/01/21 23:31:20.000" "2019/01/21 23:31:20.200" +"2019/01/21 23:31:32.000" "2019/01/21 23:31:32.200" +"2019/01/21 23:31:44.000" "2019/01/21 23:31:44.200" +"2019/01/21 23:31:56.000" "2019/01/21 23:31:56.200" +"2019/01/21 23:32:08.000" "2019/01/21 23:32:08.200" +"2019/01/21 23:32:20.000" "2019/01/21 23:32:20.200" +"2019/01/21 23:32:32.000" "2019/01/21 23:32:32.200" +"2019/01/21 23:32:44.000" "2019/01/21 23:32:44.200" +"2019/01/21 23:32:56.000" "2019/01/21 23:32:56.200" +"2019/01/21 23:37:29.091" "2019/01/21 23:37:29.291" +"2019/01/21 23:37:41.091" "2019/01/21 23:37:41.291" +"2019/01/21 23:37:53.091" "2019/01/21 23:37:53.291" +"2019/01/21 23:38:05.091" "2019/01/21 23:38:05.291" +"2019/01/21 23:38:17.091" "2019/01/21 23:38:17.291" +"2019/01/21 23:38:29.091" "2019/01/21 23:38:29.291" +"2019/01/21 23:38:41.091" "2019/01/21 23:38:41.291" +"2019/01/21 23:38:53.091" "2019/01/21 23:38:53.291" +"2019/01/21 23:39:05.091" "2019/01/21 23:39:05.291" +"2019/01/21 23:39:17.091" "2019/01/21 23:39:17.291" +"2019/01/21 23:39:29.091" "2019/01/21 23:39:29.291" +"2019/01/21 23:39:41.091" "2019/01/21 23:39:41.291" +"2019/01/21 23:39:53.091" "2019/01/21 23:39:53.291" +"2019/01/21 23:40:32.545" "2019/01/21 23:40:32.745" +"2019/01/21 23:40:44.545" "2019/01/21 23:40:44.745" +"2019/01/21 23:40:56.545" "2019/01/21 23:40:56.745" +"2019/01/21 23:41:08.545" "2019/01/21 23:41:08.745" +"2019/01/21 23:41:20.545" "2019/01/21 23:41:20.745" +"2019/01/21 23:41:32.545" "2019/01/21 23:41:32.745" +"2019/01/21 23:41:44.545" "2019/01/21 23:41:44.745" +"2019/01/21 23:41:56.545" "2019/01/21 23:41:56.745" +"2019/01/21 23:42:08.545" "2019/01/21 23:42:08.745" +"2019/01/21 23:42:20.545" "2019/01/21 23:42:20.745" +"2019/01/21 23:42:32.545" "2019/01/21 23:42:32.745" +"2019/01/21 23:42:44.545" "2019/01/21 23:42:44.745" +"2019/01/21 23:42:56.545" "2019/01/21 23:42:56.745" +"2019/01/21 23:47:29.636" "2019/01/21 23:47:29.836" +"2019/01/21 23:47:41.636" "2019/01/21 23:47:41.836" +"2019/01/21 23:47:53.636" "2019/01/21 23:47:53.836" +"2019/01/21 23:48:05.636" "2019/01/21 23:48:05.836" +"2019/01/21 23:48:17.636" "2019/01/21 23:48:17.836" +"2019/01/21 23:48:29.636" "2019/01/21 23:48:29.836" +"2019/01/21 23:48:41.636" "2019/01/21 23:48:41.836" +"2019/01/21 23:48:53.636" "2019/01/21 23:48:53.836" +"2019/01/21 23:49:05.636" "2019/01/21 23:49:05.836" +"2019/01/21 23:49:17.636" "2019/01/21 23:49:17.836" +"2019/01/21 23:49:29.636" "2019/01/21 23:49:29.836" +"2019/01/21 23:49:41.636" "2019/01/21 23:49:41.836" +"2019/01/21 23:49:53.636" "2019/01/21 23:49:53.836" +"2019/01/21 23:50:33.091" "2019/01/21 23:50:33.291" +"2019/01/21 23:50:45.091" "2019/01/21 23:50:45.291" +"2019/01/21 23:50:57.091" "2019/01/21 23:50:57.291" +"2019/01/21 23:51:09.091" "2019/01/21 23:51:09.291" +"2019/01/21 23:51:21.091" "2019/01/21 23:51:21.291" +"2019/01/21 23:51:33.091" "2019/01/21 23:51:33.291" +"2019/01/21 23:51:45.091" "2019/01/21 23:51:45.291" +"2019/01/21 23:51:57.091" "2019/01/21 23:51:57.291" +"2019/01/21 23:52:09.091" "2019/01/21 23:52:09.291" +"2019/01/21 23:52:21.091" "2019/01/21 23:52:21.291" +"2019/01/21 23:52:33.091" "2019/01/21 23:52:33.291" +"2019/01/21 23:52:45.091" "2019/01/21 23:52:45.291" +"2019/01/21 23:52:57.091" "2019/01/21 23:52:57.291" +"2019/01/21 23:57:30.182" "2019/01/21 23:57:30.382" +"2019/01/21 23:57:42.182" "2019/01/21 23:57:42.382" +"2019/01/21 23:57:54.182" "2019/01/21 23:57:54.382" +"2019/01/21 23:58:06.182" "2019/01/21 23:58:06.382" +"2019/01/21 23:58:18.182" "2019/01/21 23:58:18.382" +"2019/01/21 23:58:30.182" "2019/01/21 23:58:30.382" +"2019/01/21 23:58:42.182" "2019/01/21 23:58:42.382" +"2019/01/21 23:58:54.182" "2019/01/21 23:58:54.382" +"2019/01/21 23:59:06.182" "2019/01/21 23:59:06.382" +"2019/01/21 23:59:18.182" "2019/01/21 23:59:18.382" +"2019/01/21 23:59:30.182" "2019/01/21 23:59:30.382" +"2019/01/21 23:59:42.182" "2019/01/21 23:59:42.382" +"2019/01/21 23:59:54.182" "2019/01/21 23:59:54.382" +"2019/01/22 00:00:33.636" "2019/01/22 00:00:33.836" +"2019/01/22 00:00:45.636" "2019/01/22 00:00:45.836" +"2019/01/22 00:00:57.636" "2019/01/22 00:00:57.836" +"2019/01/22 00:01:09.636" "2019/01/22 00:01:09.836" +"2019/01/22 00:01:21.636" "2019/01/22 00:01:21.836" +"2019/01/22 00:01:33.636" "2019/01/22 00:01:33.836" +"2019/01/22 00:01:45.636" "2019/01/22 00:01:45.836" +"2019/01/22 00:01:57.636" "2019/01/22 00:01:57.836" +"2019/01/22 00:02:09.636" "2019/01/22 00:02:09.836" +"2019/01/22 00:02:21.636" "2019/01/22 00:02:21.836" +"2019/01/22 00:02:33.636" "2019/01/22 00:02:33.836" +"2019/01/22 00:02:45.636" "2019/01/22 00:02:45.836" +"2019/01/22 00:02:57.636" "2019/01/22 00:02:57.836" +"2019/01/22 00:07:30.727" "2019/01/22 00:07:30.927" +"2019/01/22 00:07:42.727" "2019/01/22 00:07:42.927" +"2019/01/22 00:07:54.727" "2019/01/22 00:07:54.927" +"2019/01/22 00:08:06.727" "2019/01/22 00:08:06.927" +"2019/01/22 00:08:18.727" "2019/01/22 00:08:18.927" +"2019/01/22 00:08:30.727" "2019/01/22 00:08:30.927" +"2019/01/22 00:08:42.727" "2019/01/22 00:08:42.927" +"2019/01/22 00:08:54.727" "2019/01/22 00:08:54.927" +"2019/01/22 00:09:06.727" "2019/01/22 00:09:06.927" +"2019/01/22 00:09:18.727" "2019/01/22 00:09:18.927" +"2019/01/22 00:09:30.727" "2019/01/22 00:09:30.927" +"2019/01/22 00:09:42.727" "2019/01/22 00:09:42.927" +"2019/01/22 00:09:54.727" "2019/01/22 00:09:54.927" + +END Intervals +END IntervalList diff --git a/data/assets/scene/solarsystem/missions/osirisrex/InstrumentTimes/DetailedSurvey_EquatorialStations_Spectrometers.txt b/data/assets/scene/solarsystem/missions/osirisrex/InstrumentTimes/DetailedSurvey_EquatorialStations_Spectrometers.txt new file mode 100644 index 0000000000..8be499112b --- /dev/null +++ b/data/assets/scene/solarsystem/missions/osirisrex/InstrumentTimes/DetailedSurvey_EquatorialStations_Spectrometers.txt @@ -0,0 +1,7 @@ +"2019/01/27 10:42:00.000" "2019/01/27 15:12:00.000" +"2019/02/03 10:43:00.000" "2019/02/03 15:13:00.000" +"2019/02/10 11:05:00.000" "2019/02/10 15:35:00.000" +"2019/02/17 10:43:00.000" "2019/02/17 15:13:00.000" +"2019/02/24 10:22:00.000" "2019/02/24 14:52:00.000" +"2019/03/03 10:01:00.000" "2019/03/03 14:31:00.000" +"2019/03/10 10:01:00.000" "2019/03/10 14:31:00.000" \ No newline at end of file diff --git a/data/assets/scene/solarsystem/missions/osirisrex/InstrumentTimes/OrbitalB_Site08_PolyCamImages.txt b/data/assets/scene/solarsystem/missions/osirisrex/InstrumentTimes/OrbitalB_Site08_PolyCamImages.txt new file mode 100644 index 0000000000..1c841aeed8 --- /dev/null +++ b/data/assets/scene/solarsystem/missions/osirisrex/InstrumentTimes/OrbitalB_Site08_PolyCamImages.txt @@ -0,0 +1,173 @@ +"2019/04/16 12:03:15.000" "2019/04/16 12:03:15.800" +"2019/04/16 12:03:25.000" "2019/04/16 12:03:25.800" +"2019/04/16 12:03:35.000" "2019/04/16 12:03:35.800" +"2019/04/16 12:03:45.000" "2019/04/16 12:03:45.800" +"2019/04/16 12:03:55.000" "2019/04/16 12:03:55.800" +"2019/04/16 12:04:05.000" "2019/04/16 12:04:05.800" +"2019/04/16 12:04:15.000" "2019/04/16 12:04:15.800" +"2019/04/16 12:04:53.000" "2019/04/16 12:04:53.800" +"2019/04/16 12:05:03.000" "2019/04/16 12:05:03.800" +"2019/04/16 12:05:13.000" "2019/04/16 12:05:13.800" +"2019/04/16 12:05:23.000" "2019/04/16 12:05:23.800" +"2019/04/16 12:05:33.000" "2019/04/16 12:05:33.800" +"2019/04/16 12:05:43.000" "2019/04/16 12:05:43.800" +"2019/04/16 12:05:53.000" "2019/04/16 12:05:53.800" +"2019/04/16 12:06:03.000" "2019/04/16 12:06:03.800" +"2019/04/16 12:06:13.000" "2019/04/16 12:06:13.800" +"2019/04/16 12:06:23.000" "2019/04/16 12:06:23.800" +"2019/04/16 12:07:13.000" "2019/04/16 12:07:13.800" +"2019/04/16 12:07:23.000" "2019/04/16 12:07:23.800" +"2019/04/16 12:07:33.000" "2019/04/16 12:07:33.800" +"2019/04/16 12:07:43.000" "2019/04/16 12:07:43.800" +"2019/04/16 12:07:53.000" "2019/04/16 12:07:53.800" +"2019/04/16 12:08:03.000" "2019/04/16 12:08:03.800" +"2019/04/16 12:08:13.000" "2019/04/16 12:08:13.800" +"2019/04/16 12:08:23.000" "2019/04/16 12:08:23.800" +"2019/04/16 12:08:33.000" "2019/04/16 12:08:33.800" +"2019/04/16 12:08:43.000" "2019/04/16 12:08:43.800" +"2019/04/16 12:09:34.000" "2019/04/16 12:09:34.800" +"2019/04/16 12:09:44.000" "2019/04/16 12:09:44.800" +"2019/04/16 12:09:54.000" "2019/04/16 12:09:54.800" +"2019/04/16 12:10:04.000" "2019/04/16 12:10:04.800" +"2019/04/16 12:10:14.000" "2019/04/16 12:10:14.800" +"2019/04/16 12:10:24.000" "2019/04/16 12:10:24.800" +"2019/04/16 12:10:34.000" "2019/04/16 12:10:34.800" +"2019/04/16 12:10:44.000" "2019/04/16 12:10:44.800" +"2019/04/16 12:10:54.000" "2019/04/16 12:10:54.800" +"2019/04/16 12:11:04.000" "2019/04/16 12:11:04.800" +"2019/04/16 12:11:51.000" "2019/04/16 12:11:51.800" +"2019/04/16 12:12:01.000" "2019/04/16 12:12:01.800" +"2019/04/16 12:12:11.000" "2019/04/16 12:12:11.800" +"2019/04/16 12:12:21.000" "2019/04/16 12:12:21.800" +"2019/04/16 12:12:31.000" "2019/04/16 12:12:31.800" +"2019/04/16 12:12:41.000" "2019/04/16 12:12:41.800" +"2019/04/16 12:12:51.000" "2019/04/16 12:12:51.800" +"2019/04/16 12:13:01.000" "2019/04/16 12:13:01.800" +"2019/04/16 12:13:56.000" "2019/04/16 12:13:56.800" +"2019/04/16 12:14:06.000" "2019/04/16 12:14:06.800" +"2019/04/16 12:14:16.000" "2019/04/16 12:14:16.800" +"2019/04/16 12:14:26.000" "2019/04/16 12:14:26.800" +"2019/04/16 12:14:36.000" "2019/04/16 12:14:36.800" +"2019/04/16 12:14:46.000" "2019/04/16 12:14:46.800" +"2019/04/16 12:14:56.000" "2019/04/16 12:14:56.800" +"2019/04/16 12:15:06.000" "2019/04/16 12:15:06.800" +"2019/04/16 12:15:40.000" "2019/04/16 12:15:40.800" +"2019/04/16 12:15:50.000" "2019/04/16 12:15:50.800" +"2019/04/16 12:16:00.000" "2019/04/16 12:16:00.800" +"2019/04/16 12:16:10.000" "2019/04/16 12:16:10.800" +"2019/04/16 12:16:20.000" "2019/04/16 12:16:20.800" +"2019/04/16 17:49:37.000" "2019/04/16 17:49:37.800" +"2019/04/16 17:49:47.000" "2019/04/16 17:49:47.800" +"2019/04/16 17:49:57.000" "2019/04/16 17:49:57.800" +"2019/04/16 17:50:07.000" "2019/04/16 17:50:07.800" +"2019/04/16 17:50:17.000" "2019/04/16 17:50:17.800" +"2019/04/16 17:50:27.000" "2019/04/16 17:50:27.800" +"2019/04/16 17:50:37.000" "2019/04/16 17:50:37.800" +"2019/04/16 17:50:47.000" "2019/04/16 17:50:47.800" +"2019/04/16 17:50:57.000" "2019/04/16 17:50:57.800" +"2019/04/16 17:51:07.000" "2019/04/16 17:51:07.800" +"2019/04/16 17:51:17.000" "2019/04/16 17:51:17.800" +"2019/04/16 17:51:27.000" "2019/04/16 17:51:27.800" +"2019/04/16 17:51:37.000" "2019/04/16 17:51:37.800" +"2019/04/16 17:51:47.000" "2019/04/16 17:51:47.800" +"2019/04/16 17:52:48.000" "2019/04/16 17:52:48.800" +"2019/04/16 17:52:58.000" "2019/04/16 17:52:58.800" +"2019/04/16 17:53:08.000" "2019/04/16 17:53:08.800" +"2019/04/16 17:53:18.000" "2019/04/16 17:53:18.800" +"2019/04/16 17:53:28.000" "2019/04/16 17:53:28.800" +"2019/04/16 17:53:38.000" "2019/04/16 17:53:38.800" +"2019/04/16 17:53:48.000" "2019/04/16 17:53:48.800" +"2019/04/16 17:53:58.000" "2019/04/16 17:53:58.800" +"2019/04/16 17:54:08.000" "2019/04/16 17:54:08.800" +"2019/04/16 17:54:18.000" "2019/04/16 17:54:18.800" +"2019/04/16 17:54:28.000" "2019/04/16 17:54:28.800" +"2019/04/16 17:54:38.000" "2019/04/16 17:54:38.800" +"2019/04/16 17:54:48.000" "2019/04/16 17:54:48.800" +"2019/04/16 17:55:35.000" "2019/04/16 17:55:35.800" +"2019/04/16 17:55:45.000" "2019/04/16 17:55:45.800" +"2019/04/16 17:55:55.000" "2019/04/16 17:55:55.800" +"2019/04/16 17:56:05.000" "2019/04/16 17:56:05.800" +"2019/04/16 17:56:15.000" "2019/04/16 17:56:15.800" +"2019/04/16 17:56:25.000" "2019/04/16 17:56:25.800" +"2019/04/16 17:56:35.000" "2019/04/16 17:56:35.800" +"2019/04/16 17:56:45.000" "2019/04/16 17:56:45.800" +"2019/04/16 17:56:55.000" "2019/04/16 17:56:55.800" +"2019/04/16 17:57:05.000" "2019/04/16 17:57:05.800" +"2019/04/16 17:57:15.000" "2019/04/16 17:57:15.800" +"2019/04/16 17:57:25.000" "2019/04/16 17:57:25.800" +"2019/04/16 17:57:35.000" "2019/04/16 17:57:35.800" +"2019/04/16 17:57:45.000" "2019/04/16 17:57:45.800" +"2019/04/16 17:57:55.000" "2019/04/16 17:57:55.800" +"2019/04/16 17:58:05.000" "2019/04/16 17:58:05.800" +"2019/04/16 17:58:15.000" "2019/04/16 17:58:15.800" +"2019/04/16 17:58:48.000" "2019/04/16 17:58:48.800" +"2019/04/16 17:58:58.000" "2019/04/16 17:58:58.800" +"2019/04/16 17:59:08.000" "2019/04/16 17:59:08.800" +"2019/04/16 17:59:18.000" "2019/04/16 17:59:18.800" +"2019/04/16 17:59:28.000" "2019/04/16 17:59:28.800" +"2019/04/16 17:59:38.000" "2019/04/16 17:59:38.800" +"2019/04/16 17:59:48.000" "2019/04/16 17:59:48.800" +"2019/04/16 17:59:58.000" "2019/04/16 17:59:58.800" +"2019/04/16 18:00:08.000" "2019/04/16 18:00:08.800" +"2019/04/16 18:00:18.000" "2019/04/16 18:00:18.800" +"2019/04/16 18:00:28.000" "2019/04/16 18:00:28.800" +"2019/04/16 18:00:38.000" "2019/04/16 18:00:38.800" +"2019/04/16 18:01:41.000" "2019/04/16 18:01:41.800" +"2019/04/16 18:01:51.000" "2019/04/16 18:01:51.800" +"2019/04/16 18:02:01.000" "2019/04/16 18:02:01.800" +"2019/04/16 18:02:11.000" "2019/04/16 18:02:11.800" +"2019/04/16 18:02:21.000" "2019/04/16 18:02:21.800" +"2019/04/16 18:02:31.000" "2019/04/16 18:02:31.800" +"2019/04/16 18:02:41.000" "2019/04/16 18:02:41.800" +"2019/04/16 18:02:51.000" "2019/04/16 18:02:51.800" +"2019/04/16 18:03:01.000" "2019/04/16 18:03:01.800" +"2019/04/16 18:03:11.000" "2019/04/16 18:03:11.800" +"2019/04/16 18:03:21.000" "2019/04/16 18:03:21.800" +"2019/04/30 21:02:07.000" "2019/04/30 21:02:07.800" +"2019/04/30 21:02:17.000" "2019/04/30 21:02:17.800" +"2019/04/30 21:02:27.000" "2019/04/30 21:02:27.800" +"2019/04/30 21:02:37.000" "2019/04/30 21:02:37.800" +"2019/04/30 21:02:47.000" "2019/04/30 21:02:47.800" +"2019/04/30 21:02:57.000" "2019/04/30 21:02:57.800" +"2019/04/30 21:03:07.000" "2019/04/30 21:03:07.800" +"2019/04/30 21:03:17.000" "2019/04/30 21:03:17.800" +"2019/04/30 21:03:27.000" "2019/04/30 21:03:27.800" +"2019/04/30 21:03:37.000" "2019/04/30 21:03:37.800" +"2019/04/30 21:03:47.000" "2019/04/30 21:03:47.800" +"2019/04/30 21:03:57.000" "2019/04/30 21:03:57.800" +"2019/04/30 21:04:42.000" "2019/04/30 21:04:42.800" +"2019/04/30 21:04:52.000" "2019/04/30 21:04:52.800" +"2019/04/30 21:05:02.000" "2019/04/30 21:05:02.800" +"2019/04/30 21:05:12.000" "2019/04/30 21:05:12.800" +"2019/04/30 21:05:22.000" "2019/04/30 21:05:22.800" +"2019/04/30 21:05:32.000" "2019/04/30 21:05:32.800" +"2019/04/30 21:05:42.000" "2019/04/30 21:05:42.800" +"2019/04/30 21:05:52.000" "2019/04/30 21:05:52.800" +"2019/04/30 21:06:02.000" "2019/04/30 21:06:02.800" +"2019/04/30 21:06:12.000" "2019/04/30 21:06:12.800" +"2019/04/30 21:06:22.000" "2019/04/30 21:06:22.800" +"2019/04/30 21:06:32.000" "2019/04/30 21:06:32.800" +"2019/04/30 21:07:04.000" "2019/04/30 21:07:04.800" +"2019/04/30 21:07:14.000" "2019/04/30 21:07:14.800" +"2019/04/30 21:07:24.000" "2019/04/30 21:07:24.800" +"2019/04/30 21:07:34.000" "2019/04/30 21:07:34.800" +"2019/04/30 21:07:44.000" "2019/04/30 21:07:44.800" +"2019/04/30 21:07:54.000" "2019/04/30 21:07:54.800" +"2019/04/30 21:08:04.000" "2019/04/30 21:08:04.800" +"2019/04/30 21:08:14.000" "2019/04/30 21:08:14.800" +"2019/04/30 21:08:24.000" "2019/04/30 21:08:24.800" +"2019/04/30 21:08:34.000" "2019/04/30 21:08:34.800" +"2019/04/30 21:08:44.000" "2019/04/30 21:08:44.800" +"2019/04/30 21:08:54.000" "2019/04/30 21:08:54.800" +"2019/04/30 21:09:04.000" "2019/04/30 21:09:04.800" +"2019/04/30 21:09:14.000" "2019/04/30 21:09:14.800" +"2019/04/30 21:09:24.000" "2019/04/30 21:09:24.800" +"2019/04/30 21:10:13.000" "2019/04/30 21:10:13.800" +"2019/04/30 21:10:23.000" "2019/04/30 21:10:23.800" +"2019/04/30 21:10:33.000" "2019/04/30 21:10:33.800" +"2019/04/30 21:10:43.000" "2019/04/30 21:10:43.800" +"2019/04/30 21:10:53.000" "2019/04/30 21:10:53.800" +"2019/04/30 21:11:03.000" "2019/04/30 21:11:03.800" +"2019/04/30 21:11:13.000" "2019/04/30 21:11:13.800" +"2019/04/30 21:11:23.000" "2019/04/30 21:11:23.800" +"2019/04/30 21:11:33.000" "2019/04/30 21:11:33.800" \ No newline at end of file diff --git a/data/assets/scene/solarsystem/missions/osirisrex/InstrumentTimes/Recon_225m_Equatorial_PolyCam.txt b/data/assets/scene/solarsystem/missions/osirisrex/InstrumentTimes/Recon_225m_Equatorial_PolyCam.txt new file mode 100644 index 0000000000..09dae43c21 --- /dev/null +++ b/data/assets/scene/solarsystem/missions/osirisrex/InstrumentTimes/Recon_225m_Equatorial_PolyCam.txt @@ -0,0 +1,110 @@ +"2019/05/25 03:57:58.000" "2019/05/25 03:57:58.800" +"2019/05/25 03:58:08.000" "2019/05/25 03:58:08.800" +"2019/05/25 03:58:18.000" "2019/05/25 03:58:18.800" +"2019/05/25 03:58:28.000" "2019/05/25 03:58:28.800" +"2019/05/25 03:58:38.000" "2019/05/25 03:58:38.800" +"2019/05/25 03:58:48.000" "2019/05/25 03:58:48.800" +"2019/05/25 03:58:58.000" "2019/05/25 03:58:58.800" +"2019/05/25 03:59:08.000" "2019/05/25 03:59:08.800" +"2019/05/25 04:00:14.000" "2019/05/25 04:00:14.800" +"2019/05/25 04:00:24.000" "2019/05/25 04:00:24.800" +"2019/05/25 04:00:34.000" "2019/05/25 04:00:34.800" +"2019/05/25 04:00:44.000" "2019/05/25 04:00:44.800" +"2019/05/25 04:00:54.000" "2019/05/25 04:00:54.800" +"2019/05/25 04:01:04.000" "2019/05/25 04:01:04.800" +"2019/05/25 04:01:14.000" "2019/05/25 04:01:14.800" +"2019/05/25 04:01:24.000" "2019/05/25 04:01:24.800" +"2019/05/25 04:01:34.000" "2019/05/25 04:01:34.800" +"2019/05/25 04:01:44.000" "2019/05/25 04:01:44.800" +"2019/05/25 04:01:54.000" "2019/05/25 04:01:54.800" +"2019/05/25 04:02:04.000" "2019/05/25 04:02:04.800" +"2019/05/25 04:02:14.000" "2019/05/25 04:02:14.800" +"2019/05/25 04:03:05.000" "2019/05/25 04:03:05.800" +"2019/05/25 04:03:15.000" "2019/05/25 04:03:15.800" +"2019/05/25 04:03:25.000" "2019/05/25 04:03:25.800" +"2019/05/25 04:03:35.000" "2019/05/25 04:03:35.800" +"2019/05/25 04:03:45.000" "2019/05/25 04:03:45.800" +"2019/05/25 04:03:55.000" "2019/05/25 04:03:55.800" +"2019/05/25 04:04:05.000" "2019/05/25 04:04:05.800" +"2019/05/25 04:04:15.000" "2019/05/25 04:04:15.800" +"2019/05/25 04:04:25.000" "2019/05/25 04:04:25.800" +"2019/05/25 04:04:35.000" "2019/05/25 04:04:35.800" +"2019/05/25 04:04:45.000" "2019/05/25 04:04:45.800" +"2019/05/25 04:04:55.000" "2019/05/25 04:04:55.800" +"2019/05/25 04:05:05.000" "2019/05/25 04:05:05.800" +"2019/05/25 04:05:15.000" "2019/05/25 04:05:15.800" +"2019/05/25 04:05:25.000" "2019/05/25 04:05:25.800" +"2019/05/25 04:06:19.000" "2019/05/25 04:06:19.800" +"2019/05/25 04:06:29.000" "2019/05/25 04:06:29.800" +"2019/05/25 04:06:39.000" "2019/05/25 04:06:39.800" +"2019/05/25 04:06:49.000" "2019/05/25 04:06:49.800" +"2019/05/25 04:06:59.000" "2019/05/25 04:06:59.800" +"2019/05/25 04:07:09.000" "2019/05/25 04:07:09.800" +"2019/05/25 04:07:19.000" "2019/05/25 04:07:19.800" +"2019/05/25 04:07:29.000" "2019/05/25 04:07:29.800" +"2019/05/25 04:07:39.000" "2019/05/25 04:07:39.800" +"2019/05/25 04:07:49.000" "2019/05/25 04:07:49.800" +"2019/05/25 04:07:59.000" "2019/05/25 04:07:59.800" +"2019/05/25 04:08:09.000" "2019/05/25 04:08:09.800" +"2019/05/25 04:08:19.000" "2019/05/25 04:08:19.800" +"2019/05/25 04:08:29.000" "2019/05/25 04:08:29.800" +"2019/05/25 04:08:39.000" "2019/05/25 04:08:39.800" +"2019/05/25 04:08:49.000" "2019/05/25 04:08:49.800" +"2019/05/25 04:08:59.000" "2019/05/25 04:08:59.800" +"2019/05/25 04:09:47.000" "2019/05/25 04:09:47.800" +"2019/05/25 04:09:57.000" "2019/05/25 04:09:57.800" +"2019/05/25 04:10:07.000" "2019/05/25 04:10:07.800" +"2019/05/25 04:10:17.000" "2019/05/25 04:10:17.800" +"2019/05/25 04:10:27.000" "2019/05/25 04:10:27.800" +"2019/05/25 04:10:37.000" "2019/05/25 04:10:37.800" +"2019/05/25 04:10:47.000" "2019/05/25 04:10:47.800" +"2019/05/25 04:10:57.000" "2019/05/25 04:10:57.800" +"2019/05/25 04:11:07.000" "2019/05/25 04:11:07.800" +"2019/05/25 04:11:17.000" "2019/05/25 04:11:17.800" +"2019/05/25 04:11:27.000" "2019/05/25 04:11:27.800" +"2019/05/25 04:11:37.000" "2019/05/25 04:11:37.800" +"2019/05/25 04:11:47.000" "2019/05/25 04:11:47.800" +"2019/05/25 04:11:57.000" "2019/05/25 04:11:57.800" +"2019/05/25 04:12:07.000" "2019/05/25 04:12:07.800" +"2019/05/25 04:12:17.000" "2019/05/25 04:12:17.800" +"2019/05/25 04:12:27.000" "2019/05/25 04:12:27.800" +"2019/05/25 04:13:28.000" "2019/05/25 04:13:28.800" +"2019/05/25 04:13:38.000" "2019/05/25 04:13:38.800" +"2019/05/25 04:13:48.000" "2019/05/25 04:13:48.800" +"2019/05/25 04:13:58.000" "2019/05/25 04:13:58.800" +"2019/05/25 04:14:08.000" "2019/05/25 04:14:08.800" +"2019/05/25 04:14:18.000" "2019/05/25 04:14:18.800" +"2019/05/25 04:14:28.000" "2019/05/25 04:14:28.800" +"2019/05/25 04:14:38.000" "2019/05/25 04:14:38.800" +"2019/05/25 04:14:48.000" "2019/05/25 04:14:48.800" +"2019/05/25 04:14:58.000" "2019/05/25 04:14:58.800" +"2019/05/25 04:15:08.000" "2019/05/25 04:15:08.800" +"2019/05/25 04:15:18.000" "2019/05/25 04:15:18.800" +"2019/05/25 04:15:28.000" "2019/05/25 04:15:28.800" +"2019/05/25 04:15:38.000" "2019/05/25 04:15:38.800" +"2019/05/25 04:15:48.000" "2019/05/25 04:15:48.800" +"2019/05/25 04:15:58.000" "2019/05/25 04:15:58.800" +"2019/05/25 04:17:00.000" "2019/05/25 04:17:00.800" +"2019/05/25 04:17:10.000" "2019/05/25 04:17:10.800" +"2019/05/25 04:17:20.000" "2019/05/25 04:17:20.800" +"2019/05/25 04:17:30.000" "2019/05/25 04:17:30.800" +"2019/05/25 04:17:40.000" "2019/05/25 04:17:40.800" +"2019/05/25 04:17:50.000" "2019/05/25 04:17:50.800" +"2019/05/25 04:18:00.000" "2019/05/25 04:18:00.800" +"2019/05/25 04:18:10.000" "2019/05/25 04:18:10.800" +"2019/05/25 04:18:20.000" "2019/05/25 04:18:20.800" +"2019/05/25 04:18:30.000" "2019/05/25 04:18:30.800" +"2019/05/25 04:18:40.000" "2019/05/25 04:18:40.800" +"2019/05/25 04:18:50.000" "2019/05/25 04:18:50.800" +"2019/05/25 04:19:00.000" "2019/05/25 04:19:00.800" +"2019/05/25 04:19:59.000" "2019/05/25 04:19:59.800" +"2019/05/25 04:20:09.000" "2019/05/25 04:20:09.800" +"2019/05/25 04:20:19.000" "2019/05/25 04:20:19.800" +"2019/05/25 04:20:29.000" "2019/05/25 04:20:29.800" +"2019/05/25 04:20:39.000" "2019/05/25 04:20:39.800" +"2019/05/25 04:20:49.000" "2019/05/25 04:20:49.800" +"2019/05/25 04:20:59.000" "2019/05/25 04:20:59.800" +"2019/05/25 04:21:09.000" "2019/05/25 04:21:09.800" +"2019/05/25 04:21:19.000" "2019/05/25 04:21:19.800" +"2019/05/25 04:21:29.000" "2019/05/25 04:21:29.800" +"2019/05/25 04:21:39.000" "2019/05/25 04:21:39.800" \ No newline at end of file diff --git a/data/assets/scene/solarsystem/missions/osirisrex/InstrumentTimes/Recon_225m_Equatorial_spectrometers.txt b/data/assets/scene/solarsystem/missions/osirisrex/InstrumentTimes/Recon_225m_Equatorial_spectrometers.txt new file mode 100644 index 0000000000..02efe1cd35 --- /dev/null +++ b/data/assets/scene/solarsystem/missions/osirisrex/InstrumentTimes/Recon_225m_Equatorial_spectrometers.txt @@ -0,0 +1 @@ +"2019/05/25 03:57:58.000" "2019/05/25 04:21:40.000" \ No newline at end of file diff --git a/data/assets/scene/solarsystem/missions/osirisrex/InstrumentTimes/Recon_525m_Equatorial_spectrometers.txt b/data/assets/scene/solarsystem/missions/osirisrex/InstrumentTimes/Recon_525m_Equatorial_spectrometers.txt new file mode 100644 index 0000000000..f15cff2eb3 --- /dev/null +++ b/data/assets/scene/solarsystem/missions/osirisrex/InstrumentTimes/Recon_525m_Equatorial_spectrometers.txt @@ -0,0 +1,1559 @@ +"2019/05/25 04:19:02.000" "2019/05/25 04:19:02.500" +"2019/05/25 04:19:03.000" "2019/05/25 04:19:03.500" +"2019/05/25 04:19:04.000" "2019/05/25 04:19:04.500" +"2019/05/25 04:19:05.000" "2019/05/25 04:19:05.500" +"2019/05/25 04:19:06.000" "2019/05/25 04:19:06.500" +"2019/05/25 04:19:07.000" "2019/05/25 04:19:07.500" +"2019/05/25 04:19:08.000" "2019/05/25 04:19:08.500" +"2019/05/25 04:19:09.000" "2019/05/25 04:19:09.500" +"2019/05/25 04:19:10.000" "2019/05/25 04:19:10.500" +"2019/05/25 04:19:11.000" "2019/05/25 04:19:11.500" +"2019/05/25 04:19:12.000" "2019/05/25 04:19:12.500" +"2019/05/25 04:19:13.000" "2019/05/25 04:19:13.500" +"2019/05/25 04:19:14.000" "2019/05/25 04:19:14.500" +"2019/05/25 04:19:15.000" "2019/05/25 04:19:15.500" +"2019/05/25 04:19:16.000" "2019/05/25 04:19:16.500" +"2019/05/25 04:19:17.000" "2019/05/25 04:19:17.500" +"2019/05/25 04:19:18.000" "2019/05/25 04:19:18.500" +"2019/05/25 04:19:19.000" "2019/05/25 04:19:19.500" +"2019/05/25 04:19:20.000" "2019/05/25 04:19:20.500" +"2019/05/25 04:19:21.000" "2019/05/25 04:19:21.500" +"2019/05/25 04:19:22.000" "2019/05/25 04:19:22.500" +"2019/05/25 04:19:23.000" "2019/05/25 04:19:23.500" +"2019/05/25 04:19:24.000" "2019/05/25 04:19:24.500" +"2019/05/25 04:19:25.000" "2019/05/25 04:19:25.500" +"2019/05/25 04:19:26.000" "2019/05/25 04:19:26.500" +"2019/05/25 04:19:27.000" "2019/05/25 04:19:27.500" +"2019/05/25 04:19:28.000" "2019/05/25 04:19:28.500" +"2019/05/25 04:19:29.000" "2019/05/25 04:19:29.500" +"2019/05/25 04:19:30.000" "2019/05/25 04:19:30.500" +"2019/05/25 04:19:31.000" "2019/05/25 04:19:31.500" +"2019/05/25 04:19:32.000" "2019/05/25 04:19:32.500" +"2019/05/25 04:19:33.000" "2019/05/25 04:19:33.500" +"2019/05/25 04:19:34.000" "2019/05/25 04:19:34.500" +"2019/05/25 04:19:35.000" "2019/05/25 04:19:35.500" +"2019/05/25 04:19:36.000" "2019/05/25 04:19:36.500" +"2019/05/25 04:19:37.000" "2019/05/25 04:19:37.500" +"2019/05/25 04:19:38.000" "2019/05/25 04:19:38.500" +"2019/05/25 04:19:39.000" "2019/05/25 04:19:39.500" +"2019/05/25 04:19:40.000" "2019/05/25 04:19:40.500" +"2019/05/25 04:19:41.000" "2019/05/25 04:19:41.500" +"2019/05/25 04:19:43.000" "2019/05/25 04:19:43.500" +"2019/05/25 04:19:44.000" "2019/05/25 04:19:44.500" +"2019/05/25 04:19:45.000" "2019/05/25 04:19:45.500" +"2019/05/25 04:19:46.000" "2019/05/25 04:19:46.500" +"2019/05/25 04:19:47.000" "2019/05/25 04:19:47.500" +"2019/05/25 04:19:48.000" "2019/05/25 04:19:48.500" +"2019/05/25 04:19:49.000" "2019/05/25 04:19:49.500" +"2019/05/25 04:19:50.000" "2019/05/25 04:19:50.500" +"2019/05/25 04:19:51.000" "2019/05/25 04:19:51.500" +"2019/05/25 04:19:52.000" "2019/05/25 04:19:52.500" +"2019/05/25 04:19:53.000" "2019/05/25 04:19:53.500" +"2019/05/25 04:19:54.000" "2019/05/25 04:19:54.500" +"2019/05/25 04:19:55.000" "2019/05/25 04:19:55.500" +"2019/05/25 04:19:56.000" "2019/05/25 04:19:56.500" +"2019/05/25 04:19:57.000" "2019/05/25 04:19:57.500" +"2019/05/25 04:19:58.000" "2019/05/25 04:19:58.500" +"2019/05/25 04:19:59.000" "2019/05/25 04:19:59.500" +"2019/05/25 04:20:00.000" "2019/05/25 04:20:00.500" +"2019/05/25 04:20:01.000" "2019/05/25 04:20:01.500" +"2019/05/25 04:20:02.000" "2019/05/25 04:20:02.500" +"2019/05/25 04:20:03.000" "2019/05/25 04:20:03.500" +"2019/05/25 04:20:04.000" "2019/05/25 04:20:04.500" +"2019/05/25 04:20:05.000" "2019/05/25 04:20:05.500" +"2019/05/25 04:20:06.000" "2019/05/25 04:20:06.500" +"2019/05/25 04:20:07.000" "2019/05/25 04:20:07.500" +"2019/05/25 04:20:08.000" "2019/05/25 04:20:08.500" +"2019/05/25 04:20:09.000" "2019/05/25 04:20:09.500" +"2019/05/25 04:20:10.000" "2019/05/25 04:20:10.500" +"2019/05/25 04:20:11.000" "2019/05/25 04:20:11.500" +"2019/05/25 04:20:12.000" "2019/05/25 04:20:12.500" +"2019/05/25 04:20:13.000" "2019/05/25 04:20:13.500" +"2019/05/25 04:20:15.000" "2019/05/25 04:20:15.500" +"2019/05/25 04:20:16.000" "2019/05/25 04:20:16.500" +"2019/05/25 04:20:17.000" "2019/05/25 04:20:17.500" +"2019/05/25 04:20:18.000" "2019/05/25 04:20:18.500" +"2019/05/25 04:20:19.000" "2019/05/25 04:20:19.500" +"2019/05/25 04:20:20.000" "2019/05/25 04:20:20.500" +"2019/05/25 04:20:21.000" "2019/05/25 04:20:21.500" +"2019/05/25 04:20:22.000" "2019/05/25 04:20:22.500" +"2019/05/25 04:20:23.000" "2019/05/25 04:20:23.500" +"2019/05/25 04:20:24.000" "2019/05/25 04:20:24.500" +"2019/05/25 04:20:25.000" "2019/05/25 04:20:25.500" +"2019/05/25 04:20:26.000" "2019/05/25 04:20:26.500" +"2019/05/25 04:20:27.000" "2019/05/25 04:20:27.500" +"2019/05/25 04:20:28.000" "2019/05/25 04:20:28.500" +"2019/05/25 04:20:29.000" "2019/05/25 04:20:29.500" +"2019/05/25 04:20:30.000" "2019/05/25 04:20:30.500" +"2019/05/25 04:20:31.000" "2019/05/25 04:20:31.500" +"2019/05/25 04:20:32.000" "2019/05/25 04:20:32.500" +"2019/05/25 04:20:33.000" "2019/05/25 04:20:33.500" +"2019/05/25 04:20:34.000" "2019/05/25 04:20:34.500" +"2019/05/25 04:20:35.000" "2019/05/25 04:20:35.500" +"2019/05/25 04:20:36.000" "2019/05/25 04:20:36.500" +"2019/05/25 04:20:37.000" "2019/05/25 04:20:37.500" +"2019/05/25 04:20:38.000" "2019/05/25 04:20:38.500" +"2019/05/25 04:20:39.000" "2019/05/25 04:20:39.500" +"2019/05/25 04:20:40.000" "2019/05/25 04:20:40.500" +"2019/05/25 04:20:41.000" "2019/05/25 04:20:41.500" +"2019/05/25 04:20:42.000" "2019/05/25 04:20:42.500" +"2019/05/25 04:20:43.000" "2019/05/25 04:20:43.500" +"2019/05/25 04:20:44.000" "2019/05/25 04:20:44.500" +"2019/05/25 04:20:45.000" "2019/05/25 04:20:45.500" +"2019/05/25 04:20:46.000" "2019/05/25 04:20:46.500" +"2019/05/25 04:20:47.000" "2019/05/25 04:20:47.500" +"2019/05/25 04:20:48.000" "2019/05/25 04:20:48.500" +"2019/05/25 04:20:49.000" "2019/05/25 04:20:49.500" +"2019/05/25 04:20:50.000" "2019/05/25 04:20:50.500" +"2019/05/25 04:20:51.000" "2019/05/25 04:20:51.500" +"2019/05/25 04:20:52.000" "2019/05/25 04:20:52.500" +"2019/05/25 04:20:53.000" "2019/05/25 04:20:53.500" +"2019/05/25 04:20:54.000" "2019/05/25 04:20:54.500" +"2019/05/25 04:20:55.000" "2019/05/25 04:20:55.500" +"2019/05/25 04:20:56.000" "2019/05/25 04:20:56.500" +"2019/05/25 04:20:57.000" "2019/05/25 04:20:57.500" +"2019/05/25 04:20:58.000" "2019/05/25 04:20:58.500" +"2019/05/25 04:20:59.000" "2019/05/25 04:20:59.500" +"2019/05/25 04:21:00.000" "2019/05/25 04:21:00.500" +"2019/05/25 04:21:01.000" "2019/05/25 04:21:01.500" +"2019/05/25 04:21:02.000" "2019/05/25 04:21:02.500" +"2019/05/25 04:21:03.000" "2019/05/25 04:21:03.500" +"2019/05/25 04:21:04.000" "2019/05/25 04:21:04.500" +"2019/05/25 04:21:05.000" "2019/05/25 04:21:05.500" +"2019/05/25 04:21:06.000" "2019/05/25 04:21:06.500" +"2019/05/25 04:21:07.000" "2019/05/25 04:21:07.500" +"2019/05/25 04:21:08.000" "2019/05/25 04:21:08.500" +"2019/05/25 04:21:09.000" "2019/05/25 04:21:09.500" +"2019/05/25 04:21:10.000" "2019/05/25 04:21:10.500" +"2019/05/25 04:21:11.000" "2019/05/25 04:21:11.500" +"2019/05/25 04:21:12.000" "2019/05/25 04:21:12.500" +"2019/05/25 04:21:13.000" "2019/05/25 04:21:13.500" +"2019/05/25 04:21:14.000" "2019/05/25 04:21:14.500" +"2019/05/25 04:21:15.000" "2019/05/25 04:21:15.500" +"2019/05/25 04:21:16.000" "2019/05/25 04:21:16.500" +"2019/05/25 04:21:17.000" "2019/05/25 04:21:17.500" +"2019/05/25 04:21:18.000" "2019/05/25 04:21:18.500" +"2019/05/25 04:21:19.000" "2019/05/25 04:21:19.500" +"2019/05/25 04:21:20.000" "2019/05/25 04:21:20.500" +"2019/05/25 04:21:21.000" "2019/05/25 04:21:21.500" +"2019/05/25 04:21:22.000" "2019/05/25 04:21:22.500" +"2019/05/25 04:21:23.000" "2019/05/25 04:21:23.500" +"2019/05/25 04:21:24.000" "2019/05/25 04:21:24.500" +"2019/05/25 04:21:25.000" "2019/05/25 04:21:25.500" +"2019/05/25 04:21:26.000" "2019/05/25 04:21:26.500" +"2019/05/25 04:21:27.000" "2019/05/25 04:21:27.500" +"2019/05/25 04:21:28.000" "2019/05/25 04:21:28.500" +"2019/05/25 04:21:29.000" "2019/05/25 04:21:29.500" +"2019/05/25 04:21:31.000" "2019/05/25 04:21:31.500" +"2019/05/25 04:21:32.000" "2019/05/25 04:21:32.500" +"2019/05/25 04:21:33.000" "2019/05/25 04:21:33.500" +"2019/05/25 04:21:34.000" "2019/05/25 04:21:34.500" +"2019/05/25 04:21:35.000" "2019/05/25 04:21:35.500" +"2019/05/25 04:21:36.000" "2019/05/25 04:21:36.500" +"2019/05/25 04:21:37.000" "2019/05/25 04:21:37.500" +"2019/05/25 04:21:38.000" "2019/05/25 04:21:38.500" +"2019/05/25 04:21:39.000" "2019/05/25 04:21:39.500" +"2019/05/25 04:21:40.000" "2019/05/25 04:21:40.500" +"2019/05/25 04:21:41.000" "2019/05/25 04:21:41.500" +"2019/05/25 04:21:42.000" "2019/05/25 04:21:42.500" +"2019/05/25 04:21:43.000" "2019/05/25 04:21:43.500" +"2019/05/25 04:21:44.000" "2019/05/25 04:21:44.500" +"2019/05/25 04:21:45.000" "2019/05/25 04:21:45.500" +"2019/05/25 04:21:46.000" "2019/05/25 04:21:46.500" +"2019/05/25 04:21:47.000" "2019/05/25 04:21:47.500" +"2019/05/25 04:21:48.000" "2019/05/25 04:21:48.500" +"2019/05/25 04:21:49.000" "2019/05/25 04:21:49.500" +"2019/05/25 04:21:50.000" "2019/05/25 04:21:50.500" +"2019/05/25 04:21:51.000" "2019/05/25 04:21:51.500" +"2019/05/25 04:21:52.000" "2019/05/25 04:21:52.500" +"2019/05/25 04:21:53.000" "2019/05/25 04:21:53.500" +"2019/05/25 04:21:54.000" "2019/05/25 04:21:54.500" +"2019/05/25 04:21:55.000" "2019/05/25 04:21:55.500" +"2019/05/25 04:21:56.000" "2019/05/25 04:21:56.500" +"2019/05/25 04:21:57.000" "2019/05/25 04:21:57.500" +"2019/05/25 04:21:58.000" "2019/05/25 04:21:58.500" +"2019/05/25 04:21:59.000" "2019/05/25 04:21:59.500" +"2019/05/25 04:22:00.000" "2019/05/25 04:22:00.500" +"2019/05/25 04:22:01.000" "2019/05/25 04:22:01.500" +"2019/05/25 04:22:02.000" "2019/05/25 04:22:02.500" +"2019/05/25 04:22:03.000" "2019/05/25 04:22:03.500" +"2019/05/25 04:22:04.000" "2019/05/25 04:22:04.500" +"2019/05/25 04:22:05.000" "2019/05/25 04:22:05.500" +"2019/05/25 04:22:06.000" "2019/05/25 04:22:06.500" +"2019/05/25 04:22:07.000" "2019/05/25 04:22:07.500" +"2019/05/25 04:22:08.000" "2019/05/25 04:22:08.500" +"2019/05/25 04:22:09.000" "2019/05/25 04:22:09.500" +"2019/05/25 04:22:10.000" "2019/05/25 04:22:10.500" +"2019/05/25 04:22:12.000" "2019/05/25 04:22:12.500" +"2019/05/25 04:22:13.000" "2019/05/25 04:22:13.500" +"2019/05/25 04:22:14.000" "2019/05/25 04:22:14.500" +"2019/05/25 04:22:15.000" "2019/05/25 04:22:15.500" +"2019/05/25 04:22:16.000" "2019/05/25 04:22:16.500" +"2019/05/25 04:22:17.000" "2019/05/25 04:22:17.500" +"2019/05/25 04:22:18.000" "2019/05/25 04:22:18.500" +"2019/05/25 04:22:19.000" "2019/05/25 04:22:19.500" +"2019/05/25 04:22:20.000" "2019/05/25 04:22:20.500" +"2019/05/25 04:22:21.000" "2019/05/25 04:22:21.500" +"2019/05/25 04:22:22.000" "2019/05/25 04:22:22.500" +"2019/05/25 04:22:23.000" "2019/05/25 04:22:23.500" +"2019/05/25 04:22:24.000" "2019/05/25 04:22:24.500" +"2019/05/25 04:22:25.000" "2019/05/25 04:22:25.500" +"2019/05/25 04:22:26.000" "2019/05/25 04:22:26.500" +"2019/05/25 04:22:27.000" "2019/05/25 04:22:27.500" +"2019/05/25 04:22:28.000" "2019/05/25 04:22:28.500" +"2019/05/25 04:22:29.000" "2019/05/25 04:22:29.500" +"2019/05/25 04:22:30.000" "2019/05/25 04:22:30.500" +"2019/05/25 04:22:31.000" "2019/05/25 04:22:31.500" +"2019/05/25 04:22:32.000" "2019/05/25 04:22:32.500" +"2019/05/25 04:22:33.000" "2019/05/25 04:22:33.500" +"2019/05/25 04:22:34.000" "2019/05/25 04:22:34.500" +"2019/05/25 04:22:35.000" "2019/05/25 04:22:35.500" +"2019/05/25 04:22:36.000" "2019/05/25 04:22:36.500" +"2019/05/25 04:22:37.000" "2019/05/25 04:22:37.500" +"2019/05/25 04:22:38.000" "2019/05/25 04:22:38.500" +"2019/05/25 04:22:39.000" "2019/05/25 04:22:39.500" +"2019/05/25 04:22:40.000" "2019/05/25 04:22:40.500" +"2019/05/25 04:22:41.000" "2019/05/25 04:22:41.500" +"2019/05/25 04:22:42.000" "2019/05/25 04:22:42.500" +"2019/05/25 04:22:43.000" "2019/05/25 04:22:43.500" +"2019/05/25 04:22:44.000" "2019/05/25 04:22:44.500" +"2019/05/25 04:22:45.000" "2019/05/25 04:22:45.500" +"2019/05/25 04:22:46.000" "2019/05/25 04:22:46.500" +"2019/05/25 04:22:47.000" "2019/05/25 04:22:47.500" +"2019/05/25 04:22:48.000" "2019/05/25 04:22:48.500" +"2019/05/25 04:22:49.000" "2019/05/25 04:22:49.500" +"2019/05/25 04:22:50.000" "2019/05/25 04:22:50.500" +"2019/05/25 04:22:51.000" "2019/05/25 04:22:51.500" +"2019/05/25 04:22:52.000" "2019/05/25 04:22:52.500" +"2019/05/25 04:22:53.000" "2019/05/25 04:22:53.500" +"2019/05/25 04:22:54.000" "2019/05/25 04:22:54.500" +"2019/05/25 04:22:55.000" "2019/05/25 04:22:55.500" +"2019/05/25 04:22:56.000" "2019/05/25 04:22:56.500" +"2019/05/25 04:22:57.000" "2019/05/25 04:22:57.500" +"2019/05/25 04:22:58.000" "2019/05/25 04:22:58.500" +"2019/05/25 04:22:59.000" "2019/05/25 04:22:59.500" +"2019/05/25 04:23:00.000" "2019/05/25 04:23:00.500" +"2019/05/25 04:23:01.000" "2019/05/25 04:23:01.500" +"2019/05/25 04:23:02.000" "2019/05/25 04:23:02.500" +"2019/05/25 04:23:03.000" "2019/05/25 04:23:03.500" +"2019/05/25 04:23:04.000" "2019/05/25 04:23:04.500" +"2019/05/25 04:23:05.000" "2019/05/25 04:23:05.500" +"2019/05/25 04:23:06.000" "2019/05/25 04:23:06.500" +"2019/05/25 04:23:07.000" "2019/05/25 04:23:07.500" +"2019/05/25 04:23:08.000" "2019/05/25 04:23:08.500" +"2019/05/25 04:23:09.000" "2019/05/25 04:23:09.500" +"2019/05/25 04:23:10.000" "2019/05/25 04:23:10.500" +"2019/05/25 04:23:11.000" "2019/05/25 04:23:11.500" +"2019/05/25 04:23:12.000" "2019/05/25 04:23:12.500" +"2019/05/25 04:23:13.000" "2019/05/25 04:23:13.500" +"2019/05/25 04:23:14.000" "2019/05/25 04:23:14.500" +"2019/05/25 04:23:15.000" "2019/05/25 04:23:15.500" +"2019/05/25 04:23:16.000" "2019/05/25 04:23:16.500" +"2019/05/25 04:23:17.000" "2019/05/25 04:23:17.500" +"2019/05/25 04:23:18.000" "2019/05/25 04:23:18.500" +"2019/05/25 04:23:19.000" "2019/05/25 04:23:19.500" +"2019/05/25 04:23:20.000" "2019/05/25 04:23:20.500" +"2019/05/25 04:23:21.000" "2019/05/25 04:23:21.500" +"2019/05/25 04:23:22.000" "2019/05/25 04:23:22.500" +"2019/05/25 04:23:23.000" "2019/05/25 04:23:23.500" +"2019/05/25 04:23:24.000" "2019/05/25 04:23:24.500" +"2019/05/25 04:23:25.000" "2019/05/25 04:23:25.500" +"2019/05/25 04:23:26.000" "2019/05/25 04:23:26.500" +"2019/05/25 04:23:27.000" "2019/05/25 04:23:27.500" +"2019/05/25 04:23:28.000" "2019/05/25 04:23:28.500" +"2019/05/25 04:23:29.000" "2019/05/25 04:23:29.500" +"2019/05/25 04:23:30.000" "2019/05/25 04:23:30.500" +"2019/05/25 04:23:32.000" "2019/05/25 04:23:32.500" +"2019/05/25 04:23:33.000" "2019/05/25 04:23:33.500" +"2019/05/25 04:23:34.000" "2019/05/25 04:23:34.500" +"2019/05/25 04:23:35.000" "2019/05/25 04:23:35.500" +"2019/05/25 04:23:36.000" "2019/05/25 04:23:36.500" +"2019/05/25 04:23:37.000" "2019/05/25 04:23:37.500" +"2019/05/25 04:23:38.000" "2019/05/25 04:23:38.500" +"2019/05/25 04:23:39.000" "2019/05/25 04:23:39.500" +"2019/05/25 04:23:40.000" "2019/05/25 04:23:40.500" +"2019/05/25 04:23:41.000" "2019/05/25 04:23:41.500" +"2019/05/25 04:23:42.000" "2019/05/25 04:23:42.500" +"2019/05/25 04:23:43.000" "2019/05/25 04:23:43.500" +"2019/05/25 04:23:44.000" "2019/05/25 04:23:44.500" +"2019/05/25 04:23:45.000" "2019/05/25 04:23:45.500" +"2019/05/25 04:23:46.000" "2019/05/25 04:23:46.500" +"2019/05/25 04:23:47.000" "2019/05/25 04:23:47.500" +"2019/05/25 04:23:48.000" "2019/05/25 04:23:48.500" +"2019/05/25 04:23:49.000" "2019/05/25 04:23:49.500" +"2019/05/25 04:23:50.000" "2019/05/25 04:23:50.500" +"2019/05/25 04:23:51.000" "2019/05/25 04:23:51.500" +"2019/05/25 04:23:52.000" "2019/05/25 04:23:52.500" +"2019/05/25 04:23:53.000" "2019/05/25 04:23:53.500" +"2019/05/25 04:23:54.000" "2019/05/25 04:23:54.500" +"2019/05/25 04:23:55.000" "2019/05/25 04:23:55.500" +"2019/05/25 04:23:56.000" "2019/05/25 04:23:56.500" +"2019/05/25 04:23:57.000" "2019/05/25 04:23:57.500" +"2019/05/25 04:23:58.000" "2019/05/25 04:23:58.500" +"2019/05/25 04:24:00.000" "2019/05/25 04:24:00.500" +"2019/05/25 04:24:01.000" "2019/05/25 04:24:01.500" +"2019/05/25 04:24:02.000" "2019/05/25 04:24:02.500" +"2019/05/25 04:24:03.000" "2019/05/25 04:24:03.500" +"2019/05/25 04:24:04.000" "2019/05/25 04:24:04.500" +"2019/05/25 04:24:05.000" "2019/05/25 04:24:05.500" +"2019/05/25 04:24:06.000" "2019/05/25 04:24:06.500" +"2019/05/25 04:24:07.000" "2019/05/25 04:24:07.500" +"2019/05/25 04:24:08.000" "2019/05/25 04:24:08.500" +"2019/05/25 04:24:09.000" "2019/05/25 04:24:09.500" +"2019/05/25 04:24:10.000" "2019/05/25 04:24:10.500" +"2019/05/25 04:24:11.000" "2019/05/25 04:24:11.500" +"2019/05/25 04:24:12.000" "2019/05/25 04:24:12.500" +"2019/05/25 04:24:13.000" "2019/05/25 04:24:13.500" +"2019/05/25 04:24:14.000" "2019/05/25 04:24:14.500" +"2019/05/25 04:24:15.000" "2019/05/25 04:24:15.500" +"2019/05/25 04:24:16.000" "2019/05/25 04:24:16.500" +"2019/05/25 04:24:17.000" "2019/05/25 04:24:17.500" +"2019/05/25 04:24:18.000" "2019/05/25 04:24:18.500" +"2019/05/25 04:24:19.000" "2019/05/25 04:24:19.500" +"2019/05/25 04:24:20.000" "2019/05/25 04:24:20.500" +"2019/05/25 04:24:21.000" "2019/05/25 04:24:21.500" +"2019/05/25 04:24:22.000" "2019/05/25 04:24:22.500" +"2019/05/25 04:24:23.000" "2019/05/25 04:24:23.500" +"2019/05/25 04:24:24.000" "2019/05/25 04:24:24.500" +"2019/05/25 04:24:25.000" "2019/05/25 04:24:25.500" +"2019/05/25 04:24:26.000" "2019/05/25 04:24:26.500" +"2019/05/25 04:24:27.000" "2019/05/25 04:24:27.500" +"2019/05/25 04:24:28.000" "2019/05/25 04:24:28.500" +"2019/05/25 04:24:29.000" "2019/05/25 04:24:29.500" +"2019/05/25 04:24:30.000" "2019/05/25 04:24:30.500" +"2019/05/25 04:24:31.000" "2019/05/25 04:24:31.500" +"2019/05/25 04:24:32.000" "2019/05/25 04:24:32.500" +"2019/05/25 04:24:33.000" "2019/05/25 04:24:33.500" +"2019/05/25 04:24:34.000" "2019/05/25 04:24:34.500" +"2019/05/25 04:24:35.000" "2019/05/25 04:24:35.500" +"2019/05/25 04:24:36.000" "2019/05/25 04:24:36.500" +"2019/05/25 04:24:37.000" "2019/05/25 04:24:37.500" +"2019/05/25 04:24:38.000" "2019/05/25 04:24:38.500" +"2019/05/25 04:24:39.000" "2019/05/25 04:24:39.500" +"2019/05/25 04:24:40.000" "2019/05/25 04:24:40.500" +"2019/05/25 04:24:41.000" "2019/05/25 04:24:41.500" +"2019/05/25 04:24:42.000" "2019/05/25 04:24:42.500" +"2019/05/25 04:24:43.000" "2019/05/25 04:24:43.500" +"2019/05/25 04:24:44.000" "2019/05/25 04:24:44.500" +"2019/05/25 04:24:45.000" "2019/05/25 04:24:45.500" +"2019/05/25 04:24:46.000" "2019/05/25 04:24:46.500" +"2019/05/25 04:24:47.000" "2019/05/25 04:24:47.500" +"2019/05/25 04:24:48.000" "2019/05/25 04:24:48.500" +"2019/05/25 04:24:49.000" "2019/05/25 04:24:49.500" +"2019/05/25 04:24:50.000" "2019/05/25 04:24:50.500" +"2019/05/25 04:24:51.000" "2019/05/25 04:24:51.500" +"2019/05/25 04:24:52.000" "2019/05/25 04:24:52.500" +"2019/05/25 04:24:53.000" "2019/05/25 04:24:53.500" +"2019/05/25 04:24:54.000" "2019/05/25 04:24:54.500" +"2019/05/25 04:24:55.000" "2019/05/25 04:24:55.500" +"2019/05/25 04:24:56.000" "2019/05/25 04:24:56.500" +"2019/05/25 04:24:57.000" "2019/05/25 04:24:57.500" +"2019/05/25 04:24:58.000" "2019/05/25 04:24:58.500" +"2019/05/25 04:24:59.000" "2019/05/25 04:24:59.500" +"2019/05/25 04:25:00.000" "2019/05/25 04:25:00.500" +"2019/05/25 04:25:01.000" "2019/05/25 04:25:01.500" +"2019/05/25 04:25:02.000" "2019/05/25 04:25:02.500" +"2019/05/25 04:25:03.000" "2019/05/25 04:25:03.500" +"2019/05/25 04:25:04.000" "2019/05/25 04:25:04.500" +"2019/05/25 04:25:05.000" "2019/05/25 04:25:05.500" +"2019/05/25 04:25:06.000" "2019/05/25 04:25:06.500" +"2019/05/25 04:25:07.000" "2019/05/25 04:25:07.500" +"2019/05/25 04:25:08.000" "2019/05/25 04:25:08.500" +"2019/05/25 04:25:09.000" "2019/05/25 04:25:09.500" +"2019/05/25 04:25:10.000" "2019/05/25 04:25:10.500" +"2019/05/25 04:25:11.000" "2019/05/25 04:25:11.500" +"2019/05/25 04:25:12.000" "2019/05/25 04:25:12.500" +"2019/05/25 04:25:13.000" "2019/05/25 04:25:13.500" +"2019/05/25 04:25:14.000" "2019/05/25 04:25:14.500" +"2019/05/25 04:25:15.000" "2019/05/25 04:25:15.500" +"2019/05/25 04:25:16.000" "2019/05/25 04:25:16.500" +"2019/05/25 04:25:17.000" "2019/05/25 04:25:17.500" +"2019/05/25 04:25:18.000" "2019/05/25 04:25:18.500" +"2019/05/25 04:25:19.000" "2019/05/25 04:25:19.500" +"2019/05/25 04:25:20.000" "2019/05/25 04:25:20.500" +"2019/05/25 04:25:21.000" "2019/05/25 04:25:21.500" +"2019/05/25 04:25:22.000" "2019/05/25 04:25:22.500" +"2019/05/25 04:25:23.000" "2019/05/25 04:25:23.500" +"2019/05/25 04:25:24.000" "2019/05/25 04:25:24.500" +"2019/05/25 04:25:25.000" "2019/05/25 04:25:25.500" +"2019/05/25 04:25:26.000" "2019/05/25 04:25:26.500" +"2019/05/25 04:25:27.000" "2019/05/25 04:25:27.500" +"2019/05/25 04:25:28.000" "2019/05/25 04:25:28.500" +"2019/05/25 04:25:29.000" "2019/05/25 04:25:29.500" +"2019/05/25 04:25:30.000" "2019/05/25 04:25:30.500" +"2019/05/25 04:25:31.000" "2019/05/25 04:25:31.500" +"2019/05/25 04:25:32.000" "2019/05/25 04:25:32.500" +"2019/05/25 04:25:34.000" "2019/05/25 04:25:34.500" +"2019/05/25 04:25:35.000" "2019/05/25 04:25:35.500" +"2019/05/25 04:25:36.000" "2019/05/25 04:25:36.500" +"2019/05/25 04:25:37.000" "2019/05/25 04:25:37.500" +"2019/05/25 04:25:38.000" "2019/05/25 04:25:38.500" +"2019/05/25 04:25:39.000" "2019/05/25 04:25:39.500" +"2019/05/25 04:25:40.000" "2019/05/25 04:25:40.500" +"2019/05/25 04:25:41.000" "2019/05/25 04:25:41.500" +"2019/05/25 04:25:42.000" "2019/05/25 04:25:42.500" +"2019/05/25 04:25:43.000" "2019/05/25 04:25:43.500" +"2019/05/25 04:25:44.000" "2019/05/25 04:25:44.500" +"2019/05/25 04:25:45.000" "2019/05/25 04:25:45.500" +"2019/05/25 04:25:46.000" "2019/05/25 04:25:46.500" +"2019/05/25 04:25:47.000" "2019/05/25 04:25:47.500" +"2019/05/25 04:25:48.000" "2019/05/25 04:25:48.500" +"2019/05/25 04:25:49.000" "2019/05/25 04:25:49.500" +"2019/05/25 04:25:50.000" "2019/05/25 04:25:50.500" +"2019/05/25 04:25:51.000" "2019/05/25 04:25:51.500" +"2019/05/25 04:25:52.000" "2019/05/25 04:25:52.500" +"2019/05/25 04:25:53.000" "2019/05/25 04:25:53.500" +"2019/05/25 04:25:54.000" "2019/05/25 04:25:54.500" +"2019/05/25 04:25:55.000" "2019/05/25 04:25:55.500" +"2019/05/25 04:25:56.000" "2019/05/25 04:25:56.500" +"2019/05/25 04:25:57.000" "2019/05/25 04:25:57.500" +"2019/05/25 04:25:58.000" "2019/05/25 04:25:58.500" +"2019/05/25 04:25:59.000" "2019/05/25 04:25:59.500" +"2019/05/25 04:26:00.000" "2019/05/25 04:26:00.500" +"2019/05/25 04:26:01.000" "2019/05/25 04:26:01.500" +"2019/05/25 04:26:02.000" "2019/05/25 04:26:02.500" +"2019/05/25 04:26:03.000" "2019/05/25 04:26:03.500" +"2019/05/25 04:26:04.000" "2019/05/25 04:26:04.500" +"2019/05/25 04:26:05.000" "2019/05/25 04:26:05.500" +"2019/05/25 04:26:06.000" "2019/05/25 04:26:06.500" +"2019/05/25 04:26:07.000" "2019/05/25 04:26:07.500" +"2019/05/25 04:26:08.000" "2019/05/25 04:26:08.500" +"2019/05/25 04:26:10.000" "2019/05/25 04:26:10.500" +"2019/05/25 04:26:11.000" "2019/05/25 04:26:11.500" +"2019/05/25 04:26:12.000" "2019/05/25 04:26:12.500" +"2019/05/25 04:26:13.000" "2019/05/25 04:26:13.500" +"2019/05/25 04:26:14.000" "2019/05/25 04:26:14.500" +"2019/05/25 04:26:15.000" "2019/05/25 04:26:15.500" +"2019/05/25 04:26:16.000" "2019/05/25 04:26:16.500" +"2019/05/25 04:26:17.000" "2019/05/25 04:26:17.500" +"2019/05/25 04:26:18.000" "2019/05/25 04:26:18.500" +"2019/05/25 04:26:19.000" "2019/05/25 04:26:19.500" +"2019/05/25 04:26:20.000" "2019/05/25 04:26:20.500" +"2019/05/25 04:26:21.000" "2019/05/25 04:26:21.500" +"2019/05/25 04:26:22.000" "2019/05/25 04:26:22.500" +"2019/05/25 04:26:23.000" "2019/05/25 04:26:23.500" +"2019/05/25 04:26:24.000" "2019/05/25 04:26:24.500" +"2019/05/25 04:26:25.000" "2019/05/25 04:26:25.500" +"2019/05/25 04:26:26.000" "2019/05/25 04:26:26.500" +"2019/05/25 04:26:27.000" "2019/05/25 04:26:27.500" +"2019/05/25 04:26:28.000" "2019/05/25 04:26:28.500" +"2019/05/25 04:26:29.000" "2019/05/25 04:26:29.500" +"2019/05/25 04:26:30.000" "2019/05/25 04:26:30.500" +"2019/05/25 04:26:31.000" "2019/05/25 04:26:31.500" +"2019/05/25 04:26:32.000" "2019/05/25 04:26:32.500" +"2019/05/25 04:26:33.000" "2019/05/25 04:26:33.500" +"2019/05/25 04:26:34.000" "2019/05/25 04:26:34.500" +"2019/05/25 04:26:35.000" "2019/05/25 04:26:35.500" +"2019/05/25 04:26:36.000" "2019/05/25 04:26:36.500" +"2019/05/25 04:26:37.000" "2019/05/25 04:26:37.500" +"2019/05/25 04:26:38.000" "2019/05/25 04:26:38.500" +"2019/05/25 04:26:39.000" "2019/05/25 04:26:39.500" +"2019/05/25 04:26:40.000" "2019/05/25 04:26:40.500" +"2019/05/25 04:26:41.000" "2019/05/25 04:26:41.500" +"2019/05/25 04:26:42.000" "2019/05/25 04:26:42.500" +"2019/05/25 04:26:43.000" "2019/05/25 04:26:43.500" +"2019/05/25 04:26:44.000" "2019/05/25 04:26:44.500" +"2019/05/25 04:26:45.000" "2019/05/25 04:26:45.500" +"2019/05/25 04:26:46.000" "2019/05/25 04:26:46.500" +"2019/05/25 04:26:47.000" "2019/05/25 04:26:47.500" +"2019/05/25 04:26:48.000" "2019/05/25 04:26:48.500" +"2019/05/25 04:26:49.000" "2019/05/25 04:26:49.500" +"2019/05/25 04:26:50.000" "2019/05/25 04:26:50.500" +"2019/05/25 04:26:51.000" "2019/05/25 04:26:51.500" +"2019/05/25 04:26:52.000" "2019/05/25 04:26:52.500" +"2019/05/25 04:26:53.000" "2019/05/25 04:26:53.500" +"2019/05/25 04:26:54.000" "2019/05/25 04:26:54.500" +"2019/05/25 04:26:55.000" "2019/05/25 04:26:55.500" +"2019/05/25 04:26:56.000" "2019/05/25 04:26:56.500" +"2019/05/25 04:26:57.000" "2019/05/25 04:26:57.500" +"2019/05/25 04:26:58.000" "2019/05/25 04:26:58.500" +"2019/05/25 04:26:59.000" "2019/05/25 04:26:59.500" +"2019/05/25 04:27:00.000" "2019/05/25 04:27:00.500" +"2019/05/25 04:27:01.000" "2019/05/25 04:27:01.500" +"2019/05/25 04:27:02.000" "2019/05/25 04:27:02.500" +"2019/05/25 04:27:03.000" "2019/05/25 04:27:03.500" +"2019/05/25 04:27:04.000" "2019/05/25 04:27:04.500" +"2019/05/25 04:27:05.000" "2019/05/25 04:27:05.500" +"2019/05/25 04:27:06.000" "2019/05/25 04:27:06.500" +"2019/05/25 04:27:07.000" "2019/05/25 04:27:07.500" +"2019/05/25 04:27:08.000" "2019/05/25 04:27:08.500" +"2019/05/25 04:27:09.000" "2019/05/25 04:27:09.500" +"2019/05/25 04:27:10.000" "2019/05/25 04:27:10.500" +"2019/05/25 04:27:11.000" "2019/05/25 04:27:11.500" +"2019/05/25 04:27:12.000" "2019/05/25 04:27:12.500" +"2019/05/25 04:27:13.000" "2019/05/25 04:27:13.500" +"2019/05/25 04:27:14.000" "2019/05/25 04:27:14.500" +"2019/05/25 04:27:15.000" "2019/05/25 04:27:15.500" +"2019/05/25 04:27:16.000" "2019/05/25 04:27:16.500" +"2019/05/25 04:27:17.000" "2019/05/25 04:27:17.500" +"2019/05/25 04:27:18.000" "2019/05/25 04:27:18.500" +"2019/05/25 04:27:19.000" "2019/05/25 04:27:19.500" +"2019/05/25 04:27:20.000" "2019/05/25 04:27:20.500" +"2019/05/25 04:27:21.000" "2019/05/25 04:27:21.500" +"2019/05/25 04:27:22.000" "2019/05/25 04:27:22.500" +"2019/05/25 04:27:23.000" "2019/05/25 04:27:23.500" +"2019/05/25 04:27:24.000" "2019/05/25 04:27:24.500" +"2019/05/25 04:27:25.000" "2019/05/25 04:27:25.500" +"2019/05/25 04:27:26.000" "2019/05/25 04:27:26.500" +"2019/05/25 04:27:27.000" "2019/05/25 04:27:27.500" +"2019/05/25 04:27:28.000" "2019/05/25 04:27:28.500" +"2019/05/25 04:27:29.000" "2019/05/25 04:27:29.500" +"2019/05/25 04:27:30.000" "2019/05/25 04:27:30.500" +"2019/05/25 04:27:31.000" "2019/05/25 04:27:31.500" +"2019/05/25 04:27:32.000" "2019/05/25 04:27:32.500" +"2019/05/25 04:27:33.000" "2019/05/25 04:27:33.500" +"2019/05/25 04:27:34.000" "2019/05/25 04:27:34.500" +"2019/05/25 04:27:35.000" "2019/05/25 04:27:35.500" +"2019/05/25 04:27:36.000" "2019/05/25 04:27:36.500" +"2019/05/25 04:27:37.000" "2019/05/25 04:27:37.500" +"2019/05/25 04:27:38.000" "2019/05/25 04:27:38.500" +"2019/05/25 04:27:39.000" "2019/05/25 04:27:39.500" +"2019/05/25 04:27:40.000" "2019/05/25 04:27:40.500" +"2019/05/25 04:27:41.000" "2019/05/25 04:27:41.500" +"2019/05/25 04:27:43.000" "2019/05/25 04:27:43.500" +"2019/05/25 04:27:44.000" "2019/05/25 04:27:44.500" +"2019/05/25 04:27:45.000" "2019/05/25 04:27:45.500" +"2019/05/25 04:27:46.000" "2019/05/25 04:27:46.500" +"2019/05/25 04:27:47.000" "2019/05/25 04:27:47.500" +"2019/05/25 04:27:48.000" "2019/05/25 04:27:48.500" +"2019/05/25 04:27:49.000" "2019/05/25 04:27:49.500" +"2019/05/25 04:27:50.000" "2019/05/25 04:27:50.500" +"2019/05/25 04:27:51.000" "2019/05/25 04:27:51.500" +"2019/05/25 04:27:52.000" "2019/05/25 04:27:52.500" +"2019/05/25 04:27:53.000" "2019/05/25 04:27:53.500" +"2019/05/25 04:27:54.000" "2019/05/25 04:27:54.500" +"2019/05/25 04:27:55.000" "2019/05/25 04:27:55.500" +"2019/05/25 04:27:56.000" "2019/05/25 04:27:56.500" +"2019/05/25 04:27:57.000" "2019/05/25 04:27:57.500" +"2019/05/25 04:27:58.000" "2019/05/25 04:27:58.500" +"2019/05/25 04:27:59.000" "2019/05/25 04:27:59.500" +"2019/05/25 04:28:00.000" "2019/05/25 04:28:00.500" +"2019/05/25 04:28:01.000" "2019/05/25 04:28:01.500" +"2019/05/25 04:28:02.000" "2019/05/25 04:28:02.500" +"2019/05/25 04:28:03.000" "2019/05/25 04:28:03.500" +"2019/05/25 04:28:04.000" "2019/05/25 04:28:04.500" +"2019/05/25 04:28:05.000" "2019/05/25 04:28:05.500" +"2019/05/25 04:28:06.000" "2019/05/25 04:28:06.500" +"2019/05/25 04:28:07.000" "2019/05/25 04:28:07.500" +"2019/05/25 04:28:08.000" "2019/05/25 04:28:08.500" +"2019/05/25 04:28:09.000" "2019/05/25 04:28:09.500" +"2019/05/25 04:28:10.000" "2019/05/25 04:28:10.500" +"2019/05/25 04:28:11.000" "2019/05/25 04:28:11.500" +"2019/05/25 04:28:12.000" "2019/05/25 04:28:12.500" +"2019/05/25 04:28:14.000" "2019/05/25 04:28:14.500" +"2019/05/25 04:28:15.000" "2019/05/25 04:28:15.500" +"2019/05/25 04:28:16.000" "2019/05/25 04:28:16.500" +"2019/05/25 04:28:17.000" "2019/05/25 04:28:17.500" +"2019/05/25 04:28:18.000" "2019/05/25 04:28:18.500" +"2019/05/25 04:28:19.000" "2019/05/25 04:28:19.500" +"2019/05/25 04:28:20.000" "2019/05/25 04:28:20.500" +"2019/05/25 04:28:21.000" "2019/05/25 04:28:21.500" +"2019/05/25 04:28:22.000" "2019/05/25 04:28:22.500" +"2019/05/25 04:28:23.000" "2019/05/25 04:28:23.500" +"2019/05/25 04:28:24.000" "2019/05/25 04:28:24.500" +"2019/05/25 04:28:25.000" "2019/05/25 04:28:25.500" +"2019/05/25 04:28:26.000" "2019/05/25 04:28:26.500" +"2019/05/25 04:28:27.000" "2019/05/25 04:28:27.500" +"2019/05/25 04:28:28.000" "2019/05/25 04:28:28.500" +"2019/05/25 04:28:29.000" "2019/05/25 04:28:29.500" +"2019/05/25 04:28:30.000" "2019/05/25 04:28:30.500" +"2019/05/25 04:28:31.000" "2019/05/25 04:28:31.500" +"2019/05/25 04:28:32.000" "2019/05/25 04:28:32.500" +"2019/05/25 04:28:33.000" "2019/05/25 04:28:33.500" +"2019/05/25 04:28:34.000" "2019/05/25 04:28:34.500" +"2019/05/25 04:28:35.000" "2019/05/25 04:28:35.500" +"2019/05/25 04:28:36.000" "2019/05/25 04:28:36.500" +"2019/05/25 04:28:37.000" "2019/05/25 04:28:37.500" +"2019/05/25 04:28:38.000" "2019/05/25 04:28:38.500" +"2019/05/25 04:28:39.000" "2019/05/25 04:28:39.500" +"2019/05/25 04:28:40.000" "2019/05/25 04:28:40.500" +"2019/05/25 04:28:41.000" "2019/05/25 04:28:41.500" +"2019/05/25 04:28:42.000" "2019/05/25 04:28:42.500" +"2019/05/25 04:28:43.000" "2019/05/25 04:28:43.500" +"2019/05/25 04:28:44.000" "2019/05/25 04:28:44.500" +"2019/05/25 04:28:45.000" "2019/05/25 04:28:45.500" +"2019/05/25 04:28:46.000" "2019/05/25 04:28:46.500" +"2019/05/25 04:28:47.000" "2019/05/25 04:28:47.500" +"2019/05/25 04:28:48.000" "2019/05/25 04:28:48.500" +"2019/05/25 04:28:49.000" "2019/05/25 04:28:49.500" +"2019/05/25 04:28:50.000" "2019/05/25 04:28:50.500" +"2019/05/25 04:28:51.000" "2019/05/25 04:28:51.500" +"2019/05/25 04:28:52.000" "2019/05/25 04:28:52.500" +"2019/05/25 04:28:53.000" "2019/05/25 04:28:53.500" +"2019/05/25 04:28:54.000" "2019/05/25 04:28:54.500" +"2019/05/25 04:28:55.000" "2019/05/25 04:28:55.500" +"2019/05/25 04:28:56.000" "2019/05/25 04:28:56.500" +"2019/05/25 04:28:57.000" "2019/05/25 04:28:57.500" +"2019/05/25 04:28:58.000" "2019/05/25 04:28:58.500" +"2019/05/25 04:28:59.000" "2019/05/25 04:28:59.500" +"2019/05/25 04:29:00.000" "2019/05/25 04:29:00.500" +"2019/05/25 04:29:01.000" "2019/05/25 04:29:01.500" +"2019/05/25 04:29:02.000" "2019/05/25 04:29:02.500" +"2019/05/25 04:29:03.000" "2019/05/25 04:29:03.500" +"2019/05/25 04:29:04.000" "2019/05/25 04:29:04.500" +"2019/05/25 04:29:05.000" "2019/05/25 04:29:05.500" +"2019/05/25 04:29:06.000" "2019/05/25 04:29:06.500" +"2019/05/25 04:29:07.000" "2019/05/25 04:29:07.500" +"2019/05/25 04:29:08.000" "2019/05/25 04:29:08.500" +"2019/05/25 04:29:09.000" "2019/05/25 04:29:09.500" +"2019/05/25 04:29:10.000" "2019/05/25 04:29:10.500" +"2019/05/25 04:29:11.000" "2019/05/25 04:29:11.500" +"2019/05/25 04:29:12.000" "2019/05/25 04:29:12.500" +"2019/05/25 04:29:13.000" "2019/05/25 04:29:13.500" +"2019/05/25 04:29:14.000" "2019/05/25 04:29:14.500" +"2019/05/25 04:29:15.000" "2019/05/25 04:29:15.500" +"2019/05/25 04:29:16.000" "2019/05/25 04:29:16.500" +"2019/05/25 04:29:17.000" "2019/05/25 04:29:17.500" +"2019/05/25 04:29:18.000" "2019/05/25 04:29:18.500" +"2019/05/25 04:29:19.000" "2019/05/25 04:29:19.500" +"2019/05/25 04:29:20.000" "2019/05/25 04:29:20.500" +"2019/05/25 04:29:21.000" "2019/05/25 04:29:21.500" +"2019/05/25 04:29:22.000" "2019/05/25 04:29:22.500" +"2019/05/25 04:29:23.000" "2019/05/25 04:29:23.500" +"2019/05/25 04:29:24.000" "2019/05/25 04:29:24.500" +"2019/05/25 04:29:25.000" "2019/05/25 04:29:25.500" +"2019/05/25 04:29:26.000" "2019/05/25 04:29:26.500" +"2019/05/25 04:29:27.000" "2019/05/25 04:29:27.500" +"2019/05/25 04:29:28.000" "2019/05/25 04:29:28.500" +"2019/05/25 04:29:29.000" "2019/05/25 04:29:29.500" +"2019/05/25 04:29:30.000" "2019/05/25 04:29:30.500" +"2019/05/25 04:29:31.000" "2019/05/25 04:29:31.500" +"2019/05/25 04:29:32.000" "2019/05/25 04:29:32.500" +"2019/05/25 04:29:33.000" "2019/05/25 04:29:33.500" +"2019/05/25 04:29:34.000" "2019/05/25 04:29:34.500" +"2019/05/25 04:29:35.000" "2019/05/25 04:29:35.500" +"2019/05/25 04:29:36.000" "2019/05/25 04:29:36.500" +"2019/05/25 04:29:37.000" "2019/05/25 04:29:37.500" +"2019/05/25 04:29:38.000" "2019/05/25 04:29:38.500" +"2019/05/25 04:29:39.000" "2019/05/25 04:29:39.500" +"2019/05/25 04:29:40.000" "2019/05/25 04:29:40.500" +"2019/05/25 04:29:41.000" "2019/05/25 04:29:41.500" +"2019/05/25 04:29:42.000" "2019/05/25 04:29:42.500" +"2019/05/25 04:29:43.000" "2019/05/25 04:29:43.500" +"2019/05/25 04:29:44.000" "2019/05/25 04:29:44.500" +"2019/05/25 04:29:45.000" "2019/05/25 04:29:45.500" +"2019/05/25 04:29:46.000" "2019/05/25 04:29:46.500" +"2019/05/25 04:29:47.000" "2019/05/25 04:29:47.500" +"2019/05/25 04:29:48.000" "2019/05/25 04:29:48.500" +"2019/05/25 04:29:49.000" "2019/05/25 04:29:49.500" +"2019/05/25 04:29:50.000" "2019/05/25 04:29:50.500" +"2019/05/25 04:29:51.000" "2019/05/25 04:29:51.500" +"2019/05/25 04:29:52.000" "2019/05/25 04:29:52.500" +"2019/05/25 04:29:54.000" "2019/05/25 04:29:54.500" +"2019/05/25 04:29:55.000" "2019/05/25 04:29:55.500" +"2019/05/25 04:29:56.000" "2019/05/25 04:29:56.500" +"2019/05/25 04:29:57.000" "2019/05/25 04:29:57.500" +"2019/05/25 04:29:58.000" "2019/05/25 04:29:58.500" +"2019/05/25 04:29:59.000" "2019/05/25 04:29:59.500" +"2019/05/25 04:30:00.000" "2019/05/25 04:30:00.500" +"2019/05/25 04:30:01.000" "2019/05/25 04:30:01.500" +"2019/05/25 04:30:02.000" "2019/05/25 04:30:02.500" +"2019/05/25 04:30:03.000" "2019/05/25 04:30:03.500" +"2019/05/25 04:30:04.000" "2019/05/25 04:30:04.500" +"2019/05/25 04:30:05.000" "2019/05/25 04:30:05.500" +"2019/05/25 04:30:06.000" "2019/05/25 04:30:06.500" +"2019/05/25 04:30:07.000" "2019/05/25 04:30:07.500" +"2019/05/25 04:30:08.000" "2019/05/25 04:30:08.500" +"2019/05/25 04:30:09.000" "2019/05/25 04:30:09.500" +"2019/05/25 04:30:10.000" "2019/05/25 04:30:10.500" +"2019/05/25 04:30:11.000" "2019/05/25 04:30:11.500" +"2019/05/25 04:30:12.000" "2019/05/25 04:30:12.500" +"2019/05/25 04:30:13.000" "2019/05/25 04:30:13.500" +"2019/05/25 04:30:14.000" "2019/05/25 04:30:14.500" +"2019/05/25 04:30:15.000" "2019/05/25 04:30:15.500" +"2019/05/25 04:30:16.000" "2019/05/25 04:30:16.500" +"2019/05/25 04:30:17.000" "2019/05/25 04:30:17.500" +"2019/05/25 04:30:18.000" "2019/05/25 04:30:18.500" +"2019/05/25 04:30:19.000" "2019/05/25 04:30:19.500" +"2019/05/25 04:30:20.000" "2019/05/25 04:30:20.500" +"2019/05/25 04:30:21.000" "2019/05/25 04:30:21.500" +"2019/05/25 04:30:22.000" "2019/05/25 04:30:22.500" +"2019/05/25 04:30:23.000" "2019/05/25 04:30:23.500" +"2019/05/25 04:30:24.000" "2019/05/25 04:30:24.500" +"2019/05/25 04:30:25.000" "2019/05/25 04:30:25.500" +"2019/05/25 04:30:27.000" "2019/05/25 04:30:27.500" +"2019/05/25 04:30:28.000" "2019/05/25 04:30:28.500" +"2019/05/25 04:30:29.000" "2019/05/25 04:30:29.500" +"2019/05/25 04:30:30.000" "2019/05/25 04:30:30.500" +"2019/05/25 04:30:31.000" "2019/05/25 04:30:31.500" +"2019/05/25 04:30:32.000" "2019/05/25 04:30:32.500" +"2019/05/25 04:30:33.000" "2019/05/25 04:30:33.500" +"2019/05/25 04:30:34.000" "2019/05/25 04:30:34.500" +"2019/05/25 04:30:35.000" "2019/05/25 04:30:35.500" +"2019/05/25 04:30:36.000" "2019/05/25 04:30:36.500" +"2019/05/25 04:30:37.000" "2019/05/25 04:30:37.500" +"2019/05/25 04:30:38.000" "2019/05/25 04:30:38.500" +"2019/05/25 04:30:39.000" "2019/05/25 04:30:39.500" +"2019/05/25 04:30:40.000" "2019/05/25 04:30:40.500" +"2019/05/25 04:30:41.000" "2019/05/25 04:30:41.500" +"2019/05/25 04:30:42.000" "2019/05/25 04:30:42.500" +"2019/05/25 04:30:43.000" "2019/05/25 04:30:43.500" +"2019/05/25 04:30:44.000" "2019/05/25 04:30:44.500" +"2019/05/25 04:30:45.000" "2019/05/25 04:30:45.500" +"2019/05/25 04:30:46.000" "2019/05/25 04:30:46.500" +"2019/05/25 04:30:47.000" "2019/05/25 04:30:47.500" +"2019/05/25 04:30:48.000" "2019/05/25 04:30:48.500" +"2019/05/25 04:30:49.000" "2019/05/25 04:30:49.500" +"2019/05/25 04:30:50.000" "2019/05/25 04:30:50.500" +"2019/05/25 04:30:51.000" "2019/05/25 04:30:51.500" +"2019/05/25 04:30:52.000" "2019/05/25 04:30:52.500" +"2019/05/25 04:30:53.000" "2019/05/25 04:30:53.500" +"2019/05/25 04:30:54.000" "2019/05/25 04:30:54.500" +"2019/05/25 04:30:55.000" "2019/05/25 04:30:55.500" +"2019/05/25 04:30:56.000" "2019/05/25 04:30:56.500" +"2019/05/25 04:30:57.000" "2019/05/25 04:30:57.500" +"2019/05/25 04:30:58.000" "2019/05/25 04:30:58.500" +"2019/05/25 04:30:59.000" "2019/05/25 04:30:59.500" +"2019/05/25 04:31:00.000" "2019/05/25 04:31:00.500" +"2019/05/25 04:31:01.000" "2019/05/25 04:31:01.500" +"2019/05/25 04:31:02.000" "2019/05/25 04:31:02.500" +"2019/05/25 04:31:03.000" "2019/05/25 04:31:03.500" +"2019/05/25 04:31:04.000" "2019/05/25 04:31:04.500" +"2019/05/25 04:31:05.000" "2019/05/25 04:31:05.500" +"2019/05/25 04:31:06.000" "2019/05/25 04:31:06.500" +"2019/05/25 04:31:07.000" "2019/05/25 04:31:07.500" +"2019/05/25 04:31:08.000" "2019/05/25 04:31:08.500" +"2019/05/25 04:31:09.000" "2019/05/25 04:31:09.500" +"2019/05/25 04:31:10.000" "2019/05/25 04:31:10.500" +"2019/05/25 04:31:11.000" "2019/05/25 04:31:11.500" +"2019/05/25 04:31:12.000" "2019/05/25 04:31:12.500" +"2019/05/25 04:31:13.000" "2019/05/25 04:31:13.500" +"2019/05/25 04:31:14.000" "2019/05/25 04:31:14.500" +"2019/05/25 04:31:15.000" "2019/05/25 04:31:15.500" +"2019/05/25 04:31:16.000" "2019/05/25 04:31:16.500" +"2019/05/25 04:31:17.000" "2019/05/25 04:31:17.500" +"2019/05/25 04:31:18.000" "2019/05/25 04:31:18.500" +"2019/05/25 04:31:19.000" "2019/05/25 04:31:19.500" +"2019/05/25 04:31:20.000" "2019/05/25 04:31:20.500" +"2019/05/25 04:31:21.000" "2019/05/25 04:31:21.500" +"2019/05/25 04:31:22.000" "2019/05/25 04:31:22.500" +"2019/05/25 04:31:23.000" "2019/05/25 04:31:23.500" +"2019/05/25 04:31:24.000" "2019/05/25 04:31:24.500" +"2019/05/25 04:31:25.000" "2019/05/25 04:31:25.500" +"2019/05/25 04:31:26.000" "2019/05/25 04:31:26.500" +"2019/05/25 04:31:27.000" "2019/05/25 04:31:27.500" +"2019/05/25 04:31:28.000" "2019/05/25 04:31:28.500" +"2019/05/25 04:31:29.000" "2019/05/25 04:31:29.500" +"2019/05/25 04:31:30.000" "2019/05/25 04:31:30.500" +"2019/05/25 04:31:31.000" "2019/05/25 04:31:31.500" +"2019/05/25 04:31:32.000" "2019/05/25 04:31:32.500" +"2019/05/25 04:31:33.000" "2019/05/25 04:31:33.500" +"2019/05/25 04:31:34.000" "2019/05/25 04:31:34.500" +"2019/05/25 04:31:35.000" "2019/05/25 04:31:35.500" +"2019/05/25 04:31:36.000" "2019/05/25 04:31:36.500" +"2019/05/25 04:31:37.000" "2019/05/25 04:31:37.500" +"2019/05/25 04:31:38.000" "2019/05/25 04:31:38.500" +"2019/05/25 04:31:39.000" "2019/05/25 04:31:39.500" +"2019/05/25 04:31:40.000" "2019/05/25 04:31:40.500" +"2019/05/25 04:31:41.000" "2019/05/25 04:31:41.500" +"2019/05/25 04:31:42.000" "2019/05/25 04:31:42.500" +"2019/05/25 04:31:43.000" "2019/05/25 04:31:43.500" +"2019/05/25 04:31:44.000" "2019/05/25 04:31:44.500" +"2019/05/25 04:31:45.000" "2019/05/25 04:31:45.500" +"2019/05/25 04:31:46.000" "2019/05/25 04:31:46.500" +"2019/05/25 04:31:47.000" "2019/05/25 04:31:47.500" +"2019/05/25 04:31:48.000" "2019/05/25 04:31:48.500" +"2019/05/25 04:31:49.000" "2019/05/25 04:31:49.500" +"2019/05/25 04:31:50.000" "2019/05/25 04:31:50.500" +"2019/05/25 04:31:51.000" "2019/05/25 04:31:51.500" +"2019/05/25 04:31:52.000" "2019/05/25 04:31:52.500" +"2019/05/25 04:31:53.000" "2019/05/25 04:31:53.500" +"2019/05/25 04:31:54.000" "2019/05/25 04:31:54.500" +"2019/05/25 04:31:55.000" "2019/05/25 04:31:55.500" +"2019/05/25 04:31:56.000" "2019/05/25 04:31:56.500" +"2019/05/25 04:31:57.000" "2019/05/25 04:31:57.500" +"2019/05/25 04:31:58.000" "2019/05/25 04:31:58.500" +"2019/05/25 04:31:59.000" "2019/05/25 04:31:59.500" +"2019/05/25 04:32:00.000" "2019/05/25 04:32:00.500" +"2019/05/25 04:32:02.000" "2019/05/25 04:32:02.500" +"2019/05/25 04:32:03.000" "2019/05/25 04:32:03.500" +"2019/05/25 04:32:04.000" "2019/05/25 04:32:04.500" +"2019/05/25 04:32:05.000" "2019/05/25 04:32:05.500" +"2019/05/25 04:32:06.000" "2019/05/25 04:32:06.500" +"2019/05/25 04:32:07.000" "2019/05/25 04:32:07.500" +"2019/05/25 04:32:08.000" "2019/05/25 04:32:08.500" +"2019/05/25 04:32:09.000" "2019/05/25 04:32:09.500" +"2019/05/25 04:32:10.000" "2019/05/25 04:32:10.500" +"2019/05/25 04:32:11.000" "2019/05/25 04:32:11.500" +"2019/05/25 04:32:12.000" "2019/05/25 04:32:12.500" +"2019/05/25 04:32:13.000" "2019/05/25 04:32:13.500" +"2019/05/25 04:32:14.000" "2019/05/25 04:32:14.500" +"2019/05/25 04:32:15.000" "2019/05/25 04:32:15.500" +"2019/05/25 04:32:16.000" "2019/05/25 04:32:16.500" +"2019/05/25 04:32:17.000" "2019/05/25 04:32:17.500" +"2019/05/25 04:32:18.000" "2019/05/25 04:32:18.500" +"2019/05/25 04:32:19.000" "2019/05/25 04:32:19.500" +"2019/05/25 04:32:20.000" "2019/05/25 04:32:20.500" +"2019/05/25 04:32:21.000" "2019/05/25 04:32:21.500" +"2019/05/25 04:32:22.000" "2019/05/25 04:32:22.500" +"2019/05/25 04:32:23.000" "2019/05/25 04:32:23.500" +"2019/05/25 04:32:24.000" "2019/05/25 04:32:24.500" +"2019/05/25 04:32:25.000" "2019/05/25 04:32:25.500" +"2019/05/25 04:32:26.000" "2019/05/25 04:32:26.500" +"2019/05/25 04:32:27.000" "2019/05/25 04:32:27.500" +"2019/05/25 04:32:28.000" "2019/05/25 04:32:28.500" +"2019/05/25 04:32:29.000" "2019/05/25 04:32:29.500" +"2019/05/25 04:32:30.000" "2019/05/25 04:32:30.500" +"2019/05/25 04:32:31.000" "2019/05/25 04:32:31.500" +"2019/05/25 04:32:32.000" "2019/05/25 04:32:32.500" +"2019/05/25 04:32:33.000" "2019/05/25 04:32:33.500" +"2019/05/25 04:32:34.000" "2019/05/25 04:32:34.500" +"2019/05/25 04:32:35.000" "2019/05/25 04:32:35.500" +"2019/05/25 04:32:37.000" "2019/05/25 04:32:37.500" +"2019/05/25 04:32:38.000" "2019/05/25 04:32:38.500" +"2019/05/25 04:32:39.000" "2019/05/25 04:32:39.500" +"2019/05/25 04:32:40.000" "2019/05/25 04:32:40.500" +"2019/05/25 04:32:41.000" "2019/05/25 04:32:41.500" +"2019/05/25 04:32:42.000" "2019/05/25 04:32:42.500" +"2019/05/25 04:32:43.000" "2019/05/25 04:32:43.500" +"2019/05/25 04:32:44.000" "2019/05/25 04:32:44.500" +"2019/05/25 04:32:45.000" "2019/05/25 04:32:45.500" +"2019/05/25 04:32:46.000" "2019/05/25 04:32:46.500" +"2019/05/25 04:32:47.000" "2019/05/25 04:32:47.500" +"2019/05/25 04:32:48.000" "2019/05/25 04:32:48.500" +"2019/05/25 04:32:49.000" "2019/05/25 04:32:49.500" +"2019/05/25 04:32:50.000" "2019/05/25 04:32:50.500" +"2019/05/25 04:32:51.000" "2019/05/25 04:32:51.500" +"2019/05/25 04:32:52.000" "2019/05/25 04:32:52.500" +"2019/05/25 04:32:53.000" "2019/05/25 04:32:53.500" +"2019/05/25 04:32:54.000" "2019/05/25 04:32:54.500" +"2019/05/25 04:32:55.000" "2019/05/25 04:32:55.500" +"2019/05/25 04:32:56.000" "2019/05/25 04:32:56.500" +"2019/05/25 04:32:57.000" "2019/05/25 04:32:57.500" +"2019/05/25 04:32:58.000" "2019/05/25 04:32:58.500" +"2019/05/25 04:32:59.000" "2019/05/25 04:32:59.500" +"2019/05/25 04:33:00.000" "2019/05/25 04:33:00.500" +"2019/05/25 04:33:01.000" "2019/05/25 04:33:01.500" +"2019/05/25 04:33:02.000" "2019/05/25 04:33:02.500" +"2019/05/25 04:33:03.000" "2019/05/25 04:33:03.500" +"2019/05/25 04:33:04.000" "2019/05/25 04:33:04.500" +"2019/05/25 04:33:05.000" "2019/05/25 04:33:05.500" +"2019/05/25 04:33:06.000" "2019/05/25 04:33:06.500" +"2019/05/25 04:33:07.000" "2019/05/25 04:33:07.500" +"2019/05/25 04:33:08.000" "2019/05/25 04:33:08.500" +"2019/05/25 04:33:09.000" "2019/05/25 04:33:09.500" +"2019/05/25 04:33:10.000" "2019/05/25 04:33:10.500" +"2019/05/25 04:33:11.000" "2019/05/25 04:33:11.500" +"2019/05/25 04:33:12.000" "2019/05/25 04:33:12.500" +"2019/05/25 04:33:13.000" "2019/05/25 04:33:13.500" +"2019/05/25 04:33:14.000" "2019/05/25 04:33:14.500" +"2019/05/25 04:33:15.000" "2019/05/25 04:33:15.500" +"2019/05/25 04:33:16.000" "2019/05/25 04:33:16.500" +"2019/05/25 04:33:17.000" "2019/05/25 04:33:17.500" +"2019/05/25 04:33:18.000" "2019/05/25 04:33:18.500" +"2019/05/25 04:33:19.000" "2019/05/25 04:33:19.500" +"2019/05/25 04:33:20.000" "2019/05/25 04:33:20.500" +"2019/05/25 04:33:21.000" "2019/05/25 04:33:21.500" +"2019/05/25 04:33:22.000" "2019/05/25 04:33:22.500" +"2019/05/25 04:33:23.000" "2019/05/25 04:33:23.500" +"2019/05/25 04:33:24.000" "2019/05/25 04:33:24.500" +"2019/05/25 04:33:25.000" "2019/05/25 04:33:25.500" +"2019/05/25 04:33:26.000" "2019/05/25 04:33:26.500" +"2019/05/25 04:33:27.000" "2019/05/25 04:33:27.500" +"2019/05/25 04:33:28.000" "2019/05/25 04:33:28.500" +"2019/05/25 04:33:29.000" "2019/05/25 04:33:29.500" +"2019/05/25 04:33:30.000" "2019/05/25 04:33:30.500" +"2019/05/25 04:33:31.000" "2019/05/25 04:33:31.500" +"2019/05/25 04:33:32.000" "2019/05/25 04:33:32.500" +"2019/05/25 04:33:33.000" "2019/05/25 04:33:33.500" +"2019/05/25 04:33:34.000" "2019/05/25 04:33:34.500" +"2019/05/25 04:33:35.000" "2019/05/25 04:33:35.500" +"2019/05/25 04:33:36.000" "2019/05/25 04:33:36.500" +"2019/05/25 04:33:37.000" "2019/05/25 04:33:37.500" +"2019/05/25 04:33:38.000" "2019/05/25 04:33:38.500" +"2019/05/25 04:33:39.000" "2019/05/25 04:33:39.500" +"2019/05/25 04:33:40.000" "2019/05/25 04:33:40.500" +"2019/05/25 04:33:41.000" "2019/05/25 04:33:41.500" +"2019/05/25 04:33:42.000" "2019/05/25 04:33:42.500" +"2019/05/25 04:33:43.000" "2019/05/25 04:33:43.500" +"2019/05/25 04:33:44.000" "2019/05/25 04:33:44.500" +"2019/05/25 04:33:45.000" "2019/05/25 04:33:45.500" +"2019/05/25 04:33:46.000" "2019/05/25 04:33:46.500" +"2019/05/25 04:33:47.000" "2019/05/25 04:33:47.500" +"2019/05/25 04:33:48.000" "2019/05/25 04:33:48.500" +"2019/05/25 04:33:49.000" "2019/05/25 04:33:49.500" +"2019/05/25 04:33:50.000" "2019/05/25 04:33:50.500" +"2019/05/25 04:33:51.000" "2019/05/25 04:33:51.500" +"2019/05/25 04:33:52.000" "2019/05/25 04:33:52.500" +"2019/05/25 04:33:53.000" "2019/05/25 04:33:53.500" +"2019/05/25 04:33:54.000" "2019/05/25 04:33:54.500" +"2019/05/25 04:33:55.000" "2019/05/25 04:33:55.500" +"2019/05/25 04:33:56.000" "2019/05/25 04:33:56.500" +"2019/05/25 04:33:57.000" "2019/05/25 04:33:57.500" +"2019/05/25 04:33:58.000" "2019/05/25 04:33:58.500" +"2019/05/25 04:33:59.000" "2019/05/25 04:33:59.500" +"2019/05/25 04:34:00.000" "2019/05/25 04:34:00.500" +"2019/05/25 04:34:01.000" "2019/05/25 04:34:01.500" +"2019/05/25 04:34:02.000" "2019/05/25 04:34:02.500" +"2019/05/25 04:34:03.000" "2019/05/25 04:34:03.500" +"2019/05/25 04:34:04.000" "2019/05/25 04:34:04.500" +"2019/05/25 04:34:05.000" "2019/05/25 04:34:05.500" +"2019/05/25 04:34:06.000" "2019/05/25 04:34:06.500" +"2019/05/25 04:34:07.000" "2019/05/25 04:34:07.500" +"2019/05/25 04:34:08.000" "2019/05/25 04:34:08.500" +"2019/05/25 04:34:09.000" "2019/05/25 04:34:09.500" +"2019/05/25 04:34:10.000" "2019/05/25 04:34:10.500" +"2019/05/25 04:34:11.000" "2019/05/25 04:34:11.500" +"2019/05/25 04:34:12.000" "2019/05/25 04:34:12.500" +"2019/05/25 04:34:14.000" "2019/05/25 04:34:14.500" +"2019/05/25 04:34:15.000" "2019/05/25 04:34:15.500" +"2019/05/25 04:34:16.000" "2019/05/25 04:34:16.500" +"2019/05/25 04:34:17.000" "2019/05/25 04:34:17.500" +"2019/05/25 04:34:18.000" "2019/05/25 04:34:18.500" +"2019/05/25 04:34:19.000" "2019/05/25 04:34:19.500" +"2019/05/25 04:34:20.000" "2019/05/25 04:34:20.500" +"2019/05/25 04:34:21.000" "2019/05/25 04:34:21.500" +"2019/05/25 04:34:22.000" "2019/05/25 04:34:22.500" +"2019/05/25 04:34:23.000" "2019/05/25 04:34:23.500" +"2019/05/25 04:34:24.000" "2019/05/25 04:34:24.500" +"2019/05/25 04:34:25.000" "2019/05/25 04:34:25.500" +"2019/05/25 04:34:26.000" "2019/05/25 04:34:26.500" +"2019/05/25 04:34:27.000" "2019/05/25 04:34:27.500" +"2019/05/25 04:34:28.000" "2019/05/25 04:34:28.500" +"2019/05/25 04:34:29.000" "2019/05/25 04:34:29.500" +"2019/05/25 04:34:30.000" "2019/05/25 04:34:30.500" +"2019/05/25 04:34:31.000" "2019/05/25 04:34:31.500" +"2019/05/25 04:34:32.000" "2019/05/25 04:34:32.500" +"2019/05/25 04:34:33.000" "2019/05/25 04:34:33.500" +"2019/05/25 04:34:34.000" "2019/05/25 04:34:34.500" +"2019/05/25 04:34:35.000" "2019/05/25 04:34:35.500" +"2019/05/25 04:34:36.000" "2019/05/25 04:34:36.500" +"2019/05/25 04:34:37.000" "2019/05/25 04:34:37.500" +"2019/05/25 04:34:38.000" "2019/05/25 04:34:38.500" +"2019/05/25 04:34:39.000" "2019/05/25 04:34:39.500" +"2019/05/25 04:34:40.000" "2019/05/25 04:34:40.500" +"2019/05/25 04:34:41.000" "2019/05/25 04:34:41.500" +"2019/05/25 04:34:42.000" "2019/05/25 04:34:42.500" +"2019/05/25 04:34:43.000" "2019/05/25 04:34:43.500" +"2019/05/25 04:34:45.000" "2019/05/25 04:34:45.500" +"2019/05/25 04:34:46.000" "2019/05/25 04:34:46.500" +"2019/05/25 04:34:47.000" "2019/05/25 04:34:47.500" +"2019/05/25 04:34:48.000" "2019/05/25 04:34:48.500" +"2019/05/25 04:34:49.000" "2019/05/25 04:34:49.500" +"2019/05/25 04:34:50.000" "2019/05/25 04:34:50.500" +"2019/05/25 04:34:51.000" "2019/05/25 04:34:51.500" +"2019/05/25 04:34:52.000" "2019/05/25 04:34:52.500" +"2019/05/25 04:34:53.000" "2019/05/25 04:34:53.500" +"2019/05/25 04:34:54.000" "2019/05/25 04:34:54.500" +"2019/05/25 04:34:55.000" "2019/05/25 04:34:55.500" +"2019/05/25 04:34:56.000" "2019/05/25 04:34:56.500" +"2019/05/25 04:34:57.000" "2019/05/25 04:34:57.500" +"2019/05/25 04:34:58.000" "2019/05/25 04:34:58.500" +"2019/05/25 04:34:59.000" "2019/05/25 04:34:59.500" +"2019/05/25 04:35:00.000" "2019/05/25 04:35:00.500" +"2019/05/25 04:35:01.000" "2019/05/25 04:35:01.500" +"2019/05/25 04:35:02.000" "2019/05/25 04:35:02.500" +"2019/05/25 04:35:03.000" "2019/05/25 04:35:03.500" +"2019/05/25 04:35:04.000" "2019/05/25 04:35:04.500" +"2019/05/25 04:35:05.000" "2019/05/25 04:35:05.500" +"2019/05/25 04:35:06.000" "2019/05/25 04:35:06.500" +"2019/05/25 04:35:07.000" "2019/05/25 04:35:07.500" +"2019/05/25 04:35:08.000" "2019/05/25 04:35:08.500" +"2019/05/25 04:35:09.000" "2019/05/25 04:35:09.500" +"2019/05/25 04:35:10.000" "2019/05/25 04:35:10.500" +"2019/05/25 04:35:11.000" "2019/05/25 04:35:11.500" +"2019/05/25 04:35:12.000" "2019/05/25 04:35:12.500" +"2019/05/25 04:35:13.000" "2019/05/25 04:35:13.500" +"2019/05/25 04:35:14.000" "2019/05/25 04:35:14.500" +"2019/05/25 04:35:15.000" "2019/05/25 04:35:15.500" +"2019/05/25 04:35:16.000" "2019/05/25 04:35:16.500" +"2019/05/25 04:35:17.000" "2019/05/25 04:35:17.500" +"2019/05/25 04:35:18.000" "2019/05/25 04:35:18.500" +"2019/05/25 04:35:19.000" "2019/05/25 04:35:19.500" +"2019/05/25 04:35:20.000" "2019/05/25 04:35:20.500" +"2019/05/25 04:35:21.000" "2019/05/25 04:35:21.500" +"2019/05/25 04:35:22.000" "2019/05/25 04:35:22.500" +"2019/05/25 04:35:23.000" "2019/05/25 04:35:23.500" +"2019/05/25 04:35:24.000" "2019/05/25 04:35:24.500" +"2019/05/25 04:35:25.000" "2019/05/25 04:35:25.500" +"2019/05/25 04:35:26.000" "2019/05/25 04:35:26.500" +"2019/05/25 04:35:27.000" "2019/05/25 04:35:27.500" +"2019/05/25 04:35:28.000" "2019/05/25 04:35:28.500" +"2019/05/25 04:35:29.000" "2019/05/25 04:35:29.500" +"2019/05/25 04:35:30.000" "2019/05/25 04:35:30.500" +"2019/05/25 04:35:31.000" "2019/05/25 04:35:31.500" +"2019/05/25 04:35:32.000" "2019/05/25 04:35:32.500" +"2019/05/25 04:35:33.000" "2019/05/25 04:35:33.500" +"2019/05/25 04:35:34.000" "2019/05/25 04:35:34.500" +"2019/05/25 04:35:35.000" "2019/05/25 04:35:35.500" +"2019/05/25 04:35:36.000" "2019/05/25 04:35:36.500" +"2019/05/25 04:35:37.000" "2019/05/25 04:35:37.500" +"2019/05/25 04:35:38.000" "2019/05/25 04:35:38.500" +"2019/05/25 04:35:39.000" "2019/05/25 04:35:39.500" +"2019/05/25 04:35:40.000" "2019/05/25 04:35:40.500" +"2019/05/25 04:35:41.000" "2019/05/25 04:35:41.500" +"2019/05/25 04:35:42.000" "2019/05/25 04:35:42.500" +"2019/05/25 04:35:43.000" "2019/05/25 04:35:43.500" +"2019/05/25 04:35:44.000" "2019/05/25 04:35:44.500" +"2019/05/25 04:35:45.000" "2019/05/25 04:35:45.500" +"2019/05/25 04:35:46.000" "2019/05/25 04:35:46.500" +"2019/05/25 04:35:47.000" "2019/05/25 04:35:47.500" +"2019/05/25 04:35:48.000" "2019/05/25 04:35:48.500" +"2019/05/25 04:35:49.000" "2019/05/25 04:35:49.500" +"2019/05/25 04:35:50.000" "2019/05/25 04:35:50.500" +"2019/05/25 04:35:51.000" "2019/05/25 04:35:51.500" +"2019/05/25 04:35:52.000" "2019/05/25 04:35:52.500" +"2019/05/25 04:35:53.000" "2019/05/25 04:35:53.500" +"2019/05/25 04:35:54.000" "2019/05/25 04:35:54.500" +"2019/05/25 04:35:55.000" "2019/05/25 04:35:55.500" +"2019/05/25 04:35:56.000" "2019/05/25 04:35:56.500" +"2019/05/25 04:35:57.000" "2019/05/25 04:35:57.500" +"2019/05/25 04:35:58.000" "2019/05/25 04:35:58.500" +"2019/05/25 04:35:59.000" "2019/05/25 04:35:59.500" +"2019/05/25 04:36:00.000" "2019/05/25 04:36:00.500" +"2019/05/25 04:36:01.000" "2019/05/25 04:36:01.500" +"2019/05/25 04:36:02.000" "2019/05/25 04:36:02.500" +"2019/05/25 04:36:03.000" "2019/05/25 04:36:03.500" +"2019/05/25 04:36:04.000" "2019/05/25 04:36:04.500" +"2019/05/25 04:36:05.000" "2019/05/25 04:36:05.500" +"2019/05/25 04:36:06.000" "2019/05/25 04:36:06.500" +"2019/05/25 04:36:07.000" "2019/05/25 04:36:07.500" +"2019/05/25 04:36:08.000" "2019/05/25 04:36:08.500" +"2019/05/25 04:36:09.000" "2019/05/25 04:36:09.500" +"2019/05/25 04:36:10.000" "2019/05/25 04:36:10.500" +"2019/05/25 04:36:12.000" "2019/05/25 04:36:12.500" +"2019/05/25 04:36:13.000" "2019/05/25 04:36:13.500" +"2019/05/25 04:36:14.000" "2019/05/25 04:36:14.500" +"2019/05/25 04:36:15.000" "2019/05/25 04:36:15.500" +"2019/05/25 04:36:16.000" "2019/05/25 04:36:16.500" +"2019/05/25 04:36:17.000" "2019/05/25 04:36:17.500" +"2019/05/25 04:36:18.000" "2019/05/25 04:36:18.500" +"2019/05/25 04:36:19.000" "2019/05/25 04:36:19.500" +"2019/05/25 04:36:20.000" "2019/05/25 04:36:20.500" +"2019/05/25 04:36:21.000" "2019/05/25 04:36:21.500" +"2019/05/25 04:36:22.000" "2019/05/25 04:36:22.500" +"2019/05/25 04:36:23.000" "2019/05/25 04:36:23.500" +"2019/05/25 04:36:24.000" "2019/05/25 04:36:24.500" +"2019/05/25 04:36:25.000" "2019/05/25 04:36:25.500" +"2019/05/25 04:36:26.000" "2019/05/25 04:36:26.500" +"2019/05/25 04:36:27.000" "2019/05/25 04:36:27.500" +"2019/05/25 04:36:28.000" "2019/05/25 04:36:28.500" +"2019/05/25 04:36:29.000" "2019/05/25 04:36:29.500" +"2019/05/25 04:36:30.000" "2019/05/25 04:36:30.500" +"2019/05/25 04:36:31.000" "2019/05/25 04:36:31.500" +"2019/05/25 04:36:32.000" "2019/05/25 04:36:32.500" +"2019/05/25 04:36:33.000" "2019/05/25 04:36:33.500" +"2019/05/25 04:36:34.000" "2019/05/25 04:36:34.500" +"2019/05/25 04:36:35.000" "2019/05/25 04:36:35.500" +"2019/05/25 04:36:36.000" "2019/05/25 04:36:36.500" +"2019/05/25 04:36:37.000" "2019/05/25 04:36:37.500" +"2019/05/25 04:36:38.000" "2019/05/25 04:36:38.500" +"2019/05/25 04:36:39.000" "2019/05/25 04:36:39.500" +"2019/05/25 04:36:40.000" "2019/05/25 04:36:40.500" +"2019/05/25 04:36:41.000" "2019/05/25 04:36:41.500" +"2019/05/25 04:36:42.000" "2019/05/25 04:36:42.500" +"2019/05/25 04:36:43.000" "2019/05/25 04:36:43.500" +"2019/05/25 04:36:44.000" "2019/05/25 04:36:44.500" +"2019/05/25 04:36:45.000" "2019/05/25 04:36:45.500" +"2019/05/25 04:36:46.000" "2019/05/25 04:36:46.500" +"2019/05/25 04:36:47.000" "2019/05/25 04:36:47.500" +"2019/05/25 04:36:48.000" "2019/05/25 04:36:48.500" +"2019/05/25 04:36:49.000" "2019/05/25 04:36:49.500" +"2019/05/25 04:36:50.000" "2019/05/25 04:36:50.500" +"2019/05/25 04:36:52.000" "2019/05/25 04:36:52.500" +"2019/05/25 04:36:53.000" "2019/05/25 04:36:53.500" +"2019/05/25 04:36:54.000" "2019/05/25 04:36:54.500" +"2019/05/25 04:36:55.000" "2019/05/25 04:36:55.500" +"2019/05/25 04:36:56.000" "2019/05/25 04:36:56.500" +"2019/05/25 04:36:57.000" "2019/05/25 04:36:57.500" +"2019/05/25 04:36:58.000" "2019/05/25 04:36:58.500" +"2019/05/25 04:36:59.000" "2019/05/25 04:36:59.500" +"2019/05/25 04:37:00.000" "2019/05/25 04:37:00.500" +"2019/05/25 04:37:01.000" "2019/05/25 04:37:01.500" +"2019/05/25 04:37:02.000" "2019/05/25 04:37:02.500" +"2019/05/25 04:37:03.000" "2019/05/25 04:37:03.500" +"2019/05/25 04:37:04.000" "2019/05/25 04:37:04.500" +"2019/05/25 04:37:05.000" "2019/05/25 04:37:05.500" +"2019/05/25 04:37:06.000" "2019/05/25 04:37:06.500" +"2019/05/25 04:37:07.000" "2019/05/25 04:37:07.500" +"2019/05/25 04:37:08.000" "2019/05/25 04:37:08.500" +"2019/05/25 04:37:09.000" "2019/05/25 04:37:09.500" +"2019/05/25 04:37:10.000" "2019/05/25 04:37:10.500" +"2019/05/25 04:37:11.000" "2019/05/25 04:37:11.500" +"2019/05/25 04:37:12.000" "2019/05/25 04:37:12.500" +"2019/05/25 04:37:13.000" "2019/05/25 04:37:13.500" +"2019/05/25 04:37:14.000" "2019/05/25 04:37:14.500" +"2019/05/25 04:37:15.000" "2019/05/25 04:37:15.500" +"2019/05/25 04:37:16.000" "2019/05/25 04:37:16.500" +"2019/05/25 04:37:17.000" "2019/05/25 04:37:17.500" +"2019/05/25 04:37:18.000" "2019/05/25 04:37:18.500" +"2019/05/25 04:37:19.000" "2019/05/25 04:37:19.500" +"2019/05/25 04:37:20.000" "2019/05/25 04:37:20.500" +"2019/05/25 04:37:21.000" "2019/05/25 04:37:21.500" +"2019/05/25 04:37:22.000" "2019/05/25 04:37:22.500" +"2019/05/25 04:37:23.000" "2019/05/25 04:37:23.500" +"2019/05/25 04:37:24.000" "2019/05/25 04:37:24.500" +"2019/05/25 04:37:25.000" "2019/05/25 04:37:25.500" +"2019/05/25 04:37:26.000" "2019/05/25 04:37:26.500" +"2019/05/25 04:37:27.000" "2019/05/25 04:37:27.500" +"2019/05/25 04:37:28.000" "2019/05/25 04:37:28.500" +"2019/05/25 04:37:29.000" "2019/05/25 04:37:29.500" +"2019/05/25 04:37:30.000" "2019/05/25 04:37:30.500" +"2019/05/25 04:37:31.000" "2019/05/25 04:37:31.500" +"2019/05/25 04:37:32.000" "2019/05/25 04:37:32.500" +"2019/05/25 04:37:33.000" "2019/05/25 04:37:33.500" +"2019/05/25 04:37:34.000" "2019/05/25 04:37:34.500" +"2019/05/25 04:37:35.000" "2019/05/25 04:37:35.500" +"2019/05/25 04:37:36.000" "2019/05/25 04:37:36.500" +"2019/05/25 04:37:37.000" "2019/05/25 04:37:37.500" +"2019/05/25 04:37:38.000" "2019/05/25 04:37:38.500" +"2019/05/25 04:37:39.000" "2019/05/25 04:37:39.500" +"2019/05/25 04:37:40.000" "2019/05/25 04:37:40.500" +"2019/05/25 04:37:41.000" "2019/05/25 04:37:41.500" +"2019/05/25 04:37:42.000" "2019/05/25 04:37:42.500" +"2019/05/25 04:37:43.000" "2019/05/25 04:37:43.500" +"2019/05/25 04:37:44.000" "2019/05/25 04:37:44.500" +"2019/05/25 04:37:45.000" "2019/05/25 04:37:45.500" +"2019/05/25 04:37:46.000" "2019/05/25 04:37:46.500" +"2019/05/25 04:37:47.000" "2019/05/25 04:37:47.500" +"2019/05/25 04:37:48.000" "2019/05/25 04:37:48.500" +"2019/05/25 04:37:49.000" "2019/05/25 04:37:49.500" +"2019/05/25 04:37:50.000" "2019/05/25 04:37:50.500" +"2019/05/25 04:37:51.000" "2019/05/25 04:37:51.500" +"2019/05/25 04:37:52.000" "2019/05/25 04:37:52.500" +"2019/05/25 04:37:53.000" "2019/05/25 04:37:53.500" +"2019/05/25 04:37:54.000" "2019/05/25 04:37:54.500" +"2019/05/25 04:37:55.000" "2019/05/25 04:37:55.500" +"2019/05/25 04:37:56.000" "2019/05/25 04:37:56.500" +"2019/05/25 04:37:57.000" "2019/05/25 04:37:57.500" +"2019/05/25 04:37:58.000" "2019/05/25 04:37:58.500" +"2019/05/25 04:37:59.000" "2019/05/25 04:37:59.500" +"2019/05/25 04:38:00.000" "2019/05/25 04:38:00.500" +"2019/05/25 04:38:01.000" "2019/05/25 04:38:01.500" +"2019/05/25 04:38:02.000" "2019/05/25 04:38:02.500" +"2019/05/25 04:38:03.000" "2019/05/25 04:38:03.500" +"2019/05/25 04:38:04.000" "2019/05/25 04:38:04.500" +"2019/05/25 04:38:05.000" "2019/05/25 04:38:05.500" +"2019/05/25 04:38:06.000" "2019/05/25 04:38:06.500" +"2019/05/25 04:38:07.000" "2019/05/25 04:38:07.500" +"2019/05/25 04:38:08.000" "2019/05/25 04:38:08.500" +"2019/05/25 04:38:09.000" "2019/05/25 04:38:09.500" +"2019/05/25 04:38:10.000" "2019/05/25 04:38:10.500" +"2019/05/25 04:38:11.000" "2019/05/25 04:38:11.500" +"2019/05/25 04:38:12.000" "2019/05/25 04:38:12.500" +"2019/05/25 04:38:13.000" "2019/05/25 04:38:13.500" +"2019/05/25 04:38:14.000" "2019/05/25 04:38:14.500" +"2019/05/25 04:38:16.000" "2019/05/25 04:38:16.500" +"2019/05/25 04:38:17.000" "2019/05/25 04:38:17.500" +"2019/05/25 04:38:18.000" "2019/05/25 04:38:18.500" +"2019/05/25 04:38:19.000" "2019/05/25 04:38:19.500" +"2019/05/25 04:38:20.000" "2019/05/25 04:38:20.500" +"2019/05/25 04:38:21.000" "2019/05/25 04:38:21.500" +"2019/05/25 04:38:22.000" "2019/05/25 04:38:22.500" +"2019/05/25 04:38:23.000" "2019/05/25 04:38:23.500" +"2019/05/25 04:38:24.000" "2019/05/25 04:38:24.500" +"2019/05/25 04:38:25.000" "2019/05/25 04:38:25.500" +"2019/05/25 04:38:26.000" "2019/05/25 04:38:26.500" +"2019/05/25 04:38:27.000" "2019/05/25 04:38:27.500" +"2019/05/25 04:38:28.000" "2019/05/25 04:38:28.500" +"2019/05/25 04:38:29.000" "2019/05/25 04:38:29.500" +"2019/05/25 04:38:30.000" "2019/05/25 04:38:30.500" +"2019/05/25 04:38:31.000" "2019/05/25 04:38:31.500" +"2019/05/25 04:38:32.000" "2019/05/25 04:38:32.500" +"2019/05/25 04:38:33.000" "2019/05/25 04:38:33.500" +"2019/05/25 04:38:34.000" "2019/05/25 04:38:34.500" +"2019/05/25 04:38:35.000" "2019/05/25 04:38:35.500" +"2019/05/25 04:38:36.000" "2019/05/25 04:38:36.500" +"2019/05/25 04:38:37.000" "2019/05/25 04:38:37.500" +"2019/05/25 04:38:38.000" "2019/05/25 04:38:38.500" +"2019/05/25 04:38:39.000" "2019/05/25 04:38:39.500" +"2019/05/25 04:38:40.000" "2019/05/25 04:38:40.500" +"2019/05/25 04:38:41.000" "2019/05/25 04:38:41.500" +"2019/05/25 04:38:42.000" "2019/05/25 04:38:42.500" +"2019/05/25 04:38:43.000" "2019/05/25 04:38:43.500" +"2019/05/25 04:38:44.000" "2019/05/25 04:38:44.500" +"2019/05/25 04:38:45.000" "2019/05/25 04:38:45.500" +"2019/05/25 04:38:47.000" "2019/05/25 04:38:47.500" +"2019/05/25 04:38:48.000" "2019/05/25 04:38:48.500" +"2019/05/25 04:38:49.000" "2019/05/25 04:38:49.500" +"2019/05/25 04:38:50.000" "2019/05/25 04:38:50.500" +"2019/05/25 04:38:51.000" "2019/05/25 04:38:51.500" +"2019/05/25 04:38:52.000" "2019/05/25 04:38:52.500" +"2019/05/25 04:38:53.000" "2019/05/25 04:38:53.500" +"2019/05/25 04:38:54.000" "2019/05/25 04:38:54.500" +"2019/05/25 04:38:55.000" "2019/05/25 04:38:55.500" +"2019/05/25 04:38:56.000" "2019/05/25 04:38:56.500" +"2019/05/25 04:38:57.000" "2019/05/25 04:38:57.500" +"2019/05/25 04:38:58.000" "2019/05/25 04:38:58.500" +"2019/05/25 04:38:59.000" "2019/05/25 04:38:59.500" +"2019/05/25 04:39:00.000" "2019/05/25 04:39:00.500" +"2019/05/25 04:39:01.000" "2019/05/25 04:39:01.500" +"2019/05/25 04:39:02.000" "2019/05/25 04:39:02.500" +"2019/05/25 04:39:03.000" "2019/05/25 04:39:03.500" +"2019/05/25 04:39:04.000" "2019/05/25 04:39:04.500" +"2019/05/25 04:39:05.000" "2019/05/25 04:39:05.500" +"2019/05/25 04:39:06.000" "2019/05/25 04:39:06.500" +"2019/05/25 04:39:07.000" "2019/05/25 04:39:07.500" +"2019/05/25 04:39:08.000" "2019/05/25 04:39:08.500" +"2019/05/25 04:39:09.000" "2019/05/25 04:39:09.500" +"2019/05/25 04:39:10.000" "2019/05/25 04:39:10.500" +"2019/05/25 04:39:11.000" "2019/05/25 04:39:11.500" +"2019/05/25 04:39:12.000" "2019/05/25 04:39:12.500" +"2019/05/25 04:39:13.000" "2019/05/25 04:39:13.500" +"2019/05/25 04:39:14.000" "2019/05/25 04:39:14.500" +"2019/05/25 04:39:15.000" "2019/05/25 04:39:15.500" +"2019/05/25 04:39:16.000" "2019/05/25 04:39:16.500" +"2019/05/25 04:39:17.000" "2019/05/25 04:39:17.500" +"2019/05/25 04:39:18.000" "2019/05/25 04:39:18.500" +"2019/05/25 04:39:19.000" "2019/05/25 04:39:19.500" +"2019/05/25 04:39:20.000" "2019/05/25 04:39:20.500" +"2019/05/25 04:39:21.000" "2019/05/25 04:39:21.500" +"2019/05/25 04:39:22.000" "2019/05/25 04:39:22.500" +"2019/05/25 04:39:23.000" "2019/05/25 04:39:23.500" +"2019/05/25 04:39:24.000" "2019/05/25 04:39:24.500" +"2019/05/25 04:39:25.000" "2019/05/25 04:39:25.500" +"2019/05/25 04:39:26.000" "2019/05/25 04:39:26.500" +"2019/05/25 04:39:27.000" "2019/05/25 04:39:27.500" +"2019/05/25 04:39:28.000" "2019/05/25 04:39:28.500" +"2019/05/25 04:39:29.000" "2019/05/25 04:39:29.500" +"2019/05/25 04:39:30.000" "2019/05/25 04:39:30.500" +"2019/05/25 04:39:31.000" "2019/05/25 04:39:31.500" +"2019/05/25 04:39:32.000" "2019/05/25 04:39:32.500" +"2019/05/25 04:39:33.000" "2019/05/25 04:39:33.500" +"2019/05/25 04:39:34.000" "2019/05/25 04:39:34.500" +"2019/05/25 04:39:35.000" "2019/05/25 04:39:35.500" +"2019/05/25 04:39:36.000" "2019/05/25 04:39:36.500" +"2019/05/25 04:39:37.000" "2019/05/25 04:39:37.500" +"2019/05/25 04:39:38.000" "2019/05/25 04:39:38.500" +"2019/05/25 04:39:39.000" "2019/05/25 04:39:39.500" +"2019/05/25 04:39:40.000" "2019/05/25 04:39:40.500" +"2019/05/25 04:39:41.000" "2019/05/25 04:39:41.500" +"2019/05/25 04:39:42.000" "2019/05/25 04:39:42.500" +"2019/05/25 04:39:43.000" "2019/05/25 04:39:43.500" +"2019/05/25 04:39:44.000" "2019/05/25 04:39:44.500" +"2019/05/25 04:39:45.000" "2019/05/25 04:39:45.500" +"2019/05/25 04:39:46.000" "2019/05/25 04:39:46.500" +"2019/05/25 04:39:47.000" "2019/05/25 04:39:47.500" +"2019/05/25 04:39:48.000" "2019/05/25 04:39:48.500" +"2019/05/25 04:39:49.000" "2019/05/25 04:39:49.500" +"2019/05/25 04:39:50.000" "2019/05/25 04:39:50.500" +"2019/05/25 04:39:52.000" "2019/05/25 04:39:52.500" +"2019/05/25 04:39:53.000" "2019/05/25 04:39:53.500" +"2019/05/25 04:39:54.000" "2019/05/25 04:39:54.500" +"2019/05/25 04:39:55.000" "2019/05/25 04:39:55.500" +"2019/05/25 04:39:56.000" "2019/05/25 04:39:56.500" +"2019/05/25 04:39:57.000" "2019/05/25 04:39:57.500" +"2019/05/25 04:39:58.000" "2019/05/25 04:39:58.500" +"2019/05/25 04:39:59.000" "2019/05/25 04:39:59.500" +"2019/05/25 04:40:00.000" "2019/05/25 04:40:00.500" +"2019/05/25 04:40:01.000" "2019/05/25 04:40:01.500" +"2019/05/25 04:40:02.000" "2019/05/25 04:40:02.500" +"2019/05/25 04:40:03.000" "2019/05/25 04:40:03.500" +"2019/05/25 04:40:04.000" "2019/05/25 04:40:04.500" +"2019/05/25 04:40:05.000" "2019/05/25 04:40:05.500" +"2019/05/25 04:40:06.000" "2019/05/25 04:40:06.500" +"2019/05/25 04:40:07.000" "2019/05/25 04:40:07.500" +"2019/05/25 04:40:08.000" "2019/05/25 04:40:08.500" +"2019/05/25 04:40:09.000" "2019/05/25 04:40:09.500" +"2019/05/25 04:40:10.000" "2019/05/25 04:40:10.500" +"2019/05/25 04:40:11.000" "2019/05/25 04:40:11.500" +"2019/05/25 04:40:12.000" "2019/05/25 04:40:12.500" +"2019/05/25 04:40:13.000" "2019/05/25 04:40:13.500" +"2019/05/25 04:40:14.000" "2019/05/25 04:40:14.500" +"2019/05/25 04:40:15.000" "2019/05/25 04:40:15.500" +"2019/05/25 04:40:16.000" "2019/05/25 04:40:16.500" +"2019/05/25 04:40:17.000" "2019/05/25 04:40:17.500" +"2019/05/25 04:40:18.000" "2019/05/25 04:40:18.500" +"2019/05/25 04:40:19.000" "2019/05/25 04:40:19.500" +"2019/05/25 04:40:20.000" "2019/05/25 04:40:20.500" +"2019/05/25 04:40:21.000" "2019/05/25 04:40:21.500" +"2019/05/25 04:40:22.000" "2019/05/25 04:40:22.500" +"2019/05/25 04:40:23.000" "2019/05/25 04:40:23.500" +"2019/05/25 04:40:24.000" "2019/05/25 04:40:24.500" +"2019/05/25 04:40:25.000" "2019/05/25 04:40:25.500" +"2019/05/25 04:40:26.000" "2019/05/25 04:40:26.500" +"2019/05/25 04:40:27.000" "2019/05/25 04:40:27.500" +"2019/05/25 04:40:28.000" "2019/05/25 04:40:28.500" +"2019/05/25 04:40:29.000" "2019/05/25 04:40:29.500" +"2019/05/25 04:40:30.000" "2019/05/25 04:40:30.500" +"2019/05/25 04:40:31.000" "2019/05/25 04:40:31.500" +"2019/05/25 04:40:32.000" "2019/05/25 04:40:32.500" +"2019/05/25 04:40:33.000" "2019/05/25 04:40:33.500" +"2019/05/25 04:40:34.000" "2019/05/25 04:40:34.500" +"2019/05/25 04:40:35.000" "2019/05/25 04:40:35.500" +"2019/05/25 04:40:36.000" "2019/05/25 04:40:36.500" +"2019/05/25 04:40:37.000" "2019/05/25 04:40:37.500" +"2019/05/25 04:40:38.000" "2019/05/25 04:40:38.500" +"2019/05/25 04:40:39.000" "2019/05/25 04:40:39.500" +"2019/05/25 04:40:40.000" "2019/05/25 04:40:40.500" +"2019/05/25 04:40:41.000" "2019/05/25 04:40:41.500" +"2019/05/25 04:40:42.000" "2019/05/25 04:40:42.500" +"2019/05/25 04:40:43.000" "2019/05/25 04:40:43.500" +"2019/05/25 04:40:44.000" "2019/05/25 04:40:44.500" +"2019/05/25 04:40:45.000" "2019/05/25 04:40:45.500" +"2019/05/25 04:40:46.000" "2019/05/25 04:40:46.500" +"2019/05/25 04:40:47.000" "2019/05/25 04:40:47.500" +"2019/05/25 04:40:48.000" "2019/05/25 04:40:48.500" +"2019/05/25 04:40:49.000" "2019/05/25 04:40:49.500" +"2019/05/25 04:40:50.000" "2019/05/25 04:40:50.500" +"2019/05/25 04:40:51.000" "2019/05/25 04:40:51.500" +"2019/05/25 04:40:52.000" "2019/05/25 04:40:52.500" +"2019/05/25 04:40:53.000" "2019/05/25 04:40:53.500" +"2019/05/25 04:40:54.000" "2019/05/25 04:40:54.500" +"2019/05/25 04:40:55.000" "2019/05/25 04:40:55.500" +"2019/05/25 04:40:56.000" "2019/05/25 04:40:56.500" +"2019/05/25 04:40:57.000" "2019/05/25 04:40:57.500" +"2019/05/25 04:40:58.000" "2019/05/25 04:40:58.500" +"2019/05/25 04:40:59.000" "2019/05/25 04:40:59.500" +"2019/05/25 04:41:00.000" "2019/05/25 04:41:00.500" +"2019/05/25 04:41:01.000" "2019/05/25 04:41:01.500" +"2019/05/25 04:41:02.000" "2019/05/25 04:41:02.500" +"2019/05/25 04:41:03.000" "2019/05/25 04:41:03.500" +"2019/05/25 04:41:04.000" "2019/05/25 04:41:04.500" +"2019/05/25 04:41:05.000" "2019/05/25 04:41:05.500" +"2019/05/25 04:41:06.000" "2019/05/25 04:41:06.500" +"2019/05/25 04:41:07.000" "2019/05/25 04:41:07.500" +"2019/05/25 04:41:08.000" "2019/05/25 04:41:08.500" +"2019/05/25 04:41:09.000" "2019/05/25 04:41:09.500" +"2019/05/25 04:41:10.000" "2019/05/25 04:41:10.500" +"2019/05/25 04:41:11.000" "2019/05/25 04:41:11.500" +"2019/05/25 04:41:12.000" "2019/05/25 04:41:12.500" +"2019/05/25 04:41:13.000" "2019/05/25 04:41:13.500" +"2019/05/25 04:41:14.000" "2019/05/25 04:41:14.500" +"2019/05/25 04:41:15.000" "2019/05/25 04:41:15.500" +"2019/05/25 04:41:16.000" "2019/05/25 04:41:16.500" +"2019/05/25 04:41:17.000" "2019/05/25 04:41:17.500" +"2019/05/25 04:41:18.000" "2019/05/25 04:41:18.500" +"2019/05/25 04:41:19.000" "2019/05/25 04:41:19.500" +"2019/05/25 04:41:20.000" "2019/05/25 04:41:20.500" +"2019/05/25 04:41:21.000" "2019/05/25 04:41:21.500" +"2019/05/25 04:41:22.000" "2019/05/25 04:41:22.500" +"2019/05/25 04:41:23.000" "2019/05/25 04:41:23.500" +"2019/05/25 04:41:24.000" "2019/05/25 04:41:24.500" +"2019/05/25 04:41:25.000" "2019/05/25 04:41:25.500" +"2019/05/25 04:41:26.000" "2019/05/25 04:41:26.500" +"2019/05/25 04:41:27.000" "2019/05/25 04:41:27.500" +"2019/05/25 04:41:28.000" "2019/05/25 04:41:28.500" +"2019/05/25 04:41:29.000" "2019/05/25 04:41:29.500" +"2019/05/25 04:41:30.000" "2019/05/25 04:41:30.500" +"2019/05/25 04:41:31.000" "2019/05/25 04:41:31.500" +"2019/05/25 04:41:32.000" "2019/05/25 04:41:32.500" +"2019/05/25 04:41:33.000" "2019/05/25 04:41:33.500" +"2019/05/25 04:41:34.000" "2019/05/25 04:41:34.500" +"2019/05/25 04:41:35.000" "2019/05/25 04:41:35.500" +"2019/05/25 04:41:36.000" "2019/05/25 04:41:36.500" +"2019/05/25 04:41:37.000" "2019/05/25 04:41:37.500" +"2019/05/25 04:41:38.000" "2019/05/25 04:41:38.500" +"2019/05/25 04:41:39.000" "2019/05/25 04:41:39.500" +"2019/05/25 04:41:40.000" "2019/05/25 04:41:40.500" +"2019/05/25 04:41:41.000" "2019/05/25 04:41:41.500" +"2019/05/25 04:41:42.000" "2019/05/25 04:41:42.500" +"2019/05/25 04:41:43.000" "2019/05/25 04:41:43.500" +"2019/05/25 04:41:44.000" "2019/05/25 04:41:44.500" +"2019/05/25 04:41:45.000" "2019/05/25 04:41:45.500" +"2019/05/25 04:41:46.000" "2019/05/25 04:41:46.500" +"2019/05/25 04:41:47.000" "2019/05/25 04:41:47.500" +"2019/05/25 04:41:48.000" "2019/05/25 04:41:48.500" +"2019/05/25 04:41:49.000" "2019/05/25 04:41:49.500" +"2019/05/25 04:41:50.000" "2019/05/25 04:41:50.500" +"2019/05/25 04:41:51.000" "2019/05/25 04:41:51.500" +"2019/05/25 04:41:52.000" "2019/05/25 04:41:52.500" +"2019/05/25 04:41:53.000" "2019/05/25 04:41:53.500" +"2019/05/25 04:41:54.000" "2019/05/25 04:41:54.500" +"2019/05/25 04:41:55.000" "2019/05/25 04:41:55.500" +"2019/05/25 04:41:56.000" "2019/05/25 04:41:56.500" +"2019/05/25 04:41:57.000" "2019/05/25 04:41:57.500" +"2019/05/25 04:41:58.000" "2019/05/25 04:41:58.500" +"2019/05/25 04:41:59.000" "2019/05/25 04:41:59.500" +"2019/05/25 04:42:00.000" "2019/05/25 04:42:00.500" +"2019/05/25 04:42:01.000" "2019/05/25 04:42:01.500" +"2019/05/25 04:42:02.000" "2019/05/25 04:42:02.500" +"2019/05/25 04:42:03.000" "2019/05/25 04:42:03.500" +"2019/05/25 04:42:04.000" "2019/05/25 04:42:04.500" +"2019/05/25 04:42:05.000" "2019/05/25 04:42:05.500" +"2019/05/25 04:42:06.000" "2019/05/25 04:42:06.500" +"2019/05/25 04:42:07.000" "2019/05/25 04:42:07.500" +"2019/05/25 04:42:08.000" "2019/05/25 04:42:08.500" +"2019/05/25 04:42:09.000" "2019/05/25 04:42:09.500" +"2019/05/25 04:42:10.000" "2019/05/25 04:42:10.500" +"2019/05/25 04:42:11.000" "2019/05/25 04:42:11.500" +"2019/05/25 04:42:12.000" "2019/05/25 04:42:12.500" +"2019/05/25 04:42:13.000" "2019/05/25 04:42:13.500" +"2019/05/25 04:42:14.000" "2019/05/25 04:42:14.500" +"2019/05/25 04:42:15.000" "2019/05/25 04:42:15.500" +"2019/05/25 04:42:16.000" "2019/05/25 04:42:16.500" +"2019/05/25 04:42:17.000" "2019/05/25 04:42:17.500" +"2019/05/25 04:42:18.000" "2019/05/25 04:42:18.500" +"2019/05/25 04:42:19.000" "2019/05/25 04:42:19.500" +"2019/05/25 04:42:20.000" "2019/05/25 04:42:20.500" +"2019/05/25 04:42:21.000" "2019/05/25 04:42:21.500" +"2019/05/25 04:42:22.000" "2019/05/25 04:42:22.500" +"2019/05/25 04:42:23.000" "2019/05/25 04:42:23.500" +"2019/05/25 04:42:24.000" "2019/05/25 04:42:24.500" +"2019/05/25 04:42:25.000" "2019/05/25 04:42:25.500" +"2019/05/25 04:42:26.000" "2019/05/25 04:42:26.500" +"2019/05/25 04:42:27.000" "2019/05/25 04:42:27.500" +"2019/05/25 04:42:28.000" "2019/05/25 04:42:28.500" +"2019/05/25 04:42:29.000" "2019/05/25 04:42:29.500" +"2019/05/25 04:42:30.000" "2019/05/25 04:42:30.500" +"2019/05/25 04:42:31.000" "2019/05/25 04:42:31.500" +"2019/05/25 04:42:32.000" "2019/05/25 04:42:32.500" +"2019/05/25 04:42:33.000" "2019/05/25 04:42:33.500" +"2019/05/25 04:42:34.000" "2019/05/25 04:42:34.500" +"2019/05/25 04:42:35.000" "2019/05/25 04:42:35.500" +"2019/05/25 04:42:36.000" "2019/05/25 04:42:36.500" +"2019/05/25 04:42:37.000" "2019/05/25 04:42:37.500" +"2019/05/25 04:42:38.000" "2019/05/25 04:42:38.500" +"2019/05/25 04:42:39.000" "2019/05/25 04:42:39.500" +"2019/05/25 04:42:40.000" "2019/05/25 04:42:40.500" +"2019/05/25 04:42:41.000" "2019/05/25 04:42:41.500" +"2019/05/25 04:42:42.000" "2019/05/25 04:42:42.500" +"2019/05/25 04:42:43.000" "2019/05/25 04:42:43.500" +"2019/05/25 04:42:44.000" "2019/05/25 04:42:44.500" +"2019/05/25 04:42:45.000" "2019/05/25 04:42:45.500" +"2019/05/25 04:42:46.000" "2019/05/25 04:42:46.500" +"2019/05/25 04:42:47.000" "2019/05/25 04:42:47.500" +"2019/05/25 04:42:48.000" "2019/05/25 04:42:48.500" +"2019/05/25 04:42:49.000" "2019/05/25 04:42:49.500" +"2019/05/25 04:42:50.000" "2019/05/25 04:42:50.500" +"2019/05/25 04:42:51.000" "2019/05/25 04:42:51.500" +"2019/05/25 04:42:52.000" "2019/05/25 04:42:52.500" +"2019/05/25 04:42:53.000" "2019/05/25 04:42:53.500" +"2019/05/25 04:42:54.000" "2019/05/25 04:42:54.500" +"2019/05/25 04:42:55.000" "2019/05/25 04:42:55.500" +"2019/05/25 04:42:56.000" "2019/05/25 04:42:56.500" +"2019/05/25 04:42:57.000" "2019/05/25 04:42:57.500" +"2019/05/25 04:42:58.000" "2019/05/25 04:42:58.500" +"2019/05/25 04:42:59.000" "2019/05/25 04:42:59.500" +"2019/05/25 04:43:00.000" "2019/05/25 04:43:00.500" +"2019/05/25 04:43:01.000" "2019/05/25 04:43:01.500" +"2019/05/25 04:43:02.000" "2019/05/25 04:43:02.500" +"2019/05/25 04:43:03.000" "2019/05/25 04:43:03.500" +"2019/05/25 04:43:04.000" "2019/05/25 04:43:04.500" +"2019/05/25 04:43:05.000" "2019/05/25 04:43:05.500" +"2019/05/25 04:43:06.000" "2019/05/25 04:43:06.500" +"2019/05/25 04:43:07.000" "2019/05/25 04:43:07.500" +"2019/05/25 04:43:08.000" "2019/05/25 04:43:08.500" +"2019/05/25 04:43:09.000" "2019/05/25 04:43:09.500" +"2019/05/25 04:43:10.000" "2019/05/25 04:43:10.500" +"2019/05/25 04:43:11.000" "2019/05/25 04:43:11.500" +"2019/05/25 04:43:12.000" "2019/05/25 04:43:12.500" +"2019/05/25 04:43:13.000" "2019/05/25 04:43:13.500" +"2019/05/25 04:43:14.000" "2019/05/25 04:43:14.500" +"2019/05/25 04:43:15.000" "2019/05/25 04:43:15.500" +"2019/05/25 04:43:16.000" "2019/05/25 04:43:16.500" +"2019/05/25 04:43:17.000" "2019/05/25 04:43:17.500" +"2019/05/25 04:43:18.000" "2019/05/25 04:43:18.500" +"2019/05/25 04:43:19.000" "2019/05/25 04:43:19.500" +"2019/05/25 04:43:20.000" "2019/05/25 04:43:20.500" +"2019/05/25 04:43:21.000" "2019/05/25 04:43:21.500" +"2019/05/25 04:43:22.000" "2019/05/25 04:43:22.500" +"2019/05/25 04:43:23.000" "2019/05/25 04:43:23.500" +"2019/05/25 04:43:24.000" "2019/05/25 04:43:24.500" +"2019/05/25 04:43:25.000" "2019/05/25 04:43:25.500" +"2019/05/25 04:43:26.000" "2019/05/25 04:43:26.500" +"2019/05/25 04:43:27.000" "2019/05/25 04:43:27.500" +"2019/05/25 04:43:28.000" "2019/05/25 04:43:28.500" +"2019/05/25 04:43:29.000" "2019/05/25 04:43:29.500" +"2019/05/25 04:43:30.000" "2019/05/25 04:43:30.500" +"2019/05/25 04:43:31.000" "2019/05/25 04:43:31.500" +"2019/05/25 04:43:32.000" "2019/05/25 04:43:32.500" +"2019/05/25 04:43:33.000" "2019/05/25 04:43:33.500" +"2019/05/25 04:43:34.000" "2019/05/25 04:43:34.500" +"2019/05/25 04:43:35.000" "2019/05/25 04:43:35.500" +"2019/05/25 04:43:36.000" "2019/05/25 04:43:36.500" +"2019/05/25 04:43:37.000" "2019/05/25 04:43:37.500" +"2019/05/25 04:43:38.000" "2019/05/25 04:43:38.500" +"2019/05/25 04:43:39.000" "2019/05/25 04:43:39.500" +"2019/05/25 04:43:40.000" "2019/05/25 04:43:40.500" +"2019/05/25 04:43:41.000" "2019/05/25 04:43:41.500" +"2019/05/25 04:43:42.000" "2019/05/25 04:43:42.500" +"2019/05/25 04:43:43.000" "2019/05/25 04:43:43.500" +"2019/05/25 04:43:44.000" "2019/05/25 04:43:44.500" +"2019/05/25 04:43:45.000" "2019/05/25 04:43:45.500" +"2019/05/25 04:43:46.000" "2019/05/25 04:43:46.500" +"2019/05/25 04:43:47.000" "2019/05/25 04:43:47.500" +"2019/05/25 04:43:48.000" "2019/05/25 04:43:48.500" +"2019/05/25 04:43:49.000" "2019/05/25 04:43:49.500" +"2019/05/25 04:43:50.000" "2019/05/25 04:43:50.500" +"2019/05/25 04:43:51.000" "2019/05/25 04:43:51.500" +"2019/05/25 04:43:52.000" "2019/05/25 04:43:52.500" +"2019/05/25 04:43:53.000" "2019/05/25 04:43:53.500" +"2019/05/25 04:43:54.000" "2019/05/25 04:43:54.500" +"2019/05/25 04:43:55.000" "2019/05/25 04:43:55.500" +"2019/05/25 04:43:56.000" "2019/05/25 04:43:56.500" +"2019/05/25 04:43:57.000" "2019/05/25 04:43:57.500" +"2019/05/25 04:43:58.000" "2019/05/25 04:43:58.500" +"2019/05/25 04:43:59.000" "2019/05/25 04:43:59.500" +"2019/05/25 04:44:00.000" "2019/05/25 04:44:00.500" +"2019/05/25 04:44:01.000" "2019/05/25 04:44:01.500" +"2019/05/25 04:44:02.000" "2019/05/25 04:44:02.500" +"2019/05/25 04:44:03.000" "2019/05/25 04:44:03.500" +"2019/05/25 04:44:04.000" "2019/05/25 04:44:04.500" +"2019/05/25 04:44:05.000" "2019/05/25 04:44:05.500" +"2019/05/25 04:44:06.000" "2019/05/25 04:44:06.500" +"2019/05/25 04:44:07.000" "2019/05/25 04:44:07.500" +"2019/05/25 04:44:08.000" "2019/05/25 04:44:08.500" +"2019/05/25 04:44:09.000" "2019/05/25 04:44:09.500" +"2019/05/25 04:44:10.000" "2019/05/25 04:44:10.500" +"2019/05/25 04:44:11.000" "2019/05/25 04:44:11.500" +"2019/05/25 04:44:12.000" "2019/05/25 04:44:12.500" +"2019/05/25 04:44:13.000" "2019/05/25 04:44:13.500" +"2019/05/25 04:44:14.000" "2019/05/25 04:44:14.500" +"2019/05/25 04:44:15.000" "2019/05/25 04:44:15.500" +"2019/05/25 04:44:16.000" "2019/05/25 04:44:16.500" +"2019/05/25 04:44:17.000" "2019/05/25 04:44:17.500" +"2019/05/25 04:44:18.000" "2019/05/25 04:44:18.500" +"2019/05/25 04:44:19.000" "2019/05/25 04:44:19.500" +"2019/05/25 04:44:20.000" "2019/05/25 04:44:20.500" +"2019/05/25 04:44:21.000" "2019/05/25 04:44:21.500" +"2019/05/25 04:44:22.000" "2019/05/25 04:44:22.500" +"2019/05/25 04:44:23.000" "2019/05/25 04:44:23.500" +"2019/05/25 04:44:24.000" "2019/05/25 04:44:24.500" +"2019/05/25 04:44:25.000" "2019/05/25 04:44:25.500" +"2019/05/25 04:44:26.000" "2019/05/25 04:44:26.500" +"2019/05/25 04:44:27.000" "2019/05/25 04:44:27.500" +"2019/05/25 04:44:28.000" "2019/05/25 04:44:28.500" +"2019/05/25 04:44:29.000" "2019/05/25 04:44:29.500" +"2019/05/25 04:44:30.000" "2019/05/25 04:44:30.500" +"2019/05/25 04:44:31.000" "2019/05/25 04:44:31.500" +"2019/05/25 04:44:32.000" "2019/05/25 04:44:32.500" +"2019/05/25 04:44:33.000" "2019/05/25 04:44:33.500" +"2019/05/25 04:44:34.000" "2019/05/25 04:44:34.500" +"2019/05/25 04:44:35.000" "2019/05/25 04:44:35.500" +"2019/05/25 04:44:36.000" "2019/05/25 04:44:36.500" +"2019/05/25 04:44:37.000" "2019/05/25 04:44:37.500" +"2019/05/25 04:44:38.000" "2019/05/25 04:44:38.500" +"2019/05/25 04:44:39.000" "2019/05/25 04:44:39.500" +"2019/05/25 04:44:40.000" "2019/05/25 04:44:40.500" +"2019/05/25 04:44:41.000" "2019/05/25 04:44:41.500" +"2019/05/25 04:44:42.000" "2019/05/25 04:44:42.500" +"2019/05/25 04:44:43.000" "2019/05/25 04:44:43.500" +"2019/05/25 04:44:44.000" "2019/05/25 04:44:44.500" +"2019/05/25 04:44:45.000" "2019/05/25 04:44:45.500" +"2019/05/25 04:44:46.000" "2019/05/25 04:44:46.500" +"2019/05/25 04:44:47.000" "2019/05/25 04:44:47.500" +"2019/05/25 04:44:48.000" "2019/05/25 04:44:48.500" +"2019/05/25 04:44:49.000" "2019/05/25 04:44:49.500" +"2019/05/25 04:44:50.000" "2019/05/25 04:44:50.500" +"2019/05/25 04:44:51.000" "2019/05/25 04:44:51.500" +"2019/05/25 04:44:52.000" "2019/05/25 04:44:52.500" +"2019/05/25 04:44:53.000" "2019/05/25 04:44:53.500" +"2019/05/25 04:44:54.000" "2019/05/25 04:44:54.500" +"2019/05/25 04:44:55.000" "2019/05/25 04:44:55.500" +"2019/05/25 04:44:56.000" "2019/05/25 04:44:56.500" +"2019/05/25 04:44:57.000" "2019/05/25 04:44:57.500" +"2019/05/25 04:44:58.000" "2019/05/25 04:44:58.500" +"2019/05/25 04:44:59.000" "2019/05/25 04:44:59.500" +"2019/05/25 04:45:00.000" "2019/05/25 04:45:00.500" +"2019/05/25 04:45:01.000" "2019/05/25 04:45:01.500" +"2019/05/25 04:45:02.000" "2019/05/25 04:45:02.500" +"2019/05/25 04:45:03.000" "2019/05/25 04:45:03.500" +"2019/05/25 04:45:04.000" "2019/05/25 04:45:04.500" +"2019/05/25 04:45:05.000" "2019/05/25 04:45:05.500" +"2019/05/25 04:45:06.000" "2019/05/25 04:45:06.500" +"2019/05/25 04:45:07.000" "2019/05/25 04:45:07.500" +"2019/05/25 04:45:08.000" "2019/05/25 04:45:08.500" +"2019/05/25 04:45:09.000" "2019/05/25 04:45:09.500" +"2019/05/25 04:45:10.000" "2019/05/25 04:45:10.500" +"2019/05/25 04:45:11.000" "2019/05/25 04:45:11.500" +"2019/05/25 04:45:12.000" "2019/05/25 04:45:12.500" +"2019/05/25 04:45:13.000" "2019/05/25 04:45:13.500" +"2019/05/25 04:45:14.000" "2019/05/25 04:45:14.500" +"2019/05/25 04:45:15.000" "2019/05/25 04:45:15.500" +"2019/05/25 04:45:16.000" "2019/05/25 04:45:16.500" +"2019/05/25 04:45:17.000" "2019/05/25 04:45:17.500" +"2019/05/25 04:45:18.000" "2019/05/25 04:45:18.500" +"2019/05/25 04:45:19.000" "2019/05/25 04:45:19.500" +"2019/05/25 04:45:20.000" "2019/05/25 04:45:20.500" +"2019/05/25 04:45:21.000" "2019/05/25 04:45:21.500" \ No newline at end of file diff --git a/data/assets/scene/solarsystem/missions/osirisrex/bennu.asset b/data/assets/scene/solarsystem/missions/osirisrex/bennu.asset new file mode 100644 index 0000000000..a935cc6fcf --- /dev/null +++ b/data/assets/scene/solarsystem/missions/osirisrex/bennu.asset @@ -0,0 +1,115 @@ +local assetHelper = asset.require('util/asset_helper') +local transforms = asset.require('./transforms') +local sunTransforms = asset.require('scene/solarsystem/sun/transforms') + + + +local textures = asset.syncedResource({ + Name = "Bennu Textures", + Type = "HttpSynchronization", + Identifier = "bennu_textures", + Version = 1 +}) + +local models = asset.syncedResource({ + Name = "Bennu Models", + Type = "HttpSynchronization", + Identifier = "bennu_models", + Version = 1 +}) + +local BENNU_BODY = "2101955" + + +local Bennu = { + Identifier = "Bennu", + Parent = transforms.BennuBarycenter.Identifier, + Transform = { + Rotation = { + Type = "SpiceRotation", + SourceFrame = "IAU_BENNU", + DestinationFrame = "GALACTIC" + }, + }, + Renderable = { + Type = "RenderableModelProjection", + Body = BENNU_BODY, + Geometry = { + Type = "MultiModelGeometry", + GeometryFile = models .. "/BennuTextured.obj" + }, + ColorTexture = textures .. "/gray.png", + Projection = { + Sequence = asset.localResource('InstrumentTimes'), + SequenceType = "instrument-times", + Observer = "OSIRIS-REX", + Target = BENNU_BODY, + Aberration = "NONE", + AspectRatio = 2, + + DataInputTranslation = { + Instruments = { + ORX_OCAMS_POLYCAM = { + DetectorType = "Camera", + Spice = { "ORX_OCAMS_POLYCAM" }, + Files = { + "BaseballDiamond_PolyCam.txt", + --"OrbitalB_Site08_PolyCamImages.txt", + "Recon_225m_Equatorial_PolyCam.txt", + }, + }, + ORX_REXIS = { + DetectorType = "Camera", + Spice = { "ORX_REXIS" }, + Files = { + "DetailedSurvey_EquatorialStations_Spectrometers.txt", + "Recon_225m_Equatorial_spectrometers.txt", + "Recon_525m_Equatorial_spectrometers.txt", + } + } + }, + Target = { + Body = BENNU_BODY + }, + }, + + Instrument = { -- INVALID DATA - JUST FOR TESTING + Name = "ORX_OCAMS_POLYCAM", + Method = "ELLIPSOID", + Aberration = "NONE", + Fovy = 0.792, + Aspect = 1, + Near = 0.01, + Far = 1000000 + } + } + }, + GUI = { + Path = "/Solar System/Asteroid" + } +} + +local BennuTrail = { + Identifier = "BennuTrail", + Parent = sunTransforms.SolarSystemBarycenter.Identifier, + Renderable = { + Type = "RenderableTrailTrajectory", + Translation = { + Type = "SpiceTranslation", + Target = BENNU_BODY, + Observer = "SUN" + }, + Color = { 0.4, 0.0, 0.7 }, + StartTime = "2015 JAN 01 00:00:00.000", + EndTime = "2023 MAY 31 00:00:00.000", + SampleInterval = 3600 + }, + GUI = { + Name = "Bennu Trail", + Path = "/Solar System/Asteroid" + } + +} + + +assetHelper.registerSceneGraphNodesAndExport(asset, { Bennu, BennuTrail }) diff --git a/data/assets/scene/solarsystem/missions/osirisrex/model.asset b/data/assets/scene/solarsystem/missions/osirisrex/model.asset new file mode 100644 index 0000000000..30a81b344c --- /dev/null +++ b/data/assets/scene/solarsystem/missions/osirisrex/model.asset @@ -0,0 +1,345 @@ +local assetHelper = asset.require('util/asset_helper') +local transforms = asset.require('./transforms') +local sunTransforms = asset.require('scene/solarsystem/sun/transforms') +local earthTransforms = asset.require('scene/solarsystem/planets/earth/transforms') + + + +local kernels = asset.syncedResource({ + Name = "Osiris Rex Kernels", + Type = "HttpSynchronization", + Identifier = "osirisrex_kernels", + Version = 1 +}) + +local textures = asset.syncedResource({ + Name = "Osiris Rex Textures", + Type = "HttpSynchronization", + Identifier = "osirisrex_textures", + Version = 1 +}) + +local models = asset.syncedResource({ + Name = "Osiris Rex Models", + Type = "HttpSynchronization", + Identifier = "osirisrex_models", + Version = 1 +}) + +local BENNU_BODY = "2101955" + +KernelCase = 2 -- Right now we only have the image times for case 2 + +local CaseDependentKernels +if KernelCase == 2 then + CaseDependentKernels = { + kernels .. "/ORX_Recon_525mSortie_Case02.bsp", + kernels .. "/Recon_525mSortie_Case02_0Latitude.bc", + kernels .. "/Recon_525mSortie_Case02_atl_19145_04.atf", + + kernels .. "/ORX_Recon_225mSortie_Case02.bsp", + kernels .. "/Recon_225mSortie_Case02_0Latitude.bc" + } +elseif KernelCase == 5 then + CaseDependentKernels = { + kernels .. "/ORX_Recon_525mSortie_Case05.bsp", + kernels .. "/Recon_525mSortie_Case05_20negLatitude.bc", + kernels .. "/Recon_525mSortie_Case05_atl_19145_04.atf", + kernels .. "/Recon_525mSortie_Case05_NominalProfile.bc", + + kernels .. "/ORX_Recon_225mSortie_Case05.bsp", + kernels .. "/Recon_225mSortie_Case05_20negLatitude.bc" + } +elseif KernelCase == 8 then + CaseDependentKernels = { + kernels .. "/Recon_525mSortie_Case08_NominalProfile.bc", + kernels .. "/ORX_Recon_225mSortie_Case08.bsp", + kernels .. "/Recon_225mSortie_Case08_40negLatitude.bc" + } +elseif KernelCase == 11 then + CaseDependentKernels = { + kernels .. "/ORX_Recon_225mSortie_Case11.bsp", + kernels .. "/Recon_225mSortie_Case11_60negLatitude.bc" + } +end + +local OsirisRexKernels = { + -- background + -- SCLK kernels needs to be loaded before CK kernels (and generally first) + kernels .. "/ORX_SCLKSCET.00000.tsc", + + -- This cannot be loaded correctly for some reason! + --openspace.spice.loadKernel(kernels .. "/OsirisRexKernels/background/dsk/RQ36mod.oct12_CCv0001.bds") + + kernels .. "/orx_v04.tf", + kernels .. "/orx_lidar_v00.ti", + kernels .. "/orx_ocams_v03.ti", + kernels .. "/orx_otes_v00.ti", + kernels .. "/orx_rexis_v00.ti", + kernels .. "/orx_struct_v00.ti", + kernels .. "/orx_navcam_v00.ti", + kernels .. "/orx_ola_v00.ti", + kernels .. "/orx_ovirs_v00.ti", + kernels .. "/orx_stowcam_v00.ti", + -- kernels .. "/naif0011.tls", + kernels .. "/bennu_SPH250m.tpc", + kernels .. "/bennu_v10.tpc", + + -- Low res SPK + kernels .. "/orx_160917_231024_pgaa3_day15m60_v1.bsp", + kernels .. "/orx_160914_231024_pgaa3_day12m60_v1.bsp", + + kernels .. "/orx_160908_231024_pgaa3_day06m60_v1.bsp", + kernels .. "/spk_orx_160908_231024_pgaa2_day06m60_v3.bsp", + kernels .. "/orx_160908_231024_pgaa2_day06m60.bsp", + + kernels .. "/OREX_20160908_M60_complete.bsp", + kernels .. "/OREX_20160904_M45_complete.bsp", + + -- SPK + kernels .. "/de421.bsp", + kernels .. "/sb-101955-76.bsp", + + -- Nominal_Profile_LowRes + kernels .. "/Approach_600s_20180816T230000_20181119T010000.bsp", + kernels .. "/Approach_NominalProfile_600s_20180816T230000_20181119T010000.bc", + kernels .. "/DetailedSurvey_600s_20190108T000000_20190317T000000.bsp", + kernels .. "/OrbitalA_600s_20181203T230000_20190109T000000.bsp", + kernels .. "/OrbitalA_NominalProfile_600s_20181203T230000_20190109T000000.bc", + kernels .. "/OrbitalB_600s_20190316T000000_20190521T000000.bsp", + kernels .. "/DetailedSurvey_NominalProfile_600s_20190108T000000_20190317T000000.bc", + kernels .. "/OrbitalB_NominalProfile600s_20190316T000000_20190521T000000.bc", + kernels .. "/PrelimSurvey_600s_20181119T230000_20181204T010000.bsp", + kernels .. "/PrelimSurvey_NominalProfile_600s_20181119T230000_20181204T010000.bc", + kernels .. "/Recon_600s_20190519T000000_20190830T000000.bsp", + kernels .. "/Recon_NominalProfile_600s_20190519T000000_20190830T000000.bc", + + -- Nominal_Observations_Science + kernels .. "/Phase03_AP_DustSearch_1.bc", + kernels .. "/Phase03_AP_LightCurve_1.bc", + kernels .. "/Phase03_AP_LightCurve_2.bc", + kernels .. "/Phase03_AP_SatSearch_1.bc", + kernels .. "/Phase03_AP_SatSearch_2.bc", + kernels .. "/Phase03_AP_PhaseFunction_1.bc", + kernels .. "/Phase03_AP_ShapeModel_1.bc", + kernels .. "/Phase03_AP_ShapeModel_2.bc", + kernels .. "/Phase03_AP_ShapeModel_3.bc", + kernels .. "/Phase03_AP_ShapeModel_4.bc", + kernels .. "/Phase03_AP_ShapeModel_5.bc", + kernels .. "/Phase03_AP_ShapeModel_6.bc", + kernels .. "/Phase03_AP_ShapeModel_7.bc", + kernels .. "/Phase03_AP_ShapeModel_8.bc", + kernels .. "/Phase03_AP_ShapeModel_9_Forced4x4.bc", + kernels .. "/Phase03_AP_SpectraMap_1.bc", + kernels .. "/Phase04_PS_MC_1_v1_1a.bc", + kernels .. "/Phase04_PS_MC_2_v1_1a.bc", + kernels .. "/Phase04_PS_OLA_Nominal_1.bc", + kernels .. "/Phase04_PS_OLA_Nominal_2.bc", + kernels .. "/Phase04_PS_OLA_Nominal_3.bc", + kernels .. "/Phase04_PS_OLA_Nominal_4.bc", + kernels .. "/Phase04_PS_PolyCam_1.bc", + kernels .. "/Phase04_PS_PolyCam_2.bc", + kernels .. "/Phase04_PS_PolyCam_3.bc", + kernels .. "/Phase04_PS_PolyCam_4.bc", + kernels .. "/Phase04_PS_PolyCam_5.bc", + kernels .. "/Phase04_PS_PolyCam_6.bc", + + --openspace.spice.loadKernel(kernels .. "/OsirisRexKernels/Nominal_Observations_Science/06_DetailedSurvey/BaseballDiamond_v2/atl_19013_18_BBD1_info.TXT") + --openspace.spice.loadKernel(kernels .. "/OsirisRexKernels/Nominal_Observations_Science/06_DetailedSurvey/BaseballDiamond_v2/atl_19014_16_BBD2_info.TXT") + --openspace.spice.loadKernel(kernels .. "/OsirisRexKernels/Nominal_Observations_Science/06_DetailedSurvey/BaseballDiamond_v2/atl_19020_18_BBD3_info.TXT") + --openspace.spice.loadKernel(kernels .. "/OsirisRexKernels/Nominal_Observations_Science/06_DetailedSurvey/BaseballDiamond_v2/atl_19021_19_BBD4_info.TXT") + --openspace.spice.loadKernel(kernels .. "/OsirisRexKernels/Nominal_Observations_Science/06_DetailedSurvey/BaseballDiamond_v2/README.txt") + + kernels .. "/atl_19013_18_BBD1_v2.bc", + kernels .. "/atl_19014_16_BBD2_v2.bc", + kernels .. "/atl_19020_18_BBD3_v2.bc", + kernels .. "/atl_19021_19_BBD4_v2.bc", + + + kernels .. "/Phase06_DS_Equatorial_Stations_1.bc", + kernels .. "/Phase06_DS_Equatorial_Stations_2.bc", + kernels .. "/Phase06_DS_Equatorial_Stations_3.bc", + kernels .. "/Phase06_DS_Equatorial_Stations_4.bc", + kernels .. "/Phase06_DS_Equatorial_Stations_5.bc", + kernels .. "/Phase06_DS_Equatorial_Stations_6.bc", + kernels .. "/Phase06_DS_Equatorial_Stations_7.bc", + kernels .. "/Phase06_DS_Plume_Search_1.bc", + kernels .. "/Phase06_DS_Plume_Search_2.bc", + kernels .. "/Phase07_OB_CSS_Mapping_1.bc", + kernels .. "/Phase07_OB_CSS_Mapping_2.bc", + kernels .. "/Phase07_OB_CSS_Mapping_3.bc", + kernels .. "/CSS_Mapping_1.a", + kernels .. "/CSS_Mapping_2.a", + kernels .. "/CSS_Mapping_3.a", + + --openspace.spice.loadKernel(kernels .. "/Case02_0Latitude.wmv") + --openspace.spice.loadKernel(kernels .. "/Case05_20negLatitude.wmv") + --openspace.spice.loadKernel(kernels .. "/Case08_40negLatitude.wmv") + --openspace.spice.loadKernel(kernels .. "/Case11_60negLatitude.wmv") +} + +local LightSources = { + { + Type = "SceneGraphLightSource", + Identifier = "Sun", + Node = sunTransforms.SolarSystemBarycenter.Identifier, + Intensity = 1.0 + }, + { + Identifier = "Camera", + Type = "CameraLightSource", + Intensity = 0.5 + } +} + +-- Append the CaseDependentKernels at the end of the OsirisRexKernels set +for i = 0, #CaseDependentKernels do + OsirisRexKernels[#OsirisRexKernels + 1] = CaseDependentKernels[i] +end + +local OsirisRex = { + Identifier = "OsirisRex", + Parent = sunTransforms.SolarSystemBarycenter.Identifier, + Transform = { + Translation = { + Type = "SpiceTranslation", + Target = "OSIRIS-REX", + Observer = "SUN", + Kernels = OsirisRexKernels + }, + Rotation = { + Type = "SpiceRotation", + SourceFrame = "ORX_SPACECRAFT", + DestinationFrame = "GALACTIC" + }, + }, + Renderable = { + Type = "RenderableModel", + Body = "OSIRIS-REX", + Geometry = { + Type = "MultiModelGeometry", + GeometryFile = models .. "/orx_base_resized_12_sep_2016.obj" + }, + ColorTexture = textures .. "/osirisTex.png", + LightSources = LightSources + }, + GUI = { + Name = "OSIRIS REx", + Path = "/Solar System/Missions/OSIRIS REx" + } +} + +local PolyCam = { + Identifier = "ORX_OCAMS_POLYCAM", + Parent = OsirisRex.Identifier, + Transform = { + Translation = { + Type = "StaticTranslation", + Position = { -0.2476, 0.2710, 0.3364 } + }, + Rotation = { + Type = "SpiceRotation", + SourceFrame = "ORX_OCAMS_POLYCAM", + DestinationFrame = "ORX_SPACECRAFT" + } + }, + Renderable = { + Type = "RenderableModel", + Body = "OSIRIS-REX", + Geometry = { + Type = "MultiModelGeometry", + GeometryFile = models .. "/orx_polycam_resized_12_sep_2016.obj" + }, + ColorTexture = textures .. "/osirisTex.png", + LightSources = LightSources + }, + GUI = { + Name = "OCAMS POLYCAM", + Path = "/Solar System/Missions/OSIRIS REx/Instruments" + } +} + +local Rexis = { + Identifier = "ORX_REXIS", + Parent = OsirisRex.Identifier, + Renderable = { + Type = "RenderableModel", + Body = "OSIRIS-REX", + Geometry = { + Type = "MultiModelGeometry", + GeometryFile = models .. "/orx_rexis_resized_12_sep_2016.obj" + }, + ColorTexture = textures .. "/osirisTex.png", + LightSources = LightSources + }, + Transform = { + Translation = { + Type = "StaticTranslation", + Position = { 0, 0.3371, 0.2712 } + }, + Rotation = { + Type = "SpiceRotation", + SourceFrame = "ORX_REXIS", + DestinationFrame = "ORX_SPACECRAFT" + }, + }, + GUI = { + Name = "REXIS", + Path = "/Solar System/Missions/OSIRIS REx/Instruments" + } +} + +local PolyCamFov = { + Identifier = "POLYCAM FOV", + Parent = PolyCam.Identifier, + Renderable = { + Type = "RenderableFov", + Body = "OSIRIS-REX", + Frame = "ORX_OCAMS_POLYCAM", + RGB = { 0.8, 0.7, 0.7 }, + Instrument = { + Name = "ORX_OCAMS_POLYCAM", + Method = "ELLIPSOID", + Aberration = "NONE" + }, + PotentialTargets = { BENNU_BODY } + }, + GUI = { + Name = "POLYCAM FOV", + Path = "/Solar System/Missions/OSIRIS REx/Instruments" + } +} + +local RexisFov = { + Identifier = "REXIS FOV", + Parent = Rexis.Identifier, + Renderable = { + Type = "RenderableFov", + Body = "OSIRIS-REX", + Frame = "ORX_REXIS", + RGB = { 0.8, 0.7, 0.7 }, + Instrument = { + Name = "ORX_REXIS", + Method = "ELLIPSOID", + Aberration = "NONE" + }, + PotentialTargets = { BENNU_BODY }, + FrameConversions = { + [BENNU_BODY] = "IAU_BENNU" + } + }, + GUI = { + Name = "REXIS FOV", + Path = "/Solar System/Missions/OSIRIS REx/Instruments" + } +} + + + +assetHelper.registerSceneGraphNodesAndExport(asset, { + OsirisRex, + PolyCam, + Rexis, + PolyCamFov, + RexisFov +}) diff --git a/data/assets/scene/solarsystem/missions/osirisrex/osirisrex.asset b/data/assets/scene/solarsystem/missions/osirisrex/osirisrex.asset new file mode 100644 index 0000000000..1444106adc --- /dev/null +++ b/data/assets/scene/solarsystem/missions/osirisrex/osirisrex.asset @@ -0,0 +1,16 @@ +asset.request('./bennu') +asset.request('./model') +asset.request('./trail') + +asset.require('./script_schedule') + +local mission = asset.localResource('osirisrex.mission') +local missionName + +asset.onInitialize(function() + missionName = openspace.loadMission(mission) +end) + +asset.onDeinitialize(function() + openspace.unloadMission(missionName) +end) diff --git a/data/assets/scene/solarsystem/missions/osirisrex/osirisrex.mission b/data/assets/scene/solarsystem/missions/osirisrex/osirisrex.mission new file mode 100644 index 0000000000..3e35cffd28 --- /dev/null +++ b/data/assets/scene/solarsystem/missions/osirisrex/osirisrex.mission @@ -0,0 +1,386 @@ +--[[ + +References: +[1] Source : http://www.asteroidmission.org/about-mission/ + Date : 2016-08-23 + Comment : Precision is not even month - it just defines the overall mission approach + +[2] Source : http://brinktest.lpl.arizona.edu/mission/ + Date : 2016-08-23 + Comment : Data taken from text descriptions of the visualizations. There is a little time bar up + in the upper right corner. + +[3] Source : SPICE kernel data coverage + Date : 2016-08-23 + Comment : The spice data is split up into across different files. These files + seems to represent different phases. A script was used to extract the + SPICE coverage from all .bc files and use the names of the files as + mission names and associate the name with the time coverage. + Script used: support/mission/ckbrief2mission.js + +[4] Source : Visual interpretation of SPICE kernel data coverage + Date : 2016-08-23 + Comment : Based on observation of the visualized spice data through OpenSpace. + +--]] + +return { + Name = "OSIRIS-REx", + Phases = { + -- All 1-level phases based on [1] + { + Name = "Planning and Fabrication", + TimeRange = { Start = "2012 JAN 01 00:00:00", End = "2016 SEP 08 23:05:00" } + }, + { + Name = "Outbound Cruise", + TimeRange = { Start = "2016 SEP 03 00:00:00", End = "2018 SEP 01 01:00:00" }, + Phases = { + -- Phases from [4] + { + Name = "Pre Launch", + TimeRange = { Start = "2016 SEP 03 01:00:00", End = "2016 SEP 08 23:05:05" } + }, + { + Name = "Launch", TimeRange = { Start = "2016 SEP 08 23:05:05", End = "2016 SEP 08 23:09:00" } + }, + { + Name = "Earth Orbit", TimeRange = { Start = "2016 SEP 08 23:09:00", End = "2016 SEP 08 23:45:00" } + }, + { + Name = "Solar Orbit", TimeRange = { Start = "2016 SEP 08 23:45:00", End = "2018 SEP 01 00:00:00" } + }, + { + Name = "Upcoming Gravity Assist", TimeRange = { Start = "2017 JAN 22 15:00:00", End = "2017 SEP 22 15:00:00" } + }, + { + Name = "Gravity Assist", TimeRange = { Start = "2017 SEP 22 15:00:00", End = "2017 SEP 22 21:00:00" } + } + } + }, + { + Name = "Asteroid Operations", + Phases = { + -- Nested Levels from [3] + { + Name = "03_Approach", Phases = { + { + Name = "DustSearch_v1", + Phases = { + { + Name = "Phase03_AP_DustSearch_1.bc", + TimeRange = { Start = "2018-SEP-11 21:31:01.183", End = "2018-SEP-12 02:18:41.183" } + } + } + }, + { + Name = "LightCurve_v1", + Phases = { + { + Name = "Phase03_AP_LightCurve_1.bc", + TimeRange = { Start = "2018-OCT-09 21:50:48.182", End = "2018-OCT-10 02:33:16.183" } + }, + { + Name = "Phase03_AP_LightCurve_2.bc", + TimeRange = { Start = "2018-OCT-10 21:50:48.182", End = "2018-OCT-11 02:33:16.183" } + } + } + }, + { + Name = "NatSatSearch_v1", + Phases = { + { + Name = "Phase03_AP_SatSearch_1.bc", + TimeRange = { Start = "2018-OCT-26 19:38:30.183", End = "2018-OCT-27 00:22:34.183" } + }, + { + Name = "Phase03_AP_SatSearch_2.bc", + TimeRange = { Start = "2018-NOV-05 17:10:20.183", End = "2018-NOV-05 21:59:48.183" } + } + } + }, + { + Name = "PhaseFunction_v1", + Phases = { + { + Name = "Phase03_AP_PhaseFunction_1.bc", + TimeRange = { Start = "2018-OCT-12 21:42:26.183", End = "2018-OCT-13 02:24:54.183" } + } + } + }, + { + Name = "ShapeModel_v1", Phases = { + { + Name = "Phase03_AP_ShapeModel_1.bc", + TimeRange = { Start = "2018-NOV-09 11:02:59.183", End = "2018-NOV-09 15:52:27.183" } + }, + { + Name = "Phase03_AP_ShapeModel_2.bc", + TimeRange = { Start = "2018-NOV-10 11:02:59.183", End = "2018-NOV-10 15:52:27.183" } + }, + { + Name = "Phase03_AP_ShapeModel_3.bc", + TimeRange = { Start = "2018-NOV-11 11:02:59.183", End = "2018-NOV-11 15:52:27.183" } + }, + { + Name = "Phase03_AP_ShapeModel_4.bc", + TimeRange = { Start = "2018-NOV-12 11:02:59.183", End = "2018-NOV-12 15:52:27.183" } + }, + { + Name = "Phase03_AP_ShapeModel_5.bc", + TimeRange = { Start = "2018-NOV-13 11:02:59.183", End = "2018-NOV-13 15:52:27.183" } + }, + { + Name = "Phase03_AP_ShapeModel_6.bc", + TimeRange = { Start = "2018-NOV-14 11:03:53.183", End = "2018-NOV-14 15:51:33.183" } + }, + { + Name = "Phase03_AP_ShapeModel_7.bc", + TimeRange = { Start = "2018-NOV-15 11:03:53.183", End = "2018-NOV-15 15:51:33.183" } + }, + { + Name = "Phase03_AP_ShapeModel_8.bc", + TimeRange = { Start = "2018-NOV-16 11:03:53.183", End = "2018-NOV-16 15:51:33.183" } + }, + { + Name = "Phase03_AP_ShapeModel_9_Forced4x4.bc", + TimeRange = { Start = "2018-NOV-17 11:03:54.183", End = "2018-NOV-17 15:51:34.183" } + } + } + }, + { + Name = "SpectraMap_v1", + Phases = { + { + Name = "Phase03_AP_SpectraMap_1.bc", + TimeRange = { Start = "2018-OCT-30 20:44:53.183", End = "2018-OCT-31 01:34:21.183" } + } + } + } + } + }, + { + Name = "04_PrelimSurvey", + Phases = { + { + Name = "MapCamOLA_v1", + Phases = { + { + Name = "Phase04_PS_MC_1_v1_1a.bc", + TimeRange = { Start = "2018-NOV-20 01:13:12.183", End = "2018-NOV-20 06:13:04.183" } + }, + { + Name = "Phase04_PS_MC_2_v1_1a.bc", + TimeRange = { Start = "2018-NOV-28 01:13:12.183", End = "2018-NOV-28 06:13:04.183" } + } + } + }, + { + Name = "OLA_v1", + Phases = { + { + Name = "Phase04_PS_OLA_Nominal_1.bc", + TimeRange = { Start = "2018-NOV-19 22:30:00.184", End = "2018-NOV-19 23:19:28.183" } + }, + { + Name = "Phase04_PS_OLA_Nominal_2.bc", + TimeRange = { Start = "2018-NOV-23 22:19:34.184", End = "2018-NOV-23 23:19:26.183" } + }, + { + Name = "Phase04_PS_OLA_Nominal_3.bc", + TimeRange = { Start = "2018-NOV-24 00:48:38.184", End = "2018-NOV-24 01:38:06.184" } + }, + { + Name = "Phase04_PS_OLA_Nominal_4.bc", + TimeRange = { Start = "2018-NOV-27 22:29:58.184", End = "2018-NOV-27 23:19:26.183" } + } + } + }, + { + Name = "PolyCam_v1", + Phases = { + { + Name = "Phase04_PS_PolyCam_1.bc", + TimeRange = { Start = "2018-NOV-19 12:00:33.183", End = "2018-NOV-19 16:46:25.183" } + }, + { + Name = "Phase04_PS_PolyCam_2.bc", + TimeRange = { Start = "2018-NOV-20 07:10:26.183", End = "2018-NOV-20 12:10:18.183" } + }, + { + Name = "Phase04_PS_PolyCam_3.bc", + TimeRange = { Start = "2018-NOV-23 11:51:29.184", End = "2018-NOV-23 16:51:21.184" } + }, + { + Name = "Phase04_PS_PolyCam_4.bc", + TimeRange = { Start = "2018-NOV-24 07:17:39.184", End = "2018-NOV-24 12:03:31.184" } + }, + { + Name = "Phase04_PS_PolyCam_5.bc", + TimeRange = { Start = "2018-NOV-27 12:00:20.184", End = "2018-NOV-27 16:46:12.184" } + }, + { + Name = "Phase04_PS_PolyCam_6.bc", + TimeRange = { Start = "2018-NOV-28 07:10:35.183", End = "2018-NOV-28 12:10:27.183" } + } + } + }, + } + }, + { + Name = "06_DetailedSurvey", + Phases = { + { + Name = "BaseballDiamond_v2", + Phases = { + { + Name = "atl_19013_18_BBD1_v2.bc", + TimeRange = { Start = "2019-JAN-13 18:59:31.195", End = "2019-JAN-13 23:59:29.179" } + }, + { + Name = "atl_19014_16_BBD2_v2.bc", + TimeRange = { Start = "2019-JAN-14 16:56:01.185", End = "2019-JAN-14 21:55:58.219" } + }, + { + Name = "atl_19020_18_BBD3_v2.bc", + TimeRange = { Start = "2019-JAN-20 18:59:15.211", End = "2019-JAN-20 23:59:13.195" } + }, + { + Name = "atl_19021_19_BBD4_v2.bc", + TimeRange = { Start = "2019-JAN-21 19:26:47.179", End = "2019-JAN-22 00:26:44.213" } + } + } + }, + { + Name = "EquatorialStations_v1", + Phases = { + { + Name = "Phase06_DS_Equatorial_Stations_1.bc", + TimeRange = { Start = "2019-JAN-27 10:36:24.185", End = "2019-JAN-27 15:20:28.185" } + }, + { + Name = "Phase06_DS_Equatorial_Stations_2.bc", + TimeRange = { Start = "2019-FEB-03 10:35:30.185", End = "2019-FEB-03 15:21:22.185" } + }, + { + Name = "Phase06_DS_Equatorial_Stations_3.bc", + TimeRange = { Start = "2019-FEB-10 10:51:50.185", End = "2019-FEB-10 15:51:42.185" } + }, + { + Name = "Phase06_DS_Equatorial_Stations_4.bc", + TimeRange = { Start = "2019-FEB-17 10:29:11.186", End = "2019-FEB-17 15:29:03.186" } + }, + { + Name = "Phase06_DS_Equatorial_Stations_5.bc", + TimeRange = { Start = "2019-FEB-24 10:08:28.186", End = "2019-FEB-24 15:08:20.185" } + }, + { + Name = "Phase06_DS_Equatorial_Stations_6.bc", + TimeRange = { Start = "2019-MAR-03 09:52:58.186", End = "2019-MAR-03 14:42:26.186" } + }, + { + Name = "Phase06_DS_Equatorial_Stations_7.bc", + TimeRange = { Start = "2019-MAR-10 09:57:47.186", End = "2019-MAR-10 14:36:33.186" } + } + } + }, + { + Name = "PlumeSearch_v1", + Phases = { + { + Name = "Phase06_DS_Plume_Search_1.bc", + TimeRange = { Start = "2019-JAN-28 10:34:36.185", End = "2019-JAN-28 15:22:16.185" } + }, + { + Name = "Phase06_DS_Plume_Search_2.bc", + TimeRange = { Start = "2019-FEB-18 10:29:11.186", End = "2019-FEB-18 15:29:03.186" } + } + } + } + } + }, + { + Name = "07_OrbitalB", + Phases = { + { + Name = "CandidateSampleSite_v1", + Phases = { + { + Name = "Phase07_OB_CSS_Mapping_1.bc", + TimeRange = { Start = "2019-APR-08 10:35:27.186", End = "2019-APR-08 15:22:06.186" } + }, + { + Name = "Phase07_OB_CSS_Mapping_2.bc", + TimeRange = { Start = "2019-APR-08 16:16:06.186", End = "2019-APR-11 10:38:58.186" } + }, + { + Name = "Phase07_OB_CSS_Mapping_3.bc", + TimeRange = { Start = "2019-APR-22 17:51:23.186", End = "2019-APR-29 19:41:03.186" } + } + } + } + } + }, + { + Name = "08_Recon", + Phases = { + { + Name = "225m_Sortie_v2", + Phases = { + { + Name = "Recon_225mSortie_Case02_0Latitude.bc", + TimeRange = { Start = "2019-MAY-25 03:50:31.195", End = "2019-MAY-25 04:32:17.227" } + }, + { + Name = "Recon_225mSortie_Case05_20negLatitude.bc", + TimeRange = { Start = "2019-MAY-25 03:50:48.216", End = "2019-MAY-25 04:37:10.209" } + }, + { + Name = "Recon_225mSortie_Case08_40negLatitude.bc", + TimeRange = { Start = "2019-MAY-25 04:02:43.176", End = "2019-MAY-25 04:54:41.179" } + }, + { + Name = "Recon_225mSortie_Case11_60negLatitude.bc", + TimeRange = { Start = "2019-MAY-25 04:21:46.161", End = "2019-MAY-25 05:18:44.232" } + } + } + }, + { + Name = "525m_Sortie_v2", + Phases = { + { + Name = "Recon_525mSortie_Case02_0Latitude.bc", + TimeRange = { Start = "2019-MAY-25 04:06:39.220", End = "2019-MAY-25 04:44:17.198" } + }, + { + Name = "Recon_525mSortie_Case05_20negLatitude.bc", + TimeRange = { Start = "2019-MAY-25 04:11:39.201", End = "2019-MAY-25 04:49:37.224" } + }, + { + Name = "Recon_525mSortie_Case05_NominalProfile.bc", + TimeRange = { Start = "2019-MAY-25 03:01:50.184", End = "2019-MAY-25 06:38:50.232" } + }, + { + Name = "Recon_525mSortie_Case08_NominalProfile.bc", + TimeRange = { Start = "2019-MAY-25 03:01:50.184", End = "2019-MAY-25 06:38:50.232" } + } + } + } + } + } + -- End of [3] + } + }, + { + Name = "Backup Time", + TimeRange = { Start = "2020 JAN 01 00:00:00", End = "2021 JAN 01 00:00:00" } + }, + { + Name = "Return Cruise", + TimeRange = { Start = "2021 JAN 01 00:00:00", End = "2023 SEP 20 00:00:00"} + }, + -- Not too interesting in terms of space visualization --> out commented + -- { Name = "Sample Analysis", TimeRange = { Start = "2023 JAN 01 00:00:00", End = "2025 JUN 01 00:00:00" } }, + -- End of [1] + } +} diff --git a/data/assets/scene/solarsystem/missions/osirisrex/script_schedule.asset b/data/assets/scene/solarsystem/missions/osirisrex/script_schedule.asset new file mode 100644 index 0000000000..4bbf29979c --- /dev/null +++ b/data/assets/scene/solarsystem/missions/osirisrex/script_schedule.asset @@ -0,0 +1,18 @@ +local scriptSchedulerHelper = asset.require('util/script_scheduler_helper') + +asset.onInitialize(function () + scriptSchedulerHelper.scheduleRenderableEnabled("2016 SEP 08 23:05:00", "Scene.OsirisRexTrailSolarSystem", false) + scriptSchedulerHelper.scheduleRenderableEnabled("2016 SEP 08 23:05:00", "Scene.OsirisRexTrailBennu", false) + scriptSchedulerHelper.scheduleRenderableEnabledReversable("2016 SEP 08 23:05:01", "Scene.OsirisRexTrailEarth", true) + scriptSchedulerHelper.scheduleRenderableEnabledReversable("2016 SEP 09 00:00:00", "Scene.OsirisRexTrailSolarSystem", true) + scriptSchedulerHelper.scheduleRenderableEnabledReversable("2016 SEP 09 02:00:00", "Scene.OsirisRexTrailEarth", false) + scriptSchedulerHelper.scheduleRenderableEnabledReversable("2018 OCT 11 00:00:00", "Scene.OsirisRexTrailBennu", true) + scriptSchedulerHelper.scheduleRenderableEnabledReversable("2018 OCT 15 00:00:00", "Scene.OsirisRexTrailSolarSystem", false) + scriptSchedulerHelper.scheduleRenderableEnabledReversable("2019 AUG 01 00:00:00", "Scene.OsirisRexTrailSolarSystem", true) + scriptSchedulerHelper.scheduleRenderableEnabledReversable("2019 AUG 01 00:00:00", "Scene.OsirisRexTrailBennu", false) +end) + + +asset.onDeinitialize(function () + openspace.scriptScheduler.clear() +end) \ No newline at end of file diff --git a/data/assets/scene/solarsystem/missions/osirisrex/spice_kernel_times.mission b/data/assets/scene/solarsystem/missions/osirisrex/spice_kernel_times.mission new file mode 100644 index 0000000000..4032141bd6 --- /dev/null +++ b/data/assets/scene/solarsystem/missions/osirisrex/spice_kernel_times.mission @@ -0,0 +1,95 @@ +return +{ Name = "Nominal_Observations_Science", Phases = { + { Name = "03_Approach", Phases = { + { Name = "DustSearch_v1", Phases = { + { Name = "Phase03_AP_DustSearch_1.bc", TimeRange = { Start = "2018-SEP-11 21:31:01.183", End = "2018-SEP-12 02:18:41.183" }}, + }}, + { Name = "LightCurve_v1", Phases = { + { Name = "Phase03_AP_LightCurve_1.bc", TimeRange = { Start = "2018-OCT-09 21:50:48.182", End = "2018-OCT-10 02:33:16.183" }}, + { Name = "Phase03_AP_LightCurve_2.bc", TimeRange = { Start = "2018-OCT-10 21:50:48.182", End = "2018-OCT-11 02:33:16.183" }}, + }}, + { Name = "NatSatSearch_v1", Phases = { + { Name = "Phase03_AP_SatSearch_1.bc", TimeRange = { Start = "2018-OCT-26 19:38:30.183", End = "2018-OCT-27 00:22:34.183" }}, + { Name = "Phase03_AP_SatSearch_2.bc", TimeRange = { Start = "2018-NOV-05 17:10:20.183", End = "2018-NOV-05 21:59:48.183" }}, + }}, + { Name = "PhaseFunction_v1", Phases = { + { Name = "Phase03_AP_PhaseFunction_1.bc", TimeRange = { Start = "2018-OCT-12 21:42:26.183", End = "2018-OCT-13 02:24:54.183" }}, + }}, + { Name = "ShapeModel_v1", Phases = { + { Name = "Phase03_AP_ShapeModel_1.bc", TimeRange = { Start = "2018-NOV-09 11:02:59.183", End = "2018-NOV-09 15:52:27.183" }}, + { Name = "Phase03_AP_ShapeModel_2.bc", TimeRange = { Start = "2018-NOV-10 11:02:59.183", End = "2018-NOV-10 15:52:27.183" }}, + { Name = "Phase03_AP_ShapeModel_3.bc", TimeRange = { Start = "2018-NOV-11 11:02:59.183", End = "2018-NOV-11 15:52:27.183" }}, + { Name = "Phase03_AP_ShapeModel_4.bc", TimeRange = { Start = "2018-NOV-12 11:02:59.183", End = "2018-NOV-12 15:52:27.183" }}, + { Name = "Phase03_AP_ShapeModel_5.bc", TimeRange = { Start = "2018-NOV-13 11:02:59.183", End = "2018-NOV-13 15:52:27.183" }}, + { Name = "Phase03_AP_ShapeModel_6.bc", TimeRange = { Start = "2018-NOV-14 11:03:53.183", End = "2018-NOV-14 15:51:33.183" }}, + { Name = "Phase03_AP_ShapeModel_7.bc", TimeRange = { Start = "2018-NOV-15 11:03:53.183", End = "2018-NOV-15 15:51:33.183" }}, + { Name = "Phase03_AP_ShapeModel_8.bc", TimeRange = { Start = "2018-NOV-16 11:03:53.183", End = "2018-NOV-16 15:51:33.183" }}, + { Name = "Phase03_AP_ShapeModel_9_Forced4x4.bc", TimeRange = { Start = "2018-NOV-17 11:03:54.183", End = "2018-NOV-17 15:51:34.183" }}, + }}, + { Name = "SpectraMap_v1", Phases = { + { Name = "Phase03_AP_SpectraMap_1.bc", TimeRange = { Start = "2018-OCT-30 20:44:53.183", End = "2018-OCT-31 01:34:21.183" }}, + }}, + }}, + { Name = "04_PrelimSurvey", Phases = { + { Name = "MapCamOLA_v1", Phases = { + { Name = "Phase04_PS_MC_1_v1_1a.bc", TimeRange = { Start = "2018-NOV-20 01:13:12.183", End = "2018-NOV-20 06:13:04.183" }}, + { Name = "Phase04_PS_MC_2_v1_1a.bc", TimeRange = { Start = "2018-NOV-28 01:13:12.183", End = "2018-NOV-28 06:13:04.183" }}, + }}, + { Name = "OLA_v1", Phases = { + { Name = "Phase04_PS_OLA_Nominal_1.bc", TimeRange = { Start = "2018-NOV-19 22:30:00.184", End = "2018-NOV-19 23:19:28.183" }}, + { Name = "Phase04_PS_OLA_Nominal_2.bc", TimeRange = { Start = "2018-NOV-23 22:19:34.184", End = "2018-NOV-23 23:19:26.183" }}, + { Name = "Phase04_PS_OLA_Nominal_3.bc", TimeRange = { Start = "2018-NOV-24 00:48:38.184", End = "2018-NOV-24 01:38:06.184" }}, + { Name = "Phase04_PS_OLA_Nominal_4.bc", TimeRange = { Start = "2018-NOV-27 22:29:58.184", End = "2018-NOV-27 23:19:26.183" }}, + }}, + { Name = "PolyCam_v1", Phases = { + { Name = "Phase04_PS_PolyCam_1.bc", TimeRange = { Start = "2018-NOV-19 12:00:33.183", End = "2018-NOV-19 16:46:25.183" }}, + { Name = "Phase04_PS_PolyCam_2.bc", TimeRange = { Start = "2018-NOV-20 07:10:26.183", End = "2018-NOV-20 12:10:18.183" }}, + { Name = "Phase04_PS_PolyCam_3.bc", TimeRange = { Start = "2018-NOV-23 11:51:29.184", End = "2018-NOV-23 16:51:21.184" }}, + { Name = "Phase04_PS_PolyCam_4.bc", TimeRange = { Start = "2018-NOV-24 07:17:39.184", End = "2018-NOV-24 12:03:31.184" }}, + { Name = "Phase04_PS_PolyCam_5.bc", TimeRange = { Start = "2018-NOV-27 12:00:20.184", End = "2018-NOV-27 16:46:12.184" }}, + { Name = "Phase04_PS_PolyCam_6.bc", TimeRange = { Start = "2018-NOV-28 07:10:35.183", End = "2018-NOV-28 12:10:27.183" }}, + }}, + }}, + { Name = "06_DetailedSurvey", Phases = { + { Name = "BaseballDiamond_v2", Phases = { + { Name = "atl_19013_18_BBD1_v2.bc", TimeRange = { Start = "2019-JAN-13 18:59:31.195", End = "2019-JAN-13 23:59:29.179" }}, + { Name = "atl_19014_16_BBD2_v2.bc", TimeRange = { Start = "2019-JAN-14 16:56:01.185", End = "2019-JAN-14 21:55:58.219" }}, + { Name = "atl_19020_18_BBD3_v2.bc", TimeRange = { Start = "2019-JAN-20 18:59:15.211", End = "2019-JAN-20 23:59:13.195" }}, + { Name = "atl_19021_19_BBD4_v2.bc", TimeRange = { Start = "2019-JAN-21 19:26:47.179", End = "2019-JAN-22 00:26:44.213" }}, + }}, + { Name = "EquatorialStations_v1", Phases = { + { Name = "Phase06_DS_Equatorial_Stations_1.bc", TimeRange = { Start = "2019-JAN-27 10:36:24.185", End = "2019-JAN-27 15:20:28.185" }}, + { Name = "Phase06_DS_Equatorial_Stations_2.bc", TimeRange = { Start = "2019-FEB-03 10:35:30.185", End = "2019-FEB-03 15:21:22.185" }}, + { Name = "Phase06_DS_Equatorial_Stations_3.bc", TimeRange = { Start = "2019-FEB-10 10:51:50.185", End = "2019-FEB-10 15:51:42.185" }}, + { Name = "Phase06_DS_Equatorial_Stations_4.bc", TimeRange = { Start = "2019-FEB-17 10:29:11.186", End = "2019-FEB-17 15:29:03.186" }}, + { Name = "Phase06_DS_Equatorial_Stations_5.bc", TimeRange = { Start = "2019-FEB-24 10:08:28.186", End = "2019-FEB-24 15:08:20.185" }}, + { Name = "Phase06_DS_Equatorial_Stations_6.bc", TimeRange = { Start = "2019-MAR-03 09:52:58.186", End = "2019-MAR-03 14:42:26.186" }}, + { Name = "Phase06_DS_Equatorial_Stations_7.bc", TimeRange = { Start = "2019-MAR-10 09:57:47.186", End = "2019-MAR-10 14:36:33.186" }}, + }}, + { Name = "PlumeSearch_v1", Phases = { + { Name = "Phase06_DS_Plume_Search_1.bc", TimeRange = { Start = "2019-JAN-28 10:34:36.185", End = "2019-JAN-28 15:22:16.185" }}, + { Name = "Phase06_DS_Plume_Search_2.bc", TimeRange = { Start = "2019-FEB-18 10:29:11.186", End = "2019-FEB-18 15:29:03.186" }}, + }}, + }}, + { Name = "07_OrbitalB", Phases = { + { Name = "CandidateSampleSite_v1", Phases = { + { Name = "Phase07_OB_CSS_Mapping_1.bc", TimeRange = { Start = "2019-APR-08 10:35:27.186", End = "2019-APR-08 15:22:06.186" }}, + { Name = "Phase07_OB_CSS_Mapping_2.bc", TimeRange = { Start = "2019-APR-08 16:16:06.186", End = "2019-APR-11 10:38:58.186" }}, + { Name = "Phase07_OB_CSS_Mapping_3.bc", TimeRange = { Start = "2019-APR-22 17:51:23.186", End = "2019-APR-29 19:41:03.186" }}, + }}, + }}, + { Name = "08_Recon", Phases = { + { Name = "225m_Sortie_v2", Phases = { + { Name = "Recon_225mSortie_Case02_0Latitude.bc", TimeRange = { Start = "2019-MAY-25 03:50:31.195", End = "2019-MAY-25 04:32:17.227" }}, + { Name = "Recon_225mSortie_Case05_20negLatitude.bc", TimeRange = { Start = "2019-MAY-25 03:50:48.216", End = "2019-MAY-25 04:37:10.209" }}, + { Name = "Recon_225mSortie_Case08_40negLatitude.bc", TimeRange = { Start = "2019-MAY-25 04:02:43.176", End = "2019-MAY-25 04:54:41.179" }}, + { Name = "Recon_225mSortie_Case11_60negLatitude.bc", TimeRange = { Start = "2019-MAY-25 04:21:46.161", End = "2019-MAY-25 05:18:44.232" }}, + }}, + { Name = "525m_Sortie_v2", Phases = { + { Name = "Recon_525mSortie_Case02_0Latitude.bc", TimeRange = { Start = "2019-MAY-25 04:06:39.220", End = "2019-MAY-25 04:44:17.198" }}, + { Name = "Recon_525mSortie_Case05_20negLatitude.bc", TimeRange = { Start = "2019-MAY-25 04:11:39.201", End = "2019-MAY-25 04:49:37.224" }}, + { Name = "Recon_525mSortie_Case05_NominalProfile.bc", TimeRange = { Start = "2019-MAY-25 03:01:50.184", End = "2019-MAY-25 06:38:50.232" }}, + { Name = "Recon_525mSortie_Case08_NominalProfile.bc", TimeRange = { Start = "2019-MAY-25 03:01:50.184", End = "2019-MAY-25 06:38:50.232" }}, + }}, + }}, +}} \ No newline at end of file diff --git a/data/assets/scene/solarsystem/missions/osirisrex/trail.asset b/data/assets/scene/solarsystem/missions/osirisrex/trail.asset new file mode 100644 index 0000000000..b156ee96c6 --- /dev/null +++ b/data/assets/scene/solarsystem/missions/osirisrex/trail.asset @@ -0,0 +1,80 @@ +local assetHelper = asset.require('util/asset_helper') +local transforms = asset.require('./transforms') +local sunTransforms = asset.require('scene/solarsystem/sun/transforms') +local earthTransforms = asset.require('scene/solarsystem/planets/earth/transforms') + + + +local BENNU_BODY = "2101955" + +local OsirisRexTrailEarth = { + Identifier = "OsirisRexTrailEarth", + Parent = earthTransforms.EarthIAU.Identifier, + Renderable = { + Type = "RenderableTrailTrajectory", + Translation = { + Type = "SpiceTranslation", + Target = "OSIRIS-REX", + Frame = "IAU_EARTH", + Observer = "EARTH" + }, + Color = { 0.9, 0.9, 0.0 }, + StartTime = "2016 SEP 8 23:05:00.50", + EndTime = "2016 SEP 9 00:05:00", + SampleInterval = 60 + }, + GUI = { + Name = "OSIRIS REx Trail Earth", + Path = "/Solar System/Missions/OSIRIS REx" + } +} + +local OsirisRexTrailSolarSystem = { + Identifier = "OsirisRexTrailSolarSystem", + Parent = sunTransforms.SolarSystemBarycenter.Identifier, + Renderable = { + Type = "RenderableTrailTrajectory", + Translation = { + Type = "SpiceTranslation", + Target = "OSIRIS-REX", + Observer = "SUN" + }, + Color = { 0.2, 0.9, 0.2 }, + StartTime = "2016 SEP 8 23:05:00.50", + EndTime = "2023 SEP 24 12:00:00", + SampleInterval = 3600 + }, + GUI = { + Name = "OSIRIS REx Trail Solar System", + Path = "/Solar System/Missions/OSIRIS REx" + } +} + +local OsirisRexTrailBennu = { + Identifier = "OsirisRexTrailBennu", + Parent = transforms.BennuBarycenter.Identifier, + Renderable = { + Type = "RenderableTrailTrajectory", + Translation = { + Type = "SpiceTranslation", + Target = "OSIRIS-REX", + Observer = BENNU_BODY + }, + Color = { 0.9, 0.2, 0.9 }, + StartTime = "2018 SEP 4 00:00:00", + EndTime = "2023 SEP 24 12:00:00", + SampleInterval = 3600 + }, + GUI = { + Name = "OSIRIS REx Trail Bennu", + Path = "/Solar System/Missions/OSIRIS REx" + } +} + + + +assetHelper.registerSceneGraphNodesAndExport(asset, { + OsirisRexTrailEarth, + OsirisRexTrailSolarSystem, + OsirisRexTrailBennu +}) diff --git a/data/assets/scene/solarsystem/missions/osirisrex/transforms.asset b/data/assets/scene/solarsystem/missions/osirisrex/transforms.asset new file mode 100644 index 0000000000..e464ab5e20 --- /dev/null +++ b/data/assets/scene/solarsystem/missions/osirisrex/transforms.asset @@ -0,0 +1,26 @@ +local assetHelper = asset.require('util/asset_helper') +local transforms = asset.require('scene/solarsystem/sun/transforms') + + + +local BENNU_BODY = "2101955" + +local BennuBarycenter = { + Identifier = "BennuBarycenter", + Parent = transforms.SolarSystemBarycenter.Identifier, + Transform = { + Translation = { + Type = "SpiceTranslation", + Target = BENNU_BODY, + Observer = "SUN" + } + }, + GUI = { + Name = "Bennu Barycenter", + Path = "/Solar System/Missions/OSIRIS REx" + } +} + + + +assetHelper.registerSceneGraphNodesAndExport(asset, { BennuBarycenter }) diff --git a/data/assets/scene/solarsystem/missions/pioneer/pioneer10.asset b/data/assets/scene/solarsystem/missions/pioneer/pioneer10.asset new file mode 100644 index 0000000000..40ec1f9334 --- /dev/null +++ b/data/assets/scene/solarsystem/missions/pioneer/pioneer10.asset @@ -0,0 +1,75 @@ +local assetHelper = asset.require('util/asset_helper') +local sunTransforms = asset.require('scene/solarsystem/sun/transforms') + +local modelFolder = asset.syncedResource({ + Name = "Pioneer 10/11 Models", + Type = "HttpSynchronization", + Identifier = "pioneer_10_11_model", + Version = 2 +}) + +local kernelsFolder = asset.syncedResource({ + Name = "Pioneer Kernels", + Type = "HttpSynchronization", + Identifier = "pioneer_10_spice", + Version = 1 +}) + +local kernelsList = {kernelsFolder .. '/p10-a.bsp'} + +local Pioneer10NAIF = "-23" + +local Pioneer10 = { + Identifier = "Pioneer10", + Parent = sunTransforms.SolarSystemBarycenter.Identifier, + Transform = { + Translation = { + Type = "SpiceTranslation", + Target = Pioneer10NAIF, + Observer = "SUN", + Kernels = kernelsList + }, + }, + Renderable = { + Type = "RenderableModel", + Geometry = { + Type = "MultiModelGeometry", + GeometryFile = modelFolder .. "/Pioneer.obj" + }, + ColorTexture = modelFolder .. "/gray.png", + LightSources = assetHelper.getDefaultLightSources(sunTransforms.SolarSystemBarycenter.Identifier) + }, + GUI = { + Name = "Pioneer 10", + Path = "/Solar System/Missions/Pioneer/10" + } +} + +local Pioneer10Trail = { + Identifier = "Pioneer10Trail", + Parent = sunTransforms.SolarSystemBarycenter.Identifier, + Renderable = { + Type = "RenderableTrailTrajectory", + Translation = { + Type = "SpiceTranslation", + Target = Pioneer10NAIF, + Observer = "SUN", + Kernels = kernelsList + }, + Color = { 0.70, 0.50, 0.20 }, + StartTime = "1972 MAR 03 02:04:00", + EndTime = "1990 JAN 02 00:00:00", + EnableFade = false, + SampleInterval = 6545 * 2 + -- 6545 is the number of days between the Start and End time (aka sample every 2d) + }, + GUI = { + Name = "Pioneer 10 Trail", + Path = "/Solar System/Missions/Pioneer/10" + } +} + +assetHelper.registerSceneGraphNodesAndExport(asset, { + Pioneer10, + Pioneer10Trail, +}) diff --git a/data/assets/scene/solarsystem/missions/pioneer/pioneer11.asset b/data/assets/scene/solarsystem/missions/pioneer/pioneer11.asset new file mode 100644 index 0000000000..2b97f8e720 --- /dev/null +++ b/data/assets/scene/solarsystem/missions/pioneer/pioneer11.asset @@ -0,0 +1,78 @@ +local assetHelper = asset.require('util/asset_helper') +local sunTransforms = asset.require('scene/solarsystem/sun/transforms') + +local modelFolder = asset.syncedResource({ + Name = "Pioneer 10/11 Models", + Type = "HttpSynchronization", + Identifier = "pioneer_10_11_model", + Version = 2 +}) + +local kernelsFolder = asset.syncedResource({ + Name = "Pioneer Kernels", + Type = "HttpSynchronization", + Identifier = "pioneer_11_spice", + Version = 1 +}) + +local kernelsList = { + kernelsFolder .. '/p11-a.bsp', + kernelsFolder .. '/p11_sat336.bsp' +} + +local Pioneer11NAIF = "-24" + +local Pioneer11 = { + Identifier = "Pioneer_11", + Parent = sunTransforms.SolarSystemBarycenter.Identifier, + Transform = { + Translation = { + Type = "SpiceTranslation", + Target = Pioneer11NAIF, + Observer = "SUN", + Kernels = kernelsList + }, + }, + Renderable = { + Type = "RenderableModel", + Geometry = { + Type = "MultiModelGeometry", + GeometryFile = modelFolder .. "/Pioneer.obj" + }, + ColorTexture = modelFolder .. "/gray.png", + LightSources = assetHelper.getDefaultLightSources(sunTransforms.SolarSystemBarycenter.Identifier) + }, + GUI = { + Name = "Pioneer 11", + Path = "/Solar System/Missions/Pioneer/11" + } +} + +local Pioneer11Trail = { + Identifier = "Pioneer11Trail", + Parent = sunTransforms.SolarSystemBarycenter.Identifier, + Renderable = { + Type = "RenderableTrailTrajectory", + Translation = { + Type = "SpiceTranslation", + Target = Pioneer11NAIF, + Observer = "SUN", + Kernels = kernelsList + }, + Color = { 0.70, 0.50, 0.20 }, + StartTime = "1973 APR 06 02:25:00.000", + EndTime = "1990 JAN 02 00:00:00.000", + EnableFade = false, + SampleInterval = 6087 * 2 + --6087 is the number of days between the Start and End time (so sample every 2d) + }, + GUI = { + Name = "Pioneer 11 Trail", + Path = "/Solar System/Missions/Pioneer/11" + } +} + +assetHelper.registerSceneGraphNodesAndExport(asset, { + Pioneer11, + Pioneer11Trail, +}) diff --git a/data/assets/scene/solarsystem/missions/rosetta/67p.asset b/data/assets/scene/solarsystem/missions/rosetta/67p.asset new file mode 100644 index 0000000000..c5882719df --- /dev/null +++ b/data/assets/scene/solarsystem/missions/rosetta/67p.asset @@ -0,0 +1,154 @@ +local assetHelper = asset.require('util/asset_helper') +local transforms = asset.require('scene/solarsystem/sun/transforms') + + + +local textures = asset.syncedResource({ + Name = "67P Textures", + Type = "HttpSynchronization", + Identifier = "67p_textures", + Version = 2 +}) + +local models = asset.syncedResource({ + Name = "67P Models", + Type = "HttpSynchronization", + Identifier = "67p_models", + Version = 1 +}) + +local images = asset.syncedResource({ + Name = "Rosetta Images", + Type = "HttpSynchronization", + Identifier = "rosettaimages", + Version = 2 +}) + +local imagesDestination = images .. "/images" + +local Barycenter = { + Identifier = "67PBarycenter", + Parent = transforms.SolarSystemBarycenter.Identifier, + Transform = { + Translation = { + Type = "SpiceTranslation", + Target = "CHURYUMOV-GERASIMENKO", + Observer = "SUN" + } + }, + GUI = { + Name = "67P Barycenter", + Path = "/Solar System/Comets/67P Churymov-Gerasimenko" + } +} + +local Comet67P = { + Identifier = "67P", + Parent = Barycenter.Identifier, + Transform = { + Rotation = { + Type = "SpiceRotation", + SourceFrame = "67P/C-G_CK", + DestinationFrame = "GALACTIC" + } + }, + Renderable = { + Type = "RenderableModelProjection", + Geometry = { + Type = "MultiModelGeometry", + GeometryFile = models .. "/67P_rotated_5_130.obj" + }, + ColorTexture = textures .. "/gray.jpg", + Projection = { + Sequence = { imagesDestination }, + SequenceType = "image-sequence", + Observer = "ROSETTA", + Target = "CHURYUMOV-GERASIMENKO", + Aberration = "NONE", + TextureMap = true, + ShadowMap = true, + + DataInputTranslation = { + Instrument = { + NAVCAM = { + DetectorType = "Camera", + Spice = { "ROS_NAVCAM-A" } + }, + }, + Target = { + Read = { + "TARGET_NAME", + "INSTRUMENT_HOST_NAME", + "INSTRUMENT_ID", + "START_TIME", + "STOP_TIME" + }, + Convert = { + CHURYUMOV = { "CHURYUMOV-GERASIMENKO" }, + ROSETTA = { "ROSETTA" }, + ["ROSETTA-ORBITER"] = { "ROSETTA" }, + CHURYUMOVGERASIMENKO11969R1 = { "CHURYUMOV-GERASIMENKO" }, + CHURYUMOVGERASIMENKO = { "CHURYUMOV-GERASIMENKO" }, + ["CHURYUMOV-GERASIMENKO1(1969R1)"] = { "CHURYUMOV-GERASIMENKO" }, + CALIBRATION = { "CALIBRATION" }, + ALPHALYR = { "ALPHALYR" }, + ZETACAS = { "ZETACAS" } + } + } + }, + + Instrument = { + Name = "ROS_NAVCAM-A", + Method = "ELLIPSOID", + Aberration = "NONE", + Fovy = 5.00, + Aspect = 1 + } + }, + + BoundingSphereRadius = 5000.0 + }, + GUI = { + Name = "67P Churymov-Gerasimenko", + Path = "/Solar System/Comets/67P Churymov-Gerasimenko" + } +} + +local Trail67P = { + Identifier = "67PTrail", + Parent = transforms.SolarSystemBarycenter.Identifier, + Renderable = { + Type = "RenderableTrailTrajectory", + Translation = { + Type = "SpiceTranslation", + Target = "CHURYUMOV-GERASIMENKO", + Observer = "SUN" + }, + Color = { 0.1, 0.9, 0.2 }, + StartTime = "2014 JAN 01 00:00:00.000", + EndTime = "2017 JAN 01 00:00:00.000", + SampleInterval = 3600 + }, + GUI = { + Name = "67P Trail", + Path = "/Solar System/Comets/67P Churymov-Gerasimenko" + } +} + +asset.onInitialize(function() + if not openspace.directoryExists(imagesDestination) then + openspace.printInfo("Extracting Rosetta images") + openspace.unzipFile(images .. "/images_v1_v2.zip", imagesDestination, true) + end +end) + + + +assetHelper.registerSceneGraphNodesAndExport(asset, { + Barycenter, + Comet67P, + Trail67P +}) + +asset.export("Barycenter", Barycenter) +asset.export("Comet67P", Comet67P) \ No newline at end of file diff --git a/data/assets/scene/solarsystem/missions/rosetta/rosetta.asset b/data/assets/scene/solarsystem/missions/rosetta/rosetta.asset new file mode 100644 index 0000000000..cac99bdd49 --- /dev/null +++ b/data/assets/scene/solarsystem/missions/rosetta/rosetta.asset @@ -0,0 +1,543 @@ +local assetHelper = asset.require('util/asset_helper') +local sunTransforms = asset.require('scene/solarsystem/sun/transforms') +local transforms = asset.require('./67p') + + + +local textures = asset.syncedResource({ + Name = "Rosetta Textures", + Type = "HttpSynchronization", + Identifier = "rosetta_textures", + Version = 2 +}) + +local models = asset.syncedResource({ + Name = "Rosetta Models", + Type = "HttpSynchronization", + Identifier = "rosetta_model", + Version = 3 +}) + +local kernels = asset.syncedResource({ + Name = "Rosetta Kernels", + Type = "HttpSynchronization", + Identifier = "rosetta_kernels", + Version = 1 +}) + +local RosettaKernels = { + kernels .. "/ROS_160718_STEP.TSC", + kernels .. "/ros_triv.tsc", + + kernels .. "/CORB_DV_243_01___T19_00325.BSP", + kernels .. "/CORB_DV_223_01___T19_00302.BSP", + kernels .. "/CORB_DV_145_01___T19_00216.BSP", + + kernels .. "/LORB_DV_236_01___T19_00318.BSP", + kernels .. "/LORB_DV_223_01___T19_00302.BSP", + kernels .. "/LORB_DV_145_01___T19_00216.BSP", + + kernels .. "/RORB_DV_243_01___T19_00325.BSP", + kernels .. "/RORB_DV_223_01___T19_00302.BSP", + kernels .. "/RORB_DV_145_01___T19_00216.BSP", + + kernels .. "/ATNR_P040302093352_00127.BC", + + kernels .. "/ROS_STRUCT_V5.BSP", + + kernels .. "/ROS_NAVCAM_V01.TI", + + kernels .. "/ROS_CHURYUMOV_V01.TF", + kernels .. "/ROS_V26.TF", + + -- CK + -- Rosetta attitude + kernels .. "/RATT_DV_243_01_01____00325.BC", + kernels .. "/RATT_DV_223_01_01____00302.BC", + kernels .. "/RATT_DV_145_01_01____00216.BC", + + -- Comet attitude + kernels .. "/CATT_DV_243_01_______00325.BC", + kernels .. "/CATT_DV_223_01_______00302.BC", + kernels .. "/CATT_DV_145_01_______00216.BC", + + -- High gain antenna + kernels .. "/ROS_HGA_2016_V0035.BC", + kernels .. "/ROS_HGA_2015_V0053.BC", + kernels .. "/ROS_HGA_2014_V0044.BC", + + -- Solar arrays + kernels .. "/ROS_SA_2016_V0034.BC", + kernels .. "/ROS_SA_2015_V0042.BC", + kernels .. "/ROS_SA_2014_V0047.BC", + + + kernels .. "/ROS_CGS_RSOC_V03.TPC" +} + +local LightSources = { + { + Type = "SceneGraphLightSource", + Identifier = "Sun", + Node = sunTransforms.SolarSystemBarycenter.Identifier, + Intensity = 1.0 + }, + { + Identifier = "Camera", + Type = "CameraLightSource", + Intensity = 0.5 + } +} + +local RotationMatrix = { + 0, 1, 0, + 0, 0, 1, + 1, 0, 0 +} + +local Rosetta = { + Identifier = "Rosetta", + Parent = sunTransforms.SolarSystemBarycenter.Identifier, + Transform = { + Translation = { + Type = "SpiceTranslation", + Target = "ROSETTA", + Observer = "SUN", + Kernels = RosettaKernels + }, + Rotation = { + Type = "SpiceRotation", + SourceFrame = "ROS_SPACECRAFT", + DestinationFrame = "GALACTIC" + } + }, + GUI = { + Path = "/Solar System/Missions/Rosetta" + } +} + +local RosettaModel = { + Identifier = "RosettaModel", + Parent = Rosetta.Identifier, + Transform = { + Scale = { + Type = "StaticScale", + -- The scale of the model is in cm; OpenSpace is in m + Scale = 0.01 + } + }, + GUI = { + Name = "Rosetta Model", + Path = "/Solar System/Missions/Rosetta" + } +} + +local RosettaBlackFoil = { + Identifier = "Rosetta_black_foil", + Parent = RosettaModel.Identifier, + Renderable = { + Type = "RenderableModel", + Body = "ROSETTA", + Geometry = { + Type = "MultiModelGeometry", + GeometryFile = models .. "/black_foil.obj" + }, + ColorTexture = textures .. "/foil_silver_ramp.png", + ModelTransform = RotationMatrix, + LightSources = LightSources + }, + GUI = { + Name = "Rosetta Model Part Black Foil", + Path = "/Solar System/Missions/Rosetta" + } +} + +local RosettaBlackParts = { + Identifier = "Rosetta_black_parts", + Parent = RosettaModel.Identifier, + Renderable = { + Type = "RenderableModel", + Body = "ROSETTA", + Geometry = { + Type = "MultiModelGeometry", + GeometryFile = models .. "/black_parts.obj" + }, + ColorTexture = textures .. "/foil_silver_ramp.png", + ModelTransform = RotationMatrix, + LightSources = LightSources + }, + GUI = { + Name = "Rosetta Model Part Black Parts", + Path = "/Solar System/Missions/Rosetta" + } +} + +local RosettaDish = { + Identifier = "Rosetta_dish", + Parent = RosettaModel.Identifier, + Renderable = { + Type = "RenderableModel", + Body = "ROSETTA", + Geometry = { + Type = "MultiModelGeometry", + GeometryFile = models .. "/dish.obj" + }, + ColorTexture = textures .. "/dish_AO.png", + ModelTransform = RotationMatrix, + LightSources = LightSources + }, + GUI = { + Name = "Rosetta Model Part Dish", + Path = "/Solar System/Missions/Rosetta" + } +} + +local RosettaParts = { + Identifier = "Rosetta_parts", + Parent = RosettaModel.Identifier, + Renderable = { + Type = "RenderableModel", + Body = "ROSETTA", + Geometry = { + Type = "MultiModelGeometry", + GeometryFile = models .. "/parts.obj" + }, + ColorTexture = textures .. "/parts2_AO.png", + ModelTransform = RotationMatrix, + LightSources = LightSources + }, + GUI = { + Name = "Rosetta Model Part Parts", + Path = "/Solar System/Missions/Rosetta" + } +} + +local RosettaSilverFoil = { + Identifier = "Rosetta_silver_foil", + Parent = RosettaModel.Identifier, + Renderable = { + Type = "RenderableModel", + Body = "ROSETTA", + Geometry = { + Type = "MultiModelGeometry", + GeometryFile = models .. "/silver_foil.obj" + }, + ColorTexture = textures .. "/foil_silver_ramp.png", + ModelTransform = RotationMatrix, + LightSources = LightSources + }, + GUI = { + Name = "Rosetta Model Part Silver Foil", + Path = "/Solar System/Missions/Rosetta" + } +} + +local RosettaVents = { + Identifier = "Rosetta_vents", + Parent = RosettaModel.Identifier, + Renderable = { + Type = "RenderableModel", + Body = "ROSETTA", + Geometry = { + Type = "MultiModelGeometry", + GeometryFile = models .. "/vents.obj" + }, + ColorTexture = textures .. "/tex_01.png", + ModelTransform = RotationMatrix, + LightSources = LightSources + }, + GUI = { + Name = "Rosetta Model Part Vents", + Path = "/Solar System/Missions/Rosetta" + } +} + +local RosettaWingA = { + Identifier = "Rosetta_wing_a", + Parent = RosettaModel.Identifier, + Renderable = { + Type = "RenderableModel", + Body = "ROSETTA", + Geometry = { + Type = "MultiModelGeometry", + GeometryFile = models .."/wingA.obj" + }, + ColorTexture = textures .. "/tex_01.png", + ModelTransform = RotationMatrix, + LightSources = LightSources + }, + GUI = { + Name = "Rosetta Model Part Wing A", + Path = "/Solar System/Missions/Rosetta" + } +} + +local RosettaWingB = { + Identifier = "Rosetta_wing_b", + Parent = RosettaModel.Identifier, + Renderable = { + Type = "RenderableModel", + Body = "ROSETTA", + Geometry = { + Type = "MultiModelGeometry", + GeometryFile = models .. "/wingB.obj" + }, + ColorTexture = textures .. "/tex_01.png", + ModelTransform = RotationMatrix, + LightSources = LightSources + }, + GUI = { + Name = "Rosetta Model Part Wing B", + Path = "/Solar System/Missions/Rosetta" + } +} + +local RosettaYellowFoil = { + Identifier = "Rosetta_yellow_foil", + Parent = RosettaModel.Identifier, + Renderable = { + Type = "RenderableModel", + Body = "ROSETTA", + Geometry = { + Type = "MultiModelGeometry", + GeometryFile = models .. "/yellow_foil.obj" + }, + ColorTexture = textures .. "/foil_gold_ramp.png", + ModelTransform = RotationMatrix, + LightSources = LightSources + }, + GUI = { + Name = "Rosetta Model Part Yellow Foil", + Path = "/Solar System/Missions/Rosetta" + } +} + +local Philae = { + Identifier = "Philae", + Parent = transforms.Barycenter.Identifier, + -- This should need a transform, but currently the model is intrinsically + -- translated + Transform = { + Translation = { + Type = "SpiceTranslation", + Target = "PHILAE", + Observer = "CHURYUMOV-GERASIMENKO", + Kernels = RosettaKernels + }, + Rotation = { + Type = "SpiceRotation", + SourceFrame = "ROS_SPACECRAFT", + DestinationFrame = "GALACTIC", + }, + Scale = { + Type = "StaticScale", + -- The scale of the model is in cm; OpenSpace is in m + Scale = 0.01 + } + }, + GUI = { + Name = "Philae Model", + Path = "/Solar System/Missions/Rosetta" + } +} + +local PhilaeFoil = { + Identifier = "Philae_foil", + Parent = Philae.Identifier, + Renderable = { + Type = "RenderableModel", + Body = "ROSETTA", + Geometry = { + Type = "MultiModelGeometry", + GeometryFile = models .. "/lander_foil.obj" + }, + ColorTexture = textures .. "/foil_silver_ramp.png", + ModelTransform = RotationMatrix, + LightSources = LightSources + }, + GUI = { + Name = "Philae Model Part Foil", + Path = "/Solar System/Missions/Rosetta" + } +} + +local PhilaeLids = { + Identifier = "Philae_lids", + Parent = Philae.Identifier, + Renderable = { + Type = "RenderableModel", + Body = "ROSETTA", + Geometry = { + Type = "MultiModelGeometry", + GeometryFile = models .. "/lander_lids.obj" + }, + ColorTexture = textures .. "/parts2_AO.png", + ModelTransform = RotationMatrix, + LightSources = LightSources + }, + GUI = { + Name = "Philae Model Part Lids", + Path = "/Solar System/Missions/Rosetta" + } +} + +local PhilaeParts = { + Identifier = "Philae_parts", + Parent = Philae.Identifier, + Renderable = { + Type = "RenderableModel", + Body = "ROSETTA", + Geometry = { + Type = "MultiModelGeometry", + GeometryFile = models .. "/lander_parts.obj" + }, + ColorTexture = textures .. "/foil_silver_ramp.png", + ModelTransform = RotationMatrix, + LightSources = LightSources + }, + GUI = { + Name = "Philae Model Part Parts", + Path = "/Solar System/Missions/Rosetta" + } +} + +local PhilaeSolarPanels = { + Identifier = "Philae_solarp", + Parent = Philae.Identifier, + Renderable = { + Type = "RenderableModel", + Body = "ROSETTA", + Geometry = { + Type = "MultiModelGeometry", + GeometryFile = models .. "/lander_solarp.obj" + }, + ColorTexture = textures .. "/tex_01.png", + ModelTransform = RotationMatrix, + LightSources = LightSources + }, + GUI = { + Name = "Philae Model Parts Solar Panels", + Path = "/Solar System/Missions/Rosetta" + } +} + +local NavCam = { + Identifier = "NAVCAM", + Parent = Rosetta.Identifier, + GUI = { + Path = "/Solar System/Missions/Rosetta/Instruments" + } +} + +local NavCamFov = { + Identifier = "NAVCAM_FOV", + Parent = NavCam.Identifier, + Renderable = { + Type = "RenderableFov", + Body = "ROSETTA", + Frame = "ROS_NAVCAM-A", + RGB = { 0.8, 0.7, 0.7 }, + Instrument = { + Name = "ROS_NAVCAM-A", + Method = "ELLIPSOID", + Aberration = "NONE" + }, + PotentialTargets = { "CHURYUMOV-GERASIMENKO" }, + FrameConversions = { + ["CHURYUMOV-GERASIMENKO"] = "67P/C-G_CK" + } + }, + GUI = { + Name = "NAVCAM FOV", + Path = "/Solar System/Missions/Rosetta/Instruments" + } +} + +local ImagePlane = { + Identifier = "ImagePlaneRosetta", + Parent = transforms.Comet67P.Identifier, + Renderable = { + Type = "RenderablePlaneProjection", + Frame = "67P/C-G_CK", + DefaultTarget = "CHURYUMOV-GERASIMENKO", + Spacecraft = "ROSETTA", + Instrument = "ROS_NAVCAM-A", + Moving = false, + Texture = textures .. "/defaultProj.png" + }, + GUI = { + Name = "Rosetta Image Plane", + Path = "/Solar System/Missions/Rosetta" + } +} + +local RosettaCometTrail = { + Identifier = "RosettaCometTrail", + Parent = transforms.Barycenter.Identifier, + Renderable = { + Type = "RenderableTrailTrajectory", + Translation = { + Type = "SpiceTranslation", + Target = "ROSETTA", + Observer = "CHURYUMOV-GERASIMENKO" + }, + Color = { 0.288, 0.375, 0.934 }, + StartTime = "2014 AUG 01 12:00:00", + EndTime = "2016 SEP 30 12:00:00", + SampleInterval = 3600 + }, + GUI = { + Name = "Rosetta Comet Trail", + Path = "/Solar System/Missions/Rosetta" + } +} + +local PhilaeTrail = { + Identifier = "PhilaeTrail", + Parent = transforms.Barycenter.Identifier, + Renderable = { + Type = "RenderableTrailTrajectory", + Translation = { + Type = "SpiceTranslation", + Target = "PHILAE", + Observer = "CHURYUMOV-GERASIMENKO" + }, + Color = { 0.8, 0.5, 1.0 }, + StartTime = "2014 NOV 12 08:35:00", + EndTime = "2014 NOV 12 17:00:00", + SampleInterval = 2 + }, + GUI = { + Name = "Philae Trail", + Path = "/Solar System/Missions/Rosetta" + } +} + + + +assetHelper.registerSceneGraphNodesAndExport(asset, { + Rosetta, + RosettaModel, + RosettaBlackFoil, + RosettaBlackParts, + RosettaDish, + RosettaParts, + RosettaSilverFoil, + RosettaVents, + RosettaWingA, + RosettaWingB, + RosettaYellowFoil, + + NavCam, + NavCamFov, + ImagePlane, + + Philae, + PhilaeFoil, + PhilaeLids, + PhilaeParts, + PhilaeSolarPanels, + + RosettaCometTrail, + PhilaeTrail +}) diff --git a/data/assets/scene/solarsystem/missions/voyager/voyager1.asset b/data/assets/scene/solarsystem/missions/voyager/voyager1.asset new file mode 100644 index 0000000000..f206b8a6b4 --- /dev/null +++ b/data/assets/scene/solarsystem/missions/voyager/voyager1.asset @@ -0,0 +1,239 @@ +local assetHelper = asset.require('util/asset_helper') +local sunTransforms = asset.require('scene/solarsystem/sun/transforms') + + + +local models = asset.syncedResource({ + Name = "Voyager 1 Models", + Type = "HttpSynchronization", + Identifier = "voyager1_model", + Version = 1 +}) + +local kernels = asset.syncedResource({ + Name = "Voyager 1 Kernels", + Type = "HttpSynchronization", + Identifier = "voyager1_spice", + Version = 1 +}) + +local Kernels = { + kernels .. '/vg1_v02.tf', + kernels .. '/vg100019.tsc', + kernels .. '/Voyager_1.a54206u_V0.2_merged.bsp', + kernels .. '/voyager_1.ST+1991_a54418u.merged.bsp', + kernels .. '/vgr1_jup230.bsp', + kernels .. '/vgr1_sat337.bsp', + kernels .. '/vgr1_super.bc', + kernels .. '/vgr1_super_v2.bc' +} + +local RotationMatrix = { + -1, 0, 0, + 0, 0, -1, + 0, -1, 0 +} + +local LightSources = { + { + Type = "SceneGraphLightSource", + Identifier = "Sun", + Node = sunTransforms.SolarSystemBarycenter.Identifier, + Intensity = 1.0 + }, + { + Identifier = "Camera", + Type = "CameraLightSource", + Intensity = 0.5 + } +} + +local Voyager1 = { + Identifier = "Voyager_1", + Parent = sunTransforms.SolarSystemBarycenter.Identifier, + Transform = { + Translation = { + Type = "SpiceTranslation", + Target = "VOYAGER 1", + Observer = "SUN", + Kernels = Kernels + }, + Rotation = { + Type = "SpiceRotation", + SourceFrame = "VG1_SC_BUS", + DestinationFrame = "GALACTIC" + } + }, + GUI = { + Name = "Voyager 1", + Path = "/Solar System/Missions/Voyager 1" + } +} + +local Voyager1Main = { + Identifier = "Voyager_1_Main", + Parent = Voyager1.Identifier, + Renderable = { + Type = "RenderableModel", + Geometry = { + Type = "MultiModelGeometry", + GeometryFile = models .. "/voyager-main.obj" + }, + ColorTexture = models .. "/voyager-main.jpg", + ModelTransform = RotationMatrix, + LightSources = LightSources + }, + GUI = { + Name = "Voyager 1 Main", + Path = "/Solar System/Missions/Voyager 1" + } +} + +local Voyager1Antenna = { + Identifier = "Voyager_1_Antanna", + Parent = Voyager1.Identifier, + Renderable = { + Type = "RenderableModel", + Geometry = { + Type = "MultiModelGeometry", + GeometryFile = models .. "/voyager-antenna.obj" + }, + ColorTexture = models .. "/voyager-antenna.png", + ModelTransform = RotationMatrix, + LightSources = LightSources + }, + GUI = { + Name = "Voyager 1 Antanna", + Path = "/Solar System/Missions/Voyager 1" + } +} + + -- The trails are organized as follows. The cruise phases can be resolved in relatively + -- low resolution since they are just straight lines + -- The encounter phases should be much higher resolution or otherwise artifacts would appear +local VoyagerTrailCruiseEarthJupiter = { + Identifier = "Voyager_1_Trail_Cruise_Earth_Jupiter", + Parent = sunTransforms.SolarSystemBarycenter.Identifier, + Renderable = { + Type = "RenderableTrailTrajectory", + Translation = { + Type = "SpiceTranslation", + Target = "VOYAGER 1", + Observer = "SUN", + Kernels = Kernels + }, + Color = { 0.70, 0.50, 0.20 }, + StartTime = "1977 SEP 05", + EndTime = "1979 MAR 04", + SampleInterval = 545 * 2 -- 545 is the number of days between the Start and End time + }, + GUI = { + Name = "Voyager 1 Trail Cruise Earth-Jupiter", + Path = "/Solar System/Missions/Voyager 1" + } +} + +local VoyagerTrailEncounterJupiter = { + Identifier = "Voyager_1_Trail_Encounter_Jupiter", + Parent = sunTransforms.SolarSystemBarycenter.Identifier, + Renderable = { + Type = "RenderableTrailTrajectory", + Translation = { + Type = "SpiceTranslation", + Target = "VOYAGER 1", + Observer = "SUN", + Kernels = Kernels + }, + Color = { 0.70, 0.50, 0.20 }, + EnableFade = false, + StartTime = "1979 MAR 03 23:24:00", -- @TODO: Probably an off-by-one bug in RenderableTrailTrajectory? + EndTime = "1979 MAR 09", + SampleInterval = 100 + }, + GUI = { + Name = "Voyager 1 Trail Encounter Jupiter", + Path = "/Solar System/Missions/Voyager 1" + } +} + +local VoyagerTrailCruiseJupiterSaturn = { + Identifier = "Voyager_1_Trail_Cruise_Jupiter_Saturn", + Parent = sunTransforms.SolarSystemBarycenter.Identifier, + Renderable = { + Type = "RenderableTrailTrajectory", + Translation = { + Type = "SpiceTranslation", + Target = "VOYAGER 1", + Observer = "SUN", + Kernels = Kernels + }, + EnableFade = false, + Color = { 0.70, 0.50, 0.20 }, + StartTime = "1979 MAR 09", + EndTime = "1980 NOV 11", + SampleInterval = 618 * 2 -- 618 is the number of days between the Start and End time + }, + GUI = { + Name = "Voyager 1 Trail Cruise Jupiter-Saturn", + Path = "/Solar System/Missions/Voyager 1" + } +} + +local VoyagerTrailEncounterSaturn = { + Identifier = "Voyager_1_Trail_Encounter_Saturn", + Parent = sunTransforms.SolarSystemBarycenter.Identifier, + Renderable = { + Type = "RenderableTrailTrajectory", + Translation = { + Type = "SpiceTranslation", + Target = "VOYAGER 1", + Observer = "SUN", + Kernels = Kernels + }, + EnableFade = false, + Color = { 0.70, 0.50, 0.20 }, + StartTime = "1980 NOV 10 23:08:30", -- @TODO: Probably an off-by-one bug in RenderableTrailTrajectory? + EndTime = "1980 NOV 16", + SampleInterval = 100 + }, + GUI = { + Name = "Voyager 1 Trail Encounter Saturn", + Path = "/Solar System/Missions/Voyager 1" + } +} + +local VoyagerTrailCruiseSaturnInf = { + Identifier = "Voyager_1_Trail_Cruise_Saturn_Inf", + Parent = sunTransforms.SolarSystemBarycenter.Identifier, + Renderable = { + Type = "RenderableTrailTrajectory", + Translation = { + Type = "SpiceTranslation", + Target = "VOYAGER 1", + Observer = "SUN", + Kernels = Kernels + }, + EnableFade = false, + Color = { 0.70, 0.50, 0.20 }, + StartTime = "1980 NOV 16", + EndTime = "2021 JAN 01", + SampleInterval = 14656 * 2 -- 14656 is the number of days between the Start and End time + }, + GUI = { + Name = "Voyager 1 Trail Cruise Saturn-Inf", + Path = "/Solar System/Missions/Voyager 1" + } +} + + + +assetHelper.registerSceneGraphNodesAndExport(asset, { + Voyager1, + Voyager1Main, + Voyager1Antenna, + VoyagerTrailCruiseEarthJupiter, + VoyagerTrailEncounterJupiter, + VoyagerTrailCruiseJupiterSaturn, + VoyagerTrailEncounterSaturn, + VoyagerTrailCruiseSaturnInf +}) diff --git a/data/assets/scene/solarsystem/missions/voyager/voyager2.asset b/data/assets/scene/solarsystem/missions/voyager/voyager2.asset new file mode 100644 index 0000000000..36f3d74089 --- /dev/null +++ b/data/assets/scene/solarsystem/missions/voyager/voyager2.asset @@ -0,0 +1,338 @@ +local assetHelper = asset.require('util/asset_helper') +local sunTransforms = asset.require('scene/solarsystem/sun/transforms') + + + +local models = asset.syncedResource({ + Name = "Voyager 2 Models", + Type = "HttpSynchronization", + Identifier = "voyager2_model", + Version = 1 +}) + +local kernels = asset.syncedResource({ + Name = "Voyager 2 Kernels", + Type = "HttpSynchronization", + Identifier = "voyager2_spice", + Version = 1 +}) + +local Kernels = { + kernels .. '/vg2_v02.tf', + kernels .. '/vg200022.tsc', + kernels .. '/Voyager_2.m05016u.merged.bsp', + kernels .. '/voyager_2.ST+1992_m05208u.merged.bsp', + kernels .. '/vgr2_jup230.bsp', + kernels .. '/vgr2_sat337.bsp', + kernels .. '/vgr2_ura083.bsp', + kernels .. '/vgr2_nep081.bsp', + kernels .. '/vgr2_super.bc', + kernels .. '/vgr2_super_v2.bc' +} + +local RotationMatrix = { + -1, 0, 0, + 0, 0, -1, + 0, -1, 0 +} + + +local LightSources = { + { + Type = "SceneGraphLightSource", + Identifier = "Sun", + Node = sunTransforms.SolarSystemBarycenter.Identifier, + Intensity = 1.0 + }, + { + Identifier = "Camera", + Type = "CameraLightSource", + Intensity = 0.5 + } +} + +local Voyager2 = { + Identifier = "Voyager_2", + Parent = sunTransforms.SolarSystemBarycenter.Identifier, + Transform = { + Translation = { + Type = "SpiceTranslation", + Target = "VOYAGER 2", + Observer = "SUN", + Kernels = Kernels + }, + Rotation = { + Type = "SpiceRotation", + SourceFrame = "VG2_SC_BUS", + DestinationFrame = "GALACTIC" + } + }, + GUI = { + Name = "Voyager 2", + Path = "/Solar System/Missions/Voyager 2" + } +} + +local Voyager2Main = { + Identifier = "Voyager_2_Main", + Parent = Voyager2.Identifier, + Renderable = { + Type = "RenderableModel", + Geometry = { + Type = "MultiModelGeometry", + GeometryFile = models .. "/voyager-main.obj" + }, + ColorTexture = models .. "/voyager-main.jpg", + ModelTransform = RotationMatrix, + LightSources = LightSources + }, + GUI = { + Name = "Voyager 2 Main", + Path = "/Solar System/Missions/Voyager 2" + } +} + +local Voyager2Antenna = { + Identifier = "Voyager_2_Antanna", + Parent = Voyager2.Identifier, + Renderable = { + Type = "RenderableModel", + Geometry = { + Type = "MultiModelGeometry", + GeometryFile = models .. "/voyager-antenna.obj" + }, + ColorTexture = models .. "/voyager-antenna.png", + ModelTransform = RotationMatrix, + LightSources = LightSources + }, + GUI = { + Name = "Voyager 2 Antanna", + Path = "/Solar System/Missions/Voyager 2" + } +} + + -- The trails are organized as follows. The cruise phases can be resolved in relatively + -- low resolution since they are just straight lines + -- The encounter phases should be much higher resolution or otherwise artifacts would appear +local VoyagerTrailCruiseEarthJupiter = { + Identifier = "Voyager_2_Trail_Cruise_Earth_Jupiter", + Parent = sunTransforms.SolarSystemBarycenter.Identifier, + Renderable = { + Type = "RenderableTrailTrajectory", + Translation = { + Type = "SpiceTranslation", + Target = "VOYAGER 2", + Observer = "SUN", + Kernels = Kernels + }, + Color = { 0.70, 0.50, 0.20 }, + StartTime = "1977 SEP 05", + EndTime = "1979 JUL 06", + SampleInterval = 669 * 2 -- 669 is the number of days between the Start and End time + }, + GUI = { + Name = "Voyager 2 Trail Cruise Earth-Jupiter", + Path = "/Solar System/Missions/Voyager 2" + } +} + +local VoyagerTrailEncounterJupiter = { + Identifier = "Voyager_2_Trail_Encounter_Jupiter", + Parent = sunTransforms.SolarSystemBarycenter.Identifier, + Renderable = { + Type = "RenderableTrailTrajectory", + Translation = { + Type = "SpiceTranslation", + Target = "VOYAGER 2", + Observer = "SUN", + Kernels = Kernels + }, + Color = { 0.70, 0.50, 0.20 }, + EnableFade = false, + StartTime = "1979 JUL 05 23:24:00", -- @TODO: Probably an off-by-one bug in RenderableTrailTrajectory? + EndTime = "1979 JUL 15", + SampleInterval = 100 + }, + GUI = { + Name = "Voyager 2 Trail Encounter Jupiter", + Path = "/Solar System/Missions/Voyager 2" + } +} + +local VoyagerTrailCruiseJupiterSaturn = { + Identifier = "Voyager_2_Trail_Cruise_Jupiter_Saturn", + Parent = sunTransforms.SolarSystemBarycenter.Identifier, + Renderable = { + Type = "RenderableTrailTrajectory", + Translation = { + Type = "SpiceTranslation", + Target = "VOYAGER 2", + Observer = "SUN", + Kernels = Kernels + }, + EnableFade = false, + Color = { 0.70, 0.50, 0.20 }, + StartTime = "1979 JUL 15", + EndTime = "1981 AUG 23", + SampleInterval = 770 * 2 -- 770 is the number of days between the Start and End time + }, + GUI = { + Name = "Voyager 2 Trail Cruise Jupiter-Saturn", + Path = "/Solar System/Missions/Voyager 2" + } +} + +local VoyagerTrailEncounterSaturn = { + Identifier = "Voyager_2_Trail_Encounter_Saturn", + Parent = sunTransforms.SolarSystemBarycenter.Identifier, + Renderable = { + Type = "RenderableTrailTrajectory", + Translation = { + Type = "SpiceTranslation", + Target = "VOYAGER 2", + Observer = "SUN", + Kernels = Kernels + }, + EnableFade = false, + Color = { 0.70, 0.50, 0.20 }, + StartTime = "1981 AUG 22 23:08:30", -- @TODO: Probably an off-by-one bug in RenderableTrailTrajectory? + EndTime = "1981 AUG 30", + SampleInterval = 100 + }, + GUI = { + Name = "Voyager 2 Trail Encounter Saturn", + Path = "/Solar System/Missions/Voyager 2" + } +} + +local VoyagerTrailCruiseSaturnUranus = { + Identifier = "Voyager_2_Trail_Cruise_Saturn_Uranus", + Parent = sunTransforms.SolarSystemBarycenter.Identifier, + Renderable = { + Type = "RenderableTrailTrajectory", + Translation = { + Type = "SpiceTranslation", + Target = "VOYAGER 2", + Observer = "SUN", + Kernels = Kernels + }, + EnableFade = false, + Color = { 0.70, 0.50, 0.20 }, + StartTime = "1981 AUG 30", + EndTime = "1986 JAN 22", + SampleInterval = 1971 * 2 -- 1971 is the number of days between the Start and End time + }, + GUI = { + Name = "Voyager 2 Trail Cruise Saturn-Uranus", + Path = "/Solar System/Missions/Voyager 2" + } +} + +local VoyagerTrailEncounterUranus = { + Identifier = "Voyager_2_Trail_Encounter_Uranus", + Parent = sunTransforms.SolarSystemBarycenter.Identifier, + Renderable = { + Type = "RenderableTrailTrajectory", + Translation = { + Type = "SpiceTranslation", + Target = "VOYAGER 2", + Observer = "SUN", + Kernels = Kernels + }, + EnableFade = false, + Color = { 0.70, 0.50, 0.20 }, + StartTime = "1986 JAN 21 23:30:00", -- @TODO: Probably an off-by-one bug in RenderableTrailTrajectory? + EndTime = "1986 JAN 27", + SampleInterval = 100 + }, + GUI = { + Name = "Voyager 2 Trail Encounter Uranus", + Path = "/Solar System/Missions/Voyager 2" + } +} + +local VoyagerTrailCruiseUranusNeptune = { + Identifier = "Voyager_2_Trail_Cruise_Uranus_Neptune", + Parent = sunTransforms.SolarSystemBarycenter.Identifier, + Renderable = { + Type = "RenderableTrailTrajectory", + Translation = { + Type = "SpiceTranslation", + Target = "VOYAGER 2", + Observer = "SUN", + Kernels = Kernels + }, + EnableFade = false, + Color = { 0.70, 0.50, 0.20 }, + StartTime = "1986 JAN 27", + EndTime = "1989 AUG 24", + SampleInterval = 1305 * 2 -- 1305 is the number of days between the Start and End time + }, + GUI = { + Name = "Voyager 2 Trail Cruise Uranus-Neptune", + Path = "/Solar System/Missions/Voyager 2" + } +} + +local VoyagerTrailEncounterNeptune = { + Identifier = "Voyager_2_Trail_Encounter_Neptune", + Parent = sunTransforms.SolarSystemBarycenter.Identifier, + Renderable = { + Type = "RenderableTrailTrajectory", + Translation = { + Type = "SpiceTranslation", + Target = "VOYAGER 2", + Observer = "SUN", + Kernels = Kernels + }, + EnableFade = false, + Color = { 0.70, 0.50, 0.20 }, + StartTime = "1989 AUG 23 23:30:00", -- @TODO: Probably an off-by-one bug in RenderableTrailTrajectory? + EndTime = "1989 AUG 26", + SampleInterval = 100 + }, + GUI = { + Name = "Voyager 2 Trail Encounter Neptune", + Path = "/Solar System/Missions/Voyager 2" + } +} + +local VoyagerTrailCruiseNeptuneInf = { + Identifier = "Voyager_2_Trail_Cruise_Neptune_Inf", + Parent = sunTransforms.SolarSystemBarycenter.Identifier, + Renderable = { + Type = "RenderableTrailTrajectory", + Translation = { + Type = "SpiceTranslation", + Target = "VOYAGER 2", + Observer = "SUN", + Kernels = Kernels + }, + EnableFade = false, + Color = { 0.70, 0.50, 0.20 }, + StartTime = "1989 AUG 26", + EndTime = "2021 JAN 01", + SampleInterval = 11451 * 2 -- 11451 is the number of days between the Start and End time + }, + GUI = { + Name = "Voyager 2 Trail Cruise Neptune-Inf", + Path = "/Solar System/Missions/Voyager 2" + } +} + + + +assetHelper.registerSceneGraphNodesAndExport(asset, { + Voyager2, + Voyager2Main, + Voyager2Antenna, + VoyagerTrailCruiseEarthJupiter, + VoyagerTrailEncounterJupiter, + VoyagerTrailCruiseJupiterSaturn, + VoyagerTrailEncounterSaturn, + VoyagerTrailCruiseSaturnUranus, + VoyagerTrailEncounterUranus, + VoyagerTrailCruiseUranusNeptune, + VoyagerTrailEncounterNeptune, + VoyagerTrailCruiseNeptuneInf +}) From f69545a4d7b1a785b19c856451c14dc8ff2dd755 Mon Sep 17 00:00:00 2001 From: Jonathas Costa Date: Thu, 15 Aug 2019 17:07:25 -0400 Subject: [PATCH 38/39] Added HDR bypass. --- .../openspace/rendering/framebufferrenderer.h | 2 ++ include/openspace/rendering/renderer.h | 1 + shaders/framebuffer/renderframebuffer.frag | 4 +++- src/rendering/framebufferrenderer.cpp | 24 +++++++++++++------ src/rendering/renderengine.cpp | 2 +- 5 files changed, 24 insertions(+), 9 deletions(-) diff --git a/include/openspace/rendering/framebufferrenderer.h b/include/openspace/rendering/framebufferrenderer.h index 39d8583971..a86fbe2d0e 100644 --- a/include/openspace/rendering/framebufferrenderer.h +++ b/include/openspace/rendering/framebufferrenderer.h @@ -138,6 +138,7 @@ public: void setSaturation(float sat) override; int nAaSamples() const override; + void disableHDR(bool disable) override; void update() override; void performRaycasterTasks(const std::vector& tasks); @@ -197,6 +198,7 @@ private: glm::ivec2 _resolution = glm::ivec2(0); int _nAaSamples; + bool _disableHDR = false; float _hdrExposure = 3.7f; float _gamma = 0.95f; diff --git a/include/openspace/rendering/renderer.h b/include/openspace/rendering/renderer.h index d8b40042b2..3520a02195 100644 --- a/include/openspace/rendering/renderer.h +++ b/include/openspace/rendering/renderer.h @@ -56,6 +56,7 @@ public: virtual void setValue(float value) = 0; virtual void setSaturation(float sat) = 0; virtual int nAaSamples() const = 0; + virtual void disableHDR(bool disable) = 0; /** * Set raycasting uniforms on the program object, and setup raycasting. diff --git a/shaders/framebuffer/renderframebuffer.frag b/shaders/framebuffer/renderframebuffer.frag index 3fb3a216ae..e7e18698b5 100644 --- a/shaders/framebuffer/renderframebuffer.frag +++ b/shaders/framebuffer/renderframebuffer.frag @@ -26,6 +26,7 @@ #include <#{fragmentPath}> #define exposure #{rendererData.hdrExposure} +#define disableHDRPipeline #{rendererData.disableHDR} #define DeltaError 0.013f #define MaxValueColorBuffer 1E10 @@ -37,7 +38,8 @@ layout(location = 3) out vec4 filterBuffer; void main() { Fragment f = getFragment(); - if (f.disableLDR2HDR) { + // Color is already in HDR space + if (f.disableLDR2HDR || (disableHDRPipeline == 1)) { _out_color_ = f.color; } else { _out_color_ = vec4((log2(vec3(1.0) - (f.color.rgb - vec3(DeltaError)))/(-exposure)), f.color.a); diff --git a/src/rendering/framebufferrenderer.cpp b/src/rendering/framebufferrenderer.cpp index cf5966a725..61f23be178 100644 --- a/src/rendering/framebufferrenderer.cpp +++ b/src/rendering/framebufferrenderer.cpp @@ -816,8 +816,13 @@ void FramebufferRenderer::render(Scene* scene, Camera* camera, float blackoutFac glBindFramebuffer(GL_FRAMEBUFFER, _defaultFBO); glViewport(0, 0, _resolution.x, _resolution.y); - // Apply the selected TMO on the results and resolve the result for the default FBO - applyTMO(blackoutFactor); + if (_disableHDR) { + resolveMSAA(blackoutFactor); + } + else { + // Apply the selected TMO on the results and resolve the result for the default FBO + applyTMO(blackoutFactor); + } } void FramebufferRenderer::performRaycasterTasks(const std::vector& tasks) { @@ -1016,27 +1021,31 @@ void FramebufferRenderer::setNAaSamples(int nAaSamples) { _dirtyMsaaSamplingPattern = true; } +void FramebufferRenderer::disableHDR(bool disable) { + _disableHDR = std::move(disable); +} + void FramebufferRenderer::setHDRExposure(float hdrExposure) { ghoul_assert(hdrExposure > 0.f, "HDR exposure must be greater than zero"); - _hdrExposure = hdrExposure; + _hdrExposure = std::move(hdrExposure); updateRendererData(); } void FramebufferRenderer::setGamma(float gamma) { ghoul_assert(gamma > 0.f, "Gamma value must be greater than zero"); - _gamma = gamma; + _gamma = std::move(gamma); } void FramebufferRenderer::setHue(float hue) { - _hue = hue; + _hue = std::move(hue); } void FramebufferRenderer::setValue(float value) { - _value = value; + _value = std::move(value); } void FramebufferRenderer::setSaturation(float sat) { - _saturation = sat; + _saturation = std::move(sat); } int FramebufferRenderer::nAaSamples() const { @@ -1047,6 +1056,7 @@ void FramebufferRenderer::updateRendererData() { ghoul::Dictionary dict; dict.setValue("fragmentRendererPath", std::string(RenderFragmentShaderPath)); dict.setValue("hdrExposure", std::to_string(_hdrExposure)); + dict.setValue("disableHDR", std::to_string(_disableHDR)); _rendererData = dict; global::renderEngine.setRendererData(dict); } diff --git a/src/rendering/renderengine.cpp b/src/rendering/renderengine.cpp index 479e7b00f6..a0e7d11e3d 100644 --- a/src/rendering/renderengine.cpp +++ b/src/rendering/renderengine.cpp @@ -319,7 +319,7 @@ RenderEngine::RenderEngine() _disableHDRPipeline.onChange([this]() { if (_renderer) { - //_renderer->setHDRExposure(_hdrExposure); + _renderer->disableHDR(_disableHDRPipeline); } }); addProperty(_disableHDRPipeline); From a1bc6d585daa714865d0f28227bb30562927a121 Mon Sep 17 00:00:00 2001 From: Jonathas Costa Date: Thu, 15 Aug 2019 17:09:45 -0400 Subject: [PATCH 39/39] Disable GL checking. --- openspace.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openspace.cfg b/openspace.cfg index c7e7bb63a0..85daf27146 100644 --- a/openspace.cfg +++ b/openspace.cfg @@ -166,7 +166,7 @@ LoadingScreen = { ShowNodeNames = true, ShowProgressbar = false } -CheckOpenGLState = true +CheckOpenGLState = false LogEachOpenGLCall = false ShutdownCountdown = 3