summaryrefslogtreecommitdiffhomepage
path: root/nGenEx/Projector.h
blob: e70a3839f43d313536b7017cc46da505f810ba35 (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
106
/*  Project nGenEx
    Destroyer Studios LLC
    Copyright © 1997-2004. All Rights Reserved.

    SUBSYSTEM:    nGenEx.lib
    FILE:         Projector.h
    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