1 /* 2 * Copyright (C) 2011 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 ** Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #ifndef VEC3_H 17 #define VEC3_H 18 19 #include <assert.h> 20 #include <cmath> 21 22 // Implementes a class to represent the pixel value in a 3-dimensional color 23 // space. The colors are all represented by int as it is mostly used as RGB. 24 template <class T> 25 class Vec3{ 26 public: Vec3(T inputRed,T inputGreen,T inputBlue)27 Vec3(T inputRed, T inputGreen, T inputBlue) { 28 mRed = inputRed; 29 mGreen = inputGreen; 30 mBlue = inputBlue; 31 } 32 Vec3()33 Vec3() {} 34 35 template <class U> 36 inline Vec3<T> operator+ (const Vec3<U> ¶m) const { 37 Vec3<T> temp(mRed + param.r(), mGreen + param.g(), mBlue + param.b()); 38 return temp; 39 } 40 41 inline Vec3<T> operator- (const Vec3<T> ¶m) const { 42 Vec3<T> temp(mRed - param.r(), mGreen - param.g(), mBlue - param.b()); 43 return temp; 44 } 45 46 inline Vec3<T> operator* (const int param) const { 47 Vec3<T> temp(mRed * param, mGreen * param, mBlue * param); 48 return temp; 49 } 50 51 template <class U> 52 inline Vec3<float> operator* (const Vec3<U> ¶m) const { 53 Vec3<float> temp(mRed * static_cast<U>(param.r()), 54 mGreen * static_cast<U>(param.g()), 55 mBlue * static_cast<U>(param.b())); 56 return temp; 57 } 58 59 60 inline Vec3<float> operator/ (const int param) const { 61 Vec3<float> temp; 62 assert(param != 0); 63 temp.set(static_cast<float>(mRed) / static_cast<float>(param), 64 static_cast<float>(mGreen) / static_cast<float>(param), 65 static_cast<float>(mBlue) / static_cast<float>(param)); 66 return temp; 67 } 68 69 template <class U> 70 inline Vec3<float> operator/ (const Vec3<U> ¶m) const { 71 Vec3<float> temp; 72 assert((param.r() != 0.f) && (param.g() != 0.f) && (param.b() != 0.f)); 73 temp.set(static_cast<float>(mRed) / static_cast<float>(param.r()), 74 static_cast<float>(mGreen) / static_cast<float>(param.g()), 75 static_cast<float>(mBlue) / static_cast<float>(param.b())); 76 return temp; 77 } 78 79 template <class U> squareDistance(const Vec3<U> & param)80 float squareDistance(const Vec3<U> ¶m) const { 81 float difference = 0.f; 82 difference = static_cast<float>(mRed - param.r()) * 83 static_cast<float>(mRed - param.r()) + 84 static_cast<float>(mGreen - param.g()) * 85 static_cast<float>(mGreen - param.g()) + 86 static_cast<float>(mBlue - param.b()) * 87 static_cast<float>(mBlue - param.b()); 88 return difference; 89 } 90 91 // Assumes conversion from sRGB to luminance. convertToLuminance()92 float convertToLuminance() const { 93 return (0.299 * static_cast<float>(mRed) + 94 0.587 * static_cast<float>(mGreen) + 95 0.114 * static_cast<float>(mBlue)); 96 } 97 r()98 inline T r() const { return mRed; } g()99 inline T g() const { return mGreen; } b()100 inline T b() const { return mBlue; } 101 set(const T inputRed,const T inputGreen,const T inputBlue)102 inline void set(const T inputRed, const T inputGreen, const T inputBlue){ 103 mRed = inputRed; 104 mGreen = inputGreen; 105 mBlue = inputBlue; 106 } 107 108 private: 109 T mRed; 110 T mGreen; 111 T mBlue; 112 }; 113 114 typedef Vec3<int> Vec3i; 115 typedef Vec3<float> Vec3f; 116 #endif 117