diff options
Diffstat (limited to 'public/iscratchpad3d.h')
| -rw-r--r-- | public/iscratchpad3d.h | 326 |
1 files changed, 326 insertions, 0 deletions
diff --git a/public/iscratchpad3d.h b/public/iscratchpad3d.h new file mode 100644 index 0000000..82e4365 --- /dev/null +++ b/public/iscratchpad3d.h @@ -0,0 +1,326 @@ +//========= Copyright 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: + 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: + 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 |