diff --git a/modules/space/rendering/renderablestars.cpp b/modules/space/rendering/renderablestars.cpp index 5823510146..edbeaf29bd 100644 --- a/modules/space/rendering/renderablestars.cpp +++ b/modules/space/rendering/renderablestars.cpp @@ -27,6 +27,7 @@ #include #include #include +#include #include #include @@ -99,25 +100,24 @@ namespace { "stars." }; - static const openspace::properties::Property::PropertyInfo TransparencyInfo = { - "Transparency", - "Transparency", - "This value is a multiplicative factor that is applied to the transparency of " - "all stars." + static const openspace::properties::Property::PropertyInfo MagnitudeExponentInfo = { + "MagnitudeExponent", + "MagnitudeExponent", + "Adjust star magnitude by 10^MagnitudeExponent. " + "Stars closer than this distance are given full opacity. " + "Farther away, stars dim proportionally to the logarithm of their distance." }; - static const 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 star." + static const openspace::properties::Property::PropertyInfo SharpnessInfo = { + "Sharpness", + "Sharpness", + "Adjust star sharpness" }; - static const openspace::properties::Property::PropertyInfo MinBillboardSizeInfo = { - "MinBillboardSize", - "Min Billboard Size", - "This value is used as a lower limit on the size of stars that are rendered. Any " - "stars that have a smaller apparent size will be discarded entirely." + static const openspace::properties::Property::PropertyInfo BillboardSizeInfo = { + "BillboardSize", + "Billboard Size", + "Set the billboard size of all stars" }; } // namespace @@ -162,22 +162,22 @@ documentation::Documentation RenderableStars::Documentation() { ColorOptionInfo.description }, { - TransparencyInfo.identifier, + MagnitudeExponentInfo.identifier, new DoubleVerifier, Optional::Yes, - TransparencyInfo.description + MagnitudeExponentInfo.description }, { - ScaleFactorInfo.identifier, + SharpnessInfo.identifier, new DoubleVerifier, Optional::Yes, - ScaleFactorInfo.description + SharpnessInfo.description }, { - MinBillboardSizeInfo.identifier, + BillboardSizeInfo.identifier, new DoubleVerifier, Optional::Yes, - MinBillboardSizeInfo.description + BillboardSizeInfo.description } } }; @@ -193,9 +193,9 @@ RenderableStars::RenderableStars(const ghoul::Dictionary& dictionary) , _colorTextureIsDirty(true) , _colorOption(ColorOptionInfo, properties::OptionProperty::DisplayType::Dropdown) , _dataIsDirty(true) - , _alphaValue(TransparencyInfo, 1.f, 0.f, 1.f) - , _scaleFactor(ScaleFactorInfo, 1.f, 0.f, 10.f) - , _minBillboardSize(MinBillboardSizeInfo, 1.f, 1.f, 100.f) + , _magnitudeExponent(MagnitudeExponentInfo, 19.f, 0.f, 30.f) + , _sharpness(SharpnessInfo, 1.f, 0.f, 5.f) + , _billboardSize(BillboardSizeInfo, 30.f, 1.f, 100.f) , _program(nullptr) , _speckFile("") , _nValuesPerStar(0) @@ -258,26 +258,26 @@ RenderableStars::RenderableStars(const ghoul::Dictionary& dictionary) ); addProperty(_colorTexturePath); - if (dictionary.hasKey(TransparencyInfo.identifier)) { - _alphaValue = static_cast( - dictionary.value(TransparencyInfo.identifier) + if (dictionary.hasKey(MagnitudeExponentInfo.identifier)) { + _magnitudeExponent = static_cast( + dictionary.value(MagnitudeExponentInfo.identifier) ); } - addProperty(_alphaValue); + addProperty(_magnitudeExponent); - if (dictionary.hasKey(ScaleFactorInfo.identifier)) { - _scaleFactor = static_cast( - dictionary.value(ScaleFactorInfo.identifier) - ); + if (dictionary.hasKey(SharpnessInfo.identifier)) { + _sharpness = static_cast( + dictionary.value(SharpnessInfo.identifier) + ); } - addProperty(_scaleFactor); + addProperty(_sharpness); - if (dictionary.hasKey(MinBillboardSizeInfo.identifier)) { - _minBillboardSize = static_cast( - dictionary.value(MinBillboardSizeInfo.identifier) + if (dictionary.hasKey(BillboardSizeInfo.identifier)) { + _billboardSize = static_cast( + dictionary.value(BillboardSizeInfo.identifier) ); } - addProperty(_minBillboardSize); + addProperty(_billboardSize); } RenderableStars::~RenderableStars() {} @@ -294,14 +294,15 @@ void RenderableStars::initializeGL() { absPath("${MODULE_SPACE}/shaders/star_ge.glsl") ); + _uniformCache.model = _program->uniformLocation("model"); _uniformCache.view = _program->uniformLocation("view"); + _uniformCache.viewScaling = _program->uniformLocation("viewScaling"); _uniformCache.projection = _program->uniformLocation("projection"); _uniformCache.colorOption = _program->uniformLocation("colorOption"); - _uniformCache.alphaValue = _program->uniformLocation("alphaValue"); - _uniformCache.scaleFactor = _program->uniformLocation("scaleFactor"); - _uniformCache.minBillboardSize = _program->uniformLocation("minBillboardSize"); + _uniformCache.magnitudeExponent = _program->uniformLocation("magnitudeExponent"); + _uniformCache.sharpness = _program->uniformLocation("sharpness"); + _uniformCache.billboardSize = _program->uniformLocation("billboardSize"); _uniformCache.screenSize = _program->uniformLocation("screenSize"); - _uniformCache.scaling = _program->uniformLocation("scaling"); _uniformCache.psfTexture = _program->uniformLocation("psfTexture"); _uniformCache.colorTexture = _program->uniformLocation("colorTexture"); @@ -331,25 +332,29 @@ void RenderableStars::render(const RenderData& data, RendererTasks&) { glDepthMask(false); _program->activate(); - // @Check overwriting the scaling from the camera; error as parsec->meter conversion - // is done twice? ---abock - glm::vec2 scaling = glm::vec2(1, -19); + glm::mat4 model = + glm::translate(glm::dmat4(1.0), data.modelTransform.translation) * + glm::dmat4(data.modelTransform.rotation) * + glm::dmat4(glm::scale(glm::dmat4(1.0), glm::dvec3(data.modelTransform.scale))); - _program->setUniform(_uniformCache.view, data.camera.viewMatrix()); - _program->setUniform(_uniformCache.projection, data.camera.projectionMatrix()); + glm::mat4 view = data.camera.combinedViewMatrix(); + glm::mat4 projection = data.camera.projectionMatrix(); + float viewScaling = data.camera.scaling(); + + _program->setUniform(_uniformCache.model, model); + _program->setUniform(_uniformCache.view, view); + _program->setUniform(_uniformCache.projection, projection); + _program->setUniform(_uniformCache.viewScaling, viewScaling); _program->setUniform(_uniformCache.colorOption, _colorOption); - _program->setUniform(_uniformCache.alphaValue, _alphaValue); - _program->setUniform(_uniformCache.scaleFactor, _scaleFactor); - _program->setUniform(_uniformCache.minBillboardSize, _minBillboardSize); + _program->setUniform(_uniformCache.magnitudeExponent, _magnitudeExponent); + _program->setUniform(_uniformCache.sharpness, _sharpness); + _program->setUniform(_uniformCache.billboardSize, _billboardSize); _program->setUniform( _uniformCache.screenSize, glm::vec2(OsEng.renderEngine().renderingResolution()) ); - setPscUniforms(*_program.get(), data.camera, data.position); - _program->setUniform(_uniformCache.scaling, scaling); - ghoul::opengl::TextureUnit psfUnit; psfUnit.activate(); _pointSpreadFunctionTexture->bind(); @@ -552,14 +557,15 @@ void RenderableStars::update(const UpdateData&) { if (_program->isDirty()) { _program->rebuildFromFile(); + _uniformCache.model = _program->uniformLocation("model"); _uniformCache.view = _program->uniformLocation("view"); + _uniformCache.viewScaling = _program->uniformLocation("viewScaling"); _uniformCache.projection = _program->uniformLocation("projection"); _uniformCache.colorOption = _program->uniformLocation("colorOption"); - _uniformCache.alphaValue = _program->uniformLocation("alphaValue"); - _uniformCache.scaleFactor = _program->uniformLocation("scaleFactor"); - _uniformCache.minBillboardSize = _program->uniformLocation("minBillboardSize"); + _uniformCache.magnitudeExponent = _program->uniformLocation("magnitudeExponent"); + _uniformCache.sharpness = _program->uniformLocation("sharpness"); + _uniformCache.billboardSize = _program->uniformLocation("billboardSize"); _uniformCache.screenSize = _program->uniformLocation("screenSize"); - _uniformCache.scaling = _program->uniformLocation("scaling"); _uniformCache.psfTexture = _program->uniformLocation("psfTexture"); _uniformCache.colorTexture = _program->uniformLocation("colorTexture"); } @@ -735,51 +741,20 @@ bool RenderableStars::saveCachedFile(const std::string& file) const { void RenderableStars::createDataSlice(ColorOption option) { _slicedData.clear(); - // This is only temporary until the scalegraph is in place ---abock - float minDistance = std::numeric_limits::max(); - float maxDistance = -std::numeric_limits::max(); - - for (size_t i = 0; i < _fullData.size(); i+=_nValuesPerStar) { - float distLy = _fullData[i + 6]; - //if (distLy < 20.f) { - minDistance = std::min(minDistance, distLy); - maxDistance = std::max(maxDistance, distLy); - //} - } - for (size_t i = 0; i < _fullData.size(); i+=_nValuesPerStar) { glm::vec3 p = glm::vec3(_fullData[i + 0], _fullData[i + 1], _fullData[i + 2]); - - // This is only temporary until the scalegraph is in place. It places all stars - // on a sphere with a small variation in the distance to account for blending - // issues ---abock - //if (p != glm::vec3(0.f)) - // p = glm::normalize(p); - - //float distLy = _fullData[i + 6]; - //float normalizedDist = (distLy - minDistance) / (maxDistance - minDistance); - //float distance = 18.f - normalizedDist / 1.f ; - - - //psc position = psc(glm::vec4(p, distance)); - - // Convert parsecs -> meter - psc position = psc(glm::vec4(p * 0.308567756f, 17)); - - //position[1] *= parsecsToMetersFactor[0]; - //position[2] *= parsecsToMetersFactor[0]; - //position[3] += parsecsToMetersFactor[1]; + p *= openspace::distanceconstants::Parsec; switch (option) { case ColorOption::Color: { union { ColorVBOLayout value; - std::array data; + std::array data; } layout; layout.value.position = { { - position[0], position[1], position[2], position[3] + p[0], p[1], p[2], 1.0 } }; #ifdef USING_STELLAR_TEST_GRID @@ -802,11 +777,11 @@ void RenderableStars::createDataSlice(ColorOption option) { { union { VelocityVBOLayout value; - std::array data; + std::array data; } layout; layout.value.position = { { - position[0], position[1], position[2], position[3] + p[0], p[1], p[2], 1.0 } }; layout.value.bvColor = _fullData[i + 3]; @@ -826,11 +801,11 @@ void RenderableStars::createDataSlice(ColorOption option) { { union { SpeedVBOLayout value; - std::array data; + std::array data; } layout; layout.value.position = { { - position[0], position[1], position[2], position[3] + p[0], p[1], p[2], 1.0 } }; layout.value.bvColor = _fullData[i + 3]; diff --git a/modules/space/rendering/renderablestars.h b/modules/space/rendering/renderablestars.h index fd2cd92e5a..3e8ced2282 100644 --- a/modules/space/rendering/renderablestars.h +++ b/modules/space/rendering/renderablestars.h @@ -86,13 +86,13 @@ private: properties::OptionProperty _colorOption; bool _dataIsDirty; - properties::FloatProperty _alphaValue; - properties::FloatProperty _scaleFactor; - properties::FloatProperty _minBillboardSize; + properties::FloatProperty _magnitudeExponent; + properties::FloatProperty _sharpness; + properties::FloatProperty _billboardSize; std::unique_ptr _program; - UniformCache(view, projection, colorOption, alphaValue, scaleFactor, - minBillboardSize, screenSize, scaling, psfTexture, colorTexture) _uniformCache; + UniformCache(model, view, viewScaling, projection, colorOption, magnitudeExponent, sharpness, + billboardSize, screenSize, scaling, psfTexture, colorTexture) _uniformCache; std::string _speckFile; diff --git a/modules/space/shaders/star_fs.glsl b/modules/space/shaders/star_fs.glsl index 9ee5b90c4f..0c53b621b2 100644 --- a/modules/space/shaders/star_fs.glsl +++ b/modules/space/shaders/star_fs.glsl @@ -23,7 +23,7 @@ ****************************************************************************************/ #include "fragment.glsl" -#include "PowerScaling/powerScaling_fs.hglsl" +#include "floatoperations.glsl" // keep in sync with renderablestars.h:ColorOption enum const int COLOROPTION_COLOR = 0; @@ -32,9 +32,9 @@ const int COLOROPTION_SPEED = 2; uniform sampler2D psfTexture; uniform sampler1D colorTexture; -uniform float minBillboardSize; -uniform float alphaValue; +uniform float magnitudeExponent; +uniform float sharpness; uniform int colorOption; in vec4 vs_position; @@ -43,13 +43,7 @@ in vec3 ge_brightness; in vec3 ge_velocity; in float ge_speed; in vec2 texCoord; -in float billboardSize; - -#include "fragment.glsl" -//#include "PowerScaling/powerScaling_fs.hglsl" - -uniform vec2 magnitudeClamp; - +in float ge_observationDistance; vec4 bv2rgb(float bv) { // BV is [-0.4,2.0] @@ -60,7 +54,7 @@ vec4 bv2rgb(float bv) { Fragment getFragment() { // Something in the color calculations need to be changed because before it was dependent // on the gl blend functions since the abuffer was not involved - + vec4 color = vec4(0.0); switch (colorOption) { case COLOROPTION_COLOR: @@ -77,19 +71,15 @@ Fragment getFragment() { vec4 textureColor = texture(psfTexture, texCoord); vec4 fullColor = vec4(color.rgb, textureColor.a); - fullColor.a *= alphaValue; + fullColor.a = pow(fullColor.a, sharpness); - vec4 position = vs_position; - // This has to be fixed when the scale graph is in place ---emiax - position.w = 15; + float d = magnitudeExponent - log(ge_observationDistance) / log(10.0); + fullColor.a *= clamp(d, 0.0, 1.0); Fragment frag; frag.color = fullColor; - frag.depth = pscDepth(position); - - // G-Buffer + frag.depth = safeLength(vs_position); frag.gPosition = ge_gPosition; - // There is no normal here frag.gNormal = vec4(0.0, 0.0, 0.0, 1.0); if (fullColor.a == 0) { diff --git a/modules/space/shaders/star_ge.glsl b/modules/space/shaders/star_ge.glsl index b6fc81b941..3b2b95573c 100644 --- a/modules/space/shaders/star_ge.glsl +++ b/modules/space/shaders/star_ge.glsl @@ -24,15 +24,14 @@ #version __CONTEXT__ -#include "PowerScaling/powerScalingMath.hglsl" +#include "floatoperations.glsl" layout(points) in; -in vec4 psc_position[]; + in vec3 vs_brightness[]; in vec3 vs_velocity[]; in vec4 vs_gPosition[]; in float vs_speed[]; -in vec4 cam_position[]; layout(triangle_strip, max_vertices = 4) out; @@ -42,12 +41,11 @@ out vec3 ge_brightness; out vec3 ge_velocity; out float ge_speed; out vec2 texCoord; -out float billboardSize; - -uniform mat4 projection; +out float ge_observationDistance; +uniform float viewScaling; uniform float scaleFactor; -uniform float minBillboardSize; +uniform float billboardSize; uniform vec2 screenSize; const vec2 corners[4] = vec2[4]( @@ -57,50 +55,27 @@ const vec2 corners[4] = vec2[4]( vec2(1.0, 0.0) ); - void main() { - // JCC: We want to display the Sun. - // if ((psc_position[0].x == 0.0) && - // (psc_position[0].y == 0.0) && - // (psc_position[0].z == 0.0)) - // { - // return; - // } - ge_brightness = vs_brightness[0]; ge_velocity = vs_velocity[0]; ge_speed = vs_speed[0]; float absoluteMagnitude = vs_brightness[0].z; - float modifiedSpriteSize = - exp((-30.623 - absoluteMagnitude) * 0.462) * scaleFactor * 2000; - vec4 projPos[4]; - for (int i = 0; i < 4; ++i) { - vec4 p1 = gl_in[0].gl_Position; - p1.xy += vec2(modifiedSpriteSize * (corners[i] - vec2(0.5))); - projPos[i] = projection * p1; - } - - // Calculate the positions of the lower left and upper right corners of the - // billboard in screen-space - vec2 ll = (((projPos[1].xy / projPos[1].w) + 1.0) / 2.0) * screenSize; - vec2 ur = (((projPos[2].xy / projPos[2].w) + 1.0) / 2.0) * screenSize; - - // The billboard is smaller than one pixel, we can discard it - float sizeInPixels = length(ll - ur); - if (sizeInPixels < minBillboardSize) { - return; - } + vec4 projectedPoint = gl_in[0].gl_Position; + vec2 starSize = vec2(billboardSize) / screenSize * projectedPoint.w; for (int i = 0; i < 4; i++) { vs_position = gl_in[0].gl_Position; - gl_Position = projPos[i]; + gl_Position = projectedPoint + vec4(starSize * (corners[i] - 0.5), 0.0, 0.0); + gl_Position.z = 0.0; + texCoord = corners[i]; // G-Buffer ge_gPosition = vs_gPosition[0]; - billboardSize = sizeInPixels; + ge_observationDistance = safeLength(vs_gPosition[0] / viewScaling); + EmitVertex(); } diff --git a/modules/space/shaders/star_vs.glsl b/modules/space/shaders/star_vs.glsl index 7ff61c0f5e..594bcfbc5a 100644 --- a/modules/space/shaders/star_vs.glsl +++ b/modules/space/shaders/star_vs.glsl @@ -31,30 +31,24 @@ in vec3 in_brightness; in vec3 in_velocity; in float in_speed; -out vec4 psc_position; out vec3 vs_brightness; out vec3 vs_velocity; out float vs_speed; out vec4 vs_gPosition; +uniform mat4 model; uniform mat4 view; uniform mat4 projection; - void main() { - vec4 p = in_position; - psc_position = p; vs_brightness = in_brightness; vs_velocity = in_velocity; vs_speed = in_speed; - vec4 tmp = p; - vec4 position = pscTransform(tmp, mat4(1.0)); - - // G-Buffer - vs_gPosition = view * (vec4(1E19, 1E19, 1E19, 1.0) * position); - - position = view * position; - - gl_Position = position; + vec3 modelPosition = in_position.xyz; + + vec4 viewPosition = view * model * vec4(modelPosition, 1.0); + + vs_gPosition = viewPosition; + gl_Position = projection * vs_gPosition; }