c87dd2ce96
This CL cleans up the existing violations and enables the build time check to ensure that we don't regress. The motiviation behind this change is to allow clients who include our headers to be able to build with this warning enabled. Review URL: https://codereview.chromium.org/726923002
154 lines
3.6 KiB
C++
154 lines
3.6 KiB
C++
/*
|
|
* Copyright 2006 The Android Open Source Project
|
|
*
|
|
* Use of this source code is governed by a BSD-style license that can be
|
|
* found in the LICENSE file.
|
|
*/
|
|
|
|
// Inspired by Rob Johnson's most excellent QuickDraw GX sample code
|
|
|
|
#ifndef SkCamera_DEFINED
|
|
#define SkCamera_DEFINED
|
|
|
|
#include "SkMatrix.h"
|
|
|
|
class SkCanvas;
|
|
|
|
struct SkUnit3D {
|
|
SkScalar fX, fY, fZ;
|
|
|
|
void set(SkScalar x, SkScalar y, SkScalar z) {
|
|
fX = x; fY = y; fZ = z;
|
|
}
|
|
static SkScalar Dot(const SkUnit3D&, const SkUnit3D&);
|
|
static void Cross(const SkUnit3D&, const SkUnit3D&, SkUnit3D* cross);
|
|
};
|
|
|
|
struct SkPoint3D {
|
|
SkScalar fX, fY, fZ;
|
|
|
|
void set(SkScalar x, SkScalar y, SkScalar z) {
|
|
fX = x; fY = y; fZ = z;
|
|
}
|
|
SkScalar normalize(SkUnit3D*) const;
|
|
};
|
|
typedef SkPoint3D SkVector3D;
|
|
|
|
struct SkMatrix3D {
|
|
SkScalar fMat[3][4];
|
|
|
|
void reset();
|
|
|
|
void setRow(int row, SkScalar a, SkScalar b, SkScalar c, SkScalar d = 0) {
|
|
SkASSERT((unsigned)row < 3);
|
|
fMat[row][0] = a;
|
|
fMat[row][1] = b;
|
|
fMat[row][2] = c;
|
|
fMat[row][3] = d;
|
|
}
|
|
|
|
void setRotateX(SkScalar deg);
|
|
void setRotateY(SkScalar deg);
|
|
void setRotateZ(SkScalar deg);
|
|
void setTranslate(SkScalar x, SkScalar y, SkScalar z);
|
|
|
|
void preRotateX(SkScalar deg);
|
|
void preRotateY(SkScalar deg);
|
|
void preRotateZ(SkScalar deg);
|
|
void preTranslate(SkScalar x, SkScalar y, SkScalar z);
|
|
|
|
void setConcat(const SkMatrix3D& a, const SkMatrix3D& b);
|
|
void mapPoint(const SkPoint3D& src, SkPoint3D* dst) const;
|
|
void mapVector(const SkVector3D& src, SkVector3D* dst) const;
|
|
|
|
void mapPoint(SkPoint3D* v) const {
|
|
this->mapPoint(*v, v);
|
|
}
|
|
|
|
void mapVector(SkVector3D* v) const {
|
|
this->mapVector(*v, v);
|
|
}
|
|
};
|
|
|
|
class SkPatch3D {
|
|
public:
|
|
SkPatch3D();
|
|
|
|
void reset();
|
|
void transform(const SkMatrix3D&, SkPatch3D* dst = NULL) const;
|
|
|
|
// dot a unit vector with the patch's normal
|
|
SkScalar dotWith(SkScalar dx, SkScalar dy, SkScalar dz) const;
|
|
SkScalar dotWith(const SkVector3D& v) const {
|
|
return this->dotWith(v.fX, v.fY, v.fZ);
|
|
}
|
|
|
|
// deprecated, but still here for animator (for now)
|
|
void rotate(SkScalar /*x*/, SkScalar /*y*/, SkScalar /*z*/) {}
|
|
void rotateDegrees(SkScalar /*x*/, SkScalar /*y*/, SkScalar /*z*/) {}
|
|
|
|
private:
|
|
public: // make public for SkDraw3D for now
|
|
SkVector3D fU, fV;
|
|
SkPoint3D fOrigin;
|
|
|
|
friend class SkCamera3D;
|
|
};
|
|
|
|
class SkCamera3D {
|
|
public:
|
|
SkCamera3D();
|
|
|
|
void reset();
|
|
void update();
|
|
void patchToMatrix(const SkPatch3D&, SkMatrix* matrix) const;
|
|
|
|
SkPoint3D fLocation;
|
|
SkPoint3D fAxis;
|
|
SkPoint3D fZenith;
|
|
SkPoint3D fObserver;
|
|
|
|
private:
|
|
mutable SkMatrix fOrientation;
|
|
mutable bool fNeedToUpdate;
|
|
|
|
void doUpdate() const;
|
|
};
|
|
|
|
class Sk3DView : SkNoncopyable {
|
|
public:
|
|
Sk3DView();
|
|
~Sk3DView();
|
|
|
|
void save();
|
|
void restore();
|
|
|
|
void translate(SkScalar x, SkScalar y, SkScalar z);
|
|
void rotateX(SkScalar deg);
|
|
void rotateY(SkScalar deg);
|
|
void rotateZ(SkScalar deg);
|
|
|
|
#ifdef SK_BUILD_FOR_ANDROID
|
|
void setCameraLocation(SkScalar x, SkScalar y, SkScalar z);
|
|
SkScalar getCameraLocationX();
|
|
SkScalar getCameraLocationY();
|
|
SkScalar getCameraLocationZ();
|
|
#endif
|
|
|
|
void getMatrix(SkMatrix*) const;
|
|
void applyToCanvas(SkCanvas*) const;
|
|
|
|
SkScalar dotWithNormal(SkScalar dx, SkScalar dy, SkScalar dz) const;
|
|
|
|
private:
|
|
struct Rec {
|
|
Rec* fNext;
|
|
SkMatrix3D fMatrix;
|
|
};
|
|
Rec* fRec;
|
|
Rec fInitialRec;
|
|
SkCamera3D fCamera;
|
|
};
|
|
|
|
#endif
|