1c29fa5a6Sopenharmony_ci/* 2c29fa5a6Sopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd. 3c29fa5a6Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4c29fa5a6Sopenharmony_ci * you may not use this file except in compliance with the License. 5c29fa5a6Sopenharmony_ci * You may obtain a copy of the License at 6c29fa5a6Sopenharmony_ci * 7c29fa5a6Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8c29fa5a6Sopenharmony_ci * 9c29fa5a6Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10c29fa5a6Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11c29fa5a6Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12c29fa5a6Sopenharmony_ci * See the License for the specific language governing permissions and 13c29fa5a6Sopenharmony_ci * limitations under the License. 14c29fa5a6Sopenharmony_ci */ 15c29fa5a6Sopenharmony_ci 16c29fa5a6Sopenharmony_ci#ifndef MMI_VECTOR3_H 17c29fa5a6Sopenharmony_ci#define MMI_VECTOR3_H 18c29fa5a6Sopenharmony_ci 19c29fa5a6Sopenharmony_ci#include <cmath> 20c29fa5a6Sopenharmony_ci 21c29fa5a6Sopenharmony_cinamespace OHOS { 22c29fa5a6Sopenharmony_cinamespace MMI { 23c29fa5a6Sopenharmony_citemplate<typename T> 24c29fa5a6Sopenharmony_ciclass Vector3 { 25c29fa5a6Sopenharmony_cipublic: 26c29fa5a6Sopenharmony_ci union { 27c29fa5a6Sopenharmony_ci struct { 28c29fa5a6Sopenharmony_ci T x_; 29c29fa5a6Sopenharmony_ci T y_; 30c29fa5a6Sopenharmony_ci T z_; 31c29fa5a6Sopenharmony_ci }; 32c29fa5a6Sopenharmony_ci T data_[3]; 33c29fa5a6Sopenharmony_ci }; 34c29fa5a6Sopenharmony_ci 35c29fa5a6Sopenharmony_ci Vector3(); 36c29fa5a6Sopenharmony_ci Vector3(T x, T y, T z); 37c29fa5a6Sopenharmony_ci explicit Vector3(T* v); 38c29fa5a6Sopenharmony_ci ~Vector3(); 39c29fa5a6Sopenharmony_ci 40c29fa5a6Sopenharmony_ci Vector3 Normalized() const; 41c29fa5a6Sopenharmony_ci T Dot(const Vector3<T>& other) const; 42c29fa5a6Sopenharmony_ci Vector3 Cross(const Vector3<T>& other) const; 43c29fa5a6Sopenharmony_ci T GetSqrLength() const; 44c29fa5a6Sopenharmony_ci T GetLength() const; 45c29fa5a6Sopenharmony_ci void SetZero(); 46c29fa5a6Sopenharmony_ci void SetValues(T x, T y, T z); 47c29fa5a6Sopenharmony_ci T Normalize(); 48c29fa5a6Sopenharmony_ci 49c29fa5a6Sopenharmony_ci Vector3& operator*=(const Vector3<T>& other); 50c29fa5a6Sopenharmony_ci Vector3& operator*=(T s); 51c29fa5a6Sopenharmony_ci Vector3 operator*(T s) const; 52c29fa5a6Sopenharmony_ci Vector3 operator+(const Vector3<T>& other) const; 53c29fa5a6Sopenharmony_ci Vector3& operator+=(const Vector3<T>& other); 54c29fa5a6Sopenharmony_ci Vector3& operator=(const Vector3<T>& other); 55c29fa5a6Sopenharmony_ci Vector3 operator-(const Vector3<T>& other) const; 56c29fa5a6Sopenharmony_ci T operator[](int index) const; 57c29fa5a6Sopenharmony_ci T& operator[](int index); 58c29fa5a6Sopenharmony_ci bool operator==(const Vector3& other) const; 59c29fa5a6Sopenharmony_ci T* GetData(); 60c29fa5a6Sopenharmony_ci 61c29fa5a6Sopenharmony_ci static const Vector3 ZERO; 62c29fa5a6Sopenharmony_ci}; 63c29fa5a6Sopenharmony_ci 64c29fa5a6Sopenharmony_citypedef Vector3<float> Vector3f; 65c29fa5a6Sopenharmony_citypedef Vector3<double> Vector3d; 66c29fa5a6Sopenharmony_citemplate<typename T> 67c29fa5a6Sopenharmony_ciconst Vector3<T> Vector3<T>::ZERO(0.0, 0.0, 0.0); 68c29fa5a6Sopenharmony_ci 69c29fa5a6Sopenharmony_citemplate<typename T> 70c29fa5a6Sopenharmony_ciVector3<T>::Vector3() 71c29fa5a6Sopenharmony_ci{ 72c29fa5a6Sopenharmony_ci data_[0] = 0.0; 73c29fa5a6Sopenharmony_ci data_[1] = 0.0; 74c29fa5a6Sopenharmony_ci data_[2] = 0.0; 75c29fa5a6Sopenharmony_ci} 76c29fa5a6Sopenharmony_ci 77c29fa5a6Sopenharmony_citemplate<typename T> 78c29fa5a6Sopenharmony_ciVector3<T>::Vector3(T x, T y, T z) 79c29fa5a6Sopenharmony_ci{ 80c29fa5a6Sopenharmony_ci data_[0] = x; 81c29fa5a6Sopenharmony_ci data_[1] = y; 82c29fa5a6Sopenharmony_ci data_[2] = z; 83c29fa5a6Sopenharmony_ci} 84c29fa5a6Sopenharmony_ci 85c29fa5a6Sopenharmony_citemplate<typename T> 86c29fa5a6Sopenharmony_ciVector3<T>::Vector3(T* v) 87c29fa5a6Sopenharmony_ci{ 88c29fa5a6Sopenharmony_ci data_[0] = v[0]; 89c29fa5a6Sopenharmony_ci data_[1] = v[1]; 90c29fa5a6Sopenharmony_ci data_[2] = v[2]; 91c29fa5a6Sopenharmony_ci} 92c29fa5a6Sopenharmony_ci 93c29fa5a6Sopenharmony_citemplate<typename T> 94c29fa5a6Sopenharmony_ciVector3<T>::~Vector3() 95c29fa5a6Sopenharmony_ci{} 96c29fa5a6Sopenharmony_ci 97c29fa5a6Sopenharmony_citemplate<typename T> 98c29fa5a6Sopenharmony_ciVector3<T> Vector3<T>::Normalized() const 99c29fa5a6Sopenharmony_ci{ 100c29fa5a6Sopenharmony_ci Vector3<T> rNormalize(*this); 101c29fa5a6Sopenharmony_ci rNormalize.Normalize(); 102c29fa5a6Sopenharmony_ci return rNormalize; 103c29fa5a6Sopenharmony_ci} 104c29fa5a6Sopenharmony_ci 105c29fa5a6Sopenharmony_citemplate<typename T> 106c29fa5a6Sopenharmony_ciT Vector3<T>::Dot(const Vector3<T>& other) const 107c29fa5a6Sopenharmony_ci{ 108c29fa5a6Sopenharmony_ci const T* oData = other.data_; 109c29fa5a6Sopenharmony_ci T sum = data_[0] * oData[0]; 110c29fa5a6Sopenharmony_ci sum += data_[1] * oData[1]; 111c29fa5a6Sopenharmony_ci sum += data_[2] * oData[2]; 112c29fa5a6Sopenharmony_ci return sum; 113c29fa5a6Sopenharmony_ci} 114c29fa5a6Sopenharmony_ci 115c29fa5a6Sopenharmony_citemplate<typename T> 116c29fa5a6Sopenharmony_ciVector3<T> Vector3<T>::Cross(const Vector3<T>& other) const 117c29fa5a6Sopenharmony_ci{ 118c29fa5a6Sopenharmony_ci T x = data_[0]; 119c29fa5a6Sopenharmony_ci T y = data_[1]; 120c29fa5a6Sopenharmony_ci T z = data_[2]; 121c29fa5a6Sopenharmony_ci const T* oData = other.data_; 122c29fa5a6Sopenharmony_ci T oX = oData[0]; 123c29fa5a6Sopenharmony_ci T oY = oData[1]; 124c29fa5a6Sopenharmony_ci T oZ = oData[2]; 125c29fa5a6Sopenharmony_ci Vector3<T> rCross; 126c29fa5a6Sopenharmony_ci rCross.SetValues(y * oZ - z * oY, z * oX - x * oZ, x * oY - y * oX); 127c29fa5a6Sopenharmony_ci return rCross; 128c29fa5a6Sopenharmony_ci} 129c29fa5a6Sopenharmony_ci 130c29fa5a6Sopenharmony_citemplate<typename T> 131c29fa5a6Sopenharmony_ciT Vector3<T>::GetSqrLength() const 132c29fa5a6Sopenharmony_ci{ 133c29fa5a6Sopenharmony_ci T x = data_[0]; 134c29fa5a6Sopenharmony_ci T y = data_[1]; 135c29fa5a6Sopenharmony_ci T z = data_[2]; 136c29fa5a6Sopenharmony_ci return (x * x) + (y * y) + (z * z); 137c29fa5a6Sopenharmony_ci} 138c29fa5a6Sopenharmony_ci 139c29fa5a6Sopenharmony_citemplate<typename T> 140c29fa5a6Sopenharmony_ciT Vector3<T>::GetLength() const 141c29fa5a6Sopenharmony_ci{ 142c29fa5a6Sopenharmony_ci return sqrt(GetSqrLength()); 143c29fa5a6Sopenharmony_ci} 144c29fa5a6Sopenharmony_ci 145c29fa5a6Sopenharmony_citemplate<typename T> 146c29fa5a6Sopenharmony_civoid Vector3<T>::SetZero() 147c29fa5a6Sopenharmony_ci{ 148c29fa5a6Sopenharmony_ci *this = ZERO; 149c29fa5a6Sopenharmony_ci} 150c29fa5a6Sopenharmony_ci 151c29fa5a6Sopenharmony_citemplate<typename T> 152c29fa5a6Sopenharmony_civoid Vector3<T>::SetValues(T x, T y, T z) 153c29fa5a6Sopenharmony_ci{ 154c29fa5a6Sopenharmony_ci data_[0] = x; 155c29fa5a6Sopenharmony_ci data_[1] = y; 156c29fa5a6Sopenharmony_ci data_[2] = z; 157c29fa5a6Sopenharmony_ci} 158c29fa5a6Sopenharmony_ci 159c29fa5a6Sopenharmony_citemplate<typename T> 160c29fa5a6Sopenharmony_ciT Vector3<T>::Normalize() 161c29fa5a6Sopenharmony_ci{ 162c29fa5a6Sopenharmony_ci T l = GetLength(); 163c29fa5a6Sopenharmony_ci if (MMI_EQ<T>(l, 0.0)) { 164c29fa5a6Sopenharmony_ci return 0.0; 165c29fa5a6Sopenharmony_ci } 166c29fa5a6Sopenharmony_ci 167c29fa5a6Sopenharmony_ci const T d = 1.0f / l; 168c29fa5a6Sopenharmony_ci data_[0] *= d; 169c29fa5a6Sopenharmony_ci data_[1] *= d; 170c29fa5a6Sopenharmony_ci data_[2] *= d; 171c29fa5a6Sopenharmony_ci return l; 172c29fa5a6Sopenharmony_ci} 173c29fa5a6Sopenharmony_ci 174c29fa5a6Sopenharmony_citemplate<typename T> 175c29fa5a6Sopenharmony_ciVector3<T>& Vector3<T>::operator*=(const Vector3<T>& other) 176c29fa5a6Sopenharmony_ci{ 177c29fa5a6Sopenharmony_ci const T* oData = other.data_; 178c29fa5a6Sopenharmony_ci data_[0] *= oData[0]; 179c29fa5a6Sopenharmony_ci data_[1] *= oData[1]; 180c29fa5a6Sopenharmony_ci data_[2] *= oData[2]; 181c29fa5a6Sopenharmony_ci return *this; 182c29fa5a6Sopenharmony_ci} 183c29fa5a6Sopenharmony_ci 184c29fa5a6Sopenharmony_citemplate<typename T> 185c29fa5a6Sopenharmony_ciVector3<T>& Vector3<T>::operator*=(T s) 186c29fa5a6Sopenharmony_ci{ 187c29fa5a6Sopenharmony_ci data_[0] *= s; 188c29fa5a6Sopenharmony_ci data_[1] *= s; 189c29fa5a6Sopenharmony_ci data_[2] *= s; 190c29fa5a6Sopenharmony_ci return *this; 191c29fa5a6Sopenharmony_ci} 192c29fa5a6Sopenharmony_ci 193c29fa5a6Sopenharmony_citemplate<typename T> 194c29fa5a6Sopenharmony_ciVector3<T> Vector3<T>::operator*(T s) const 195c29fa5a6Sopenharmony_ci{ 196c29fa5a6Sopenharmony_ci Vector3<T> rMulti(*this); 197c29fa5a6Sopenharmony_ci T* rData = rMulti.data_; 198c29fa5a6Sopenharmony_ci 199c29fa5a6Sopenharmony_ci rData[0] *= s; 200c29fa5a6Sopenharmony_ci rData[1] *= s; 201c29fa5a6Sopenharmony_ci rData[2] *= s; 202c29fa5a6Sopenharmony_ci return rMulti; 203c29fa5a6Sopenharmony_ci} 204c29fa5a6Sopenharmony_ci 205c29fa5a6Sopenharmony_citemplate<typename T> 206c29fa5a6Sopenharmony_ciVector3<T> Vector3<T>::operator+(const Vector3<T>& other) const 207c29fa5a6Sopenharmony_ci{ 208c29fa5a6Sopenharmony_ci Vector3<T> rVec = *this; 209c29fa5a6Sopenharmony_ci rVec += other; 210c29fa5a6Sopenharmony_ci return rVec; 211c29fa5a6Sopenharmony_ci} 212c29fa5a6Sopenharmony_ci 213c29fa5a6Sopenharmony_citemplate<typename T> 214c29fa5a6Sopenharmony_ciVector3<T>& Vector3<T>::operator+=(const Vector3<T>& other) 215c29fa5a6Sopenharmony_ci{ 216c29fa5a6Sopenharmony_ci data_[0] += other.data_[0]; 217c29fa5a6Sopenharmony_ci data_[1] += other.data_[1]; 218c29fa5a6Sopenharmony_ci data_[2] += other.data_[2]; 219c29fa5a6Sopenharmony_ci return *this; 220c29fa5a6Sopenharmony_ci} 221c29fa5a6Sopenharmony_ci 222c29fa5a6Sopenharmony_citemplate<typename T> 223c29fa5a6Sopenharmony_ciVector3<T>& Vector3<T>::operator=(const Vector3<T>& other) 224c29fa5a6Sopenharmony_ci{ 225c29fa5a6Sopenharmony_ci data_[0] = other.data_[0]; 226c29fa5a6Sopenharmony_ci data_[1] = other.data_[1]; 227c29fa5a6Sopenharmony_ci data_[2] = other.data_[2]; 228c29fa5a6Sopenharmony_ci return *this; 229c29fa5a6Sopenharmony_ci} 230c29fa5a6Sopenharmony_ci 231c29fa5a6Sopenharmony_citemplate<typename T> 232c29fa5a6Sopenharmony_ciVector3<T> Vector3<T>::operator-(const Vector3<T>& other) const 233c29fa5a6Sopenharmony_ci{ 234c29fa5a6Sopenharmony_ci Vector3<T> rSub(*this); 235c29fa5a6Sopenharmony_ci T* rData = rSub.data_; 236c29fa5a6Sopenharmony_ci const T* oData = other.data_; 237c29fa5a6Sopenharmony_ci rData[0] -= oData[0]; 238c29fa5a6Sopenharmony_ci rData[1] -= oData[1]; 239c29fa5a6Sopenharmony_ci rData[2] -= oData[2]; 240c29fa5a6Sopenharmony_ci return rSub; 241c29fa5a6Sopenharmony_ci} 242c29fa5a6Sopenharmony_ci 243c29fa5a6Sopenharmony_citemplate<typename T> 244c29fa5a6Sopenharmony_ciT Vector3<T>::operator[](int index) const 245c29fa5a6Sopenharmony_ci{ 246c29fa5a6Sopenharmony_ci return data_[index]; 247c29fa5a6Sopenharmony_ci} 248c29fa5a6Sopenharmony_ci 249c29fa5a6Sopenharmony_citemplate<typename T> 250c29fa5a6Sopenharmony_ciT& Vector3<T>::operator[](int index) 251c29fa5a6Sopenharmony_ci{ 252c29fa5a6Sopenharmony_ci return data_[index]; 253c29fa5a6Sopenharmony_ci} 254c29fa5a6Sopenharmony_ci 255c29fa5a6Sopenharmony_citemplate<typename T> 256c29fa5a6Sopenharmony_ciinline bool Vector3<T>::operator==(const Vector3& other) const 257c29fa5a6Sopenharmony_ci{ 258c29fa5a6Sopenharmony_ci const T* oData = other.data_; 259c29fa5a6Sopenharmony_ci 260c29fa5a6Sopenharmony_ci return (MMI_EQ<T>(data_[0], oData[0])) && (MMI_EQ<T>(data_[1], oData[1])) && (MMI_EQ<T>(data_[2], oData[2])); 261c29fa5a6Sopenharmony_ci} 262c29fa5a6Sopenharmony_ci 263c29fa5a6Sopenharmony_citemplate<typename T> 264c29fa5a6Sopenharmony_ciinline T* Vector3<T>::GetData() 265c29fa5a6Sopenharmony_ci{ 266c29fa5a6Sopenharmony_ci return data_; 267c29fa5a6Sopenharmony_ci} 268c29fa5a6Sopenharmony_ci} // namespace Rosen 269c29fa5a6Sopenharmony_ci} // namespace OHOS 270c29fa5a6Sopenharmony_ci#endif // RENDER_SERVICE_CLIENT_CORE_COMMON_RS_VECTOR3_H 271