18a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/*
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2006 The Android Open Source Project
38a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com *
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
68a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com */
78a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
88a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//  Inspired by Rob Johnson's most excellent QuickDraw GX sample code
98a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifndef SkCamera_DEFINED
118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define SkCamera_DEFINED
128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkMatrix.h"
148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkCanvas;
168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstruct SkUnit3D {
18d173b8760887f9b10cd43cc99ad6b8011e269370mike@reedtribe.org    SkScalar fX, fY, fZ;
198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
20d173b8760887f9b10cd43cc99ad6b8011e269370mike@reedtribe.org    void set(SkScalar x, SkScalar y, SkScalar z) {
218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        fX = x; fY = y; fZ = z;
228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
23d173b8760887f9b10cd43cc99ad6b8011e269370mike@reedtribe.org    static SkScalar Dot(const SkUnit3D&, const SkUnit3D&);
248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    static void Cross(const SkUnit3D&, const SkUnit3D&, SkUnit3D* cross);
258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstruct SkPoint3D {
288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkScalar    fX, fY, fZ;
298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
30d173b8760887f9b10cd43cc99ad6b8011e269370mike@reedtribe.org    void set(SkScalar x, SkScalar y, SkScalar z) {
318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        fX = x; fY = y; fZ = z;
328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkScalar    normalize(SkUnit3D*) const;
348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comtypedef SkPoint3D SkVector3D;
368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstruct SkMatrix3D {
388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkScalar    fMat[3][4];
39fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void reset();
418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
42d173b8760887f9b10cd43cc99ad6b8011e269370mike@reedtribe.org    void setRow(int row, SkScalar a, SkScalar b, SkScalar c, SkScalar d = 0) {
438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkASSERT((unsigned)row < 3);
448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        fMat[row][0] = a;
458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        fMat[row][1] = b;
468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        fMat[row][2] = c;
478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        fMat[row][3] = d;
488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void setRotateX(SkScalar deg);
518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void setRotateY(SkScalar deg);
528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void setRotateZ(SkScalar deg);
538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void setTranslate(SkScalar x, SkScalar y, SkScalar z);
54fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void preRotateX(SkScalar deg);
568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void preRotateY(SkScalar deg);
578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void preRotateZ(SkScalar deg);
588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void preTranslate(SkScalar x, SkScalar y, SkScalar z);
598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void setConcat(const SkMatrix3D& a, const SkMatrix3D& b);
618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void mapPoint(const SkPoint3D& src, SkPoint3D* dst) const;
628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void mapVector(const SkVector3D& src, SkVector3D* dst) const;
638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
64d173b8760887f9b10cd43cc99ad6b8011e269370mike@reedtribe.org    void mapPoint(SkPoint3D* v) const {
658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        this->mapPoint(*v, v);
668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
67d173b8760887f9b10cd43cc99ad6b8011e269370mike@reedtribe.org
68d173b8760887f9b10cd43cc99ad6b8011e269370mike@reedtribe.org    void mapVector(SkVector3D* v) const {
698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        this->mapVector(*v, v);
708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkPatch3D {
748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic:
758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkPatch3D();
768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void    reset();
78a93a14a99816d25b773f0b12868143702baf44bfBen Wagner    void    transform(const SkMatrix3D&, SkPatch3D* dst = nullptr) const;
798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    // dot a unit vector with the patch's normal
818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkScalar dotWith(SkScalar dx, SkScalar dy, SkScalar dz) const;
82d173b8760887f9b10cd43cc99ad6b8011e269370mike@reedtribe.org    SkScalar dotWith(const SkVector3D& v) const {
838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        return this->dotWith(v.fX, v.fY, v.fZ);
848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
86d4144060731a94a5b057dfad407e6e3c294435cfrobertphillips@google.com    // deprecated, but still here for animator (for now)
87c87dd2ce965cd1bbc8a74abe0c141658a469d7f2djsollen    void rotate(SkScalar /*x*/, SkScalar /*y*/, SkScalar /*z*/) {}
88c87dd2ce965cd1bbc8a74abe0c141658a469d7f2djsollen    void rotateDegrees(SkScalar /*x*/, SkScalar /*y*/, SkScalar /*z*/) {}
898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate:
918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic: // make public for SkDraw3D for now
928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkVector3D  fU, fV;
938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkPoint3D   fOrigin;
94fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    friend class SkCamera3D;
968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkCamera3D {
998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic:
1008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkCamera3D();
1018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void reset();
1038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void update();
1048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void patchToMatrix(const SkPatch3D&, SkMatrix* matrix) const;
1058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
106da96550d3941cb794a799c73506a1c5b695c70a1Jim Van Verth    SkPoint3D   fLocation;   // origin of the camera's space
107da96550d3941cb794a799c73506a1c5b695c70a1Jim Van Verth    SkPoint3D   fAxis;       // view direction
108da96550d3941cb794a799c73506a1c5b695c70a1Jim Van Verth    SkPoint3D   fZenith;     // up direction
109da96550d3941cb794a799c73506a1c5b695c70a1Jim Van Verth    SkPoint3D   fObserver;   // eye position (may not be the same as the origin)
1108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate:
1128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    mutable SkMatrix    fOrientation;
1138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    mutable bool        fNeedToUpdate;
1148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void doUpdate() const;
1168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
1178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1182fbf1bc8c96f749a4c098bcfc827053445c2e12dDerek Sollenbergerclass SK_API Sk3DView : SkNoncopyable {
1198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic:
1208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    Sk3DView();
1218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    ~Sk3DView();
1228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void save();
1248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void restore();
1258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void translate(SkScalar x, SkScalar y, SkScalar z);
1278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void rotateX(SkScalar deg);
1288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void rotateY(SkScalar deg);
1298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void rotateZ(SkScalar deg);
1308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
13156c69773aea56c6c6bd47bc7e7970dd081205184djsollen@google.com#ifdef SK_BUILD_FOR_ANDROID
132cd9d69b9ce7eb301a9fd8d91b9f95fd99b07bae5djsollen@google.com    void setCameraLocation(SkScalar x, SkScalar y, SkScalar z);
133e63793a2c8d2871bf7d95195be7b93ff669688d7djsollen@google.com    SkScalar getCameraLocationX();
134e63793a2c8d2871bf7d95195be7b93ff669688d7djsollen@google.com    SkScalar getCameraLocationY();
135e63793a2c8d2871bf7d95195be7b93ff669688d7djsollen@google.com    SkScalar getCameraLocationZ();
136cd9d69b9ce7eb301a9fd8d91b9f95fd99b07bae5djsollen@google.com#endif
137cd9d69b9ce7eb301a9fd8d91b9f95fd99b07bae5djsollen@google.com
1388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void getMatrix(SkMatrix*) const;
1398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void applyToCanvas(SkCanvas*) const;
1408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkScalar dotWithNormal(SkScalar dx, SkScalar dy, SkScalar dz) const;
142fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
1438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate:
1448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    struct Rec {
1458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        Rec*        fNext;
1468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkMatrix3D  fMatrix;
1478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    };
1488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    Rec*        fRec;
1498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    Rec         fInitialRec;
1508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkCamera3D  fCamera;
1518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
1528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
154