diff --git a/data/assets/scene/solarsystem/planets/earth/satellites/debris_shared.asset b/data/assets/scene/solarsystem/planets/earth/satellites/debris_shared.asset index f2ca07c92e..27c3dc2934 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/debris_shared.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/debris_shared.asset @@ -68,7 +68,8 @@ local addSatelliteGroupObjects = function(group, tleFolder, shouldAddDuplicates) ArgumentOfPeriapsisColumn = "-", MeanAnomalyAtEpochColumn = "-", EpochColumn = "-", - Color = color + Color = color, + Fade = 0.5 }, GUI = { diff --git a/data/assets/scene/solarsystem/planets/earth/satellites/satellites_debris.asset b/data/assets/scene/solarsystem/planets/earth/satellites/satellites_debris.asset index 9dab3c3180..9619a6119f 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/satellites_debris.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/satellites_debris.asset @@ -1,5 +1,5 @@ -asset.request('./debris/debris_asat') ---asset.request('./debris/debris_breezem') +--asset.request('./debris/debris_asat') +asset.request('./debris/debris_breezem') --asset.request('./debris/debris_fengyun') --asset.request('./debris/debris_iridium33') --asset.request('./debris/debris_kosmos2251') diff --git a/data/assets/spaceDebris.scene b/data/assets/spaceDebris.scene index fa86bf08d6..77db55f4b9 100644 --- a/data/assets/spaceDebris.scene +++ b/data/assets/spaceDebris.scene @@ -16,7 +16,7 @@ asset.require('util/webgui') --asset.request('customization/globebrowsing') --- asset.request('scene/solarsystem/planets/earth/satellites/satellites_all') +--asset.request('scene/solarsystem/planets/earth/satellites/satellites_all') asset.request('scene/solarsystem/planets/earth/satellites/satellites_debris') -- Keybindings that are specific for this scene diff --git a/modules/base/rendering/renderabletrail.cpp b/modules/base/rendering/renderabletrail.cpp index c437c847f8..249065d0b7 100644 --- a/modules/base/rendering/renderabletrail.cpp +++ b/modules/base/rendering/renderabletrail.cpp @@ -175,10 +175,10 @@ documentation::Documentation RenderableTrail::Documentation() { RenderableTrail::Appearance::Appearance() : properties::PropertyOwner(AppearanceInfo) - , lineColor(LineColorInfo, glm::vec3(1.f), glm::vec3(0.f), glm::vec3(1.f)) + , lineColor(LineColorInfo, glm::vec3(0.9f, 0.45f, 0.f), glm::vec3(0.f), glm::vec3(1.f)) , useLineFade(EnableFadeInfo, true) , lineFade(FadeInfo, 1.f, 0.f, 30.f) - , lineWidth(LineWidthInfo, 2.f, 1.f, 20.f) + , lineWidth(LineWidthInfo, 1.35f, 1.f, 20.f) , pointSize(PointSizeInfo, 1, 1, 64) , renderingModes( RenderingModeInfo, diff --git a/modules/space/rendering/renderablesatellites.cpp b/modules/space/rendering/renderablesatellites.cpp index 5b7e070cdf..460b0c4f9a 100644 --- a/modules/space/rendering/renderablesatellites.cpp +++ b/modules/space/rendering/renderablesatellites.cpp @@ -135,6 +135,13 @@ "Color", "Färg." }; + constexpr openspace::properties::Property::PropertyInfo FadeInfo = { + "Fade", + "Line fade", + "The fading factor that is applied to the trail if the 'EnableFade' value is " + "'true'. If it is 'false', this setting has no effect. The higher the number, " + "the less fading is applied." + }; constexpr const char* KeyFile = "Path"; constexpr const char* KeyLineNum = "LineNumber"; @@ -495,6 +502,12 @@ documentation::Documentation RenderableSatellites::Documentation() { new DoubleVector3Verifier, Optional::Yes, ColorInfo.description + }, + { + FadeInfo.identifier, + new DoubleVerifier, + Optional::Yes, + FadeInfo.description } } }; @@ -512,7 +525,9 @@ RenderableSatellites::RenderableSatellites(const ghoul::Dictionary& dictionary) , _argumentOfPeriapsisColumnName(ArgumentOfPeriapsisColumnInfo) , _meanAnomalyAtEpochColumnName(MeanAnomalyAtEpochColumnInfo) , _epochColumnName(EpochColumnInfo) - , _color(ColorInfo) + , _color(ColorInfo) + , _lineFade(FadeInfo) + { documentation::testSpecificationAndThrow( Documentation(), @@ -542,11 +557,14 @@ RenderableSatellites::RenderableSatellites(const ghoul::Dictionary& dictionary) dictionary.value(EpochColumnInfo.identifier); _color = dictionary.value(ColorInfo.identifier); + _lineFade = + static_cast(dictionary.value(FadeInfo.identifier)); - //_appearance.lineColor = _color; + // _appearance.lineColor = _color; addPropertySubOwner(_appearance); addProperty(_path); addProperty(_nSegments); + // addProperty(_lineFade); // addProperty(_semiMajorAxisUnit); const std::string& file = dictionary.value(KeyFile); @@ -678,7 +696,6 @@ RenderableSatellites::~RenderableSatellites() { } */ void RenderableSatellites::initialize() { - LINFO(fmt::format("_path: {} ", _path)); readTLEFile(_path); updateBuffers(); @@ -716,12 +733,16 @@ void RenderableSatellites::initializeGL() { } ); - _uniformCache.opacity = _programObject->uniformLocation("opacity"); - _uniformCache.modelView = _programObject->uniformLocation("modelViewTransform"); - _uniformCache.projection = _programObject->uniformLocation("projectionTransform"); - _uniformCache.color = _programObject->uniformLocation("color"); - _uniformCache.useLineFade = _programObject->uniformLocation("useLineFade"); - _uniformCache.lineFade = _programObject->uniformLocation("lineFade"); + _uniformCache.opacity = _programObject->uniformLocation("opacity"); + _uniformCache.modelView = _programObject->uniformLocation("modelViewTransform"); + _uniformCache.projection = _programObject->uniformLocation("projectionTransform"); + _uniformCache.color = _programObject->uniformLocation("color"); + //_uniformCache.useLineFade = _programObject->uniformLocation("useLineFade"); + _uniformCache.lineFade = _programObject->uniformLocation("lineFade"); + _uniformCache.segments = _programObject->uniformLocation("numberOfSegments"); + _uniformCache.position = _programObject->uniformLocation("debrisPosition"); + _uniformCache.numberOfOrbits = _programObject->uniformLocation("numberOfOrbits"); + _uniformCache.vertexIDs = _programObject->uniformLocation("vertexIDs"); updateBuffers(); @@ -744,13 +765,72 @@ bool RenderableSatellites::isReady() const { return true; } -void RenderableSatellites::update(const UpdateData&) {} +void RenderableSatellites::update(const UpdateData& data) { +} + +int getNearestVertexNeighbour(int whatOrbit) { + return 0; + +} + void RenderableSatellites::render(const RenderData& data, RendererTasks&) { if (_TLEData.empty()) return; + _inGameTime = data.time.j2000Seconds(); + std::vector::iterator it = _vertexBufferData.begin(); + std::vector vertexIDs; + unsigned int whatOrbit = 0; + for (const auto& orbit : _TLEData) { + _keplerTranslator.setKeplerElements( + orbit.eccentricity, + orbit.semiMajorAxis, + orbit.inclination, + orbit.ascendingNode, + orbit.argumentOfPeriapsis, + orbit.meanAnomaly, + orbit.period, + orbit.epoch + ); + + glm::vec3 position = _keplerTranslator.debrisPos(_inGameTime); + _position.x = position.x; + _position.y = position.y; + _position.z = position.z; + + // LINFO(fmt::format("atm position: {} ", position)); + + float closestDistance = 10000000; + unsigned int whatIndex = 0; + for(int i=0 ; i<_nSegments ; ++i) { + float positionDistance = glm::distance( + glm::vec3(_position.x, _position.y, _position.z) + ,glm::vec3(it->x, it->y, it->z)); + if( positionDistance < closestDistance ) + { + closestDistance = positionDistance; + whatIndex = i; + } + ++it; + } + vertexIDs.push_back(whatIndex + (whatOrbit * _nSegments)); + ++whatOrbit; + } + + + // 1 loopa vertex buffer + // 1,5 jämföra positionen på _position med vertexens position. + // 2 hitta vilket id i bufferten som positionen har. + // 3 skicka vidare det idt + + /////// TEST _programObject->activate(); + + _programObject->setUniform(_uniformCache.vertexIDs, vertexIDs.data()); + + _programObject->setUniform(_uniformCache.numberOfOrbits, _TLEData.size()); + _programObject->setUniform(_uniformCache.opacity, _opacity); glm::dmat4 modelTransform = @@ -765,10 +845,12 @@ void RenderableSatellites::render(const RenderData& data, RendererTasks&) { _programObject->setUniform(_uniformCache.projection, data.camera.projectionMatrix()); _programObject->setUniform(_uniformCache.color, _appearance.lineColor); - _programObject->setUniform(_uniformCache.useLineFade, _appearance.useLineFade); - if (_appearance.useLineFade) { + //_programObject->setUniform(_uniformCache.useLineFade, _appearance.useLineFade); + //if (_appearance.useLineFade) { _programObject->setUniform(_uniformCache.lineFade, _appearance.lineFade); - } + //} + _programObject->setUniform(_uniformCache.segments, _nSegments); + _programObject->setUniform(_uniformCache.position, _position); glLineWidth(_appearance.lineWidth); @@ -796,7 +878,7 @@ void RenderableSatellites::updateBuffers() { _vertexBufferData.resize(_TLEData.size() * nVerticesPerOrbit); //_indexBufferData.resize(_TLEData.size() * _nSegments * 2); size_t orbitindex = 0; - size_t elementindex = 0; + // size_t elementindex = 0; for (const auto& orbit : _TLEData) { _keplerTranslator.setKeplerElements( @@ -816,8 +898,7 @@ void RenderableSatellites::updateBuffers() { float timeOffset = orbit.period * static_cast(i) / static_cast(_nSegments); - glm::vec3 position = _keplerTranslator.debrisPos(Time(orbit.epoch + timeOffset)); - + glm::vec3 position = _keplerTranslator.debrisPos(static_cast(orbit.epoch + timeOffset)); // LINFO(fmt::format("SegmentPosition: {} ", position)); _vertexBufferData[index].x = position.x; @@ -831,7 +912,6 @@ void RenderableSatellites::updateBuffers() { } ++orbitindex; } - glBindVertexArray(_vertexArray); glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer); diff --git a/modules/space/rendering/renderablesatellites.h b/modules/space/rendering/renderablesatellites.h index d1ff8b08c4..9ab2b1ecd2 100644 --- a/modules/space/rendering/renderablesatellites.h +++ b/modules/space/rendering/renderablesatellites.h @@ -117,11 +117,17 @@ namespace openspace { properties::StringProperty _meanAnomalyAtEpochColumnName; properties::StringProperty _epochColumnName; properties::Vec3Property _color; + properties::DoubleProperty _lineFade; RenderableTrail::Appearance _appearance; - UniformCache(opacity, modelView, projection, color, useLineFade, lineFade) - _uniformCache; + glm::vec3 _position; + + double _inGameTime = 0.0; + + UniformCache(opacity, modelView, projection, color, useLineFade, lineFade, + segments, position, vertexIDs, numberOfOrbits) + _uniformCache; /** * Reads the provided TLE file and calles the KeplerTranslation::setKeplerElments diff --git a/modules/space/shaders/debrisViz_fs.glsl b/modules/space/shaders/debrisViz_fs.glsl index 20749b09d7..68278be568 100644 --- a/modules/space/shaders/debrisViz_fs.glsl +++ b/modules/space/shaders/debrisViz_fs.glsl @@ -28,14 +28,16 @@ uniform vec3 color; uniform float opacity = 1.0; + in vec4 viewSpacePosition; in vec4 vs_position; +in float fade; //in vec3 vs_color; //in vec2 vs_texcoord; Fragment getFragment() { Fragment frag; - frag.color = vec4(color, opacity); + frag.color = vec4(color * fade, fade * opacity); frag.depth = vs_position.w; frag.gPosition = viewSpacePosition; frag.gNormal = vec4(1, 1, 1 , 0); diff --git a/modules/space/shaders/debrisViz_vs.glsl b/modules/space/shaders/debrisViz_vs.glsl index 23b00154d3..c5fbdd48c7 100644 --- a/modules/space/shaders/debrisViz_vs.glsl +++ b/modules/space/shaders/debrisViz_vs.glsl @@ -31,10 +31,31 @@ layout (location = 0) in vec4 vertex_data; uniform dmat4 modelViewTransform; uniform mat4 projectionTransform; +uniform int numberOfSegments; +uniform float lineFade; +uniform vec3 debrisPosition; +uniform int* VertexIDs; +uniform int numberOfOrbits; + out vec4 viewSpacePosition; out vec4 vs_position; +out float fade; void main() { + // ta in en vector med vilka index i vertexbufferten som positionen är =. + // dela vectorns längd med antalet orbits för att få vilket index i den lilla + // vectorn vi ska använda värdet från. + + int vertexID = gl_VertexID; + float id = float(vertexID) / float(numberOfSegments); + fade = clamp(id * lineFade, 0.0, 1.0); + + int orbit = vertexID/numberOfSegments; + // will this iterate or add onto the value in vertexIDs?: VertexIDs = VertexIDs + orbit; + // should it be VertexIDs[orbit] - gl_VertexID, OR gl_VertexID - VertexIDs[orbit]: + // int offset = VertexIDs[orbit] - gl_VertexID + // to know the direction of the debris + // if(debrisPosition == vs_position) viewSpacePosition = vec4(modelViewTransform * dvec4(vertex_data.xyz, 1)); vs_position = z_normalization( projectionTransform * viewSpacePosition); diff --git a/modules/space/translation/keplertranslation.cpp b/modules/space/translation/keplertranslation.cpp index d15967fef8..883304ff67 100644 --- a/modules/space/translation/keplertranslation.cpp +++ b/modules/space/translation/keplertranslation.cpp @@ -304,13 +304,13 @@ glm::dvec3 KeplerTranslation::position(const UpdateData& data) const { return _orbitPlaneRotation * p; } // !!! is only used in module/space/rendering/renderablesatellites -glm::dvec3 KeplerTranslation::debrisPos(const Time& time) const { +glm::dvec3 KeplerTranslation::debrisPos(const double& time) const { if (_orbitPlaneDirty) { computeOrbitPlane(); _orbitPlaneDirty = false; } - const double t = time.j2000Seconds() - _epoch; + const double t = time - _epoch; const double meanMotion = glm::two_pi() / _period; const double meanAnomaly = glm::radians(_meanAnomalyAtEpoch.value()) + t * meanMotion; const double e = eccentricAnomaly(meanAnomaly); diff --git a/modules/space/translation/keplertranslation.h b/modules/space/translation/keplertranslation.h index a6120b2ebc..94601e2d69 100644 --- a/modules/space/translation/keplertranslation.h +++ b/modules/space/translation/keplertranslation.h @@ -91,7 +91,7 @@ public: glm::dvec3 position(const UpdateData& data) const override; // Is only used in renderableDebris so far. May rename if needed - glm::dvec3 debrisPos(const Time& time) const; + glm::dvec3 debrisPos(const double& time) const; /**