// Copyright (C) 2007 Id Software, Inc. // #ifndef __RENDERWORLD_H__ #define __RENDERWORLD_H__ /* =============================================================================== Render World =============================================================================== */ #include "Material.h" #include "../decllib/declDecal.h" // shader parms const int MAX_GLOBAL_SHADER_PARMS = 4; // Rarely used so lowered this from 12 const int SHADERPARM_RED = 0; const int SHADERPARM_GREEN = 1; const int SHADERPARM_BLUE = 2; const int SHADERPARM_ALPHA = 3; const int SHADERPARM_TIMESCALE = 3; const int SHADERPARM_TIMEOFFSET = 4; const int SHADERPARM_DIVERSITY = 5; // random between 0.0 and 1.0 for some effects (muzzle flashes, etc) const int SHADERPARM_MODE = 7; // for selecting which shader passes to enable const int SHADERPARM_TIME_OF_DEATH = 7; // for the monster skin-burn-away effect enable and time offset // model parms const int SHADERPARM_MD5_SKINSCALE = 8; // for scaling vertex offsets on md5 models (jack skellington effect) const int SHADERPARM_MD3_FRAME = 8; const int SHADERPARM_MD3_LASTFRAME = 9; const int SHADERPARM_MD3_BACKLERP = 10; const int SHADERPARM_BEAM_END_X = 8; // for _beam models const int SHADERPARM_BEAM_END_Y = 9; const int SHADERPARM_BEAM_END_Z = 10; const int SHADERPARM_BEAM_WIDTH = 11; const int SHADERPARM_SPRITE_WIDTH = 8; // for _sprite models const int SHADERPARM_SPRITE_HEIGHT = 9; const int SHADERPARM_SPRITE_OFFSET = 10; const int SHADERPARM_FADE_ORIGIN_X = 8; const int SHADERPARM_FADE_ORIGIN_Y = 9; const int SHADERPARM_FADE_ORIGIN_Z = 10; const int SHADERPARM_PARTICLE_STOPTIME = 8; // don't spawn any more particles after this time // guis const int MAX_RENDERENTITY_GUI = 3; // RAVEN BEGIN // jscott: for effect brightness const int SHADERPARM_BRIGHTNESS = 6; // for the overall brightness of effects // RAVEN END struct srfTriangles_t; struct renderEntity_t; struct renderView_s; class idRenderModel; class sdDeclAmbientCubeMap; class idDemoFile; class sdUserInterface; typedef bool( *deferredEntityCallback_t )( renderEntity_t*, const renderView_s*, int& lastModifiedGameTime ); const int MAX_SURFACE_BITS = 64; const unsigned short MIRROR_VIEW_ID = 0xFFFF; const unsigned short FAST_MIRROR_VIEW_ID = 0xFFFE; const int WORLD_SPAWN_ID = 0xFFFF0000; enum sdUpdateBits { UDB_NONE = 0, // nothing to be updated UDB_PUSH = BIT(0), // PushPolytopeIntoTree needs to be called again, i.e. the areas this object touches could have changed UDB_INTERACTIONS = BIT(1), // Recalculate interactions for this object, i.e. the lights this object is affected by could have changed UDB_DECALS = BIT(2), // Decals on this surface could have changed and need to be recalculated UDB_CACHEDMODEL = BIT(3), // The model has changed and the old cached version is not useful anymore UDB_SURFACEMASK = BIT(4), // The surface mask is dirty UDB_IMPOSTERS = BIT(5), // The imposters changed }; struct sdInstCommon { byte color[4]; idVec3 origin; idMat3 axis; union { float dist; // overloaded float maxVisDist; }; }; struct sdInstRT { sdInstCommon inst; float dist; }; struct sdInstInfo { sdInstCommon inst; float maxVisDist; float minVisDist; idVec3 fadeOrigin; }; struct renderEntity_t { idRenderModel* hModel; // this can only be null if callback is set int spawnID;//entityNum; int mapId; // Entities that are expensive to generate, like skeletal models, can be // deferred until their bounds are found to be in view, in the frustum // of a shadowing light that is in view, or contacted by a trace / overlay test. // This is also used to do visual cueing on items in the view // The renderView may be NULL if the callback is being issued for a non-view related // source. // The callback function should clear renderEntity->callback if it doesn't // want to be called again next time the entity is referenced (ie, if the // callback has now made the entity valid until the next updateEntity) idBounds bounds; // only needs to be set for deferred models and md5s deferredEntityCallback_t callback; void * callbackData; // used for whatever the callback wants // player bodies and possibly player shadows should be suppressed in views from // that player's eyes, but will show up in mirrors and other subviews // security cameras could suppress their model in their subviews if we add a way // of specifying a view number for a remoteRenderMap view unsigned short suppressSurfaceInViewID; unsigned short suppressShadowInViewID; // world models for the player and weapons will not cast shadows from view weapon // muzzle flashes unsigned short suppressShadowInLightID; // if non-zero, the surface and shadow (if it casts one) // will only show up in the specific view, ie: player weapons unsigned short allowSurfaceInViewID; // if non-zero, the surface will act as a noSelfShadow in the specified view unsigned short noSelfShadowInViewID; unsigned char drawSpec; unsigned char shadowSpec; // positioning // axis rotation vectors must be unit length for many // R_LocalToGlobal functions to work, so don't scale models! // axis vectors are [0] = forward, [1] = left, [2] = up idVec3 origin; idMat3 axis; // texturing const idMaterial* customShader; // if non-0, all surfaces will use this const idMaterial* referenceShader; // used so flares can reference the proper light shader const idDeclSkin* customSkin; // 0 for no remappings class idSoundEmitter* referenceSound; // for shader sound tables, allowing effects to vary with sounds float shaderParms[ MAX_ENTITY_SHADER_PARMS ]; // can be used in any way by shader or model generation struct renderView_s* remoteRenderView; // any remote camera surfaces will use this int numJoints; idJointMat * joints; // array of joints that will modify vertices. // NULL if non-deformable model. NOT freed by renderer, unless jointsAllocated is set float modelDepthHack; // squash depth range so particle effects don't clip into walls bool foliageDepthHack; float sortOffset; // Override material sort form render entity float coverage; // used when flag overridencoverage is specified short minGpuSpec; short numInsts; sdInstInfo * insts; // int numVisDummies; idVec3 *dummies; int numAreas; int * areas; struct renderEntityFlags_t { // options to override surface shader flags (replace with material parameters?) bool noSelfShadow : 1; // cast shadows onto other objects,but not self bool noShadow : 1; // no shadow at all bool noDynamicInteractions : 1; // don't create any light / shadow interactions after // the level load is completed. This is a performance hack // for the gigantic outdoor meshes in the monorail map, so // all the lights in the moving monorail don't touch the meshes bool noHardwareSkinning : 1; bool weaponDepthHack : 1; // squash depth range so view weapons don't poke into walls // this automatically implies noShadow bool forceUpdate : 1; // force an update (NOTE: not a bool to keep this struct a multiple of 4 bytes) bool pushIntoConnectedOutsideAreas : 1; // forces the entityDef to be pushed in all connected outside areas bool pushIntoOutsideAreas : 1; // forces the entityDef to be pushed in all connected outside areas bool forceImposter : 1; // Never render the actual entity always the imposter bool useFadeOrigin : 1; // Use an offset stored in the shaderparms for imposter fade calculations bool pushByOrigin : 1; // Use origin in push bool pushByCenter : 1; // Use center of bounds in push bool pushByInstances : 1; // Use center of bounds in push bool overridenBounds : 1; bool overridenCoverage : 1; bool occlusionTest : 1; bool foliageDepthHack : 1; bool dontCastFromAtmosLight : 1; bool usePointTestForAmbientCubeMaps : 1; bool disableLODs : 1; bool jointsAllocated : 1; }; float weaponDepthHackFOV_x; float weaponDepthHackFOV_y; renderEntityFlags_t flags; float shadowVisDistMult; // max distance this entity will be drawn at int maxVisDist; // max distance this entity will be drawn at int minVisDist; // min distance this entity will be drawn at float visDistFalloff; // fraction of range spent fading in sdBitField< MAX_SURFACE_BITS - 1 > hideSurfaceMask; // mask to hide surfaces within a model const sdDeclImposter* imposter; // Imposter to use for entity (screen space based unless forceImposter is on) const sdDeclAmbientCubeMap* ambientCubeMap; // Override the ambient cubemap for this model (instead of the one specified by the area) int ApplyChanges( const renderEntity_t &other ); // Returns sdUpdateBits mask }; const int MAX_LIGHT_AREAS = 8; const int MAX_PRELIGHTS = 5; struct renderLight_t { idMat3 axis; // rotation vectors, must be unit length idVec3 origin; // if non-zero, the light will not show up in the specific view, // which may be used if we want to have slightly different muzzle // flash lights for the player and other views unsigned short suppressLightInViewID; // if non-zero, the light will only show up in the specific view // which can allow player gun gui lights and such to not effect everyone unsigned short allowLightInViewID; int mapId; struct renderLightFlags_t { bool noShadows : 1; // (should we replace this with material parameters on the shader?) bool noSpecular : 1; // (should we replace this with material parameters on the shader?) bool pointLight : 1; // otherwise a projection light (should probably invert the sense of this, because points are way more common) bool parallel : 1; // lightCenter gives the direction to the light at infinity bool atmosphereLight : 1; // special case atmosphere light, used for terrain lighting bool insideLight : 1; }; renderLightFlags_t flags; idVec3 lightRadius; // xyz radius for point lights idVec3 lightCenter; // offset the lighting direction for shading and // shadows, relative to origin // frustum definition for projected lights, all reletive to origin // FIXME: we should probably have real plane equations here, and offer // a helper function for conversion from this format idVec3 target; idVec3 right; idVec3 up; idVec3 start; idVec3 end; // Dmap will generate an optimized shadow volumes named _prelight_ // for the light against all the _area* models in the map. The renderer will // ignore this value if the light has been moved after initial creation int numPrelightModels; idRenderModel * prelightModels[ MAX_PRELIGHTS ]; // muzzle flash lights will not cast shadows from player and weapon world models int lightId; int maxVisDist; unsigned int minSpecShadowColor; const idMaterial * material; // NULL = either lights/defaultPointLight or lights/defaultProjectedLight float shaderParms[MAX_ENTITY_SHADER_PARMS]; // can be used in any way by shader idSoundEmitter * referenceSound; // for shader sound tables, allowing effects to vary with sounds int manualPriority; // if nonzero this light may be added to the manual lights list preferring higher priority ones // if there are too many lights ( which means it will affect particles etc...) int drawSpec; int shadowSpec; // light polytope doesn't get pushed down the tree, instead, only add to the specified areas int numAreas; int areas[ MAX_LIGHT_AREAS ]; struct atmosLightProjection_t *atmosLightProjection; int ApplyChanges( const renderLight_t &other ); // Returns sdUpdateBits mask }; // RAVEN BEGIN // jscott: for handling of effects typedef struct renderEffect_s { const rvDeclEffect* declEffect; unsigned short suppressSurfaceInViewID; unsigned short allowSurfaceInViewID; unsigned short suppressLightsInViewID; int groupID; idVec3 origin; idMat3 axis; idVec3 gravity; idVec3 endOrigin; idVec3 windVector; idVec3 materialColor; float attenuation; bool hasEndOrigin; bool loop; // effect is looping bool useRenderBounds; bool isStatic; // bool ambient; // effect is from an entity unsigned short weaponDepthHackInViewID; // squash depth range so view weapons don't poke into walls float weaponDepthHackFOV_x; float weaponDepthHackFOV_y; float modelDepthHack; bool foliageDepthHack; float distanceOffset; float maxVisDist; // THIS MUST BE THE LAST PARAMETER float shaderParms[ MAX_ENTITY_SHADER_PARMS ]; // can be used in any way by shader or model generation int ApplyChanges( const struct renderEffect_s &other ); // Returns sdUpdateBits mask } renderEffect_t; // RAVEN END struct occlusionTest_t { idMat3 axis; idVec3 origin; idBounds bb; int view; }; struct cheapDecalParameters_t { idVec3 origin; idVec3 normal; int jointIdx; const sdDeclDecal* decl; }; typedef struct renderView_s { // player views will set this to a non-zero integer for model suppress / allow // subviews (mirrors, cameras, etc) will always clear it to zero unsigned short viewID; // sized from 0 to SCREEN_WIDTH / SCREEN_HEIGHT (640/480), not actual resolution int x, y, width, height; float fov_x, fov_y; // perspective float size_x, size_y; // orthographic idVec3 vieworg; idMat3 viewaxis; // transformation matrix, view looks down the positive X axis idMat3 lastViewAxis; // transformation matrix, view looks down the positive X axis idVec3 lastViewOrg; // time in milliseconds for shader effects and other time dependent rendering issues int time; float shaderParms[MAX_GLOBAL_SHADER_PARMS]; // can be used in any way by shader const idMaterial* globalMaterial; // used to override everything draw const idDeclSkin* globalSkin; // apply this skin to everything idVec4 clearColor; float foliageDepthHack; float nearPlane; float farPlane; int forceClear; struct renderViewFlags_t { bool cramZNear : 1; // for cinematics, we want to set ZNear much lower bool forceUpdate : 1; // for an update bool forceViewIDOnly : 1; // only render entities with a matching viewID bool forceDefsVisible : 1; }; renderViewFlags_t flags; } renderView_t; // exitPortal_t is returned by idRenderWorld::GetPortal() typedef struct { int areas[2]; // areas connected by this portal const idWinding * w; // winding points have counter clockwise ordering seen from areas[0] idPlane plane; idVec3 center; int blockingBits; // PS_BLOCK_VIEW, PS_BLOCK_AIR, etc qhandle_t portalHandle; int portalFlags; } exitPortal_t; // modelTrace_t is for tracing vs. visual geometry typedef struct modelTrace_s { float fraction; // fraction of trace completed idVec3 point; // end point of trace in global space idVec3 normal; // hit triangle normal vector in global space idVec2 st; // texture coordinate const idMaterial * material; // material of hit surface const sdDeclSurfaceType * surfaceType; const srfTriangles_t * geometry; idVec3 surfaceColor; const renderEntity_t * entity; // render entity that was hit const class idRenderEntity * def; int jointNumber; // md5 joint nearest to the hit triangle } modelTrace_t; static const int NUM_PORTAL_ATTRIBUTES = 3; typedef enum { PS_BLOCK_NONE = 0, PS_BLOCK_VIEW = 1, PS_BLOCK_LOCATION = 2, // game map location strings often stop in hallways PS_BLOCK_AIR = 4, // windows between pressurized and unpresurized areas PS_BLOCK_ALL = ( 1 << NUM_PORTAL_ATTRIBUTES ) - 1 } portalConnection_t; // RAVEN BEGIN // jscott: effect handling in the renderer class rvRenderEffect { public: virtual ~rvRenderEffect( void ) {} virtual void FreeRenderEffect( void ) = 0; virtual void UpdateRenderEffect( const renderEffect_t *def, bool forceUpdate = false ) = 0; virtual void ForceUpdate( void ) = 0; virtual int GetIndex( void ) = 0; }; // RAVEN END class sdOcclusionTest { public: virtual ~sdOcclusionTest( void ) {} virtual void FreeOcclusionTest( void ) = 0; virtual void UpdateOcclusionTest( const occlusionTest_t *def ) = 0; }; class idRenderWorld { public: virtual ~idRenderWorld() {}; // The same render world can be reinitialized as often as desired // a NULL or empty mapName will create an empty, single area world virtual bool InitFromMap( const char *mapName ) = 0; virtual void LinkCullSectorsToArea( int area ) = 0; //-------------- Entity and Light Defs ----------------- // entityDefs and lightDefs are added to a given world to determine // what will be drawn for a rendered scene. Most update work is defered // until it is determined that it is actually needed for a given view. virtual qhandle_t AddEntityDef( const renderEntity_t *re ) = 0; virtual void UpdateEntityDef( qhandle_t entityHandle, const renderEntity_t *re ) = 0; virtual void FreeEntityDef( qhandle_t entityHandle ) = 0; virtual const renderEntity_t *GetRenderEntity( qhandle_t entityHandle ) const = 0; virtual renderEntity_t *GetRenderEntity( qhandle_t entityHandle ) = 0; virtual qhandle_t AddLightDef( const renderLight_t *rlight ) = 0; virtual void UpdateLightDef( qhandle_t lightHandle, const renderLight_t *rlight ) = 0; virtual void FreeLightDef( qhandle_t lightHandle ) = 0; virtual const renderLight_t *GetRenderLight( qhandle_t lightHandle ) const = 0; // RAVEN BEGIN // jscott: handling of effects virtual qhandle_t AddEffectDef( const renderEffect_t *reffect, int time ) = 0; virtual bool UpdateEffectDef( qhandle_t effectHandle, const renderEffect_t *reffect, int time ) = 0; virtual void StopEffectDef( qhandle_t effectHandle ) = 0; virtual void RestartEffectDef( qhandle_t effectHandle ) = 0; virtual void FreeEffectDef( qhandle_t effectHandle ) = 0; virtual void FreeStoppedEffectDefs( void ) = 0; // RAVEN END // Game side occlusion tests virtual qhandle_t AddOcclusionTestDef( const occlusionTest_t *occtest ) = 0; virtual void UpdateOcclusionTestDef( qhandle_t occtestHandle, const occlusionTest_t *occtest ) = 0; virtual void UpdateOcclusionTestDefViewID( qhandle_t occtestHandle, int viewID ) = 0; virtual bool IsVisibleOcclusionTestDef( qhandle_t occtestHandle ) = 0; virtual void FreeOcclusionTestDef( qhandle_t occtestHandle ) = 0; virtual int CountVisibleOcclusionTestDef( qhandle_t occtestHandle ) = 0; virtual bool IsVisibleEntity( int viewID, int occid ) = 0; virtual void UpdateOcclusionTests( void ) = 0; // Force the generation of all light / surface interactions at the start of a level // If this isn't called, they will all be dynamically generated virtual void GenerateAllInteractions() = 0; virtual idRenderModel* GetEntityHandleDynamicModel( qhandle_t entityHandle ) = 0; //-------------- Decals and Overlays ----------------- virtual idRenderModel* CreateDecalModel() = 0; virtual void AddToProjectedDecal( const idFixedWinding& winding, const idVec3 &projectionOrigin, const bool parallel, const idVec4& color, idRenderModel* model, int entityNum, const idMaterial** onlyMaterials = NULL, const int numOnlyMaterials = 1 ) = 0; virtual void ResetDecalModel( idRenderModel* model ) = 0; virtual void FinishDecal( idRenderModel* model ) = 0; // Creates decals on all world surfaces that the winding projects onto. // The projection origin should be infront of the winding plane. // The decals are projected onto world geometry between the winding plane and the projection origin. // The decals are depth faded from the winding plane to a certain distance infront of the // winding plane and the same distance from the projection origin towards the winding. // Arnout: FIXME as soon as there is a nicer way to get the current game time in the engine, stop passing in currentTime virtual void ProjectDecalOntoWorld( const idFixedWinding &winding, const idVec3 &projectionOrigin, const bool parallel, const float fadeDepth, const idMaterial *material, const int startTime, const int currentTime ) = 0; // Creates decals on static models. virtual void ProjectDecal( qhandle_t entityHandle, const idFixedWinding &winding, const idVec3 &projectionOrigin, const bool parallel, const float fadeDepth, const idMaterial *material, const int startTime, const int currentTime ) = 0; // Creates overlays on dynamic models. virtual void ProjectOverlay( qhandle_t entityHandle, const idPlane localTextureAxis[2], const idMaterial *material ) = 0; // Removes all decals and overlays from the given entity def. virtual void RemoveDecals( qhandle_t entityHandle ) = 0; virtual void AddCheapDecal( qhandle_t entityHandle, const cheapDecalParameters_t ¶ms, float time ) = 0; virtual void ClearDecals( void ) = 0; //-------------- Env Bounds ----------------- virtual void AddEnvBounds( idVec3 const &origin, idVec3 const &scale, const char *cubemap ) = 0; //-------------- Scene Rendering ----------------- // some calls to material functions use the current renderview time when servicing cinematics. this function // ensures that any parms accessed (such as time) are properly set. virtual void SetRenderView( const renderView_t *renderView ) = 0; // rendering a scene may actually render multiple subviews for mirrors and portals, and // may render composite textures for gui console screens and light projections // It would also be acceptable to render a scene multiple times, for "rear view mirrors", etc virtual void RenderScene( const renderView_t *renderView ) = 0; virtual void PerformRenderScene( const renderView_t *renderView ) = 0; //-------------- Portal Area Information ----------------- // returns the number of portals virtual int NumPortals( void ) const = 0; // returns 0 if no portal contacts the bounds // This is used by the game to identify portals that are contained // inside doors, so the connection between areas can be topologically // terminated when the door shuts. virtual qhandle_t FindPortal( const idBounds &b ) const = 0; // doors explicitly close off portals when shut // multiple bits can be set to block multiple things, ie: ( PS_VIEW | PS_LOCATION | PS_AIR ) virtual void SetPortalState( qhandle_t portal, int blockingBits ) = 0; virtual int GetPortalState( qhandle_t portal ) = 0; virtual void UpdatePortalOccTestView( int viewID ) = 0; // returns true only if a chain of portals without the given connection bits set // exists between the two areas (a door doesn't separate them, etc) virtual bool AreasAreConnected( int areaNum1, int areaNum2, portalConnection_t connection ) = 0; virtual bool AreasAreConnected( int areaNum1, int areaNum2, portalFlags_t flag ) = 0; virtual bool AreasAreConnected( int areaNum1, int areaNum2 ) = 0; // returns the number of portal areas in a map, so game code can build information // tables for the different areas virtual int NumAreas( void ) const = 0; // Will return -1 if the point is not in an area, otherwise // it will return 0 <= value < NumAreas() virtual int PointInArea( const idVec3 &point ) const = 0; // fills the *areas array with the numbers of the areas the bounds cover // returns the total number of areas the bounds cover virtual int BoundsInAreas( const idBounds &bounds, int *areas, int maxAreas ) const = 0; // Used by the sound system to do area flowing virtual int NumPortalsInArea( int areaNum ) = 0; // returns one portal from an area virtual exitPortal_t GetPortal( int areaNum, int portalNum ) = 0; // set portal flags on areas directly; primarely for editor reasons virtual void SetAreaPortalFlags( int areaNum, int flags ) = 0; virtual int GetAreaPortalFlags( int areaNum ) const = 0; // set the ambient lighting & atmosphere to use for this area virtual void SetAreaAmbientCubeMap( int areaNum, const sdDeclAmbientCubeMap *cubeMapDecl ) = 0; virtual const sdDeclAmbientCubeMap *GetAreaAmbientCubeMap( int areaNum ) = 0; virtual void SetCubemapSunProperties( const sdDeclAmbientCubeMap *cubeMapDecl, const idVec3 &sunDir, const idVec3 &sunColor ) = 0; //-------------- Tracing ----------------- // Traces vs the render model, possibly instantiating a dynamic version, and returns true if something was hit virtual bool ModelTrace( modelTrace_t &trace, qhandle_t entityHandle, const idVec3 &start, const idVec3 &end, const float radius, int surfCollision = SURF_COLLISION ) const = 0; // Traces vs the whole rendered world. FIXME: we need some kind of material flags. virtual bool Trace( modelTrace_t &trace, const idVec3 &start, const idVec3 &end, const float radius, bool skipDynamic = true ) const = 0; // Traces vs the world model bsp tree. virtual bool FastWorldTrace( modelTrace_t &trace, const idVec3 &start, const idVec3 &end ) const = 0; //-------------- Demo Control ----------------- // Writes a loadmap command to the demo, and clears archive counters. virtual void StartWritingDemo( idDemoFile *demo ) = 0; virtual void StopWritingDemo() = 0; // Returns true when demoRenderView has been filled in. // adds/updates/frees entityDefs and lightDefs based on the current demo file // and returns the renderView to be used to render this frame. // a demo file may need to be advanced multiple times if the framerate // is less than 30hz // demoTimeOffset will be set if a new map load command was processed before // the next renderScene virtual bool ProcessDemoCommand( idDemoFile *readDemo, renderView_t *demoRenderView, int *demoTimeOffset ) = 0; // this is used to regenerate all interactions ( which is currently only done during influences ), there may be a less // expensive way to do it virtual void RegenerateWorld() = 0; //-------------- Debug Visualization ----------------- // Line drawing for debug visualization virtual void DebugClearLines( int time ) = 0; // a time of 0 will clear all lines and text virtual void DebugLine( const idVec4 &color, const idVec3 &start, const idVec3 &end, const int lifetime = 0, const bool depthTest = false ) = 0; virtual void DebugArrow( const idVec4 &color, const idVec3 &start, const idVec3 &end, int size, const int lifetime = 0, bool depthTest = false ) = 0; virtual void DebugWinding( const idVec4 &color, const idWinding &w, const idVec3 &origin, const idMat3 &axis, const int lifetime = 0, const bool depthTest = false ) = 0; virtual void DebugCircle( const idVec4 &color, const idVec3 &origin, const idVec3 &dir, const float radius, const int numSteps, const int lifetime = 0, const bool depthTest = false ) = 0; virtual void DebugSphere( const idVec4 &color, const idSphere &sphere, const int lifetime = 0, const bool depthTest = false ) = 0; virtual void DebugBounds( const idVec4 &color, const idBounds &bounds, const idVec3 &org = vec3_origin, const idMat3& axes = mat3_identity, const int lifetime = 0 ) = 0; virtual void DebugBox( const idVec4 &color, const idBox &box, const int lifetime = 0 ) = 0; virtual void DebugFrustum( const idVec4 &color, const idFrustum &frustum, const bool showFromOrigin = false, const int lifetime = 0 ) = 0; virtual void DebugCone( const idVec4 &color, const idVec3 &apex, const idVec3 &dir, float radius1, float radius2, const int lifetime = 0 ) = 0; virtual void DebugAxis( const idVec3 &origin, const idMat3 &axis, int lifetime = 0 ) = 0; // Polygon drawing for debug visualization. virtual void DebugClearPolygons( int time ) = 0; // a time of 0 will clear all polygons virtual void DebugPolygon( const idVec4 &color, const idWinding &winding, const int lifeTime = 0, const bool depthTest = false, idImage* image = NULL ) = 0; // Text drawing for debug visualization. virtual void DrawText( const char *text, const idVec3 &origin, float scale, const idVec4 &color, const idMat3 &viewAxis, const int align = 1, const int lifetime = 0) = 0; // Atmosphere / Ambient Systems. virtual void SetAtmosphere( const sdDeclAtmosphere* atmosphere ) = 0; virtual const sdDeclAtmosphere* GetAtmosphere() const = 0; virtual void SetupMatrices( const renderView_t* renderView, float* projectionMatrix, float* modelViewMatrix, const bool allowJitter ) = 0; virtual void SetMegaTextureSTGrid( const idBounds& bounds, const idVec2* grid, int width, int height ) = 0; virtual struct atmosLightProjection_t *FindAtmosLightProjection( int lightID ) = 0; }; /* ============ sdUserInterface ============ */ class sdUserInterface { public: virtual ~sdUserInterface( void ) {} virtual void Draw( void ) = 0; virtual void Activate( void ) = 0; virtual void OnInputInit( void ) = 0; virtual void OnInputShutdown( void ) = 0; }; #endif /* !__RENDERWORLD_H__ */