11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
20910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/*
31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2006 The Android Open Source Project
40910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project *
51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be
61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file.
70910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */
80910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
90910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project//  Inspired by Rob Johnson's most excellent QuickDraw GX sample code
130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifndef SkCamera_DEFINED
150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkCamera_DEFINED
160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "Sk64.h"
180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkMatrix.h"
190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkCanvas;
210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_SCALAR_IS_FIXED
230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    typedef SkFract SkUnitScalar;
240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    #define SK_UnitScalar1          SK_Fract1
250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    #define SkUnitScalarMul(a, b)   SkFractMul(a, b)
260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    #define SkUnitScalarDiv(a, b)   SkFractDiv(a, b)
270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#else
280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    typedef float   SkUnitScalar;
290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    #define SK_UnitScalar1          SK_Scalar1
300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    #define SkUnitScalarMul(a, b)   SkScalarMul(a, b)
310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    #define SkUnitScalarDiv(a, b)   SkScalarDiv(a, b)
320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectstruct SkUnit3D {
350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkUnitScalar    fX, fY, fZ;
360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void set(SkUnitScalar x, SkUnitScalar y, SkUnitScalar z)
380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    {
390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        fX = x; fY = y; fZ = z;
400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    static SkUnitScalar Dot(const SkUnit3D&, const SkUnit3D&);
420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    static void Cross(const SkUnit3D&, const SkUnit3D&, SkUnit3D* cross);
430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectstruct SkPoint3D {
460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkScalar    fX, fY, fZ;
470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void set(SkScalar x, SkScalar y, SkScalar z)
490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    {
500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        fX = x; fY = y; fZ = z;
510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkScalar    normalize(SkUnit3D*) const;
530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projecttypedef SkPoint3D SkVector3D;
550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectstruct SkMatrix3D {
570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkScalar    fMat[3][4];
580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void reset();
600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void setRow(int row, SkScalar a, SkScalar b, SkScalar c, SkScalar d = 0)
620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    {
630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkASSERT((unsigned)row < 3);
640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        fMat[row][0] = a;
650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        fMat[row][1] = b;
660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        fMat[row][2] = c;
670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        fMat[row][3] = d;
680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void setRotateX(SkScalar deg);
710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void setRotateY(SkScalar deg);
720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void setRotateZ(SkScalar deg);
730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void setTranslate(SkScalar x, SkScalar y, SkScalar z);
740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void preRotateX(SkScalar deg);
760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void preRotateY(SkScalar deg);
770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void preRotateZ(SkScalar deg);
780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void preTranslate(SkScalar x, SkScalar y, SkScalar z);
790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void setConcat(const SkMatrix3D& a, const SkMatrix3D& b);
810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void mapPoint(const SkPoint3D& src, SkPoint3D* dst) const;
820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void mapVector(const SkVector3D& src, SkVector3D* dst) const;
830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void mapPoint(SkPoint3D* v) const
850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    {
860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        this->mapPoint(*v, v);
870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void mapVector(SkVector3D* v) const
890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    {
900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        this->mapVector(*v, v);
910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkPatch3D {
950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectpublic:
960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkPatch3D();
970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void    reset();
990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void    transform(const SkMatrix3D&, SkPatch3D* dst = NULL) const;
1000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    // dot a unit vector with the patch's normal
1020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkScalar dotWith(SkScalar dx, SkScalar dy, SkScalar dz) const;
1030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkScalar dotWith(const SkVector3D& v) const
1040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    {
1050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        return this->dotWith(v.fX, v.fY, v.fZ);
1060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
1070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    // depreicated, but still here for animator (for now)
1090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void rotate(SkScalar x, SkScalar y, SkScalar z) {}
1100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void rotateDegrees(SkScalar x, SkScalar y, SkScalar z) {}
1110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprivate:
1130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectpublic: // make public for SkDraw3D for now
1140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkVector3D  fU, fV;
1150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkPoint3D   fOrigin;
1160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    friend class SkCamera3D;
1180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
1190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkCamera3D {
1210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectpublic:
1220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkCamera3D();
1230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void reset();
1250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void update();
1260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void patchToMatrix(const SkPatch3D&, SkMatrix* matrix) const;
1270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkPoint3D   fLocation;
1290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkPoint3D   fAxis;
1300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkPoint3D   fZenith;
1310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkPoint3D   fObserver;
1320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprivate:
1340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    mutable SkMatrix    fOrientation;
1350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    mutable bool        fNeedToUpdate;
1360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void doUpdate() const;
1380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
1390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass Sk3DView : SkNoncopyable {
1410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectpublic:
1420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    Sk3DView();
1430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    ~Sk3DView();
1440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void save();
1460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void restore();
1470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void translate(SkScalar x, SkScalar y, SkScalar z);
1490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void rotateX(SkScalar deg);
1500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void rotateY(SkScalar deg);
1510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void rotateZ(SkScalar deg);
1520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#ifdef SK_BUILD_FOR_ANDROID
154374bcd3e969068bd8ad560b84521ab12c29447f0Romain Guy    void setCameraLocation(SkScalar x, SkScalar y, SkScalar z);
155573b53f8618997434563ae650004f89a20aaf631Chet Haase    SkScalar getCameraLocationX();
156573b53f8618997434563ae650004f89a20aaf631Chet Haase    SkScalar getCameraLocationY();
157573b53f8618997434563ae650004f89a20aaf631Chet Haase    SkScalar getCameraLocationZ();
15805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#endif
159374bcd3e969068bd8ad560b84521ab12c29447f0Romain Guy
1600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void getMatrix(SkMatrix*) const;
1610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void applyToCanvas(SkCanvas*) const;
1620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkScalar dotWithNormal(SkScalar dx, SkScalar dy, SkScalar dz) const;
1640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprivate:
1660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    struct Rec {
1670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        Rec*        fNext;
1680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkMatrix3D  fMatrix;
1690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    };
1700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    Rec*        fRec;
1710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    Rec         fInitialRec;
1720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkCamera3D  fCamera;
1730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
1740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
1760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
177