]> git.saurik.com Git - apple/javascriptcore.git/blob - wtf/Vector3.h
3c40b6111925a3ff2b8a776ddc867e65c82051f0
[apple/javascriptcore.git] / wtf / Vector3.h
1 /*
2 * Copyright (C) 2010 Google Inc. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 *
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
14 * its contributors may be used to endorse or promote products derived
15 * from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
18 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
21 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
24 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29 #ifndef Vector3_h
30 #define Vector3_h
31
32 #include <math.h>
33
34 namespace WebCore {
35
36 class Vector3 {
37 public:
38 Vector3()
39 : m_x(0.0)
40 , m_y(0.0)
41 , m_z(0.0)
42 {
43 }
44
45 Vector3(double x, double y, double z)
46 : m_x(x)
47 , m_y(y)
48 , m_z(z)
49 {
50 }
51
52 Vector3(const float p[3])
53 : m_x(p[0])
54 , m_y(p[1])
55 , m_z(p[2])
56 {
57 }
58
59 Vector3(const double p[3])
60 : m_x(p[0])
61 , m_y(p[1])
62 , m_z(p[2])
63 {
64 }
65
66 double abs() const
67 {
68 return sqrt(m_x * m_x + m_y * m_y + m_z * m_z);
69 }
70
71 bool isZero() const
72 {
73 return !m_x && !m_y && !m_z;
74 }
75
76 void normalize()
77 {
78 double absValue = abs();
79 if (!absValue)
80 return;
81
82 double k = 1.0 / absValue;
83 m_x *= k;
84 m_y *= k;
85 m_z *= k;
86 }
87
88 double x() const { return m_x; }
89 double y() const { return m_y; }
90 double z() const { return m_z; }
91
92 private:
93 double m_x;
94 double m_y;
95 double m_z;
96 };
97
98 inline Vector3 operator+(const Vector3& v1, const Vector3& v2)
99 {
100 return Vector3(v1.x() + v2.x(), v1.y() + v2.y(), v1.z() + v2.z());
101 }
102
103 inline Vector3 operator-(const Vector3& v1, const Vector3& v2)
104 {
105 return Vector3(v1.x() - v2.x(), v1.y() - v2.y(), v1.z() - v2.z());
106 }
107
108 inline Vector3 operator*(double k, const Vector3& v)
109 {
110 return Vector3(k * v.x(), k * v.y(), k * v.z());
111 }
112
113 inline Vector3 operator*(const Vector3& v, double k)
114 {
115 return Vector3(k * v.x(), k * v.y(), k * v.z());
116 }
117
118 inline double dot(const Vector3& v1, const Vector3& v2)
119 {
120 return v1.x() * v2.x() + v1.y() * v2.y() + v1.z() * v2.z();
121 }
122
123 inline Vector3 cross(const Vector3& v1, const Vector3& v2)
124 {
125 double x3 = v1.y() * v2.z() - v1.z() * v2.y();
126 double y3 = v1.z() * v2.x() - v1.x() * v2.z();
127 double z3 = v1.x() * v2.y() - v1.y() * v2.x();
128 return Vector3(x3, y3, z3);
129 }
130
131 inline double distance(const Vector3& v1, const Vector3& v2)
132 {
133 return (v1 - v2).abs();
134 }
135
136 } // WebCore
137
138 #endif // Vector3_h