Exemplo n.º 1
0
void FX_DrawLine( const Vector &start, const Vector &end, float scale, IMaterial *pMaterial, const color32 &color )
{
    Vector			lineDir, viewDir;
    //Get the proper orientation for the line
    VectorSubtract( end, start, lineDir );
    VectorSubtract( end, CurrentViewOrigin(), viewDir );

    Vector cross = lineDir.Cross( viewDir );

    VectorNormalize( cross );

    CMatRenderContextPtr pRenderContext( materials );

    //Bind the material
    IMesh* pMesh = pRenderContext->GetDynamicMesh( true, NULL, NULL, pMaterial );
    CMeshBuilder meshBuilder;

    Vector			tmp;
    meshBuilder.Begin( pMesh, MATERIAL_QUADS, 1 );

    VectorMA( start, -scale, cross, tmp );
    meshBuilder.Position3fv( tmp.Base() );
    meshBuilder.TexCoord2f( 0, 1.0f, 1.0f );
    meshBuilder.Color4ub( color.r, color.g, color.b, color.a );
    meshBuilder.Normal3fv( cross.Base() );
    meshBuilder.AdvanceVertex();

    VectorMA( start, scale, cross, tmp );
    meshBuilder.Position3fv( tmp.Base() );
    meshBuilder.TexCoord2f( 0, 0.0f, 1.0f );
    meshBuilder.Color4ub( color.r, color.g, color.b, color.a );
    meshBuilder.Normal3fv( cross.Base() );
    meshBuilder.AdvanceVertex();

    VectorMA( end, scale, cross, tmp );
    meshBuilder.Position3fv( tmp.Base() );
    meshBuilder.TexCoord2f( 0, 0.0f, 0.0f );
    meshBuilder.Color4ub( color.r, color.g, color.b, color.a );
    meshBuilder.Normal3fv( cross.Base() );
    meshBuilder.AdvanceVertex();

    VectorMA( end, -scale, cross, tmp );
    meshBuilder.Position3fv( tmp.Base() );
    meshBuilder.TexCoord2f( 0, 1.0f, 0.0f );
    meshBuilder.Color4ub( color.r, color.g, color.b, color.a );
    meshBuilder.Normal3fv( cross.Base() );
    meshBuilder.AdvanceVertex();

    meshBuilder.End();
    pMesh->Draw();
}
Exemplo n.º 2
0
void
drawFloor ()
{
	float mTempModel[4][4];
	float mTempView[4][4];
	g_pMaterialSystem->Bind(g_materialFloor);
	g_pMaterialSystem->MatrixMode(MATERIAL_MODEL);
	g_pMaterialSystem->GetMatrix(MATERIAL_MODEL, (float*)mTempModel);
	g_pMaterialSystem->LoadIdentity();
	g_pMaterialSystem->MatrixMode(MATERIAL_VIEW);
	g_pMaterialSystem->GetMatrix(MATERIAL_VIEW, (float*)mTempView);
	g_pMaterialSystem->LoadIdentity();
	{
		IMesh* pMesh = g_pMaterialSystem->GetDynamicMesh();
		CMeshBuilder meshBuilder;
		meshBuilder.Begin( pMesh, MATERIAL_QUADS, 1 );

		float dist=-15000.0f;
		float tMin=0, tMax=1;
		
		meshBuilder.Position3f(-dist, dist, dist);
		meshBuilder.TexCoord2f( 0, tMin,tMax );
		meshBuilder.Color4ub( 255, 255, 255, 255 );
		meshBuilder.AdvanceVertex();

		meshBuilder.Position3f( dist, dist, dist);
		meshBuilder.TexCoord2f( 0, tMax,tMax );
		meshBuilder.Color4ub( 255, 255, 255, 255 );
		meshBuilder.AdvanceVertex();

		meshBuilder.Position3f( dist,-dist, dist);
		meshBuilder.TexCoord2f( 0, tMax,tMin );
		meshBuilder.Color4ub( 255, 255, 255, 255 );
		meshBuilder.AdvanceVertex();

		meshBuilder.Position3f(-dist,-dist, dist);
		meshBuilder.TexCoord2f( 0, tMin,tMin );
		meshBuilder.Color4ub( 255, 255, 255, 255 );
		meshBuilder.AdvanceVertex();

		meshBuilder.End();
		pMesh->Draw();
	}
	g_pMaterialSystem->MatrixMode(MATERIAL_MODEL);
	g_pMaterialSystem->LoadMatrix((float*)mTempModel);
	g_pMaterialSystem->MatrixMode(MATERIAL_VIEW);
	g_pMaterialSystem->LoadMatrix((float*)mTempView);
}
Exemplo n.º 3
0
//-----------------------------------------------------------------------------
// Draws a quad
//-----------------------------------------------------------------------------
void CAVITestApp::DrawStuff( AVIMaterial_t hMaterial )
{
	int iViewableWidth = GetWindowWidth();
	int iViewableHeight = GetWindowHeight();

	g_pAVI->SetTime( hMaterial, Sys_FloatTime() - m_flStartTime );

	float flMaxU, flMaxV;
	g_pAVI->GetTexCoordRange( hMaterial, &flMaxU, &flMaxV );
	IMaterial *pMaterial = g_pAVI->GetMaterial( hMaterial );

	CMatRenderContextPtr pRenderContext( g_pMaterialSystem );

	pRenderContext->MatrixMode( MATERIAL_PROJECTION );
	pRenderContext->LoadIdentity();
	pRenderContext->Ortho( 0, 0, iViewableWidth, iViewableHeight, 0, 1 );

	pRenderContext->Bind( pMaterial );
	IMesh *pMesh = pRenderContext->GetDynamicMesh();
	CMeshBuilder meshBuilder;

	meshBuilder.Begin( pMesh, MATERIAL_QUADS, 1 );

	// Draw a polygon the size of the panel
	meshBuilder.Color4ub( 255, 255, 255, 255 );
	meshBuilder.Position3f( -0.5, iViewableHeight + 0.5, 0 );
	meshBuilder.TexCoord2f( 0, 0, 0 );
	meshBuilder.AdvanceVertex();

	meshBuilder.Color4ub( 255, 255, 255, 255 );
	meshBuilder.Position3f( -0.5, 0.5, 0 );
	meshBuilder.TexCoord2f( 0, 0, flMaxV );
	meshBuilder.AdvanceVertex();

	meshBuilder.Color4ub( 255, 255, 255, 255 );
	meshBuilder.Position3f( iViewableWidth - 0.5, 0.5, 0 );
	meshBuilder.TexCoord2f( 0, flMaxU, flMaxV );
	meshBuilder.AdvanceVertex();

	meshBuilder.Color4ub( 255, 255, 255, 255 );
	meshBuilder.Position3f( iViewableWidth - 0.5, iViewableHeight + 0.5, 0 );
	meshBuilder.TexCoord2f( 0, flMaxU, 0 );
	meshBuilder.AdvanceVertex();

	meshBuilder.End();
	pMesh->Draw();
}
void CMoviePlayerPanel::Paint()
{
	if ( m_pVideoMaterial == NULL )
		return;

	// Get panel position/dimensions
	int x,y;
	int w,h;
	GetPosRelativeToAncestor( NULL, x, y );
	GetSize( w,h );

	CMatRenderContextPtr pRenderContext( materials );
	pRenderContext->Bind( m_pMaterial );

	IMesh* pMesh = pRenderContext->GetDynamicMesh( true );

	float flMinU = 0.0f, flMinV = 0.0f;
	float flMaxU, flMaxV;
	m_pVideoMaterial->GetVideoTexCoordRange( &flMaxU, &flMaxV );

	CMeshBuilder meshBuilder;
	meshBuilder.Begin( pMesh, MATERIAL_QUADS, 1 );

	meshBuilder.Position3f( x, y, 0.0f );
	meshBuilder.TexCoord2f( 0, flMinU, flMinV );
	meshBuilder.Color4ub( 255, 255, 255, 255 );
	meshBuilder.AdvanceVertex();

	meshBuilder.Position3f( x + w, y, 0.0f );
	meshBuilder.TexCoord2f( 0, flMaxU, flMinV );
	meshBuilder.Color4ub( 255, 255, 255, 255 );
	meshBuilder.AdvanceVertex();

	meshBuilder.Position3f( x + w, y + h, 0.0f );
	meshBuilder.TexCoord2f( 0, flMaxU, flMaxV );
	meshBuilder.Color4ub( 255, 255, 255, 255 );
	meshBuilder.AdvanceVertex();

	meshBuilder.Position3f( x, y + h, 0.0f );
	meshBuilder.TexCoord2f( 0, flMinU, flMaxV );
	meshBuilder.Color4ub( 255, 255, 255, 255 );
	meshBuilder.AdvanceVertex();

	meshBuilder.End();
	pMesh->Draw();
}
Exemplo n.º 5
0
//-----------------------------------------------------------------------------
// Draws the control points in wireframe
//-----------------------------------------------------------------------------
void C_Shield::DrawWireframeModel( Vector const** ppPositions )
{
	IMesh* pMesh = materials->GetDynamicMesh( true, NULL, NULL, m_pWireframe );

	int numLines = (Height() - 1) * Width() + Height() * (Width() - 1);

	CMeshBuilder meshBuilder;
	meshBuilder.Begin( pMesh, MATERIAL_LINES, numLines );

	Vector const* tmp;
	for (int i = 0; i < Height(); ++i)
	{
		for (int j = 0; j < Width(); ++j)
		{
			if ( i > 0 )
			{
				tmp = ppPositions[j + Width() * i];
				meshBuilder.Position3fv( tmp->Base() );
				meshBuilder.Color4ub( 255, 255, 255, 128 );
				meshBuilder.AdvanceVertex();

				tmp = ppPositions[j + Width() * (i-1)];
				meshBuilder.Position3fv( tmp->Base() );
				meshBuilder.Color4ub( 255, 255, 255, 128 );
				meshBuilder.AdvanceVertex();
			}

			if (j > 0)
			{
				tmp = ppPositions[j + Width() * i];
				meshBuilder.Position3fv( tmp->Base() );
				meshBuilder.Color4ub( 255, 255, 255, 128 );
				meshBuilder.AdvanceVertex();

				tmp = ppPositions[j - 1 + Width() * i];
				meshBuilder.Position3fv( tmp->Base() );
				meshBuilder.Color4ub( 255, 255, 255, 128 );
				meshBuilder.AdvanceVertex();
			}
		}
	}

	meshBuilder.End();
	pMesh->Draw();
}
//-----------------------------------------------------------------------------
// Draw sprite-card based materials
//-----------------------------------------------------------------------------
void CVMTPreviewPanel::RenderSpriteCard( const Vector &vCenter, float flRadius )
{		 	 
	CMatRenderContextPtr pRenderContext( MaterialSystem() );
	IMesh *pMesh = pRenderContext->GetDynamicMesh();

	CMeshBuilder meshBuilder;
	meshBuilder.Begin( pMesh, MATERIAL_QUADS, 1 );

	// Draw a polygon the size of the panel
	meshBuilder.Position3fv( vCenter.Base() );
	meshBuilder.Color4ub( 255, 255, 255, 255 );
	meshBuilder.TexCoord4f( 0, 0.0f, 0.0f, 1.0f, 1.0f );
	meshBuilder.TexCoord4f( 1, 0.0f, 0.0f, 1.0f, 1.0f );
	meshBuilder.TexCoord4f( 2, 0.0f, 0.0f, flRadius, 0.0f );
	meshBuilder.TexCoord2f( 3, 0, 0 );
	meshBuilder.AdvanceVertex();

	meshBuilder.Position3fv( vCenter.Base() );
	meshBuilder.Color4ub( 255, 255, 255, 255 );
	meshBuilder.TexCoord4f( 0, 0.0f, 0.0f, 1.0f, 1.0f );
	meshBuilder.TexCoord4f( 1, 0.0f, 0.0f, 1.0f, 1.0f );
	meshBuilder.TexCoord4f( 2, 0.0f, 0.0f, flRadius, 0.0f );
	meshBuilder.TexCoord2f( 3, 0, 1 );
	meshBuilder.AdvanceVertex();

	meshBuilder.Position3fv( vCenter.Base() );
	meshBuilder.Color4ub( 255, 255, 255, 255 );
	meshBuilder.TexCoord4f( 0, 0.0f, 0.0f, 1.0f, 1.0f );
	meshBuilder.TexCoord4f( 1, 0.0f, 0.0f, 1.0f, 1.0f );
	meshBuilder.TexCoord4f( 2, 0.0f, 0.0f, flRadius, 0.0f );
	meshBuilder.TexCoord2f( 3, 1, 1 );
	meshBuilder.AdvanceVertex();

	meshBuilder.Position3fv( vCenter.Base() );
	meshBuilder.Color4ub( 255, 255, 255, 255 );
	meshBuilder.TexCoord4f( 0, 0.0f, 0.0f, 1.0f, 1.0f );
	meshBuilder.TexCoord4f( 1, 0.0f, 0.0f, 1.0f, 1.0f );
	meshBuilder.TexCoord4f( 2, 0.0f, 0.0f, flRadius, 0.0f );
	meshBuilder.TexCoord2f( 3, 1, 0 );
	meshBuilder.AdvanceVertex();

	meshBuilder.End();
	pMesh->Draw();
}
Exemplo n.º 7
0
void C_EnergyWave::DrawWireframeModel( )
{
	IMesh* pMesh = materials->GetDynamicMesh( true, NULL, NULL, m_pWireframe );

	int numLines = (EWAVE_NUM_VERTICAL_POINTS - 1) * EWAVE_NUM_HORIZONTAL_POINTS +
		EWAVE_NUM_VERTICAL_POINTS * (EWAVE_NUM_HORIZONTAL_POINTS - 1);

	CMeshBuilder meshBuilder;
	meshBuilder.Begin( pMesh, MATERIAL_LINES, numLines );

	Vector tmp;
	for (int i = 0; i < EWAVE_NUM_VERTICAL_POINTS; ++i)
	{
		for (int j = 0; j < EWAVE_NUM_HORIZONTAL_POINTS; ++j)
		{
			if ( i > 0 )
			{
				meshBuilder.Position3fv( m_EWaveEffect.GetPoint( j, i ).Base() );
				meshBuilder.Color4ub( 255, 255, 255, 128 );
				meshBuilder.AdvanceVertex();

				meshBuilder.Position3fv( m_EWaveEffect.GetPoint( j, i - 1 ).Base() );
				meshBuilder.Color4ub( 255, 255, 255, 128 );
				meshBuilder.AdvanceVertex();
			}

			if (j > 0)
			{
				meshBuilder.Position3fv( m_EWaveEffect.GetPoint( j, i ).Base() );
				meshBuilder.Color4ub( 255, 255, 255, 128 );
				meshBuilder.AdvanceVertex();

				meshBuilder.Position3fv( m_EWaveEffect.GetPoint( j - 1, i ).Base() );
				meshBuilder.Color4ub( 255, 255, 255, 128 );
				meshBuilder.AdvanceVertex();
			}
		}
	}

	meshBuilder.End();
	pMesh->Draw();
}
Exemplo n.º 8
0
//-----------------------------------------------------------------------------
// Draws the grid under the MDL
//-----------------------------------------------------------------------------
void CMDLPanel::DrawGrid()
{
	matrix3x4_t transform;

	SetIdentityMatrix( transform );

	CMatRenderContextPtr pRenderContext( MaterialSystem() );
	pRenderContext->MatrixMode( MATERIAL_MODEL );
	pRenderContext->LoadMatrix( transform );

	pRenderContext->Bind( m_Wireframe );

	IMesh *pMesh = pRenderContext->GetDynamicMesh();

	int nGridDim = 10;
	CMeshBuilder meshBuilder;
	meshBuilder.Begin( pMesh, MATERIAL_LINES, 2 * nGridDim + 2 );

	float bounds = 100.0f;
	float delta = 2 * bounds / nGridDim;
	for ( int i = 0; i < nGridDim + 1; ++i )
	{
		float xy = -bounds + delta * i;

		meshBuilder.Position3f( xy, -bounds, 0 );
		meshBuilder.Color4ub( 255, 255, 255, 255 );
		meshBuilder.AdvanceVertex();
		meshBuilder.Position3f( xy, bounds, 0 );
		meshBuilder.Color4ub( 255, 255, 255, 255 );
		meshBuilder.AdvanceVertex();

		meshBuilder.Position3f( -bounds, xy, 0 );
		meshBuilder.Color4ub( 255, 255, 255, 255 );
		meshBuilder.AdvanceVertex();
		meshBuilder.Position3f( bounds, xy, 0 );
		meshBuilder.Color4ub( 255, 255, 255, 255 );
		meshBuilder.AdvanceVertex();
	}

	meshBuilder.End();
	pMesh->Draw();
}
Exemplo n.º 9
0
//-----------------------------------------------------------------------------
// Renders a material orthographically to screen...
//-----------------------------------------------------------------------------
static void RenderMaterial( const char *pMaterialName )
{
	// So it's not in the very top left
	float x = 100.0f, y = 100.0f;
	// float x = 0.0f, y = 0.0f;

	IMaterial *pMaterial = materials->FindMaterial( pMaterialName, TEXTURE_GROUP_OTHER, false );
	if ( !IsErrorMaterial( pMaterial ) )
	{
		CMatRenderContextPtr pRenderContext( materials );
		pRenderContext->Bind( pMaterial );
		IMesh* pMesh = pRenderContext->GetDynamicMesh( true );

		CMeshBuilder meshBuilder;
		meshBuilder.Begin( pMesh, MATERIAL_QUADS, 1 );

		meshBuilder.Position3f( x, y, 0.0f );
		meshBuilder.TexCoord2f( 0, 0.0f, 0.0f );
		meshBuilder.Color4ub( 255, 255, 255, 255 );
		meshBuilder.AdvanceVertex();

		meshBuilder.Position3f( x + pMaterial->GetMappingWidth(), y, 0.0f );
		meshBuilder.TexCoord2f( 0, 1.0f, 0.0f );
		meshBuilder.Color4ub( 255, 255, 255, 255 );
		meshBuilder.AdvanceVertex();

		meshBuilder.Position3f( x + pMaterial->GetMappingWidth(), y + pMaterial->GetMappingHeight(), 0.0f );
		meshBuilder.TexCoord2f( 0, 1.0f, 1.0f );
		meshBuilder.Color4ub( 255, 255, 255, 255 );
		meshBuilder.AdvanceVertex();

		meshBuilder.Position3f( x, y + pMaterial->GetMappingHeight(), 0.0f );
		meshBuilder.TexCoord2f( 0, 0.0f, 1.0f );
		meshBuilder.Color4ub( 255, 255, 255, 255 );
		meshBuilder.AdvanceVertex();

		meshBuilder.End();
		pMesh->Draw();
	}
}
Exemplo n.º 10
0
//-----------------------------------------------------------------------------
// paint it stretched to the window size
//-----------------------------------------------------------------------------
void CVMTPanel::DrawStretchedToPanel( CMeshBuilder &meshBuilder )
{
	// Draw a polygon the size of the panel
	meshBuilder.Color4ub( 255, 255, 255, 255 );
	meshBuilder.Position3f( 0, 0, 0 );
	meshBuilder.TexCoord2f( 0, 0, 0 );
	meshBuilder.AdvanceVertex();

	meshBuilder.Color4ub( 255, 255, 255, 255 );
	meshBuilder.Position3f( 0, m_iViewableHeight, 0 );
	meshBuilder.TexCoord2f( 0, 0, 1 );
	meshBuilder.AdvanceVertex();

	meshBuilder.Color4ub( 255, 255, 255, 255 );
	meshBuilder.Position3f( m_iViewableWidth, m_iViewableHeight, 0 );
	meshBuilder.TexCoord2f( 0, 1, 1 );
	meshBuilder.AdvanceVertex();

	meshBuilder.Color4ub( 255, 255, 255, 255 );
	meshBuilder.Position3f( m_iViewableWidth, 0, 0 );
	meshBuilder.TexCoord2f( 0, 0, 1 );
	meshBuilder.AdvanceVertex();
}
Exemplo n.º 11
0
//-----------------------------------------------------------------------------
// Purpose:
// Input  : frametime -
//-----------------------------------------------------------------------------
void CFXLine::Draw( double frametime )
{
    // Update the effect
    Update( frametime );

    Vector lineDir, viewDir;

    //Get the proper orientation for the line
    VectorSubtract( m_FXData.m_vecStart, m_FXData.m_vecEnd, lineDir );
    VectorSubtract( m_FXData.m_vecEnd, CurrentViewOrigin(), viewDir );

    Vector cross = lineDir.Cross( viewDir );

    VectorNormalize( cross );

    CMatRenderContextPtr pRenderContext( materials );

    //Bind the material
    IMesh* pMesh = pRenderContext->GetDynamicMesh( true, NULL, NULL, m_FXData.m_pMaterial );

    CMeshBuilder meshBuilder;

    Vector tmp;
    meshBuilder.Begin( pMesh, MATERIAL_QUADS, 1 );

    float scaleTimePerc = ( m_FXData.m_flLifeTime / m_FXData.m_flDieTime );
    float scale = m_FXData.m_flStartScale + ( ( m_FXData.m_flEndScale - m_FXData.m_flStartScale ) * scaleTimePerc );

    color32 color = {255,255,255,255};

    float alpha = m_FXData.m_flStartAlpha + ( ( m_FXData.m_flEndAlpha - m_FXData.m_flStartAlpha ) * scaleTimePerc );
    alpha = clamp( alpha, 0.0f, 1.0f );

    color.a *= alpha;

    // Start
    VectorMA( m_FXData.m_vecStart, -scale, cross, tmp );
    meshBuilder.Position3fv( tmp.Base() );
    meshBuilder.TexCoord2f( 0, 1.0f, 1.0f );
    meshBuilder.Color4ub( color.r, color.g, color.b, color.a );
    meshBuilder.Normal3fv( cross.Base() );
    meshBuilder.AdvanceVertex();

    VectorMA( m_FXData.m_vecStart, scale, cross, tmp );
    meshBuilder.Position3fv( tmp.Base() );
    meshBuilder.TexCoord2f( 0, 0.0f, 1.0f );
    meshBuilder.Color4ub( color.r, color.g, color.b, color.a );
    meshBuilder.Normal3fv( cross.Base() );
    meshBuilder.AdvanceVertex();

    // End
    VectorMA( m_FXData.m_vecEnd, scale, cross, tmp );
    meshBuilder.Position3fv( tmp.Base() );
    meshBuilder.TexCoord2f( 0, 0.0f, 0.0f );
    meshBuilder.Color4ub( color.r, color.g, color.b, color.a );
    meshBuilder.Normal3fv( cross.Base() );
    meshBuilder.AdvanceVertex();

    VectorMA( m_FXData.m_vecEnd, -scale, cross, tmp );
    meshBuilder.Position3fv( tmp.Base() );
    meshBuilder.TexCoord2f( 0, 1.0f, 0.0f );
    meshBuilder.Color4ub( color.r, color.g, color.b, color.a );
    meshBuilder.Normal3fv( cross.Base() );
    meshBuilder.AdvanceVertex();

    meshBuilder.End();
    pMesh->Draw();
}
Exemplo n.º 12
0
void FX_DrawLineFade( const Vector &start, const Vector &end, float scale, IMaterial *pMaterial, const color32 &color, float fadeDist )
{
    Vector			lineDir, viewDir;
    //Get the proper orientation for the line
    VectorSubtract( end, start, lineDir );
    VectorSubtract( end, CurrentViewOrigin(), viewDir );

    float lineLength = lineDir.Length();
    float t0 = 0.25f;
    float t1 = 0.75f;
    if ( lineLength > 0 )
    {
        t0 = fadeDist / lineLength;
        t0 = clamp( t0, 0.0f, 0.25f );
        t1 = 1.0f - t0;
    }

    Vector cross = lineDir.Cross( viewDir );

    VectorNormalize( cross );

    CMatRenderContextPtr pRenderContext( materials );

    //Bind the material
    IMesh* pMesh = pRenderContext->GetDynamicMesh( true, NULL, NULL, pMaterial );
    CMeshBuilder meshBuilder;

    Vector			tmp;
    meshBuilder.Begin( pMesh, MATERIAL_TRIANGLES, 8, 24 );

    //		2			5
    // 0	1			4	 7
    //		3			6

    // 0,2,1 - 0,1,3 - 7,4,5 - 7,6,4 - 1,4,6, 1,6,3 - 1,5,4 - 1,2,5

    // v0
    meshBuilder.Position3fv( start.Base() );
    meshBuilder.TexCoord2f( 0, 0.5f, 0.0f );
    meshBuilder.Color4ub( 0, 0, 0, 0 );
    meshBuilder.Normal3fv( cross.Base() );
    meshBuilder.AdvanceVertex();
    // v1
    Vector v1 = start + t0 * lineDir;
    meshBuilder.Position3fv( v1.Base() );
    meshBuilder.TexCoord2f( 0, 0.5f, t0 );
    meshBuilder.Color4ub( color.r, color.g, color.b, color.a );
    meshBuilder.Normal3fv( cross.Base() );
    meshBuilder.AdvanceVertex();
    // v2
    tmp = v1 - scale*cross;
    meshBuilder.Position3fv( tmp.Base() );
    meshBuilder.TexCoord2f( 0, 1.0f, t0 );
    meshBuilder.Color4ub( color.r, color.g, color.b, color.a );
    meshBuilder.Normal3fv( cross.Base() );
    meshBuilder.AdvanceVertex();
    // v3
    tmp = v1 + scale*cross;
    meshBuilder.Position3fv( tmp.Base() );
    meshBuilder.TexCoord2f( 0, 0.0f, t0 );
    meshBuilder.Color4ub( color.r, color.g, color.b, color.a );
    meshBuilder.Normal3fv( cross.Base() );
    meshBuilder.AdvanceVertex();
    // v4
    Vector v4 = start + t1 * lineDir;
    meshBuilder.Position3fv( v4.Base() );
    meshBuilder.TexCoord2f( 0, 0.5f, t1 );
    meshBuilder.Color4ub( color.r, color.g, color.b, color.a );
    meshBuilder.Normal3fv( cross.Base() );
    meshBuilder.AdvanceVertex();
    // v5
    tmp = v4 - scale*cross;
    meshBuilder.Position3fv( tmp.Base() );
    meshBuilder.TexCoord2f( 0, 1.0f, t1 );
    meshBuilder.Color4ub( color.r, color.g, color.b, color.a );
    meshBuilder.Normal3fv( cross.Base() );
    meshBuilder.AdvanceVertex();
    // v6
    tmp = v4 + scale*cross;
    meshBuilder.Position3fv( tmp.Base() );
    meshBuilder.TexCoord2f( 0, 0.0f, t1 );
    meshBuilder.Color4ub( color.r, color.g, color.b, color.a );
    meshBuilder.Normal3fv( cross.Base() );
    meshBuilder.AdvanceVertex();
    // v7
    meshBuilder.Position3fv( end.Base() );
    meshBuilder.TexCoord2f( 0, 0.5f, 1.0f );
    meshBuilder.Color4ub( 0, 0, 0, 0 );
    meshBuilder.Normal3fv( cross.Base() );
    meshBuilder.AdvanceVertex();


    // triangles - 0,2,1 - 0,1,3 - 7,4,5 - 7,6,4 - 1,4,6, 1,6,3 - 1,5,4 - 1,2,5
    meshBuilder.FastIndex( 0 );
    meshBuilder.FastIndex( 2 );
    meshBuilder.FastIndex( 1 );
    meshBuilder.FastIndex( 0 );
    meshBuilder.FastIndex( 1 );
    meshBuilder.FastIndex( 3 );

    meshBuilder.FastIndex( 7 );
    meshBuilder.FastIndex( 4 );
    meshBuilder.FastIndex( 5 );
    meshBuilder.FastIndex( 7 );
    meshBuilder.FastIndex( 6 );
    meshBuilder.FastIndex( 4 );

    meshBuilder.FastIndex( 1 );
    meshBuilder.FastIndex( 4 );
    meshBuilder.FastIndex( 6 );
    meshBuilder.FastIndex( 1 );
    meshBuilder.FastIndex( 6 );
    meshBuilder.FastIndex( 3 );
    meshBuilder.FastIndex( 1 );
    meshBuilder.FastIndex( 5 );
    meshBuilder.FastIndex( 4 );
    meshBuilder.FastIndex( 1 );
    meshBuilder.FastIndex( 2 );
    meshBuilder.FastIndex( 5 );

    meshBuilder.End();
    pMesh->Draw();
}
Exemplo n.º 13
0
void C_Shield::DrawShieldPoints(Vector* pt, Vector* normal, float* opacity)
{
	SetCurrentDecal( -1 );

	if (mat_wireframe.GetInt() == 0)
		materials->Bind( m_pShield, (IClientRenderable*)this );
	else
		materials->Bind( m_pWireframe, (IClientRenderable*)this );
	IMesh* pMesh = materials->GetDynamicMesh( true, NULL, NULL );

	int numTriangles = (m_SubdivisionCount - 1) * (m_SubdivisionCount - 1) * 2;

	CMeshBuilder meshBuilder;
	meshBuilder.Begin( pMesh, MATERIAL_TRIANGLES, numTriangles );

	float du = 1.0f * m_InvSubdivisionCount;
	float dv = du;

	unsigned char color[3];
	color[0] = 255; 
	color[1] = 255; 
	color[2] = 255; 

	for ( int i = 0; i < m_SubdivisionCount - 1; ++i)
	{
		float v = i * dv;

		for (int j = 0; j < m_SubdivisionCount - 1; ++j)
		{
			int idx = i * m_SubdivisionCount + j;
			float u = j * du;

			meshBuilder.Position3fv( pt[idx].Base() );
			meshBuilder.Color4ub( color[0], color[1], color[2], opacity[idx] );
			meshBuilder.Normal3fv( normal[idx].Base() );
			meshBuilder.TexCoord2f( 0, u, v );
			meshBuilder.AdvanceVertex();

			meshBuilder.Position3fv( pt[idx + m_SubdivisionCount].Base() );
			meshBuilder.Color4ub( color[0], color[1], color[2], opacity[idx+m_SubdivisionCount] );
			meshBuilder.Normal3fv( normal[idx + m_SubdivisionCount].Base() );
			meshBuilder.TexCoord2f( 0, u, v + dv );
			meshBuilder.AdvanceVertex();

			meshBuilder.Position3fv( pt[idx + 1].Base() );
			meshBuilder.Color4ub( color[0], color[1], color[2], opacity[idx+1] );
			meshBuilder.Normal3fv( normal[idx+1].Base() );
			meshBuilder.TexCoord2f( 0, u + du, v );
			meshBuilder.AdvanceVertex();

			meshBuilder.Position3fv( pt[idx + 1].Base() );
			meshBuilder.Color4ub( color[0], color[1], color[2], opacity[idx+1] );
			meshBuilder.Normal3fv( normal[idx+1].Base() );
			meshBuilder.TexCoord2f( 0, u + du, v );
			meshBuilder.AdvanceVertex();

			meshBuilder.Position3fv( pt[idx + m_SubdivisionCount].Base() );
			meshBuilder.Color4ub( color[0], color[1], color[2], opacity[idx+m_SubdivisionCount] );
			meshBuilder.Normal3fv( normal[idx + m_SubdivisionCount].Base() );
			meshBuilder.TexCoord2f( 0, u, v + dv );
			meshBuilder.AdvanceVertex();

			meshBuilder.Position3fv( pt[idx + m_SubdivisionCount + 1].Base() );
			meshBuilder.Color4ub( color[0], color[1], color[2], opacity[idx+m_SubdivisionCount+1] );
			meshBuilder.Normal3fv( normal[idx + m_SubdivisionCount + 1].Base() );
			meshBuilder.TexCoord2f( 0, u + du, v + dv );
			meshBuilder.AdvanceVertex();
		}
	}

	meshBuilder.End();
	pMesh->Draw();
}
Exemplo n.º 14
0
//-----------------------------------------------------------------------------
// paint it actual size
//-----------------------------------------------------------------------------
void CVMTPanel::DrawActualSize( CMeshBuilder &meshBuilder )
{
	// Check the size of the material...
	int iMaterialWidth = m_pMaterial->GetMappingWidth();
	int iMaterialHeight = m_pMaterial->GetMappingHeight();

	Vector2D ul;
	Vector2D lr;
	Vector2D tul;
	Vector2D tlr;

	if (m_iViewableWidth >= iMaterialWidth)
	{
		// Center the material if we've got enough horizontal space
		ul.x = (m_iViewableWidth - iMaterialWidth) * 0.5f;
		lr.x = ul.x + iMaterialWidth;
		tul.x = 0.0f; tlr.x = 1.0f;
	}
	else
	{
		// Use the scrollbars here...
		int val = m_pHorizontalBar->GetValue();
		tul.x = (float)val / (float)iMaterialWidth;
		tlr.x = tul.x + (float)m_iViewableWidth / (float)iMaterialWidth;

		ul.x = 0;
		lr.x = m_iViewableWidth;
	}

	if (m_iViewableHeight >= iMaterialHeight)
	{
		// Center the material if we've got enough vertical space
		ul.y = (m_iViewableHeight - iMaterialHeight) * 0.5f;
		lr.y = ul.y + iMaterialHeight;
		tul.y = 0.0f; tlr.y = 1.0f;
	}
	else
	{
		// Use the scrollbars here...
		int val = m_pVerticalBar->GetValue();

		tul.y = (float)val / (float)iMaterialHeight;
		tlr.y = tul.y + (float)m_iViewableHeight / (float)iMaterialHeight;

		ul.y = 0;
		lr.y = m_iViewableHeight;
	}

	meshBuilder.Color4ub( 255, 255, 255, 255 );
	meshBuilder.Position3f( ul.x, ul.y, 0 );
	meshBuilder.TexCoord2f( 0, tul.x, tul.y );
	meshBuilder.AdvanceVertex();

	meshBuilder.Color4ub( 255, 255, 255, 255 );
	meshBuilder.Position3f( lr.x, ul.y, 0 );
	meshBuilder.TexCoord2f( 0, tlr.x, tul.y );
	meshBuilder.AdvanceVertex();

	meshBuilder.Color4ub( 255, 255, 255, 255 );
	meshBuilder.Position3f( lr.x, lr.y, 0 );
	meshBuilder.TexCoord2f( 0, tlr.x, tlr.y );
	meshBuilder.AdvanceVertex();

	meshBuilder.Color4ub( 255, 255, 255, 255 );
	meshBuilder.Position3f( ul.x, lr.y, 0 );
	meshBuilder.TexCoord2f( 0, tul.x, tlr.y );
	meshBuilder.AdvanceVertex();
}
Exemplo n.º 15
0
void AddCoolLine( const Vector &v1, const Vector &v2, unsigned long iExtraFadeOffset, bool bNegateMovementDir )
{
	float flLineSectionLength = 3;		// How many inches each line travels. Each line is a solid color and alpha.
	int nLineSectionsToFade = 2;	// How many lines to fade from translucent to opaque.
	int baseColor[3] = { 216, 183, 67 }; // gold
	float flTimeBetweenUpdates = 0.2f;
	unsigned long iLineFadeOffset = iExtraFadeOffset + (int)(gpGlobals->curtime / flTimeBetweenUpdates);
	if ( bNegateMovementDir )
		iLineFadeOffset = 0xFFFFFFFF - iLineFadeOffset;

	
	Vector vDelta = v2 - v1;
	float flLineLen = vDelta.Length();
	vDelta /= flLineLen;

	int nMaxLines = (int)(flLineLen / flLineSectionLength) + 1;


	static IMaterial *pWireframeMaterial = NULL;
	if ( !pWireframeMaterial )
		pWireframeMaterial = materials->FindMaterial( "debug/debugwireframevertexcolor", TEXTURE_GROUP_OTHER );

	static IMaterial *pBeamMaterial = NULL;
	if ( !pBeamMaterial )
		pBeamMaterial = materials->FindMaterial( "effects/laser1", TEXTURE_GROUP_OTHER );

	CMatRenderContextPtr pRenderContext( materials );


	// Draw the solid underlying lines.
	IMesh* pMesh = pRenderContext->GetDynamicMesh( true, NULL, NULL, pWireframeMaterial );
	CMeshBuilder meshBuilder;
	meshBuilder.Begin( pMesh, MATERIAL_LINES, 1 );

	meshBuilder.Position3fv( v1.Base() );
	meshBuilder.Color4ub( baseColor[0], baseColor[1], baseColor[2], 255 );
	meshBuilder.AdvanceVertex();
	
	meshBuilder.Position3fv( v2.Base() );
	meshBuilder.Color4ub( baseColor[0], baseColor[1], baseColor[2], 255 );
	meshBuilder.AdvanceVertex();

	meshBuilder.End( false, true );


	// Draw the additive beams.
	float flCurDist = 0;
	Vector vStartPos = v1;
	for ( int i=0; i < nMaxLines; i++ )
	{
		float flEndDist = MIN( flCurDist + flLineSectionLength, flLineLen );
		Vector vEndPos = v1 + vDelta * flEndDist;
		
		int alpha;
		int iFadeAmt = (iLineFadeOffset+i) % (nLineSectionsToFade * 2);
		if ( iFadeAmt < nLineSectionsToFade )
			alpha = (iFadeAmt * 255) / nLineSectionsToFade;
		else
			alpha = (255 * (nLineSectionsToFade - (iFadeAmt - nLineSectionsToFade))) / nLineSectionsToFade;

		float flAlpha = Bias( alpha / 255.0f, 0.6 );

		
		CBeamSegDraw beamDraw;
		beamDraw.Start( pRenderContext, 2, pBeamMaterial );
		BeamSeg_t beamSeg;
		beamSeg.SetColor( baseColor[0] * flAlpha / 255.0f, baseColor[1] * flAlpha / 255.0f, baseColor[2] * flAlpha / 255.0f, 1.0f );
		beamSeg.m_flTexCoord = 0;
		beamSeg.m_flWidth = 6;

		beamSeg.m_vPos = vStartPos;
		beamDraw.NextSeg( &beamSeg );

		beamSeg.m_vPos = vEndPos;
		beamDraw.NextSeg( &beamSeg );

		beamDraw.End();

		flCurDist = flEndDist;
		vStartPos = vEndPos;
	}
}
Exemplo n.º 16
0
void CFXDiscreetLine::Draw( double frametime )
{
	Vector			lineDir, viewDir, cross;

	Vector			vecEnd, vecStart;
	Vector tmp;

	// Update the effect
	Update( frametime );

	// Calculate our distance along our path
	float	sDistance = m_fVelocity * m_fStartTime;
	float	eDistance = sDistance - m_fLength;
	
	//Clip to start
	sDistance = MAX( 0.0f, sDistance );
	eDistance = MAX( 0.0f, eDistance );

	if ( ( sDistance == 0.0f ) && ( eDistance == 0.0f ) )
		return;

	// Clip it
	if ( m_fClipLength != 0.0f )
	{
		sDistance = MIN( sDistance, m_fClipLength );
		eDistance = MIN( eDistance, m_fClipLength );
	}

	// Get our delta to calculate the tc offset
	float	dDistance	= fabs( sDistance - eDistance );
	float	dTotal		= ( m_fLength != 0.0f ) ? m_fLength : 0.01f;
	float	fOffset		= ( dDistance / dTotal );

	// Find our points along our path
	VectorMA( m_vecOrigin, sDistance, m_vecDirection, vecEnd );
	VectorMA( m_vecOrigin, eDistance, m_vecDirection, vecStart );

	//Setup our info for drawing the line
	VectorSubtract( vecEnd, vecStart, lineDir );
	VectorSubtract( vecEnd, CurrentViewOrigin(), viewDir );
	
	cross = lineDir.Cross( viewDir );
	VectorNormalize( cross );

	CMeshBuilder meshBuilder;
	IMesh *pMesh;

	CMatRenderContextPtr pRenderContext( materials );
		
	// Better, more visible tracers
	if ( tracer_extra.GetBool() )
	{
		float flScreenWidth = ScreenWidth();
		float flHalfScreenWidth = flScreenWidth * 0.5f;
		
		float zCoord = CurrentViewForward().Dot( vecStart - CurrentViewOrigin() );
		float flScreenSpaceWidth = m_fScale * flHalfScreenWidth / zCoord;

		float flAlpha;
		float flScale;

		if ( flScreenSpaceWidth < 0.5f )
		{
			flAlpha = RemapVal( flScreenSpaceWidth, 0.25f, 2.0f, 0.3f, 1.0f );
			flAlpha = clamp( flAlpha, 0.25f, 1.0f );
			flScale = 0.5f * zCoord / flHalfScreenWidth;
		}
		else
		{
			flAlpha = 1.0f;
			flScale = m_fScale;
		}

		//Bind the material
		pMesh = pRenderContext->GetDynamicMesh( true, NULL, NULL, m_pMaterial );

		meshBuilder.Begin( pMesh, MATERIAL_QUADS, 2 );

		float color = (int) 255.0f * flAlpha;

		//FIXME: for now no coloration
		VectorMA( vecStart, -flScale, cross, tmp );
		meshBuilder.Position3fv( tmp.Base() );
		meshBuilder.TexCoord2f( 0, 1.0f, 0.0f );
		meshBuilder.Color4ub( color, color, color, 255 );
		meshBuilder.Normal3fv( cross.Base() );
		meshBuilder.AdvanceVertex();

		VectorMA( vecStart,  flScale, cross, tmp );
		meshBuilder.Position3fv( tmp.Base() );
		meshBuilder.TexCoord2f( 0, 0.0f, 0.0f );
		meshBuilder.Color4ub( color, color, color, 255 );
		meshBuilder.Normal3fv( cross.Base() );
		meshBuilder.AdvanceVertex();

		VectorMA( vecEnd, flScale, cross, tmp );
		meshBuilder.Position3fv( tmp.Base() );
		meshBuilder.TexCoord2f( 0, 0.0f, fOffset );
		meshBuilder.Color4ub( color, color, color, 255 );
		meshBuilder.Normal3fv( cross.Base() );
		meshBuilder.AdvanceVertex();

		VectorMA( vecEnd, -flScale, cross, tmp );
		meshBuilder.Position3fv( tmp.Base() );
		meshBuilder.TexCoord2f( 0, 1.0f, fOffset );
		meshBuilder.Color4ub( color, color, color, 255 );
		meshBuilder.Normal3fv( cross.Base() );
		meshBuilder.AdvanceVertex();

		flScale = flScale * 2.0f;
		color = (int) 64.0f * flAlpha;

		// Soft outline
		VectorMA( vecStart, -flScale, cross, tmp );
		meshBuilder.Position3fv( tmp.Base() );
		meshBuilder.TexCoord2f( 0, 1.0f, 0.0f );
		meshBuilder.Color4ub( color, color, color, 255 );
		meshBuilder.Normal3fv( cross.Base() );
		meshBuilder.AdvanceVertex();

		VectorMA( vecStart,  flScale, cross, tmp );
		meshBuilder.Position3fv( tmp.Base() );
		meshBuilder.TexCoord2f( 0, 0.0f, 0.0f );
		meshBuilder.Color4ub( color, color, color, 255 );
		meshBuilder.Normal3fv( cross.Base() );
		meshBuilder.AdvanceVertex();

		VectorMA( vecEnd, flScale, cross, tmp );
		meshBuilder.Position3fv( tmp.Base() );
		meshBuilder.TexCoord2f( 0, 0.0f, fOffset );
		meshBuilder.Color4ub( color, color, color, 255 );
		meshBuilder.Normal3fv( cross.Base() );
		meshBuilder.AdvanceVertex();

		VectorMA( vecEnd, -flScale, cross, tmp );
		meshBuilder.Position3fv( tmp.Base() );
		meshBuilder.TexCoord2f( 0, 1.0f, fOffset );
		meshBuilder.Color4ub( color, color, color, 255 );
		meshBuilder.Normal3fv( cross.Base() );
		meshBuilder.AdvanceVertex();
	}
	else
	{
		//Bind the material
		pMesh = pRenderContext->GetDynamicMesh( true, NULL, NULL, m_pMaterial );

		meshBuilder.Begin( pMesh, MATERIAL_QUADS, 1 );

		//FIXME: for now no coloration
		VectorMA( vecStart, -m_fScale, cross, tmp );
		meshBuilder.Position3fv( tmp.Base() );
		meshBuilder.TexCoord2f( 0, 1.0f, 0.0f );
		meshBuilder.Color4ub( 255, 255, 255, 255 );
		meshBuilder.Normal3fv( cross.Base() );
		meshBuilder.AdvanceVertex();

		VectorMA( vecStart,  m_fScale, cross, tmp );
		meshBuilder.Position3fv( tmp.Base() );
		meshBuilder.TexCoord2f( 0, 0.0f, 0.0f );
		meshBuilder.Color4ub( 255, 255, 255, 255 );
		meshBuilder.Normal3fv( cross.Base() );
		meshBuilder.AdvanceVertex();

		VectorMA( vecEnd, m_fScale, cross, tmp );
		meshBuilder.Position3fv( tmp.Base() );
		meshBuilder.TexCoord2f( 0, 0.0f, fOffset );
		meshBuilder.Color4ub( 255, 255, 255, 255 );
		meshBuilder.Normal3fv( cross.Base() );
		meshBuilder.AdvanceVertex();

		VectorMA( vecEnd, -m_fScale, cross, tmp );
		meshBuilder.Position3fv( tmp.Base() );
		meshBuilder.TexCoord2f( 0, 1.0f, fOffset );
		meshBuilder.Color4ub( 255, 255, 255, 255 );
		meshBuilder.Normal3fv( cross.Base() );
		meshBuilder.AdvanceVertex();
	}

	meshBuilder.End();
	pMesh->Draw();
}
Exemplo n.º 17
0
// ----------------------------------------------------------------------------- //
// Adds shadow rendering data to a particular mesh builder
// ----------------------------------------------------------------------------- //
int DispInfo_AddShadowsToMeshBuilder( CMeshBuilder& meshBuilder,
                                      DispShadowHandle_t h, int baseIndex )
{
#ifndef SWDS
    if ( !r_DrawDisp.GetBool() )
    {
        return baseIndex;
    }

    CDispShadowDecal* pShadowDecal = &s_DispShadowDecals[h];
    int shadow = pShadowDecal->m_Shadow;
    ShadowInfo_t const& info = g_pShadowMgr->GetInfo( shadow );

    // It had better be computed by now...
    Assert( pShadowDecal->m_Flags & CDispDecalBase::FRAGMENTS_COMPUTED );

#ifdef _DEBUG
    int triCount = 0;
    int vertCount = 0;
#endif

    DispShadowFragmentHandle_t f = pShadowDecal->m_FirstFragment;
    while ( f != DISP_SHADOW_FRAGMENT_HANDLE_INVALID )
    {
        CDispShadowFragment& fragment = s_DispShadowFragments[f];

        // Add in the vertices + indices, use two loops to minimize tests...
        int i;
        for ( i = 0; i < fragment.m_nVerts - 2; ++i )
        {
            meshBuilder.Position3fv( fragment.m_Verts[i].Base() );

            // Transform + offset the texture coords
            Vector2D texCoord;
            Vector2DMultiply( fragment.m_TCoords[i].AsVector2D(), info.m_TexSize, texCoord );
            texCoord += info.m_TexOrigin;
            meshBuilder.TexCoord2fv( 0, texCoord.Base() );

            unsigned char c = g_pShadowMgr->ComputeDarkness( fragment.m_TCoords[i].z, info );
            meshBuilder.Color4ub( c, c, c, c );

            meshBuilder.AdvanceVertex();

            meshBuilder.Index( baseIndex );
            meshBuilder.AdvanceIndex();
            meshBuilder.Index( i + baseIndex + 1 );
            meshBuilder.AdvanceIndex();
            meshBuilder.Index( i + baseIndex + 2 );
            meshBuilder.AdvanceIndex();

#ifdef _DEBUG
            ++triCount;
            ++vertCount;
#endif
        }

        for ( ; i < fragment.m_nVerts; ++i )
        {
            meshBuilder.Position3fv( fragment.m_Verts[i].Base() );

            // Transform + offset the texture coords
            Vector2D texCoord;
            Vector2DMultiply( fragment.m_TCoords[i].AsVector2D(), info.m_TexSize, texCoord );
            texCoord += info.m_TexOrigin;
            meshBuilder.TexCoord2fv( 0, texCoord.Base() );

            unsigned char c = g_pShadowMgr->ComputeDarkness( fragment.m_TCoords[i].z, info );
            meshBuilder.Color4ub( c, c, c, c );

            meshBuilder.AdvanceVertex();

#ifdef _DEBUG
            ++vertCount;
#endif
        }

        baseIndex += fragment.m_nVerts;

        f = s_DispShadowFragments.Next(f);
    }

#ifdef _DEBUG
    Assert( triCount == pShadowDecal->m_nTris );
    Assert( vertCount == pShadowDecal->m_nVerts );
#endif

    return baseIndex;
#else
    return 0;
#endif
}
//-----------------------------------------------------------------------------
// Draw a sphere
//-----------------------------------------------------------------------------
void CVMTPreviewPanel::RenderSphere( const Vector &vCenter, float flRadius, int nTheta, int nPhi )
{
	int nVertices =  nTheta * nPhi;
	int nIndices = 2 * ( nTheta + 1 ) * ( nPhi - 1 );
	
	CMatRenderContextPtr pRenderContext( MaterialSystem() );

	IMesh* pMesh = pRenderContext->GetDynamicMesh();

	CMeshBuilder meshBuilder;
	meshBuilder.Begin( pMesh, MATERIAL_TRIANGLE_STRIP, nVertices, nIndices );

	bool bIsUsingLightmap = m_Material->GetPropertyFlag( MATERIAL_PROPERTY_NEEDS_LIGHTMAP );
	bool bIsUsingBumpedLightmap = m_Material->GetPropertyFlag( MATERIAL_PROPERTY_NEEDS_BUMPED_LIGHTMAPS );

	int nLightmapWidth = m_pLightmapTexture->GetActualWidth();
	float flHalfLuxel = 0.5f / nLightmapWidth;

	//
	// Build the index buffer.
	//
	int i, j;
	for ( i = 0; i < nPhi; ++i )
	{
		for ( j = 0; j < nTheta; ++j )
		{
			float u = j / ( float )(nTheta - 1);
			float v = i / ( float )(nPhi - 1);
			float theta = ( j != nTheta-1 ) ? 2.0f * M_PI * u : 0.0f;
			float phi = M_PI * v;

			Vector vecPos;
			vecPos.x = flRadius * sin(phi) * cos(theta);
			vecPos.y = flRadius * sin(phi) * sin(theta); 
			vecPos.z = flRadius * cos(phi);
			    
			Vector vecNormal = vecPos;
			VectorNormalize( vecNormal );

			Vector4D vecTangentS;
			Vector vecTangentT;
			vecTangentS.Init( vecPos.z, -vecPos.x, 0.0f, 1.0f );
			if ( VectorNormalize( vecTangentS.AsVector3D() ) == 0.0f )
			{
				vecTangentS.Init( 1.0f, 0.0f, 0.0f, 1.0f );
			}

			CrossProduct( vecNormal, vecTangentS.AsVector3D(), vecTangentT );

			unsigned char red = (int)( u * 255.0f );
			unsigned char green = (int)( v * 255.0f );
			unsigned char blue = (int)( v * 255.0f );
			unsigned char alpha = (int)( v * 255.0f );

			vecPos += vCenter;

			float u1, u2, v1, v2;
			u1 = u2 = u;
			v1 = v2 = v;

			if ( bIsUsingLightmap )
			{
				u1 = RemapVal( u1, 0.0f, 1.0f, flHalfLuxel, 0.25 - flHalfLuxel );

				if ( bIsUsingBumpedLightmap )
				{
					u2 = 0.25f;
					v2 = 0.0f;
				}
			}
					  
			meshBuilder.Position3fv( vecPos.Base() );
			meshBuilder.Normal3fv( vecNormal.Base() );
			meshBuilder.Color4ub( red, green, blue, alpha );
			meshBuilder.TexCoord2f( 0, 2.0f * u, v );
			meshBuilder.TexCoord2f( 1, u1, v1 );
			meshBuilder.TexCoord2f( 2, u2, v2 );
			meshBuilder.TangentS3fv( vecTangentS.Base() );
			meshBuilder.TangentT3fv( vecTangentT.Base() );
			meshBuilder.BoneWeight( 0, 1.0f );
			meshBuilder.BoneMatrix( 0, 0 );
			meshBuilder.UserData( vecTangentS.Base() );
			meshBuilder.AdvanceVertex();
		}
	}

	//
	// Emit the triangle strips.
	//
	int idx = 0;
	for ( i = 0; i < nPhi - 1; ++i )
	{
		for ( j = 0; j < nTheta; ++j )
		{
			idx = nTheta * i + j;

			meshBuilder.FastIndex( idx );
			meshBuilder.FastIndex( idx + nTheta );
		}

		//
		// Emit a degenerate triangle to skip to the next row without
		// a connecting triangle.
		//
		if ( i < nPhi - 2 )
		{
			meshBuilder.FastIndex( idx + 1 );
			meshBuilder.FastIndex( idx + 1 + nTheta );
		}
	}

	meshBuilder.End();
	pMesh->Draw();
}
//-----------------------------------------------------------------------------
// Paints a regular texture
//-----------------------------------------------------------------------------
void CVMTPreviewPanel::DrawRectangle( void )
{		     
	// Get the aspect ratio of the material
	int tw = m_Material->GetMappingWidth();
 	int th = m_Material->GetMappingHeight();

	if ( tw <= 0 || th <= 0 )
		return;

	int w, h;
	GetSize( w, h );
	if ( w == 0 || h == 0 )
		return;

 	SetupOrthoMatrix( w, h );
	SetupLightingState();

	CMatRenderContextPtr pRenderContext( MaterialSystem() );

	pRenderContext->MatrixMode( MATERIAL_VIEW );
	pRenderContext->LoadIdentity();

	pRenderContext->MatrixMode( MATERIAL_MODEL );
	pRenderContext->LoadIdentity();

	IMesh* pMesh = pRenderContext->GetDynamicMesh();

	CMeshBuilder meshBuilder;
	meshBuilder.Begin( pMesh, MATERIAL_TRIANGLE_STRIP, 4, 4 );

	bool bIsUsingLightmap = m_Material->GetPropertyFlag( MATERIAL_PROPERTY_NEEDS_LIGHTMAP );
	bool bIsUsingBumpedLightmap = m_Material->GetPropertyFlag( MATERIAL_PROPERTY_NEEDS_BUMPED_LIGHTMAPS );

	int nLightmapWidth = m_pLightmapTexture->GetActualWidth();
	float flHalfLuxel = 0.5f / nLightmapWidth;
	Vector2D halfTexel( 0.5f / tw, 0.5f / th );

	Vector vecNormal( 0.0f, 0.0f, 1.0f );
	Vector4D vecTangentS( 1.0f, 0.0f, 0.0f, 1.0f );
	Vector vecTangentT;
	CrossProduct( vecNormal, vecTangentS.AsVector3D(), vecTangentT );

	float screenaspect = (float)tw / (float)th;
	float aspect = (float)w / (float)h;

	float ratio = screenaspect / aspect;
	   
	// Screen is wider, need bars at top and bottom
	int x2, y2;
	int x, y;
	x = y = 0;
	int nXBorder = w > 15 ? 5 : w / 3;
	int nYBorder = h > 15 ? 5 : h / 3;
	w -= 2 * nXBorder;
	h -= 2 * nYBorder;
	if ( ratio > 1.0f )
	{
		int usetall = (float)w / screenaspect;
		y = ( h - usetall ) / 2;
		h = usetall;
	}
	// Screen is narrower, need bars at left/right
	else
	{
		int usewide = (float)h * screenaspect;
		x = ( w - usewide ) / 2;
		w = usewide;
	}
	x += nXBorder;
	y += nYBorder;

	x2 = x+w; y2 = y+h;

	float u = halfTexel.x;
	float v = halfTexel.y;

	float u1_l, u1_r, v1_t, v1_b;
	float u2_l, u2_r, v2_t, v2_b;

	u1_l = u2_l = u;
	u1_r = u2_r = 1.0f - u;
	v1_t = v2_t = v;
	v1_b = v2_b = 1.0f - v;

	if ( bIsUsingLightmap )
	{
		u1_l = v1_t = flHalfLuxel;
		u1_r = v1_b = 0.25 - flHalfLuxel;
		if ( bIsUsingBumpedLightmap )
		{
			u2_l = u2_r = 0.25f;
			v2_t = v2_b = 0.0f;
		}
	}
	  
	meshBuilder.Position3f( x, y2, 0.0f );
	meshBuilder.Normal3fv( vecNormal.Base() );
	meshBuilder.Color4ub( 255, 0, 0, 255 );
	meshBuilder.TexCoord2f( 0, u, v );
	meshBuilder.TexCoord2f( 1, u1_l, v1_t );
	meshBuilder.TexCoord2f( 2, u2_l, v2_t );
	meshBuilder.TangentS3fv( vecTangentS.Base() );
	meshBuilder.TangentT3fv( vecTangentT.Base() );
	meshBuilder.BoneWeight( 0, 1.0f );
	meshBuilder.BoneMatrix( 0, 0 );
	meshBuilder.UserData( vecTangentS.Base() );
	meshBuilder.AdvanceVertex();
				    
	meshBuilder.Position3f( x, y, 0.0f );
	meshBuilder.Normal3fv( vecNormal.Base() );
	meshBuilder.Color4ub( 255, 255, 255, 64 );
	meshBuilder.TexCoord2f( 0, u, 1.0f - v );
	meshBuilder.TexCoord2f( 1, u1_l, v1_b );
	meshBuilder.TexCoord2f( 2, u2_l, v2_b );
	meshBuilder.TangentS3fv( vecTangentS.Base() );
	meshBuilder.TangentT3fv( vecTangentT.Base() );
	meshBuilder.BoneWeight( 0, 1.0f );
	meshBuilder.BoneMatrix( 0, 0 );
	meshBuilder.UserData( vecTangentS.Base() );
	meshBuilder.AdvanceVertex();
			    
	meshBuilder.Position3f( x2, y2, 0.0f );
	meshBuilder.Normal3fv( vecNormal.Base() );
	meshBuilder.Color4ub( 0, 0, 255, 255 );
	meshBuilder.TexCoord2f( 0, 1.0f - u, v );
	meshBuilder.TexCoord2f( 1, u1_r, v1_t );
	meshBuilder.TexCoord2f( 2, u2_r, v2_t );
	meshBuilder.TangentS3fv( vecTangentS.Base() );
	meshBuilder.TangentT3fv( vecTangentT.Base() );
	meshBuilder.BoneWeight( 0, 1.0f );
	meshBuilder.BoneMatrix( 0, 0 );
	meshBuilder.UserData( vecTangentS.Base() );
	meshBuilder.AdvanceVertex();

	meshBuilder.Position3f( x2, y, 0.0f );
	meshBuilder.Normal3fv( vecNormal.Base() );
	meshBuilder.Color4ub( 0, 255, 0, 64 );
	meshBuilder.TexCoord2f( 0, 1.0f - u, 1.0f - v );
	meshBuilder.TexCoord2f( 1, u1_r, v1_b );
	meshBuilder.TexCoord2f( 2, u2_r, v2_b );
	meshBuilder.TangentS3fv( vecTangentS.Base() );
	meshBuilder.TangentT3fv( vecTangentT.Base() );
	meshBuilder.BoneWeight( 0, 1.0f );
	meshBuilder.BoneMatrix( 0, 0 );
	meshBuilder.UserData( vecTangentS.Base() );
	meshBuilder.AdvanceVertex();
						  
	meshBuilder.FastIndex( 0 );
	meshBuilder.FastIndex( 1 );
	meshBuilder.FastIndex( 2 );
	meshBuilder.FastIndex( 3 );

	meshBuilder.End();
	pMesh->Draw();
}
Exemplo n.º 20
0
void CMDLPanel::DrawCollisionModel()
{
	vcollide_t *pCollide = MDLCache()->GetVCollide( m_hMDL->GetMDL() );

	if ( !pCollide || pCollide->solidCount <= 0 )
		return;
	
	static color32 color = {255,0,0,0};

	IVPhysicsKeyParser *pParser = g_pPhysicsCollision->VPhysicsKeyParserCreate( pCollide->pKeyValues );
	CStudioHdr studioHdr( g_pMDLCache->GetStudioHdr( m_hMDL->GetMDL() ), g_pMDLCache );

	matrix3x4_t pBoneToWorld[MAXSTUDIOBONES];
	matrix3x4_t shapeToWorld;
	m_pDag->GetTransform()->GetTransform( shapeToWorld );
	m_hMDL->SetUpBones( shapeToWorld, MAXSTUDIOBONES, pBoneToWorld );

	// PERFORMANCE: Just parse the script each frame.  It's fast enough for tools.  If you need
	// this to go faster then cache off the bone index mapping in an array like HLMV does
	while ( !pParser->Finished() )
	{
		const char *pBlock = pParser->GetCurrentBlockName();
		if ( !stricmp( pBlock, "solid" ) )
		{
			solid_t solid;

			pParser->ParseSolid( &solid, NULL );
			int boneIndex = Studio_BoneIndexByName( &studioHdr, solid.name );
			Vector *outVerts;
			int vertCount = g_pPhysicsCollision->CreateDebugMesh( pCollide->solids[solid.index], &outVerts );

			if ( vertCount )
			{
				CMatRenderContextPtr pRenderContext( g_pMaterialSystem );
				pRenderContext->CullMode( MATERIAL_CULLMODE_CCW );
				// NOTE: assumes these have been set up already by the model render code
				// So this is a little bit of a back door to a cache of the bones
				// this code wouldn't work unless you draw the model this frame before calling
				// this routine.  CMDLPanel always does this, but it's worth noting.
				// A better solution would be to move the ragdoll visulization into the CDmeMdl
				// and either draw it there or make it queryable and query/draw here.
				matrix3x4_t xform;
				SetIdentityMatrix( xform );
				if ( boneIndex >= 0 )
				{
					MatrixCopy( pBoneToWorld[ boneIndex ], xform );
				}
				IMesh *pMesh = pRenderContext->GetDynamicMesh( true, NULL, NULL, m_Wireframe );

				CMeshBuilder meshBuilder;
				meshBuilder.Begin( pMesh, MATERIAL_TRIANGLES, vertCount/3 );

				for ( int j = 0; j < vertCount; j++ )
				{
					Vector out;
					VectorTransform( outVerts[j].Base(), xform, out.Base() );
					meshBuilder.Position3fv( out.Base() );
					meshBuilder.Color4ub( color.r, color.g, color.b, color.a );
					meshBuilder.TexCoord2f( 0, 0, 0 );
					meshBuilder.AdvanceVertex();
				}
				meshBuilder.End();
				pMesh->Draw();
			}

			g_pPhysicsCollision->DestroyDebugMesh( vertCount, outVerts );
		}
		else
		{
			pParser->SkipBlock();
		}
	}
	g_pPhysicsCollision->VPhysicsKeyParserDestroy( pParser );
}
Exemplo n.º 21
0
void CFXStaticLine::Draw( double frametime )
{
	Vector lineDir, viewDir, cross;
	Vector tmp;

	// Update the effect
	Update( frametime );

	// Get the proper orientation for the line
	VectorSubtract( m_vecEnd, m_vecStart, lineDir );
	VectorSubtract( m_vecEnd, CurrentViewOrigin(), viewDir );
	
	cross = lineDir.Cross( viewDir );

	VectorNormalize( cross );

	CMatRenderContextPtr pRenderContext( materials );

	//Bind the material
	IMesh* pMesh = pRenderContext->GetDynamicMesh( true, NULL, NULL, m_pMaterial );
	CMeshBuilder meshBuilder;

	meshBuilder.Begin( pMesh, MATERIAL_QUADS, 1 );

	bool flipVertical = (m_uiFlags & FXSTATICLINE_FLIP_VERTICAL) != 0;
	bool flipHorizontal = (m_uiFlags & FXSTATICLINE_FLIP_HORIZONTAL ) != 0;

	//Setup our points
	VectorMA( m_vecStart, -m_fScale, cross, tmp );
	meshBuilder.Position3fv( tmp.Base() );
	meshBuilder.Normal3fv( cross.Base() );
	if (flipHorizontal)
		meshBuilder.TexCoord2f( 0, 0.0f, 1.0f );
	else if (flipVertical)
		meshBuilder.TexCoord2f( 0, 0.0f, 0.0f );
	else 
		meshBuilder.TexCoord2f( 0, 1.0f, 1.0f );
	meshBuilder.Color4ub( 255, 255, 255, 255 );
	meshBuilder.AdvanceVertex();

	VectorMA( m_vecStart, m_fScale, cross, tmp );
	meshBuilder.Position3fv( tmp.Base() );
	meshBuilder.Normal3fv( cross.Base() );
	if (flipHorizontal)
		meshBuilder.TexCoord2f( 0, 1.0f, 1.0f );
	else if (flipVertical)
		meshBuilder.TexCoord2f( 0, 1.0f, 0.0f );
	else 
		meshBuilder.TexCoord2f( 0, 0.0f, 1.0f );
	meshBuilder.Color4ub( 255, 255, 255, 255 );
	meshBuilder.AdvanceVertex();

	VectorMA( m_vecEnd, m_fScale, cross, tmp );
	meshBuilder.Position3fv( tmp.Base() );
	meshBuilder.Normal3fv( cross.Base() );
	if (flipHorizontal)
		meshBuilder.TexCoord2f( 0, 1.0f, 0.0f );
	else if (flipVertical)
		meshBuilder.TexCoord2f( 0, 1.0f, 1.0f );
	else 
		meshBuilder.TexCoord2f( 0, 0.0f, 0.0f );
	meshBuilder.Color4ub( 255, 255, 255, 255 );
	meshBuilder.AdvanceVertex();

	VectorMA( m_vecEnd, -m_fScale, cross, tmp );
	meshBuilder.Position3fv( tmp.Base() );
	meshBuilder.Normal3fv( cross.Base() );
	if (flipHorizontal)
		meshBuilder.TexCoord2f( 0, 0.0f, 0.0f );
	else if (flipVertical)
		meshBuilder.TexCoord2f( 0, 0.0f, 1.0f );
	else 
		meshBuilder.TexCoord2f( 0, 1.0f, 0.0f );
	meshBuilder.Color4ub( 255, 255, 255, 255 );
	meshBuilder.AdvanceVertex();

	meshBuilder.End();
	pMesh->Draw();
}
//-----------------------------------------------------------------------------
// Purpose: 
//-----------------------------------------------------------------------------
void CControlPointIconCapArrow::Paint( void )
{
	if ( !m_pArrowMaterial || !m_pAttachedToIcon )
		return;

	int x = 0;
	int y = 0;
	ipanel()->GetAbsPos(GetVPanel(), x,y );
	int iWidth = GetWide();
	int iHeight = GetTall();

	// Position the arrow based on the cap percentage
	float flXa = 0;
	float flXb = 1.0;
	float flYa = 0;
	float flYb = 1.0;

	int iCappingTeam = ObjectiveResource()->GetCappingTeam( m_pAttachedToIcon->GetCapIndex() );
	float flCapPercentage = ObjectiveResource()->GetCPCapPercentage( m_pAttachedToIcon->GetCapIndex() );

	// The image needs to be remapped to the width of the underlying box,
	// because we want the arrow head to move off the box at the exact time the cap ends.
	float flArrowHeadPixelWidth = 15.0;
	float flArrowBodyPixelWidth = 54.0;
	float flBoxSize = 33.0;

	// HACK: The arrow has an arrowhead portion that looks like this: >
	// We want to start with the arrow entering the image, but we want to keep
	// going until the arrow is fully off the edge. So we include extra width for it.
	float flImageSize = (flArrowHeadPixelWidth+flArrowBodyPixelWidth);
	float flMovementInTextureSpace = ( (flBoxSize+flArrowHeadPixelWidth) / flImageSize );
	float flArrowSizeInTextureSpace = ( flArrowHeadPixelWidth / flImageSize );

	// To help players spot the start & end of a cap, we indent a little on either side.
	float flIndent = 0.07;

	if ( m_pAttachedToIcon->ShouldSwipeUp() )
	{
		flYa = RemapVal( flCapPercentage, 0.0, 1.0, -flMovementInTextureSpace - flIndent, flArrowSizeInTextureSpace - flIndent );
		flYb = RemapVal( flCapPercentage, 0.0, 1.0, flIndent, flMovementInTextureSpace - flIndent );
	}
	else
	{
		flIndent = 0.1;

		float flStart = 1.0 - flIndent;
		float flEnd = 1.0 + flIndent;

		bool bSwipeLeftToRight = ( iCappingTeam % 2 ) ? false : true;
		if ( bSwipeLeftToRight )
		{
			flXa = RemapVal( flCapPercentage, 0.0, 1.0, flStart + flMovementInTextureSpace, flEnd - flArrowSizeInTextureSpace );
			flXb = RemapVal( flCapPercentage, 0.0, 1.0, flStart, 0.0 );
		}
		else
		{
			flXa = RemapVal( flCapPercentage, 0.0, 1.0, flStart, 0.0 );
			flXb = RemapVal( flCapPercentage, 0.0, 1.0, flStart + flMovementInTextureSpace, flEnd - flArrowSizeInTextureSpace );
		}
	}

	CMatRenderContextPtr pRenderContext( materials );
	pRenderContext->Bind( m_pArrowMaterial );
	IMesh* pMesh = pRenderContext->GetDynamicMesh( true );

	CMeshBuilder meshBuilder;
	meshBuilder.Begin( pMesh, MATERIAL_QUADS, 1 );

	meshBuilder.Position3f( x, y, 0.0f );
	meshBuilder.TexCoord2f( 0, flXa, flYa );
	meshBuilder.TexCoord2f( 1, 0.0f, 0.0f );
	meshBuilder.Color4ub( 255, 255, 255, 255 );
	meshBuilder.AdvanceVertex();

	meshBuilder.Position3f( x + iWidth, y, 0.0f );
	meshBuilder.TexCoord2f( 0, flXb, flYa );
	meshBuilder.TexCoord2f( 1, 1.0f, 0.0f );
	meshBuilder.Color4ub( 255, 255, 255, 255 );
	meshBuilder.AdvanceVertex();

	meshBuilder.Position3f( x + iWidth, y + iHeight, 0.0f );
	meshBuilder.TexCoord2f( 0, flXb, flYb );
	meshBuilder.TexCoord2f( 1, 1.0f, 1.0f );
	meshBuilder.Color4ub( 255, 255, 255, 255 );
	meshBuilder.AdvanceVertex();

	meshBuilder.Position3f( x, y + iHeight, 0.0f );
	meshBuilder.TexCoord2f( 0, flXa, flYb );
	meshBuilder.TexCoord2f( 1, 0.0f, 1.0f );
	meshBuilder.Color4ub( 255, 255, 255, 255 );
	meshBuilder.AdvanceVertex();

	meshBuilder.End();
	pMesh->Draw();
}
Exemplo n.º 23
0
void C_EnergyWave::DrawEWavePoints(Vector* pt, Vector* normal, float* opacity)
{
	IMesh* pMesh = materials->GetDynamicMesh( true, NULL, NULL, m_pEWaveMat );

	int numTriangles = (NUM_SUBDIVISIONS - 1) * (NUM_SUBDIVISIONS - 1) * 2;

	CMeshBuilder meshBuilder;
	meshBuilder.Begin( pMesh, MATERIAL_TRIANGLES, numTriangles );

	float du = 1.0f / (float)(NUM_SUBDIVISIONS - 1);
	float dv = du;

	unsigned char color[3];
	color[0] = 255;
	color[1] = 255;
	color[2] = 255;

	for ( int i = 0; i < NUM_SUBDIVISIONS - 1; ++i)
	{
		float v = i * dv;
		for (int j = 0; j < NUM_SUBDIVISIONS - 1; ++j)
		{
			int idx = i * NUM_SUBDIVISIONS + j;
			float u = j * du;

			meshBuilder.Position3fv( pt[idx].Base() );
			meshBuilder.Color4ub( color[0], color[1], color[2], opacity[idx] );
			meshBuilder.Normal3fv( normal[idx].Base() );
			meshBuilder.TexCoord2f( 0, u, v );
			meshBuilder.AdvanceVertex();

			meshBuilder.Position3fv( pt[idx + NUM_SUBDIVISIONS].Base() );
			meshBuilder.Color4ub( color[0], color[1], color[2], opacity[idx+NUM_SUBDIVISIONS] );
			meshBuilder.Normal3fv( normal[idx + NUM_SUBDIVISIONS].Base() );
			meshBuilder.TexCoord2f( 0, u, v + dv );
			meshBuilder.AdvanceVertex();

			meshBuilder.Position3fv( pt[idx + 1].Base() );
			meshBuilder.Color4ub( color[0], color[1], color[2], opacity[idx+1] );
			meshBuilder.Normal3fv( normal[idx+1].Base() );
			meshBuilder.TexCoord2f( 0, u + du, v );
			meshBuilder.AdvanceVertex();

			meshBuilder.Position3fv( pt[idx + 1].Base() );
			meshBuilder.Color4ub( color[0], color[1], color[2], opacity[idx+1] );
			meshBuilder.Normal3fv( normal[idx+1].Base() );
			meshBuilder.TexCoord2f( 0, u + du, v );
			meshBuilder.AdvanceVertex();

			meshBuilder.Position3fv( pt[idx + NUM_SUBDIVISIONS].Base() );
			meshBuilder.Color4ub( color[0], color[1], color[2], opacity[idx+NUM_SUBDIVISIONS] );
			meshBuilder.Normal3fv( normal[idx + NUM_SUBDIVISIONS].Base() );
			meshBuilder.TexCoord2f( 0, u, v + dv );
			meshBuilder.AdvanceVertex();

			meshBuilder.Position3fv( pt[idx + NUM_SUBDIVISIONS + 1].Base() );
			meshBuilder.Color4ub( color[0], color[1], color[2], opacity[idx+NUM_SUBDIVISIONS+1] );
			meshBuilder.Normal3fv( normal[idx + NUM_SUBDIVISIONS + 1].Base() );
			meshBuilder.TexCoord2f( 0, u + du, v + dv );
			meshBuilder.AdvanceVertex();
		}
	}

	meshBuilder.End();
	pMesh->Draw();
}
Exemplo n.º 24
0
//-----------------------------------------------------------------------------
// Purpose: 
//-----------------------------------------------------------------------------
void CTFArrowPanel::Paint()
{
	if ( !m_hEntity.Get() )
		return;

	C_BaseEntity *pEnt = m_hEntity.Get();
	IMaterial *pMaterial = m_NeutralMaterial;

	C_TFPlayer *pLocalPlayer = C_TFPlayer::GetLocalTFPlayer();

	// figure out what material we need to use
	if ( pEnt->GetTeamNumber() == TF_TEAM_RED )
	{
		pMaterial = m_RedMaterial;

		if ( pLocalPlayer && ( pLocalPlayer->GetObserverMode() == OBS_MODE_IN_EYE ) )
		{
			// is our target a player?
			C_BaseEntity *pTargetEnt = pLocalPlayer->GetObserverTarget();
			if ( pTargetEnt && pTargetEnt->IsPlayer() )
			{
				// does our target have the flag and are they carrying the flag we're currently drawing?
				C_TFPlayer *pTarget = static_cast< C_TFPlayer* >( pTargetEnt );
				if ( pTarget->HasTheFlag() && ( pTarget->GetItem() == pEnt ) )
				{
					pMaterial = m_RedMaterialNoArrow;
				}
			}
		}
	}
	else if ( pEnt->GetTeamNumber() == TF_TEAM_BLUE )
	{
		pMaterial = m_BlueMaterial;

		if ( pLocalPlayer && ( pLocalPlayer->GetObserverMode() == OBS_MODE_IN_EYE ) )
		{
			// is our target a player?
			C_BaseEntity *pTargetEnt = pLocalPlayer->GetObserverTarget();
			if ( pTargetEnt && pTargetEnt->IsPlayer() )
			{
				// does our target have the flag and are they carrying the flag we're currently drawing?
				C_TFPlayer *pTarget = static_cast< C_TFPlayer* >( pTargetEnt );
				if ( pTarget->HasTheFlag() && ( pTarget->GetItem() == pEnt ) )
				{
					pMaterial = m_BlueMaterialNoArrow;
				}
			}
		}
	}
	else if (pEnt->GetTeamNumber() == TF_TEAM_GREEN)
	{
		pMaterial = m_GreenMaterial;

		if (pLocalPlayer && (pLocalPlayer->GetObserverMode() == OBS_MODE_IN_EYE))
		{
			// is our target a player?
			C_BaseEntity *pTargetEnt = pLocalPlayer->GetObserverTarget();
			if (pTargetEnt && pTargetEnt->IsPlayer())
			{
				// does our target have the flag and are they carrying the flag we're currently drawing?
				C_TFPlayer *pTarget = static_cast< C_TFPlayer* >(pTargetEnt);
				if (pTarget->HasTheFlag() && (pTarget->GetItem() == pEnt))
				{
					pMaterial = m_GreenMaterialNoArrow;
				}
			}
		}
	}
	else if (pEnt->GetTeamNumber() == TF_TEAM_YELLOW)
	{
		pMaterial = m_YellowMaterial;

		if (pLocalPlayer && (pLocalPlayer->GetObserverMode() == OBS_MODE_IN_EYE))
		{
			// is our target a player?
			C_BaseEntity *pTargetEnt = pLocalPlayer->GetObserverTarget();
			if (pTargetEnt && pTargetEnt->IsPlayer())
			{
				// does our target have the flag and are they carrying the flag we're currently drawing?
				C_TFPlayer *pTarget = static_cast< C_TFPlayer* >(pTargetEnt);
				if (pTarget->HasTheFlag() && (pTarget->GetItem() == pEnt))
				{
					pMaterial = m_YellowMaterialNoArrow;
				}
			}
		}
	}

	int x = 0;
	int y = 0;
	ipanel()->GetAbsPos( GetVPanel(), x, y );
	int nWidth = GetWide();
	int nHeight = GetTall();

	CMatRenderContextPtr pRenderContext( materials );
	pRenderContext->MatrixMode( MATERIAL_MODEL );
	pRenderContext->PushMatrix(); 

	VMatrix panelRotation;
	panelRotation.Identity();
	MatrixBuildRotationAboutAxis( panelRotation, Vector( 0, 0, 1 ), GetAngleRotation() );
//	MatrixRotate( panelRotation, Vector( 1, 0, 0 ), 5 );
	panelRotation.SetTranslation( Vector( x + nWidth/2, y + nHeight/2, 0 ) );
	pRenderContext->LoadMatrix( panelRotation );

	IMesh *pMesh = pRenderContext->GetDynamicMesh( true, NULL, NULL, pMaterial );

	CMeshBuilder meshBuilder;
	meshBuilder.Begin( pMesh, MATERIAL_QUADS, 1 );

	meshBuilder.TexCoord2f( 0, 0, 0 );
	meshBuilder.Position3f( -nWidth/2, -nHeight/2, 0 );
	meshBuilder.Color4ub( 255, 255, 255, 255 );
	meshBuilder.AdvanceVertex();

	meshBuilder.TexCoord2f( 0, 1, 0 );
	meshBuilder.Position3f( nWidth/2, -nHeight/2, 0 );
	meshBuilder.Color4ub( 255, 255, 255, 255 );
	meshBuilder.AdvanceVertex();

	meshBuilder.TexCoord2f( 0, 1, 1 );
	meshBuilder.Position3f( nWidth/2, nHeight/2, 0 );
	meshBuilder.Color4ub( 255, 255, 255, 255 );
	meshBuilder.AdvanceVertex();

	meshBuilder.TexCoord2f( 0, 0, 1 );
	meshBuilder.Position3f( -nWidth/2, nHeight/2, 0 );
	meshBuilder.Color4ub( 255, 255, 255, 255 );
	meshBuilder.AdvanceVertex();

	meshBuilder.End();

	pMesh->Draw();
	pRenderContext->PopMatrix();
}
//-----------------------------------------------------------------------------
// Purpose: 
//-----------------------------------------------------------------------------
void CBuildingStatusAlertTray::Paint( void )
{
	// Paint the alert tray
	if ( !m_pAlertPanelMaterial || !m_pAlertPanelHudTexture )
	{
		return;
	}

	int x = 0;
	int y = 0;
	ipanel()->GetAbsPos(GetVPanel(), x,y );
	int iWidth = GetWide();
	int iHeight = GetTall();

	// Position the alert panel image based on the deployed percent
	float flXa = m_pAlertPanelHudTexture->texCoords[0];
	float flXb = m_pAlertPanelHudTexture->texCoords[2];
	float flYa = m_pAlertPanelHudTexture->texCoords[1];
	float flYb = m_pAlertPanelHudTexture->texCoords[3];

	float flMaskXa = flXa;
	float flMaskXb = flXb;
	float flMaskYa = flYa;
	float flMaskYb = flYb;

	float flFrameDelta = ( flXb - flXa ) * ( 1.0 - m_flAlertDeployedPercent );

	flXa += flFrameDelta;
	flXb += flFrameDelta; 

	CMatRenderContextPtr pRenderContext( materials );
	pRenderContext->Bind( m_pAlertPanelMaterial );
	IMesh* pMesh = pRenderContext->GetDynamicMesh( true );

	int r, g, b, a;
	r = a = 255;

	switch( m_lastAlertType )
	{
	case BUILDING_HUD_ALERT_VERY_LOW_AMMO:
	case BUILDING_HUD_ALERT_VERY_LOW_HEALTH:
		g = b = (int)( 127.0f + 127.0f * cos( gpGlobals->curtime * 2.0f * M_PI * 0.5 ) );
		break;

	case BUILDING_HUD_ALERT_SAPPER:
		g = b = (int)( 127.0f + 127.0f * cos( gpGlobals->curtime * 2.0f * M_PI * 1.5 ) );
		break;

	case BUILDING_HUD_ALERT_LOW_AMMO:
	case BUILDING_HUD_ALERT_LOW_HEALTH:
	case BUILDING_HUD_ALERT_NONE:
	default:
		g = b = 255;
		break;
	}

	CMeshBuilder meshBuilder;
	meshBuilder.Begin( pMesh, MATERIAL_QUADS, 1 );

	meshBuilder.Position3f( x, y, 0.0f );
	meshBuilder.TexCoord2f( 0, flXa, flYa );
	meshBuilder.TexCoord2f( 1, flMaskXa, flMaskYa );
	meshBuilder.Color4ub( r, g, b, a );
	meshBuilder.AdvanceVertex();

	meshBuilder.Position3f( x + iWidth, y, 0.0f );
	meshBuilder.TexCoord2f( 0, flXb, flYa );
	meshBuilder.TexCoord2f( 1, flMaskXb, flMaskYa );
	meshBuilder.Color4ub( r, g, b, a );
	meshBuilder.AdvanceVertex();

	meshBuilder.Position3f( x + iWidth, y + iHeight, 0.0f );
	meshBuilder.TexCoord2f( 0, flXb, flYb );
	meshBuilder.TexCoord2f( 1, flMaskXb, flMaskYb );
	meshBuilder.Color4ub( r, g, b, a );
	meshBuilder.AdvanceVertex();

	meshBuilder.Position3f( x, y + iHeight, 0.0f );
	meshBuilder.TexCoord2f( 0, flXa, flYb );
	meshBuilder.TexCoord2f( 1, flMaskXa, flMaskYb );
	meshBuilder.Color4ub( r, g, b, a );
	meshBuilder.AdvanceVertex();

	meshBuilder.End();
	pMesh->Draw();
}