blob: 2e5e3423bb5e63aca267dda3c839eff7a8974c41 [file] [log] [blame]
reed@android.com8a1c16f2008-12-17 15:59:43 +00001/*
epoger@google.comec3ed6a2011-07-28 14:26:00 +00002 * Copyright 2006 The Android Open Source Project
reed@android.com8a1c16f2008-12-17 15:59:43 +00003 *
epoger@google.comec3ed6a2011-07-28 14:26:00 +00004 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
reed@android.com8a1c16f2008-12-17 15:59:43 +00006 */
7
reed@android.com8a1c16f2008-12-17 15:59:43 +00008// Inspired by Rob Johnson's most excellent QuickDraw GX sample code
9
10#ifndef SkCamera_DEFINED
11#define SkCamera_DEFINED
12
reed@android.com8a1c16f2008-12-17 15:59:43 +000013#include "SkMatrix.h"
14
15class SkCanvas;
16
reed@google.com8f4d2302013-12-17 16:44:46 +000017typedef float SkUnitScalar;
18#define SK_UnitScalar1 SK_Scalar1
19#define SkUnitScalarMul(a, b) SkScalarMul(a, b)
20#define SkUnitScalarDiv(a, b) SkScalarDiv(a, b)
reed@android.com8a1c16f2008-12-17 15:59:43 +000021
22struct SkUnit3D {
23 SkUnitScalar fX, fY, fZ;
24
25 void set(SkUnitScalar x, SkUnitScalar y, SkUnitScalar z)
26 {
27 fX = x; fY = y; fZ = z;
28 }
29 static SkUnitScalar Dot(const SkUnit3D&, const SkUnit3D&);
30 static void Cross(const SkUnit3D&, const SkUnit3D&, SkUnit3D* cross);
31};
32
33struct SkPoint3D {
34 SkScalar fX, fY, fZ;
35
36 void set(SkScalar x, SkScalar y, SkScalar z)
37 {
38 fX = x; fY = y; fZ = z;
39 }
40 SkScalar normalize(SkUnit3D*) const;
41};
42typedef SkPoint3D SkVector3D;
43
44struct SkMatrix3D {
45 SkScalar fMat[3][4];
rmistry@google.comfbfcd562012-08-23 18:09:54 +000046
reed@android.com8a1c16f2008-12-17 15:59:43 +000047 void reset();
48
49 void setRow(int row, SkScalar a, SkScalar b, SkScalar c, SkScalar d = 0)
50 {
51 SkASSERT((unsigned)row < 3);
52 fMat[row][0] = a;
53 fMat[row][1] = b;
54 fMat[row][2] = c;
55 fMat[row][3] = d;
56 }
57
58 void setRotateX(SkScalar deg);
59 void setRotateY(SkScalar deg);
60 void setRotateZ(SkScalar deg);
61 void setTranslate(SkScalar x, SkScalar y, SkScalar z);
rmistry@google.comfbfcd562012-08-23 18:09:54 +000062
reed@android.com8a1c16f2008-12-17 15:59:43 +000063 void preRotateX(SkScalar deg);
64 void preRotateY(SkScalar deg);
65 void preRotateZ(SkScalar deg);
66 void preTranslate(SkScalar x, SkScalar y, SkScalar z);
67
68 void setConcat(const SkMatrix3D& a, const SkMatrix3D& b);
69 void mapPoint(const SkPoint3D& src, SkPoint3D* dst) const;
70 void mapVector(const SkVector3D& src, SkVector3D* dst) const;
71
72 void mapPoint(SkPoint3D* v) const
73 {
74 this->mapPoint(*v, v);
75 }
76 void mapVector(SkVector3D* v) const
77 {
78 this->mapVector(*v, v);
79 }
80};
81
82class SkPatch3D {
83public:
84 SkPatch3D();
85
86 void reset();
87 void transform(const SkMatrix3D&, SkPatch3D* dst = NULL) const;
88
89 // dot a unit vector with the patch's normal
90 SkScalar dotWith(SkScalar dx, SkScalar dy, SkScalar dz) const;
91 SkScalar dotWith(const SkVector3D& v) const
92 {
93 return this->dotWith(v.fX, v.fY, v.fZ);
94 }
95
robertphillips@google.comd4144062012-05-31 15:29:44 +000096 // deprecated, but still here for animator (for now)
reed@android.com8a1c16f2008-12-17 15:59:43 +000097 void rotate(SkScalar x, SkScalar y, SkScalar z) {}
98 void rotateDegrees(SkScalar x, SkScalar y, SkScalar z) {}
99
100private:
101public: // make public for SkDraw3D for now
102 SkVector3D fU, fV;
103 SkPoint3D fOrigin;
rmistry@google.comfbfcd562012-08-23 18:09:54 +0000104
reed@android.com8a1c16f2008-12-17 15:59:43 +0000105 friend class SkCamera3D;
106};
107
108class SkCamera3D {
109public:
110 SkCamera3D();
111
112 void reset();
113 void update();
114 void patchToMatrix(const SkPatch3D&, SkMatrix* matrix) const;
115
116 SkPoint3D fLocation;
117 SkPoint3D fAxis;
118 SkPoint3D fZenith;
119 SkPoint3D fObserver;
120
121private:
122 mutable SkMatrix fOrientation;
123 mutable bool fNeedToUpdate;
124
125 void doUpdate() const;
126};
127
128class Sk3DView : SkNoncopyable {
129public:
130 Sk3DView();
131 ~Sk3DView();
132
133 void save();
134 void restore();
135
136 void translate(SkScalar x, SkScalar y, SkScalar z);
137 void rotateX(SkScalar deg);
138 void rotateY(SkScalar deg);
139 void rotateZ(SkScalar deg);
140
djsollen@google.com56c69772011-11-08 19:00:26 +0000141#ifdef SK_BUILD_FOR_ANDROID
djsollen@google.comcd9d69b2011-03-14 20:30:14 +0000142 void setCameraLocation(SkScalar x, SkScalar y, SkScalar z);
djsollen@google.come63793a2012-03-21 15:39:03 +0000143 SkScalar getCameraLocationX();
144 SkScalar getCameraLocationY();
145 SkScalar getCameraLocationZ();
djsollen@google.comcd9d69b2011-03-14 20:30:14 +0000146#endif
147
reed@android.com8a1c16f2008-12-17 15:59:43 +0000148 void getMatrix(SkMatrix*) const;
149 void applyToCanvas(SkCanvas*) const;
150
151 SkScalar dotWithNormal(SkScalar dx, SkScalar dy, SkScalar dz) const;
rmistry@google.comfbfcd562012-08-23 18:09:54 +0000152
reed@android.com8a1c16f2008-12-17 15:59:43 +0000153private:
154 struct Rec {
155 Rec* fNext;
156 SkMatrix3D fMatrix;
157 };
158 Rec* fRec;
159 Rec fInitialRec;
160 SkCamera3D fCamera;
161};
162
163#endif