Huge renderer update (WIP). Still plenty to do, especially pertaining to UI.
-Nametag bubble visbility is oddly inconsistent. May vanish with future planned UI merges... -VBOs are PAINFULLY slow on ATI hardware. This repos self-compiled davep/shining-fixes branch, so I'll leave the ball in LL's court for now regarding that.
This commit is contained in:
@@ -41,106 +41,12 @@
|
||||
|
||||
#include "llglheaders.h"
|
||||
|
||||
GLUquadricObj *gQuadObj2 = NULL;
|
||||
LLRenderSphere gSphere;
|
||||
|
||||
void drawSolidSphere(GLdouble radius, GLint slices, GLint stacks);
|
||||
|
||||
void drawSolidSphere(GLdouble radius, GLint slices, GLint stacks)
|
||||
{
|
||||
if (!gQuadObj2)
|
||||
{
|
||||
gQuadObj2 = gluNewQuadric();
|
||||
if (!gQuadObj2)
|
||||
{
|
||||
llwarns << "drawSolidSphere couldn't allocate quadric" << llendl;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
gluQuadricDrawStyle(gQuadObj2, GLU_FILL);
|
||||
gluQuadricNormals(gQuadObj2, GLU_SMOOTH);
|
||||
// If we ever changed/used the texture or orientation state
|
||||
// of quadObj, we'd need to change it to the defaults here
|
||||
// with gluQuadricTexture and/or gluQuadricOrientation.
|
||||
gluQuadricTexture(gQuadObj2, GL_TRUE);
|
||||
gluSphere(gQuadObj2, radius, slices, stacks);
|
||||
}
|
||||
|
||||
|
||||
// A couple thoughts on sphere drawing:
|
||||
// 1) You need more slices than stacks, but little less than 2:1
|
||||
// 2) At low LOD, setting stacks to an odd number avoids a "band" around the equator, making things look smoother
|
||||
void LLRenderSphere::prerender()
|
||||
{
|
||||
// Create a series of display lists for different LODs
|
||||
mDList[0] = glGenLists(1);
|
||||
glNewList(mDList[0], GL_COMPILE);
|
||||
drawSolidSphere(1.0, 30, 20);
|
||||
glEndList();
|
||||
|
||||
mDList[1] = glGenLists(1);
|
||||
glNewList(mDList[1], GL_COMPILE);
|
||||
drawSolidSphere(1.0, 20, 15);
|
||||
glEndList();
|
||||
|
||||
mDList[2] = glGenLists(1);
|
||||
glNewList(mDList[2], GL_COMPILE);
|
||||
drawSolidSphere(1.0, 12, 8);
|
||||
glEndList();
|
||||
|
||||
mDList[3] = glGenLists(1);
|
||||
glNewList(mDList[3], GL_COMPILE);
|
||||
drawSolidSphere(1.0, 8, 5);
|
||||
glEndList();
|
||||
}
|
||||
|
||||
void LLRenderSphere::cleanupGL()
|
||||
{
|
||||
for (S32 detail = 0; detail < 4; detail++)
|
||||
{
|
||||
glDeleteLists(mDList[detail], 1);
|
||||
mDList[detail] = 0;
|
||||
}
|
||||
|
||||
if (gQuadObj2)
|
||||
{
|
||||
gluDeleteQuadric(gQuadObj2);
|
||||
gQuadObj2 = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
// Constants here are empirically derived from my eyeballs, JNC
|
||||
//
|
||||
// The toughest adjustment is the cutoff for the lowest LOD
|
||||
// Maybe we should have more LODs at the low end?
|
||||
void LLRenderSphere::render(F32 pixel_area)
|
||||
{
|
||||
S32 level_of_detail;
|
||||
|
||||
if (pixel_area > 10000.f)
|
||||
{
|
||||
level_of_detail = 0;
|
||||
}
|
||||
else if (pixel_area > 800.f)
|
||||
{
|
||||
level_of_detail = 1;
|
||||
}
|
||||
else if (pixel_area > 100.f)
|
||||
{
|
||||
level_of_detail = 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
level_of_detail = 3;
|
||||
}
|
||||
glCallList(mDList[level_of_detail]);
|
||||
}
|
||||
|
||||
|
||||
void LLRenderSphere::render()
|
||||
{
|
||||
glCallList(mDList[0]);
|
||||
renderGGL();
|
||||
gGL.flush();
|
||||
}
|
||||
|
||||
inline LLVector3 polar_to_cart(F32 latitude, F32 longitude)
|
||||
|
||||
Reference in New Issue
Block a user