@@ -1092,80 +1092,99 @@ void CMatSystemSurface::DrawQuadArray( int quadCount, vgui::Vertex_t *pVerts, un
10921092 if ( !m_pMesh )
10931093 return ;
10941094
1095- meshBuilder.Begin ( m_pMesh, MATERIAL_QUADS, quadCount );
1096-
10971095 vgui::Vertex_t ulc;
10981096 vgui::Vertex_t lrc;
10991097 vgui::Vertex_t *pulc;
11001098 vgui::Vertex_t *plrc;
11011099
1102- if ( bShouldClip )
1103- {
1104- for ( int i = 0 ; i < quadCount; ++i )
1105- {
1106- PREFETCH360 ( &pVerts[ 2 * ( i + 1 ) ], 0 );
1107-
1108- if ( !ClipRect ( pVerts[2 *i], pVerts[2 *i + 1 ], &ulc, &lrc ) )
1109- {
1110- continue ;
1111- }
1112- pulc = &ulc;
1113- plrc = &lrc;
1114-
1115- meshBuilder.Position3f ( pulc->m_Position .x , pulc->m_Position .y , m_flZPos );
1116- meshBuilder.Color4ubv ( pColor );
1117- meshBuilder.TexCoord2f ( 0 , pulc->m_TexCoord .x , pulc->m_TexCoord .y );
1118- meshBuilder.AdvanceVertexF <VTX_HAVEPOS | VTX_HAVECOLOR, 1 >();
1100+ int nMaxVertices, nMaxIndices;
1101+ CMatRenderContextPtr pRenderContext (g_pMaterialSystem);
1102+ pRenderContext->GetMaxToRender (m_pMesh, false , &nMaxVertices, &nMaxIndices);
1103+ if (!nMaxVertices || !nMaxIndices)
1104+ return ; // probably in alt-tab
11191105
1120- meshBuilder.Position3f ( plrc->m_Position .x , pulc->m_Position .y , m_flZPos );
1121- meshBuilder.Color4ubv ( pColor );
1122- meshBuilder.TexCoord2f ( 0 , plrc->m_TexCoord .x , pulc->m_TexCoord .y );
1123- meshBuilder.AdvanceVertexF <VTX_HAVEPOS | VTX_HAVECOLOR, 1 >();
1106+ int nMaxQuads = nMaxVertices / 4 ;
1107+ nMaxQuads = MIN (nMaxQuads, nMaxIndices / 6 );
11241108
1125- meshBuilder.Position3f ( plrc->m_Position .x , plrc->m_Position .y , m_flZPos );
1126- meshBuilder.Color4ubv ( pColor );
1127- meshBuilder.TexCoord2f ( 0 , plrc->m_TexCoord .x , plrc->m_TexCoord .y );
1128- meshBuilder.AdvanceVertexF <VTX_HAVEPOS | VTX_HAVECOLOR, 1 >();
1109+ int nFirstQuad = 0 ;
1110+ int nQuadsRemaining = quadCount;
11291111
1130- meshBuilder.Position3f ( pulc->m_Position .x , plrc->m_Position .y , m_flZPos );
1131- meshBuilder.Color4ubv ( pColor );
1132- meshBuilder.TexCoord2f ( 0 , pulc->m_TexCoord .x , plrc->m_TexCoord .y );
1133- meshBuilder.AdvanceVertexF <VTX_HAVEPOS | VTX_HAVECOLOR, 1 >();
1134- }
1135- }
1136- else
1112+ while (nQuadsRemaining > 0 )
11371113 {
1138- for ( int i = 0 ; i < quadCount; ++i )
1114+ quadCount = MIN ( nQuadsRemaining, nMaxQuads );
1115+ meshBuilder.Begin ( m_pMesh, MATERIAL_QUADS, quadCount );
1116+ if ( bShouldClip )
11391117 {
1140- PREFETCH360 ( &pVerts[ 2 * ( i + 1 ) ], 0 );
1141-
1142- pulc = &pVerts[2 *i];
1143- plrc = &pVerts[2 *i + 1 ];
1144-
1145- meshBuilder.Position3f ( pulc->m_Position .x , pulc->m_Position .y , m_flZPos );
1146- meshBuilder.Color4ubv ( pColor );
1147- meshBuilder.TexCoord2f ( 0 , pulc->m_TexCoord .x , pulc->m_TexCoord .y );
1148- meshBuilder.AdvanceVertexF <VTX_HAVEPOS | VTX_HAVECOLOR, 1 >();
1149-
1150- meshBuilder.Position3f ( plrc->m_Position .x , pulc->m_Position .y , m_flZPos );
1151- meshBuilder.Color4ubv ( pColor );
1152- meshBuilder.TexCoord2f ( 0 , plrc->m_TexCoord .x , pulc->m_TexCoord .y );
1153- meshBuilder.AdvanceVertexF <VTX_HAVEPOS | VTX_HAVECOLOR, 1 >();
1154-
1155- meshBuilder.Position3f ( plrc->m_Position .x , plrc->m_Position .y , m_flZPos );
1156- meshBuilder.Color4ubv ( pColor );
1157- meshBuilder.TexCoord2f ( 0 , plrc->m_TexCoord .x , plrc->m_TexCoord .y );
1158- meshBuilder.AdvanceVertexF <VTX_HAVEPOS | VTX_HAVECOLOR, 1 >();
1118+ for ( int q = 0 ; q < quadCount; ++q )
1119+ {
1120+ int i = q + nFirstQuad;
1121+ PREFETCH360 ( &pVerts[ 2 * ( i + 1 ) ], 0 );
11591122
1160- meshBuilder.Position3f ( pulc->m_Position .x , plrc->m_Position .y , m_flZPos );
1161- meshBuilder.Color4ubv ( pColor );
1162- meshBuilder.TexCoord2f ( 0 , pulc->m_TexCoord .x , plrc->m_TexCoord .y );
1163- meshBuilder.AdvanceVertexF <VTX_HAVEPOS | VTX_HAVECOLOR, 1 >();
1123+ if ( !ClipRect ( pVerts[2 *i], pVerts[2 *i + 1 ], &ulc, &lrc ) )
1124+ {
1125+ continue ;
1126+ }
1127+ pulc = &ulc;
1128+ plrc = &lrc;
1129+
1130+ meshBuilder.Position3f ( pulc->m_Position .x , pulc->m_Position .y , m_flZPos );
1131+ meshBuilder.Color4ubv ( pColor );
1132+ meshBuilder.TexCoord2f ( 0 , pulc->m_TexCoord .x , pulc->m_TexCoord .y );
1133+ meshBuilder.AdvanceVertexF <VTX_HAVEPOS | VTX_HAVECOLOR, 1 >();
1134+
1135+ meshBuilder.Position3f ( plrc->m_Position .x , pulc->m_Position .y , m_flZPos );
1136+ meshBuilder.Color4ubv ( pColor );
1137+ meshBuilder.TexCoord2f ( 0 , plrc->m_TexCoord .x , pulc->m_TexCoord .y );
1138+ meshBuilder.AdvanceVertexF <VTX_HAVEPOS | VTX_HAVECOLOR, 1 >();
1139+
1140+ meshBuilder.Position3f ( plrc->m_Position .x , plrc->m_Position .y , m_flZPos );
1141+ meshBuilder.Color4ubv ( pColor );
1142+ meshBuilder.TexCoord2f ( 0 , plrc->m_TexCoord .x , plrc->m_TexCoord .y );
1143+ meshBuilder.AdvanceVertexF <VTX_HAVEPOS | VTX_HAVECOLOR, 1 >();
1144+
1145+ meshBuilder.Position3f ( pulc->m_Position .x , plrc->m_Position .y , m_flZPos );
1146+ meshBuilder.Color4ubv ( pColor );
1147+ meshBuilder.TexCoord2f ( 0 , pulc->m_TexCoord .x , plrc->m_TexCoord .y );
1148+ meshBuilder.AdvanceVertexF <VTX_HAVEPOS | VTX_HAVECOLOR, 1 >();
1149+ }
1150+ }
1151+ else
1152+ {
1153+ for (int q = 0 ; q < quadCount; ++q)
1154+ {
1155+ int i = q + nFirstQuad;
1156+ PREFETCH360 ( &pVerts[ 2 * ( i + 1 ) ], 0 );
1157+
1158+ pulc = &pVerts[2 *i];
1159+ plrc = &pVerts[2 *i + 1 ];
1160+
1161+ meshBuilder.Position3f ( pulc->m_Position .x , pulc->m_Position .y , m_flZPos );
1162+ meshBuilder.Color4ubv ( pColor );
1163+ meshBuilder.TexCoord2f ( 0 , pulc->m_TexCoord .x , pulc->m_TexCoord .y );
1164+ meshBuilder.AdvanceVertexF <VTX_HAVEPOS | VTX_HAVECOLOR, 1 >();
1165+
1166+ meshBuilder.Position3f ( plrc->m_Position .x , pulc->m_Position .y , m_flZPos );
1167+ meshBuilder.Color4ubv ( pColor );
1168+ meshBuilder.TexCoord2f ( 0 , plrc->m_TexCoord .x , pulc->m_TexCoord .y );
1169+ meshBuilder.AdvanceVertexF <VTX_HAVEPOS | VTX_HAVECOLOR, 1 >();
1170+
1171+ meshBuilder.Position3f ( plrc->m_Position .x , plrc->m_Position .y , m_flZPos );
1172+ meshBuilder.Color4ubv ( pColor );
1173+ meshBuilder.TexCoord2f ( 0 , plrc->m_TexCoord .x , plrc->m_TexCoord .y );
1174+ meshBuilder.AdvanceVertexF <VTX_HAVEPOS | VTX_HAVECOLOR, 1 >();
1175+
1176+ meshBuilder.Position3f ( pulc->m_Position .x , plrc->m_Position .y , m_flZPos );
1177+ meshBuilder.Color4ubv ( pColor );
1178+ meshBuilder.TexCoord2f ( 0 , pulc->m_TexCoord .x , plrc->m_TexCoord .y );
1179+ meshBuilder.AdvanceVertexF <VTX_HAVEPOS | VTX_HAVECOLOR, 1 >();
1180+ }
11641181 }
1165- }
11661182
1167- meshBuilder.End ();
1168- m_pMesh->Draw ();
1183+ meshBuilder.End ();
1184+ m_pMesh->Draw ();
1185+ nFirstQuad += quadCount;
1186+ nQuadsRemaining -= quadCount;
1187+ }
11691188}
11701189
11711190
0 commit comments