00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef SkCamera_DEFINED
00022 #define SkCamera_DEFINED
00023
00024 #include "Sk64.h"
00025 #include "SkMatrix.h"
00026
00027 class SkCanvas;
00028
00029 #ifdef SK_SCALAR_IS_FIXED
00030 typedef SkFract SkUnitScalar;
00031 #define SK_UnitScalar1 SK_Fract1
00032 #define SkUnitScalarMul(a, b) SkFractMul(a, b)
00033 #define SkUnitScalarDiv(a, b) SkFractDiv(a, b)
00034 #else
00035 typedef float SkUnitScalar;
00036 #define SK_UnitScalar1 SK_Scalar1
00037 #define SkUnitScalarMul(a, b) SkScalarMul(a, b)
00038 #define SkUnitScalarDiv(a, b) SkScalarDiv(a, b)
00039 #endif
00040
00041 struct SkUnit3D {
00042 SkUnitScalar fX, fY, fZ;
00043
00044 void set(SkUnitScalar x, SkUnitScalar y, SkUnitScalar z)
00045 {
00046 fX = x; fY = y; fZ = z;
00047 }
00048 static SkUnitScalar Dot(const SkUnit3D&, const SkUnit3D&);
00049 static void Cross(const SkUnit3D&, const SkUnit3D&, SkUnit3D* cross);
00050 };
00051
00052 struct SkPoint3D {
00053 SkScalar fX, fY, fZ;
00054
00055 void set(SkScalar x, SkScalar y, SkScalar z)
00056 {
00057 fX = x; fY = y; fZ = z;
00058 }
00059 SkScalar normalize(SkUnit3D*) const;
00060 };
00061 typedef SkPoint3D SkVector3D;
00062
00063 struct SkMatrix3D {
00064 SkScalar fMat[3][4];
00065
00066 void reset();
00067
00068 void setRow(int row, SkScalar a, SkScalar b, SkScalar c, SkScalar d = 0)
00069 {
00070 SkASSERT((unsigned)row < 3);
00071 fMat[row][0] = a;
00072 fMat[row][1] = b;
00073 fMat[row][2] = c;
00074 fMat[row][3] = d;
00075 }
00076
00077 void setRotateX(SkScalar deg);
00078 void setRotateY(SkScalar deg);
00079 void setRotateZ(SkScalar deg);
00080 void setTranslate(SkScalar x, SkScalar y, SkScalar z);
00081
00082 void preRotateX(SkScalar deg);
00083 void preRotateY(SkScalar deg);
00084 void preRotateZ(SkScalar deg);
00085 void preTranslate(SkScalar x, SkScalar y, SkScalar z);
00086
00087 void setConcat(const SkMatrix3D& a, const SkMatrix3D& b);
00088 void mapPoint(const SkPoint3D& src, SkPoint3D* dst) const;
00089 void mapVector(const SkVector3D& src, SkVector3D* dst) const;
00090
00091 void mapPoint(SkPoint3D* v) const
00092 {
00093 this->mapPoint(*v, v);
00094 }
00095 void mapVector(SkVector3D* v) const
00096 {
00097 this->mapVector(*v, v);
00098 }
00099 };
00100
00101 class SkPatch3D {
00102 public:
00103 SkPatch3D();
00104
00105 void reset();
00106 void transform(const SkMatrix3D&, SkPatch3D* dst = NULL) const;
00107
00108
00109 SkScalar dotWith(SkScalar dx, SkScalar dy, SkScalar dz) const;
00110 SkScalar dotWith(const SkVector3D& v) const
00111 {
00112 return this->dotWith(v.fX, v.fY, v.fZ);
00113 }
00114
00115
00116 void rotate(SkScalar x, SkScalar y, SkScalar z) {}
00117 void rotateDegrees(SkScalar x, SkScalar y, SkScalar z) {}
00118
00119 private:
00120 public:
00121 SkVector3D fU, fV;
00122 SkPoint3D fOrigin;
00123
00124 friend class SkCamera3D;
00125 };
00126
00127 class SkCamera3D {
00128 public:
00129 SkCamera3D();
00130
00131 void reset();
00132 void update();
00133 void patchToMatrix(const SkPatch3D&, SkMatrix* matrix) const;
00134
00135 SkPoint3D fLocation;
00136 SkPoint3D fAxis;
00137 SkPoint3D fZenith;
00138 SkPoint3D fObserver;
00139
00140 private:
00141 mutable SkMatrix fOrientation;
00142 mutable bool fNeedToUpdate;
00143
00144 void doUpdate() const;
00145 };
00146
00147 class Sk3DView : SkNoncopyable {
00148 public:
00149 Sk3DView();
00150 ~Sk3DView();
00151
00152 void save();
00153 void restore();
00154
00155 void translate(SkScalar x, SkScalar y, SkScalar z);
00156 void rotateX(SkScalar deg);
00157 void rotateY(SkScalar deg);
00158 void rotateZ(SkScalar deg);
00159
00160 void getMatrix(SkMatrix*) const;
00161 void applyToCanvas(SkCanvas*) const;
00162
00163 SkScalar dotWithNormal(SkScalar dx, SkScalar dy, SkScalar dz) const;
00164
00165 private:
00166 struct Rec {
00167 Rec* fNext;
00168 SkMatrix3D fMatrix;
00169 };
00170 Rec* fRec;
00171 Rec fInitialRec;
00172 SkCamera3D fCamera;
00173 };
00174
00175 #endif
00176