skia2/include/utils/SkCamera.h
Ben Wagner a93a14a998 Convert NULL and 0 to nullptr.
This was created by looking at warnings produced by clang's
-Wzero-as-null-pointer-constant. This updates most issues in
Skia code. However, there are places where GL and Vulkan want
pointer values which are explicitly 0, external headers which
use NULL directly, and possibly more uses in un-compiled
sources (for other platforms).

Change-Id: Id22fbac04d5c53497a53d734f0896b4f06fe8345
Reviewed-on: https://skia-review.googlesource.com/39521
Reviewed-by: Mike Reed <reed@google.com>
Commit-Queue: Ben Wagner <bungeman@google.com>
2017-08-28 17:48:57 +00:00

154 lines
3.7 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 = nullptr) 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; // origin of the camera's space
SkPoint3D fAxis; // view direction
SkPoint3D fZenith; // up direction
SkPoint3D fObserver; // eye position (may not be the same as the origin)
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