00001 /* 00002 File: Renderer.h 00003 00004 Function: Contains the definition for the renderer class. A 00005 particular graphics system must implement objects of this 00006 type. 00007 00008 example use: 00009 r.Clear().Start(renPoly) 00010 .Colour(cRed).Vertex(a).Vertex(b).Vertex(c) 00011 .End().Show(); 00012 00013 Author(s): Andrew Willmott 00014 00015 Copyright: (c) 1995-2000, Andrew Willmott 00016 */ 00017 00018 #ifndef __Renderer__ 00019 #define __Renderer__ 00020 00021 #include "gcl/Geometry.h" 00022 #include "gcl/Colour.h" 00023 #include "gcl/Image.h" 00024 #include "gcl/Camera.h" 00025 #include "cl/Action.h" 00026 00027 00028 // --- The Renderer class ----------------------------------------------------- 00029 00030 00031 class Renderer; 00032 00033 typedef Action<Renderer> RenderAction; 00034 typedef Renderer *RendererPtr; 00035 00036 enum RenderStyle // Commands for point-series drawing 00037 { 00038 renNone, 00039 renPoints, 00040 renLines, 00041 renLineStrip, 00042 renLineLoop, 00043 renPoly, 00044 renTriangles, 00045 renTriStrip, 00046 renMaxStyles 00047 }; 00048 00049 class Renderable 00050 { 00051 public: 00052 virtual Void Draw(Renderer &r) = 0; 00053 }; 00054 00055 class Renderer // Abstract class for something you can render into 00056 { 00057 public: 00058 Renderer(); 00059 00060 virtual Void Show() = 0; 00061 virtual Void MakeCurrent() = 0; 00062 virtual Void Print(ostream &s) = 0; 00063 00064 Renderer &Draw(Renderable &thing); 00065 Renderer &Draw(Renderable *thing); 00066 virtual Renderer &Begin(RenderStyle style) = 0; 00067 virtual Renderer &End() = 0; 00068 00069 virtual Renderer &SetPoint(const Point &p) = 0; 00070 virtual Renderer &SetNormal(const Point &p) = 0; 00071 virtual Renderer &SetCoord(const Coord &c) = 0; 00072 virtual Renderer &SetTexCoord(const Coord &c); 00073 virtual Renderer &SetColour(const Colour &c) = 0; 00074 virtual Renderer &SetColour(const Colour4 &c); 00075 00076 virtual Renderer &SetTransform(const Transform &t) = 0; 00077 virtual Renderer &SetCamera(const Camera &c) = 0; 00078 virtual Renderer &SetTexture(const Image *image); 00079 00080 Void SetBgColour(const Colour &c) { bgColour = c; }; 00081 Colour GetBgColour() { return(bgColour); }; 00082 00083 virtual Renderer &Clear() = 0; 00084 virtual Renderer &Pop() = 0; 00085 virtual Renderer &Push() = 0; 00086 00087 virtual Renderer &GetImage(Image &image) = 0; 00088 virtual Renderer &PutImage(const Image &image, Int x = 0, Int y = 0) = 0; 00089 00090 // short-cuts 00091 00092 Renderer &P(const Point &p) {return(SetPoint(p));}; 00093 Renderer &P(const Coord &c) {return(SetCoord(c));}; 00094 Renderer &N(const Vector &p) {return(SetNormal(p));}; 00095 Renderer &C(const Colour &c) {return(SetColour(c));}; 00096 Renderer &C(const Colour4 &c) {return(SetColour(c));}; 00097 Renderer &T(const Coord &c) {return(SetTexCoord(c));}; 00098 Renderer &Xform(const Transform &t) {return(SetTransform(t));}; 00099 Renderer &Cam(const Camera &c) {return(SetCamera(c));}; 00100 00101 00102 protected: 00103 inline Void SetWindow(); 00104 00105 Colour bgColour; 00106 static Renderer *sCurrentRenderer; 00107 }; 00108 00109 ostream &operator << (ostream &s, Renderer &gsr); 00110 00111 // --- Inlines ---------------------------------------------------------------- 00112 00113 00114 inline Void Renderer::SetWindow() 00115 // swap drawing contexts if necessary... 00116 { 00117 if (this != sCurrentRenderer) 00118 { 00119 sCurrentRenderer = this; 00120 MakeCurrent(); 00121 } 00122 } 00123 00124 #endif