下面是画线图元注释
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则是强制将缓存的图元画出来。