[ milan_d @ 26.09.2003. 19:56 ] @
Pisem Quake3 map viewer u kome hocu da iscrtam mapu
tako sto sortiram poligone od najdaljeg do najblizeg, tako
da bi scena trebalo da bude pravilno iscrtana bez koriscenja
depth buffera. Medjutim to mi ne uspeva, poligoni koji bi
trebali da se vide pojavljuju se i nestaju kako se pomera
kamera. Sve rada kako treba kada je ukljucen depth
buffering. Algoritam sam pronasao u raznim clancima sa
interneta i trebalo bi da radi. Evo dve funkcije koje koristim
za iscrtavanje mape, nadam se da su dovoljne da bi ste
zakljucili kako sve radi:

Code:

void Q3Map::Render(const Camera& cam, float frame_time)
{
    // pronadji klaster koji sadrzi kameru
    m_pCurCam = &cam;
    int leaf_i = FindLeaf(cam.GetPosition());
    m_nCurCamCluster = m_leaves[leaf_i].cluster;

    // prodji kroz BSP stablo i iscrtaj sve vidljive poligone
    // od najdaljeg do najblizeg
    m_vis_faces_map.Reset();
    RenderNode(0);
}

void Q3Map::RenderNode(int node_i)
{
    Node& node = m_nodes[node_i];
    if(node_i >= 0){
        // da li je kamera ispred ravni u trenutnom cvoru?
        if(PointToPlaneEval(m_pCurCam->GetPosition(), m_planes[node.plane]) >= 0){
            RenderNode(node.back);
            RenderNode(node.front);
        }
        else{
            RenderNode(node.front);
            RenderNode(node.back);
        }
    }
    else{
        int leaf_i = ~node_i;
        // iscrtaj list
        Leaf& leaf = m_leaves[leaf_i];
        if(IsClusterVisible(m_nCurCamCluster, leaf.cluster)){
            fVect3 bbox_min(leaf.mins), bbox_max(leaf.maxs);
            if(m_pCurCam->IsBBoxVisible(bbox_min, bbox_max)){
                int last_leafface = leaf.leafface + leaf.num_leaffaces - 1;
                for(int i = leaf.leafface; i <= last_leafface; ++i){
                    int face_i = m_leaf_faces[i];
                    Face& face = m_faces[face_i];
                    if(face.type == FT_POLYGON){
                        if(!m_vis_faces_map.IsSet(face_i)){
                            m_vis_faces_map.Set(face_i);

                            // iscrtaj ovaj poligon
                            glActiveTextureARB(GL_TEXTURE0_ARB);
                            m_texs[face.texture].MakeCurrent();
                            glEnable(GL_TEXTURE_2D);
                            glActiveTextureARB(GL_TEXTURE1_ARB);
                            m_lmap_texs[face.lmap_index].MakeCurrent();
                            glEnable(GL_TEXTURE_2D);
                            glDrawArrays(GL_TRIANGLE_FAN, face.vertex, face.num_vertices);
                        }
                    }
                }
            }
        }
    }
}


Znam da ovo nije najefikasniji nacin da se iscrta mapa ali
to radim zbog toga da bih provalio neke stvari. Da li neko
moze da mi kaze sta nije u redu u mom algoritmu?

Milan
[ yooyo @ 18.10.2003. 00:18 ] @
Idi na google i potrazi aftershock. Mislim da ga ima negde na planetquake.
To je kompletan q3map renderer, sa source-om u C-u.

yooyo