//========================================================================== // // // //========================================================================== void GLDrawList::DoDrawSorted(SortNode * head) { float clipsplit[2]; int relation = 0; float z = 0.f; gl_RenderState.GetClipSplit(clipsplit); if (drawitems[head->itemindex].rendertype == GLDIT_FLAT) { z = flats[drawitems[head->itemindex].index].z; relation = z > ViewPos.Z ? 1 : -1; } // left is further away, i.e. for stuff above viewz its z coordinate higher, for stuff below viewz its z coordinate is lower if (head->left) { if (relation == -1) { gl_RenderState.SetClipSplit(clipsplit[0], z); // render below: set flat as top clip plane } else if (relation == 1) { gl_RenderState.SetClipSplit(z, clipsplit[1]); // render above: set flat as bottom clip plane } DoDrawSorted(head->left); gl_RenderState.SetClipSplit(clipsplit); } DoDraw(GLPASS_TRANSLUCENT, head->itemindex, true); if (head->equal) { SortNode * ehead=head->equal; while (ehead) { DoDraw(GLPASS_TRANSLUCENT, ehead->itemindex, true); ehead=ehead->equal; } } // right is closer, i.e. for stuff above viewz its z coordinate is lower, for stuff below viewz its z coordinate is higher if (head->right) { if (relation == 1) { gl_RenderState.SetClipSplit(clipsplit[0], z); // render below: set flat as top clip plane } else if (relation == -1) { gl_RenderState.SetClipSplit(z, clipsplit[1]); // render above: set flat as bottom clip plane } DoDrawSorted(head->right); gl_RenderState.SetClipSplit(clipsplit); } }
//========================================================================== // // // //========================================================================== void GLDrawList::DrawSorted() { if (drawitems.Size()==0) return; if (!sorted) { GLRenderer->mVBO->Map(); MakeSortList(); sorted=DoSort(SortNodes[SortNodeStart]); GLRenderer->mVBO->Unmap(); } gl_RenderState.ClearClipSplit(); if (!(gl.flags & RFL_NO_CLIP_PLANES)) { glEnable(GL_CLIP_DISTANCE1); glEnable(GL_CLIP_DISTANCE2); } DoDrawSorted(sorted); if (!(gl.flags & RFL_NO_CLIP_PLANES)) { glDisable(GL_CLIP_DISTANCE1); glDisable(GL_CLIP_DISTANCE2); } gl_RenderState.ClearClipSplit(); }
//========================================================================== // // // //========================================================================== void FDrawInfo::DrawSorted(int listindex) { HWDrawList *dl = &drawlists[listindex]; if (dl->drawitems.Size()==0) return; if (!dl->sorted) { GLRenderer->mVBO->Map(); dl->Sort(this); GLRenderer->mVBO->Unmap(); } gl_RenderState.ClearClipSplit(); if (!(gl.flags & RFL_NO_CLIP_PLANES)) { glEnable(GL_CLIP_DISTANCE1); glEnable(GL_CLIP_DISTANCE2); } DoDrawSorted(dl, dl->sorted); if (!(gl.flags & RFL_NO_CLIP_PLANES)) { glDisable(GL_CLIP_DISTANCE1); glDisable(GL_CLIP_DISTANCE2); } gl_RenderState.ClearClipSplit(); }
//========================================================================== // // // //========================================================================== void GLDrawList::DrawSorted() { if (drawitems.Size()==0) return; if (!sorted) { MakeSortList(); sorted=DoSort(SortNodes[SortNodeStart]); } DoDrawSorted(sorted); }
//========================================================================== // // // //========================================================================== void GLDrawList::DoDrawSorted(SortNode * head) { do { if (head->left) { DoDrawSorted(head->left); } DoDraw(GLPASS_TRANSLUCENT, head->itemindex); if (head->equal) { SortNode * ehead=head->equal; while (ehead) { DoDraw(GLPASS_TRANSLUCENT, ehead->itemindex); ehead=ehead->equal; } } } while ((head=head->right)); }