|
IrrlichtEngine
|
00001 // Copyright (C) 2002-2011 Nikolaus Gebhardt 00002 // This file is part of the "Irrlicht Engine". 00003 // For conditions of distribution and use, see copyright notice in irrlicht.h 00004 00005 #ifndef __IRR_DIMENSION2D_H_INCLUDED__ 00006 #define __IRR_DIMENSION2D_H_INCLUDED__ 00007 00008 #include "irrTypes.h" 00009 #include "irrMath.h" // for irr::core::equals() 00010 00011 namespace irr 00012 { 00013 namespace core 00014 { 00015 template <class T> 00016 class vector2d; 00017 00019 template <class T> 00020 class dimension2d 00021 { 00022 public: 00024 dimension2d() : Width(0), Height(0) {} 00026 dimension2d(const T& width, const T& height) 00027 : Width(width), Height(height) {} 00028 00029 dimension2d(const vector2d<T>& other); // Defined in vector2d.h 00030 00032 template <class U> 00033 explicit dimension2d(const dimension2d<U>& other) : 00034 Width((T)other.Width), Height((T)other.Height) { } 00035 00036 template <class U> 00037 dimension2d<T>& operator=(const dimension2d<U>& other) 00038 { 00039 Width = (T) other.Width; 00040 Height = (T) other.Height; 00041 return *this; 00042 } 00043 00044 00046 bool operator==(const dimension2d<T>& other) const 00047 { 00048 return core::equals(Width, other.Width) && 00049 core::equals(Height, other.Height); 00050 } 00051 00053 bool operator!=(const dimension2d<T>& other) const 00054 { 00055 return ! (*this == other); 00056 } 00057 00058 bool operator==(const vector2d<T>& other) const; // Defined in vector2d.h 00059 00060 bool operator!=(const vector2d<T>& other) const 00061 { 00062 return !(*this == other); 00063 } 00064 00066 dimension2d<T>& set(const T& width, const T& height) 00067 { 00068 Width = width; 00069 Height = height; 00070 return *this; 00071 } 00072 00074 dimension2d<T>& operator/=(const T& scale) 00075 { 00076 Width /= scale; 00077 Height /= scale; 00078 return *this; 00079 } 00080 00082 dimension2d<T> operator/(const T& scale) const 00083 { 00084 return dimension2d<T>(Width/scale, Height/scale); 00085 } 00086 00088 dimension2d<T>& operator*=(const T& scale) 00089 { 00090 Width *= scale; 00091 Height *= scale; 00092 return *this; 00093 } 00094 00096 dimension2d<T> operator*(const T& scale) const 00097 { 00098 return dimension2d<T>(Width*scale, Height*scale); 00099 } 00100 00102 dimension2d<T>& operator+=(const dimension2d<T>& other) 00103 { 00104 Width += other.Width; 00105 Height += other.Height; 00106 return *this; 00107 } 00108 00110 dimension2d<T> operator+(const dimension2d<T>& other) const 00111 { 00112 return dimension2d<T>(Width+other.Width, Height+other.Height); 00113 } 00114 00116 dimension2d<T>& operator-=(const dimension2d<T>& other) 00117 { 00118 Width -= other.Width; 00119 Height -= other.Height; 00120 return *this; 00121 } 00122 00124 dimension2d<T> operator-(const dimension2d<T>& other) const 00125 { 00126 return dimension2d<T>(Width-other.Width, Height-other.Height); 00127 } 00128 00130 T getArea() const 00131 { 00132 return Width*Height; 00133 } 00134 00136 00150 dimension2d<T> getOptimalSize( 00151 bool requirePowerOfTwo=true, 00152 bool requireSquare=false, 00153 bool larger=true, 00154 u32 maxValue = 0) const 00155 { 00156 u32 i=1; 00157 u32 j=1; 00158 if (requirePowerOfTwo) 00159 { 00160 while (i<(u32)Width) 00161 i<<=1; 00162 if (!larger && i!=1 && i!=(u32)Width) 00163 i>>=1; 00164 while (j<(u32)Height) 00165 j<<=1; 00166 if (!larger && j!=1 && j!=(u32)Height) 00167 j>>=1; 00168 } 00169 else 00170 { 00171 i=(u32)Width; 00172 j=(u32)Height; 00173 } 00174 00175 if (requireSquare) 00176 { 00177 if ((larger && (i>j)) || (!larger && (i<j))) 00178 j=i; 00179 else 00180 i=j; 00181 } 00182 00183 if ( maxValue > 0 && i > maxValue) 00184 i = maxValue; 00185 00186 if ( maxValue > 0 && j > maxValue) 00187 j = maxValue; 00188 00189 return dimension2d<T>((T)i,(T)j); 00190 } 00191 00193 00196 dimension2d<T> getInterpolated(const dimension2d<T>& other, f32 d) const 00197 { 00198 f32 inv = (1.0f - d); 00199 return dimension2d<T>( (T)(other.Width*inv + Width*d), (T)(other.Height*inv + Height*d)); 00200 } 00201 00202 00204 T Width; 00206 T Height; 00207 }; 00208 00210 typedef dimension2d<f32> dimension2df; 00212 typedef dimension2d<u32> dimension2du; 00213 00215 00217 typedef dimension2d<s32> dimension2di; 00218 00219 00220 } // end namespace core 00221 } // end namespace irr 00222 00223 #endif 00224