Modified source engine (2017) developed by valve and leaked in 2020. Not for commercial purporses
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

321 lines
7.7 KiB

5 years ago
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
// $NoKeywords: $
//=============================================================================//
#include "cbase.h"
#include "vgui_bitmapimage.h"
#include <vgui_controls/Controls.h>
#include <vgui/ISurface.h>
#include <vgui_controls/Panel.h>
#include "panelmetaclassmgr.h"
#include <KeyValues.h>
#include <vgui/IPanel.h>
#include <bitmap/bitmap.h>
// memdbgon must be the last include file in a .cpp file!!!
#include "tier0/memdbgon.h"
//-----------------------------------------------------------------------------
// Purpose: Check box image
//-----------------------------------------------------------------------------
BitmapImage::BitmapImage()
{
m_clr.SetColor( 255, 255, 255, 255 );
m_pos[ 0 ] = m_pos[ 1 ] = 0;
m_pPanelSize = NULL;
m_nTextureId = -1;
m_bProcedural = false;
SetViewport( false, 0.0f, 0.0f, 0.0f, 0.0f );
}
BitmapImage::BitmapImage( vgui::VPANEL parent, const char *filename )
{
m_nTextureId = -1;
m_clr.SetColor( 255, 255, 255, 255 );
m_pos[ 0 ] = m_pos[ 1 ] = 0;
Init( parent, filename );
SetViewport( false, 0.0f, 0.0f, 0.0f, 0.0f );
}
BitmapImage::~BitmapImage()
{
DestroyTexture();
}
void BitmapImage::DestroyTexture()
{
if ( m_nTextureId != -1 )
{
vgui::surface()->DestroyTextureID( m_nTextureId );
m_nTextureId = -1;
m_bProcedural = false;
}
}
bool BitmapImage::Init( vgui::VPANEL pParent, const char *pFileName )
{
UsePanelRenderSize( pParent );
if ( pFileName != NULL )
{
DestroyTexture();
m_nTextureId = vgui::surface()->CreateNewTextureID();
m_bProcedural = false;
vgui::surface()->DrawSetTextureFile( m_nTextureId, pFileName , true, true);
GetSize( m_Size[0], m_Size[1] );
}
return true;
}
bool BitmapImage::Init( vgui::VPANEL pParent, KeyValues* pInitData )
{
char const* pMaterialName = pInitData->GetString( "material" );
if ( !pMaterialName || !pMaterialName[ 0 ] )
return false;
// modulation color
Color color;
if (!ParseRGBA( pInitData, "color", color ))
color.SetColor( 255, 255, 255, 255 );
Init( pParent, pMaterialName );
SetColor( color );
return true;
}
//-----------------------------------------------------------------------------
// FIXME: Bleah!!! Don't want two different KeyValues
/*-----------------------------------------------------------------------------
bool BitmapImage::Init( vgui::VPANEL pParent, KeyValues* pInitData )
{
char const* pMaterialName = pInitData->GetString( "material" );
if ( !pMaterialName || !pMaterialName[ 0 ] )
return false;
// modulation color
Color color;
if (!ParseRGBA( pInitData, "color", color ))
color.SetColor( 255, 255, 255, 255 );
Init( pParent, pMaterialName );
SetColor( color );
return true;
} */
void BitmapImage::SetImageFile( const char *newImage )
{
if ( m_nTextureId == -1 || m_bProcedural )
{
DestroyTexture();
m_nTextureId = vgui::surface()->CreateNewTextureID();
m_bProcedural = false;
}
vgui::surface()->DrawSetTextureFile( m_nTextureId, newImage , true, true);
}
void BitmapImage::UsePanelRenderSize( vgui::VPANEL pPanel )
{
m_pPanelSize = pPanel;
}
vgui::VPANEL BitmapImage::GetRenderSizePanel( void )
{
return m_pPanelSize;
}
void BitmapImage::SetRenderSize( int x, int y )
{
m_Size[0] = x;
m_Size[1] = y;
}
void BitmapImage::DoPaint( int x, int y, int wide, int tall, float yaw, float flAlphaModulate )
{
vgui::surface()->DrawSetTexture( m_nTextureId );
int r, g, b, a;
m_clr.GetColor( r, g, b, a );
a *= flAlphaModulate;
vgui::surface()->DrawSetColor( r, g, b, a );
if (yaw == 0)
{
if ( !m_bUseViewport )
{
vgui::surface()->DrawTexturedRect( x, y, x + wide, y + tall );
}
else
{
vgui::surface()->DrawTexturedSubRect( x, y, x + wide, y + tall,
m_rgViewport[ 0 ],
m_rgViewport[ 1 ],
m_rgViewport[ 2 ],
m_rgViewport[ 3 ]
);
}
}
else
{
// Rotated version of the bitmap!
// Rotate about the center of the bitmap
vgui::Vertex_t verts[4];
Vector2D center( x + (wide * 0.5f), y + (tall * 0.5f) );
// Choose a basis...
float yawRadians = -yaw * M_PI / 180.0f;
Vector2D axis[2];
axis[0].x = cos(yawRadians);
axis[0].y = sin(yawRadians);
axis[1].x = -axis[0].y;
axis[1].y = axis[0].x;
verts[0].m_TexCoord.Init( 0, 0 );
Vector2DMA( center, -0.5f * wide, axis[0], verts[0].m_Position );
Vector2DMA( verts[0].m_Position, -0.5f * tall, axis[1], verts[0].m_Position );
verts[1].m_TexCoord.Init( 1, 0 );
Vector2DMA( verts[0].m_Position, wide, axis[0], verts[1].m_Position );
verts[2].m_TexCoord.Init( 1, 1 );
Vector2DMA( verts[1].m_Position, tall, axis[1], verts[2].m_Position );
verts[3].m_TexCoord.Init( 0, 1 );
Vector2DMA( verts[0].m_Position, tall, axis[1], verts[3].m_Position );
vgui::surface()->DrawTexturedPolygon( 4, verts );
}
}
void BitmapImage::DoPaint( vgui::VPANEL pPanel, float yaw, float flAlphaModulate )
{
int wide, tall;
if ( pPanel )
{
vgui::ipanel()->GetSize(pPanel, wide, tall );
}
else
{
wide = m_Size[0];
tall = m_Size[1];
}
DoPaint( m_pos[0], m_pos[1], wide, tall, yaw, flAlphaModulate );
}
void BitmapImage::Paint()
{
DoPaint( m_pPanelSize );
}
void BitmapImage::SetColor( const Color& clr )
{
m_clr = clr;
}
Color BitmapImage::GetColor( )
{
return m_clr;
}
void BitmapImage::GetColor( int& r,int& g,int& b,int& a )
{
m_clr.GetColor( r,g,b,a );
}
void BitmapImage::GetSize( int& wide, int& tall )
{
vgui::surface()->DrawGetTextureSize( m_nTextureId, wide, tall );
}
void BitmapImage::SetPos( int x, int y )
{
m_pos[ 0 ] = x;
m_pos[ 1 ] = y;
}
//-----------------------------------------------------------------------------
// Helper method to initialize a bitmap image from KeyValues data..
//-----------------------------------------------------------------------------
bool InitializeImage( KeyValues *pInitData, const char* pSectionName, vgui::Panel *pParent, BitmapImage* pBitmapImage )
{
KeyValues *pBitmapImageSection;
if (pSectionName)
{
pBitmapImageSection = pInitData->FindKey( pSectionName );
if ( !pBitmapImageSection )
return false;
}
else
{
pBitmapImageSection = pInitData;
}
return pBitmapImage->Init( pParent->GetVPanel(), pBitmapImageSection );
}
//-----------------------------------------------------------------------------
// FIXME: How sad. We need to make KeyValues + vgui::KeyValues be the same. Bleah
/*-----------------------------------------------------------------------------
bool InitializeImage( KeyValues *pInitData, const char* pSectionName, vgui::Panel *pParent, BitmapImage* pBitmapImage )
{
KeyValues *pBitmapImageSection;
if (pSectionName)
{
pBitmapImageSection = pInitData->FindKey( pSectionName );
if ( !pBitmapImageSection )
return false;
}
else
{
pBitmapImageSection = pInitData;
}
return pBitmapImage->Init( pParent->GetVPanel(), pBitmapImageSection );
} */
//-----------------------------------------------------------------------------
// Purpose:
// Input : use -
// left -
// top -
// right -
// bottom -
//-----------------------------------------------------------------------------
void BitmapImage::SetViewport( bool use, float left, float top, float right, float bottom )
{
m_bUseViewport = use;
m_rgViewport[ 0 ] = left;
m_rgViewport[ 1 ] = top;
m_rgViewport[ 2 ] = right;
m_rgViewport[ 3 ] = bottom;
}
//-----------------------------------------------------------------------------
void BitmapImage::SetBitmap( const Bitmap_t &bitmap )
{
if ( m_nTextureId == -1 || !m_bProcedural )
{
DestroyTexture();
m_nTextureId = vgui::surface()->CreateNewTextureID( true );
m_bProcedural = true;
}
vgui::surface()->DrawSetTextureRGBA( m_nTextureId, bitmap.GetBits(), bitmap.Width(), bitmap.Height(), 1, true );
// Initialize render size, if we don't already have one
if ( m_Size[0] == 0 )
{
m_Size[0] = bitmap.Width();
m_Size[1] = bitmap.Height();
}
}