From 8c9c03d6134eb2221145b2dffc980a7654aa2c95 Mon Sep 17 00:00:00 2001 From: Pasi Keranen <pasi.keranen@digia.com> Date: Tue, 14 Oct 2014 10:20:16 +0300 Subject: [PATCH] Refactored QQmlPropertyMap to be the baseclass. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit All JavaScript visible objects are now based on QQmlPropertyMap so that libraries and other users can add dynamic properties to the objects like they do in many cases. Also fixed textured cube example to respect devicePixelRatio. Change-Id: I71a8d8e32e2d856dc1c97f498c9a34b3858ab6a9 Reviewed-by: Tomi Korpipää <tomi.korpipaa@digia.com> Reviewed-by: Pasi Keränen <pasi.keranen@digia.com> --- .../qml/texturedcube/texturedcube.js | 4 +++- src/abstractobject3d.cpp | 19 +++++---------- src/abstractobject3d_p.h | 13 +++------- src/activeinfo3d.cpp | 8 +++---- src/activeinfo3d_p.h | 22 ++++++++--------- src/buffer3d.cpp | 2 +- src/canvas3d.cpp | 24 ------------------- src/canvas3d_p.h | 4 ---- src/context3d.cpp | 8 +++---- src/context3d_p.h | 3 ++- src/contextattributes.cpp | 2 +- src/contextattributes_p.h | 4 +++- src/float32array.cpp | 2 +- src/framebuffer3d.cpp | 2 +- src/program3d.cpp | 2 +- src/renderbuffer3d.cpp | 2 +- src/renderbuffer3d_p.h | 4 +++- src/shader3d.cpp | 2 +- src/shader3d_p.h | 3 ++- src/shaderprecisionformat.cpp | 2 +- src/shaderprecisionformat_p.h | 4 +++- src/teximage3d.cpp | 2 +- src/teximage3dloader.cpp | 2 +- src/teximage3dloader_p.h | 3 ++- src/texture3d.cpp | 2 +- src/typedarray.cpp | 2 +- src/uniformlocation.cpp | 2 +- 27 files changed, 59 insertions(+), 90 deletions(-) diff --git a/examples/canvas3d/texturedcube/qml/texturedcube/texturedcube.js b/examples/canvas3d/texturedcube/qml/texturedcube/texturedcube.js index 6df51a8..559f865 100644 --- a/examples/canvas3d/texturedcube/qml/texturedcube/texturedcube.js +++ b/examples/canvas3d/texturedcube/qml/texturedcube/texturedcube.js @@ -45,7 +45,8 @@ function initGL(canvas, textureLoader) { gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, true); // Set the viewport - gl.viewport(0, 0, canvas.width, canvas.height); + var pixelRatio = canvas.devicePixelRatio; + gl.viewport(0, 0, pixelRatio * canvas.width, pixelRatio * canvas.height); // Initialize the shader program initShaders(); @@ -114,6 +115,7 @@ function renderGL(canvas) { mat4.rotate(mvMatrix, mvMatrix, degToRad(canvas.xRotAnim), [1, 0, 0]); mat4.rotate(mvMatrix, mvMatrix, degToRad(canvas.yRotAnim), [0, 1, 0]); mat4.rotate(mvMatrix, mvMatrix, degToRad(canvas.zRotAnim), [0, 0, 1]); + // Set the matrix to shader gl.uniformMatrix4fva(mvMatrixUniform, false, mvMatrix); diff --git a/src/abstractobject3d.cpp b/src/abstractobject3d.cpp index abf3dda..0f432d2 100644 --- a/src/abstractobject3d.cpp +++ b/src/abstractobject3d.cpp @@ -37,26 +37,19 @@ #include "abstractobject3d_p.h" CanvasAbstractObject::CanvasAbstractObject(QObject *parent) : - QObject(parent) + QQmlPropertyMap(parent) { - m_name = QString("0x%1").arg((long long) this, 0, 16); + insert("name", QVariant::fromValue(QString("0x%1").arg((long long) this, 0, 16))); } CanvasAbstractObject::~CanvasAbstractObject() { } -void CanvasAbstractObject::setName(const QString &name) +QString CanvasAbstractObject::name() const { - if (m_name == name) - return; + if (!contains("name")) + return ""; - m_name = name; - - emit nameChanged(m_name); -} - -const QString &CanvasAbstractObject::name() -{ - return m_name; + return value("name").toString(); } diff --git a/src/abstractobject3d_p.h b/src/abstractobject3d_p.h index 05cde24..c223b54 100644 --- a/src/abstractobject3d_p.h +++ b/src/abstractobject3d_p.h @@ -48,25 +48,18 @@ #define ABSTRACTOBJECT3D_P_H #include <QObject> +#include <QQmlPropertyMap> #include <QThread> -class CanvasAbstractObject : public QObject +class CanvasAbstractObject : public QQmlPropertyMap { Q_OBJECT - Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged) public: explicit CanvasAbstractObject(QObject *parent = 0); virtual ~CanvasAbstractObject(); - void setName(const QString &name); - const QString &name(); - -signals: - void nameChanged(const QString &name); - -protected: - QString m_name; + QString name() const; }; #endif // ABSTRACTOBJECT3D_P_H diff --git a/src/activeinfo3d.cpp b/src/activeinfo3d.cpp index be76580..6df460c 100644 --- a/src/activeinfo3d.cpp +++ b/src/activeinfo3d.cpp @@ -52,7 +52,7 @@ CanvasActiveInfo::CanvasActiveInfo(int size, CanvasContext::glEnums type, QString name, QObject *parent) : - QObject(parent), + CanvasAbstractObject(parent), m_size(size), m_type(type), m_name(name) @@ -66,7 +66,7 @@ CanvasActiveInfo::CanvasActiveInfo(int size, CanvasContext::glEnums type, /*! * \internal */ -int CanvasActiveInfo::size() const +int CanvasActiveInfo::infoSize() const { return m_size; } @@ -78,7 +78,7 @@ int CanvasActiveInfo::size() const /*! * \internal */ -CanvasContext::glEnums CanvasActiveInfo::type() const +CanvasContext::glEnums CanvasActiveInfo::infoType() const { return m_type; } @@ -90,7 +90,7 @@ CanvasContext::glEnums CanvasActiveInfo::type() const /*! * \internal */ -QString CanvasActiveInfo::name() const +QString CanvasActiveInfo::infoName() const { return m_name; } diff --git a/src/activeinfo3d_p.h b/src/activeinfo3d_p.h index 40cd1ed..13a1ba2 100644 --- a/src/activeinfo3d_p.h +++ b/src/activeinfo3d_p.h @@ -47,29 +47,29 @@ #ifndef CANVASACTIVEINFO_P_H #define CANVASACTIVEINFO_P_H -#include <QObject> +#include "abstractobject3d_p.h" #include "context3d_p.h" -class CanvasActiveInfo : public QObject +class CanvasActiveInfo : public CanvasAbstractObject { Q_OBJECT - Q_PROPERTY(int size READ size NOTIFY sizeChanged) - Q_PROPERTY(CanvasContext::glEnums type READ type NOTIFY typeChanged) - Q_PROPERTY(QString name READ name NOTIFY nameChanged) + Q_PROPERTY(int size READ infoSize NOTIFY infoSizeChanged) + Q_PROPERTY(CanvasContext::glEnums type READ infoType NOTIFY infoTypeChanged) + Q_PROPERTY(QString name READ infoName NOTIFY infoNameChanged) public: explicit CanvasActiveInfo(int size, CanvasContext::glEnums type, QString name, QObject *parent = 0); - int size() const; - CanvasContext::glEnums type() const; - QString name() const; + int infoSize() const; + CanvasContext::glEnums infoType() const; + QString infoName() const; signals: - void sizeChanged(int size); - void typeChanged(CanvasContext::glEnums type); - void nameChanged(QString &name); + void infoSizeChanged(int size); + void infoTypeChanged(CanvasContext::glEnums type); + void infoNameChanged(QString &name); private: int m_size; diff --git a/src/buffer3d.cpp b/src/buffer3d.cpp index 1f5992f..2d0e2d9 100644 --- a/src/buffer3d.cpp +++ b/src/buffer3d.cpp @@ -134,7 +134,7 @@ GLuint CanvasBuffer::id() QDebug operator<<(QDebug dbg, const CanvasBuffer *buffer) { if (buffer) - dbg.nospace() << "Buffer3D("<< buffer->m_name <<", id:" << buffer->m_bufferId << ")"; + dbg.nospace() << "Buffer3D("<< buffer->name() <<", id:" << buffer->m_bufferId << ")"; else dbg.nospace() << "Buffer3D("<< ((void*) buffer) <<")"; return dbg.maybeSpace(); diff --git a/src/canvas3d.cpp b/src/canvas3d.cpp index ff1608a..72128ef 100644 --- a/src/canvas3d.cpp +++ b/src/canvas3d.cpp @@ -93,7 +93,6 @@ Canvas::Canvas(QQuickItem *parent): m_maxSamples(4), #endif m_samples(0), - m_isAnimated(false), m_devicePixelRatio(1.0f), m_imageLoader(0), m_isContextAttribsSet(false), @@ -474,29 +473,6 @@ void Canvas::setImageLoader(CanvasTextureImageLoader *loader) emit imageLoaderChanged(loader); } -/*! - \qmlproperty bool Canvas3D::animated - Specifies whether the Canvas3D continuously emits the renderGL signal to render new - frames or not. In most cases this property should be set to true as the 3D content is - dynamic. - \note Currenly not used. - */ -void Canvas::setAnimated(bool animated) -{ - if (m_logAllCalls) qDebug() << "Canvas3D::" << __FUNCTION__; - if (animated != m_isAnimated) { - m_isAnimated = animated; - emit animatedChanged(animated); - emit needRender(); - } -} - -bool Canvas::isAnimated() -{ - if (m_logAllCalls) qDebug() << "Canvas3D::" << __FUNCTION__; - return m_isAnimated; -} - /*! * \internal */ diff --git a/src/canvas3d_p.h b/src/canvas3d_p.h index 8c7479f..ef9c4e3 100644 --- a/src/canvas3d_p.h +++ b/src/canvas3d_p.h @@ -62,7 +62,6 @@ class QT_CANVAS3D_EXPORT Canvas : public QQuickItem, QOpenGLFunctions Q_DISABLE_COPY(Canvas) Q_INTERFACES(QQmlParserStatus) Q_PROPERTY(CanvasContext *context READ context NOTIFY contextChanged) - Q_PROPERTY(bool animated READ isAnimated WRITE setAnimated NOTIFY animatedChanged) Q_PROPERTY(bool logAllCalls READ logAllCalls WRITE setLogAllCalls NOTIFY logAllCallsChanged) Q_PROPERTY(bool logAllErrors READ logAllErrors WRITE setLogAllErrors NOTIFY logAllErrorsChanged) Q_PROPERTY(float devicePixelRatio READ devicePixelRatio NOTIFY devicePixelRatioChanged) @@ -74,8 +73,6 @@ public: void handleWindowChanged(QQuickWindow *win); float devicePixelRatio(); - void setAnimated(bool animated); - bool isAnimated(); void setLogAllCalls(bool logCalls); bool logAllCalls() const; @@ -135,7 +132,6 @@ private: int m_maxSamples; int m_samples; - bool m_isAnimated; float m_devicePixelRatio; CanvasTextureImageLoader *m_imageLoader; diff --git a/src/context3d.cpp b/src/context3d.cpp index 6889c28..1e76310 100644 --- a/src/context3d.cpp +++ b/src/context3d.cpp @@ -77,7 +77,7 @@ // Owned by the SG Render Thread! CanvasContext::CanvasContext(QOpenGLContext *context, int width, int height, QObject *parent) : - QObject(parent), + CanvasAbstractObject(parent), QOpenGLFunctions(context), m_unpackFlipYEnabled(false), m_logAllCalls(false), @@ -3159,7 +3159,7 @@ CanvasUniformLocation *CanvasContext::getUniformLocation(CanvasProgram *program, } CanvasUniformLocation *location = new CanvasUniformLocation(index, this); - location->setName(name); + location->insert("name", name); if (m_logAllCalls) qDebug() << "Context3D::" << __FUNCTION__ << "(program:" << program << ", name:" << name @@ -4930,9 +4930,9 @@ QVariant CanvasContext::getUniform(CanvasProgram *program, CanvasUniformLocation CanvasActiveInfo *info = getActiveUniform(program, locationId); int numValues = 4; - qDebug() << "Context3D::" << __FUNCTION__ << "info->type():" << glEnumToString(info->type()); + qDebug() << "Context3D::" << __FUNCTION__ << "info->type():" << glEnumToString(info->infoType()); - switch (info->type()) { + switch (info->infoType()) { case SAMPLER_2D: // Intentional flow through case SAMPLER_CUBE: diff --git a/src/context3d_p.h b/src/context3d_p.h index 19a45c5..20477cf 100644 --- a/src/context3d_p.h +++ b/src/context3d_p.h @@ -49,6 +49,7 @@ #include "canvas3dcommon_p.h" #include "contextattributes_p.h" +#include "abstractobject3d_p.h" #include <QtGui/QOpenGLFunctions> #include <QString> @@ -83,7 +84,7 @@ class CanvasTypedArray; class CanvasShaderPrecisionFormat; class EnumToStringMap; -class QT_CANVAS3D_EXPORT CanvasContext : public QObject, protected QOpenGLFunctions +class QT_CANVAS3D_EXPORT CanvasContext : public CanvasAbstractObject, protected QOpenGLFunctions { Q_OBJECT Q_DISABLE_COPY(CanvasContext) diff --git a/src/contextattributes.cpp b/src/contextattributes.cpp index 9f39983..a6a11e0 100644 --- a/src/contextattributes.cpp +++ b/src/contextattributes.cpp @@ -57,7 +57,7 @@ * \internal */ CanvasContextAttributes::CanvasContextAttributes(QObject *parent) : - QObject(parent), + CanvasAbstractObject(parent), m_alpha(false), // Should be true according to official WebGL spec. But ignored for now. m_depth(false), m_stencil(false), diff --git a/src/contextattributes_p.h b/src/contextattributes_p.h index 7abc012..df1a8df 100644 --- a/src/contextattributes_p.h +++ b/src/contextattributes_p.h @@ -47,9 +47,11 @@ #ifndef CONTEXTATTRIBUTES_P_H #define CONTEXTATTRIBUTES_P_H +#include "abstractobject3d_p.h" + #include <QObject> -class CanvasContextAttributes : public QObject +class CanvasContextAttributes : public CanvasAbstractObject { Q_OBJECT diff --git a/src/float32array.cpp b/src/float32array.cpp index 314ed66..b9de1e7 100644 --- a/src/float32array.cpp +++ b/src/float32array.cpp @@ -252,7 +252,7 @@ TypedArray *Float32Array::subarray(long begin, long end) QDebug operator<<(QDebug dbg, const CanvasFloat32Array *array) { if (array) - dbg.nospace() << "Float32Array ("<< array->m_name <<", length:" << array->length() << ")"; + dbg.nospace() << "Float32Array ("<< array->name() <<", length:" << array->length() << ")"; else dbg.nospace() << "Float32Array (null)"; return dbg.maybeSpace(); diff --git a/src/framebuffer3d.cpp b/src/framebuffer3d.cpp index 50dee95..aa64300 100644 --- a/src/framebuffer3d.cpp +++ b/src/framebuffer3d.cpp @@ -98,7 +98,7 @@ GLuint CanvasFrameBuffer::id() QDebug operator<<(QDebug dbg, const CanvasFrameBuffer *buffer) { if (buffer) - dbg.nospace() << "FrameBuffer3D("<< buffer->m_name <<", id:" << buffer->m_framebufferId << ")"; + dbg.nospace() << "FrameBuffer3D("<< buffer->name() <<", id:" << buffer->m_framebufferId << ")"; else dbg.nospace() << "FrameBuffer3D("<< ((void*) buffer) <<")"; return dbg.maybeSpace(); diff --git a/src/program3d.cpp b/src/program3d.cpp index 275a7c1..cd3ff02 100644 --- a/src/program3d.cpp +++ b/src/program3d.cpp @@ -216,7 +216,7 @@ QString CanvasProgram::log() QDebug operator<<(QDebug dbg, const CanvasProgram *program) { if (program) - dbg.nospace() << "Program3D("<< program->m_name << ", id:" << program->m_program->programId() << ")"; + dbg.nospace() << "Program3D("<< program->name() << ", id:" << program->m_program->programId() << ")"; else dbg.nospace() << "Program3D("<< ((void*) program) <<")"; return dbg.maybeSpace(); diff --git a/src/renderbuffer3d.cpp b/src/renderbuffer3d.cpp index 8f8b1ee..067df6c 100644 --- a/src/renderbuffer3d.cpp +++ b/src/renderbuffer3d.cpp @@ -50,7 +50,7 @@ * \internal */ CanvasRenderBuffer::CanvasRenderBuffer(QObject *parent) : - QObject(parent) + CanvasAbstractObject(parent) { initializeOpenGLFunctions(); glGenRenderbuffers(1, &m_renderbufferId); diff --git a/src/renderbuffer3d_p.h b/src/renderbuffer3d_p.h index 5ce37e9..8da1b7b 100644 --- a/src/renderbuffer3d_p.h +++ b/src/renderbuffer3d_p.h @@ -47,10 +47,12 @@ #ifndef RENDERBUFFER3D_P_H #define RENDERBUFFER3D_P_H +#include "abstractobject3d_p.h" + #include <QObject> #include <QOpenGLFunctions> -class CanvasRenderBuffer : public QObject, protected QOpenGLFunctions +class CanvasRenderBuffer : public CanvasAbstractObject, protected QOpenGLFunctions { Q_OBJECT public: diff --git a/src/shader3d.cpp b/src/shader3d.cpp index 1b2b990..f6d060c 100644 --- a/src/shader3d.cpp +++ b/src/shader3d.cpp @@ -50,7 +50,7 @@ * \internal */ CanvasShader::CanvasShader(QOpenGLShader::ShaderType type, QObject *parent) : - QObject(parent), + CanvasAbstractObject(parent), m_shader(new QOpenGLShader(type, this)), m_sourceCode("") { diff --git a/src/shader3d_p.h b/src/shader3d_p.h index 9e49a37..ba4de3e 100644 --- a/src/shader3d_p.h +++ b/src/shader3d_p.h @@ -48,10 +48,11 @@ #define SHADER3D_P_H #include "context3d_p.h" +#include "abstractobject3d_p.h" #include <QOpenGLShader> -class CanvasShader : public QObject +class CanvasShader : public CanvasAbstractObject { Q_OBJECT public: diff --git a/src/shaderprecisionformat.cpp b/src/shaderprecisionformat.cpp index 9b34f70..02562e8 100644 --- a/src/shaderprecisionformat.cpp +++ b/src/shaderprecisionformat.cpp @@ -52,7 +52,7 @@ * \internal */ CanvasShaderPrecisionFormat::CanvasShaderPrecisionFormat(QObject *parent) : - QObject(parent) + CanvasAbstractObject(parent) { } diff --git a/src/shaderprecisionformat_p.h b/src/shaderprecisionformat_p.h index 470c96b..12e7b95 100644 --- a/src/shaderprecisionformat_p.h +++ b/src/shaderprecisionformat_p.h @@ -47,9 +47,11 @@ #ifndef SHADERPRECISIONFORMAT_P_H #define SHADERPRECISIONFORMAT_P_H +#include "abstractobject3d_p.h" + #include <QObject> -class CanvasShaderPrecisionFormat : public QObject +class CanvasShaderPrecisionFormat : public CanvasAbstractObject { Q_OBJECT Q_PROPERTY(int rangeMin READ rangeMin NOTIFY rangeMinChanged) diff --git a/src/teximage3d.cpp b/src/teximage3d.cpp index d398e9e..3e9e1b6 100644 --- a/src/teximage3d.cpp +++ b/src/teximage3d.cpp @@ -358,7 +358,7 @@ uchar *CanvasTextureImage::convertToFormat(CanvasContext::glEnums format, bool f QDebug operator<<(QDebug dbg, const CanvasTextureImage *texImage) { if (texImage) - dbg.nospace() << "TexImage3D("<< ((void*) texImage) << texImage->m_name << ")"; + dbg.nospace() << "TexImage3D("<< ((void*) texImage) << texImage->name() << ")"; else dbg.nospace() << "TexImage3D("<< ((void*) texImage) <<")"; return dbg.maybeSpace(); diff --git a/src/teximage3dloader.cpp b/src/teximage3dloader.cpp index 049b146..4a5e2d8 100644 --- a/src/teximage3dloader.cpp +++ b/src/teximage3dloader.cpp @@ -70,7 +70,7 @@ * \internal */ CanvasTextureImageLoader::CanvasTextureImageLoader(QObject *parent) : - QObject(parent), + CanvasAbstractObject(parent), m_logAllCalls(false), m_logAllErrors(true), m_image(0), diff --git a/src/teximage3dloader_p.h b/src/teximage3dloader_p.h index 8e2421d..6df8870 100644 --- a/src/teximage3dloader_p.h +++ b/src/teximage3dloader_p.h @@ -47,11 +47,12 @@ #ifndef TEXIMAGE3DLOADER_P_H #define TEXIMAGE3DLOADER_P_H +#include "abstractobject3d_p.h" #include "teximage3d_p.h" class Canvas; -class CanvasTextureImageLoader : public QObject +class CanvasTextureImageLoader : public CanvasAbstractObject { Q_OBJECT Q_PROPERTY(CanvasTextureImage* image READ image) diff --git a/src/texture3d.cpp b/src/texture3d.cpp index e11558f..cfcef46 100644 --- a/src/texture3d.cpp +++ b/src/texture3d.cpp @@ -113,7 +113,7 @@ void CanvasTexture::del() QDebug operator<<(QDebug dbg, const CanvasTexture *texture) { if (texture) - dbg.nospace() << "Texture3D("<< ((void*) texture) << texture->m_name << ")"; + dbg.nospace() << "Texture3D("<< ((void*) texture) << texture->name() << ")"; else dbg.nospace() << "Texture3D("<< ((void*) texture) <<")"; return dbg.maybeSpace(); diff --git a/src/typedarray.cpp b/src/typedarray.cpp index 119aca0..5e6cabd 100644 --- a/src/typedarray.cpp +++ b/src/typedarray.cpp @@ -115,7 +115,7 @@ void CanvasTypedArray::setLength(unsigned long length) QDebug operator<<(QDebug dbg, const CanvasTypedArray *array) { if (array) - dbg.nospace() << "TypedArray ("<< array->m_name <<", length:" << array->length() << ")"; + dbg.nospace() << "TypedArray ("<< array->name() <<", length:" << array->length() << ")"; else dbg.nospace() << "TypedArray (null)"; return dbg.maybeSpace(); diff --git a/src/uniformlocation.cpp b/src/uniformlocation.cpp index a1b38be..0793def 100644 --- a/src/uniformlocation.cpp +++ b/src/uniformlocation.cpp @@ -76,7 +76,7 @@ int CanvasUniformLocation::id() QDebug operator<<(QDebug dbg, const CanvasUniformLocation *uLoc) { if (uLoc) - dbg.nospace() << "UniformLocation("<< (void *) uLoc << ", name:"<< uLoc->m_name <<", location:" << uLoc->m_location << ")"; + dbg.nospace() << "UniformLocation("<< (void *) uLoc << ", name:"<< uLoc->name() <<", location:" << uLoc->m_location << ")"; else dbg.nospace() << "UniformLocation("<< (void *)(uLoc) << ")"; -- GitLab