diff -r 000000000000 -r 876b1a06bc25 examples/sensors/cubehouse/material.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/examples/sensors/cubehouse/material.cpp Wed Aug 25 15:49:42 2010 +0300 @@ -0,0 +1,331 @@ +/**************************************************************************** +** +** 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 Qt3D module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor +** the names of its contributors may be used to endorse or promote +** products derived from this software without specific prior written +** permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "material.h" + +/*! + \class Material + \brief The Material class describes material properties for OpenGL drawing. + \since 4.7 + \ingroup qt3d + \ingroup qt3d::painting +*/ + +class MaterialPrivate +{ +public: + explicit MaterialPrivate(); + + QColor basicColor; + QColor ambientColor; + QColor diffuseColor; + QColor specularColor; + QColor emittedLight; + qreal shininess; +}; + +MaterialPrivate::MaterialPrivate() + : basicColor(255, 255, 255, 255), + specularColor(0, 0, 0, 255), + emittedLight(0, 0, 0, 255), + shininess(0) +{ + ambientColor.setRgbF(0.2f, 0.2f, 0.2f, 1.0f); + diffuseColor.setRgbF(0.8f, 0.8f, 0.8f, 1.0f); +} + +/*! + Constructs a Material object with its default values, + and attaches it to \a parent. +*/ +Material::Material(QObject *parent) + : QObject(parent), d_ptr(new MaterialPrivate) +{ +} + +/*! + Destroys this Material object. +*/ +Material::~Material() +{ +} + +/*! + \property Material::basicColor + \brief the basic color of the material. The default value + is (1.0, 1.0, 1.0, 1.0). + + The basic color is used by effects that don't implement + material-based lighting. It is ignored by material-based + lighting effects. + + \sa ambientColor(), diffuseColor(), basicColorChanged(), setColor() +*/ +QColor Material::basicColor() const +{ + Q_D(const Material); + return d->basicColor; +} + +void Material::setBasicColor(const QColor& value) +{ + Q_D(Material); + if (d->basicColor != value) { + d->basicColor = value; + emit basicColorChanged(); + emit materialChanged(); + } +} + +/*! + \property Material::ambientColor + \brief the ambient color of the material. The default value + is (0.2, 0.2, 0.2, 1.0). + + \sa diffuseColor(), specularColor(), ambientColorChanged() +*/ +QColor Material::ambientColor() const +{ + Q_D(const Material); + return d->ambientColor; +} + +void Material::setAmbientColor(const QColor& value) +{ + Q_D(Material); + if (d->ambientColor != value) { + d->ambientColor = value; + emit ambientColorChanged(); + emit materialChanged(); + } +} + +/*! + \property Material::diffuseColor + \brief the diffuse color of the material. The default value + is (0.8, 0.8, 0.8, 1.0). + + \sa ambientColor(), specularColor(), diffuseColorChanged() +*/ +QColor Material::diffuseColor() const +{ + Q_D(const Material); + return d->diffuseColor; +} + +void Material::setDiffuseColor(const QColor& value) +{ + Q_D(Material); + if (d->diffuseColor != value) { + d->diffuseColor = value; + emit diffuseColorChanged(); + emit materialChanged(); + } +} + +/*! + \property Material::specularColor + \brief the specular color of the material. The default value + is (0, 0, 0, 1). + + \sa ambientColor(), diffuseColor(), specularColorChanged() +*/ +QColor Material::specularColor() const +{ + Q_D(const Material); + return d->specularColor; +} + +void Material::setSpecularColor(const QColor& value) +{ + Q_D(Material); + if (d->specularColor != value) { + d->specularColor = value; + emit specularColorChanged(); + emit materialChanged(); + } +} + +/*! + \property Material::emittedLight + \brief the emitted light intensity of the material. + The default value is (0.0, 0.0, 0.0, 1.0), which indicates + that the material does not emit any light. + + \sa emittedLightChanged() +*/ +QColor Material::emittedLight() const +{ + Q_D(const Material); + return d->emittedLight; +} + +void Material::setEmittedLight(const QColor& value) +{ + Q_D(Material); + if (d->emittedLight != value) { + d->emittedLight = value; + emit emittedLightChanged(); + emit materialChanged(); + } +} + +/*! + \property Material::color + \brief the overall color of the material. The default value + is (1.0, 1.0, 1.0, 1.0). + + This is a convenience property. When read it returns basicColor(). + When written, it sets basicColor() to the value, ambientColor() + to 20% of the value, and diffuseColor() to 80% of the value. + The result is that regardless of whether lighting is used or not, + the material will appear to have a similar color. + + \sa basicColor(), ambientColor(), diffuseColor() +*/ +QColor Material::color() const +{ + Q_D(const Material); + return d->basicColor; +} + +void Material::setColor(const QColor& value) +{ + Q_D(Material); + d->basicColor = value; + d->ambientColor.setRgbF + (value.redF() * 0.2f, value.greenF() * 0.2f, + value.blueF() * 0.2f, value.alphaF()); + d->diffuseColor.setRgbF + (value.redF() * 0.8f, value.greenF() * 0.8f, + value.blueF() * 0.8f, value.alphaF()); + emit basicColorChanged(); + emit ambientColorChanged(); + emit diffuseColorChanged(); + emit materialChanged(); +} + +/*! + \property Material::shininess + \brief the specular exponent of the material, or how shiny it is. + Must be between 0 and 128. The default value is 0. A value outside + this range will be clamped to the range when the property is set. + + \sa shininessChanged() +*/ +qreal Material::shininess() const +{ + Q_D(const Material); + return d->shininess; +} + +void Material::setShininess(qreal value) +{ + Q_D(Material); + if (value < 0) + value = 0; + else if (value > 128) + value = 128; + if (d->shininess != value) { + d->shininess = value; + emit shininessChanged(); + emit materialChanged(); + } +} + +/*! + \fn void Material::basicColorChanged() + + This signal is emitted when basicColor() changes. + + \sa basicColor(), setBasicColor(), materialChanged() +*/ + +/*! + \fn void Material::ambientColorChanged() + + This signal is emitted when ambientColor() changes. + + \sa ambientColor(), setAmbientColor(), materialChanged() +*/ + +/*! + \fn void Material::diffuseColorChanged() + + This signal is emitted when diffuseColor() changes. + + \sa diffuseColor(), setDiffuseColor(), materialChanged() +*/ + +/*! + \fn void Material::specularColorChanged() + + This signal is emitted when specularColor() changes. + + \sa specularColor(), setSpecularColor(), materialChanged() +*/ + +/*! + \fn void Material::emittedLightChanged() + + This signal is emitted when emittedLight() changes. + + \sa emittedLight(), setEmittedLight(), materialChanged() +*/ + +/*! + \fn void Material::shininessChanged() + + This signal is emitted when shininess() changes. + + \sa shininess(), setShininess(), materialChanged() +*/ + +/*! + \fn void Material::materialChanged() + + This signal is emitted when one of basicColor(), ambientColor(), + diffuseColor(), specularColor(), emittedLight(), shiniess(), + or texture() changes. + + \sa basicColorChanged(), ambientColorChanged(), diffuseColorChanged() + \sa specularColorChanged(), emittedLightChanged(), shininessChanged() + \sa texturesChanged() +*/