123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225 |
- // Copyright (C) 2002-2012 Nikolaus Gebhardt
- // This file is part of the "Irrlicht Engine".
- // For conditions of distribution and use, see copyright notice in irrlicht.h
- #ifndef IRR_DIMENSION2D_H_INCLUDED
- #define IRR_DIMENSION2D_H_INCLUDED
- #include "irrTypes.h"
- #include "irrMath.h" // for irr::core::equals()
- namespace irr
- {
- namespace core
- {
- template <class T>
- class vector2d;
- //! Specifies a 2 dimensional size.
- template <class T>
- class dimension2d
- {
- public:
- //! Default constructor for empty dimension
- dimension2d() : Width(0), Height(0) {}
- //! Constructor with width and height
- dimension2d(const T& width, const T& height)
- : Width(width), Height(height) {}
- dimension2d(const vector2d<T>& other); // Defined in vector2d.h
- //! Use this constructor only where you are sure that the conversion is valid.
- template <class U>
- explicit dimension2d(const dimension2d<U>& other) :
- Width((T)other.Width), Height((T)other.Height) { }
- template <class U>
- dimension2d<T>& operator=(const dimension2d<U>& other)
- {
- Width = (T) other.Width;
- Height = (T) other.Height;
- return *this;
- }
- //! Equality operator
- bool operator==(const dimension2d<T>& other) const
- {
- return core::equals(Width, other.Width) &&
- core::equals(Height, other.Height);
- }
- //! Inequality operator
- bool operator!=(const dimension2d<T>& other) const
- {
- return ! (*this == other);
- }
- bool operator==(const vector2d<T>& other) const; // Defined in vector2d.h
- bool operator!=(const vector2d<T>& other) const
- {
- return !(*this == other);
- }
- //! Set to new values
- dimension2d<T>& set(const T& width, const T& height)
- {
- Width = width;
- Height = height;
- return *this;
- }
- //! Divide width and height by scalar
- dimension2d<T>& operator/=(const T& scale)
- {
- Width /= scale;
- Height /= scale;
- return *this;
- }
- //! Divide width and height by scalar
- dimension2d<T> operator/(const T& scale) const
- {
- return dimension2d<T>(Width/scale, Height/scale);
- }
- //! Multiply width and height by scalar
- dimension2d<T>& operator*=(const T& scale)
- {
- Width *= scale;
- Height *= scale;
- return *this;
- }
- //! Multiply width and height by scalar
- dimension2d<T> operator*(const T& scale) const
- {
- return dimension2d<T>(Width*scale, Height*scale);
- }
- //! Add another dimension to this one.
- dimension2d<T>& operator+=(const dimension2d<T>& other)
- {
- Width += other.Width;
- Height += other.Height;
- return *this;
- }
- //! Add two dimensions
- dimension2d<T> operator+(const dimension2d<T>& other) const
- {
- return dimension2d<T>(Width+other.Width, Height+other.Height);
- }
- //! Subtract a dimension from this one
- dimension2d<T>& operator-=(const dimension2d<T>& other)
- {
- Width -= other.Width;
- Height -= other.Height;
- return *this;
- }
- //! Subtract one dimension from another
- dimension2d<T> operator-(const dimension2d<T>& other) const
- {
- return dimension2d<T>(Width-other.Width, Height-other.Height);
- }
- //! Get area
- T getArea() const
- {
- return Width*Height;
- }
- //! Get the optimal size according to some properties
- /** This is a function often used for texture dimension
- calculations. The function returns the next larger or
- smaller dimension which is a power-of-two dimension
- (2^n,2^m) and/or square (Width=Height).
- \param requirePowerOfTwo Forces the result to use only
- powers of two as values.
- \param requireSquare Makes width==height in the result
- \param larger Choose whether the result is larger or
- smaller than the current dimension. If one dimension
- need not be changed it is kept with any value of larger.
- \param maxValue Maximum texturesize. if value > 0 size is
- clamped to maxValue
- \return The optimal dimension under the given
- constraints. */
- dimension2d<T> getOptimalSize(
- bool requirePowerOfTwo=true,
- bool requireSquare=false,
- bool larger=true,
- u32 maxValue = 0) const
- {
- u32 i=1;
- u32 j=1;
- if (requirePowerOfTwo)
- {
- while (i<(u32)Width)
- i<<=1;
- if (!larger && i!=1 && i!=(u32)Width)
- i>>=1;
- while (j<(u32)Height)
- j<<=1;
- if (!larger && j!=1 && j!=(u32)Height)
- j>>=1;
- }
- else
- {
- i=(u32)Width;
- j=(u32)Height;
- }
- if (requireSquare)
- {
- if ((larger && (i>j)) || (!larger && (i<j)))
- j=i;
- else
- i=j;
- }
- if ( maxValue > 0 && i > maxValue)
- i = maxValue;
- if ( maxValue > 0 && j > maxValue)
- j = maxValue;
- return dimension2d<T>((T)i,(T)j);
- }
- //! Get the interpolated dimension
- /** \param other Other dimension to interpolate with.
- \param d Value between 0.0f and 1.0f. d=0 returns other, d=1 returns this, values between interpolate.
- \return Interpolated dimension. */
- dimension2d<T> getInterpolated(const dimension2d<T>& other, f32 d) const
- {
- const f32 inv = (1.0f - d);
- return dimension2d<T>( (T)(other.Width*inv + Width*d), (T)(other.Height*inv + Height*d));
- }
- //! Width of the dimension.
- T Width;
- //! Height of the dimension.
- T Height;
- };
- //! Typedef for an f32 dimension.
- typedef dimension2d<f32> dimension2df;
- //! Typedef for an unsigned integer dimension.
- typedef dimension2d<u32> dimension2du;
- //! Typedef for an integer dimension.
- /** There are few cases where negative dimensions make sense. Please consider using
- dimension2du instead. */
- typedef dimension2d<s32> dimension2di;
- } // end namespace core
- } // end namespace irr
- #endif
|