123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736 |
- ///////////////////////////////////////////////////////////////////////////
- //
- // Copyright (c) 2004-2012, 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 "ImathNamespace.h"
- #include "half.h"
- IMATH_INTERNAL_NAMESPACE_HEADER_ENTER
- 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));
- }
- template <class T>
- inline const Color3<T> &
- Color3<T>::negate ()
- {
- ((Vec3<T> *) this)->negate();
- 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 const Color3<T> &
- Color3<T>::operator *= (T a)
- {
- *((Vec3<T> *) this) *= a;
- 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 * (T a) const
- {
- return Color3 (*(Vec3<T> *)this * a);
- }
- 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 /= (T a)
- {
- *((Vec3<T> *) this) /= a;
- 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 / (T a) const
- {
- return Color3 (*(Vec3<T> *)this / a);
- }
- //-----------------------
- // Implementation of Color4
- //-----------------------
- template <class T>
- inline T &
- Color4<T>::operator [] (int i)
- {
- return (&r)[i];
- }
- template <class T>
- inline const T &
- Color4<T>::operator [] (int i) const
- {
- return (&r)[i];
- }
- template <class T>
- inline
- Color4<T>::Color4 ()
- {
- // empty
- }
- template <class T>
- inline
- Color4<T>::Color4 (T x)
- {
- r = g = b = a = x;
- }
- template <class T>
- inline
- Color4<T>::Color4 (T x, T y, T z, T w)
- {
- r = x;
- g = y;
- b = z;
- a = w;
- }
- template <class T>
- inline
- Color4<T>::Color4 (const Color4 &v)
- {
- r = v.r;
- g = v.g;
- b = v.b;
- a = v.a;
- }
- template <class T>
- template <class S>
- inline
- Color4<T>::Color4 (const Color4<S> &v)
- {
- r = T (v.r);
- g = T (v.g);
- b = T (v.b);
- a = T (v.a);
- }
- template <class T>
- inline const Color4<T> &
- Color4<T>::operator = (const Color4 &v)
- {
- r = v.r;
- g = v.g;
- b = v.b;
- a = v.a;
- return *this;
- }
- template <class T>
- template <class S>
- inline void
- Color4<T>::setValue (S x, S y, S z, S w)
- {
- r = T (x);
- g = T (y);
- b = T (z);
- a = T (w);
- }
- template <class T>
- template <class S>
- inline void
- Color4<T>::setValue (const Color4<S> &v)
- {
- r = T (v.r);
- g = T (v.g);
- b = T (v.b);
- a = T (v.a);
- }
- template <class T>
- template <class S>
- inline void
- Color4<T>::getValue (S &x, S &y, S &z, S &w) const
- {
- x = S (r);
- y = S (g);
- z = S (b);
- w = S (a);
- }
- template <class T>
- template <class S>
- inline void
- Color4<T>::getValue (Color4<S> &v) const
- {
- v.r = S (r);
- v.g = S (g);
- v.b = S (b);
- v.a = S (a);
- }
- template <class T>
- inline T *
- Color4<T>::getValue()
- {
- return (T *) &r;
- }
- template <class T>
- inline const T *
- Color4<T>::getValue() const
- {
- return (const T *) &r;
- }
- template <class T>
- template <class S>
- inline bool
- Color4<T>::operator == (const Color4<S> &v) const
- {
- return r == v.r && g == v.g && b == v.b && a == v.a;
- }
- template <class T>
- template <class S>
- inline bool
- Color4<T>::operator != (const Color4<S> &v) const
- {
- return r != v.r || g != v.g || b != v.b || a != v.a;
- }
- template <class T>
- inline const Color4<T> &
- Color4<T>::operator += (const Color4 &v)
- {
- r += v.r;
- g += v.g;
- b += v.b;
- a += v.a;
- return *this;
- }
- template <class T>
- inline Color4<T>
- Color4<T>::operator + (const Color4 &v) const
- {
- return Color4 (r + v.r, g + v.g, b + v.b, a + v.a);
- }
- template <class T>
- inline const Color4<T> &
- Color4<T>::operator -= (const Color4 &v)
- {
- r -= v.r;
- g -= v.g;
- b -= v.b;
- a -= v.a;
- return *this;
- }
- template <class T>
- inline Color4<T>
- Color4<T>::operator - (const Color4 &v) const
- {
- return Color4 (r - v.r, g - v.g, b - v.b, a - v.a);
- }
- template <class T>
- inline Color4<T>
- Color4<T>::operator - () const
- {
- return Color4 (-r, -g, -b, -a);
- }
- template <class T>
- inline const Color4<T> &
- Color4<T>::negate ()
- {
- r = -r;
- g = -g;
- b = -b;
- a = -a;
- return *this;
- }
- template <class T>
- inline const Color4<T> &
- Color4<T>::operator *= (const Color4 &v)
- {
- r *= v.r;
- g *= v.g;
- b *= v.b;
- a *= v.a;
- return *this;
- }
- template <class T>
- inline const Color4<T> &
- Color4<T>::operator *= (T x)
- {
- r *= x;
- g *= x;
- b *= x;
- a *= x;
- return *this;
- }
- template <class T>
- inline Color4<T>
- Color4<T>::operator * (const Color4 &v) const
- {
- return Color4 (r * v.r, g * v.g, b * v.b, a * v.a);
- }
- template <class T>
- inline Color4<T>
- Color4<T>::operator * (T x) const
- {
- return Color4 (r * x, g * x, b * x, a * x);
- }
- template <class T>
- inline const Color4<T> &
- Color4<T>::operator /= (const Color4 &v)
- {
- r /= v.r;
- g /= v.g;
- b /= v.b;
- a /= v.a;
- return *this;
- }
- template <class T>
- inline const Color4<T> &
- Color4<T>::operator /= (T x)
- {
- r /= x;
- g /= x;
- b /= x;
- a /= x;
- return *this;
- }
- template <class T>
- inline Color4<T>
- Color4<T>::operator / (const Color4 &v) const
- {
- return Color4 (r / v.r, g / v.g, b / v.b, a / v.a);
- }
- template <class T>
- inline Color4<T>
- Color4<T>::operator / (T x) const
- {
- return Color4 (r / x, g / x, b / x, a / x);
- }
- template <class T>
- std::ostream &
- operator << (std::ostream &s, const Color4<T> &v)
- {
- return s << '(' << v.r << ' ' << v.g << ' ' << v.b << ' ' << v.a << ')';
- }
- //-----------------------------------------
- // Implementation of reverse multiplication
- //-----------------------------------------
- template <class S, class T>
- inline Color4<T>
- operator * (S x, const Color4<T> &v)
- {
- return Color4<T> (x * v.r, x * v.g, x * v.b, x * v.a);
- }
- IMATH_INTERNAL_NAMESPACE_HEADER_EXIT
- #endif // INCLUDED_IMATHCOLOR_H
|