summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTomi Korpipää <tomi.korpipaa@digia.com>2013-09-02 09:35:09 +0300
committerTomi Korpipää <tomi.korpipaa@digia.com>2013-09-02 09:37:59 +0300
commit5299755440a19ab7c2e4fd2bc6ac0f39a7ee319b (patch)
treec71fa96578388a2a54fc064e751c1cdcc458c2a2
parent15f8c86385a055d35b07519e4bf8c8f1aa915ea3 (diff)
Option for softer shadows added
+ fixed a shadow shader bug that caused a little bit of shadowing always Change-Id: Ia39ff5d92d2aca32e4f6c5a3bd6d68213564254a Reviewed-by: Miikka Heikkinen <miikka.heikkinen@digia.com>
-rw-r--r--examples/scatterchart/main.cpp3
-rw-r--r--examples/scatterchart/scatterchart.cpp29
-rw-r--r--examples/widget/chart.cpp29
-rw-r--r--examples/widget/main.cpp5
-rw-r--r--src/datavis3d/datavis3d.pro3
-rw-r--r--src/datavis3d/engine/bars3drenderer.cpp40
-rw-r--r--src/datavis3d/engine/bars3drenderer_p.h1
-rw-r--r--src/datavis3d/engine/scatter3drenderer.cpp41
-rw-r--r--src/datavis3d/engine/scatter3drenderer_p.h1
-rw-r--r--src/datavis3d/engine/shaders/shadow.frag2
-rw-r--r--src/datavis3d/engine/shaders/shadowNoTex.frag34
-rw-r--r--src/datavis3d/engine/shaders/shadowNoTexColorOnY.frag2
-rw-r--r--src/datavis3d/global/qdatavis3denums.h9
-rw-r--r--src/datavis3d/global/qtdatavis3denums.qdoc6
14 files changed, 121 insertions, 84 deletions
diff --git a/examples/scatterchart/main.cpp b/examples/scatterchart/main.cpp
index c94e1cd6..b0135ef3 100644
--- a/examples/scatterchart/main.cpp
+++ b/examples/scatterchart/main.cpp
@@ -111,6 +111,9 @@ int main(int argc, char **argv)
shadowQuality->addItem(QStringLiteral("Low"));
shadowQuality->addItem(QStringLiteral("Medium"));
shadowQuality->addItem(QStringLiteral("High"));
+ shadowQuality->addItem(QStringLiteral("Low Soft"));
+ shadowQuality->addItem(QStringLiteral("Medium Soft"));
+ shadowQuality->addItem(QStringLiteral("High Soft"));
shadowQuality->setCurrentIndex(3);
QFontComboBox *fontList = new QFontComboBox(widget);
diff --git a/examples/scatterchart/scatterchart.cpp b/examples/scatterchart/scatterchart.cpp
index 92b99652..aab230f2 100644
--- a/examples/scatterchart/scatterchart.cpp
+++ b/examples/scatterchart/scatterchart.cpp
@@ -160,20 +160,8 @@ void ScatterDataModifier::changeFontSize(int fontsize)
void ScatterDataModifier::shadowQualityUpdatedByVisual(QDataVis::ShadowQuality sq)
{
- int quality = 0;
- switch (sq) {
- case QDataVis::ShadowLow:
- quality = 1;
- break;
- case QDataVis::ShadowMedium:
- quality = 2;
- break;
- case QDataVis::ShadowHigh:
- quality = 3;
- break;
- }
-
- // Updates the UI component to show correct shadow quality
+ int quality = int(sq);
+ // Updates the UI component to show correct shadow quality
emit shadowQualityChanged(quality);
}
@@ -318,18 +306,7 @@ void ScatterDataModifier::handleSelectionChange(int index)
void ScatterDataModifier::changeShadowQuality(int quality)
{
- QDataVis::ShadowQuality sq = QDataVis::ShadowNone;
- switch (quality) {
- case 1:
- sq = QDataVis::ShadowLow;
- break;
- case 2:
- sq = QDataVis::ShadowMedium;
- break;
- case 3:
- sq = QDataVis::ShadowHigh;
- break;
- }
+ QDataVis::ShadowQuality sq = QDataVis::ShadowQuality(quality);
m_chart->setShadowQuality(sq);
emit shadowQualityChanged(quality);
}
diff --git a/examples/widget/chart.cpp b/examples/widget/chart.cpp
index 7468ec0d..106fd2d6 100644
--- a/examples/widget/chart.cpp
+++ b/examples/widget/chart.cpp
@@ -114,6 +114,8 @@ ChartModifier::ChartModifier(Q3DBars *barchart)
m_chart->addAxis(m_genericRowAxis);
m_chart->addAxis(m_genericColumnAxis);
+ m_chart->setShadowQuality(QDataVis::ShadowSoftMedium);
+
m_temperatureData->setItemLabelFormat(QStringLiteral("@valueTitle for @colLabel @rowLabel: @valueLabel"));
m_genericData->setItemLabelFormat(QStringLiteral("@valueTitle for (@rowIdx, @colIdx): @valueLabel"));
@@ -436,19 +438,7 @@ void ChartModifier::changeFontSize(int fontsize)
void ChartModifier::shadowQualityUpdatedByVisual(QDataVis::ShadowQuality sq)
{
- int quality = 0;
- switch (sq) {
- case QDataVis::ShadowLow:
- quality = 1;
- break;
- case QDataVis::ShadowMedium:
- quality = 2;
- break;
- case QDataVis::ShadowHigh:
- quality = 3;
- break;
- }
-
+ int quality = int(sq);
// Updates the UI component to show correct shadow quality
emit shadowQualityChanged(quality);
}
@@ -461,18 +451,7 @@ void ChartModifier::handleSelectionChange(const QPoint &position)
void ChartModifier::changeShadowQuality(int quality)
{
- QDataVis::ShadowQuality sq = QDataVis::ShadowNone;
- switch (quality) {
- case 1:
- sq = QDataVis::ShadowLow;
- break;
- case 2:
- sq = QDataVis::ShadowMedium;
- break;
- case 3:
- sq = QDataVis::ShadowHigh;
- break;
- }
+ QDataVis::ShadowQuality sq = QDataVis::ShadowQuality(quality);
m_chart->setShadowQuality(sq);
emit shadowQualityChanged(quality);
}
diff --git a/examples/widget/main.cpp b/examples/widget/main.cpp
index a774c0e8..98d2dbbd 100644
--- a/examples/widget/main.cpp
+++ b/examples/widget/main.cpp
@@ -181,7 +181,10 @@ int main(int argc, char **argv)
shadowQuality->addItem(QStringLiteral("Low"));
shadowQuality->addItem(QStringLiteral("Medium"));
shadowQuality->addItem(QStringLiteral("High"));
- shadowQuality->setCurrentIndex(2);
+ shadowQuality->addItem(QStringLiteral("Low Soft"));
+ shadowQuality->addItem(QStringLiteral("Medium Soft"));
+ shadowQuality->addItem(QStringLiteral("High Soft"));
+ shadowQuality->setCurrentIndex(5);
vLayout->addWidget(staticCheckBox, 0, Qt::AlignTop);
vLayout->addWidget(rotationCheckBox, 0, Qt::AlignTop);
diff --git a/src/datavis3d/datavis3d.pro b/src/datavis3d/datavis3d.pro
index 449ec14c..1f0118f0 100644
--- a/src/datavis3d/datavis3d.pro
+++ b/src/datavis3d/datavis3d.pro
@@ -27,5 +27,6 @@ wince* {
OTHER_FILES += doc/qtdatavis3d.qdocconf \
doc/src/* \
doc/images/* \
- doc/snippets/*
+ doc/snippets/* \
+ global/*.qdoc
diff --git a/src/datavis3d/engine/bars3drenderer.cpp b/src/datavis3d/engine/bars3drenderer.cpp
index ee28c58b..133b47f2 100644
--- a/src/datavis3d/engine/bars3drenderer.cpp
+++ b/src/datavis3d/engine/bars3drenderer.cpp
@@ -72,7 +72,8 @@ Bars3DRenderer::Bars3DRenderer(Bars3DController *controller)
m_depthFrameBuffer(0),
m_selectionFrameBuffer(0),
m_selectionDepthBuffer(0),
- m_shadowQualityToShader(33.3f),
+ m_shadowQualityToShader(100.0f),
+ m_shadowQualityMultiplier(3),
m_heightNormalizer(1.0f),
m_yAdjustment(0.0f),
m_rowWidth(0),
@@ -475,8 +476,8 @@ void Bars3DRenderer::drawScene(CameraHelper *camera,
// Set viewport for depth map rendering. Must match texture size. Larger values give smoother shadows.
glViewport(m_mainViewPort.x(), m_mainViewPort.y(),
- m_mainViewPort.width() * m_cachedShadowQuality,
- m_mainViewPort.height() * m_cachedShadowQuality);
+ m_mainViewPort.width() * m_shadowQualityMultiplier,
+ m_mainViewPort.height() * m_shadowQualityMultiplier);
// Get the depth view matrix
// It may be possible to hack lightPos here if we want to make some tweaks to shadow
@@ -1522,15 +1523,31 @@ void Bars3DRenderer::updateShadowQuality(QDataVis::ShadowQuality quality)
switch (quality) {
case QDataVis::ShadowLow:
m_shadowQualityToShader = 33.3f;
+ m_shadowQualityMultiplier = 1;
break;
case QDataVis::ShadowMedium:
m_shadowQualityToShader = 100.0f;
+ m_shadowQualityMultiplier = 3;
break;
case QDataVis::ShadowHigh:
m_shadowQualityToShader = 200.0f;
+ m_shadowQualityMultiplier = 5;
+ break;
+ case QDataVis::ShadowSoftLow:
+ m_shadowQualityToShader = 5.0f;
+ m_shadowQualityMultiplier = 1;
+ break;
+ case QDataVis::ShadowSoftMedium:
+ m_shadowQualityToShader = 10.0f;
+ m_shadowQualityMultiplier = 3;
+ break;
+ case QDataVis::ShadowSoftHigh:
+ m_shadowQualityToShader = 15.0f;
+ m_shadowQualityMultiplier = 4;
break;
default:
m_shadowQualityToShader = 0.0f;
+ m_shadowQualityMultiplier = 1;
break;
}
@@ -1724,7 +1741,7 @@ void Bars3DRenderer::updateDepthBuffer()
if (m_cachedShadowQuality > QDataVis::ShadowNone) {
m_depthTexture = m_textureHelper->createDepthTexture(m_mainViewPort.size(),
m_depthFrameBuffer,
- m_cachedShadowQuality);
+ m_shadowQualityMultiplier);
if (!m_depthTexture) {
switch (m_cachedShadowQuality) {
case QDataVis::ShadowHigh:
@@ -1742,6 +1759,21 @@ void Bars3DRenderer::updateDepthBuffer()
(void)m_controller->setShadowQuality(QDataVis::ShadowNone);
updateShadowQuality(QDataVis::ShadowNone);
break;
+ case QDataVis::ShadowSoftHigh:
+ qWarning("Creating soft high quality shadows failed. Changing to soft medium quality.");
+ (void)m_controller->setShadowQuality(QDataVis::ShadowSoftMedium);
+ updateShadowQuality(QDataVis::ShadowSoftMedium);
+ break;
+ case QDataVis::ShadowSoftMedium:
+ qWarning("Creating soft medium quality shadows failed. Changing to soft low quality.");
+ (void)m_controller->setShadowQuality(QDataVis::ShadowSoftLow);
+ updateShadowQuality(QDataVis::ShadowSoftLow);
+ break;
+ case QDataVis::ShadowSoftLow:
+ qWarning("Creating soft low quality shadows failed. Switching shadows off.");
+ (void)m_controller->setShadowQuality(QDataVis::ShadowNone);
+ updateShadowQuality(QDataVis::ShadowNone);
+ break;
default:
// You'll never get here
break;
diff --git a/src/datavis3d/engine/bars3drenderer_p.h b/src/datavis3d/engine/bars3drenderer_p.h
index d57a4e27..cbfaa403 100644
--- a/src/datavis3d/engine/bars3drenderer_p.h
+++ b/src/datavis3d/engine/bars3drenderer_p.h
@@ -88,6 +88,7 @@ private:
GLuint m_selectionFrameBuffer;
GLuint m_selectionDepthBuffer;
GLfloat m_shadowQualityToShader;
+ GLint m_shadowQualityMultiplier;
GLfloat m_heightNormalizer;
GLfloat m_yAdjustment;
GLfloat m_rowWidth;
diff --git a/src/datavis3d/engine/scatter3drenderer.cpp b/src/datavis3d/engine/scatter3drenderer.cpp
index bee1ee5c..8f28e050 100644
--- a/src/datavis3d/engine/scatter3drenderer.cpp
+++ b/src/datavis3d/engine/scatter3drenderer.cpp
@@ -71,7 +71,8 @@ Scatter3DRenderer::Scatter3DRenderer(Scatter3DController *controller)
m_depthFrameBuffer(0),
m_selectionFrameBuffer(0),
m_selectionDepthBuffer(0),
- m_shadowQualityToShader(33.3f),
+ m_shadowQualityToShader(100.0f),
+ m_shadowQualityMultiplier(3),
m_heightNormalizer(1.0f),
m_scaleFactor(0),
m_selection(selectionSkipColor),
@@ -294,8 +295,8 @@ void Scatter3DRenderer::drawScene(CameraHelper *camera,
// Set viewport for depth map rendering. Must match texture size. Larger values give smoother shadows.
glViewport(m_mainViewPort.x(), m_mainViewPort.y(),
- m_mainViewPort.width() * m_cachedShadowQuality,
- m_mainViewPort.height() * m_cachedShadowQuality);
+ m_mainViewPort.width() * m_shadowQualityMultiplier,
+ m_mainViewPort.height() * m_shadowQualityMultiplier);
// Enable drawing to framebuffer
glBindFramebuffer(GL_FRAMEBUFFER, m_depthFrameBuffer);
@@ -1403,20 +1404,35 @@ void Scatter3DRenderer::updateBackgroundEnabled(bool enable)
void Scatter3DRenderer::updateShadowQuality(QDataVis::ShadowQuality quality)
{
- qDebug() << __FUNCTION__ << quality;
m_cachedShadowQuality = quality;
switch (quality) {
case QDataVis::ShadowLow:
m_shadowQualityToShader = 33.3f;
+ m_shadowQualityMultiplier = 1;
break;
case QDataVis::ShadowMedium:
m_shadowQualityToShader = 100.0f;
+ m_shadowQualityMultiplier = 3;
break;
case QDataVis::ShadowHigh:
m_shadowQualityToShader = 200.0f;
+ m_shadowQualityMultiplier = 5;
+ break;
+ case QDataVis::ShadowSoftLow:
+ m_shadowQualityToShader = 5.0f;
+ m_shadowQualityMultiplier = 1;
+ break;
+ case QDataVis::ShadowSoftMedium:
+ m_shadowQualityToShader = 10.0f;
+ m_shadowQualityMultiplier = 3;
+ break;
+ case QDataVis::ShadowSoftHigh:
+ m_shadowQualityToShader = 15.0f;
+ m_shadowQualityMultiplier = 4;
break;
default:
m_shadowQualityToShader = 0.0f;
+ m_shadowQualityMultiplier = 1;
break;
}
@@ -1560,7 +1576,7 @@ void Scatter3DRenderer::updateDepthBuffer()
if (m_cachedShadowQuality > QDataVis::ShadowNone) {
m_depthTexture = m_textureHelper->createDepthTexture(m_mainViewPort.size(),
m_depthFrameBuffer,
- m_cachedShadowQuality);
+ m_shadowQualityMultiplier);
if (!m_depthTexture) {
switch (m_cachedShadowQuality) {
case QDataVis::ShadowHigh:
@@ -1578,6 +1594,21 @@ void Scatter3DRenderer::updateDepthBuffer()
(void)m_controller->setShadowQuality(QDataVis::ShadowNone);
updateShadowQuality(QDataVis::ShadowNone);
break;
+ case QDataVis::ShadowSoftHigh:
+ qWarning("Creating soft high quality shadows failed. Changing to soft medium quality.");
+ (void)m_controller->setShadowQuality(QDataVis::ShadowSoftMedium);
+ updateShadowQuality(QDataVis::ShadowSoftMedium);
+ break;
+ case QDataVis::ShadowSoftMedium:
+ qWarning("Creating soft medium quality shadows failed. Changing to soft low quality.");
+ (void)m_controller->setShadowQuality(QDataVis::ShadowSoftLow);
+ updateShadowQuality(QDataVis::ShadowSoftLow);
+ break;
+ case QDataVis::ShadowSoftLow:
+ qWarning("Creating soft low quality shadows failed. Switching shadows off.");
+ (void)m_controller->setShadowQuality(QDataVis::ShadowNone);
+ updateShadowQuality(QDataVis::ShadowNone);
+ break;
default:
// You'll never get here
break;
diff --git a/src/datavis3d/engine/scatter3drenderer_p.h b/src/datavis3d/engine/scatter3drenderer_p.h
index 12fa7a04..50518a27 100644
--- a/src/datavis3d/engine/scatter3drenderer_p.h
+++ b/src/datavis3d/engine/scatter3drenderer_p.h
@@ -81,6 +81,7 @@ private:
GLuint m_selectionFrameBuffer;
GLuint m_selectionDepthBuffer;
GLfloat m_shadowQualityToShader;
+ GLint m_shadowQualityMultiplier;
GLfloat m_heightNormalizer;
GLfloat m_scaleFactor;
QVector3D m_selection;
diff --git a/src/datavis3d/engine/shaders/shadow.frag b/src/datavis3d/engine/shaders/shadow.frag
index c299e25c..5309b5bb 100644
--- a/src/datavis3d/engine/shaders/shadow.frag
+++ b/src/datavis3d/engine/shaders/shadow.frag
@@ -58,7 +58,7 @@ void main() {
// direct method; needs large shadow texture to look good
//highp float visibility = 0.75 * shadow2DProj(shadowMap, shadCoords).r + 0.25;
// poisson disk sampling; smoothes edges
- highp float visibility = 0.4;
+ highp float visibility = 0.6;
for (int i = 0; i < 15; i++) {
vec4 shadCoordsPD = shadCoords;
shadCoordsPD.x += cos(poissonDisk[i].x) / shadowQuality;
diff --git a/src/datavis3d/engine/shaders/shadowNoTex.frag b/src/datavis3d/engine/shaders/shadowNoTex.frag
index b63075de..9ee20864 100644
--- a/src/datavis3d/engine/shaders/shadowNoTex.frag
+++ b/src/datavis3d/engine/shaders/shadowNoTex.frag
@@ -30,22 +30,22 @@ highp vec2 poissonDisk[16] = vec2[16](vec2(-0.94201624, -0.39906216),
vec2(0.19984126, 0.78641367),
vec2(0.14383161, -0.14100790));
-/*const highp vec2 poissonDisk[16] = vec2[](vec2(-0.25, -0.25),
- vec2(0.25, -0.25),
- vec2(-0.25, 0.25),
- vec2(0.25, 0.25),
- vec2(-0.5, -0.5),
- vec2(0.5, -0.5),
- vec2(-0.5, 0.5),
- vec2(0.5, 0.5),
- vec2(-0.75, -0.75),
- vec2(0.75, -0.75),
- vec2(-0.75, 0.75),
- vec2(0.75, 0.75),
- vec2(-1.0, -1.0),
- vec2(1.0, -1.0),
- vec2(-1.0, 1.0),
- vec2(1.0, 1.0));*/
+/*highp vec2 poissonDisk[16] = vec2[16](vec2(-0.25, -0.25),
+ vec2(0.25, -0.25),
+ vec2(-0.25, 0.25),
+ vec2(0.25, 0.25),
+ vec2(-0.5, -0.5),
+ vec2(0.5, -0.5),
+ vec2(-0.5, 0.5),
+ vec2(0.5, 0.5),
+ vec2(-0.75, -0.75),
+ vec2(0.75, -0.75),
+ vec2(-0.75, 0.75),
+ vec2(0.75, 0.75),
+ vec2(-1.0, -1.0),
+ vec2(1.0, -1.0),
+ vec2(-1.0, 1.0),
+ vec2(1.0, 1.0));*/
/*float random(vec3 seed, int i) {
vec4 seed4 = vec4(seed, i);
@@ -75,7 +75,7 @@ void main() {
// direct method; needs large shadow texture to look good
//highp float visibility = 0.75 * shadow2DProj(shadowMap, shadCoords).r + 0.25;
// poisson disk sampling; smoothes edges
- highp float visibility = 0.4;
+ highp float visibility = 0.6;
for (int i = 0; i < 15; i++) {
vec4 shadCoordsPD = shadCoords;
shadCoordsPD.x += cos(poissonDisk[i].x) / shadowQuality;
diff --git a/src/datavis3d/engine/shaders/shadowNoTexColorOnY.frag b/src/datavis3d/engine/shaders/shadowNoTexColorOnY.frag
index cea83786..957d2b0b 100644
--- a/src/datavis3d/engine/shaders/shadowNoTexColorOnY.frag
+++ b/src/datavis3d/engine/shaders/shadowNoTexColorOnY.frag
@@ -58,7 +58,7 @@ void main() {
// direct method; needs large shadow texture to look good
//highp float visibility = 0.75 * shadow2DProj(shadowMap, shadCoords).r + 0.25;
// poisson disk sampling; smoothes edges
- highp float visibility = 0.4;
+ highp float visibility = 0.6;
for (int i = 0; i < 15; i++) {
vec4 shadCoordsPD = shadCoords;
shadCoordsPD.x += cos(poissonDisk[i].x) / shadowQuality;
diff --git a/src/datavis3d/global/qdatavis3denums.h b/src/datavis3d/global/qdatavis3denums.h
index e337430e..a8f6d6a2 100644
--- a/src/datavis3d/global/qdatavis3denums.h
+++ b/src/datavis3d/global/qdatavis3denums.h
@@ -107,9 +107,12 @@ public:
enum ShadowQuality {
ShadowNone = 0,
- ShadowLow = 1,
- ShadowMedium = 3,
- ShadowHigh = 5
+ ShadowLow,
+ ShadowMedium,
+ ShadowHigh,
+ ShadowSoftLow,
+ ShadowSoftMedium,
+ ShadowSoftHigh
};
enum LabelTransparency {
diff --git a/src/datavis3d/global/qtdatavis3denums.qdoc b/src/datavis3d/global/qtdatavis3denums.qdoc
index c9d6c03f..015b1803 100644
--- a/src/datavis3d/global/qtdatavis3denums.qdoc
+++ b/src/datavis3d/global/qtdatavis3denums.qdoc
@@ -154,6 +154,12 @@
Shadows are rendered in medium quality.
\value ShadowHigh
Shadows are rendered in high quality.
+ \value ShadowSoftLow
+ Shadows are rendered in low quality with softened edges.
+ \value ShadowSoftMedium
+ Shadows are rendered in medium quality with softened edges.
+ \value ShadowSoftHigh
+ Shadows are rendered in high quality with softened edges.
*/
/*!