10. cNodeTreeMesh::AddNode

 

你要结合Render 函数来使用cNodeTreeMesh::AddNode函数。AddNode执行对所有节点的frustum验证,并递归验证他的所有子节点。起初调用AddNode,m_ParentNode变量已经被传进AddNode,从根节点开始处理:

void cNodeTreeMesh::AddNode(sNode *Node)

{

unsigned long i, Group;

short Num;

// Perform frustum check based on tree type

if(m_TreeType == QUADTREE) {

if(m_Frustum->CheckRectangle( /

Node->XPos, 0.0f, Node->ZPos, /

Node->Size / 2.0f, m_Size / 2.0f, /

Node->Size / 2.0f) == FALSE)

return;

} else {

if(m_Frustum->CheckRectangle(

Node->XPos, Node->YPos, Node->ZPos, /

Node->Size / 2.0f, Node->Size / 2.0f, /

Node->Size / 2.0f) == FALSE)

return;

}

 

Quadtreeoctree模式有些许的不同。一个quadtree,使用2D结构,仅需验证两个尺寸。至于一个octree,一个节点可以在3D空间中的任何地方,所以至少一个点必须被看到。

 

这个AddNode函数决定了字节点是否需要被增加(只要这个节点有多边形)。当一个节点不再有子节点时增加节点停止。既然这样,下一个父节点就被处理,知道所有节点都被处理过。

// Scan other nodes

Num = 0;

for(i=0;i<(unsigned long)((m_TreeType==QUADTREE)?4:8);i++) {

if(Node->Nodes[i] != NULL) {

Num++;

AddNode(Node->Nodes[i]);

}

}

// Dont need to go on if there are other nodes

if(Num)

return;

 

现在,AddNode函数验证被考虑的节点是否包含任何多边形。如果节点包含多边形,就验证这些多边形是否可见(多边形使用材质Alpha值为0.0被认为是不可见);

 

AddNode将增加这些可见得多边形到恰当的纹理组的顶点缓冲区,并在节点中知道要绘出的多边形的数量。每个框架,在每个纹理组渲染的多边形的数量通过Render 函数重设。下面的代码增加要绘出的多边形的数量:

// Add contained polygons (if any)

if(Node->NumPolygons != 0) {

for(i=0;i<Node->NumPolygons;i++) {

// If a polygon hasnt yet been drawn and it has a

// valid texture group value, then process it.

if(Node->PolygonList[i]->Time != m_Time && /

(Group = Node->PolygonList[i]->Group) < m_NumGroups) {

// Only draw polygons that are visible

// ie: have a material alpha value of > 0.0

if(m_Mesh->m_Materials[ /

Node->PolygonList[i]->Group].Diffuse.a != 0.0f) {

// Copy over vertex data from source mesh

memcpy(m_Groups[Group].VertexPtr, /

&m_VertexPtr[m_VertexSize * /

Node->PolygonList[i]->Vertex[0]], /

m_VertexSize);

m_Groups[Group].VertexPtr += m_VertexSize;

memcpy(m_Groups[Group].VertexPtr, /

&m_VertexPtr[m_VertexSize * /

Node->PolygonList[i]->Vertex[1]], /

m_VertexSize);

m_Groups[Group].VertexPtr += m_VertexSize;

memcpy(m_Groups[Group].VertexPtr, /

&m_VertexPtr[m_VertexSize * /

Node->PolygonList[i]->Vertex[2]], /

m_VertexSize);

m_Groups[Group].VertexPtr += m_VertexSize;

m_Groups[Group].NumPolygonsToDraw++;

}

// Mark polygon as processed this time segment

Node->PolygonList[i]->Time = m_Time;

}

}

}

}

 

当完成,AddNode函数将建立一套完整的纹理组顶点缓冲准备被渲染。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值