From 3dfa704668e935cad3d40e62fc03fe61266b9d21 Mon Sep 17 00:00:00 2001 From: Gunnar Sletta Date: Tue, 7 Dec 2010 07:56:32 +0100 Subject: Remove QGLTexture2D and QGLTextureUtils from repo. They are not used after texture manager rewrite. --- .../default/default_glyphnode_p.cpp | 1 - src/scenegraph/3d/qgltexture2d.cpp | 720 ------------------ src/scenegraph/3d/qgltexture2d.h | 107 --- src/scenegraph/3d/qgltexture2d_p.h | 120 --- src/scenegraph/3d/qgltextureutils.cpp | 807 --------------------- src/scenegraph/3d/qgltextureutils_p.h | 165 ----- src/scenegraph/convenience/texturematerial.cpp | 1 - src/scenegraph/convenience/utilities.cpp | 1 - src/scenegraph/convenience/utilities.h | 1 - src/scenegraph/coreapi/node.cpp | 1 - src/scenegraph/coreapi/renderer.h | 1 - src/scenegraph/scenegraph.pri | 9 +- 12 files changed, 3 insertions(+), 1931 deletions(-) delete mode 100644 src/scenegraph/3d/qgltexture2d.cpp delete mode 100644 src/scenegraph/3d/qgltexture2d.h delete mode 100644 src/scenegraph/3d/qgltexture2d_p.h delete mode 100644 src/scenegraph/3d/qgltextureutils.cpp delete mode 100644 src/scenegraph/3d/qgltextureutils_p.h diff --git a/src/adaptationlayers/default/default_glyphnode_p.cpp b/src/adaptationlayers/default/default_glyphnode_p.cpp index 685e02b..ffbfa7d 100644 --- a/src/adaptationlayers/default/default_glyphnode_p.cpp +++ b/src/adaptationlayers/default/default_glyphnode_p.cpp @@ -43,7 +43,6 @@ #include "geometry.h" #include -#include #include #include diff --git a/src/scenegraph/3d/qgltexture2d.cpp b/src/scenegraph/3d/qgltexture2d.cpp deleted file mode 100644 index 1910f4e..0000000 --- a/src/scenegraph/3d/qgltexture2d.cpp +++ /dev/null @@ -1,720 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the Qt scene graph research project. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the Technology Preview License Agreement accompanying -** this package. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qgltexture2d.h" -#include "qgltexture2d_p.h" -#include "qgltextureutils_p.h" - -#include -#include - -QT_BEGIN_NAMESPACE - -/*! - \class QGLTexture2D - \brief The QGLTexture2D class represents a 2D texture object for GL painting operations. - \since 4.8 - \ingroup qt3d - \ingroup qt3d::enablers - - QGLTexture2D contains a QImage and settings for texture filters, - wrap modes, and mipmap generation. When bind() is called, this - information is uploaded to the GL server if it has changed since - the last time bind() was called. - - Once a QGLTexture2D object is created, it can be bound to multiple - GL contexts. Internally, a separate texture identifier is created - for each context. This makes QGLTexture2D easier to use than - raw GL texture identifiers because the application does not need - to be as concerned with whether the texture identifier is valid - in the current context. The application merely calls bind() and - QGLTexture2D will create a new texture identifier for the context - if necessary. - - QGLTexture2D internally points to a reference-counted object that - represents the current texture state. If the QGLTexture2D is copied, - the internal pointer is the same. Modifications to one QGLTexture2D - copy will affect all of the other copies in the system. - - The texture identifiers will be destroyed when the last QGLTexture2D - reference is destroyed, or when a context is destroyed that contained a - texture identifier that was created by QGLTexture2D. - - QGLTexture2D can also be used for uploading 1D textures into the - GL server by specifying an image() with a height of 1. - - \sa QGLTextureCube -*/ - -#ifndef QT_NO_DEBUG -static int qt_texture_count = 0; - -static void qt_print_texture_count() -{ - qDebug("Number of leaked textures: %i", qt_texture_count); - qt_texture_count = -1; -} -#endif - -QGLTexture2DPrivate::QGLTexture2DPrivate() -{ -#ifndef QT_NO_DEBUG - ++qt_texture_count; - static bool atexit_registered = false; - if (!atexit_registered) { - atexit(qt_print_texture_count); - atexit_registered = true; - } -#endif - - horizontalWrap = QGL::Repeat; - verticalWrap = QGL::Repeat; - bindOptions = QGLContext::DefaultBindOption; -#if !defined(QT_OPENGL_ES) - mipmapSupported = false; - mipmapSupportedKnown = false; -#endif - imageGeneration = 0; - parameterGeneration = 0; - infos = 0; -} - -QGLTexture2DPrivate::~QGLTexture2DPrivate() -{ -#ifndef QT_NO_DEBUG - --qt_texture_count; - if (qt_texture_count < 0) - qDebug("Destroying texture after qt_print_texture_count() has run."); -#endif - - // Destroy the texture id's in the GL server in their original contexts. - QGLTexture2DTextureInfo *current = infos; - QGLTexture2DTextureInfo *next; - const QGLContext *currentContext = - const_cast(QGLContext::currentContext()); - const QGLContext *firstContext = currentContext; - while (current != 0) { - next = current->next; - if (!current->isLiteral && current->tex.textureId()) { - const QGLContext *context = current->tex.context(); - if (context && context != currentContext && - !QGLContext::areSharing(context, currentContext)) { - const_cast(context)->makeCurrent(); - currentContext = context; - } - GLuint textureId = current->tex.textureId(); - glDeleteTextures(1, &textureId); - } - delete current; - current = next; - } - if (firstContext != currentContext) { - if (firstContext) - const_cast(firstContext)->makeCurrent(); - else if (currentContext) - const_cast(currentContext)->doneCurrent(); - } -} - -QGLTexture2DPrivate *QGLTexture2DPrivate::get(const QGLTexture2D *q) -{ - return q->d_ptr.data(); -} - -/*! - Constructs a null texture object and attaches it to \a parent. - - \sa isNull() -*/ -QGLTexture2D::QGLTexture2D(QObject *parent) - : QObject(parent), d_ptr(new QGLTexture2DPrivate()) -{ -} - -/*! - Destroys this texture object. If this object is the last - reference to the underlying GL texture, then the underlying - GL texture will also be deleted. -*/ -QGLTexture2D::~QGLTexture2D() -{ -} - -/*! - Returns true if this texture object is null; that is, image() - is null and textureId() is zero. -*/ -bool QGLTexture2D::isNull() const -{ - Q_D(const QGLTexture2D); - return d->image.isNull() && !d->infos; -} - -/*! - Returns the size of this texture. If the underlying OpenGL - implementation requires texture sizes to be a power of two, - then this function will return the next power of two equal - to or greater than requestedSize() - - \sa setSize(), requestedSize() -*/ -QSize QGLTexture2D::size() const -{ - Q_D(const QGLTexture2D); - return d->size; -} - -/*! - Sets the size of this texture to \a value. If the underlying - OpenGL implementation requires texture sizes to be a power of - two, then requestedSize() will be set to \a value, and the - actual size will be set to the next power of two equal - to or greater than \a value. Otherwise both size() and - requestedSize() will be set to \a value. - - \sa size(), requestedSize() -*/ -void QGLTexture2D::setSize(const QSize& value) -{ - Q_D(QGLTexture2D); - if (d->requestedSize == value) - return; - if (!(QGLFormat::openGLVersionFlags() & QGLFormat::OpenGL_Version_2_0) - && !(QGLFormat::openGLVersionFlags() & QGLFormat::OpenGL_ES_Version_2_0)) - d->size = QSize(qt_gl_next_power_of_two(value.width()), - qt_gl_next_power_of_two(value.height())); - else - d->size = value; - d->requestedSize = value; - ++(d->imageGeneration); -} - -/*! - Returns the size that was previously set with setSize() before - it was rounded to a power of two. - - \sa size(), setSize() -*/ -QSize QGLTexture2D::requestedSize() const -{ - Q_D(const QGLTexture2D); - return d->requestedSize; -} - -/*! - Returns the image that is currently associated with this texture. - The image may not have been uploaded into the GL server yet. - Uploads occur upon the next call to bind(). - - \sa setImage() -*/ -QImage QGLTexture2D::image() const -{ - Q_D(const QGLTexture2D); - return d->image; -} - -/*! - Sets the \a image that is associated with this texture. The image - will be uploaded into the GL server the next time bind() is called. - - If setSize() or setImage() has been called previously, then \a image - will be scaled to size() when it is uploaded. - - If \a image is null, then this function is equivalent to clearImage(). - - \sa image(), setSize(), copyImage(), setPixmap() -*/ -void QGLTexture2D::setImage(const QImage& image) -{ - Q_D(QGLTexture2D); - d->compressedData = QByteArray(); // Clear compressed file data. - if (image.isNull()) { - // Don't change the imageGeneration, because we aren't actually - // changing the image in the GL server, only the client copy. - d->image = image; - } else { - if (!d->size.isValid()) - setSize(image.size()); - d->image = image; - ++(d->imageGeneration); - } -} - -/*! - Sets the image that is associated with this texture to \a pixmap. - - This is a convenience that calls setImage() after converting - \a pixmap into a QImage. It may be more efficient on some - platforms than the application calling QPixmap::toImage(). - - \sa setImage() -*/ -void QGLTexture2D::setPixmap(const QPixmap& pixmap) -{ - QImage image = pixmap.toImage(); - if (pixmap.depth() == 16 && !image.hasAlphaChannel()) { - // If the system depth is 16 and the pixmap doesn't have an alpha channel - // then we convert it to RGB16 in the hope that it gets uploaded as a 16 - // bit texture which is much faster to access than a 32-bit one. - image = image.convertToFormat(QImage::Format_RGB16); - } - setImage(image); -} - -/*! - Clears the image() that is associated with this texture, but the - GL texture will retain its current value. This can be used to - release client-side memory that is no longer required once the - image has been uploaded into the GL server. - - The following code will queue \c image to be uploaded, immediately - force it to be uploaded into the current GL context, and then - clear the client copy: - - \code - texture.setImage(image); - texture.bind(); - texture.clearImage() - \endcode - - \sa image(), setImage() -*/ -void QGLTexture2D::clearImage() -{ - Q_D(QGLTexture2D); - d->image = QImage(); -} - -#ifndef GL_GENERATE_MIPMAP_SGIS -#define GL_GENERATE_MIPMAP_SGIS 0x8191 -#define GL_GENERATE_MIPMAP_HINT_SGIS 0x8192 -#endif - -/*! - Sets this texture to the contents of a compressed image file - at \a path. Returns true if the file exists and has a supported - compressed format; false otherwise. - - The DDS, ETC1, PVRTC2, and PVRTC4 compression formats are - supported, assuming that the GL implementation has the - appropriate extension. - - \sa setImage(), setSize() -*/ -bool QGLTexture2D::setCompressedFile(const QString &path) -{ - Q_D(QGLTexture2D); - d->image = QImage(); - QFile f(path); - if (!f.open(QIODevice::ReadOnly)) - { - qWarning("QGLTexture2D::setCompressedFile(%s): File could not be read", - qPrintable(path)); - return false; - } - QByteArray data = f.readAll(); - f.close(); - - bool hasAlpha, isFlipped; - if (!QGLBoundTexture::canBindCompressedTexture - (data.constData(), data.size(), 0, &hasAlpha, &isFlipped)) { - qWarning("QGLTexture2D::setCompressedFile(%s): Format is not supported", - path.toLocal8Bit().constData()); - return false; - } - - QFileInfo fi(path); - d->url = QUrl::fromLocalFile(fi.absoluteFilePath()); - - // The 3DS loader expects the flip state to be set before bind(). - if (isFlipped) - d->bindOptions &= ~QGLContext::InvertedYBindOption; - else - d->bindOptions |= QGLContext::InvertedYBindOption; - - d->compressedData = data; - ++(d->imageGeneration); - return true; -} - -/*! - Returns the url that was last set with setUrl. -*/ -QUrl QGLTexture2D::url() const -{ - Q_D(const QGLTexture2D); - return d->url; -} - -/*! - Sets this texture to have the contents of the image stored at \a url. -*/ -void QGLTexture2D::setUrl(const QUrl &url) -{ - Q_D(QGLTexture2D); - if (d->url == url) - return; - - if (url.isEmpty()) - { - d->image = QImage(); - } - else - { - if (url.scheme() == QLatin1String("file")) - { - QString fileName = url.path(); - if (fileName.endsWith(".dds", Qt::CaseInsensitive)) - { - setCompressedFile(fileName); - } - else - { - QImage im(fileName); - if (im.isNull()) - qWarning("Could not load texture: %s", qPrintable(fileName)); - setImage(im); - d->url = url; - } - } - else - { - qWarning("Network URLs not yet supported\n"); - /* - if (d->textureReply) - d->textureReply->deleteLater(); - QNetworkRequest req(d->textureUrl); - req.setAttribute(QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::PreferCache); - d->textureReply = qmlEngine(this)->networkAccessManager()->get(req); - QObject::connect(d->textureReply, SIGNAL(finished()), - this, SLOT(textureRequestFinished())); - */ - } - } -} - -/*! - Copies the contents of \a image to \a offset in this texture - within the current GL context. - - Unlike setImage(), this function copies the image data to the - GL server immediately using \c{glTexSubImage2D()}. This is typically - used to update the contents of a texture after it has been created. - - It is assumed that the application has already called bind() on - this texture to bind it to the current GL context. - - If the texture has been created in multiple contexts, only the - texture identifier for the current context will be updated. - - \sa setImage(), bind() -*/ -void QGLTexture2D::copyImage(const QImage& image, const QPoint& offset) -{ - QImage img = QGLWidget::convertToGLFormat(image); - glTexSubImage2D(GL_TEXTURE_2D, 0, offset.x(), offset.y(), - img.width(), img.height(), GL_RGBA, - GL_UNSIGNED_BYTE, img.bits()); -#if defined(QT_OPENGL_ES_2) - Q_D(QGLTexture2D); - if (d->bindOptions & QGLContext::MipmapBindOption) - glGenerateMipmap(GL_TEXTURE_2D); -#endif -} - -/*! - Returns the options to use when binding the image() to an OpenGL - context for the first time. The default options are - QGLContext::LinearFilteringBindOption | - QGLContext::InvertedYBindOption | QGLContext::MipmapBindOption. - - \sa setBindOptions() -*/ -QGLContext::BindOptions QGLTexture2D::bindOptions() const -{ - Q_D(const QGLTexture2D); - return d->bindOptions; -} - -/*! - Sets the \a options to use when binding the image() to an - OpenGL context. If the image() has already been bound, - then changing the options will cause it to be recreated - from image() the next time bind() is called. - - \sa bindOptions(), bind() -*/ -void QGLTexture2D::setBindOptions(QGLContext::BindOptions options) -{ - Q_D(QGLTexture2D); - if (d->bindOptions != options) { - d->bindOptions = options; - ++(d->imageGeneration); - } -} - -/*! - Returns the wrapping mode for horizontal texture co-ordinates. - The default value is QGL::Repeat. - - \sa setHorizontalWrap(), verticalWrap() -*/ -QGL::TextureWrap QGLTexture2D::horizontalWrap() const -{ - Q_D(const QGLTexture2D); - return d->horizontalWrap; -} - -/*! - Sets the wrapping mode for horizontal texture co-ordinates to \a value. - - If \a value is not supported by the OpenGL implementation, it will be - replaced with a value that is supported. If the application desires a - very specific \a value, it can call horizontalWrap() to check that - the specific value was actually set. - - The \a value will not be applied to the texture in the GL - server until the next call to bind(). - - \sa horizontalWrap(), setVerticalWrap() -*/ -void QGLTexture2D::setHorizontalWrap(QGL::TextureWrap value) -{ - Q_D(QGLTexture2D); - value = qt_gl_modify_texture_wrap(value); - if (d->horizontalWrap != value) { - d->horizontalWrap = value; - ++(d->parameterGeneration); - } -} - -/*! - Returns the wrapping mode for vertical texture co-ordinates. - The default value is QGL::Repeat. - - \sa setVerticalWrap(), horizontalWrap() -*/ -QGL::TextureWrap QGLTexture2D::verticalWrap() const -{ - Q_D(const QGLTexture2D); - return d->verticalWrap; -} - -/*! - Sets the wrapping mode for vertical texture co-ordinates to \a value. - - If \a value is not supported by the OpenGL implementation, it will be - replaced with a value that is supported. If the application desires a - very specific \a value, it can call verticalWrap() to check that - the specific value was actually set. - - The \a value will not be applied to the texture in the GL - server until the next call to bind(). - - \sa verticalWrap(), setHorizontalWrap() -*/ -void QGLTexture2D::setVerticalWrap(QGL::TextureWrap value) -{ - Q_D(QGLTexture2D); - value = qt_gl_modify_texture_wrap(value); - if (d->verticalWrap != value) { - d->verticalWrap = value; - ++(d->parameterGeneration); - } -} - -/*! - Binds this texture to the 2D texture target. - - If this texture object is not associated with an identifier in - the current context, then a new identifier will be created, - and image() uploaded into the GL server. - - If setImage() or setSize() was called since the last upload, - then image() will be re-uploaded to the GL server. - - Returns false if the texture could not be bound for some reason. - - \sa release(), textureId(), setImage() -*/ -bool QGLTexture2D::bind() const -{ - Q_D(const QGLTexture2D); - return const_cast(d)->bind(GL_TEXTURE_2D); -} - -bool QGLTexture2DPrivate::bind(GLenum target) -{ - // Get the current context. If we don't have one, then we - // cannot bind the texture. - const QGLContext *ctx = QGLContext::currentContext(); - if (!ctx) - return false; - - // Find the information block for the context, or create one. - QGLTexture2DTextureInfo *info = infos; - QGLTexture2DTextureInfo *prev = 0; - while (info != 0 && !QGLContext::areSharing(info->tex.context(), ctx)) { - if (info->isLiteral) - return false; // Cannot create extra texture id's for literals. - prev = info; - info = info->next; - } - if (!info) { - info = new QGLTexture2DTextureInfo - (ctx, 0, imageGeneration - 1, parameterGeneration - 1); - if (prev) - prev->next = info; - else - infos = info; - } - - if (!info->tex.textureId() || imageGeneration != info->imageGeneration) { - // Create the texture contents and upload a new image. - info->tex.setOptions(bindOptions); - if (!compressedData.isEmpty()) { - info->tex.bindCompressedTexture - (compressedData.constData(), compressedData.size()); - } else { - info->tex.startUpload(target, image.size()); - bindImages(info); - info->tex.finishUpload(target); - } - info->imageGeneration = imageGeneration; - } else { - // Bind the existing texture to the texture target. - glBindTexture(target, info->tex.textureId()); - } - - // If the parameter generation has changed, then alter the parameters. - if (parameterGeneration != info->parameterGeneration) { - info->parameterGeneration = parameterGeneration; - q_glTexParameteri(target, GL_TEXTURE_WRAP_S, horizontalWrap); - q_glTexParameteri(target, GL_TEXTURE_WRAP_T, verticalWrap); - } - - // Texture is ready to be used. - return true; -} - -void QGLTexture2DPrivate::bindImages(QGLTexture2DTextureInfo *info) -{ - QSize scaledSize(size); -#if defined(QT_OPENGL_ES_2) - if ((bindOptions & QGLContext::MipmapBindOption) || - horizontalWrap != QGL::ClampToEdge || - verticalWrap != QGL::ClampToEdge) { - // ES 2.0 does not support NPOT textures when mipmaps are in use, - // or if the wrap mode isn't ClampToEdge. - scaledSize = QSize(qt_gl_next_power_of_two(scaledSize.width()), - qt_gl_next_power_of_two(scaledSize.height())); - } -#endif - if (!image.isNull()) - info->tex.uploadFace(GL_TEXTURE_2D, image, scaledSize); - else if (size.isValid()) - info->tex.createFace(GL_TEXTURE_2D, scaledSize); -} - -/*! - Releases the texture associated with the 2D texture target. - This is equivalent to \c{glBindTexture(GL_TEXTURE_2D, 0)}. - - \sa bind() -*/ -void QGLTexture2D::release() const -{ - glBindTexture(GL_TEXTURE_2D, 0); -} - -/*! - Returns the identifier associated with this texture object in - the current context. - - Returns zero if the texture has not previously been bound to - the 2D texture target in the current context with bind(). - - \sa bind() -*/ -GLuint QGLTexture2D::textureId() const -{ - Q_D(const QGLTexture2D); - const QGLContext *ctx = QGLContext::currentContext(); - if (!ctx) - return 0; - QGLTexture2DTextureInfo *info = d->infos; - while (info != 0 && !QGLContext::areSharing(info->tex.context(), ctx)) - info = info->next; - return info ? info->tex.textureId() : 0; -} - -/*! - Constructs a QGLTexture2D object that wraps the supplied literal - texture identifier \a id, with the dimensions specified by \a size. - - The \a id is assumed to have been created by the application in - the current GL context, and it will be destroyed by the application - after the returned QGLTexture2D object is destroyed. - - This function is intended for interfacing to existing code that - uses raw GL texture identifiers. The returned QGLTexture2D can - only be used with the current GL context. - - \sa textureId() -*/ -QGLTexture2D *QGLTexture2D::fromTextureId(GLuint id, const QSize& size) -{ - const QGLContext *ctx = QGLContext::currentContext(); - if (!id || !ctx) - return 0; - - QGLTexture2D *texture = new QGLTexture2D(); - if (!size.isNull()) - texture->setSize(size); - QGLTexture2DTextureInfo *info = new QGLTexture2DTextureInfo - (ctx, id, texture->d_ptr->imageGeneration, - texture->d_ptr->parameterGeneration, true); - texture->d_ptr->infos = info; - return texture; -} - -QT_END_NAMESPACE diff --git a/src/scenegraph/3d/qgltexture2d.h b/src/scenegraph/3d/qgltexture2d.h deleted file mode 100644 index 9aea584..0000000 --- a/src/scenegraph/3d/qgltexture2d.h +++ /dev/null @@ -1,107 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the Qt scene graph research project. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the Technology Preview License Agreement accompanying -** this package. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QGLTEXTURE2D_H -#define QGLTEXTURE2D_H - -#include "qglnamespace.h" -#include -#include - -QT_BEGIN_HEADER - -QT_BEGIN_NAMESPACE - -class QGLTexture2DPrivate; - -class Q_QT3D_EXPORT QGLTexture2D : public QObject -{ - Q_OBJECT -public: - QGLTexture2D(QObject *parent = 0); - ~QGLTexture2D(); - - bool isNull() const; - - QSize size() const; - void setSize(const QSize& value); - QSize requestedSize() const; - - QImage image() const; - void setImage(const QImage& image); - bool setCompressedFile(const QString &path); - QUrl url() const; - void setUrl(const QUrl &url); - - void setPixmap(const QPixmap& pixmap); - - void clearImage(); - - void copyImage(const QImage& image, const QPoint& offset = QPoint(0, 0)); - - QGLContext::BindOptions bindOptions() const; - void setBindOptions(QGLContext::BindOptions options); - - QGL::TextureWrap horizontalWrap() const; - void setHorizontalWrap(QGL::TextureWrap value); - - QGL::TextureWrap verticalWrap() const; - void setVerticalWrap(QGL::TextureWrap value); - - bool bind() const; - void release() const; - - GLuint textureId() const; - - static QGLTexture2D *fromTextureId(GLuint id, const QSize& size); - -private: - QScopedPointer d_ptr; - - Q_DISABLE_COPY(QGLTexture2D) - Q_DECLARE_PRIVATE(QGLTexture2D) -}; - -QT_END_NAMESPACE - -QT_END_HEADER - -#endif diff --git a/src/scenegraph/3d/qgltexture2d_p.h b/src/scenegraph/3d/qgltexture2d_p.h deleted file mode 100644 index d187b83..0000000 --- a/src/scenegraph/3d/qgltexture2d_p.h +++ /dev/null @@ -1,120 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the Qt scene graph research project. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the Technology Preview License Agreement accompanying -** this package. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QGLTEXTURE2D_P_H -#define QGLTEXTURE2D_P_H - -// -// W A R N I N G -// ------------- -// -// This file is not part of the Qt API. It exists purely as an -// implementation detail. This header file may change from version to -// version without notice, or even be removed. -// -// We mean it. -// - -#include "qgltexture2d.h" -#include "qgltextureutils_p.h" -#include "qurl.h" - -#include - -QT_BEGIN_NAMESPACE - -class QGLTexture2DTextureInfo -{ -public: - QGLTexture2DTextureInfo - (const QGLContext *context, GLuint textureId, uint imageGeneration, - uint parameterGeneration, bool isLiteral = false) - : tex(context) - { - if (textureId) - tex.setTextureId(textureId); - this->imageGeneration = imageGeneration; - this->parameterGeneration = parameterGeneration; - this->isLiteral = isLiteral; - this->next = 0; - } - - QGLBoundTexture tex; - uint imageGeneration; - uint parameterGeneration; - bool isLiteral; - QGLTexture2DTextureInfo *next; -}; - -class DDSFormat; - -class QGLTexture2DPrivate : public QObject -{ - Q_OBJECT -public: - QGLTexture2DPrivate(); - ~QGLTexture2DPrivate(); - - QSize size; - QSize requestedSize; - QImage image; - QUrl url; - QByteArray compressedData; - QGLContext::BindOptions bindOptions; - QGL::TextureWrap horizontalWrap; - QGL::TextureWrap verticalWrap; -#if !defined(QT_OPENGL_ES) - bool mipmapSupported; - bool mipmapSupportedKnown; -#endif - uint imageGeneration; - uint parameterGeneration; - QGLTexture2DTextureInfo *infos; - - bool bind(GLenum target); - virtual void bindImages(QGLTexture2DTextureInfo *info); - - static QGLTexture2DPrivate *get(const QGLTexture2D *q); -}; - -QT_END_NAMESPACE - -#endif diff --git a/src/scenegraph/3d/qgltextureutils.cpp b/src/scenegraph/3d/qgltextureutils.cpp deleted file mode 100644 index 62564a8..0000000 --- a/src/scenegraph/3d/qgltextureutils.cpp +++ /dev/null @@ -1,807 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the Qt scene graph research project. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the Technology Preview License Agreement accompanying -** this package. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qgltextureutils_p.h" -#include -#include - -QT_BEGIN_NAMESPACE - -int qt_gl_next_power_of_two(int v) -{ - v--; - v |= v >> 1; - v |= v >> 2; - v |= v >> 4; - v |= v >> 8; - v |= v >> 16; - ++v; - return v; -} - -QGL::TextureWrap qt_gl_modify_texture_wrap(QGL::TextureWrap value) -{ - switch (value) { -#if defined(QT_OPENGL_ES) - case QGL::Clamp: - value = QGL::ClampToEdge; - break; -#endif -#if !defined(QT_OPENGL_ES) - case QGL::ClampToBorder: - if ((QGLFormat::openGLVersionFlags() & QGLFormat::OpenGL_Version_1_3) - == 0) - value = QGL::Clamp; - break; -#else - case QGL::ClampToBorder: - value = QGL::ClampToEdge; - break; -#endif -#if !defined(QT_OPENGL_ES) - case QGL::ClampToEdge: - if ((QGLFormat::openGLVersionFlags() & QGLFormat::OpenGL_Version_1_2) - == 0) - value = QGL::Clamp; - break; -#endif -#if !defined(QT_OPENGL_ES) - case QGL::MirroredRepeat: - if ((QGLFormat::openGLVersionFlags() & QGLFormat::OpenGL_Version_1_4) - == 0) - value = QGL::Repeat; - break; -#elif !defined(QT_OPENGL_ES_2) - case QGL::MirroredRepeat: - value = QGL::Repeat; - break; -#endif - default: break; - } - return value; -} - -QGLTextureExtensions::QGLTextureExtensions(const QGLContext *ctx) - : npotTextures(false) - , generateMipmap(false) - , bgraTextureFormat(false) - , ddsTextureCompression(false) - , etc1TextureCompression(false) - , pvrtcTextureCompression(false) - , compressedTexImage2D(0) -{ - Q_UNUSED(ctx); - QGLExtensionMatcher extensions(reinterpret_cast(glGetString(GL_EXTENSIONS))); - if (extensions.match("GL_ARB_texture_non_power_of_two")) - npotTextures = true; - if (extensions.match("GL_SGIS_generate_mipmap")) - generateMipmap = true; - if (extensions.match("GL_EXT_bgra") || extensions.match("GL_IMG_texture_format_BGRA8888")) - bgraTextureFormat = true; - if (extensions.match("GL_EXT_texture_compression_s3tc")) - ddsTextureCompression = true; - if (extensions.match("GL_OES_compressed_ETC1_RGB8_texture")) - etc1TextureCompression = true; - if (extensions.match("GL_IMG_texture_compression_pvrtc")) - pvrtcTextureCompression = true; -#if defined(QT_OPENGL_ES_2) - npotTextures = true; - generateMipmap = true; -#endif -#if !defined(QT_OPENGL_ES) - if (extensions.match("GL_ARB_texture_compression")) { - compressedTexImage2D = (q_glCompressedTexImage2DARB) - ctx->getProcAddress(QLatin1String("glCompressedTexImage2DARB")); - } -#else - compressedTexImage2D = glCompressedTexImage2D; -#endif -} - -QGLTextureExtensions::~QGLTextureExtensions() -{ -} - -#if QT_VERSION >= 0x040800 -Q_GLOBAL_STATIC(QGLContextGroupResource, qt_gl_texture_extensions) -#else -static void QGLTextureExtensions_free(void *ptr) -{ - delete reinterpret_cast(ptr); -} - -Q_GLOBAL_STATIC_WITH_ARGS(QGLContextResource, qt_gl_texture_extensions, (QGLTextureExtensions_free)) -#endif - -QGLTextureExtensions *QGLTextureExtensions::extensions() -{ - const QGLContext *ctx = QGLContext::currentContext(); - if (!ctx) - return 0; - QGLTextureExtensions *extns = reinterpret_cast(qt_gl_texture_extensions()->value(ctx)); - if (!extns) { - extns = new QGLTextureExtensions(ctx); - qt_gl_texture_extensions()->insert(ctx, extns); - } - return extns; -} - -QGLBoundTexture::QGLBoundTexture(const QGLContext *ctx) - : m_guard(ctx) - , m_options(QGLContext::DefaultBindOption) - , m_hasAlpha(false) -{ -} - -QGLBoundTexture::~QGLBoundTexture() -{ -} - -#define QGL_BIND_TEXTURE_DEBUG - -void QGLBoundTexture::startUpload(GLenum target, const QSize &imageSize) -{ - Q_UNUSED(imageSize); - - QGLTextureExtensions *extensions = QGLTextureExtensions::extensions(); - if (!extensions) - return; - -#ifdef QGL_BIND_TEXTURE_DEBUG - printf("QGLBoundTexture::startUpload(), imageSize=(%d,%d), options=%x\n", - imageSize.width(), imageSize.height(), int(m_options)); - time.start(); -#endif - -#ifndef QT_NO_DEBUG - // Reset the gl error stack... - while (glGetError() != GL_NO_ERROR) ; -#endif - - // Create the texture id for the target, which should be one of - // GL_TEXTURE_2D or GL_TEXTURE_CUBE_MAP. - GLuint id = m_guard.id(); - if (id) { - glBindTexture(target, 0); // Just in case texture is bound. - glDeleteTextures(1, &id); - } - id = 0; - glGenTextures(1, &id); - m_guard.setId(id); - glBindTexture(target, m_guard.id()); - - GLuint filtering = m_options & QGLContext::LinearFilteringBindOption ? GL_LINEAR : GL_NEAREST; - -#ifdef QGL_BIND_TEXTURE_DEBUG - printf(" - setting options (%d ms)\n", time.elapsed()); -#endif - q_glTexParameteri(target, GL_TEXTURE_MAG_FILTER, filtering); - - if (QGLContext::currentContext()->format().directRendering() - && extensions->generateMipmap - && (m_options & QGLContext::MipmapBindOption)) - { -#if !defined(QT_OPENGL_ES_2) - glHint(GL_GENERATE_MIPMAP_HINT_SGIS, GL_NICEST); - q_glTexParameteri(target, GL_GENERATE_MIPMAP_SGIS, GL_TRUE); -#else - glHint(GL_GENERATE_MIPMAP_HINT, GL_NICEST); -#endif - q_glTexParameteri(target, GL_TEXTURE_MIN_FILTER, - m_options & QGLContext::LinearFilteringBindOption - ? GL_LINEAR_MIPMAP_LINEAR : GL_NEAREST_MIPMAP_NEAREST); - } else { - q_glTexParameteri(target, GL_TEXTURE_MIN_FILTER, filtering); - m_options &= ~QGLContext::MipmapBindOption; - } -} - -// map from Qt's ARGB endianness-dependent format to GL's big-endian RGBA layout -static inline void qt_gl_byteSwapImage(QImage &img, GLenum pixel_type) -{ - const int width = img.width(); - const int height = img.height(); - - if (pixel_type == GL_UNSIGNED_INT_8_8_8_8_REV - || (pixel_type == GL_UNSIGNED_BYTE && QSysInfo::ByteOrder == QSysInfo::LittleEndian)) - { - for (int i = 0; i < height; ++i) { - uint *p = (uint *) img.scanLine(i); - for (int x = 0; x < width; ++x) - p[x] = ((p[x] << 16) & 0xff0000) | ((p[x] >> 16) & 0xff) | (p[x] & 0xff00ff00); - } - } else { - for (int i = 0; i < height; ++i) { - uint *p = (uint *) img.scanLine(i); - for (int x = 0; x < width; ++x) - p[x] = (p[x] << 8) | ((p[x] >> 24) & 0xff); - } - } -} - -// #define QGL_BIND_TEXTURE_DEBUG - -void QGLBoundTexture::uploadFace - (GLenum target, const QImage &image, const QSize &scaleSize, GLenum format) -{ - GLenum internalFormat(format); - -#ifdef QGL_BIND_TEXTURE_DEBUG - QTime time; - time.start(); -#endif - - - // Resolve the texture-related extensions for the current context. - QGLTextureExtensions *extensions = QGLTextureExtensions::extensions(); - if (!extensions) - return; - - // Adjust the image size for scaling and power of two. - QSize size = (!scaleSize.isEmpty() ? scaleSize : image.size()); - if (!extensions->npotTextures) { - size = QSize(qt_gl_next_power_of_two(size.width()), - qt_gl_next_power_of_two(size.height())); - } - QImage img(image); - if (size != image.size()) { - img = img.scaled(size); -#ifdef QGL_BIND_TEXTURE_DEBUG - printf(" - scaled up to %dx%d (%d ms) \n", size.width(), size.height(), time.elapsed()); -#endif - } - m_size = size; - - QImage::Format target_format = img.format(); - bool premul = m_options & QGLContext::PremultipliedAlphaBindOption; - GLenum externalFormat; - GLuint pixel_type; - if (extensions->bgraTextureFormat) { - externalFormat = GL_BGRA; - if (QGLFormat::openGLVersionFlags() & QGLFormat::OpenGL_Version_1_2) - pixel_type = GL_UNSIGNED_INT_8_8_8_8_REV; - else - pixel_type = GL_UNSIGNED_BYTE; - } else { - externalFormat = GL_RGBA; - pixel_type = GL_UNSIGNED_BYTE; - } - - switch (target_format) { - case QImage::Format_ARGB32: - if (premul) { - img = img.convertToFormat(target_format = QImage::Format_ARGB32_Premultiplied); -#ifdef QGL_BIND_TEXTURE_DEBUG - printf(" - converted ARGB32 -> ARGB32_Premultiplied (%d ms) \n", time.elapsed()); -#endif - } - break; - case QImage::Format_ARGB32_Premultiplied: - if (!premul) { - img = img.convertToFormat(target_format = QImage::Format_ARGB32); -#ifdef QGL_BIND_TEXTURE_DEBUG - printf(" - converted ARGB32_Premultiplied -> ARGB32 (%d ms)\n", time.elapsed()); -#endif - } - break; - case QImage::Format_RGB16: - pixel_type = GL_UNSIGNED_SHORT_5_6_5; - externalFormat = GL_RGB; - internalFormat = GL_RGB; - break; - case QImage::Format_RGB32: - break; - default: - if (img.hasAlphaChannel()) { - img = img.convertToFormat(premul - ? QImage::Format_ARGB32_Premultiplied - : QImage::Format_ARGB32); -#ifdef QGL_BIND_TEXTURE_DEBUG - printf(" - converted to 32-bit alpha format (%d ms)\n", time.elapsed()); -#endif - } else { - img = img.convertToFormat(QImage::Format_RGB32); -#ifdef QGL_BIND_TEXTURE_DEBUG - printf(" - converted to 32-bit (%d ms)\n", time.elapsed()); -#endif - } - } - - if (m_options & QGLContext::InvertedYBindOption) { - if (img.isDetached()) { - int ipl = img.bytesPerLine() / 4; - int h = img.height(); - for (int y=0; y= 4 && !qstrncmp(buf, "DDS ", 4)) { - *hasAlpha = true; - *isFlipped = true; - return true; - } else if (len >= 52 && !qstrncmp(buf + 44, "PVR!", 4)) { - const PvrHeader *pvrHeader = - reinterpret_cast(buf); - *hasAlpha = (pvrHeader->alphaMask != 0); - *isFlipped = ((pvrHeader->flags & PVR_VERTICAL_FLIP) != 0); - return true; - } - } else { - // Validate the format against the header. - if (!qstricmp(format, "DDS")) { - if (len >= 4 && !qstrncmp(buf, "DDS ", 4)) { - *hasAlpha = true; - *isFlipped = true; - return true; - } - } else if (!qstricmp(format, "PVR") || !qstricmp(format, "ETC1")) { - if (len >= 52 && !qstrncmp(buf + 44, "PVR!", 4)) { - const PvrHeader *pvrHeader = - reinterpret_cast(buf); - *hasAlpha = (pvrHeader->alphaMask != 0); - *isFlipped = ((pvrHeader->flags & PVR_VERTICAL_FLIP) != 0); - return true; - } - } - } - return false; -} - -bool QGLBoundTexture::bindCompressedTexture - (const char *buf, int len, const char *format) -{ - if (QSysInfo::ByteOrder != QSysInfo::LittleEndian) { - // Compressed texture loading only supported on little-endian - // systems such as x86 and ARM at the moment. - return false; - } -#if !defined(QT_OPENGL_ES) - QGLTextureExtensions *extensions = QGLTextureExtensions::extensions(); - if (!extensions) - return false; - if (!extensions->compressedTexImage2D) { - qWarning("QGLContext::bindTexture(): The GL implementation does " - "not support texture compression extensions."); - return false; - } -#endif - if (!format) { - // Auto-detect the format from the header. - if (len >= 4 && !qstrncmp(buf, "DDS ", 4)) - return bindCompressedTextureDDS(buf, len); - else if (len >= 52 && !qstrncmp(buf + 44, "PVR!", 4)) - return bindCompressedTexturePVR(buf, len); - } else { - // Validate the format against the header. - if (!qstricmp(format, "DDS")) { - if (len >= 4 && !qstrncmp(buf, "DDS ", 4)) - return bindCompressedTextureDDS(buf, len); - } else if (!qstricmp(format, "PVR") || !qstricmp(format, "ETC1")) { - if (len >= 52 && !qstrncmp(buf + 44, "PVR!", 4)) - return bindCompressedTexturePVR(buf, len); - } - } - return false; -} - -bool QGLBoundTexture::bindCompressedTexture - (const QString& fileName, const char *format) -{ - QFile file(fileName); - if (!file.open(QIODevice::ReadOnly)) - return false; - QByteArray contents = file.readAll(); - file.close(); - return bindCompressedTexture - (contents.constData(), contents.size(), format); -} - -bool QGLBoundTexture::bindCompressedTextureDDS(const char *buf, int len) -{ - QGLTextureExtensions *extensions = QGLTextureExtensions::extensions(); - if (!extensions) - return false; - - // Bail out if the necessary extension is not present. - if (!extensions->ddsTextureCompression) { - qWarning("QGLBoundTexture::bindCompressedTextureDDS(): DDS texture compression is not supported."); - return false; - } - - const DDSFormat *ddsHeader = reinterpret_cast(buf + 4); - if (!ddsHeader->dwLinearSize) { - qWarning("QGLBoundTexture::bindCompressedTextureDDS(): DDS image size is not valid."); - return false; - } - - int blockSize = 16; - GLenum format; - - switch(ddsHeader->ddsPixelFormat.dwFourCC) { - case FOURCC_DXT1: - format = GL_COMPRESSED_RGBA_S3TC_DXT1_EXT; - blockSize = 8; - break; - case FOURCC_DXT3: - format = GL_COMPRESSED_RGBA_S3TC_DXT3_EXT; - break; - case FOURCC_DXT5: - format = GL_COMPRESSED_RGBA_S3TC_DXT5_EXT; - break; - default: - qWarning("QGLBoundTexture::bindCompressedTextureDDS(): DDS image format not supported."); - return false; - } - - const GLubyte *pixels = - reinterpret_cast(buf + ddsHeader->dwSize + 4); - - GLuint id = m_guard.id(); - if (id) { - glBindTexture(GL_TEXTURE_2D, 0); // Just in case it is bound. - glDeleteTextures(1, &id); - } - glGenTextures(1, &id); - glBindTexture(GL_TEXTURE_2D, id); - q_glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - q_glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - m_guard.setId(id); - - int size; - int offset = 0; - int available = len - int(ddsHeader->dwSize + 4); - int w = ddsHeader->dwWidth; - int h = ddsHeader->dwHeight; - - // load mip-maps - for(int i = 0; i < (int) ddsHeader->dwMipMapCount; ++i) { - if (w == 0) w = 1; - if (h == 0) h = 1; - - size = ((w+3)/4) * ((h+3)/4) * blockSize; - if (size > available) - break; - extensions->compressedTexImage2D - (GL_TEXTURE_2D, i, format, w, h, 0, size, pixels + offset); - offset += size; - available -= size; - - // half size for each mip-map level - w = w/2; - h = h/2; - } - - // DDS images are not inverted. - m_options &= ~QGLContext::InvertedYBindOption; - - m_size = QSize(ddsHeader->dwWidth, ddsHeader->dwHeight); - m_hasAlpha = false; - return true; -} - -bool QGLBoundTexture::bindCompressedTexturePVR(const char *buf, int len) -{ - QGLTextureExtensions *extensions = QGLTextureExtensions::extensions(); - if (!extensions) - return false; - - // Determine which texture format we will be loading. - const PvrHeader *pvrHeader = reinterpret_cast(buf); - GLenum textureFormat; - quint32 minWidth, minHeight; - switch (pvrHeader->flags & PVR_FORMAT_MASK) { - case PVR_FORMAT_PVRTC2: - if (pvrHeader->alphaMask) - textureFormat = GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG; - else - textureFormat = GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG; - minWidth = 16; - minHeight = 8; - break; - - case PVR_FORMAT_PVRTC4: - if (pvrHeader->alphaMask) - textureFormat = GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG; - else - textureFormat = GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG; - minWidth = 8; - minHeight = 8; - break; - - case PVR_FORMAT_ETC1: - textureFormat = GL_ETC1_RGB8_OES; - minWidth = 4; - minHeight = 4; - break; - - default: - qWarning("QGLBoundTexture::bindCompressedTexturePVR(): PVR image format 0x%x not supported.", int(pvrHeader->flags & PVR_FORMAT_MASK)); - return false; - } - - // Bail out if the necessary extension is not present. - if (textureFormat == GL_ETC1_RGB8_OES) { - if (!extensions->etc1TextureCompression) { - qWarning("QGLBoundTexture::bindCompressedTexturePVR(): ETC1 texture compression is not supported."); - return false; - } - } else { - if (!extensions->pvrtcTextureCompression) { - qWarning("QGLBoundTexture::bindCompressedTexturePVR(): PVRTC texture compression is not supported."); - return false; - } - } - - // Boundary check on the buffer size. - quint32 bufferSize = pvrHeader->headerSize + pvrHeader->dataSize; - if (bufferSize > quint32(len)) { - qWarning("QGLBoundTexture::bindCompressedTexturePVR(): PVR image size is not valid."); - return false; - } - - // Create the texture. - glPixelStorei(GL_UNPACK_ALIGNMENT, 1); - GLuint id = m_guard.id(); - if (id) { - glBindTexture(GL_TEXTURE_2D, 0); // Just in case it is bound. - glDeleteTextures(1, &id); - } - glGenTextures(1, &id); - glBindTexture(GL_TEXTURE_2D, id); - if (pvrHeader->mipMapCount) { - if ((m_options & QGLContext::LinearFilteringBindOption) != 0) { - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); - } else { - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST); - } - } else if ((m_options & QGLContext::LinearFilteringBindOption) != 0) { - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - } else { - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - } - - // Load the compressed mipmap levels. - const GLubyte *buffer = - reinterpret_cast(buf + pvrHeader->headerSize); - bufferSize = pvrHeader->dataSize; - quint32 level = 0; - quint32 width = pvrHeader->width; - quint32 height = pvrHeader->height; - while (bufferSize > 0 && level <= pvrHeader->mipMapCount) { - quint32 size = - (qMax(width, minWidth) * qMax(height, minHeight) * - pvrHeader->bitsPerPixel) / 8; - if (size > bufferSize) - break; - extensions->compressedTexImage2D - (GL_TEXTURE_2D, GLint(level), textureFormat, - GLsizei(width), GLsizei(height), 0, GLsizei(size), buffer); - width /= 2; - height /= 2; - buffer += size; - ++level; - } - - // Restore the default pixel alignment for later texture uploads. - glPixelStorei(GL_UNPACK_ALIGNMENT, 4); - - // Set the invert flag for the texture. The "vertical flip" - // flag in PVR is the opposite sense to our sense of inversion. - if ((pvrHeader->flags & PVR_VERTICAL_FLIP) != 0) - m_options &= ~QGLContext::InvertedYBindOption; - else - m_options |= QGLContext::InvertedYBindOption; - - m_size = QSize(pvrHeader->width, pvrHeader->height); - m_hasAlpha = (pvrHeader->alphaMask != 0); - return true; -} - -QT_END_NAMESPACE diff --git a/src/scenegraph/3d/qgltextureutils_p.h b/src/scenegraph/3d/qgltextureutils_p.h deleted file mode 100644 index b69501f..0000000 --- a/src/scenegraph/3d/qgltextureutils_p.h +++ /dev/null @@ -1,165 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the Qt scene graph research project. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the Technology Preview License Agreement accompanying -** this package. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QGLTEXTUREUTILS_P_H -#define QGLTEXTUREUTILS_P_H - -// -// W A R N I N G -// ------------- -// -// This file is not part of the Qt API. It exists purely as an -// implementation detail. This header file may change from version to -// version without notice, or even be removed. -// -// We mean it. -// - -#include -#include -#include -#include "qglnamespace.h" - -QT_BEGIN_NAMESPACE - -#ifndef GL_BGRA -#define GL_BGRA 0x80E1 -#endif -#ifndef GL_UNSIGNED_SHORT_5_6_5 -#define GL_UNSIGNED_SHORT_5_6_5 0x8363 -#endif -#ifndef GL_UNSIGNED_INT_8_8_8_8_REV -#define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367 -#endif -#ifndef GL_TEXTURE_CUBE_MAP -#define GL_TEXTURE_CUBE_MAP 0x8513 -#endif -#ifndef GL_TEXTURE_CUBE_MAP_POSITIVE_X -#define GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515 -#endif -#ifndef GL_TEXTURE_CUBE_MAP_NEGATIVE_Z -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A -#endif - -#ifndef GL_GENERATE_MIPMAP_SGIS -#define GL_GENERATE_MIPMAP_SGIS 0x8191 -#define GL_GENERATE_MIPMAP_HINT_SGIS 0x8192 -#endif - -#if !defined(QT_OPENGL_ES) -#define q_glTexParameteri(target,name,value) \ - glTexParameteri((target), (name), int(value)) -#else -#define q_glTexParameteri(target,name,value) \ - glTexParameterf((target), (name), GLfloat(int(value))) -#endif - -// returns the highest number closest to v, which is a power of 2 -// NB! assumes 32 bit ints -int qt_gl_next_power_of_two(int v); - -// Modify a wrapping mode to account for platform differences. -QGL::TextureWrap qt_gl_modify_texture_wrap(QGL::TextureWrap value); - -typedef void (APIENTRY *q_glCompressedTexImage2DARB) - (GLenum, GLint, GLenum, GLsizei, GLsizei, GLint, GLsizei, const GLvoid *); - -class QGLTextureExtensions -{ -public: - QGLTextureExtensions(const QGLContext *ctx); - ~QGLTextureExtensions(); - - int npotTextures : 1; - int generateMipmap : 1; - int bgraTextureFormat : 1; - int ddsTextureCompression : 1; - int etc1TextureCompression : 1; - int pvrtcTextureCompression : 1; - q_glCompressedTexImage2DARB compressedTexImage2D; - - static QGLTextureExtensions *extensions(); -}; - -class QGLBoundTexture -{ -public: - QGLBoundTexture(const QGLContext *ctx); - ~QGLBoundTexture(); - - const QGLContext *context() const { return m_guard.context(); } - - GLuint textureId() const { return m_guard.id(); } - void setTextureId(GLuint id) { m_guard.setId(id); } - - QGLContext::BindOptions options() const { return m_options; } - void setOptions(QGLContext::BindOptions options) { m_options = options; } - - QSize size() const { return m_size; } - bool hasAlpha() const { return m_hasAlpha; } - - void startUpload(GLenum target, const QSize &imageSize); - void uploadFace(GLenum target, const QImage &image, const QSize &scaleSize, - GLenum format = GL_RGBA); - void createFace(GLenum target, const QSize &size, GLenum format = GL_RGBA); - void finishUpload(GLenum target); - - static bool canBindCompressedTexture - (const char *buf, int len, const char *format, bool *hasAlpha, - bool *isFlipped); - bool bindCompressedTexture - (const QString& fileName, const char *format = 0); - bool bindCompressedTexture - (const char *buf, int len, const char *format = 0); - bool bindCompressedTextureDDS(const char *buf, int len); - bool bindCompressedTexturePVR(const char *buf, int len); - -private: - QGLSharedResourceGuard m_guard; - QGLContext::BindOptions m_options; - QSize m_size; - bool m_hasAlpha; - QTime time; -}; - -QT_END_NAMESPACE - -#endif diff --git a/src/scenegraph/convenience/texturematerial.cpp b/src/scenegraph/convenience/texturematerial.cpp index cfb756e..021d4b1 100644 --- a/src/scenegraph/convenience/texturematerial.cpp +++ b/src/scenegraph/convenience/texturematerial.cpp @@ -42,7 +42,6 @@ #include "texturematerial.h" #include -#include const char qt_scenegraph_texture_material_vertex_code[] = "uniform highp mat4 qt_Matrix; \n" diff --git a/src/scenegraph/convenience/utilities.cpp b/src/scenegraph/convenience/utilities.cpp index 82017f9..403f97c 100644 --- a/src/scenegraph/convenience/utilities.cpp +++ b/src/scenegraph/convenience/utilities.cpp @@ -43,7 +43,6 @@ #include "geometry.h" #include "flatcolormaterial.h" #include "vertexcolormaterial.h" -#include "qgltexture2d_p.h" #include #include diff --git a/src/scenegraph/convenience/utilities.h b/src/scenegraph/convenience/utilities.h index ff323eb..f698136 100644 --- a/src/scenegraph/convenience/utilities.h +++ b/src/scenegraph/convenience/utilities.h @@ -42,7 +42,6 @@ #ifndef UTILITIES_H #define UTILITIES_H -#include "qgltexture2d.h" #include "areaallocator.h" #include "adaptationlayer.h" diff --git a/src/scenegraph/coreapi/node.cpp b/src/scenegraph/coreapi/node.cpp index 3c3e3dc..9377dbd 100644 --- a/src/scenegraph/coreapi/node.cpp +++ b/src/scenegraph/coreapi/node.cpp @@ -40,7 +40,6 @@ ****************************************************************************/ #include "node.h" -#include #include "renderer.h" #include "nodeupdater_p.h" #include "material.h" diff --git a/src/scenegraph/coreapi/renderer.h b/src/scenegraph/coreapi/renderer.h index b62528e..2f80277 100644 --- a/src/scenegraph/coreapi/renderer.h +++ b/src/scenegraph/coreapi/renderer.h @@ -45,7 +45,6 @@ #include #include -#include #include #include diff --git a/src/scenegraph/scenegraph.pri b/src/scenegraph/scenegraph.pri index 82cdcfc..80514c8 100644 --- a/src/scenegraph/scenegraph.pri +++ b/src/scenegraph/scenegraph.pri @@ -38,13 +38,11 @@ SOURCES += $$PWD/convenience/areaallocator.cpp \ # 3D API (duplicates with qt3d) -HEADERS += $$PWD/3d/qglnamespace.h \ +HEADERS += \ + $$PWD/3d/qglnamespace.h \ $$PWD/3d/qt3dglobal.h \ $$PWD/3d/qglattributedescription.h \ $$PWD/3d/qglattributevalue.h \ - $$PWD/3d/qgltexture2d.h \ - $$PWD/3d/qgltexture2d_p.h \ - $$PWD/3d/qgltextureutils_p.h \ $$PWD/3d/qmatrix4x4stack.h \ $$PWD/3d/qmatrix4x4stack_p.h \ $$PWD/3d/qarray.h \ @@ -52,9 +50,8 @@ HEADERS += $$PWD/3d/qglnamespace.h \ $$PWD/3d/qcolor4ub.h \ -SOURCES += $$PWD/3d/qgltexture2d.cpp \ +SOURCES += \ $$PWD/3d/qarray.cpp \ - $$PWD/3d/qgltextureutils.cpp \ $$PWD/3d/qmatrix4x4stack.cpp \ $$PWD/3d/qglattributedescription.cpp \ $$PWD/3d/qglattributevalue.cpp \ -- cgit v1.2.3