summaryrefslogtreecommitdiff
path: root/indra/newview/lldrawpooltree.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'indra/newview/lldrawpooltree.cpp')
-rw-r--r--indra/newview/lldrawpooltree.cpp170
1 files changed, 19 insertions, 151 deletions
diff --git a/indra/newview/lldrawpooltree.cpp b/indra/newview/lldrawpooltree.cpp
index a6e0151114..3165a3516c 100644
--- a/indra/newview/lldrawpooltree.cpp
+++ b/indra/newview/lldrawpooltree.cpp
@@ -65,17 +65,18 @@ void LLDrawPoolTree::beginRenderPass(S32 pass)
if (LLPipeline::sUnderWaterRender)
{
- shader = &gObjectAlphaMaskNonIndexedWaterProgram;
+ shader = &gTreeWaterProgram;
}
else
{
- shader = &gObjectAlphaMaskNonIndexedProgram;
+ shader = &gTreeProgram;
}
if (gPipeline.canUseVertexShaders())
{
shader->bind();
- shader->setAlphaRange(0.5f, 1.f);
+ shader->setMinimumAlpha(0.5f);
+ gGL.diffuseColor4f(1,1,1,1);
}
else
{
@@ -96,25 +97,18 @@ void LLDrawPoolTree::render(S32 pass)
LLGLState test(GL_ALPHA_TEST, LLGLSLShader::sNoFixedFunction ? 0 : 1);
LLOverrideFaceColor color(this, 1.f, 1.f, 1.f, 1.f);
- if (gSavedSettings.getBOOL("RenderAnimateTrees"))
- {
- renderTree();
- }
- else
+ gGL.getTexUnit(sDiffTex)->bind(mTexturep);
+
+ for (std::vector<LLFace*>::iterator iter = mDrawFace.begin();
+ iter != mDrawFace.end(); iter++)
{
- gGL.getTexUnit(sDiffTex)->bind(mTexturep);
-
- for (std::vector<LLFace*>::iterator iter = mDrawFace.begin();
- iter != mDrawFace.end(); iter++)
+ LLFace *face = *iter;
+ LLVertexBuffer* buff = face->getVertexBuffer();
+ if(buff)
{
- LLFace *face = *iter;
- LLVertexBuffer* buff = face->getVertexBuffer();
- if(buff)
- {
- buff->setBuffer(LLDrawPoolTree::VERTEX_DATA_MASK);
- buff->drawRange(LLRender::TRIANGLES, 0, buff->getRequestedVerts()-1, buff->getRequestedIndices(), 0);
- gPipeline.addTrianglesDrawn(buff->getRequestedIndices());
- }
+ buff->setBuffer(LLDrawPoolTree::VERTEX_DATA_MASK);
+ buff->drawRange(LLRender::TRIANGLES, 0, buff->getNumVerts()-1, buff->getNumIndices(), 0);
+ gPipeline.addTrianglesDrawn(buff->getNumIndices());
}
}
}
@@ -141,9 +135,9 @@ void LLDrawPoolTree::beginDeferredPass(S32 pass)
{
LLFastTimer t(FTM_RENDER_TREES);
- shader = &gDeferredNonIndexedDiffuseAlphaMaskProgram;
+ shader = &gDeferredTreeProgram;
shader->bind();
- shader->setAlphaRange(0.5f, 1.f);
+ shader->setMinimumAlpha(0.5f);
}
void LLDrawPoolTree::renderDeferred(S32 pass)
@@ -168,8 +162,8 @@ void LLDrawPoolTree::beginShadowPass(S32 pass)
glPolygonOffset(gSavedSettings.getF32("RenderDeferredTreeShadowOffset"),
gSavedSettings.getF32("RenderDeferredTreeShadowBias"));
- gDeferredShadowAlphaMaskProgram.bind();
- gDeferredShadowAlphaMaskProgram.setAlphaRange(0.5f, 1.f);
+ gDeferredTreeShadowProgram.bind();
+ gDeferredTreeShadowProgram.setMinimumAlpha(0.5f);
}
void LLDrawPoolTree::renderShadow(S32 pass)
@@ -183,133 +177,7 @@ void LLDrawPoolTree::endShadowPass(S32 pass)
glPolygonOffset(gSavedSettings.getF32("RenderDeferredSpotShadowOffset"),
gSavedSettings.getF32("RenderDeferredSpotShadowBias"));
-}
-
-
-void LLDrawPoolTree::renderTree(BOOL selecting)
-{
- LLGLState normalize(GL_NORMALIZE, TRUE);
-
- // Bind the texture for this tree.
- gGL.getTexUnit(sDiffTex)->bind(mTexturep.get(), TRUE);
-
- U32 indices_drawn = 0;
-
- glMatrixMode(GL_MODELVIEW);
-
- for (std::vector<LLFace*>::iterator iter = mDrawFace.begin();
- iter != mDrawFace.end(); iter++)
- {
- LLFace *face = *iter;
- LLDrawable *drawablep = face->getDrawable();
-
- if (drawablep->isDead() || !face->getVertexBuffer())
- {
- continue;
- }
-
- face->getVertexBuffer()->setBuffer(LLDrawPoolTree::VERTEX_DATA_MASK);
- U16* indicesp = (U16*) face->getVertexBuffer()->getIndicesPointer();
-
- // Render each of the trees
- LLVOTree *treep = (LLVOTree *)drawablep->getVObj().get();
-
- LLColor4U color(255,255,255,255);
-
- if (!selecting || treep->mGLName != 0)
- {
- if (selecting)
- {
- S32 name = treep->mGLName;
-
- color = LLColor4U((U8)(name >> 16), (U8)(name >> 8), (U8)name, 255);
- }
-
- gGLLastMatrix = NULL;
- glLoadMatrixd(gGLModelView);
- //glPushMatrix();
- F32 mat[16];
- for (U32 i = 0; i < 16; i++)
- mat[i] = (F32) gGLModelView[i];
-
- LLMatrix4 matrix(mat);
-
- // Translate to tree base HACK - adjustment in Z plants tree underground
- const LLVector3 &pos_agent = treep->getPositionAgent();
- //glTranslatef(pos_agent.mV[VX], pos_agent.mV[VY], pos_agent.mV[VZ] - 0.1f);
- LLMatrix4 trans_mat;
- trans_mat.setTranslation(pos_agent.mV[VX], pos_agent.mV[VY], pos_agent.mV[VZ] - 0.1f);
- trans_mat *= matrix;
-
- // Rotate to tree position and bend for current trunk/wind
- // Note that trunk stiffness controls the amount of bend at the trunk as
- // opposed to the crown of the tree
- //
- const F32 TRUNK_STIFF = 22.f;
-
- LLQuaternion rot =
- LLQuaternion(treep->mTrunkBend.magVec()*TRUNK_STIFF*DEG_TO_RAD, LLVector4(treep->mTrunkBend.mV[VX], treep->mTrunkBend.mV[VY], 0)) *
- LLQuaternion(90.f*DEG_TO_RAD, LLVector4(0,0,1)) *
- treep->getRotation();
-
- LLMatrix4 rot_mat(rot);
- rot_mat *= trans_mat;
-
- F32 radius = treep->getScale().magVec()*0.05f;
- LLMatrix4 scale_mat;
- scale_mat.mMatrix[0][0] =
- scale_mat.mMatrix[1][1] =
- scale_mat.mMatrix[2][2] = radius;
-
- scale_mat *= rot_mat;
-
- const F32 THRESH_ANGLE_FOR_BILLBOARD = 15.f;
- const F32 BLEND_RANGE_FOR_BILLBOARD = 3.f;
-
- F32 droop = treep->mDroop + 25.f*(1.f - treep->mTrunkBend.magVec());
-
- S32 stop_depth = 0;
- F32 app_angle = treep->getAppAngle()*LLVOTree::sTreeFactor;
- F32 alpha = 1.0;
- S32 trunk_LOD = LLVOTree::sMAX_NUM_TREE_LOD_LEVELS;
-
- for (S32 j = 0; j < 4; j++)
- {
-
- if (app_angle > LLVOTree::sLODAngles[j])
- {
- trunk_LOD = j;
- break;
- }
- }
- if(trunk_LOD >= LLVOTree::sMAX_NUM_TREE_LOD_LEVELS)
- {
- continue ; //do not render.
- }
-
- if (app_angle < (THRESH_ANGLE_FOR_BILLBOARD - BLEND_RANGE_FOR_BILLBOARD))
- {
- //
- // Draw only the billboard
- //
- // Only the billboard, can use closer to normal alpha func.
- stop_depth = -1;
- LLFacePool::LLOverrideFaceColor clr(this, color);
- indices_drawn += treep->drawBranchPipeline(scale_mat, indicesp, trunk_LOD, stop_depth, treep->mDepth, treep->mTrunkDepth, 1.0, treep->mTwist, droop, treep->mBranches, alpha);
- }
- else // if (app_angle > (THRESH_ANGLE_FOR_BILLBOARD + BLEND_RANGE_FOR_BILLBOARD))
- {
- //
- // Draw only the full geometry tree
- //
- //stop_depth = (app_angle < THRESH_ANGLE_FOR_RECURSION_REDUCTION);
- LLFacePool::LLOverrideFaceColor clr(this, color);
- indices_drawn += treep->drawBranchPipeline(scale_mat, indicesp, trunk_LOD, stop_depth, treep->mDepth, treep->mTrunkDepth, 1.0, treep->mTwist, droop, treep->mBranches, alpha);
- }
-
- //glPopMatrix();
- }
- }
+ gDeferredTreeShadowProgram.unbind();
}
BOOL LLDrawPoolTree::verify() const