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