//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CNetGraphPanel::DrawLineSegments() { int c = m_Rects.Count(); if ( c <= 0 ) return; CMatRenderContextPtr pRenderContext( materials ); IMesh* m_pMesh = pRenderContext->GetDynamicMesh( true, NULL, NULL, m_WhiteMaterial ); CMeshBuilder meshBuilder; meshBuilder.Begin( m_pMesh, MATERIAL_LINES, c ); int i; for ( i = 0 ; i < c; i++ ) { CLineSegment *seg = &m_Rects[ i ]; meshBuilder.Color4ubv( seg->color ); meshBuilder.TexCoord2f( 0, 0.0f, 0.0f ); meshBuilder.Position3f( seg->x1, seg->y1, 0 ); meshBuilder.AdvanceVertex(); meshBuilder.Color4ubv( seg->color2 ); meshBuilder.TexCoord2f( 0, 0.0f, 0.0f ); meshBuilder.Position3f( seg->x2, seg->y2, 0 ); meshBuilder.AdvanceVertex(); } meshBuilder.End(); m_pMesh->Draw(); }
// Render a quad on the screen where you pass in color and size. // Normal is random and "flutters" inline void RenderParticle_ColorSizePerturbNormal( ParticleDraw* pDraw, const Vector &pos, const Vector &color, const float alpha, const float size ) { // Don't render totally transparent particles. if( alpha < 0.001f ) return; CMeshBuilder *pBuilder = pDraw->GetMeshBuilder(); if( !pBuilder ) return; unsigned char ubColor[4]; ubColor[0] = (unsigned char)RoundFloatToInt( color.x * 254.9f ); ubColor[1] = (unsigned char)RoundFloatToInt( color.y * 254.9f ); ubColor[2] = (unsigned char)RoundFloatToInt( color.z * 254.9f ); ubColor[3] = (unsigned char)RoundFloatToInt( alpha * 254.9f ); Vector vNorm; vNorm.Random( -1.0f, 1.0f ); // Add the 4 corner vertices. pBuilder->Position3f( pos.x-size, pos.y-size, pos.z ); pBuilder->Color4ubv( ubColor ); pBuilder->Normal3fv( vNorm.Base() ); pBuilder->TexCoord2f( 0, 0, 1.0f ); pBuilder->AdvanceVertex(); pBuilder->Position3f( pos.x-size, pos.y+size, pos.z ); pBuilder->Color4ubv( ubColor ); pBuilder->Normal3fv( vNorm.Base() ); pBuilder->TexCoord2f( 0, 0, 0 ); pBuilder->AdvanceVertex(); pBuilder->Position3f( pos.x+size, pos.y+size, pos.z ); pBuilder->Color4ubv( ubColor ); pBuilder->Normal3fv( vNorm.Base() ); pBuilder->TexCoord2f( 0, 1.0f, 0 ); pBuilder->AdvanceVertex(); pBuilder->Position3f( pos.x+size, pos.y-size, pos.z ); pBuilder->Color4ubv( ubColor ); pBuilder->Normal3fv( vNorm.Base() ); pBuilder->TexCoord2f( 0, 1.0f, 1.0f ); pBuilder->AdvanceVertex(); }
//----------------------------------------------------------------------------- // a pass to set the z buffer... //----------------------------------------------------------------------------- void C_VGuiScreen::DrawScreenOverlay() { CMatRenderContextPtr pRenderContext( materials ); pRenderContext->MatrixMode( MATERIAL_MODEL ); pRenderContext->PushMatrix(); pRenderContext->LoadMatrix( m_PanelToWorld ); unsigned char pColor[4] = {255, 255, 255, 255}; CMeshBuilder meshBuilder; IMesh *pMesh = pRenderContext->GetDynamicMesh( true, NULL, NULL, m_OverlayMaterial ); meshBuilder.Begin( pMesh, MATERIAL_QUADS, 1 ); meshBuilder.Position3f( 0.0f, 0.0f, 0 ); meshBuilder.TexCoord2f( 0, 0.0f, 0.0f ); meshBuilder.Color4ubv( pColor ); meshBuilder.AdvanceVertex(); meshBuilder.Position3f( m_flWidth, 0.0f, 0 ); meshBuilder.TexCoord2f( 0, 1.0f, 0.0f ); meshBuilder.Color4ubv( pColor ); meshBuilder.AdvanceVertex(); meshBuilder.Position3f( m_flWidth, -m_flHeight, 0 ); meshBuilder.TexCoord2f( 0, 1.0f, 1.0f ); meshBuilder.Color4ubv( pColor ); meshBuilder.AdvanceVertex(); meshBuilder.Position3f( 0.0f, -m_flHeight, 0 ); meshBuilder.TexCoord2f( 0, 0.0f, 1.0f ); meshBuilder.Color4ubv( pColor ); meshBuilder.AdvanceVertex(); meshBuilder.End(); pMesh->Draw(); pRenderContext->PopMatrix(); }
void DrawSpriteModel( IClientEntity *baseentity, CEngineSprite *psprite, const Vector &origin, float fscale, float frame, int rendermode, int r, int g, int b, int a, const Vector& forward, const Vector& right, const Vector& up, float flHDRColorScale ) { float scale; IMaterial *material; // don't even bother culling, because it's just a single // polygon without a surface cache if ( fscale > 0 ) scale = fscale; else scale = 1.0f; if ( rendermode == kRenderNormal ) { render->SetBlend( 1.0f ); } material = psprite->GetMaterial( (RenderMode_t)rendermode, frame ); if ( !material ) return; CMatRenderContextPtr pRenderContext( materials ); if ( ShouldDrawInWireFrameMode() || r_drawsprites.GetInt() == 2 ) { IMaterial *pMaterial = materials->FindMaterial( "debug/debugspritewireframe", TEXTURE_GROUP_OTHER ); pRenderContext->Bind( pMaterial, NULL ); } else { pRenderContext->Bind( material, (IClientRenderable*)baseentity ); } unsigned char color[4]; color[0] = r; color[1] = g; color[2] = b; color[3] = a; IMaterialVar *pHDRColorScaleVar = material->FindVarFast( "$HDRCOLORSCALE", &s_nHDRColorScaleCache ); if( pHDRColorScaleVar ) { pHDRColorScaleVar->SetVecValue( flHDRColorScale, flHDRColorScale, flHDRColorScale ); } Vector point; IMesh* pMesh = pRenderContext->GetDynamicMesh(); CMeshBuilder meshBuilder; meshBuilder.Begin( pMesh, MATERIAL_QUADS, 1 ); Vector vec_a; Vector vec_b; Vector vec_c; Vector vec_d; // isolate common terms VectorMA( origin, psprite->GetDown() * scale, up, vec_a ); VectorScale( right, psprite->GetLeft() * scale, vec_b ); VectorMA( origin, psprite->GetUp() * scale, up, vec_c ); VectorScale( right, psprite->GetRight() * scale, vec_d ); float flMinU, flMinV, flMaxU, flMaxV; psprite->GetTexCoordRange( &flMinU, &flMinV, &flMaxU, &flMaxV ); meshBuilder.Color4ubv( color ); meshBuilder.TexCoord2f( 0, flMinU, flMaxV ); VectorAdd( vec_a, vec_b, point ); meshBuilder.Position3fv( point.Base() ); meshBuilder.AdvanceVertex(); meshBuilder.Color4ubv( color ); meshBuilder.TexCoord2f( 0, flMinU, flMinV ); VectorAdd( vec_c, vec_b, point ); meshBuilder.Position3fv( point.Base() ); meshBuilder.AdvanceVertex(); meshBuilder.Color4ubv( color ); meshBuilder.TexCoord2f( 0, flMaxU, flMinV ); VectorAdd( vec_c, vec_d, point ); meshBuilder.Position3fv( point.Base() ); meshBuilder.AdvanceVertex(); meshBuilder.Color4ubv( color ); meshBuilder.TexCoord2f( 0, flMaxU, flMaxV ); VectorAdd( vec_a, vec_d, point ); meshBuilder.Position3fv( point.Base() ); meshBuilder.AdvanceVertex(); meshBuilder.End(); pMesh->Draw(); }
static void DrawSpriteTangentSpace( const Vector &vecOrigin, float flWidth, float flHeight, color32 color ) { unsigned char pColor[4] = { color.r, color.g, color.b, color.a }; // Generate half-widths flWidth *= 0.5f; flHeight *= 0.5f; // Compute direction vectors for the sprite Vector fwd, right( 1, 0, 0 ), up( 0, 1, 0 ); VectorSubtract( CurrentViewOrigin(), vecOrigin, fwd ); float flDist = VectorNormalize( fwd ); if (flDist >= 1e-3) { CrossProduct( CurrentViewUp(), fwd, right ); flDist = VectorNormalize( right ); if (flDist >= 1e-3) { CrossProduct( fwd, right, up ); } else { // In this case, fwd == g_vecVUp, it's right above or // below us in screen space CrossProduct( fwd, CurrentViewRight(), up ); VectorNormalize( up ); CrossProduct( up, fwd, right ); } } Vector left = -right; Vector down = -up; Vector back = -fwd; CMeshBuilder meshBuilder; Vector point; IMesh* pMesh = materials->GetDynamicMesh( ); meshBuilder.Begin( pMesh, MATERIAL_QUADS, 1 ); meshBuilder.Color4ubv (pColor); meshBuilder.TexCoord2f (0, 0, 1); VectorMA (vecOrigin, -flHeight, up, point); VectorMA (point, -flWidth, right, point); meshBuilder.TangentS3fv( left.Base() ); meshBuilder.TangentT3fv( down.Base() ); meshBuilder.Normal3fv( back.Base() ); meshBuilder.Position3fv (point.Base()); meshBuilder.AdvanceVertex(); meshBuilder.Color4ubv (pColor); meshBuilder.TexCoord2f (0, 0, 0); VectorMA (vecOrigin, flHeight, up, point); VectorMA (point, -flWidth, right, point); meshBuilder.TangentS3fv( left.Base() ); meshBuilder.TangentT3fv( down.Base() ); meshBuilder.Normal3fv( back.Base() ); meshBuilder.Position3fv (point.Base()); meshBuilder.AdvanceVertex(); meshBuilder.Color4ubv (pColor); meshBuilder.TexCoord2f (0, 1, 0); VectorMA (vecOrigin, flHeight, up, point); VectorMA (point, flWidth, right, point); meshBuilder.TangentS3fv( left.Base() ); meshBuilder.TangentT3fv( down.Base() ); meshBuilder.Normal3fv( back.Base() ); meshBuilder.Position3fv (point.Base()); meshBuilder.AdvanceVertex(); meshBuilder.Color4ubv (pColor); meshBuilder.TexCoord2f (0, 1, 1); VectorMA (vecOrigin, -flHeight, up, point); VectorMA (point, flWidth, right, point); meshBuilder.TangentS3fv( left.Base() ); meshBuilder.TangentT3fv( down.Base() ); meshBuilder.Normal3fv( back.Base() ); meshBuilder.Position3fv (point.Base()); meshBuilder.AdvanceVertex(); meshBuilder.End(); pMesh->Draw(); }
//----------------------------------------------------------------------------- // Tests dynamic buffers //----------------------------------------------------------------------------- void CMaterialSystemTestApp::TestDynamicBuffers( IMatRenderContext *pMatRenderContext, bool bBuffered ) { CreateWireframeMaterial(); g_pMaterialSystem->BeginFrame( 0 ); pMatRenderContext->Bind( m_pMaterial ); IMesh *pMesh = pMatRenderContext->GetDynamicMesh( bBuffered ); // clear (so that we can make sure that we aren't getting results from the previous quad) pMatRenderContext->ClearColor3ub( RandomInt( 0, 100 ), RandomInt( 0, 100 ), RandomInt( 190, 255 ) ); pMatRenderContext->ClearBuffers( true, true ); static unsigned char s_pColors[4][4] = { { 255, 0, 0, 255 }, { 0, 255, 0, 255 }, { 0, 0, 255, 255 }, { 255, 255, 255, 255 }, }; static int nCount = 0; const int nLoopCount = 8; float flWidth = 2.0f / nLoopCount; for ( int i = 0; i < nLoopCount; ++i ) { CMeshBuilder mb; mb.Begin( pMesh, MATERIAL_TRIANGLES, 4, 6 ); mb.Position3f( -1.0f + i * flWidth, -1.0f, 0.5f ); mb.Normal3f( 0.0f, 0.0f, 1.0f ); mb.Color4ubv( s_pColors[nCount++ % 4] ); mb.AdvanceVertex(); mb.Position3f( -1.0f + i * flWidth + flWidth, -1.0f, 0.5f ); mb.Normal3f( 0.0f, 0.0f, 1.0f ); mb.Color4ubv( s_pColors[nCount++ % 4] ); mb.AdvanceVertex(); mb.Position3f( -1.0f + i * flWidth + flWidth, 1.0f, 0.5f ); mb.Normal3f( 0.0f, 0.0f, 1.0f ); mb.Color4ubv( s_pColors[nCount++ % 4] ); mb.AdvanceVertex(); mb.Position3f( -1.0f + i * flWidth, 1.0f, 0.5f ); mb.Normal3f( 0.0f, 0.0f, 1.0f ); mb.Color4ubv( s_pColors[nCount++ % 4] ); mb.AdvanceVertex(); ++nCount; mb.FastIndex( 0 ); mb.FastIndex( 2 ); mb.FastIndex( 1 ); mb.FastIndex( 0 ); mb.FastIndex( 3 ); mb.FastIndex( 2 ); mb.End( true ); pMesh->Draw( ); } ++nCount; g_pMaterialSystem->EndFrame(); g_pMaterialSystem->SwapBuffers(); DestroyMaterial(); }
void C_CFPlayer::DrawTarget(const char* pszMaterial, Vector vecOrigin, float flYaw, float flElapsed, CViewSetup* pPushView) { CMatRenderContextPtr pRenderContext( materials ); Frustum drawFrustum; if (pPushView) render->Push3DView( *pPushView, 0, NULL, drawFrustum ); IMaterial* pMaterial = materials->FindMaterial( pszMaterial, TEXTURE_GROUP_CLIENT_EFFECTS ); pRenderContext->Bind( pMaterial ); IMesh* pMesh = pRenderContext->GetDynamicMesh(); float flWooshTime = 0.2f; unsigned char color[4]; color[0] = 255; color[1] = 255; color[2] = 255; color[3] = RemapValClamped(flElapsed, 0, flWooshTime, 0, 255); Vector vec1; Vector vec2; Vector vec3; Vector vec4; Vector vecForward, vecRight, vecUp; AngleVectors(QAngle(0, flYaw, 0), &vecForward, &vecRight, &vecUp); float flSize = RemapValClamped(flElapsed, 0, flWooshTime, 96, 32); vecOrigin.z += RemapValClamped(flElapsed, 0, flWooshTime, 20, 0); vec1 = vecOrigin - vecForward * flSize - vecRight * flSize; vec2 = vecOrigin + vecForward * flSize - vecRight * flSize; vec3 = vecOrigin + vecForward * flSize + vecRight * flSize; vec4 = vecOrigin - vecForward * flSize + vecRight * flSize; CMeshBuilder meshBuilder; meshBuilder.Begin( pMesh, MATERIAL_QUADS, 1 ); meshBuilder.Color4ubv( color ); meshBuilder.TexCoord2f( 0, 0, 1 ); meshBuilder.Position3fv( vec1.Base() ); meshBuilder.AdvanceVertex(); meshBuilder.Color4ubv( color ); meshBuilder.TexCoord2f( 0, 0, 0 ); meshBuilder.Position3fv( vec2.Base() ); meshBuilder.AdvanceVertex(); meshBuilder.Color4ubv( color ); meshBuilder.TexCoord2f( 0, 1, 0 ); meshBuilder.Position3fv( vec3.Base() ); meshBuilder.AdvanceVertex(); meshBuilder.Color4ubv( color ); meshBuilder.TexCoord2f( 0, 1, 1 ); meshBuilder.Position3fv( vec4.Base() ); meshBuilder.AdvanceVertex(); meshBuilder.End(); pMesh->Draw(); if (pPushView) render->PopView( drawFrustum ); }