summaryrefslogtreecommitdiffhomepage
path: root/StarsEx/Projector.h
blob: beeef098cae3dceb5ac9fa5dbbbbc1c4a89efc2b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
/*  Starshatter: The Open Source Project
    Copyright (c) 2021-2024, Starshatter: The Open Source Project Contributors
    Copyright (c) 2011-2012, Starshatter OpenSource Distribution Contributors
    Copyright (c) 1997-2006, Destroyer Studios LLC.

    AUTHOR:       John DiCamillo


    OVERVIEW
    ========
    3D Projection Camera class
*/

#ifndef Projector_h
#define Projector_h

#include "Geometry.h"
#include "Window.h"
#include "Camera.h"
#include "Polygon.h"

// +--------------------------------------------------------------------+

class Projector
{
public:
    Projector(Window* win, Camera* cam);
    virtual ~Projector();

    // Operations:
    virtual void   UseWindow(Window* win);
    virtual void   UseCamera(Camera* cam);
    virtual void   SetDepthScale(float scale);
    virtual double GetDepthScale() const;
    virtual void   SetFieldOfView(double fov);
    virtual double GetFieldOfView() const;
    virtual int    SetInfinite(int i);
    virtual void   StartFrame();

    // accessor:
    Point          Pos() const { return camera->Pos(); }
    Point          vrt()       { return camera->vrt(); }
    Point          vup()       { return camera->vup(); }
    Point          vpn()       { return camera->vpn(); }
    const Matrix&  Orientation() const { return camera->Orientation(); }

    double         XAngle() const { return xangle; }
    double         YAngle() const { return yangle; }

    bool           IsOrthogonal()    const { return orthogonal; }
    void           SetOrthogonal(bool o)   { orthogonal = o;    }

    // projection and clipping geometry:
    virtual void   Transform(Vec3& vec)    const;
    virtual void   Transform(Point& point) const;

    virtual void   Project(Vec3& vec, bool clamp=true) const;
    virtual void   Project(Point& point, bool clamp=true) const;
    virtual void   ProjectRect(Point& origin, double& w, double& h) const;

    virtual float  ProjectRadius(const Vec3& vec, float radius) const;

    virtual void   Unproject(Point& point) const;
    int            IsVisible(const Vec3& v, float radius) const;
    int            IsBoxVisible(const Point* p) const;

    float          ApparentRadius(const Vec3& v, float radius) const;

    virtual void   SetWorldSpace()   { frustum_planes = world_planes; }
    virtual void   SetViewSpace()    { frustum_planes = view_planes;  }

    Plane*         GetCurrentClipPlanes()  { return frustum_planes; }

    void           SetUpFrustum();
    void           ViewToWorld(Point& pin, Point& pout);
    void           ViewToWorld(Vec3&  vin, Vec3&  vout);
    void           SetWorldspaceClipPlane(Vec3& normal, Plane& plane);

protected:
    Camera*        camera;

    int            width, height;
    double         field_of_view;
    double         xscreenscale, yscreenscale, maxscale;
    double         xcenter, ycenter;
    double         xangle,  yangle;

    int            infinite;
    float          depth_scale;
    bool           orthogonal;

    enum DISPLAY_CONST {
        NUM_FRUSTUM_PLANES= 4,
    };

    Plane*         frustum_planes;
    Plane          world_planes[NUM_FRUSTUM_PLANES];
    Plane          view_planes[NUM_FRUSTUM_PLANES];

    float          xclip0, xclip1;
    float          yclip0, yclip1;
};

#endif  // Projector_h