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