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