00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef _STELPROJECTOR_HPP_
00022 #define _STELPROJECTOR_HPP_
00023
00024 #include "StelProjectorType.hpp"
00025 #include "VecMath.hpp"
00026 #include "StelSphereGeometry.hpp"
00027
00035 class StelProjector
00036 {
00037 public:
00038 friend class StelPainter;
00039 friend class StelCore;
00040
00041 class ModelViewTranform;
00044 typedef QSharedPointer<ModelViewTranform> ModelViewTranformP;
00045
00048 class ModelViewTranform
00049 {
00050 public:
00051 ModelViewTranform() {;}
00052 virtual ~ModelViewTranform() {;}
00053 virtual void forward(Vec3d&) const =0;
00054 virtual void backward(Vec3d&) const =0;
00055 virtual void forward(Vec3f&) const =0;
00056 virtual void backward(Vec3f&) const =0;
00057
00058 virtual void combine(const Mat4d&)=0;
00059 virtual ModelViewTranformP clone() const=0;
00060
00061 virtual Mat4d getApproximateLinearTransfo() const=0;
00062 };
00063
00064 class Mat4dTransform: public ModelViewTranform
00065 {
00066 public:
00067 Mat4dTransform(const Mat4d& m);
00068 void forward(Vec3d& v) const;
00069 void backward(Vec3d& v) const;
00070 void forward(Vec3f& v) const;
00071 void backward(Vec3f& v) const;
00072 void combine(const Mat4d& m);
00073 Mat4d getApproximateLinearTransfo() const;
00074 ModelViewTranformP clone() const;
00075
00076 private:
00078 Mat4d transfoMat;
00079 Mat4f transfoMatf;
00080 };
00081
00084 enum StelProjectorMaskType
00085 {
00086 MaskNone,
00087 MaskDisk
00088 };
00089
00092 struct StelProjectorParams
00093 {
00094 StelProjectorParams() : viewportXywh(0, 0, 256, 256), fov(60.f), gravityLabels(false), defautAngleForGravityText(0.f), maskType(MaskNone), viewportCenter(128.f, 128.f), flipHorz(false), flipVert(false) {;}
00095 Vector4<int> viewportXywh;
00096 float fov;
00097 bool gravityLabels;
00098 float defautAngleForGravityText;
00099 StelProjectorMaskType maskType;
00100 float zNear, zFar;
00101 Vec2f viewportCenter;
00102 float viewportFovDiameter;
00103 bool flipHorz, flipVert;
00104 };
00105
00107 virtual ~StelProjector() {}
00108
00110
00112 virtual QString getNameI18() const = 0;
00114 virtual QString getDescriptionI18() const {return "No description";}
00116 QString getHtmlSummary() const;
00118 virtual float getMaxFov() const = 0;
00125 virtual bool forward(Vec3f& v) const = 0;
00127 virtual bool backward(Vec3d& v) const = 0;
00129 virtual float deltaZoom(float fov) const = 0;
00130
00134 bool intersectViewportDiscontinuity(const Vec3d& p1, const Vec3d& p2) const;
00135 bool intersectViewportDiscontinuity(const SphericalCap& cap) const;
00136
00138 virtual float fovToViewScalingFactor(float fov) const = 0;
00140 virtual float viewScalingFactorToFov(float vsf) const = 0;
00141
00145 bool getFlagGravityLabels() const;
00146
00148 const Vec4i& getViewport() const;
00149
00151 Vec2f getViewportCenter() const;
00152
00154 int getViewportPosX() const;
00156 int getViewportPosY() const;
00158 int getViewportWidth() const;
00160 int getViewportHeight() const;
00161
00167 SphericalRegionP getViewportConvexPolygon(float marginX=0., float marginY=0.) const;
00168
00170 const SphericalCap& getBoundingCap() const;
00171
00173 float getPixelPerRadAtCenter() const;
00174
00176 float getFov() const;
00177
00179 bool needGlFrontFaceCW() const;
00180
00182
00185 bool checkInViewport(const Vec3d& pos) const;
00186
00189 bool checkInViewport(const Vec3f& pos) const;
00190
00193 Vec3d viewPortIntersect(const Vec3d& p1, const Vec3d& p2) const;
00194
00199 bool project(const Vec3d& v, Vec3d& win) const;
00200
00205 bool project(const Vec3f& v, Vec3f& win) const;
00206
00207 virtual void project(int n, const Vec3d* in, Vec3f* out);
00208
00209 virtual void project(int n, const Vec3f* in, Vec3f* out);
00210
00214 bool projectInPlace(Vec3d& vd) const;
00215
00219 bool projectInPlace(Vec3f& v) const;
00220
00225 bool projectCheck(const Vec3d& v, Vec3d& win) const;
00226
00231 bool projectCheck(const Vec3f& v, Vec3f& win) const;
00232
00237 bool unProject(const Vec3d& win, Vec3d& v) const;
00238 bool unProject(double x, double y, Vec3d& v) const;
00239
00246 bool projectLineCheck(const Vec3d& v1, Vec3d& win1, const Vec3d& v2, Vec3d& win2) const;
00247
00249 ModelViewTranformP getModelViewTransform() const;
00250
00252 Mat4f getProjectionMatrix() const;
00253
00256 static const QString maskTypeToString(StelProjectorMaskType type);
00258 static StelProjectorMaskType stringToMaskType(const QString &s);
00259
00261 StelProjectorMaskType getMaskType(void) const;
00262
00263 protected:
00265 StelProjector(ModelViewTranformP amodelViewTransform) : modelViewTransform(amodelViewTransform) {;}
00266
00268 virtual bool hasDiscontinuity() const =0;
00272 virtual bool intersectViewportDiscontinuityInternal(const Vec3d& p1, const Vec3d& p2) const = 0;
00273
00275 virtual bool intersectViewportDiscontinuityInternal(const Vec3d& capN, double capD) const = 0;
00276
00278 virtual void computeBoundingCap();
00279
00280 ModelViewTranformP modelViewTransform;
00281
00282 float flipHorz,flipVert;
00283 float pixelPerRad;
00284 StelProjectorMaskType maskType;
00285 float zNear, oneOverZNearMinusZFar;
00286 Vec4i viewportXywh;
00287 Vec2f viewportCenter;
00288 float viewportFovDiameter;
00289 bool gravityLabels;
00290 float defautAngleForGravityText;
00291 SphericalCap boundingCap;
00292
00293 private:
00295 void init(const StelProjectorParams& param);
00296 };
00297
00298 #endif // _STELPROJECTOR_HPP_