CLight::CLight (GLvector pos, GLrgba color, int size) { _position = pos; _color = color; _size = CLAMP (size, 0, (MAX_SIZE - 1)); _vert_size = (float)_size + 0.5f; _flat_size = _vert_size + 0.5f; _blink = false; _cell_x = WORLD_TO_GRID(pos.x); _cell_z = WORLD_TO_GRID(pos.z); _next = head; head = this; count++; }
static void do_compile () { ent_list_t::iterator i; int x, y; if (compiled) return; x = compile_x; y = compile_y; //Changing textures is pretty expensive, and thus sorting the entites so that //they are grouped by texture used can really improve framerate. //qsort (entity_list, entity_count, sizeof (struct entity), do_compare); //sorted = true; //Now group entites on the grid //make a list for the textured objects in this region if (!cell_list[x][y].list_textured) cell_list[x][y].list_textured = glGenLists(1); glNewList (cell_list[x][y].list_textured, GL_COMPILE); cell_list[x][y].pos = glVector (GRID_TO_WORLD(x), 0.0f, (float)y * GRID_RESOLUTION); for (i = entity_list.begin(); i < entity_list.end(); ++i) { GLvector pos = (*i)->Center (); if (WORLD_TO_GRID(pos.x) == x && WORLD_TO_GRID(pos.z) == y && !(*i)->Alpha ()) { glBindTexture(GL_TEXTURE_2D, (*i)->Texture ()); (*i)->Render (); } } glEndList(); //Make a list of flat-color stuff (A/C units, ledges, roofs, etc.) if (!cell_list[x][y].list_flat) cell_list[x][y].list_flat = glGenLists(1); glNewList (cell_list[x][y].list_flat, GL_COMPILE); glEnable (GL_CULL_FACE); cell_list[x][y].pos = glVector (GRID_TO_WORLD(x), 0.0f, (float)y * GRID_RESOLUTION); for (i = entity_list.begin(); i < entity_list.end(); ++i) { GLvector pos = (*i)->Center (); if (WORLD_TO_GRID(pos.x) == x && WORLD_TO_GRID(pos.z) == y && !(*i)->Alpha ()) { (*i)->RenderFlat (false); } } glEndList(); //Now a list of flat-colored stuff that will be wireframe friendly if (!cell_list[x][y].list_flat_wireframe) cell_list[x][y].list_flat_wireframe = glGenLists(1); glNewList (cell_list[x][y].list_flat_wireframe, GL_COMPILE); glEnable (GL_CULL_FACE); cell_list[x][y].pos = glVector (GRID_TO_WORLD(x), 0.0f, (float)y * GRID_RESOLUTION); for (i = entity_list.begin(); i < entity_list.end(); ++i) { GLvector pos = (*i)->Center (); if (WORLD_TO_GRID(pos.x) == x && WORLD_TO_GRID(pos.z) == y && !(*i)->Alpha ()) { (*i)->RenderFlat (true); } } glEndList(); //Now a list of stuff to be alpha-blended, and thus rendered last if (!cell_list[x][y].list_alpha) cell_list[x][y].list_alpha = glGenLists(1); glNewList (cell_list[x][y].list_alpha, GL_COMPILE); cell_list[x][y].pos = glVector (GRID_TO_WORLD(x), 0.0f, (float)y * GRID_RESOLUTION); glDepthMask (false); glEnable (GL_BLEND); glDisable (GL_CULL_FACE); for (i = entity_list.begin(); i < entity_list.end(); ++i) { GLvector pos = (*i)->Center (); if (WORLD_TO_GRID(pos.x) == x && WORLD_TO_GRID(pos.z) == y && (*i)->Alpha ()) { glBindTexture(GL_TEXTURE_2D, (*i)->Texture ()); (*i)->Render (); } } glDepthMask (true); glEndList(); //now walk the grid compile_x++; if (compile_x == GRID_SIZE) { compile_x = 0; compile_y++; if (compile_y == GRID_SIZE) compiled = true; compile_end = GetTimeInMillis (); } compile_count++; }