|
|
//========= Copyright � 1996-2005, Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
// $NoKeywords: $
//=============================================================================//
#ifndef RENDER3DMS_H
#define RENDER3DMS_H
#pragma once
#include "Render.h"
#include "mathlib/Vector4D.h"
#include "utlpriorityqueue.h"
#include "mapclass.h"
#include "lpreview_thread.h"
//
// Size of the buffer used for picking. See glSelectBuffer for documention on
// the contents of the selection buffer.
//
#define SELECTION_BUFFER_SIZE 50
//
// Size of the texture cache. THis is the maximum number of unique textures that
// a map can refer to and still render properly in the editor.
//
#define TEXTURE_CACHE_SIZE 2048
//
// Maximum number of objects that can be kept in the list of objects to render last.
//
#define MAX_RENDER_LAST_OBJECTS 256
//
// Maximum number of hits that can be returned by ObjectsAt.
//
#define MAX_PICK_HITS 512
class BoundBox; class CCamera; class CCullTreeNode; class CMapClass; class CMapDoc; class CMapFace; class CMapInstance; class CMapWorld; class IMaterial; class IMaterialVar; template< class T, class A > class CUtlVector;
enum Visibility_t; enum SelectionState_t;
typedef struct TranslucentObjects_s { float depth; CMapAtom *object;
bool m_bInstanceSelected; TInstanceState m_InstanceState; } TranslucentObjects_t;
enum RenderState_t { RENDER_CENTER_CROSSHAIR, // Whether to draw the crosshair in the center of the view.
RENDER_GRID, // Whether to draw a projected grid onto solid faces.
RENDER_FILTER_TEXTURES, // Whether to filter textures.
RENDER_POLYGON_OFFSET_FILL, // Whether to offset filled polygons (for decals)
RENDER_POLYGON_OFFSET_LINE, // Whether to offset line polygons (for wireframe selections)
RENDER_REVERSE_SELECTION, // Driver issue fix - whether to return the largest (rather than smallest) Z value when picking
};
//
// Render state information set via RenderEnable:
//
typedef struct { bool bCenterCrosshair; // Whether to render the center crosshair.
bool bDrawGrid; // Whether to render the grid.
float fGridSpacing; // Grid spacing in world units.
float fGridDistance; // Maximum distance from camera to draw grid.
bool bFilterTextures; // Whether to filter textures.
bool bReverseSelection; // Driver issue fix - whether to return the largest (rather than smallest) Z value when picking
} RenderStateInfo_t;
class CLightPreview_Light { public: LightDesc_t m_Light; float m_flDistanceToEye; };
static inline bool RenderingModeIsTextured(EditorRenderMode_t mode) { return ( (mode==RENDER_MODE_TEXTURED) || (mode==RENDER_MODE_TEXTURED_SHADED) || (mode==RENDER_MODE_LIGHT_PREVIEW_RAYTRACED) || (mode==RENDER_MODE_LIGHT_PREVIEW2) ); }
//
// Picking state information used when called from ObjectsAt.
//
typedef struct { bool bPicking; // Whether we are rendering in pick mode or not.
unsigned int m_nFlags; // flags
float fX; // Leftmost coordinate of pick rectangle, passed in by caller.
float fY; // Topmost coordinate of pick rectangle, passed in by caller.
float fWidth; // Width of pick rectangle, passed in by caller.
float fHeight; // Height of pick rectangle, passed in by caller.
HitInfo_t *pHitsDest; // Final array in which to place pick hits, passed in by caller.
int nMaxHits; // Maximum number of hits to place in the 'pHits' array, passed in by caller, must be <= MAX_PICK_HITS.
HitInfo_t Hits[MAX_PICK_HITS]; // Temporary array in which to place unsorted pick hits.
int nNumHits; // Number of hits so far in this pick (number of hits in 'Hits' array).
unsigned int uSelectionBuffer[SELECTION_BUFFER_SIZE]; unsigned int uLastZ; } PickInfo_t;
typedef struct { IEditorTexture *pTexture; // Pointer to the texture object that implements this texture.
int nTextureID; // Unique ID of this texture across all renderers.
unsigned int uTexture; // The texture name as returned by OpenGL when the texture was uploaded in this renderer.
} TextureCache_t;
typedef struct { HINSTANCE hInstance; int iCmdShow; HWND hWnd; HDC hDC; bool bActive; bool bFullScreen; ATOM wndclass; WNDPROC wndproc; bool bChangeBPP; bool bAllowSoft; char *szCmdLine; int argc; char **argv; int iResCount; int iVidMode; } MatWinData_t;
class CRender3D : public CRender { public:
// Constructor / Destructor.
CRender3D(void); virtual ~CRender3D(void);
// Initialization & shutdown functions.
void ShutDown(void);
float GetElapsedTime(void); float GetGridDistance(void); float GetGridSize(void); bool DeferRendering() const { return m_DeferRendering; } bool IsEnabled(RenderState_t eRenderState); bool IsPicking(void);
virtual bool IsInLightingPreview(); virtual void SetInLightingPreview( bool bLightingPreview ); // Operations.
float LightPlane(Vector& Normal); void UncacheAllTextures();
bool SetView( CMapView *pView ); virtual void StartRenderFrame( bool bRenderingOverEngine ); void EndRenderFrame(void);
virtual void PushInstanceData( CMapInstance *pInstanceClass, Vector &InstanceOrigin, QAngle &InstanceAngles ); virtual void PopInstanceData( void );
void ResetFocus();
// Picking functions.
void BeginRenderHitTarget(CMapAtom *pObject, unsigned int uHandle = 0); void EndRenderHitTarget(void);
void Render( bool bRenderingOverEngine ); void RenderEnable(RenderState_t eRenderState, bool bEnable);
void RenderCrossHair(); virtual void RenderWireframeBox(const Vector &Mins, const Vector &Maxs, unsigned char chRed, unsigned char chGreen, unsigned char chBlue); void RenderBox(const Vector &Mins, const Vector &Maxs, unsigned char chRed, unsigned char chGreen, unsigned char chBlue, SelectionState_t eBoxSelectionState); void RenderArrow(Vector const &vStartPt, Vector const &vEndPt, unsigned char chRed, unsigned char chGreen, unsigned char chBlue); void RenderCone(Vector const &vBasePt, Vector const &vTipPt, float fRadius, int nSlices, unsigned char chRed, unsigned char chGreen, unsigned char chBlue ); void RenderSphere(Vector const &vCenter, float flRadius, int nTheta, int nPhi, unsigned char chRed, unsigned char chGreen, unsigned char chBlue ); void RenderWireframeSphere(Vector const &vCenter, float flRadius, int nTheta, int nPhi, unsigned char chRed, unsigned char chGreen, unsigned char chBlue ); void RenderInstanceMapClass( CMapInstance *pInstanceClass, CMapClass *pMapClass, Vector &InstanceOrigin, QAngle &InstanceAngles );
int ObjectsAt( float x, float y, float fWidth, float fHeight, HitInfo_t *pObjects, int nMaxObjects, unsigned nFlags = 0 );
void DebugHook1(void *pData = NULL); void DebugHook2(void *pData = NULL);
// indicates we need to render an overlay pass...
bool NeedsOverlay() const;
CUtlIntrusiveList<CLightingPreviewLightDescription> BuildLightList( void ) const;
void SendLightList(); // send lighting list to lighting preview thread
void SendShadowTriangles(); void AddTranslucentDeferredRendering( CMapPoint *pMapPoint ); void AccumulateLights( CUtlPriorityQueue<CLightPreview_Light> &light_queue, CMatRenderContextPtr &pRenderContext, int nTargetWidth, int nTargetHeight, ITexture *dest_rt );
void SendGBuffersToLightingThread( void ); void SendGBuffersToLightingThread( int nTargetWidth, int nTargetHeight );
// Utility.
float ComputePixelWidthOfSphere( const Vector &vecOrigin, float flRadius ); float ComputePixelDiameterOfSphere( const Vector &vecOrigin, float flRadius );
protected:
inline void DispatchRender3D(CMapClass *pMapClass);
// Rendering functions.
void RenderMapClass(CMapClass *pMapClass); void RenderInstanceMapClass_r(CMapClass *pMapClass); void RenderNode(CCullTreeNode *pNode, bool bForce); void RenderOverlayElements(void); void RenderTool(void); void RenderTree( CMapWorld *pWorld ); void RenderPointsAndPortals(void); void RenderWorldAxes(); void RenderTranslucentObjects( void ); void RenderFoW( void );
// Utility functions.
void Preload(CMapClass *pParent); Visibility_t IsBoxVisible(Vector const &BoxMins, Vector const &BoxMaxs);
// Frustum methods
void ComputeFrustumRenderGeometry(CCamera * pCamera); void RenderFrustum();
float m_fFrameRate; // Framerate in frames per second, calculated once per second.
int m_nFramesThisSample; // Number of frames rendered in the current sample period.
DWORD m_dwTimeLastSample; // Time when the framerate was last calculated.
DWORD m_dwTimeLastFrame; // The time when the previous frame was rendered.
float m_fTimeElapsed; // Milliseconds elapsed since the last frame was rendered.
// context for the last bitmap we sent to lighting preview for ray tracing. we do not send if
// nothing happens, even if we end up re-rendering
Vector m_LastLPreviewCameraPos; float m_fLastLPreviewAngles[3]; // y,p,r
float m_fLastLPreviewZoom; int m_nLastLPreviewWidth; int m_nLastLPreviewHeight;
Vector4D m_FrustumPlanes[6]; // Plane normals and constants for the current view frustum.
MatWinData_t m_WinData; // Defines our render window parameters.
PickInfo_t m_Pick; // Contains information used when rendering in pick mode.
RenderStateInfo_t m_RenderState; // Render state set via RenderEnable.
bool m_bDroppedCamera; // Whether we have dropped the camera for debugging.
bool m_DeferRendering; // Used when we want to sort lovely opaque objects
bool m_TranslucentSortRendering; // Used when we want to sort translucent objects
CCamera *m_pDropCamera; // Dropped camera to use for debugging.
CUtlPriorityQueue<TranslucentObjects_t> m_TranslucentRenderObjects; // List of objects to render after all the other objects.
IMaterial* m_pVertexColor[2]; // for selecting actual textures
bool m_bLightingPreview;
// for debugging... render the view frustum
#ifdef _DEBUG
Vector m_FrustumRenderPoint[8]; bool m_bRenderFrustum; bool m_bRecomputeFrustumRenderGeometry; #endif
};
#endif // RENDER3DGL_H
|