summaryrefslogtreecommitdiff
path: root/hammer/Render.h
diff options
context:
space:
mode:
authorFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
committerFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
commit3bf9df6b2785fa6d951086978a3e66f49427166a (patch)
tree2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /hammer/Render.h
downloadarchived-source-engine-2018-hl2-src-master.tar.xz
archived-source-engine-2018-hl2-src-master.zip
Diffstat (limited to 'hammer/Render.h')
-rw-r--r--hammer/Render.h314
1 files changed, 314 insertions, 0 deletions
diff --git a/hammer/Render.h b/hammer/Render.h
new file mode 100644
index 0000000..6c0bbb4
--- /dev/null
+++ b/hammer/Render.h
@@ -0,0 +1,314 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+// $NoKeywords: $
+//===========================================================================//
+
+#ifndef RENDER_H
+#define RENDER_H
+#pragma once
+
+#include "Color.h"
+#include "utlstack.h"
+#include "hammer_mathlib.h"
+#include "MaterialSystem\imesh.h"
+
+class IMaterial;
+struct DrawModelInfo_t;
+class CCoreDispInfo;
+class CMapView;
+class CCamera;
+class CMapAtom;
+class IEditorTexture;
+class CMapClass;
+class CMapInstance;
+
+typedef unsigned short MDLHandle_t;
+
+#define CAMERA_FRONT_PLANE_DISTANCE 8.0f
+#define CAMERA_HORIZONTAL_FOV 90.0f
+
+//
+// Colors for selected faces and edges. Kinda hacky; should probably be elsewhere.
+//
+#define SELECT_FACE_RED 220
+#define SELECT_FACE_GREEN 0
+#define SELECT_FACE_BLUE 0
+
+#define SELECT_EDGE_RED 255
+#define SELECT_EDGE_GREEN 255
+#define SELECT_EDGE_BLUE 0
+
+
+inline void SelectFaceColor( Color &pColor )
+{
+ pColor[0] = SELECT_FACE_RED;
+ pColor[1] = SELECT_FACE_GREEN;
+ pColor[2] = SELECT_FACE_BLUE;
+}
+
+inline void SelectEdgeColor( Color &pColor )
+{
+ pColor[0] = SELECT_EDGE_RED;
+ pColor[1] = SELECT_EDGE_GREEN;
+ pColor[2] = SELECT_EDGE_BLUE;
+}
+
+inline void InstanceColor( Color &pColor, bool bSelected )
+{
+ if ( bSelected )
+ {
+ pColor[ 0 ] = 192;
+ pColor[ 1 ] = 128;
+ pColor[ 2 ] = 0;
+ pColor[ 3 ] = 192;
+ }
+ else
+ {
+ pColor[ 0 ] = 128;
+ pColor[ 1 ] = 128;
+ pColor[ 2 ] = 0;
+ pColor[ 3 ] = 192;
+ }
+}
+
+enum EditorRenderMode_t
+{
+ RENDER_MODE_NONE = 0, // dont render anything
+ RENDER_MODE_EXTERN, // other system is using material system
+ RENDER_MODE_DEFAULT, // select default material
+ RENDER_MODE_CURRENT, // the current render mode
+ RENDER_MODE_WIREFRAME, // wire frame mode
+ RENDER_MODE_FLAT, // flat solid colors
+ RENDER_MODE_FLAT_NOZ, // flat solid colors, ignore Z
+ RENDER_MODE_FLAT_NOCULL, // flat solid colors, no backface culling
+ RENDER_MODE_DOTTED, // flat colored dotted, ignore Z
+ RENDER_MODE_TRANSLUCENT_FLAT,
+ RENDER_MODE_TEXTURED,
+ RENDER_MODE_LIGHTMAP_GRID,
+ RENDER_MODE_SELECTION_OVERLAY,
+ RENDER_MODE_SMOOTHING_GROUP,
+ RENDER_MODE_TEXTURED_SHADED,
+ RENDER_MODE_LIGHT_PREVIEW2,
+ RENDER_MODE_LIGHT_PREVIEW_RAYTRACED,
+ RENDER_MODE_INSTANCE_OVERLAY,
+};
+
+
+enum InstanceRenderingState_t
+{
+ INSTANCE_STATE_OFF, // normal rendering
+ INSTANCE_STATE_ON, // will be tinted as an instance
+ INSTANCE_STACE_SELECTED // will be tinted as a selected instance
+};
+
+
+typedef struct SInstanceState
+{
+ CMapInstance *m_pInstanceClass; // the func_instance entity
+ Vector m_InstanceOrigin; // the origin offset of instance rendering
+ QAngle m_InstanceAngles; // the rotation of the instance rendering
+ VMatrix m_InstanceMatrix; // matrix of the origin and rotation of rendering
+ VMatrix m_InstanceRenderMatrix; // matrix of the current camera transform
+ bool m_bIsEditable;
+ CMapInstance *m_pTopInstanceClass;
+} TInstanceState;
+
+
+#define STENCIL_AS_CALLS 1
+
+
+class CRender
+{
+public:
+ CRender(void);
+ virtual ~CRender(void);
+
+
+
+ enum
+ { TEXT_SINGLELINE = 0x1, // put all of the text on one line
+ TEXT_MULTILINE = 0x2, // the text is written on multiple lines
+ TEXT_JUSTIFY_BOTTOM = 0x4, // default
+ TEXT_JUSTIFY_TOP = 0x8,
+ TEXT_JUSTIFY_RIGHT = 0x10, // default
+ TEXT_JUSTIFY_LEFT = 0x20,
+ TEXT_JUSTIFY_HORZ_CENTER = 0x40,
+ TEXT_JUSTIFY_VERT_CENTER = 0x80,
+ TEXT_CLEAR_BACKGROUND = 0x100
+ }; // clear the background behind the text
+
+ enum
+ { HANDLE_NONE = 0,
+ HANDLE_SQUARE,
+ HANDLE_CIRCLE,
+ HANDLE_DIAMOND,
+ HANDLE_CROSS
+ };
+
+ // map view setup
+ virtual bool SetView( CMapView *pView );
+
+ CMapView *GetView() { return m_pView; }
+ CCamera *GetCamera();// { return m_pView->GetCamera(); }
+ bool IsActiveView();
+
+ // begin/end single render frame, sets up camera etc
+ virtual void StartRenderFrame();
+ virtual void EndRenderFrame();
+ int GetRenderFrame() { return m_nFrameCount; }
+
+ // switch rendering to client space coordinates (horz,vert,ignore)
+ // render is in world space mode by default
+ bool BeginClientSpace(void);
+ void EndClientSpace(void);
+ bool IsInClientSpace() { return m_bIsClientSpace; }
+
+ void BeginLocalTransfrom( const VMatrix &matrix, bool MultiplyCurrent = false );
+ void EndLocalTransfrom();
+ bool IsInLocalTransformMode();
+ void GetLocalTranform( VMatrix &matrix );
+
+ void SetTextColor( unsigned char r, unsigned char g, unsigned char b, unsigned char a = 255 );
+ void SetDrawColor( unsigned char r, unsigned char g, unsigned char b );
+ void SetDrawColor( const Color &color );
+ void GetDrawColor( Color &color );
+ void SetHandleColor( unsigned char r, unsigned char g, unsigned char b );
+
+ void SetHandleStyle( int size, int type );
+
+ void SetDefaultRenderMode(EditorRenderMode_t eRenderMode);
+ void BindTexture(IEditorTexture *pTexture);
+ void BindMaterial( IMaterial *pMaterial );
+
+ virtual void SetRenderMode( EditorRenderMode_t eRenderMode, bool force = false);
+ inline EditorRenderMode_t GetCurrentRenderMode() { return m_eCurrentRenderMode; }
+ inline EditorRenderMode_t GetDefaultRenderMode() { return m_eDefaultRenderMode; }
+
+ void PushRenderMode( EditorRenderMode_t eRenderMode );
+ void PopRenderMode();
+
+ // drawing primitives
+ void DrawPoint( const Vector &vPoint );
+ void DrawLine( const Vector &vStart, const Vector &vEnd );
+ virtual void DrawBox( const Vector &vMins, const Vector &vMaxs, bool bFill = false );
+ void DrawBoxExt( const Vector &vCenter, float extend, bool bFill = false );
+ void DrawSphere( const Vector &vCenter, int nRadius );
+ void DrawCircle( const Vector &vCenter, const Vector &vNormal, float flRadius, int nSegments );
+ void DrawPolyLine( int nPoints, const Vector *Points );
+ void DrawText( const char *text, int x, int y, int nFlags ); // Uses pixel coordinates
+ void DrawText( const char *text, const Vector2D &vPos, int nOffsetX, int nOffsetY, int nFlags ); // Uses "world" coordinates
+ void DrawHandle( const Vector &vPoint, const Vector2D *vOffset = NULL );
+ void DrawHandles( int nPoints, const Vector *Points );
+ void DrawArrow( Vector const &vStart, Vector const &vEnd );
+ void DrawPlane( const Vector &p0, const Vector &p1, const Vector &p2, const Vector &p3, bool bFill = false );
+
+ // drawing complex objects
+ void DrawModel( DrawModelInfo_t* pInfo, matrix3x4_t *pBoneToWorld, const Vector &vOrigin, float fAlpha = 1, bool bWireframe = false );
+ void DrawDisplacement( CCoreDispInfo *pDisp );
+ void DrawCollisionModel( MDLHandle_t mdlHandle, const VMatrix &mViewMatrix );
+
+
+ //
+ // helper funtions
+ //
+ void TransformPoint( Vector2D &vClient, const Vector& vWorld );
+ void TransformNormal( Vector2D &vClient, const Vector& vWorld );
+
+ void GetViewForward( Vector &ViewForward ) const;
+ void GetViewRight( Vector &ViewRight ) const;
+ void GetViewUp( Vector &ViewUp ) const;
+
+ void PrepareInstanceStencil( void );
+ void DrawInstanceStencil( void );
+ void PushInstanceRendering( InstanceRenderingState_t State );
+ void PopInstanceRendering( void );
+ void SetInstanceRendering( InstanceRenderingState_t State );
+
+ void SetInstanceRendering( bool InstanceRendering ) { m_bInstanceRendering = InstanceRendering; }
+ virtual void PushInstanceData( CMapInstance *pInstanceClass, Vector &InstanceOrigin, QAngle &InstanceAngles );
+ virtual void PopInstanceData( void );
+ bool GetInstanceRendering( void ) { return m_bInstanceRendering; }
+ CMapInstance *GetInstanceClass( void ) { return m_CurrentInstanceState.m_pInstanceClass; }
+ void GetInstanceMatrix( VMatrix &Matrix ) { Matrix = m_CurrentInstanceState.m_InstanceMatrix; }
+ Vector GetInstanceOrigin( void ) { return m_CurrentInstanceState.m_InstanceOrigin; }
+ QAngle GetInstanceAngle( void ) { return m_CurrentInstanceState.m_InstanceAngles; }
+ void TransformInstanceVector( Vector &In, Vector &Out ) { m_CurrentInstanceState.m_InstanceMatrix.V3Mul( In, Out ); }
+ void RotateInstanceVector( Vector &In, Vector &Out ) { VectorRotate( In, m_CurrentInstanceState.m_InstanceMatrix.As3x4(), Out ); }
+ void TransformInstanceAABB( Vector &InMins, Vector &InMaxs, Vector &OutMins, Vector &OutMaxs ) { TransformAABB( m_CurrentInstanceState.m_InstanceMatrix.As3x4(), InMins, InMaxs, OutMins, OutMaxs ); }
+
+protected:
+
+ bool GetRequiredMaterial( const char *pName, IMaterial* &pMaterial );
+ void UpdateStudioRenderConfig( bool bFlat, bool bWireframe );
+ // client space helper functions:
+ void DrawFilledRect( Vector2D& pt1, Vector2D& pt2, unsigned char *pColor, bool bBorder );
+ void DrawCross( Vector2D& pt1, Vector2D& pt2, unsigned char *pColor );
+ void DrawCircle( Vector2D &vCenter, float fRadius, int nSegments, unsigned char *pColor );
+ void DrawRect( Vector2D& pt1, Vector2D& pt2, unsigned char *pColor );
+
+protected:
+ CMapView *m_pView;
+ unsigned long m_DefaultFont;
+ bool m_bIsClientSpace;
+
+ bool m_bIsLocalTransform;
+ CUtlVector< VMatrix > m_LocalMatrix;
+
+ VMatrix m_OrthoMatrix;
+
+
+ // Meshbuilder used for drawing
+ IMesh* m_pMesh;
+ CMeshBuilder meshBuilder;
+
+ // colors
+ Color m_DrawColor; // current draw/fill color
+ Color m_TextColor; // current text color
+ Color m_HandleColor; // current text color
+
+ // handle styles
+ int m_nHandleSize;
+ int m_nHandleType;
+
+ // frame count
+ int m_nFrameCount; // increases each setup camera
+ bool m_bIsRendering;
+ bool m_bIsRenderingIntoVGUI;
+
+ // materials
+ IMaterial* m_pCurrentMaterial; // The currently bound material
+ IMaterial* m_pBoundMaterial; // a material given from external caller
+
+ int m_nDecalMode; // 0 or 1
+ IMaterial* m_pWireframe[2]; // default wireframe material
+ IMaterial* m_pFlat[2]; // default flat material
+ IMaterial* m_pDotted[2]; // default dotted material
+ IMaterial* m_pFlatNoZ[2]; // default flat material, ignore Z
+ IMaterial* m_pFlatNoCull[2]; // default flat material, no backface cull
+ IMaterial* m_pTranslucentFlat[2]; // default translucent flat material
+ IMaterial* m_pLightmapGrid[2]; // default lightmap grid material
+ IMaterial* m_pSelectionOverlay[2]; // for selecting actual textures
+
+ // render modes
+ EditorRenderMode_t m_eCurrentRenderMode; // Current render mode setting - Wireframe, flat, or textured.
+ EditorRenderMode_t m_eDefaultRenderMode; // Default render mode - Wireframe, flat, or textured.
+ CUtlStack<EditorRenderMode_t> m_RenderModeStack;
+
+ // instance
+ int m_nInstanceCount; // increases each time an instance is drawn regardless of view
+ bool m_bInstanceRendering; // if true, we are rendering an instance
+ VMatrix m_CurrentMatrix; // matrix of the current transforms
+ int m_InstanceSelectionDepth;
+ TInstanceState m_CurrentInstanceState; // the current instance state ( with current transforms )
+ CUtlVector< TInstanceState > m_InstanceState; // the instance state stack
+#ifndef STENCIL_AS_CALLS
+ ShaderStencilState_t m_ShaderStencilState;
+#endif // STENCIL_AS_CALLS
+ int m_nNumInstancesRendered; // number of instances rendered that impacted the stencil buffer
+ CUtlVector< InstanceRenderingState_t > m_InstanceRenderingState; // the instance rendering state stack
+
+};
+
+#endif // RENDER_H