summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMahmoud Badri <mahmoud.badri@qt.io>2019-04-24 16:27:40 +0300
committerMahmoud Badri <mahmoud.badri@qt.io>2019-05-02 07:15:45 +0000
commit6945d224433d731aaff1f83bf4d05ba812c8c36c (patch)
tree85fabc0db2ec0764bb1e26882f8ec56645589dc0
parent0e5bbcb7de19e3b32658089e20ddf05493442cda (diff)
Support alpha channel on color properties
Layer backgrounds are to use the alpha channel. This is also implemented in the editor (and RT1). Also update the VignetteEffect.effect to work correctly with the vec4 vegnette color and removed 3 duplicated test checks. Change-Id: I709629855f3172d65f359525e90cd5c91000f548 Reviewed-by: Miikka Heikkinen <miikka.heikkinen@qt.io> Reviewed-by: Tomi Korpipää <tomi.korpipaa@qt.io>
-rw-r--r--src/runtime/q3dspresentationcommon_p.h1
-rw-r--r--src/runtime/q3dsscenemanager.cpp4
-rw-r--r--src/runtime/q3dsuippresentation.cpp70
-rw-r--r--tests/auto/q3dslancelot/data/effects/effects/VignetteEffect.effect10
-rw-r--r--tests/auto/uipparser/tst_q3dsuipparser.cpp4
-rw-r--r--tests/scenes/effectgallery/VignetteEffect.effect10
6 files changed, 69 insertions, 30 deletions
diff --git a/src/runtime/q3dspresentationcommon_p.h b/src/runtime/q3dspresentationcommon_p.h
index 006563a..15c77e5 100644
--- a/src/runtime/q3dspresentationcommon_p.h
+++ b/src/runtime/q3dspresentationcommon_p.h
@@ -91,6 +91,7 @@ bool convertToInt32(const QStringRef &value, qint32 *v, const char *desc = nullp
bool convertToBool(const QStringRef &value, bool *v, const char *desc = nullptr, QXmlStreamReader *reader = nullptr);
bool convertToVector2D(const QStringRef &value, QVector2D *v, const char *desc = nullptr, QXmlStreamReader *reader = nullptr);
bool convertToVector3D(const QStringRef &value, QVector3D *v, const char *desc = nullptr, QXmlStreamReader *reader = nullptr);
+bool convertToVector4D(const QStringRef &value, QVector4D *v, const char *desc = nullptr, QXmlStreamReader *reader = nullptr);
bool convertToMatrix4x4(const QStringRef &value, QMatrix4x4 *v, const char *desc = nullptr, QXmlStreamReader *reader = nullptr);
int animatablePropertyTypeToMetaType(Q3DS::PropertyType type);
QVariant convertToVariant(const QString &value, Q3DS::PropertyType type);
diff --git a/src/runtime/q3dsscenemanager.cpp b/src/runtime/q3dsscenemanager.cpp
index 59269bc..928f2f8 100644
--- a/src/runtime/q3dsscenemanager.cpp
+++ b/src/runtime/q3dsscenemanager.cpp
@@ -4271,8 +4271,10 @@ void Q3DSSceneManager::rebuildCompositorLayerChain()
int layerDepth = 1;
for (Q3DSLayerNode *layer3DS : layers) {
BuildLayerQuadFlags flags = 0;
- if (layer3DS->layerBackground() == Q3DSLayerNode::Transparent)
+ if (layer3DS->layerBackground() == Q3DSLayerNode::Transparent
+ || layer3DS->layerBackground() == Q3DSLayerNode::SolidColor) {
flags |= LayerQuadBlend;
+ }
buildLayerQuadEntity(layer3DS, m_compositorParentEntity, tag, flags, layerDepth++);
m_compositorEntities.append(layer3DS->attached<Q3DSLayerAttached>()->compositorEntity);
diff --git a/src/runtime/q3dsuippresentation.cpp b/src/runtime/q3dsuippresentation.cpp
index 5ab3fd6..ec366a8 100644
--- a/src/runtime/q3dsuippresentation.cpp
+++ b/src/runtime/q3dsuippresentation.cpp
@@ -214,10 +214,12 @@ bool convertToFloat(const QStringRef &value, float *v, const char *desc, QXmlStr
bool convertToVector2D(const QStringRef &value, QVector2D *v, const char *desc, QXmlStreamReader *reader)
{
- QVector<QStringRef> floatStrings = value.split(' ', QString::SkipEmptyParts);
+ QVector<QStringRef> floatStrings = value.split(QLatin1Char(' '), QString::SkipEmptyParts);
if (floatStrings.count() != 2) {
- if (reader)
- reader->raiseError(QObject::tr("Invalid %1 \"%2\"").arg(QString::fromUtf8(desc)).arg(value.toString()));
+ if (reader) {
+ reader->raiseError(QObject::tr("Invalid %1 \"%2\"")
+ .arg(QString::fromUtf8(desc)).arg(value.toString()));
+ }
return false;
}
float x;
@@ -233,10 +235,12 @@ bool convertToVector2D(const QStringRef &value, QVector2D *v, const char *desc,
bool convertToVector3D(const QStringRef &value, QVector3D *v, const char *desc, QXmlStreamReader *reader)
{
- QVector<QStringRef> floatStrings = value.split(' ', QString::SkipEmptyParts);
+ QVector<QStringRef> floatStrings = value.split(QLatin1Char(' '), QString::SkipEmptyParts);
if (floatStrings.count() != 3) {
- if (reader)
- reader->raiseError(QObject::tr("Invalid %1 \"%2\"").arg(QString::fromUtf8(desc)).arg(value.toString()));
+ if (reader) {
+ reader->raiseError(QObject::tr("Invalid %1 \"%2\"")
+ .arg(QString::fromUtf8(desc)).arg(value.toString()));
+ }
return false;
}
float x;
@@ -254,6 +258,39 @@ bool convertToVector3D(const QStringRef &value, QVector3D *v, const char *desc,
return true;
}
+bool convertToVector4D(const QStringRef &value, QVector4D *v, const char *desc,
+ QXmlStreamReader *reader)
+{
+ QVector<QStringRef> floatStrings = value.split(QLatin1Char(' '), QString::SkipEmptyParts);
+ if (floatStrings.count() != 3 && floatStrings.count() != 4) {
+ if (reader) {
+ reader->raiseError(QObject::tr("Invalid %1 \"%2\"")
+ .arg(QString::fromUtf8(desc)).arg(value.toString()));
+ }
+ return false;
+ }
+
+ float x;
+ float y;
+ float z;
+ float w = 1;
+ if (!convertToFloat(floatStrings[0], &x, "Vector4D[x]", reader))
+ return false;
+ if (!convertToFloat(floatStrings[1], &y, "Vector4D[y]", reader))
+ return false;
+ if (!convertToFloat(floatStrings[2], &z, "Vector4D[z]", reader))
+ return false;
+ if (floatStrings.count() == 4 && !convertToFloat(floatStrings[3], &w, "Vector4D[w]", reader))
+ return false;
+
+ v->setX(x);
+ v->setY(y);
+ v->setZ(z);
+ v->setW(w);
+
+ return true;
+}
+
bool convertToMatrix4x4(const QStringRef &value, QMatrix4x4 *v, const char *desc, QXmlStreamReader *reader)
{
QVector<QStringRef> floatStrings = value.split(' ', QString::SkipEmptyParts);
@@ -345,13 +382,19 @@ QVariant convertToVariant(const QString &value, Q3DS::PropertyType type)
case Vector:
case Scale:
case Rotation:
- case Color:
{
QVector3D v;
if (convertToVector3D(&value, &v))
return v;
}
break;
+ case Color:
+ {
+ QVector4D v;
+ if (convertToVector4D(&value, &v))
+ return v;
+ }
+ break;
case Boolean:
{
bool v;
@@ -397,9 +440,10 @@ QString convertFromVariant(const QVariant &value)
case QVariant::Color:
{
const QColor c = value.value<QColor>();
- const QVector3D v = QVector3D(c.redF(), c.greenF(), c.blueF());
- return QString(QLatin1String("%1 %2 %3"))
- .arg(QString::number(v.x())).arg(QString::number(v.y())).arg(QString::number(v.z()));
+ const QVector4D v = QVector4D(c.redF(), c.greenF(), c.blueF(), c.alphaF());
+ return QString(QLatin1String("%1 %2 %3 %4"))
+ .arg(QString::number(v.x())).arg(QString::number(v.y()))
+ .arg(QString::number(v.z())).arg(QString::number(v.w()));
}
case QVariant::Bool:
return value.toBool() ? QLatin1String("true") : QLatin1String("false");
@@ -1081,10 +1125,10 @@ bool parseProperty(const V &attrs, Q3DSGraphObject::PropSetFlags flags, const QS
template<typename V>
bool parseProperty(const V &attrs, Q3DSGraphObject::PropSetFlags flags, const QString &typeName, const QString &propName, QColor *dst)
{
- QVector3D rgb;
- bool r = ::parseProperty<QVector3D>(attrs, flags, typeName, propName, Q3DS::Color, &rgb, [](const QStringRef &s, QVector3D *v) { return Q3DS::convertToVector3D(s, v); });
+ QVector4D rgba;
+ bool r = ::parseProperty<QVector4D>(attrs, flags, typeName, propName, Q3DS::Color, &rgba, [](const QStringRef &s, QVector4D *v) { return Q3DS::convertToVector4D(s, v); });
if (r)
- *dst = QColor::fromRgbF(rgb.x(), rgb.y(), rgb.z());
+ *dst = QColor::fromRgbF(rgba.x(), rgba.y(), rgba.z(), rgba.w());
return r;
}
diff --git a/tests/auto/q3dslancelot/data/effects/effects/VignetteEffect.effect b/tests/auto/q3dslancelot/data/effects/effects/VignetteEffect.effect
index a459120..ab649e1 100644
--- a/tests/auto/q3dslancelot/data/effects/effects/VignetteEffect.effect
+++ b/tests/auto/q3dslancelot/data/effects/effects/VignetteEffect.effect
@@ -15,20 +15,18 @@
void frag()
{
- float radius = vig_radius;
vec4 origColor = texture2D_0(TexCoord);
vec2 uv = TexCoord.xy;
vec2 center = vec2(0.5);
vec4 bg = origColor;
- uv *= 1.0 - uv.yx;
- float vig = uv.x*uv.y * vig_strenght;
+ uv *= 1.0 - uv.yx;
+ float vig = uv.x * uv.y * vig_strenght;
vig = pow(vig, vig_radius);
- vec4 vigmixcolor = vec4(vig_color,vig) * vec4(vig);
- gl_FragColor = vec4(mix(origColor,vigmixcolor,1.0-vig));
-
+ vec4 vigColor = vec4(vig_color.xyz, vig) * vig;
+ gl_FragColor = mix(origColor, vigColor, 1.0 - vig);
}
]]></FragmentShader>
</Shader>
diff --git a/tests/auto/uipparser/tst_q3dsuipparser.cpp b/tests/auto/uipparser/tst_q3dsuipparser.cpp
index b9e8a02..486c028 100644
--- a/tests/auto/uipparser/tst_q3dsuipparser.cpp
+++ b/tests/auto/uipparser/tst_q3dsuipparser.cpp
@@ -730,13 +730,11 @@ void tst_Q3DSUipParser::customMaterial()
Q3DSPropertyChangeList tilingChange = mat->applyDynamicProperties({{tilingKey, QVector3D(1, 2, 3)}});
QCOMPARE(tilingChange.cbegin()->nameStr(), tilingKey);
QCOMPARE(mat->dynamicProperties().value(tilingKey).value<QVector3D>(), QVector3D(1, 2, 3));
- QCOMPARE(mat->dynamicProperties().value(tilingKey).value<QVector3D>(), QVector3D(1, 2, 3));
// "dynamic" custom property setting
tilingChange = {Q3DSPropertyChange::fromVariant(tilingKey, QVector3D(4, 5, 6))};
mat->applyPropertyChanges({ tilingChange });
QCOMPARE(mat->dynamicProperties().value(tilingKey).value<QVector3D>(), QVector3D(4, 5, 6));
- QCOMPARE(mat->dynamicProperties().value(tilingKey).value<QVector3D>(), QVector3D(4, 5, 6));
}
void tst_Q3DSUipParser::effect()
@@ -759,13 +757,11 @@ void tst_Q3DSUipParser::effect()
Q3DSPropertyChangeList focusDistanceChange = e->applyDynamicProperties({{focusDistanceKey, 50.0f}});
QCOMPARE(focusDistanceChange.cbegin()->nameStr(), focusDistanceKey);
QCOMPARE(e->dynamicProperties().value(focusDistanceKey).toFloat(), 50.0f);
- QCOMPARE(e->dynamicProperties().value(focusDistanceKey).toFloat(), 50.0f);
// "dynamic" custom property setting
focusDistanceChange = {Q3DSPropertyChange::fromVariant(focusDistanceKey, 20.0f)};
e->applyPropertyChanges({ focusDistanceChange });
QCOMPARE(e->dynamicProperties().value(focusDistanceKey).toFloat(), 20.0f);
- QCOMPARE(e->dynamicProperties().value(focusDistanceKey).toFloat(), 20.0f);
}
void tst_Q3DSUipParser::primitiveMeshes()
diff --git a/tests/scenes/effectgallery/VignetteEffect.effect b/tests/scenes/effectgallery/VignetteEffect.effect
index a459120..ab649e1 100644
--- a/tests/scenes/effectgallery/VignetteEffect.effect
+++ b/tests/scenes/effectgallery/VignetteEffect.effect
@@ -15,20 +15,18 @@
void frag()
{
- float radius = vig_radius;
vec4 origColor = texture2D_0(TexCoord);
vec2 uv = TexCoord.xy;
vec2 center = vec2(0.5);
vec4 bg = origColor;
- uv *= 1.0 - uv.yx;
- float vig = uv.x*uv.y * vig_strenght;
+ uv *= 1.0 - uv.yx;
+ float vig = uv.x * uv.y * vig_strenght;
vig = pow(vig, vig_radius);
- vec4 vigmixcolor = vec4(vig_color,vig) * vec4(vig);
- gl_FragColor = vec4(mix(origColor,vigmixcolor,1.0-vig));
-
+ vec4 vigColor = vec4(vig_color.xyz, vig) * vig;
+ gl_FragColor = mix(origColor, vigColor, 1.0 - vig);
}
]]></FragmentShader>
</Shader>