]> git.saurik.com Git - apple/javascriptcore.git/blame - wtf/Vector3.h
JavaScriptCore-721.26.tar.gz
[apple/javascriptcore.git] / wtf / Vector3.h
CommitLineData
4e4e5a6f
A
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
34namespace WebCore {
35
36class Vector3 {
37public:
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
92private:
93 double m_x;
94 double m_y;
95 double m_z;
96};
97
98inline 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
103inline 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
108inline Vector3 operator*(double k, const Vector3& v)
109{
110 return Vector3(k * v.x(), k * v.y(), k * v.z());
111}
112
113inline Vector3 operator*(const Vector3& v, double k)
114{
115 return Vector3(k * v.x(), k * v.y(), k * v.z());
116}
117
118inline 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
123inline 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
131inline double distance(const Vector3& v1, const Vector3& v2)
132{
133 return (v1 - v2).abs();
134}
135
136} // WebCore
137
138#endif // Vector3_h