#ifndef DOOMRENDERHDR
#define DOOMRENDERHDR
#include <windows.h>
#include "types.h"
#include "Wad.h"

class Renderer
{
 private:
    // Pointers to double buffer info and address. 
    HWND             ghWnd;
    BITMAPINFO *     BitMapInfo ;
    HBITMAP          DblBuff;
    unsigned char *  DoubleBuffer;

    // Game map related stuff.
    GameWad *WadFile;
    Vertex  *VerticesCache;
    short    ViewerHeight;
    short    ViewerAngle;
    short    ViewerX;
    short    ViewerY;

    // Trig tables used in rendering.
    long    SinTable[8192];
    long    CosTable[8192];
    long    TanTable[8192];
    short   colangle[640];
    long    invTanTable[2049];
    long    DeltaTxtTbl[8192];

 public:
    Renderer( HWND hWnd, GameWad* Wad );
    ~Renderer( void );
    short    render(short x, short y);
    short    changeViewPosn ( short X, short Y, short Angle );
    HBITMAP  getDIB() { return DblBuff; };
    int      Save_Pcx(char *filename);
    long     sin(short Angle);
    long     cos(short Angle);
    long     tan(short Angle);
    short    invTan(long y, long x);

 private:
    short getSideofLinedef( short X, short Y, short LineDef );
    short getSideofCutPlane ( short X, short Y, short Node );
    short getSectorfromXY( short X, short Y );
    short traverseBSPTree( short RootNode );
    short renderSSector( short SSector );
    short drawWallTopPegged( short StartX,
                             short StartY, 
                             short EndX, 
                             short EndY, 
                             short top, 
                             short bottom, 
                             short Angle, 
                             char* TxtName, 
                             short XOffset, 
                             short YOffset, 
                             long  Pdist, 
                             long  BOffset );
    short drawWallBtmPegged( short StartX,
                             short StartY, 
                             short EndX, 
                             short EndY, 
                             short top, 
                             short bottom, 
                             short Angle, 
                             char* TxtName, 
                             short XOffset, 
                             short YOffset, 
                             long  Pdist, 
                             long  BOffset );
    short drawFlat( unsigned short StartSeg,
                    unsigned short numSegs,
                    short Height );
    short initTables(void);
    void  init_double_buffer(void);
    void  clearToColor(char c);
    void  ChangePalette ( short PaletteNbr );
    void  copyscrn (char *Buffer);
    long  DistToPoint (long x, long y);
    short PointToAngle ( long x, long y );
    short CheckBoundingBox ( short UpperX,
                             short UpperY,
                             short LowerX,
                             short LowerY );
};

#endif