Line data Source code
1 : /*
2 : * Copyright 2015 Google Inc.
3 : *
4 : * Use of this source code is governed by a BSD-style license that can be
5 : * found in the LICENSE file.
6 : */
7 :
8 : #ifndef SkPoint3_DEFINED
9 : #define SkPoint3_DEFINED
10 :
11 : #include "SkScalar.h"
12 :
13 : struct SK_API SkPoint3 {
14 : SkScalar fX, fY, fZ;
15 :
16 0 : static SkPoint3 Make(SkScalar x, SkScalar y, SkScalar z) {
17 : SkPoint3 pt;
18 0 : pt.set(x, y, z);
19 0 : return pt;
20 : }
21 :
22 : SkScalar x() const { return fX; }
23 : SkScalar y() const { return fY; }
24 0 : SkScalar z() const { return fZ; }
25 :
26 0 : void set(SkScalar x, SkScalar y, SkScalar z) { fX = x; fY = y; fZ = z; }
27 :
28 : friend bool operator==(const SkPoint3& a, const SkPoint3& b) {
29 : return a.fX == b.fX && a.fY == b.fY && a.fZ == b.fZ;
30 : }
31 :
32 : friend bool operator!=(const SkPoint3& a, const SkPoint3& b) {
33 : return !(a == b);
34 : }
35 :
36 : /** Returns the Euclidian distance from (0,0,0) to (x,y,z)
37 : */
38 : static SkScalar Length(SkScalar x, SkScalar y, SkScalar z);
39 :
40 : /** Return the Euclidian distance from (0,0,0) to the point
41 : */
42 : SkScalar length() const { return SkPoint3::Length(fX, fY, fZ); }
43 :
44 : /** Set the point (vector) to be unit-length in the same direction as it
45 : already points. If the point has a degenerate length (i.e., nearly 0)
46 : then set it to (0,0,0) and return false; otherwise return true.
47 : */
48 : bool normalize();
49 :
50 : /** Return a new point whose X, Y and Z coordinates are scaled.
51 : */
52 : SkPoint3 makeScale(SkScalar scale) const {
53 : SkPoint3 p;
54 : p.set(scale * fX, scale * fY, scale * fZ);
55 : return p;
56 : }
57 :
58 : /** Scale the point's coordinates by scale.
59 : */
60 : void scale(SkScalar value) {
61 : fX *= value;
62 : fY *= value;
63 : fZ *= value;
64 : }
65 :
66 : /** Return a new point whose X, Y and Z coordinates are the negative of the
67 : original point's
68 : */
69 : SkPoint3 operator-() const {
70 : SkPoint3 neg;
71 : neg.fX = -fX;
72 : neg.fY = -fY;
73 : neg.fZ = -fZ;
74 : return neg;
75 : }
76 :
77 : /** Returns a new point whose coordinates are the difference between
78 : a and b (i.e., a - b)
79 : */
80 : friend SkPoint3 operator-(const SkPoint3& a, const SkPoint3& b) {
81 : SkPoint3 v;
82 : v.set(a.fX - b.fX, a.fY - b.fY, a.fZ - b.fZ);
83 : return v;
84 : }
85 :
86 : /** Returns a new point whose coordinates are the sum of a and b (a + b)
87 : */
88 : friend SkPoint3 operator+(const SkPoint3& a, const SkPoint3& b) {
89 : SkPoint3 v;
90 : v.set(a.fX + b.fX, a.fY + b.fY, a.fZ + b.fZ);
91 : return v;
92 : }
93 :
94 : /** Add v's coordinates to the point's
95 : */
96 : void operator+=(const SkPoint3& v) {
97 : fX += v.fX;
98 : fY += v.fY;
99 : fZ += v.fZ;
100 : }
101 :
102 : /** Subtract v's coordinates from the point's
103 : */
104 : void operator-=(const SkPoint3& v) {
105 : fX -= v.fX;
106 : fY -= v.fY;
107 : fZ -= v.fZ;
108 : }
109 :
110 : /** Returns the dot product of a and b, treating them as 3D vectors
111 : */
112 : static SkScalar DotProduct(const SkPoint3& a, const SkPoint3& b) {
113 : return a.fX * b.fX + a.fY * b.fY + a.fZ * b.fZ;
114 : }
115 :
116 : SkScalar dot(const SkPoint3& vec) const {
117 : return DotProduct(*this, vec);
118 : }
119 : };
120 :
121 : typedef SkPoint3 SkVector3;
122 : typedef SkPoint3 SkColor3f;
123 :
124 : #endif
|