diff options
Diffstat (limited to 'src/threed/effects/qglcolladafxeffectfactory.cpp')
-rw-r--r-- | src/threed/effects/qglcolladafxeffectfactory.cpp | 1694 |
1 files changed, 0 insertions, 1694 deletions
diff --git a/src/threed/effects/qglcolladafxeffectfactory.cpp b/src/threed/effects/qglcolladafxeffectfactory.cpp deleted file mode 100644 index 192c2dc0..00000000 --- a/src/threed/effects/qglcolladafxeffectfactory.cpp +++ /dev/null @@ -1,1694 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation ([email protected]) -** -** This file is part of the QtQuick3D module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** 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. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include <QVector> -#include <QFile> -#include <QFileInfo> -#include <QTime> -#include <QDir> -#include "qgltexture2d.h" -#include "qgl.h" - -#include "qglcolladafxeffect.h" -#include "qglcolladafxeffectfactory.h" -//#include "qglcolladafxeffectfactory_p.h" -#include "qglcolladafxeffect_p.h" - -QT_BEGIN_NAMESPACE - -// The QGLColladaFxFactory class creates a list of QGLColladaFx objects from -// COLLADA FX information according to the 1.4.1 March 2008 Release from -// http://www.khronos.org/collada/ - -//#define DEBUG_QGL_COLLADA_PARSING -//#define DEBUG_MATERIALS - -#define INDENT_SIZE 4 - -static int QGLColladaIndentLevel = 0; - -// This is a simple RAII helper class to conveniently indent across -// various functions when building up the collada elements. -// Instantiate an indent to increment the indent level with that scope. -// add an indent object to the beginning of a string to indent it -// the correct amount. -class Indent -{ -public: - static int currentIndent() { return QGLColladaIndentLevel; }; - Indent() - { - ++QGLColladaIndentLevel; - }; - ~Indent() - { - --QGLColladaIndentLevel; - } -}; - -QString operator +(Indent&, QString string) -{ - return QString(QGLColladaIndentLevel * INDENT_SIZE, QLatin1Char(' ')) + string; -} - -QString operator +(char c, Indent&) -{ - return QLatin1Char(c) + QString(QGLColladaIndentLevel * INDENT_SIZE, QLatin1Char(' ')); -} - -// xml convenience function - find the first end tag with the given tagname -// Note that this is not as smart as xml.skipCurrentElement(), and does -// not handle the case where (grand)children node share tagName -// With this caveat, can be called from within any (grand)child node. -static inline void findEndTag( QXmlStreamReader& xml, QString tagName ) -{ - while ( !xml.atEnd() && !( xml.tokenType() == xml.EndElement && xml.name() == tagName)) - { - xml.readNext(); - } -} - - - -/*! - \internal - Convenience function to find parameters in \a resultState that have an id, - sid, or name that is equal to \a stringToMatch - Note that this using this is not in line with the Collada specification, - and that non-unique sids will always return the last parameter parsed. - */ -static inline QVariant findParameterVariant(ResultState* resultState, QString stringToMatch) -{ - QVariant result = resultState->paramSids.value(stringToMatch); - - if ( result.isNull() ) - result = resultState->paramIds.value(stringToMatch); - - if ( result.isNull() ) - result = resultState->paramNames.value(stringToMatch); - - return result; -} - -/*! - Parse a collada 1.4 or 1.5 .dae file \a fileName, find the effects in the - library_effects element, and convert these into a list of QGLColladaFxEffect objects - suitable for use with Qt3D. Specific effects can be identified out of - this list using their sid. - - This is the only function intended to be called from outside this class, e.g.: - - QList<QGLColladaFxEffect*> colladaEffects = QGLColladaFxEffectFactory::loadEffectsFromFile("myColladaFile.dae"); - - \sa QGLColladaFxEffect -*/ -QList<QGLColladaFxEffect*> QGLColladaFxEffectFactory::loadEffectsFromFile( const QString& fileName ) -{ - QFile file( fileName ); - if ( !file.open( QIODevice::ReadOnly )) - { - qWarning() << "Warning: QGLColladaFxEffect failed to open file" << fileName; - return QList<QGLColladaFxEffect*>(); - } - - - QXmlStreamReader xml; - xml.setDevice( &file ); - if (xml.tokenType() == QXmlStreamReader::Invalid) - file.readLine(); - xml.setDevice( &file ); - - QFileInfo fileInfo(file); - - return loadEffectsFromXml( xml, fileInfo.dir() ); -} - - - -QString QGLColladaFxEffectFactory::exportEffect(QGLColladaFxEffect *effect, QString effectId, QString techniqueSid) -{ - QStringList result; - - result += QLatin1String("<?xml version=\"1.0\"?>"); - - result += QLatin1String("<COLLADA "\ - "xmlns=\"http://www.collada.org/2005/11/COLLADASchema/" version=\"1.5.0\" >"); - - { - Indent indent; - result += indent + QLatin1String("<asset>"); - { - Indent indent; - QDateTime time = QDateTime::currentDateTime(); - result += indent + QLatin1String("<created>") + time.toString(Qt::ISODate) + QLatin1String("</created>"); - result += indent + QLatin1String("<modified>") + time.toString(Qt::ISODate) + QLatin1String("</modified>"); - } - result += indent + QLatin1String("</asset>"); - - result += indent + QLatin1String("<library_effects>"); - { - Indent indent; - result += indent + QLatin1String("<effect id=\"") + effectId + QLatin1String("\">"); - result += glslProfileFromEffect(effect, techniqueSid); - result += indent + QLatin1String("</effect>"); - } - result += indent + QLatin1String("</library_effects>"); - result += QLatin1String("</COLLADA>"); - return result.join(QLatin1String("\n")); - } -} - - -/*! - \internal - parse the top level \a xml from a .dae file and process the library_effects elements therein. -*/ -QList<QGLColladaFxEffect*> QGLColladaFxEffectFactory::loadEffectsFromXml( QXmlStreamReader& xml, QDir homeDirectory ) -{ - ResultState resultState; - resultState.sourceDir = homeDirectory; - QList<QGLColladaFxEffect*> result; - - while ( !xml.atEnd() ) { - xml.readNextStartElement(); - if ( xml.name() == "library_effects" ) { - result += processLibraryEffectsElement( xml , &resultState ); - } else if (xml.name() == "library_images") - { - processLibraryImagesElement( xml, &resultState ); - } - } - - // Try and resolve outstanding textures - QList<QGLTexture2D*> unresolvedTexturePointers = resultState.unresolvedTexture2Ds.keys(); - for (int i = 0; i < unresolvedTexturePointers.count(); i++) - { - QGLTexture2D* texture = unresolvedTexturePointers[i]; - QString parameterName = resultState.unresolvedTexture2Ds.value(texture); - resolveTexture2DImage(texture, &resultState, parameterName); - } - return result; -} - - - -QGLColladaParam::~QGLColladaParam() -{ - -} - - - -/*! - \internal -*/ -int QGLColladaParam::type() -{ - return mType; -} - - - -/*! - \internal -*/ -QString QGLColladaParam::sid() -{ - return mSid; -} - - - -/*! - \internal -*/ -QVector<float> QGLColladaParam::value() { - return mValue; -} - - - -/*! - \internal -*/ -QGLColladaParam::QGLColladaParam(QString sid, int type) : mSid(sid) - , mType(type) -{ -} - - - -/*! - \internal -*/ -QString QGLColladaParam::id() -{ - return mId; -} - - - -/*! - \internal -*/ -QString QGLColladaParam::typeString(int type) -{ - const char* typeStringArray[] = { - "UnkownType", - "Sampler2DType", - "Texture2DType", - "SurfaceType", - "ImageType"}; - - if (type >= UserDefinedType) - return QLatin1String("UserDefinedType"); - else if ( type < 0 || type > ImageType) - return QLatin1String("Unrecognized Type"); - else - return QLatin1String(typeStringArray[type]); -} - - - -/*! - \internal -*/ -QGLColladaTextureParam::QGLColladaTextureParam(QString sid, QGLTexture2D* texture) : QGLColladaParam(sid, Texture2DType) -{ - mTexture = texture; -} - - - -/*! - \internal -*/ -QGLTexture2D* QGLColladaTextureParam::texture() -{ - Q_ASSERT( mType == Sampler2DType || mType == Texture2DType); - return mTexture; -} - - - -/*! - \internal -*/ -QString QGLColladaTextureParam::samplerSid() -{ - return sampler2DSid; -} - - - -/*! - \internal -*/ -QGLColladaFxEffectFactory::QGLColladaFxEffectFactory() -{ -} - - - -/*! - \internal -*/ -QGLColladaSampler2DParam::QGLColladaSampler2DParam(QString sid, QGLTexture2D* texture) - : QGLColladaParam(sid, QGLColladaParam::Sampler2DType) - , mTexture(texture) -{ -} - - - -/*! - \internal -*/ -QGLColladaSampler2DParam::QGLColladaSampler2DParam(QString sid, QString sourceSid) - : QGLColladaParam(sid, QGLColladaParam::Sampler2DType) - , mTexture(0) - , mSourceSid(sourceSid) -{ -} - - - -/*! - \internal -*/ -QString QGLColladaSampler2DParam::sourceSid() -{ - return mSourceSid; -} - - - -/*! - \internal -*/ -QGLColladaSurfaceParam::QGLColladaSurfaceParam(QString sid) : QGLColladaParam(sid, QGLColladaParam::SurfaceType) - , mInitFrom() - , mFormat() - , mFormatHint() - , mSize() - , mSizeVector( 3, 0 ) - , mViewportRatio( 1.0, 1.0 ) - , mMipLevels( 0 ) - , mMipMapGenerate( false ) - , mExtra() - , mGenerator() -{ -} - - - -/*! - \internal -*/ -QGLColladaImageParam::QGLColladaImageParam(QString sid, QImage image) - : QGLColladaParam(sid, QGLColladaParam::ImageType) - , mImage(image) -{ -} - - - -/*! - \internal -*/ -QImage QGLColladaImageParam::image() -{ - return mImage; -} - - - -/*! - \internal -*/ -QString QGLColladaImageParam::name() -{ - return mName; -} - - - -/*! - \internal -*/ -QGLColladaSurfaceParam* QGLColladaFxEffectFactory::processSurfaceElement( QXmlStreamReader& xml , ResultState* resultState, QString passedInSid) -{ - Q_UNUSED(resultState); - QXmlStreamAttributes attributes = xml.attributes(); - QString surfaceSid = attributes.value(QLatin1String("sid")).toString(); - // Surfaces are the only children of a newparam, but don't have their own - // sids. For simplicity, use the parent's sid. - - if (surfaceSid.isEmpty() && !passedInSid.isEmpty()) - surfaceSid = passedInSid; - QGLColladaSurfaceParam* result = new QGLColladaSurfaceParam( surfaceSid ); - xml.readNextStartElement(); - if ( xml.name().toString().left(4) == QLatin1String("init") ) - { - if (xml.name().toString() != QLatin1String("init_from")) - qWarning() << "Warning: only ""init_from"" supported in surface element ( line:" << xml.lineNumber() << ")"; - QString init_from = xml.readElementText(); - result->mInitFrom = init_from; - resultState->paramSids[surfaceSid] = init_from; - } - return result; -} - - - -/*! - \internal - Processes a list of floating point numbers. If the list contains only 1 - element, a QVariant<float> is returned. If the list containst 2, 3 or 4 - elements, they are converted into a QVariant containing a QVector2D, - QVector3D, or QVector4D respectively. - If the list containst more elements than that, they are returned as a - QArray<float>. - -*/ -QVariant QGLColladaFxEffectFactory::processFloatList( QXmlStreamReader& xml ) -{ - QArray<float> floats; - QString elementString = xml.readElementText(); - QStringList list = elementString.split( QRegExp( QLatin1String("\\s+") ), QString::SkipEmptyParts ); - bool ok; - float f; - foreach ( QString string, list ) - { - f = string.toFloat( &ok ); - if ( ok ) - floats.append(string.toFloat()); - else - { - qWarning() << "Warning: malformed float ( line" << xml.lineNumber() << ")"; - } - } - - switch(floats.count()) - { - case 0: - return QVariant(); - // no break necessary - case 1: - return QVariant(floats[0]); - // no break necessary - case 2: - return QVariant(QVector2D(floats[0], floats[1])); - // no break necessary - case 3: - return QVariant(QVector3D(floats[0], floats[1], floats[2])); - // no break necessary - case 4: - return QVariant(QVector4D(floats[0], floats[1], floats[2], floats[3])); - // no break necessary - default: - { - QVariant result; - result.setValue(floats); - return result; - } - } - // Function should always return out of switch statement -} - - - -/*! - \internal -*/ -void QGLColladaFxEffectFactory::processSampler2DElement( QXmlStreamReader& xml, ResultState* resultState, QString passedInSid ) -{ - Q_UNUSED(resultState); - QXmlStreamAttributes attributes = xml.attributes(); - QString sid = attributes.value(QLatin1String("sid")).toString(); - if (sid.isEmpty() && !passedInSid.isEmpty()) - { - sid = passedInSid; - } - - xml.readNextStartElement(); - if ( xml.name() == QLatin1String("source")) - { - // Collada 1.4 Spec - QString sourceSurfaceSid = xml.readElementText().trimmed(); - resultState->paramSids[sid] = sourceSurfaceSid; - } - - if ( xml.name() == QLatin1String("instance_image") ) - { - // Collada 1.5 Spec - qWarning() << "collada 1.5 sampler elements not supported ( line:" << xml.lineNumber() << ")"; - } - // exit cleanly, just in case. - findEndTag( xml, QLatin1String("sampler2D")); - return; -} - - - -/*! - \internal - Parses and consumes a color collada element from \a xml. -*/ -QColor QGLColladaFxEffectFactory::processColorElement( QXmlStreamReader& xml ) -{ - QVariant floatList = processFloatList( xml ); - - QColor result( 0, 0, 0, 255 ); - if (floatList.type() == QVariant::Vector3D) - { - QVector3D vector3D = floatList.value<QVector3D>(); - if ( !vector3D.isNull()) - { - result.setRgbF( vector3D.x() - , vector3D.y() - , vector3D.z() - , 1.0 ); - return result; - } - } - else if (floatList.type() == QVariant::Vector4D) - { - QVector4D vector4D = floatList.value<QVector4D>(); - if (!vector4D.isNull()) - { - result.setRgbF( vector4D.x() - , vector4D.y() - , vector4D.z() - , vector4D.w() ); - return result; - } - } - qWarning() << "Warning: Malformed color element ( line" << xml.lineNumber() << ")"; - return result; -} - - - -/*! - \internal - Parses and consumes an fx_common_color_or_texture_type collada element from \a xml. -*/ -QVariant QGLColladaFxEffectFactory::processColorOrTextureElement( QXmlStreamReader& xml ) -{ - if ( xml.name() == QLatin1String("color")) - { - return processColorElement( xml ); - } else if ( xml.name() == QLatin1String("texture") ) - { - qWarning() << "Warning: texture element not supported ( line" << xml.lineNumber()<<")"; - } else - { - qWarning() << "Color or Texture expected ( line" << xml.lineNumber() << ")"; - } - xml.skipCurrentElement(); - return( QColor( 0, 0, 0,255 )); -} - - - -/*! - \internal - Parses an fx_common_float_or_param_type collada element from \a xml. - Always consumes the element. -*/ -float QGLColladaFxEffectFactory::processParamOrFloatElement( QXmlStreamReader& xml ) -{ - if ( xml.name() == QLatin1String("param") ) - { - qWarning() << "Warning: params not supported ( line" << xml.lineNumber() << ")"; - xml.skipCurrentElement(); - return 0.0; - } else - { - return xml.readElementText().toFloat(); - } -} - - - -/*! - Parses and consumes a library_images collada element pointed to by \a xml, - and pushes any images found onto the \a resultState for use in resolving - elements later. -*/ -void QGLColladaFxEffectFactory::processLibraryImagesElement( QXmlStreamReader& xml, ResultState* resultState ) -{ - xml.readNextStartElement(); - - if ( xml.name() == QLatin1String("asset") ) - { - qWarning() << "Warning: effect asset handling not supported in library_images element ( line" << xml.lineNumber() << ")"; - xml.skipCurrentElement(); - xml.readNextStartElement(); - } - - while ( xml.name() == QLatin1String("image") && xml.tokenType() == QXmlStreamReader::StartElement ) - { - processImageElement( xml , resultState ); - xml.skipCurrentElement(); - xml.readNextStartElement(); - } -} - - -/*! - \internal -*/ -QList<QGLColladaFxEffect*> QGLColladaFxEffectFactory::processLibraryEffectsElement( QXmlStreamReader& xml, ResultState* resultState ) -{ - QList<QGLColladaFxEffect*> result; - // A collada library_effects is - // 0 or 1 <asset> - // 1 or more <effect>, - // 0 or more <extra>; - xml.readNextStartElement(); - - if ( xml.name() == QLatin1String("asset") ) - { - qWarning() << "Warning: effect asset handling not supported in effects library ( line" << xml.lineNumber() << ")"; - xml.skipCurrentElement(); - xml.readNextStartElement(); - } - - while ( xml.name() == QLatin1String("effect") && xml.tokenType() == QXmlStreamReader::StartElement ) - { - result += processEffectElement( xml , resultState ); - xml.readNextStartElement(); - } - - while ( xml.name() == QLatin1String("extra") ) - { - qWarning() << "Warning: extra element not handled in effects library ( line" << xml.lineNumber() << ")"; - xml.readNextStartElement(); - } - - // be sure to exit cleanly - findEndTag(xml, QLatin1String("library_effects")); - return result; -} - - - -/*! - \internal - Parses and consumes an effect element from \a xml. -*/ -QList<QGLColladaFxEffect*> QGLColladaFxEffectFactory::processEffectElement( QXmlStreamReader& xml, ResultState* resultState ) -{ - // An effect element is: - // 0 or 1 <annotate> - // 0 or more newparam - // 1 or more profile ( either <profile_BRIDGE>, <profile_CG>, <profile_GLES>, <profile_GLES2>, <profile_GLSL>, or <profile_COMMON> - // 0 or more <extra> - - QList<QGLColladaFxEffect*> result; - xml.readNextStartElement(); - - if ( xml.name() == QLatin1String("annotate") ) - { - qWarning() << "effect annotation not supported ( line" << xml.lineNumber() << ")"; - xml.skipCurrentElement(); - xml.readNextStartElement(); - } - - while ( xml.name() == QLatin1String("newparam") && xml.tokenType() == QXmlStreamReader::StartElement ) - { - processNewparamElement( xml , resultState ); - xml.readNextStartElement(); - } - - // find any of the profile_* elements defined in the spec - QRegExp profileRegExp( QLatin1String("profile_(BRIDGE|CG|GLES2?|GLSL|COMMON)") ); - while ( profileRegExp.indexIn( xml.name().toString() ) == 0 && xml.tokenType() == QXmlStreamReader::StartElement ) - { - result += processProfileElement( xml, resultState ); - xml.readNextStartElement(); - } - - findEndTag(xml, QLatin1String("effect")); - return result; -} - - - -/*! - \internal -*/ -QList<QGLColladaFxEffect*> QGLColladaFxEffectFactory::processProfileElement( QXmlStreamReader& xml, ResultState* resultState ) -{ - // A profile_GLES2 element is: - // 0 or 1 <asset> - // 0 or more <code> or <include> - // 0 or more <newparam> - // 1 or more <technique> - - // A profile_GLSL element is: - // 0 or 1 <asset> - // 0 or more <code> - // 0 or more <include> - // 0 or more <newparam> - // 1 or more <technique> - // 0 or more <extra> - - // A profile_COMMON element is - // an optional id element - // 0 or 1 <asset> - // 0 or more <newparam> - // 1 <technique> - // 0 or more <extra> - - // Note: techniques need to be handled differently for different profiles - - QString rootNodeString = xml.name().toString(); - QList<QGLColladaFxEffect*> result; - - xml.readNextStartElement(); - if ( xml.name() == QLatin1String("asset") ) - { - qWarning() << "Warning: asset element not supported in " << rootNodeString << "elements ( line" << xml.lineNumber() << ")"; - xml.skipCurrentElement(); - xml.readNextStartElement(); - } - - if (rootNodeString == QLatin1String("profile_GLSL")) - { - while ( xml.name() == QLatin1String("code") ) - { - QString codeSid = xml.attributes().value(QLatin1String("sid")).toString(); - QString codeText = xml.readElementText(); - resultState->paramSids[codeSid] = codeText; - - findEndTag(xml, QLatin1String("code")); - xml.readNextStartElement(); - } - - while ( xml.name() == QLatin1String("include") ) - { - QString includeSid = xml.attributes().value(QLatin1String("sid")).toString(); - QString includeUrl = xml.attributes().value(QLatin1String("url")).toString(); - - // create an include param? - qWarning() << "Warning: include element not supported in " << rootNodeString << "elements ( line" << xml.lineNumber() << ")"; - - findEndTag(xml, QLatin1String("include")); - xml.readNextStartElement(); - } - - } - - while ( xml.tokenType() == QXmlStreamReader::StartElement && - ( xml.name() == QLatin1String("newparam") || xml.name() == QLatin1String("image") )) - { - if ( xml.name() == QLatin1String("newparam") ) - processNewparamElement( xml , resultState ); - else if ( xml.name() == QLatin1String("image") ) - processImageElement( xml , resultState ); - - xml.readNextStartElement(); - } - - - while ( xml.name() == QLatin1String("technique") ) - { - result.append( - processTechniqueElement( xml, resultState, rootNodeString )); - xml.readNextStartElement(); - // only 1 technique in profile_COMMON - if ( rootNodeString == QLatin1String("profile_COMMON")) - { - break; - } - }; - - while ( xml.name() == QLatin1String("extra") ) - { - qWarning() << "extra elements currently not supported in " << rootNodeString << "elements ( line" << xml.lineNumber() << ")"; - findEndTag( xml, QLatin1String("extra") ); - xml.readNextStartElement(); - }; - - findEndTag( xml, rootNodeString ); - return result; -} - - -QGLColladaParam* QGLColladaFxEffectFactory::processPassElement( QXmlStreamReader& xml, ResultState* resultState, QGLColladaFxEffect* effect ) -{ - QGLColladaParam* result = 0; - // a profile_GLSL pass is: - // 0 or 1 <annotate> - // 0 or 1 <states> - // 0 or 1 <program> (CG, GLES2 or GLSL only) - // 0 or 1 <evaluate> - // 0 or 1 <extra> - - xml.readNextStartElement(); - - if ( xml.name() == QLatin1String("annotate") ) - { - qWarning() << "Warning: annotate element not supported ( line" << xml.lineNumber() << ")"; - findEndTag( xml, QLatin1String("annotate") ); - xml.readNextStartElement(); - } - - if ( xml.name() == QLatin1String("states") ) - { - qWarning() << "Warning: states element not supported ( line" << xml.lineNumber() << ")"; - findEndTag( xml, QLatin1String("states") ); - xml.readNextStartElement(); - } - - // 0 or 1 <program> (CG, GLES2 or GLSL only) - if ( xml.name() == QLatin1String("program") ) - { - processProgramElement( xml, resultState, effect ); - findEndTag( xml, QLatin1String("program") ); - xml.readNextStartElement(); - } - - // 0 or 1 <evaluate> - if ( xml.name() == QLatin1String("evaluate") ) - { - qWarning() << "Warning: evaluate element not supported ( line" << xml.lineNumber() << ")"; - findEndTag( xml, QLatin1String("evaluate") ); - xml.readNextStartElement(); - } - - // 0 or more <extra> - while ( xml.name() == QLatin1String("extra") ) - { - qWarning() << "Warning: extra element not supported ( line" << xml.lineNumber() << ")"; - findEndTag( xml, QLatin1String("extra") ); - xml.readNextStartElement(); - } - - findEndTag( xml, QLatin1String("pass")); - return result; -} - -QGLColladaFxEffect* QGLColladaFxEffectFactory::processTechniqueElement( QXmlStreamReader& xml, ResultState* resultState, QString &profileName ) -{ - // A 1.4 technique is: - // 0 or 1 <asset> - // 0 or more <newparam> or <image> (in any order) - // 0 or more of <constant>, <lambert>, <phong>, <blinn> - // 0 or more <extra> - - // A 1.5 profile_COMMON technique is: - // 0 or 1 <asset> - // exactly 1 of <blinn>, <constant>, <lambert>, or <phong> - // 0 or more <extra> - - // a profile_GLSL technique is: - // 0 or 1 <asset> - // 0 or more <annotate> - // 1 or more <pass> - // 0 or more <extra> - - QGLColladaFxEffect* effect = new QGLColladaFxEffect(); - - QXmlStreamAttributes attributes = xml.attributes(); - effect->setSid( attributes.value( QLatin1String("sid") ).toString() ); - QStringRef id = attributes.value( QLatin1String("id") ); - Q_UNUSED( id ); - - xml.readNextStartElement(); - - if ( xml.name() == QLatin1String("asset") ) - { - qWarning() << "Warning: asset element not supported ( line" << xml.lineNumber() << ")"; - xml.skipCurrentElement(); - xml.readNextStartElement(); - } - - while ( xml.name() == QLatin1String("annotate") && xml.tokenType() == QXmlStreamReader::StartElement ) - { - qWarning() << "Warning: annotate element not supported ( line" << xml.lineNumber() << ")"; - xml.skipCurrentElement(); - xml.readNextStartElement(); - } - - // Collada specifies exactly one of blinn, lambert, constant or phong - // If the effect is malformed, default QGLMaterial will be used. - QGLMaterial* material = new QGLMaterial; - - if ( profileName == QLatin1String("profile_COMMON") && - (xml.name() == QLatin1String("blinn") || xml.name() == QLatin1String("phong") || - xml.name() == QLatin1String("constant") || xml.name() == QLatin1String("lambert")) ) - { - if ( xml.name() == QLatin1String("blinn") ) - { - effect->setLighting( QGLColladaFxEffect::BlinnLighting ); - } else if ( xml.name() == QLatin1String("phong") ) { - effect->setLighting( QGLColladaFxEffect::PhongLighting ); - } else if ( xml.name() == QLatin1String("constant") ) { - effect->setLighting( QGLColladaFxEffect::ConstantLighting ); - } else if ( xml.name() == QLatin1String("lambert") ) { - effect->setLighting( QGLColladaFxEffect::LambertLighting ); - } - - // TODO: get appropriate shader fragments for the specified lighting models - if ( xml.readNextStartElement() ) - { - // a blinn element is 0 or 1 of each of: - // <emission> - // <diffuse> - // <specular> - // <shininess> - // <reflectivity> - // <transparent> - // <transparency> - // <index_of_refraction> - - if ( xml.name() == QLatin1String("emission") ) - { - if ( xml.readNextStartElement() ) - { - // handle color or texture element: - if (xml.name() == QLatin1String("color")) - { - material->setEmittedLight( processColorElement( xml )); -#ifdef DEBUG_MATERIALS - qDebug() << "set emitted light to " << material->emittedLight(); -#endif - } - else if ( xml.name() == QLatin1String("texture")) - { - effect->d->emissiveTexture = processTextureElement( xml, resultState ); -#ifdef DEBUG_MATERIALS - qDebug() << "set emissive texture to " << effect->d->emissiveTexture; -#endif - } else if ( xml.name() == QLatin1String("param")) - { - qWarning() << "params not supported in lighting elements ( line" << xml.lineNumber() << ")"; - } - } - xml.skipCurrentElement(); - xml.readNextStartElement(); - } - - if ( xml.name() == QLatin1String("ambient") ) - { - if ( xml.readNextStartElement() ) - { - // handle color or texture element: - if (xml.name() == QLatin1String("color")) - { - material->setAmbientColor( processColorElement( xml )); -#ifdef DEBUG_MATERIALS - qDebug() << "set ambient color to " << material->ambientColor(); -#endif - } - else if ( xml.name() == QLatin1String("texture")) - { - effect->d->ambientTexture = processTextureElement( xml, resultState ); -#ifdef DEBUG_MATERIALS - qDebug() << "set ambient texture to " << effect->d->ambientTexture; -#endif - } else if ( xml.name() == QLatin1String("param")) - { - qWarning() << "params not supported in lighting elements ( line" << xml.lineNumber() << ")"; - } - } - xml.skipCurrentElement(); - xml.readNextStartElement(); - } - - if ( xml.name() == QLatin1String("diffuse") ) - { - if ( xml.readNextStartElement() ) - { - // handle color or texture element: - if (xml.name() == QLatin1String("color")) - { - material->setDiffuseColor( processColorElement( xml )); -#ifdef DEBUG_MATERIALS - qDebug() << "set diffuse color to " << material->diffuseColor(); -#endif - } - else if ( xml.name() == QLatin1String("texture")) - { - effect->d->diffuseTexture = processTextureElement( xml, resultState ); -#ifdef DEBUG_MATERIALS - qDebug() << "set diffuse texture to " << effect->d->diffuseTexture; -#endif - } else if ( xml.name() == QLatin1String("param")) - { - qWarning() << "params not supported in lighting elements ( line" << xml.lineNumber() << ")"; - } - } - xml.skipCurrentElement(); - xml.readNextStartElement(); - } - - if ( xml.name() == QLatin1String("specular") ) - { - if ( xml.readNextStartElement() ) - { - // handle color or texture element: - if (xml.name() == QLatin1String("color")) - { - material->setSpecularColor( processColorElement( xml )); -#ifdef DEBUG_MATERIALS - qDebug() << "set specular color to " << material->specularColor(); -#endif - } - else if ( xml.name() == QLatin1String("texture")) - { - effect->d->specularTexture = processTextureElement( xml, resultState ); -#ifdef DEBUG_MATERIALS - qDebug() << "set specular texture to " << effect->d->specularTexture; -#endif - } else if ( xml.name() == QLatin1String("param")) - { - qWarning() << "params not supported in lighting elements ( line" << xml.lineNumber() << ")"; - } - } - xml.skipCurrentElement(); - xml.readNextStartElement(); - } - - if ( xml.name() == QLatin1String("shininess") ) - { - if ( xml.readNextStartElement() ) - { - float shininess = processParamOrFloatElement( xml ); - if ( 0.0 < shininess && shininess < 1.0 ) - { - qWarning() << "Warning: Blinn-Torrance-Sparrow specular lighting not suported ( line" << xml.lineNumber() - << "), converting to Blinn-Phong specular model"; - material->setShininess( int( shininess * 128.0 )); - } - else - material->setShininess( int( shininess ) ); -#ifdef DEBUG_MATERIALS - qDebug() << "set shininess to " << material->shininess(); -#endif - } - xml.skipCurrentElement(); - xml.readNextStartElement(); - } - - if ( xml.name() == QLatin1String("reflective") ) - { - qWarning() << "Warning reflective not supported ( line" << xml.lineNumber() << ")"; - xml.skipCurrentElement(); - xml.readNextStartElement(); - } - - if ( xml.name() == QLatin1String("reflectivity") ) - { - qWarning() << "Warning: reflectivity not supported ( line" << xml.lineNumber() << ")"; - xml.skipCurrentElement(); - xml.readNextStartElement(); - } - - if ( xml.name() == QLatin1String("transparent") ) - { - if ( xml.readNextStartElement() ) - { - if (xml.name() == QLatin1String("texture")) - { - QGLTexture2D* transparentTexture = processTextureElement( xml , resultState ); - Q_UNUSED(transparentTexture); - qWarning() << "Warning: transparent not supported ( line" << xml.lineNumber() << ")"; -#ifdef DEBUG_MATERIALS - qDebug() << "unused transparent texture" << transparentTexture; -#endif - } - else if (xml.name() == QLatin1String("color")) - { - QColor transparent = processColorElement( xml ); - Q_UNUSED( transparent ); - qWarning() << "Warning: transparent not supported ( line" << xml.lineNumber() << ")"; -#ifdef DEBUG_MATERIALS - qDebug() << "unused transparent color of " << transparent; -#endif - } - } - xml.skipCurrentElement(); - xml.readNextStartElement(); - } - - if ( xml.name() == QLatin1String("transparency") ) - { - if ( xml.readNextStartElement() ) - { - float transparency = processParamOrFloatElement( xml ); - if ( transparency < 1.0 ) - { - qWarning() << "Warning: transparency not supported"; - } - xml.skipCurrentElement(); - xml.readNextStartElement(); - } - } - - if ( xml.name() == QLatin1String("index_of_refraction") ) - { - if ( xml.readNextStartElement() ) - { - float indexOfRefraction = processParamOrFloatElement( xml ); - Q_UNUSED( indexOfRefraction ); - qWarning() << "Warning: index_of_refraction not supported ( line" << xml.lineNumber() << ")"; - xml.skipCurrentElement(); - } - xml.skipCurrentElement(); - xml.readNextStartElement(); - } - } - // end of lighting scope - - effect->setMaterial( material ); - - switch(effect->lighting()) - { - case QGLColladaFxEffect::PhongLighting: - case QGLColladaFxEffect::LambertLighting: - qWarning() << "Warning: requested lighting not supported, using Blinn-Phong instead"; - case QGLColladaFxEffect::BlinnLighting: - effect->addBlinnPhongLighting(); - case QGLColladaFxEffect::ConstantLighting: - case QGLColladaFxEffect::NoLighting: - default: - break; - } - }; - - while ( xml.name() == QLatin1String("pass") && xml.tokenType() == QXmlStreamReader::StartElement ) - { - processPassElement( xml, resultState, effect); - xml.skipCurrentElement(); - xml.readNextStartElement(); - } - - // Make sure to exit cleanly - findEndTag( xml, QLatin1String("technique") ); - - return effect; -} - - - -QGLColladaParam* QGLColladaFxEffectFactory::processNewparamElement( QXmlStreamReader& xml, ResultState* resultState) -{ - QXmlStreamAttributes attributes = xml.attributes(); - QString sidString = attributes.value(QLatin1String("sid")).toString(); - QGLColladaParam* result = 0; - if (xml.readNextStartElement()) - { - if (xml.name().toString().left(5) == QLatin1String("float")) - { - - QVariant floatValues = processFloatList( xml ); - resultState->paramSids[sidString] = floatValues; - - if ( xml.name() == QLatin1String("float") - && ( floatValues.type() != - static_cast<QVariant::Type>(QMetaType::Float ))) - { - qWarning() << "Warning: parsed type incorrectly, expected float ( line" << xml.lineNumber() << ")"; - resultState->paramSids[sidString] = floatValues.value<float>(); - } - else if ( xml.name() == QLatin1String("float2") - && floatValues.type() != QVariant::Vector2D ) - { - qWarning() << "Warning: parsed type incorrectly, expected float2 ( line" << xml.lineNumber() << ")"; - } - else if ( xml.name() == QLatin1String("float3") - && floatValues.type() != QVariant::Vector3D ) - { - qWarning() << "Warning: parsed type incorrectly, expected float3 ( line" << xml.lineNumber() << ")"; - } - else if ( xml.name() == QLatin1String("float4") - && floatValues.type() != QVariant::Vector4D) - { - qWarning() << "Warning: parsed type incorrectly, expected float4 ( line" << xml.lineNumber() << ")"; - } - } else if ( xml.name() == QLatin1String("sampler2D") ) - { - processSampler2DElement( xml , resultState, sidString ); - } else if ( xml.name() == QLatin1String("surface") ) - { - result = processSurfaceElement( xml, resultState, sidString); - } else { - qWarning() << "unrecognized parameter type ( line:" << xml.lineNumber() << ")"; - findEndTag( xml, QLatin1String("newparam") ); - return 0; - } - } - findEndTag(xml, QLatin1String("newparam")); - return result; -} - - -/*! - \internal - the library_images can come after the library_effects, so textures referenced - in effects might not have been defined when the effect was created. Try and - resolve those images now. (Other properties - wrap, mipmap and filters etc - should have been resolved when the texture was originally parsed). - */ -bool QGLColladaFxEffectFactory::resolveTexture2DImage(QGLTexture2D *texture, ResultState *resultState, QString paramName) -{ - if (texture == 0) - { - qWarning() << "Warning: Cannot resolve images for null QGLTexture2D"; - return false; - } - QVariant samplerParam = findParameterVariant(resultState, paramName); - QString surfaceName = samplerParam.value<QString>(); - QImage image; - - if (!surfaceName.isEmpty()) - { - QVariant surfaceParam = findParameterVariant(resultState, surfaceName); - QString initFrom = surfaceParam.value<QString>(); - if (!initFrom.isEmpty()) - { - image = resolveImageURI(resultState, initFrom); - } - } - - // If that's failed, try again with the passed in paramName - if (image.isNull()) - { - image = resolveImageURI(resultState, paramName); - } - - texture->setImage(image); - return !image.isNull(); -} - - -QT_END_NAMESPACE - -Q_DECLARE_METATYPE(QGLTexture2D*); - -QT_BEGIN_NAMESPACE -/*! - \internal - Parses and consumes a texture collada element from \a xml. -*/ -QGLTexture2D* QGLColladaFxEffectFactory::processTextureElement( QXmlStreamReader& xml , ResultState* resultState ) -{ - QGLTexture2D* result = new QGLTexture2D(); - QXmlStreamAttributes attributes = xml.attributes(); - - foreach (QXmlStreamAttribute attribute, attributes) - { - if ( attribute.name() == QLatin1String("texture") ) - { - QString paramName = attribute.value().toString(); - - // in Collada Fx Textures must reference a previously defined - // sampler2D param. - // However, this sampler may refer to images in the library_images, - // which is parsed after the library_effects, so try and resolve - // now, but save failures to try again later. - - if (!resolveTexture2DImage(result, resultState, paramName)) - { - resultState->unresolvedTexture2Ds[result] = paramName; - } - } else if ( attribute.name() == QLatin1String("texcoord") ) - { - // TODO: Create a repository for this sort of data, to be used in creating the shader progams later - // I'm pretty sure the effect is going to need to be passed in. - qWarning() << "texcoord not supported yet: " << attribute.name() << attribute.value() << " ( line" << xml.lineNumber() << ")"; - } else if (attribute.name() == QLatin1String("extra")) - { - qWarning() << "extra elements in texture elements not supported ( line" << xml.lineNumber() << ")"; - } - } - xml.skipCurrentElement(); - - return result; -} - -/*! - \internal - Try and get an image to attach to a texture. The URI could be a reference to - a param in the collada document (which may in turn be a reference), or - file referenced either absolutely or relative to the original dae file. - (It could concievably be a web URL, but that is not handled here.) - */ -QImage QGLColladaFxEffectFactory::resolveImageURI(ResultState *resultState, QString URI) -{ - QImage result; - QString imageFileName; - QString workingURI = URI; - if (workingURI.length() > 0 && workingURI.at(0) == QLatin1Char('#')) - { - workingURI = workingURI.right(workingURI.length() - 1); - } - - QVariant potentialParameter = findParameterVariant(resultState, workingURI); - // Might be parameter itself: - if ( !potentialParameter.value<QImage>().isNull() ) - return potentialParameter.value<QImage>(); - // or might be another URI - if (!potentialParameter.value<QString>().isNull()) - { - imageFileName = potentialParameter.value<QString>(); - } else { - imageFileName = workingURI; - } - - // First try as a relative path. - QString filePath = resultState->sourceDir.path() + QLatin1Char('/') + imageFileName; - result.load(filePath); - if (result.isNull()) - { - // No relative file found, so try as an absolute path - result.load(imageFileName); - } - return result; -} - -/*! - \internal - Parses and consumes an image element from \a xml. -*/ -void QGLColladaFxEffectFactory::processImageElement( QXmlStreamReader& xml, ResultState* resultState ) -{ - // 1.4 has a bunch of optional values in the attributes: - QString sid = xml.attributes().value(QLatin1String("sid")).toString(); - QString id = xml.attributes().value(QLatin1String("id")).toString(); - QString name = xml.attributes().value(QLatin1String("name")).toString(); - - QString height = xml.attributes().value(QLatin1String("height")).toString(); - QString width = xml.attributes().value(QLatin1String("width")).toString(); - QString depth = xml.attributes().value(QLatin1String("depth")).toString(); - - Q_UNUSED(height); - Q_UNUSED(width); - Q_UNUSED(depth); - - QImage result; - - xml.readNextStartElement(); - if (xml.name() == QLatin1String("asset")) - { - qWarning() << "asset element not supported in image elements ( line" << xml.lineNumber() << ")"; - xml.skipCurrentElement(); - xml.readNextStartElement(); - } - - if (xml.name() == QLatin1String("init_from")) - { - QString imageFileName = xml.readElementText().trimmed(); - QDir sourceDir = resultState->sourceDir; - // ignore path information for resources - QString filePath = sourceDir.path() + QLatin1Char('/') + imageFileName; - result.load(filePath); - if (result.isNull()) - { - // Catch resources or files with absolute paths - result.load(imageFileName); - } - if (!sid.isEmpty()) - resultState->paramSids[sid] = result; - if (!id.isEmpty()) - resultState->paramIds[id] = result; - if (!name.isEmpty()) - resultState->paramNames[name] = result; - } - - // exit cleanly - findEndTag( xml, QLatin1String("image")); -} - -QStringList QGLColladaFxEffectFactory::glslProfileFromEffect(QGLColladaFxEffect* effect, QString sid) -{ - Q_UNUSED(effect) - Indent indent; - QStringList result; - result += indent + QLatin1String("<profile_GLSL>"); - { - result += generateCodeElements(effect, sid); - result += indent + QLatin1String("<technique sid=\"") + sid + QLatin1String("\">"); - { - Indent indent; - result += indent + QLatin1String("<pass>"); - result += generateProgramElement(effect, sid); - result += indent + QLatin1String("</pass>"); - } - result += indent + QLatin1String("</technique>"); - } - result += indent + QLatin1String("</profile_GLSL>"); - - return result; -} - -QStringList QGLColladaFxEffectFactory::generateProgramElement(QGLColladaFxEffect* effect, QString techniqueSid) -{ - QStringList result; - QString vertexShaderRefSid = QLatin1String("VertexShaderRefSidRefsCodeOrIncludeAtProfileOrEffectLevel"); - QString fragmentShaderRefSid = QLatin1String("FragmentShaderRefSidRefsCodeOrIncludeAtProfileOrEffectLevel"); - Indent indent; - result += indent + QLatin1String("<program>"); - result += generateShaderElement(effect, techniqueSid + QLatin1String("VertexShader"), techniqueSid + QLatin1String("FragmentShader")); - // 0 or more - result += generateBindAttributeElement( effect ); - // 0 or more - result += generateBindUniformElements( effect ); - result += indent + QLatin1String("</program>"); - return result; -} - -QStringList QGLColladaFxEffectFactory::generateShaderElement( QGLColladaFxEffect* effect, QString vertexShaderRefSid, QString fragmentShaderRefSid ) -{ - Q_UNUSED(effect); - QStringList result; - Indent indent; - result += indent + QLatin1String("<shader stage=\"VERTEX\">"); - { - Indent indent; - result += indent + QLatin1String("<sources>"); - { - // 0 or more <import> elements - Indent indent; - result += indent + QLatin1String("<import ref=\"") + vertexShaderRefSid + QLatin1String("\"/>"); - } - result += indent + QLatin1String("</sources>"); - // 0 or <extra> elements; - } - result += indent + QLatin1String("</shader>"); - - result += indent + QLatin1String("<shader stage=\"FRAGMENT\">"); - { - Indent indent; - result += indent + QLatin1String("<sources>"); - { - Indent indent; - result += indent + QLatin1String("<import ref=\"") + fragmentShaderRefSid + QLatin1String("\"/>"); - } - result += indent + QLatin1String("</sources>"); - // <extra> element(s) here if necessary; - } - result += indent + QLatin1String("</shader>"); - return result; -} - -QStringList QGLColladaFxEffectFactory::generateBindAttributeElement( QGLColladaFxEffect* effect ) -{ - // Currently no need for bind_attribute elements. - Q_UNUSED(effect); - QStringList result; - // Indent indent; - // result += indent + "<bind_attribute>"; - // result += indent + "</bind_attribute>"; - return result; -} - -QStringList generateBindUniformParamElement( QString symbol, QString ref) -{ - QStringList result; - // 0 or more <bind_uniform> elements - Indent indent; - result += indent + QLatin1String("<bind_uniform symbol=\"") + symbol + QLatin1String("\">"); - { - Indent indent; - result += indent + QLatin1String("<param ref=\"") + ref + QLatin1String("\">"); - } - result += indent + QLatin1String("</bind_uniform>"); - return result; -} - -QStringList generateBindUniformParamElement( QString symbol, const QVector3D& value) -{ - QStringList result; - // 0 or more <bind_uniform> elements - Indent indent; - result += indent + QLatin1String("<bind_uniform symbol=\"") + symbol + QLatin1String("\">"); - { - Indent indent; - result += indent + QString(QLatin1String("<float3> %1 %2 %3 </float3>")).arg(value.x()).arg(value.y()).arg(value.z()); - } - result += indent + QLatin1String("</bind_uniform>"); - return result; -} - -QStringList generateBindUniformParamElement( QString symbol, const QColor& value) -{ - QStringList result; - // 0 or more <bind_uniform> elements - Indent indent; - result += indent + QLatin1String("<bind_uniform symbol=\"") + symbol + QLatin1String("\">"); - { - Indent indent; - result += indent + QString(QLatin1String("<float3> %1 %2 %3 </float3>")).arg(value.redF()).arg(value.greenF()).arg(value.blueF()); - } - result += indent + QLatin1String("</bind_uniform>"); - return result; -} - - -QStringList QGLColladaFxEffectFactory::generateBindUniformElements( QGLColladaFxEffect* effect ) -{ - QStringList result; - if (effect == 0) - return result; - // // 0 or more <bind_uniform> elements - // Example uniforms - // result += generateBindUniformParamElement( "exampleRefSymbol", QString("exampleRef")); - // result += generateBindUniformParamElement( "exampleFloat3Symbol", QVector3D(0.1, 0.2, 0.3) ); - - if (effect->material() != 0) - { - QGLMaterial* material = effect->material(); - - // Actual uniforms: - result += generateBindUniformParamElement( QLatin1String("ambientColor"), material->ambientColor()); - result += generateBindUniformParamElement( QLatin1String("diffuseColor"), material->diffuseColor()); - result += generateBindUniformParamElement( QLatin1String("emittedLight"), material->emittedLight()); - result += generateBindUniformParamElement( QLatin1String("objectName"), material->objectName()); - result += generateBindUniformParamElement( QLatin1String("shininess"), material->shininess()); - result += generateBindUniformParamElement( QLatin1String("specularColor"), material->specularColor()); - - effect->supportsPicking(); - - // TODO: Find and store effect uniforms - // effect->bindProgramUniforms(); - } - return result; -} - -QStringList QGLColladaFxEffectFactory::generateCodeElements( QGLColladaFxEffect* effect, QString baseSid ) -{ - QStringList result; - // 0 or more <bind_uniform> elements - Indent indent; - - // put all this on one line to avoid adding carriage returns to the - // shader programs - result += indent + QLatin1String("<code sid=\"") + baseSid + QLatin1String("VertexShader\">") - + effect->vertexShader() + QLatin1String("</code>"); - - result += indent + QLatin1String("<code sid=\"") + baseSid + QLatin1String("FragmentShader\">") - + effect->fragmentShader() + QLatin1String("</code>"); - - return result; -} - -void QGLColladaFxEffectFactory::processProgramElement( QXmlStreamReader& xml, ResultState* resultState, QGLColladaFxEffect* effect ) -{ - // A profile_GLSL shader element is - // 0 or more <shader> - // 0 or more <bind_attribute> - // 0 or more <bind_uniform> - - xml.readNextStartElement(); - - while ( xml.name() == QLatin1String("shader") ) - { - // in profile_GLSL a shader is - // exactly 1 <source> - // 0 or more <extra> - - QString stage = xml.attributes().value(QLatin1String("stage")).toString(); - xml.readNextStartElement(); - if ( xml.name() == QLatin1String("sources") ) - { - // a <sources> element is - // 1 or more <inline> elements - // 0 or more <import> elements - // Note: child elements can appear in any order - - xml.readNextStartElement(); - while ( (xml.name() == QLatin1String("inline") || xml.name() == QLatin1String("import")) && xml.tokenType() == QXmlStreamReader::StartElement) - { - if ( xml.name() == QLatin1String("import")) - { - QString ref = xml.attributes().value(QLatin1String("ref")).toString(); - - QXmlStreamAttribute attr; - if (xml.attributes().count()) - { - attr = xml.attributes().first(); - } - - QVariant param = findParameterVariant(resultState, ref); - if (param.isNull() || param.type() != QVariant::String) - { - qWarning() << "null or unexpected parameter found in import element ( line" - << xml.lineNumber()<<")"; - } - else - { - if (stage == QLatin1String("VERTEX")) - { - effect->setVertexShader( param.value<QString>().toLatin1() ); - } - else if (stage == QLatin1String("FRAGMENT")) - { - effect->setFragmentShader( param.value<QString>().toLatin1() ); - } else - { - qWarning() << "unrecognized shader stage: " - << stage << " ( line" << xml.lineNumber()<<")"; - } - } - - } else if ( xml.name() == QLatin1String("inline")) - { - - } - xml.readNextStartElement(); - } - } else { - qWarning() << "collada parsing error. expected <sources> element ( line" - << xml.lineNumber()<<")"; - } - - if (xml.name() == QLatin1String("extra")) - qWarning() << "Warning: extra element not supported in profile_GLSL <shader> element ( line" << xml.lineNumber()<<")"; - - findEndTag ( xml, QLatin1String("shader")); - xml.readNextStartElement(); - } - - while ( xml.name() == QLatin1String("bind_attribute") ) - { - qWarning() << "Warning: bind_attribute element not supported ( line" << xml.lineNumber()<<")"; - findEndTag ( xml, QLatin1String("bind_attribute")); - xml.readNextStartElement(); - } - - while ( xml.name() == QLatin1String("bind_uniform") ) - { - qWarning() << "Warning: bind_uniform element not supported ( line" << xml.lineNumber()<<")"; - findEndTag ( xml, QLatin1String("bind_uniform")); - xml.readNextStartElement(); - } - - findEndTag(xml, QLatin1String("program")); - return; -} - -QT_END_NAMESPACE |