etqw-sdk/source/renderer/RenderSystem.h

275 lines
9.8 KiB
C
Raw Normal View History

2008-05-29 00:00:00 +00:00
// Copyright (C) 2007 Id Software, Inc.
//
#ifndef __RENDERER_H__
#define __RENDERER_H__
/*
===============================================================================
idRenderSystem is responsible for managing the screen, which can have
multiple idRenderWorld and 2D drawing done on it.
===============================================================================
*/
class idMaterial;
class idImage;
class idVec4;
class idDrawVert;
class idPlane;
class idVec3;
class idStr;
#include "../libs/qglLib/qgl.h"
#include "Model_public.h"
#include "RendererEnums.h"
// Contains variables specific to the OpenGL configuration being run right now.
// These are constant once the OpenGL subsystem is initialized.
struct glconfig_t {
const char *renderer_string;
const char *vendor_string;
const char *version_string;
const char *extensions_string;
const char *wgl_extensions_string;
float glVersion; // atof( version_string )
int maxTextureSize; // queried from GL
int maxTextureUnits;
int maxTextureCoords;
int maxTextureImageUnits;
float maxTextureAnisotropy;
int maxVertexAttribs;
int maxProgramLocalParameters;
int maxProgramEnvParameters;
int colorBits, depthBits, stencilBits;
int samples; // 0 ARB_multisample is not available
bool multitextureAvailable;
bool textureCompressionAvailable;
bool anisotropicAvailable;
bool textureLODBiasAvailable;
bool cubeMapAvailable;
bool texture3DAvailable;
bool rectangleTextureAvailable;
bool sharedTexturePaletteAvailable;
bool ARBVertexBufferObjectAvailable;
bool ARBVertexProgramAvailable;
bool ARBFragmentProgramAvailable;
bool twoSidedStencilAvailable;
bool textureNonPowerOfTwoAvailable;
bool depthBoundsTestAvailable;
bool pointSpriteAvailable;
bool occlusionQueryAvailable;
bool framebufferObjectAvailable;
bool EXTPackedDepthStencilAvailable;
bool blendEquationAvailable;
bool shadowMappingHardwareAvailable; // We have all extensions needed to do percentage closer filtering with R-compare in the texture samplers
bool multiSampleAvailable;
bool csaaAvailable;
bool ARBShaderObjectsAvailable;
bool ARBVertexShaderAvailable;
bool ARBFragmentShaderAvailable;
bool EXTGpuProgramParametersAvailable;
// ati r300
bool atiTwoSidedStencilAvailable;
bool nvFloatBufferAvailable;
bool atiPixelFormatFloatAvailable;
bool ARBPixelFormatFloatAvailable;
bool timerQueryAvailable;
bool stringMarkerAvailable;
// ATI
bool textureCompression3DCAvailable;
// NVIDIA G80
bool textureCompressionLATCAvailable;
bool backendInitialized;
bool allowCgPath;
bool isInitialized;
};
const int SMALLCHAR_WIDTH = 8;
const int SMALLCHAR_HEIGHT = 16;
const int BIGCHAR_WIDTH = 16;
const int BIGCHAR_HEIGHT = 16;
// all drawing is done to a 640 x 480 virtual screen size
// and will be automatically scaled to the real resolution
const int SCREEN_WIDTH = 640;
const int SCREEN_HEIGHT = 480;
class idRenderWorld;
class sdFrameBuffer;
class idRenderSystem {
public:
virtual ~idRenderSystem() {}
// set up cvars and basic data structures, but don't
// init OpenGL, so it can also be used for dedicated servers
virtual void Init( void ) = 0;
// only called before quitting
virtual void Shutdown( void ) = 0;
virtual void ShutdownOpenGL( void ) = 0;
virtual bool IsOpenGLRunning( void ) const = 0;
virtual int GetScreenWidth( void ) const = 0;
virtual int GetScreenHeight( void ) const = 0;
// allocate a renderWorld to be used for drawing
virtual idRenderWorld * AllocRenderWorld( void ) = 0;
virtual void FreeRenderWorld( idRenderWorld * rw ) = 0;
// All data that will be used in a level should be
// registered before rendering any frames to prevent disk hits,
// but they can still be registered at a later time
// if necessary.
virtual void BeginLevelLoad( void ) = 0;
virtual void EndLevelLoad( void ) = 0;
virtual void LevelStart( void ) = 0;
virtual void DrawChar( int charWidth, int charHeight, int x, int y, int ch, const idMaterial *material ) = 0;
virtual void DrawStringExt( int charWidth, int charHeight, int x, int y, const char *string, const idVec4 &setColor, bool forceColor, const idMaterial *material ) = 0;
virtual void DrawSmallChar( int x, int y, int ch, const idMaterial *material ) = 0;
virtual void DrawSmallStringExt( int x, int y, const char *string, const idVec4 &setColor, bool forceColor, const idMaterial *material ) = 0;
virtual void DrawBigChar( int x, int y, int ch, const idMaterial *material ) = 0;
virtual void DrawBigStringExt( int x, int y, const char *string, const idVec4 &setColor, bool forceColor, const idMaterial *material ) = 0;
// dump all 2D drawing so far this frame to the demo file
virtual void WriteDemoPics() = 0;
// draw the 2D pics that were saved out with the current demo frame
virtual void DrawDemoPics() = 0;
// FIXME: add an interface for arbitrary point/texcoord drawing
// a frame cam consist of 2D drawing and potentially multiple 3D scenes
// window sizes are needed to convert SCREEN_WIDTH / SCREEN_HEIGHT values
virtual void BeginFrame( int windowWidth, int windowHeight ) = 0;
virtual void EndFrame( bool swapBuffers = true ) = 0;
virtual void SetCaptureBuffer( sdFrameBuffer* frameBuffer ) = 0;
virtual sdFrameBuffer* GetCaptureBuffer() = 0;
// aviDemo uses this.
// Will automatically tile render large screen shots if necessary
// Samples is the number of jittered frames for anti-aliasing
// If ref == NULL, session->updateScreen will be used
// This will perform swapbuffers, so it is NOT an approppriate way to
// generate image files that happen during gameplay, as for savegame
// markers. Use WriteRender() instead.
virtual bool TakeScreenshot( int width, int height, const char *fileName, int samples, struct renderView_s *ref, bool useOffscreenContext = false, bool flip = false ) = 0;
// the render output can be cropped down to a subset of the real screen, as
// for save-game reviews and split-screen multiplayer. Users of the renderer
// will not know the actual pixel size of the area they are rendering to
// the x,y,width,height values are in virtual SCREEN_WIDTH / SCREEN_HEIGHT coordinates
// to render to a texture, first set the crop size with makePowerOfTwo = true,
// then perform all desired rendering, then capture to an image
// if the specified physical dimensions are larger than the current cropped region, they will be cut down to fit
virtual void CropRenderSize( int width, int height, bool makePowerOfTwo = false ) = 0;
virtual void CaptureRenderToImage( const char *imageName, int faceNum = -1, copyBuffer_t buffer = CB_COLOR ) = 0;
virtual void SetFrameBuffer( class sdFrameBuffer *frameBuffer ) = 0;
virtual void UnCrop() = 0;
virtual void GetCardCaps( bool &oldCard ) = 0;
// the image has to be already loaded ( most straightforward way would be through a FindMaterial )
// texture filter / mipmapping / repeat won't be modified by the upload
// returns false if the image wasn't found
virtual bool UploadImage( const char* imageName, const byte* data, int width, int height, bool generateMipMaps = false, bool copy = true ) = 0;
virtual void BindImage( textureType_t target, GLuint image ) = 0;
virtual void SetGLState( int stateVector ) = 0;
virtual void SetGLTexEnv( int env ) = 0;
virtual void SelectTextureUnit( int unit ) = 0;
virtual void SetDefaultGLState( void ) = 0;
virtual void SetGL2D( void ) = 0;
virtual void SetCull( int cullType ) = 0;
virtual FILE* GetLogFileHandle() = 0;
virtual void SetLogFileHandle( FILE* file ) = 0;
virtual void LoadImage( const char *name, byte **pic, int *width, int *height, unsigned *timestamp, bool makePowerOf2 ) = 0;
virtual void FlushGLErrors( bool forcePrint = false ) = 0;
virtual int CheckGLForErrors( bool forcePrint = false ) = 0;
virtual class idRenderModel* InstantiateDynamicModel( class idRenderModel* model, struct renderEntity_t* ent ) = 0;
virtual const glconfig_t& GLConfig() const = 0;
virtual void SyncRenderSystem( void ) = 0;
virtual bool BeginRenderSync( void ) = 0;
virtual void EndRenderSync( void ) = 0;
virtual idImage *LoadImageFromFile( const char *filename, struct imageParams_t &ip ) = 0;
virtual bool IsDisplayModeAvailable( int width, int height ) const = 0;
virtual int GetNumMSAAModes( void ) const = 0;
virtual const char * GetMSAAMode( int idx, int &val ) const = 0;
virtual bool IsMSAACountAvailable( int msaa ) const = 0;
virtual void LockThreads( void ) = 0;
virtual void UnlockThreads( void ) = 0;
virtual int GetDoubleBufferIndex( void ) = 0;
virtual int GetSyncNum( void ) = 0;
virtual bool IsSMPEnabled( void ) = 0;
virtual void FreeOcclussionQueries( void ) = 0;
virtual int RegisterPtr( void *ptr ) = 0;
virtual void UnregisterPtr( int uid ) = 0;
virtual void* PtrForUID( int uid ) = 0;
};
extern idRenderSystem* renderSystem;
//
// functions mainly intended for editor and dmap integration
//
// returns the frustum planes in world space
void R_RenderLightFrustum( const struct renderLight_t &renderLight, idPlane lightFrustum[6] );
// used by the view shot taker
void R_ScreenshotFilename( int &lastNumber, const char *base, idStr &fileName );
class renderSystemSync {
bool synced;
public:
renderSystemSync( ) : synced(true) {
synced = renderSystem->BeginRenderSync();
}
~renderSystemSync() {
if ( !synced ) {
renderSystem->EndRenderSync();
}
}
};
#endif /* !__RENDERER_H__ */