你要结合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; } |
Quadtree和octree模式有些许的不同。一个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]); } } // Don’t 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 hasn’t 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函数将建立一套完整的纹理组顶点缓冲准备被渲染。