void CBasicTreeSquareDrawer::DrawQuad (int x,int y) { int treesX = td->treesX; CBasicTreeDrawer::TreeSquareStruct* tss=&td->trees[y*treesX+x]; float3 dif; dif.x=camera->pos.x-(x*SQUARE_SIZE*TREE_SQUARE_SIZE + SQUARE_SIZE*TREE_SQUARE_SIZE/2); dif.y=0; dif.z=camera->pos.z-(y*SQUARE_SIZE*TREE_SQUARE_SIZE + SQUARE_SIZE*TREE_SQUARE_SIZE/2); float dist=dif.Length(); dif/=dist; if(dist<SQUARE_SIZE*TREE_SQUARE_SIZE*treeDistance*2 && dist>SQUARE_SIZE*TREE_SQUARE_SIZE*(treeDistance)){//far trees tss->lastSeenFar=gs->frameNum; if(!tss->farDisplist || dif.dot(tss->viewVector)<0.97f){ va=GetVertexArray(); va->Initialize(); va->EnlargeArrays(4*tss->trees.size(),0,VA_SIZE_T); //!alloc room for all tree vertexes tss->viewVector=dif; if(!tss->farDisplist) tss->farDisplist=glGenLists(1); float3 up(0,1,0); float3 side=up.cross(dif); for(std::map<int,CBasicTreeDrawer::TreeStruct>::iterator ti=tss->trees.begin();ti!=tss->trees.end();++ti){ CBasicTreeDrawer::TreeStruct* ts=&ti->second; if(ts->type<8){ DrawTreeVertexFar1(ts->pos, side*MAX_TREE_HEIGHT_3, false); } else { DrawTreeVertexFar2(ts->pos, side*MAX_TREE_HEIGHT_3, false); } } glNewList(tss->farDisplist,GL_COMPILE); va->DrawArrayT(GL_QUADS); glEndList(); } if(dist>SQUARE_SIZE*TREE_SQUARE_SIZE*(treeDistance*2-1)){ float trans=(SQUARE_SIZE*TREE_SQUARE_SIZE*treeDistance*2-dist)/(SQUARE_SIZE*TREE_SQUARE_SIZE); glEnable(GL_BLEND); glColor4f(1,1,1,trans); glAlphaFunc(GL_GREATER,(SQUARE_SIZE*TREE_SQUARE_SIZE*treeDistance*2-dist)/(SQUARE_SIZE*TREE_SQUARE_SIZE*2)); } else { glColor4f(1,1,1,1); glDisable(GL_BLEND); glAlphaFunc(GL_GREATER,0.5f); } glCallList(tss->farDisplist); } if(dist<SQUARE_SIZE*TREE_SQUARE_SIZE*treeDistance){ //middle distance trees tss->lastSeen=gs->frameNum; if(!tss->displist){ va=GetVertexArray(); va->Initialize(); va->EnlargeArrays(12*tss->trees.size(),0,VA_SIZE_T); //!alloc room for all tree vertexes tss->displist=glGenLists(1); for(std::map<int,CBasicTreeDrawer::TreeStruct>::iterator ti=tss->trees.begin();ti!=tss->trees.end();++ti){ CBasicTreeDrawer::TreeStruct* ts=&ti->second; if(ts->type<8) DrawTreeVertexMid1(ts->pos, false); else DrawTreeVertexMid2(ts->pos, false); } glNewList(tss->displist,GL_COMPILE); va->DrawArrayT(GL_QUADS); glEndList(); } glColor4f(1,1,1,1); glDisable(GL_BLEND); glAlphaFunc(GL_GREATER,0.5f); glCallList(tss->displist); } }
void DrawQuad(int x, int y) { ITreeDrawer::TreeSquareStruct* tss = &td->trees[(y * td->treesX) + x]; float3 dif; dif.x = camera->GetPos().x - ((x * SQUARE_SIZE * TREE_SQUARE_SIZE) + (SQUARE_SIZE * TREE_SQUARE_SIZE / 2)); dif.y = 0.0f; dif.z = camera->GetPos().z - ((y * SQUARE_SIZE * TREE_SQUARE_SIZE) + (SQUARE_SIZE * TREE_SQUARE_SIZE / 2)); const float dist = dif.Length(); const float distFactor = dist / treeDistance; dif.Normalize(); const float3 side = UpVector.cross(dif); if (distFactor < MID_TREE_DIST_FACTOR) { // midle distance trees tss->lastSeen = gs->frameNum; if (tss->dispList == 0) { tss->dispList = glGenLists(1); va = GetVertexArray(); va->Initialize(); va->EnlargeArrays(12 * tss->trees.size(), 0, VA_SIZE_T); //!alloc room for all tree vertexes for (std::map<int, ITreeDrawer::TreeStruct>::iterator ti = tss->trees.begin(); ti != tss->trees.end(); ++ti) { const ITreeDrawer::TreeStruct* ts = &ti->second; const CFeature* f = featureHandler->GetFeature(ts->id); if (!f->IsInLosForAllyTeam(gu->myAllyTeam)) continue; if (ts->type < 8) DrawTreeVertexMid1(ts->pos, false); else DrawTreeVertexMid2(ts->pos, false); } glNewList(tss->dispList, GL_COMPILE); va->DrawArrayT(GL_QUADS); glEndList(); } glColor4f(1, 1, 1, 1); glDisable(GL_BLEND); glAlphaFunc(GL_GREATER, 0.5f); glCallList(tss->dispList); return; } if (distFactor < FAR_TREE_DIST_FACTOR) { // far trees tss->lastSeenFar = gs->frameNum; if ((tss->farDispList == 0) || (dif.dot(tss->viewVector) < 0.97f)) { if (tss->farDispList == 0) tss->farDispList = glGenLists(1); va = GetVertexArray(); va->Initialize(); va->EnlargeArrays(4 * tss->trees.size(), 0, VA_SIZE_T); //!alloc room for all tree vertexes tss->viewVector = dif; for (std::map<int, ITreeDrawer::TreeStruct>::iterator ti = tss->trees.begin(); ti != tss->trees.end(); ++ti) { const ITreeDrawer::TreeStruct* ts = &ti->second; const CFeature* f = featureHandler->GetFeature(ts->id); if (!f->IsInLosForAllyTeam(gu->myAllyTeam)) continue; if (ts->type < 8) { DrawTreeVertexFar1(ts->pos, side * MAX_TREE_HEIGHT_3, false); } else { DrawTreeVertexFar2(ts->pos, side * MAX_TREE_HEIGHT_3, false); } } glNewList(tss->farDispList, GL_COMPILE); va->DrawArrayT(GL_QUADS); glEndList(); } if (distFactor > FADE_TREE_DIST_FACTOR){ // faded far trees const float trans = 1.0f - (distFactor - FADE_TREE_DIST_FACTOR) / (FAR_TREE_DIST_FACTOR - FADE_TREE_DIST_FACTOR); glEnable(GL_BLEND); glColor4f(1, 1, 1, trans); glAlphaFunc(GL_GREATER, trans / 2.0f); } else { glColor4f(1, 1, 1, 1); glDisable(GL_BLEND); glAlphaFunc(GL_GREATER, 0.5f); } glCallList(tss->farDispList); } }