1fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/*
2fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Copyright 2006 The Android Open Source Project
3fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot *
4fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Use of this source code is governed by a BSD-style license that can be
5fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * found in the LICENSE file.
6fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */
7fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
8fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot//  Inspired by Rob Johnson's most excellent QuickDraw GX sample code
9fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
10fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#ifndef SkCamera_DEFINED
11fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#define SkCamera_DEFINED
12fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
13fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkMatrix.h"
14fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
15fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass SkCanvas;
16fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
17fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstruct SkUnit3D {
18fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkScalar fX, fY, fZ;
19fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
20fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void set(SkScalar x, SkScalar y, SkScalar z) {
21fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fX = x; fY = y; fZ = z;
22fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
23fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    static SkScalar Dot(const SkUnit3D&, const SkUnit3D&);
24fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    static void Cross(const SkUnit3D&, const SkUnit3D&, SkUnit3D* cross);
25fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
26fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
27fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstruct SkPoint3D {
28fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkScalar    fX, fY, fZ;
29fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
30fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void set(SkScalar x, SkScalar y, SkScalar z) {
31fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fX = x; fY = y; fZ = z;
32fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
33fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkScalar    normalize(SkUnit3D*) const;
34fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
35fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robottypedef SkPoint3D SkVector3D;
36fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
37fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstruct SkMatrix3D {
38fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkScalar    fMat[3][4];
39fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
40fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void reset();
41fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
42fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void setRow(int row, SkScalar a, SkScalar b, SkScalar c, SkScalar d = 0) {
43fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkASSERT((unsigned)row < 3);
44fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fMat[row][0] = a;
45fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fMat[row][1] = b;
46fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fMat[row][2] = c;
47fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fMat[row][3] = d;
48fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
49fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
50fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void setRotateX(SkScalar deg);
51fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void setRotateY(SkScalar deg);
52fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void setRotateZ(SkScalar deg);
53fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void setTranslate(SkScalar x, SkScalar y, SkScalar z);
54fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
55fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void preRotateX(SkScalar deg);
56fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void preRotateY(SkScalar deg);
57fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void preRotateZ(SkScalar deg);
58fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void preTranslate(SkScalar x, SkScalar y, SkScalar z);
59fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
60fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void setConcat(const SkMatrix3D& a, const SkMatrix3D& b);
61fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void mapPoint(const SkPoint3D& src, SkPoint3D* dst) const;
62fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void mapVector(const SkVector3D& src, SkVector3D* dst) const;
63fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
64fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void mapPoint(SkPoint3D* v) const {
65fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        this->mapPoint(*v, v);
66fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
67fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
68fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void mapVector(SkVector3D* v) const {
69fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        this->mapVector(*v, v);
70fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
71fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
72fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
73fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass SkPatch3D {
74fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic:
75fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkPatch3D();
76fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
77fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void    reset();
78fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void    transform(const SkMatrix3D&, SkPatch3D* dst = nullptr) const;
79fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
80fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // dot a unit vector with the patch's normal
81fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkScalar dotWith(SkScalar dx, SkScalar dy, SkScalar dz) const;
82fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkScalar dotWith(const SkVector3D& v) const {
83fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return this->dotWith(v.fX, v.fY, v.fZ);
84fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
85fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
86fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // deprecated, but still here for animator (for now)
87fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void rotate(SkScalar /*x*/, SkScalar /*y*/, SkScalar /*z*/) {}
88fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void rotateDegrees(SkScalar /*x*/, SkScalar /*y*/, SkScalar /*z*/) {}
89fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
90fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate:
91fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic: // make public for SkDraw3D for now
92fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkVector3D  fU, fV;
93fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkPoint3D   fOrigin;
94fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
95fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    friend class SkCamera3D;
96fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
97fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
98fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass SkCamera3D {
99fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic:
100fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkCamera3D();
101fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
102fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void reset();
103fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void update();
104fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void patchToMatrix(const SkPatch3D&, SkMatrix* matrix) const;
105fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
106fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkPoint3D   fLocation;   // origin of the camera's space
107fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkPoint3D   fAxis;       // view direction
108fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkPoint3D   fZenith;     // up direction
109fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkPoint3D   fObserver;   // eye position (may not be the same as the origin)
110fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
111fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate:
112fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    mutable SkMatrix    fOrientation;
113fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    mutable bool        fNeedToUpdate;
114fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
115fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void doUpdate() const;
116fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
117fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
118fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass SK_API Sk3DView : SkNoncopyable {
119fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic:
120fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    Sk3DView();
121fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    ~Sk3DView();
122fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
123fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void save();
124fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void restore();
125fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
126fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void translate(SkScalar x, SkScalar y, SkScalar z);
127fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void rotateX(SkScalar deg);
128fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void rotateY(SkScalar deg);
129fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void rotateZ(SkScalar deg);
130fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
131fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#ifdef SK_BUILD_FOR_ANDROID
132fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void setCameraLocation(SkScalar x, SkScalar y, SkScalar z);
133fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkScalar getCameraLocationX();
134fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkScalar getCameraLocationY();
135fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkScalar getCameraLocationZ();
136fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#endif
137fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
138fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void getMatrix(SkMatrix*) const;
139fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void applyToCanvas(SkCanvas*) const;
140fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
141fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkScalar dotWithNormal(SkScalar dx, SkScalar dy, SkScalar dz) const;
142fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
143fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate:
144fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    struct Rec {
145fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        Rec*        fNext;
146fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkMatrix3D  fMatrix;
147fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    };
148fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    Rec*        fRec;
149fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    Rec         fInitialRec;
150fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkCamera3D  fCamera;
151fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
152fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
153fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#endif
154