下面是畫線圖元注釋
1 //渲染指定顏色的線
2 void CALL HGE_Impl::Gfx_RenderLine(float x1, float y1, float x2, float y2, DWORD color, float z)
3 {
4 if(VertArray) //如果頂點數組不為空
5 {
6 if(CurPrimType!=HGEPRIM_LINES //如果最近一次不是畫線操作
7 || nPrim>=VERTEX_BUFFER_SIZE/HGEPRIM_LINES //如果畫線操作緩存已經超過了最大數
8 || CurTexture || //如果當前存在紋理
9 CurBlendMode!=BLEND_DEFAULT //如果混合不是缺省模式
10 )
11 {
12 _render_batch(); //批量渲染
13
14 CurPrimType=HGEPRIM_LINES; //當操作
15 if(CurBlendMode != BLEND_DEFAULT) _SetBlendMode(BLEND_DEFAULT); //設置混合模式
16 if(CurTexture) { pD3DDevice->SetTexture(0, 0); CurTexture=0; } //清空紋理
17 }
18 //將頂點加到緩存中
19 int i=nPrim*HGEPRIM_LINES;
20 VertArray[i].x = x1; VertArray[i+1].x = x2;
21 VertArray[i].y = y1; VertArray[i+1].y = y2;
22 VertArray[i].z = VertArray[i+1].z = z;
23 VertArray[i].col = VertArray[i+1].col = color;
24 VertArray[i].tx = VertArray[i+1].tx =
25 VertArray[i].ty = VertArray[i+1].ty = 0.0f;
26 nPrim++;
27 }
28 }
29
其它的Gfx_RenderTriple、Gfx_RenderQuad分別是三角與方型圖元方法,與畫線方法類似。
下面是批量畫圖元方法注釋
1 void HGE_Impl::_render_batch(bool bEndScene)
2 {
3 if(VertArray)
4 {
5 pVB->Unlock(); //鎖定VertexBuffer 頂點緩存
6
7 if(nPrim) //如果存在要畫的圖元
8 {
9 switch(CurPrimType)
10 {
11 case HGEPRIM_QUADS: //方形圖元,這里使用的是頂點索引的方式
12 pD3DDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, nPrim<<2, 0, nPrim<<1);
13 break;
14
15 case HGEPRIM_TRIPLES: //三角圖元
16 pD3DDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, nPrim);
17 break;
18
19 case HGEPRIM_LINES: //線性圖元
20 pD3DDevice->DrawPrimitive(D3DPT_LINELIST, 0, nPrim);
21 break;
22 }
23
24 nPrim=0;
25 }
26
27 if(bEndScene) VertArray = 0;
28 else pVB->Lock( 0, 0, (BYTE**)&VertArray, 0 ); //解除鎖定
29 }
30 }
在這里可以看出,HGE共有三種圖元。對于連續畫的相同圖元,會先放到緩存中,當新圖元類型發生變化或緩存滿了,將會緩存畫出來。
Gfx_StartBatch則是強制將緩存的圖元畫出來。