|
|
//========= Copyright � 1996-2005, Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
// $NoKeywords: $
//=============================================================================//
#ifndef SCRATCHPAD3D_H
#define SCRATCHPAD3D_H
#ifdef _WIN32
#pragma once
#endif
#include <stdio.h>
#include "iscratchpad3d.h"
#include "mathlib/vmatrix.h"
#include "filesystem.h"
class CFileRead;
class CScratchPad3D : public IScratchPad3D { // Commands that can go in the file.
public:
enum { COMMAND_POINT=0, COMMAND_LINE, COMMAND_POLYGON, COMMAND_MATRIX, COMMAND_RENDERSTATE, COMMAND_TEXT, COMMAND_NUMCOMMANDS }; class ICachedRenderData { public: virtual void Release() = 0; };
class CBaseCommand { public: CBaseCommand( unsigned char iCommand ) { m_iCommand = (unsigned char)iCommand; m_pCachedRenderData = NULL; }
~CBaseCommand() { ReleaseCachedRenderData(); } virtual void Read( CFileRead *pFile ) = 0; virtual void Write( IFileSystem* pFileSystem, FileHandle_t fp ) = 0; // Release cached render data. Usually used for releasing things like textures when
// the app is resizing..
void ReleaseCachedRenderData() { if ( m_pCachedRenderData ) { m_pCachedRenderData->Release(); m_pCachedRenderData = NULL; } }
public: unsigned char m_iCommand; // One of the COMMAND_ defines.
// The renderer can cache data with the commands to speedup the rendering after
// the first time (text uses this big time).
ICachedRenderData *m_pCachedRenderData; };
class CCommand_Point : public CBaseCommand { public: CCommand_Point() : CBaseCommand( COMMAND_POINT ) {}
virtual void Read( CFileRead *pFile ); virtual void Write( IFileSystem* pFileSystem, FileHandle_t fp );
float m_flPointSize; CSPVert m_Vert; };
class CCommand_Line : public CBaseCommand { public: CCommand_Line() : CBaseCommand( COMMAND_LINE ) {}
virtual void Read( CFileRead *pFile ); virtual void Write( IFileSystem* pFileSystem, FileHandle_t fp );
CSPVert m_Verts[2]; };
class CCommand_Polygon : public CBaseCommand { public: CCommand_Polygon() : CBaseCommand( COMMAND_POLYGON ) {}
virtual void Read( CFileRead *pFile ); virtual void Write( IFileSystem* pFileSystem, FileHandle_t fp );
CUtlVector<CSPVert> m_Verts; };
class CCommand_Matrix : public CBaseCommand { public: CCommand_Matrix() : CBaseCommand( COMMAND_MATRIX ) {}
virtual void Read( CFileRead *pFile ); virtual void Write( IFileSystem* pFileSystem, FileHandle_t fp );
VMatrix m_mMatrix; };
class CCommand_RenderState : public CBaseCommand { public: CCommand_RenderState() : CBaseCommand( COMMAND_RENDERSTATE ) {}
virtual void Read( CFileRead *pFile ); virtual void Write( IFileSystem* pFileSystem, FileHandle_t fp );
unsigned long m_State; // One of the RS_ enums.
unsigned long m_Val; };
class CCommand_Text : public CBaseCommand { public: CCommand_Text() : CBaseCommand( COMMAND_TEXT ) {}
virtual void Read( CFileRead *pFile ); virtual void Write( IFileSystem* pFileSystem, FileHandle_t fp );
CUtlVector<char> m_String; // The string to render.
CTextParams m_TextParams; };
public: CScratchPad3D( char const *pFilename, IFileSystem *pFileSystem, bool bAutoClear );
void AutoFlush(); void DrawRectGeneric( int iPlane, int otherDim1, int otherDim2, float planeDist, Vector2D const &vMin, Vector2D const &vMax, CSPColor const &vColor ); void DeleteCommands();
// Load a file...
bool LoadCommandsFromFile( );
public:
virtual void Release();
virtual void SetMapping( Vector const &vInputMin, Vector const &vInputMax, Vector const &vOutputMin, Vector const &vOutputMax ); virtual bool GetAutoFlush(); virtual void SetAutoFlush( bool bAutoFlush ); virtual void DrawPoint( CSPVert const &v, float flPointSize ); virtual void DrawLine( CSPVert const &v1, CSPVert const &v2 ); virtual void DrawPolygon( CSPVertList const &verts ); virtual void DrawRectYZ( float xPos, Vector2D const &vMin, Vector2D const &vMax, CSPColor const &vColor ); virtual void DrawRectXZ( float yPos, Vector2D const &vMin, Vector2D const &vMax, CSPColor const &vColor ); virtual void DrawRectXY( float zPos, Vector2D const &vMin, Vector2D const &vMax, CSPColor const &vColor ); virtual void DrawWireframeBox( Vector const &vMin, Vector const &vMax, Vector const &vColor ); virtual void DrawText( const char *pStr, const CTextParams ¶ms ); virtual void SetRenderState( RenderState state, unsigned long val ); virtual void Clear(); virtual void Flush(); virtual void DrawImageBW( unsigned char const *pData, int width, int height, int pitchInBytes, bool bOutlinePixels=true, bool bOutlineImage=false, Vector *vCorners=NULL ); // Draw an RGBA image.
// Corners are in this order: bottom-left, top-left, top-right, bottom-right.
virtual void DrawImageRGBA( SPRGBA *pData, int width, int height, int pitchInBytes, bool bOutlinePixels=true, bool bOutlineImage=false, Vector *vCorners=NULL );
void DrawPolygonsForPixels( SPRGBA *pData, int width, int height, int pitchInBytes, Vector *vCorners );
public: IFileSystem* m_pFileSystem; char const *m_pFilename; CUtlVector<CBaseCommand*> m_Commands; bool m_bAutoFlush; };
IFileSystem* ScratchPad3D_SetupFileSystem();
#endif // SCRATCHPAD3D_H
|