mirror of
https://github.com/OpenSpace/OpenSpace.git
synced 2026-02-18 02:49:03 -06:00
applying more suggestions from code review
This commit is contained in:
@@ -37,7 +37,6 @@ out vec4 fs_position;
|
||||
out vec3 ellipsoidNormalCameraSpace;
|
||||
out vec3 levelWeights;
|
||||
out vec3 positionCameraSpace;
|
||||
out vec3 positionWorldSpace;
|
||||
out vec3 posObjSpace;
|
||||
out vec3 normalObjSpace;
|
||||
|
||||
@@ -56,6 +55,11 @@ uniform dmat4 inverseViewTransform;
|
||||
out vec4 shadowCoords;
|
||||
#endif // SHADOW_MAPPING_ENABLED
|
||||
|
||||
#if USE_ECLIPSE_SHADOWS
|
||||
// Position in world space
|
||||
out vec3 positionWorldSpace;
|
||||
#endif // USE_ECLIPSE_SHADOWS
|
||||
|
||||
uniform mat4 projectionTransform;
|
||||
// Input points in camera space
|
||||
uniform vec3 p00;
|
||||
|
||||
@@ -63,18 +63,17 @@ uniform float ambientIntensity;
|
||||
|
||||
#if SHADOW_MAPPING_ENABLED
|
||||
#if USE_RING_SHADOWS
|
||||
// Fragment position in object space
|
||||
in vec3 posObjSpace;
|
||||
|
||||
// Color of the rings
|
||||
uniform sampler1D ringTextureColor;
|
||||
// Transparency of the rings
|
||||
uniform sampler1D ringTextureTransparency;
|
||||
uniform vec2 textureOffset;
|
||||
uniform vec3 sunPositionWorld; // NEW: world coordinates
|
||||
uniform vec3 camPositionWorld; // NEW: world coordinates
|
||||
#endif // USE_RING_SHADOWS
|
||||
#endif // SHADOW_MAPPING_ENABLED
|
||||
|
||||
in vec3 posObjSpace; // Fragment position in object space
|
||||
|
||||
#if USE_ECLIPSE_SHADOWS
|
||||
|
||||
#define NSEclipseShadowsMinusOne #{nEclipseShadows}
|
||||
@@ -322,11 +321,9 @@ Fragment getFragment() {
|
||||
|
||||
// Increase the shadow darkness factor with low angle to simulate the light having
|
||||
// to pass through more material
|
||||
float angleFactor = clamp(abs(-dot(ringPlaneNormal, surfaceToSun)) / 2.0, 0.0, 0.3);
|
||||
|
||||
float angleFactor = clamp(abs(dot(ringPlaneNormal, surfaceToSun)) / 2.0, 0.0, 0.3);
|
||||
// Calculate shadow factor based on ring opacity
|
||||
shadow = ringOpacity;
|
||||
shadow = clamp(shadow + angleFactor, 0.05, 1.0);
|
||||
shadow = clamp(ringOpacity + angleFactor, 0.05, 1.0);
|
||||
lightColor = texture(ringTextureColor, texCoord).rgb;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -773,9 +773,11 @@ RenderableGlobe::RenderableGlobe(const ghoul::Dictionary& dictionary)
|
||||
_ringsComponent = std::make_unique<RingsComponent>(*p.rings);
|
||||
_ringsComponent->setParentFadeable(this);
|
||||
_ringsComponent->initialize();
|
||||
_ringsComponent->onReadinessChange([this]() {
|
||||
_shadersNeedRecompilation = true;
|
||||
});
|
||||
addPropertySubOwner(_ringsComponent.get());
|
||||
|
||||
// Set up notification for shader recompilation when rings state changes
|
||||
|
||||
auto* enabledProperty = static_cast<properties::BoolProperty*>(
|
||||
_ringsComponent->property("Enabled")
|
||||
);
|
||||
@@ -1257,32 +1259,11 @@ void RenderableGlobe::renderChunks(const RenderData& data, RendererTasks&,
|
||||
}
|
||||
|
||||
using namespace layers;
|
||||
bool nightLayersActive =
|
||||
const bool nightLayersActive =
|
||||
!_layerManager.layerGroup(Group::ID::NightLayers).activeLayers().empty();
|
||||
bool waterLayersActive =
|
||||
const bool waterLayersActive =
|
||||
!_layerManager.layerGroup(Group::ID::WaterMasks).activeLayers().empty();
|
||||
|
||||
if (nightLayersActive || waterLayersActive || _performShading) {
|
||||
const glm::dvec3 directionToSunWorldSpace =
|
||||
directionToLightSource(data.modelTransform.translation, _lightSourceNode);
|
||||
|
||||
const glm::vec3 directionToSunCameraSpace = glm::vec3(viewTransform *
|
||||
glm::dvec4(directionToSunWorldSpace, 0));
|
||||
const glm::vec3 directionToSunObjSpace = glm::vec3(_cachedInverseModelTransform *
|
||||
glm::dvec4(directionToSunWorldSpace, 0));
|
||||
|
||||
using IgnoreError = ghoul::opengl::ProgramObject::IgnoreError;
|
||||
_globalRenderer.program->setIgnoreUniformLocationError(IgnoreError::Yes);
|
||||
_globalRenderer.program->setUniform(
|
||||
"lightDirectionCameraSpace",
|
||||
-glm::normalize(directionToSunCameraSpace)
|
||||
);
|
||||
_globalRenderer.program->setUniform(
|
||||
"lightDirectionObjSpace",
|
||||
-glm::normalize(directionToSunObjSpace)
|
||||
);
|
||||
}
|
||||
|
||||
if (_useAccurateNormals && hasHeightLayer) {
|
||||
// Apply an extra scaling to the height if the object is scaled
|
||||
_localRenderer.program->setUniform(
|
||||
@@ -1293,23 +1274,17 @@ void RenderableGlobe::renderChunks(const RenderData& data, RendererTasks&,
|
||||
);
|
||||
}
|
||||
|
||||
using namespace layers;
|
||||
nightLayersActive =
|
||||
!_layerManager.layerGroup(Group::ID::NightLayers).activeLayers().empty();
|
||||
waterLayersActive =
|
||||
!_layerManager.layerGroup(Group::ID::WaterMasks).activeLayers().empty();
|
||||
|
||||
// Light direction uniforms, only used in fragment shader
|
||||
if (nightLayersActive || waterLayersActive || _performShading) {
|
||||
const glm::dvec3 directionToSunWorldSpace =
|
||||
directionToLightSource(data.modelTransform.translation, _lightSourceNode);
|
||||
const glm::vec3 directionToSunCameraSpace(viewTransform *
|
||||
glm::dvec4(directionToSunWorldSpace, 0.0));
|
||||
const glm::vec3 directionToSunObjSpace(_cachedInverseModelTransform *
|
||||
glm::dvec4(directionToSunWorldSpace, 0.0));
|
||||
|
||||
const glm::vec3 directionToSunCameraSpace = glm::vec3(viewTransform *
|
||||
glm::dvec4(directionToSunWorldSpace, 0));
|
||||
const glm::vec3 directionToSunObjSpace = glm::vec3(_cachedInverseModelTransform *
|
||||
glm::dvec4(directionToSunWorldSpace, 0));
|
||||
|
||||
// Set the light direction uniforms for local renderer
|
||||
using IgnoreError = ghoul::opengl::ProgramObject::IgnoreError;
|
||||
_localRenderer.program->setIgnoreUniformLocationError(IgnoreError::Yes);
|
||||
_localRenderer.program->setUniform(
|
||||
"lightDirectionCameraSpace",
|
||||
-glm::normalize(directionToSunCameraSpace)
|
||||
@@ -1318,7 +1293,6 @@ void RenderableGlobe::renderChunks(const RenderData& data, RendererTasks&,
|
||||
"lightDirectionObjSpace",
|
||||
-glm::normalize(directionToSunObjSpace)
|
||||
);
|
||||
_localRenderer.program->setIgnoreUniformLocationError(IgnoreError::Yes);
|
||||
}
|
||||
|
||||
int globalCount = 0;
|
||||
@@ -1477,7 +1451,9 @@ void RenderableGlobe::renderChunkGlobally(const Chunk& chunk, const RenderData&
|
||||
|
||||
if (_eclipseShadowsEnabled && !_ellipsoid.shadowConfigurationArray().empty()) {
|
||||
calculateEclipseShadows(program, data, ShadowCompType::GLOBAL_SHADOW);
|
||||
} // Shadow Mapping
|
||||
}
|
||||
|
||||
// Shadow Mapping
|
||||
ghoul::opengl::TextureUnit shadowMapUnit;
|
||||
if (_shadowMappingProperties.shadowMapping && shadowData.shadowDepthTexture != 0) {
|
||||
// Adding the model transformation to the final shadow matrix so we have a
|
||||
@@ -1505,33 +1481,33 @@ void RenderableGlobe::renderChunkGlobally(const Chunk& chunk, const RenderData&
|
||||
ghoul::opengl::TextureUnit ringTextureColorUnit;
|
||||
ghoul::opengl::TextureUnit ringTextureTransparencyUnit;
|
||||
|
||||
if (_ringsComponent->ringTextureFwrd()) {
|
||||
if (_ringsComponent->textureForwards()) {
|
||||
ringTextureFwrdUnit.activate();
|
||||
_ringsComponent->ringTextureFwrd()->bind();
|
||||
_ringsComponent->textureForwards()->bind();
|
||||
program.setUniform("ringTextureFwrd", ringTextureFwrdUnit);
|
||||
}
|
||||
|
||||
if (_ringsComponent->ringTextureBckwrd()) {
|
||||
if (_ringsComponent->textureBackwards()) {
|
||||
ringTextureBckwrdUnit.activate();
|
||||
_ringsComponent->ringTextureBckwrd()->bind();
|
||||
_ringsComponent->textureBackwards()->bind();
|
||||
program.setUniform("ringTextureBckwrd", ringTextureBckwrdUnit);
|
||||
}
|
||||
|
||||
if (_ringsComponent->ringTextureUnlit()) {
|
||||
if (_ringsComponent->textureUnlit()) {
|
||||
ringTextureUnlitUnit.activate();
|
||||
_ringsComponent->ringTextureUnlit()->bind();
|
||||
_ringsComponent->textureUnlit()->bind();
|
||||
program.setUniform("ringTextureUnlit", ringTextureUnlitUnit);
|
||||
}
|
||||
|
||||
if (_ringsComponent->ringTextureColor()) {
|
||||
if (_ringsComponent->textureColor()) {
|
||||
ringTextureColorUnit.activate();
|
||||
_ringsComponent->ringTextureColor()->bind();
|
||||
_ringsComponent->textureColor()->bind();
|
||||
program.setUniform("ringTextureColor", ringTextureColorUnit);
|
||||
}
|
||||
|
||||
if (_ringsComponent->ringTextureTransparency()) {
|
||||
if (_ringsComponent->textureTransparency()) {
|
||||
ringTextureTransparencyUnit.activate();
|
||||
_ringsComponent->ringTextureTransparency()->bind();
|
||||
_ringsComponent->textureTransparency()->bind();
|
||||
program.setUniform("ringTextureTransparency", ringTextureTransparencyUnit);
|
||||
}
|
||||
|
||||
@@ -1659,7 +1635,9 @@ void RenderableGlobe::renderChunkLocally(const Chunk& chunk, const RenderData& d
|
||||
|
||||
if (_eclipseShadowsEnabled && !_ellipsoid.shadowConfigurationArray().empty()) {
|
||||
calculateEclipseShadows(program, data, ShadowCompType::LOCAL_SHADOW);
|
||||
} // Shadow Mapping
|
||||
}
|
||||
|
||||
// Shadow Mapping
|
||||
ghoul::opengl::TextureUnit shadowMapUnit;
|
||||
if (_shadowMappingProperties.shadowMapping && shadowData.shadowDepthTexture != 0) {
|
||||
// Adding the model transformation to the final shadow matrix so we have a
|
||||
@@ -1687,33 +1665,33 @@ void RenderableGlobe::renderChunkLocally(const Chunk& chunk, const RenderData& d
|
||||
ghoul::opengl::TextureUnit ringTextureColorUnit;
|
||||
ghoul::opengl::TextureUnit ringTextureTransparencyUnit;
|
||||
|
||||
if (_ringsComponent->ringTextureFwrd()) {
|
||||
if (_ringsComponent->textureForwards()) {
|
||||
ringTextureFwrdUnit.activate();
|
||||
_ringsComponent->ringTextureFwrd()->bind();
|
||||
_ringsComponent->textureForwards()->bind();
|
||||
program.setUniform("ringTextureFwrd", ringTextureFwrdUnit);
|
||||
}
|
||||
|
||||
if (_ringsComponent->ringTextureBckwrd()) {
|
||||
if (_ringsComponent->textureBackwards()) {
|
||||
ringTextureBckwrdUnit.activate();
|
||||
_ringsComponent->ringTextureBckwrd()->bind();
|
||||
_ringsComponent->textureBackwards()->bind();
|
||||
program.setUniform("ringTextureBckwrd", ringTextureBckwrdUnit);
|
||||
}
|
||||
|
||||
if (_ringsComponent->ringTextureUnlit()) {
|
||||
if (_ringsComponent->textureUnlit()) {
|
||||
ringTextureUnlitUnit.activate();
|
||||
_ringsComponent->ringTextureUnlit()->bind();
|
||||
_ringsComponent->textureUnlit()->bind();
|
||||
program.setUniform("ringTextureUnlit", ringTextureUnlitUnit);
|
||||
}
|
||||
|
||||
if (_ringsComponent->ringTextureColor()) {
|
||||
if (_ringsComponent->textureColor()) {
|
||||
ringTextureColorUnit.activate();
|
||||
_ringsComponent->ringTextureColor()->bind();
|
||||
_ringsComponent->textureColor()->bind();
|
||||
program.setUniform("ringTextureColor", ringTextureColorUnit);
|
||||
}
|
||||
|
||||
if (_ringsComponent->ringTextureTransparency()) {
|
||||
if (_ringsComponent->textureTransparency()) {
|
||||
ringTextureTransparencyUnit.activate();
|
||||
_ringsComponent->ringTextureTransparency()->bind();
|
||||
_ringsComponent->textureTransparency()->bind();
|
||||
program.setUniform("ringTextureTransparency", ringTextureTransparencyUnit);
|
||||
}
|
||||
|
||||
@@ -1830,17 +1808,6 @@ void RenderableGlobe::setCommonUniforms(ghoul::opengl::ProgramObject& programObj
|
||||
programObject.setUniform("tileDelta", TileDelta);
|
||||
}
|
||||
|
||||
// Set sunPositionWorld and camPositionWorld uniforms for ring shadow calculations
|
||||
// Get Sun node position in world coordinates
|
||||
glm::dvec3 sunPositionWorld = glm::dvec3(0.0);
|
||||
SceneGraphNode* sunNode = sceneGraph()->sceneGraphNode("Sun");
|
||||
if (sunNode) {
|
||||
sunPositionWorld = sunNode->worldPosition();
|
||||
}
|
||||
// Camera position in world coordinates
|
||||
glm::dvec3 camPositionWorld = data.camera.positionVec3();
|
||||
programObject.setUniform("sunPositionWorld", glm::vec3(sunPositionWorld));
|
||||
programObject.setUniform("camPositionWorld", glm::vec3(camPositionWorld));
|
||||
programObject.setUniform("modelTransform", _cachedModelTransform);
|
||||
}
|
||||
|
||||
@@ -1895,7 +1862,7 @@ void RenderableGlobe::recompileShaders() {
|
||||
}
|
||||
|
||||
std::vector<std::pair<std::string, std::string>>& pairs =
|
||||
preprocessingData.keyValuePairs;
|
||||
preprocessingData.keyValuePairs;
|
||||
|
||||
const bool hasHeightLayer =
|
||||
!_layerManager.layerGroup(layers::Group::ID::HeightLayers).activeLayers().empty();
|
||||
@@ -1921,7 +1888,10 @@ void RenderableGlobe::recompileShaders() {
|
||||
pairs.emplace_back("defaultHeight", std::to_string(DefaultHeight));
|
||||
|
||||
// log if ring shadows are enabled
|
||||
LINFO(std::format("Ring shadows enabled: {}", _shadowMappingProperties.shadowMapping && _ringsComponent));
|
||||
LINFO(std::format(
|
||||
"Ring shadows enabled: {}",
|
||||
_shadowMappingProperties.shadowMapping && _ringsComponent
|
||||
));
|
||||
|
||||
//
|
||||
// Create dictionary from layerpreprocessing data
|
||||
|
||||
@@ -441,35 +441,35 @@ void RingsComponent::draw(const RenderData& data, RenderPass renderPass,
|
||||
ringTextureFwrdUnit.activate();
|
||||
_textureForwards->bind();
|
||||
_shader->setUniform(
|
||||
_uniformCacheAdvancedRings.ringTextureFwrd,
|
||||
_uniformCacheAdvancedRings.textureForwards,
|
||||
ringTextureFwrdUnit
|
||||
);
|
||||
|
||||
ringTextureBckwrdUnit.activate();
|
||||
_textureBackwards->bind();
|
||||
_shader->setUniform(
|
||||
_uniformCacheAdvancedRings.ringTextureBckwrd,
|
||||
_uniformCacheAdvancedRings.textureBackwards,
|
||||
ringTextureBckwrdUnit
|
||||
);
|
||||
|
||||
ringTextureUnlitUnit.activate();
|
||||
_textureUnlit->bind();
|
||||
_shader->setUniform(
|
||||
_uniformCacheAdvancedRings.ringTextureUnlit,
|
||||
_uniformCacheAdvancedRings.textureUnlit,
|
||||
ringTextureUnlitUnit
|
||||
);
|
||||
|
||||
ringTextureColorUnit.activate();
|
||||
_textureColor->bind();
|
||||
_shader->setUniform(
|
||||
_uniformCacheAdvancedRings.ringTextureColor,
|
||||
_uniformCacheAdvancedRings.textureColor,
|
||||
ringTextureColorUnit
|
||||
);
|
||||
|
||||
ringTextureTransparencyUnit.activate();
|
||||
_textureTransparency->bind();
|
||||
_shader->setUniform(
|
||||
_uniformCacheAdvancedRings.ringTextureTransparency,
|
||||
_uniformCacheAdvancedRings.textureTransparency,
|
||||
ringTextureTransparencyUnit
|
||||
);
|
||||
_shader->setUniform(_uniformCacheAdvancedRings.opacity, opacity());
|
||||
@@ -876,23 +876,23 @@ double RingsComponent::size() const {
|
||||
return _size;
|
||||
}
|
||||
|
||||
ghoul::opengl::Texture* RingsComponent::ringTextureFwrd() const {
|
||||
ghoul::opengl::Texture* RingsComponent::textureForwards() const {
|
||||
return _textureForwards.get();
|
||||
}
|
||||
|
||||
ghoul::opengl::Texture* RingsComponent::ringTextureBckwrd() const {
|
||||
ghoul::opengl::Texture* RingsComponent::textureBackwards() const {
|
||||
return _textureBackwards.get();
|
||||
}
|
||||
|
||||
ghoul::opengl::Texture* RingsComponent::ringTextureUnlit() const {
|
||||
ghoul::opengl::Texture* RingsComponent::textureUnlit() const {
|
||||
return _textureUnlit.get();
|
||||
}
|
||||
|
||||
ghoul::opengl::Texture* RingsComponent::ringTextureColor() const {
|
||||
ghoul::opengl::Texture* RingsComponent::textureColor() const {
|
||||
return _textureColor.get();
|
||||
}
|
||||
|
||||
ghoul::opengl::Texture* RingsComponent::ringTextureTransparency() const {
|
||||
ghoul::opengl::Texture* RingsComponent::textureTransparency() const {
|
||||
return _textureTransparency.get();
|
||||
}
|
||||
|
||||
|
||||
@@ -79,11 +79,11 @@ public:
|
||||
void onReadinessChange(ReadinessChangeCallback callback);
|
||||
|
||||
// Texture access methods for globe rendering
|
||||
ghoul::opengl::Texture* ringTextureFwrd() const;
|
||||
ghoul::opengl::Texture* ringTextureBckwrd() const;
|
||||
ghoul::opengl::Texture* ringTextureUnlit() const;
|
||||
ghoul::opengl::Texture* ringTextureColor() const;
|
||||
ghoul::opengl::Texture* ringTextureTransparency() const;
|
||||
ghoul::opengl::Texture* textureForwards() const;
|
||||
ghoul::opengl::Texture* textureBackwards() const;
|
||||
ghoul::opengl::Texture* textureUnlit() const;
|
||||
ghoul::opengl::Texture* textureColor() const;
|
||||
ghoul::opengl::Texture* textureTransparency() const;
|
||||
glm::vec2 textureOffset() const;
|
||||
glm::vec3 sunPositionObj() const;
|
||||
glm::vec3 camPositionObj() const;
|
||||
@@ -115,8 +115,8 @@ private:
|
||||
opacity
|
||||
) _uniformCache;
|
||||
UniformCache(modelViewProjectionMatrix, textureOffset, colorFilterValue, nightFactor,
|
||||
sunPosition, sunPositionObj, camPositionObj, ringTextureFwrd, ringTextureBckwrd,
|
||||
ringTextureUnlit, ringTextureColor, ringTextureTransparency, shadowMatrix,
|
||||
sunPosition, sunPositionObj, camPositionObj, textureForwards, textureBackwards,
|
||||
textureUnlit, textureColor, textureTransparency, shadowMatrix,
|
||||
shadowMapTexture, zFightingPercentage, opacity
|
||||
) _uniformCacheAdvancedRings;
|
||||
UniformCache(modelViewProjectionMatrix, textureOffset, ringTexture) _geomUniformCache;
|
||||
|
||||
Reference in New Issue
Block a user