⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 imathcolor.h

📁 对gif
💻 H
📖 第 1 页 / 共 2 页
字号:
///////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas
// Digital Ltd. LLC
// 
// All rights reserved.
// 
// 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 Industrial Light & Magic 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.
//
///////////////////////////////////////////////////////////////////////////



#ifndef INCLUDED_IMATHCOLOR_H
#define INCLUDED_IMATHCOLOR_H

//----------------------------------------------------
//
//	A three and four component color class template.
//
//----------------------------------------------------

#include "ImathVec.h"
#include "half.h"

namespace Imath {


template <class T>
class Color3: public Vec3 <T>
{
  public:

    //-------------
    // Constructors
    //-------------

    Color3 ();			// no initialization
    explicit Color3 (T a);	// (a a a)
    Color3 (T a, T b, T c);	// (a b c)


    //---------------------------------
    // Copy constructors and assignment
    //---------------------------------

    Color3 (const Color3 &c);
    template <class S> Color3 (const Vec3<S> &v);

    const Color3 &	operator = (const Color3 &c);


    //------------------------
    // Component-wise addition
    //------------------------

    const Color3 &	operator += (const Color3 &c);
    Color3		operator + (const Color3 &c) const;


    //---------------------------
    // Component-wise subtraction
    //---------------------------

    const Color3 &	operator -= (const Color3 &c);
    Color3		operator - (const Color3 &c) const;


    //------------------------------------
    // Component-wise multiplication by -1
    //------------------------------------

    Color3		operator - () const;
    const Color3 &	negate ();


    //------------------------------
    // Component-wise multiplication
    //------------------------------

    const Color3 &	operator *= (const Color3 &c);
    const Color3 &	operator *= (T a);
    Color3		operator * (const Color3 &c) const;
    Color3		operator * (T a) const;


    //------------------------
    // Component-wise division
    //------------------------

    const Color3 &	operator /= (const Color3 &c);
    const Color3 &	operator /= (T a);
    Color3		operator / (const Color3 &c) const;
    Color3		operator / (T a) const;
};

template <class T> class Color4
{
  public:

    //-------------------
    // Access to elements
    //-------------------

    T			r, g, b, a;

    T &			operator [] (int i);
    const T &		operator [] (int i) const;


    //-------------
    // Constructors
    //-------------

    Color4 ();			    	// no initialization
    explicit Color4 (T a);		// (a a a a)
    Color4 (T a, T b, T c, T d);	// (a b c d)


    //---------------------------------
    // Copy constructors and assignment
    //---------------------------------

    Color4 (const Color4 &v);
    template <class S> Color4 (const Color4<S> &v);

    const Color4 &	operator = (const Color4 &v);


    //----------------------
    // Compatibility with Sb
    //----------------------

    template <class S>
    void		setValue (S a, S b, S c, S d);

    template <class S>
    void		setValue (const Color4<S> &v);

    template <class S>
    void		getValue (S &a, S &b, S &c, S &d) const;

    template <class S>
    void		getValue (Color4<S> &v) const;

    T *			getValue();
    const T *		getValue() const;


    //---------
    // Equality
    //---------

    template <class S>
    bool		operator == (const Color4<S> &v) const;

    template <class S>
    bool		operator != (const Color4<S> &v) const;


    //------------------------
    // Component-wise addition
    //------------------------

    const Color4 &	operator += (const Color4 &v);
    Color4		operator + (const Color4 &v) const;


    //---------------------------
    // Component-wise subtraction
    //---------------------------

    const Color4 &	operator -= (const Color4 &v);
    Color4		operator - (const Color4 &v) const;


    //------------------------------------
    // Component-wise multiplication by -1
    //------------------------------------

    Color4		operator - () const;
    const Color4 &	negate ();


    //------------------------------
    // Component-wise multiplication
    //------------------------------

    const Color4 &	operator *= (const Color4 &v);
    const Color4 &	operator *= (T a);
    Color4		operator * (const Color4 &v) const;
    Color4		operator * (T a) const;


    //------------------------
    // Component-wise division
    //------------------------

    const Color4 &	operator /= (const Color4 &v);
    const Color4 &	operator /= (T a);
    Color4		operator / (const Color4 &v) const;
    Color4		operator / (T a) const;


    //----------------------------------------------------------
    // Number of dimensions, i.e. number of elements in a Color4
    //----------------------------------------------------------

    static unsigned int	dimensions() {return 4;}


    //-------------------------------------------------
    // Limitations of type T (see also class limits<T>)
    //-------------------------------------------------

    static T		baseTypeMin()		{return limits<T>::min();}
    static T		baseTypeMax()		{return limits<T>::max();}
    static T		baseTypeSmallest()	{return limits<T>::smallest();}
    static T		baseTypeEpsilon()	{return limits<T>::epsilon();}


    //--------------------------------------------------------------
    // Base type -- in templates, which accept a parameter, V, which
    // could be a Color4<T>, you can refer to T as
    // V::BaseType
    //--------------------------------------------------------------

    typedef T		BaseType;
};

//--------------
// Stream output
//--------------

template <class T>
std::ostream &	operator << (std::ostream &s, const Color4<T> &v);

//----------------------------------------------------
// Reverse multiplication: S * Color4<T>
//----------------------------------------------------

template <class S, class T> Color4<T>	operator * (S a, const Color4<T> &v);

//-------------------------
// Typedefs for convenience
//-------------------------

typedef Color3<float>		Color3f;
typedef Color3<half>		Color3h;
typedef Color3<unsigned char>	Color3c;
typedef Color3<half>		C3h;
typedef Color3<float>		C3f;
typedef Color3<unsigned char>	C3c;
typedef Color4<float>		Color4f;
typedef Color4<half>		Color4h;
typedef Color4<unsigned char>	Color4c;
typedef Color4<float>		C4f;
typedef Color4<half>		C4h;
typedef Color4<unsigned char>	C4c;
typedef unsigned int		PackedColor;


//-------------------------
// Implementation of Color3
//-------------------------

template <class T>
inline
Color3<T>::Color3 (): Vec3 <T> ()
{
    // empty
}

template <class T>
inline
Color3<T>::Color3 (T a): Vec3 <T> (a)
{
    // empty
}

template <class T>
inline
Color3<T>::Color3 (T a, T b, T c): Vec3 <T> (a, b, c)
{
    // empty
}

template <class T>
inline
Color3<T>::Color3 (const Color3 &c): Vec3 <T> (c)
{
    // empty
}

template <class T>
template <class S>
inline
Color3<T>::Color3 (const Vec3<S> &v): Vec3 <T> (v)
{
    //empty
}

template <class T>
inline const Color3<T> &
Color3<T>::operator = (const Color3 &c)
{
    *((Vec3<T> *) this) = c;
    return *this;
}

template <class T>
inline const Color3<T> &
Color3<T>::operator += (const Color3 &c)
{
    *((Vec3<T> *) this) += c;
    return *this;
}

template <class T>
inline Color3<T>	
Color3<T>::operator + (const Color3 &c) const
{
    return Color3 (*(Vec3<T> *)this + (const Vec3<T> &)c);
}

template <class T>
inline const Color3<T> &
Color3<T>::operator -= (const Color3 &c)
{
    *((Vec3<T> *) this) -= c;
    return *this;
}

template <class T>
inline Color3<T>	
Color3<T>::operator - (const Color3 &c) const
{
    return Color3 (*(Vec3<T> *)this - (const Vec3<T> &)c);
}

template <class T>
inline Color3<T>	
Color3<T>::operator - () const
{
    return Color3 (-(*(Vec3<T> *)this));

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -