mirror of
https://github.com/OpenSpace/OpenSpace.git
synced 2026-01-25 21:48:41 -06:00
Changed to full texture control as Carter wanted.
This commit is contained in:
@@ -21,10 +21,18 @@ local Saturn = {
|
||||
SegmentsPerPatch = 64,
|
||||
Layers = {},
|
||||
Rings = {
|
||||
Texture = texturesPath .. "/saturn_rings.png",
|
||||
--TextureFwrd = texturesPath .. "/final_color_forward_os.png",
|
||||
--TextureBckwrd = texturesPath .. "/final_color_backwards_os.png",
|
||||
--TextureUnlit = texturesPath .. "/unlit_final_color_os.png",
|
||||
-- Single Texture Values:
|
||||
--Texture = texturesPath .. "/saturn_rings.png",
|
||||
--ColorFilter = 0.15,
|
||||
|
||||
-- MultiTexture Valeus:
|
||||
TextureFwrd = texturesPath .. "/forward_original_single.png",
|
||||
TextureBckwrd = texturesPath .. "/back_original_single.png",
|
||||
TextureUnlit = texturesPath .. "/unlit_original_single.png",
|
||||
TextureColor = texturesPath .. "/color_original_single.png",
|
||||
TextureTransparency = texturesPath .. "/trans_original_single.png",
|
||||
ColorFilter = 0.8,
|
||||
|
||||
NightFactor = 1.0,
|
||||
Size = 140445000,
|
||||
Offset = { 74500 / 140445.100671159, 1.0 }, -- min / max extend
|
||||
|
||||
@@ -36,6 +36,8 @@ uniform sampler2DShadow shadowMapTexture;
|
||||
uniform sampler1D ringTextureFwrd;
|
||||
uniform sampler1D ringTextureBckwrd;
|
||||
uniform sampler1D ringTextureUnlit;
|
||||
uniform sampler1D ringTextureColor;
|
||||
uniform sampler1D ringTextureTransparency;
|
||||
|
||||
uniform vec2 textureOffset;
|
||||
uniform float colorFilterValue;
|
||||
@@ -70,27 +72,20 @@ Fragment getFragment() {
|
||||
discard;
|
||||
}
|
||||
|
||||
vec4 colorBckwrd = vec4(0.95) * texture(ringTextureBckwrd, texCoord);
|
||||
vec4 colorFwrd = vec4(0.5) * texture(ringTextureFwrd, texCoord);
|
||||
vec4 colorBckwrd = texture(ringTextureBckwrd, texCoord);
|
||||
vec4 colorFwrd = texture(ringTextureFwrd, texCoord);
|
||||
vec4 colorMult = texture(ringTextureColor, texCoord);
|
||||
vec4 transparency = texture(ringTextureTransparency, texCoord);
|
||||
|
||||
float lerpFactor = (1.f + dot(camPositionObj.xyz, sunPosition.xyz)) * 0.5f;
|
||||
|
||||
// Jon Colors:
|
||||
//vec4 diffuse = mix(colorFwrd * vec4(1, 0.88, 0.82, 1.0), colorBckwrd * vec4(1, 0.88, 0.82, 1.0), lerpFactor);
|
||||
vec4 diffuse = mix(colorFwrd, colorBckwrd, lerpFactor);
|
||||
diffuse.a = 1.f;
|
||||
|
||||
// divided by 3 as length of vec3(1.0, 1.0, 1.0) will return 3 and we want
|
||||
// to normalize the alpha value to [0,1]
|
||||
vec4 diffuse = mix(colorFwrd * colorMult, colorBckwrd * colorMult, lerpFactor);
|
||||
diffuse.a = colorFilterValue * transparency.a;
|
||||
float colorValue = length(diffuse.rgb) / 0.57735026919;
|
||||
if (colorValue < colorFilterValue) {
|
||||
diffuse.a = colorValue * colorFilterValue;
|
||||
if (diffuse.a < 0.99)
|
||||
discard;
|
||||
} else {
|
||||
diffuse.a = colorValue;
|
||||
if (diffuse.a + 1 < 1.2)
|
||||
discard;
|
||||
}
|
||||
if (colorValue < 0.1)
|
||||
discard;
|
||||
|
||||
// shadow == 1.0 means it is not in shadow
|
||||
float shadow = 1.0;
|
||||
@@ -130,7 +125,9 @@ Fragment getFragment() {
|
||||
// Reduce the color of the fragment by the user factor
|
||||
// if we are facing away from the Sun
|
||||
if (dot(sunPosition, normal) < 0) {
|
||||
diffuse.xyz = vec3(0.9) * texture(ringTextureUnlit, texCoord).xyz * _nightFactor;
|
||||
diffuse.xyz = vec3(1.0, 0.97075, 0.952) *
|
||||
texture(ringTextureUnlit, texCoord).xyz *
|
||||
_nightFactor;
|
||||
}
|
||||
|
||||
Fragment frag;
|
||||
|
||||
@@ -59,10 +59,11 @@ namespace {
|
||||
"zFightingPercentage"
|
||||
};
|
||||
|
||||
constexpr const std::array<const char*, 12> UniformNamesAdvancedRings = {
|
||||
constexpr const std::array<const char*, 14> UniformNamesAdvancedRings = {
|
||||
"modelViewProjectionMatrix", "textureOffset", "colorFilterValue", "_nightFactor",
|
||||
"sunPosition", "camPositionObj", "ringTextureFwrd", "ringTextureBckwrd",
|
||||
"ringTextureUnlit", "shadowMatrix", "shadowMapTexture", "zFightingPercentage"
|
||||
"ringTextureUnlit", "ringTextureColor", "ringTextureTransparency", "shadowMatrix",
|
||||
"shadowMapTexture", "zFightingPercentage"
|
||||
};
|
||||
|
||||
constexpr const std::array<const char*, 3> GeomUniformNames = {
|
||||
@@ -97,6 +98,20 @@ namespace {
|
||||
"texture which is used for unlit part in these rings."
|
||||
};
|
||||
|
||||
constexpr openspace::properties::Property::PropertyInfo TextureColorInfo = {
|
||||
"TextureColor",
|
||||
"TextureColor",
|
||||
"This value is the path to a texture on disk that contains a one-dimensional "
|
||||
"texture color which is used for unlit part in these rings."
|
||||
};
|
||||
|
||||
constexpr openspace::properties::Property::PropertyInfo TextureTransparencyInfo = {
|
||||
"TextureTransparency",
|
||||
"TextureTransparency",
|
||||
"This value is the path to a texture on disk that contains a one-dimensional "
|
||||
"texture transparency which is used for unlit part in these rings."
|
||||
};
|
||||
|
||||
constexpr openspace::properties::Property::PropertyInfo SizeInfo = {
|
||||
"Size",
|
||||
"Size",
|
||||
@@ -174,6 +189,18 @@ documentation::Documentation RingsComponent::Documentation() {
|
||||
Optional::Yes,
|
||||
TextureUnlitInfo.description
|
||||
},
|
||||
{
|
||||
TextureColorInfo.identifier,
|
||||
new StringVerifier,
|
||||
Optional::Yes,
|
||||
TextureColorInfo.description
|
||||
},
|
||||
{
|
||||
TextureTransparencyInfo.identifier,
|
||||
new StringVerifier,
|
||||
Optional::Yes,
|
||||
TextureTransparencyInfo.description
|
||||
},
|
||||
{
|
||||
SizeInfo.identifier,
|
||||
new DoubleVerifier,
|
||||
@@ -220,6 +247,8 @@ RingsComponent::RingsComponent(const ghoul::Dictionary& dictionary)
|
||||
, _textureFwrdPath(TextureFwrdInfo)
|
||||
, _textureBckwrdPath(TextureBckwrdInfo)
|
||||
, _textureUnlitPath(TextureUnlitInfo)
|
||||
, _textureColorPath(TextureColorInfo)
|
||||
, _textureTransparencyPath(TextureTransparencyInfo)
|
||||
, _size(SizeInfo, 1.f, 0.f, 1e25f)
|
||||
, _offset(OffsetInfo, glm::vec2(0.f, 1.f), glm::vec2(0.f), glm::vec2(1.f))
|
||||
, _nightFactor(NightFactorInfo, 0.33f, 0.f, 1.f)
|
||||
@@ -298,6 +327,26 @@ void RingsComponent::initialize() {
|
||||
_textureFileUnlit->setCallback([&](const File&) { _textureIsDirty = true; });
|
||||
}
|
||||
|
||||
if (_ringsDictionary.hasKey(TextureColorInfo.identifier)) {
|
||||
_textureColorPath = absPath(
|
||||
_ringsDictionary.value<std::string>(TextureColorInfo.identifier)
|
||||
);
|
||||
_textureFileColor = std::make_unique<File>(_textureColorPath);
|
||||
_textureColorPath.onChange([&]() { loadTexture(); });
|
||||
addProperty(_textureColorPath);
|
||||
_textureFileColor->setCallback([&](const File&) { _textureIsDirty = true; });
|
||||
}
|
||||
|
||||
if (_ringsDictionary.hasKey(TextureTransparencyInfo.identifier)) {
|
||||
_textureTransparencyPath = absPath(
|
||||
_ringsDictionary.value<std::string>(TextureTransparencyInfo.identifier)
|
||||
);
|
||||
_textureFileTransparency = std::make_unique<File>(_textureTransparencyPath);
|
||||
_textureTransparencyPath.onChange([&]() { loadTexture(); });
|
||||
addProperty(_textureTransparencyPath);
|
||||
_textureFileTransparency->setCallback([&](const File&) { _textureIsDirty = true; });
|
||||
}
|
||||
|
||||
if (_ringsDictionary.hasValue<glm::dvec2>(OffsetInfo.identifier)) {
|
||||
_offset = _ringsDictionary.value<glm::dvec2>(OffsetInfo.identifier);
|
||||
}
|
||||
@@ -415,6 +464,8 @@ void RingsComponent::draw(const RenderData& data,
|
||||
ghoul::opengl::TextureUnit ringTextureFwrdUnit;
|
||||
ghoul::opengl::TextureUnit ringTextureBckwrdUnit;
|
||||
ghoul::opengl::TextureUnit ringTextureUnlitUnit;
|
||||
ghoul::opengl::TextureUnit ringTextureColorUnit;
|
||||
ghoul::opengl::TextureUnit ringTextureTransparencyUnit;
|
||||
if (renderPass == GeometryAndShading) {
|
||||
if (_isAdvancedTextureEnabled) {
|
||||
_shader->setUniform(
|
||||
@@ -455,6 +506,20 @@ void RingsComponent::draw(const RenderData& data,
|
||||
ringTextureUnlitUnit
|
||||
);
|
||||
|
||||
ringTextureColorUnit.activate();
|
||||
_textureColor->bind();
|
||||
_shader->setUniform(
|
||||
_uniformCacheAdvancedRings.ringTextureColor,
|
||||
ringTextureColorUnit
|
||||
);
|
||||
|
||||
ringTextureTransparencyUnit.activate();
|
||||
_textureTransparency->bind();
|
||||
_shader->setUniform(
|
||||
_uniformCacheAdvancedRings.ringTextureTransparency,
|
||||
ringTextureTransparencyUnit
|
||||
);
|
||||
|
||||
// Adding the model transformation to the final shadow matrix so we have a
|
||||
// complete transformation from the model coordinates to the clip space of
|
||||
// the light position.
|
||||
@@ -482,6 +547,10 @@ void RingsComponent::draw(const RenderData& data,
|
||||
glBindTexture(GL_TEXTURE_2D, shadowData.shadowDepthTexture);
|
||||
_shader->setUniform(_uniformCacheAdvancedRings.shadowMapTexture, shadowMapUnit);
|
||||
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
glEnablei(GL_BLEND, 0);
|
||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||
|
||||
} else {
|
||||
_shader->setUniform(
|
||||
_uniformCache.modelViewProjectionMatrix,
|
||||
@@ -527,7 +596,13 @@ void RingsComponent::draw(const RenderData& data,
|
||||
_geometryOnlyShader->setUniform(_geomUniformCache.textureOffset, _offset);
|
||||
|
||||
ringTextureUnit.activate();
|
||||
_texture->bind();
|
||||
if (_isAdvancedTextureEnabled) {
|
||||
_textureForwards->bind();
|
||||
}
|
||||
else {
|
||||
_texture->bind();
|
||||
}
|
||||
|
||||
_geometryOnlyShader->setUniform(_geomUniformCache.ringTexture, ringTextureUnit);
|
||||
}
|
||||
|
||||
@@ -689,6 +764,60 @@ void RingsComponent::loadTexture() {
|
||||
}
|
||||
}
|
||||
|
||||
if (!_textureColorPath.value().empty()) {
|
||||
std::unique_ptr<Texture> textureColor = TextureReader::ref().loadTexture(
|
||||
absPath(_textureColorPath)
|
||||
);
|
||||
|
||||
if (textureColor) {
|
||||
LDEBUGC(
|
||||
"RingsComponent",
|
||||
fmt::format(
|
||||
"Loaded color texture from '{}'",
|
||||
absPath(_textureColorPath)
|
||||
)
|
||||
);
|
||||
_textureColor = std::move(textureColor);
|
||||
|
||||
_textureColor->uploadTexture();
|
||||
_textureColor->setFilter(ghoul::opengl::Texture::FilterMode::AnisotropicMipMap);
|
||||
|
||||
_textureFileColor = std::make_unique<ghoul::filesystem::File>(_textureColorPath);
|
||||
_textureFileColor->setCallback(
|
||||
[&](const ghoul::filesystem::File&) { _textureIsDirty = true; }
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
if (!_textureTransparencyPath.value().empty()) {
|
||||
std::unique_ptr<Texture> textureTransparency = TextureReader::ref().loadTexture(
|
||||
absPath(_textureTransparencyPath)
|
||||
);
|
||||
|
||||
if (textureTransparency) {
|
||||
LDEBUGC(
|
||||
"RingsComponent",
|
||||
fmt::format(
|
||||
"Loaded unlit texture from '{}'",
|
||||
absPath(_textureUnlitPath)
|
||||
)
|
||||
);
|
||||
_textureTransparency = std::move(textureTransparency);
|
||||
|
||||
_textureTransparency->uploadTexture();
|
||||
_textureTransparency->setFilter(
|
||||
ghoul::opengl::Texture::FilterMode::AnisotropicMipMap
|
||||
);
|
||||
|
||||
_textureFileTransparency = std::make_unique<ghoul::filesystem::File>(
|
||||
_textureTransparencyPath
|
||||
);
|
||||
_textureFileTransparency->setCallback(
|
||||
[&](const ghoul::filesystem::File&) { _textureIsDirty = true; }
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
_isAdvancedTextureEnabled = _textureForwards && _textureBackwards && _textureUnlit;
|
||||
}
|
||||
|
||||
|
||||
@@ -81,6 +81,8 @@ private:
|
||||
properties::StringProperty _textureFwrdPath;
|
||||
properties::StringProperty _textureBckwrdPath;
|
||||
properties::StringProperty _textureUnlitPath;
|
||||
properties::StringProperty _textureColorPath;
|
||||
properties::StringProperty _textureTransparencyPath;
|
||||
properties::FloatProperty _size;
|
||||
properties::Vec2Property _offset;
|
||||
properties::FloatProperty _nightFactor;
|
||||
@@ -96,7 +98,8 @@ private:
|
||||
) _uniformCache;
|
||||
UniformCache(modelViewProjectionMatrix, textureOffset, colorFilterValue, nightFactor,
|
||||
sunPosition, camPositionObj, ringTextureFwrd, ringTextureBckwrd,
|
||||
ringTextureUnlit, shadowMatrix, shadowMapTexture, zFightingPercentage
|
||||
ringTextureUnlit, ringTextureColor, ringTextureTransparency, shadowMatrix,
|
||||
shadowMapTexture, zFightingPercentage
|
||||
) _uniformCacheAdvancedRings;
|
||||
UniformCache(modelViewProjectionMatrix, textureOffset, ringTexture
|
||||
) _geomUniformCache;
|
||||
@@ -104,10 +107,14 @@ private:
|
||||
std::unique_ptr<ghoul::opengl::Texture> _textureForwards;
|
||||
std::unique_ptr<ghoul::opengl::Texture> _textureBackwards;
|
||||
std::unique_ptr<ghoul::opengl::Texture> _textureUnlit;
|
||||
std::unique_ptr<ghoul::opengl::Texture> _textureTransparency;
|
||||
std::unique_ptr<ghoul::opengl::Texture> _textureColor;
|
||||
std::unique_ptr<ghoul::filesystem::File> _textureFile;
|
||||
std::unique_ptr<ghoul::filesystem::File> _textureFileForwards;
|
||||
std::unique_ptr<ghoul::filesystem::File> _textureFileBackwards;
|
||||
std::unique_ptr<ghoul::filesystem::File> _textureFileUnlit;
|
||||
std::unique_ptr<ghoul::filesystem::File> _textureFileColor;
|
||||
std::unique_ptr<ghoul::filesystem::File> _textureFileTransparency;
|
||||
|
||||
ghoul::Dictionary _ringsDictionary;
|
||||
bool _textureIsDirty = false;
|
||||
|
||||
Reference in New Issue
Block a user