|
|
//========= 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<CSPVert> 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
|