//========= Copyright © 1996-2005, Valve Corporation, All rights reserved. ============// // // Purpose: // // $NoKeywords: $ //=============================================================================// #ifndef ISCRATCHPAD3D_H #define ISCRATCHPAD3D_H #ifdef _WIN32 #pragma once #endif // IScratchPad3D will store drawing commands in a file to be viewed by ScratchPad3DViewer. // It can be used while stepping through geometry code to visualize what is going on as // drawing commands will be immediately visible in ScratchPad3DViewer even while you're stuck // in the debugger // ScratchPad3DViewer initially orbits 100 inches from the origin, so it can be useful // to call SetMapping to map what you're drawing input into this cube. #include "mathlib/vector.h" #include "mathlib/vector2d.h" #include "utlvector.h" class IFileSystem; class CSPColor { public: CSPColor() { m_flAlpha = 1; } CSPColor( const Vector &vColor, float flAlpha=1 ) { m_vColor = vColor; m_flAlpha = flAlpha; } CSPColor( float r, float g, float b, float a=1 ) { m_vColor.Init( r, g, b ); m_flAlpha = a; } Vector m_vColor; float m_flAlpha; }; class CSPVert { public: CSPVert(); CSPVert( Vector const &vPos, const CSPColor &vColor=CSPColor( Vector(1, 1, 1), 1 ) ); void Init( Vector const &vPos, const CSPColor &vColor=CSPColor( Vector(1, 1, 1), 1 ) ); public: Vector m_vPos; CSPColor m_vColor; }; class CSPVertList { public: explicit CSPVertList( int nVerts = 0 ); CSPVertList(CSPVert const *pVerts, int nVerts); CSPVertList(Vector const *pVerts, int nVerts, CSPColor vColor=CSPColor(1,1,1) ); CSPVertList(Vector const *pVerts, Vector const *pColors, int nVerts); CSPVertList(Vector const *pVerts, CSPColor const *pColors, int nVerts); CSPVertList(Vector const &vert1, CSPColor const &color1, Vector const &vert2, CSPColor const &color2, Vector const &vert3, CSPColor const &color3); CUtlVector m_Verts; }; class SPRGBA { public: unsigned char r,g,b,a; }; class CTextParams { public: CTextParams(); Vector m_vColor; // Color of the string (starting color.. at some point, // we can embed commands in the text itself to change the color). float m_flAlpha; // Alpha of the whole thing. bool m_bSolidBackground; // Should the background be solid or alpha'd? // Draw an outline around the text? bool m_bOutline; Vector m_vPos; // Where to render the text. bool m_bCentered; // Centered on m_vPos, or is m_vPos the upper-left corner? QAngle m_vAngles; // Orientation of the text. bool m_bTwoSided; // Render the text from both sides? float m_flLetterWidth; // Letter width in world space. }; abstract_class IScratchPad3D { protected: virtual ~IScratchPad3D() {} // Types. public: enum RenderState { RS_FillMode=0, // val = one of the FillMode enums RS_ZRead, RS_ZBias // val = 0 - 16 to push Z towards viewer }; enum FillMode { FillMode_Wireframe=0, FillMode_Solid }; public: virtual void Release() = 0; // This sets up a mapping between input coordinates and output coordinates. // This can be used to zoom into an area of interest where you'll be drawing things. // An alternative is to press Z while in VisLibViewer to have it center and zoom on // everything that has been drawn. virtual void SetMapping( Vector const &vInputMin, Vector const &vInputMax, Vector const &vOutputMin, Vector const &vOutputMax ) = 0; // Enable/disable auto flush. When set to true (the default), all drawing commands // are immediately written to the file and will show up in VisLibViewer right away. // If you want to draw a lot of things, you can set this to false and call Flush() // manually when you want the file written out. // When you set auto flush to true, it calls Flush(). virtual bool GetAutoFlush() = 0; virtual void SetAutoFlush( bool bAutoFlush ) = 0; // Draw a point. Point size is (roughly) in world coordinates, so points // get smaller as the viewer moves away. virtual void DrawPoint( CSPVert const &v, float flPointSize ) = 0; // Draw a line. virtual void DrawLine( CSPVert const &v1, CSPVert const &v2 ) = 0; // Draw a polygon. virtual void DrawPolygon( CSPVertList const &verts ) = 0; // Draw 2D rectangles. virtual void DrawRectYZ( float xPos, Vector2D const &vMin, Vector2D const &vMax, const CSPColor &vColor ) = 0; virtual void DrawRectXZ( float yPos, Vector2D const &vMin, Vector2D const &vMax, const CSPColor &vColor ) = 0; virtual void DrawRectXY( float zPos, Vector2D const &vMin, Vector2D const &vMax, const CSPColor &vColor ) = 0; // Draw a wireframe box. virtual void DrawWireframeBox( Vector const &vMin, Vector const &vMax, Vector const &vColor ) = 0; // Draw some text. virtual void DrawText( const char *pStr, const CTextParams ¶ms ) = 0; // Wireframe on/off. virtual void SetRenderState( RenderState state, unsigned long val ) = 0; // Clear all the drawing commands. virtual void Clear() = 0; // Calling this writes all the commands to the file. If AutoFlush is true, this is called // automatically in all the drawing commands. virtual void Flush() = 0; // Primitives that build on the atomic primitives. public: // Draw a black and white image. // Corners are in this order: bottom-left, top-left, top-right, bottom-right. // If the corners are NULL, then the image is drawn in the XY plane from (-100,-100) to (100,100). virtual void DrawImageBW( unsigned char const *pData, int width, int height, int pitchInBytes, bool bOutlinePixels=true, bool bOutlineImage=false, Vector *vCorners=NULL ) = 0; // 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 ) = 0; }; // Just a helper for functions where you want to have a CScratchPad3D around // and release it automatically when the function exits. class CScratchPadAutoRelease { public: explicit CScratchPadAutoRelease( IScratchPad3D *pPad ) { m_pPad = pPad; } ~CScratchPadAutoRelease() { if( m_pPad ) m_pPad->Release(); } IScratchPad3D *m_pPad; }; IScratchPad3D* ScratchPad3D_Create( char const *pFilename = "scratch.pad" ); // ------------------------------------------------------------------------------------ // // Inlines. // ------------------------------------------------------------------------------------ // inline CTextParams::CTextParams() { m_vColor.Init( 1, 1, 1 ); m_flAlpha = 1; m_bSolidBackground = true; m_bOutline = true; m_vPos.Init(); m_bCentered = true; m_vAngles.Init(); m_bTwoSided = true; m_flLetterWidth = 3; } inline CSPVert::CSPVert() { } inline CSPVert::CSPVert( Vector const &vPos, const CSPColor &vColor ) { Init( vPos, vColor ); } inline void CSPVert::Init( Vector const &vPos, const CSPColor &vColor ) { m_vPos = vPos; m_vColor = vColor; } inline CSPVertList::CSPVertList( int nVerts ) { if( nVerts ) m_Verts.AddMultipleToTail( nVerts ); } inline CSPVertList::CSPVertList(CSPVert const *pVerts, int nVerts ) { m_Verts.CopyArray( pVerts, nVerts ); } inline CSPVertList::CSPVertList(Vector const *pVerts, int nVerts, CSPColor vColor ) { m_Verts.AddMultipleToTail( nVerts ); for( int i=0; i < nVerts; i++ ) { m_Verts[i].m_vPos = pVerts[i]; m_Verts[i].m_vColor = vColor; } } inline CSPVertList::CSPVertList( Vector const *pVerts, Vector const *pColors, int nVerts ) { m_Verts.AddMultipleToTail( nVerts ); for( int i=0; i < nVerts; i++ ) { m_Verts[i].m_vPos = pVerts[i]; m_Verts[i].m_vColor = pColors[i]; } } inline CSPVertList::CSPVertList( Vector const *pVerts, CSPColor const *pColors, int nVerts ) { m_Verts.AddMultipleToTail( nVerts ); for( int i=0; i < nVerts; i++ ) { m_Verts[i].m_vPos = pVerts[i]; m_Verts[i].m_vColor = pColors[i]; } } inline CSPVertList::CSPVertList( Vector const &vert1, CSPColor const &color1, Vector const &vert2, CSPColor const &color2, Vector const &vert3, CSPColor const &color3 ) { m_Verts.AddMultipleToTail( 3 ); m_Verts[0].Init( vert1, color1 ); m_Verts[1].Init( vert2, color2 ); m_Verts[2].Init( vert3, color3 ); } #endif // ISCRATCHPAD3D_H