summaryrefslogtreecommitdiff
path: root/indra/newview/llface.cpp
diff options
context:
space:
mode:
authorJosh Bell <josh@lindenlab.com>2008-07-22 20:55:02 +0000
committerJosh Bell <josh@lindenlab.com>2008-07-22 20:55:02 +0000
commit35b4a91129bc3da3476e7f9d8d8eb923a621cc3e (patch)
tree2906124fe8371b6336e6f7231cd890d267a75d6d /indra/newview/llface.cpp
parentdf4f20d4f51e41355e876f734527b4245543415c (diff)
svn merge -r92710:92709 svn+ssh://svn.lindenlab.com/svn/linden/release --> release
Undo r92710 (for QAR-698) - went straight into release instead of a side branch for validation.
Diffstat (limited to 'indra/newview/llface.cpp')
-rw-r--r--indra/newview/llface.cpp238
1 files changed, 132 insertions, 106 deletions
diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp
index 16668f81e2..b2f5caa57d 100644
--- a/indra/newview/llface.cpp
+++ b/indra/newview/llface.cpp
@@ -54,6 +54,8 @@
#define LL_MAX_INDICES_COUNT 1000000
+extern BOOL gPickFaces;
+
BOOL LLFace::sSafeRenderSelect = TRUE; // FALSE
#define DOTVEC(a,b) (a.mV[0]*b.mV[0] + a.mV[1]*b.mV[1] + a.mV[2]*b.mV[2])
@@ -71,15 +73,14 @@ The resulting texture coordinate <u,v> is:
u = 2(B dot P)
v = 2(T dot P)
*/
-void planarProjection(LLVector2 &tc, const LLVector3& normal,
- const LLVector3 &mCenter, const LLVector3& vec)
+void planarProjection(LLVector2 &tc, const LLVolumeFace::VertexData &vd, const LLVector3 &mCenter, const LLVector3& vec)
{ //DONE!
LLVector3 binormal;
- float d = normal * LLVector3(1,0,0);
+ float d = vd.mNormal * LLVector3(1,0,0);
if (d >= 0.5f || d <= -0.5f)
{
binormal = LLVector3(0,1,0);
- if (normal.mV[0] < 0)
+ if (vd.mNormal.mV[0] < 0)
{
binormal = -binormal;
}
@@ -87,19 +88,18 @@ void planarProjection(LLVector2 &tc, const LLVector3& normal,
else
{
binormal = LLVector3(1,0,0);
- if (normal.mV[1] > 0)
+ if (vd.mNormal.mV[1] > 0)
{
binormal = -binormal;
}
}
- LLVector3 tangent = binormal % normal;
+ LLVector3 tangent = binormal % vd.mNormal;
tc.mV[1] = -((tangent*vec)*2 - 0.5f);
tc.mV[0] = 1.0f+((binormal*vec)*2 - 0.5f);
}
-void sphericalProjection(LLVector2 &tc, const LLVector3& normal,
- const LLVector3 &mCenter, const LLVector3& vec)
+void sphericalProjection(LLVector2 &tc, const LLVolumeFace::VertexData &vd, const LLVector3 &mCenter, const LLVector3& vec)
{ //BROKEN
/*tc.mV[0] = acosf(vd.mNormal * LLVector3(1,0,0))/3.14159f;
@@ -110,7 +110,7 @@ void sphericalProjection(LLVector2 &tc, const LLVector3& normal,
}*/
}
-void cylindricalProjection(LLVector2 &tc, const LLVector3& normal, const LLVector3 &mCenter, const LLVector3& vec)
+void cylindricalProjection(LLVector2 &tc, const LLVolumeFace::VertexData &vd, const LLVector3 &mCenter, const LLVector3& vec)
{ //BROKEN
/*LLVector3 binormal;
float d = vd.mNormal * LLVector3(1,0,0);
@@ -374,7 +374,7 @@ void LLFace::renderForSelect(U32 data_mask)
#if !LL_RELEASE_FOR_DOWNLOAD
LLGLState::checkClientArrays(data_mask);
#endif
- if (mTEOffset != -1)
+ if (gPickFaces && mTEOffset != -1)
{
// mask off high 4 bits (16 total possible faces)
color.mV[0] &= 0x0f;
@@ -419,11 +419,12 @@ void LLFace::renderSelected(LLImageGL *imagep, const LLColor4& color)
if (mGeomCount > 0 && mIndicesCount > 0)
{
- gGL.color4fv(color.mV);
+ LLGLSPipelineAlpha gls_pipeline_alpha;
+ glColor4fv(color.mV);
LLViewerImage::bindTexture(imagep);
- gGL.pushMatrix();
+ glPushMatrix();
if (mDrawablep->isActive())
{
glMultMatrixf((GLfloat*)mDrawablep->getRenderMatrix().mMatrix);
@@ -433,49 +434,137 @@ void LLFace::renderSelected(LLImageGL *imagep, const LLColor4& color)
glMultMatrixf((GLfloat*)mDrawablep->getRegion()->mRenderMatrix.mMatrix);
}
- mVertexBuffer->setBuffer(LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD);
+ mVertexBuffer->setBuffer(LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_NORMAL | LLVertexBuffer::MAP_TEXCOORD);
#if !LL_RELEASE_FOR_DOWNLOAD
- LLGLState::checkClientArrays(LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD);
+ LLGLState::checkClientArrays(LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_NORMAL | LLVertexBuffer::MAP_TEXCOORD);
#endif
mVertexBuffer->draw(LLVertexBuffer::TRIANGLES, mIndicesCount, mIndicesIndex);
- gGL.popMatrix();
+ glPopMatrix();
}
}
-
-/* removed in lieu of raycast uv detection
-void LLFace::renderSelectedUV()
+void LLFace::renderSelectedUV(const S32 offset, const S32 count)
{
+#if 0
LLViewerImage* red_blue_imagep = gImageList.getImageFromFile("uv_test1.j2c", TRUE, TRUE);
LLViewerImage* green_imagep = gImageList.getImageFromFile("uv_test2.tga", TRUE, TRUE);
- LLGLSUVSelect object_select;
+ LLGLSObjectSelect object_select;
+ LLGLEnable blend(GL_BLEND);
+
+ if (!mDrawPoolp || !getIndicesCount() || getIndicesStart() < 0)
+ {
+ return;
+ }
+ for (S32 pass = 0; pass < 2; pass++)
+ {
+ static F32 bias = 0.f;
+ static F32 factor = -10.f;
+ if (mGeomCount > 0)
+ {
+ gGL.color4fv(LLColor4::white.mV);
+
+ if (pass == 0)
+ {
+ LLViewerImage::bindTexture(red_blue_imagep);
+ red_blue_imagep->setMipFilterNearest (TRUE, TRUE);
+ }
+ else // pass == 1
+ {
+ gGL.blendFunc(GL_ONE, GL_ONE);
+ LLViewerImage::bindTexture(green_imagep);
+ glMatrixMode(GL_TEXTURE);
+ glPushMatrix();
+ glScalef(256.f, 256.f, 1.f);
+ green_imagep->setMipFilterNearest (TRUE, TRUE);
+ }
+
+
+ if (!isState(GLOBAL))
+ {
+ // Apply the proper transform for non-global objects.
+ glMatrixMode(GL_MODELVIEW);
+ glPushMatrix();
+ glMultMatrixf((float*)getRenderMatrix().mMatrix);
+ }
+
+ glEnable(GL_POLYGON_OFFSET_FILL);
+ glPolygonOffset(factor, bias);
+ if (sSafeRenderSelect)
+ {
+ gGL.begin(LLVertexBuffer::TRIANGLES);
+ if (count)
+ {
+ for (S32 i = offset; i < offset + count; i++)
+ {
+ LLVector2 tc = mDrawPoolp->getTexCoord(mDrawPoolp->getIndex(getIndicesStart() + i), 0);
+ gGL.texCoord2fv(tc.mV);
+ LLVector3 vertex = mDrawPoolp->getVertex(mDrawPoolp->getIndex(getIndicesStart() + i));
+ gGL.vertex3fv(vertex.mV);
+ }
+ }
+ else
+ {
+ for (U32 i = 0; i < getIndicesCount(); i++)
+ {
+ LLVector2 tc = mDrawPoolp->getTexCoord(mDrawPoolp->getIndex(getIndicesStart() + i), 0);
+ gGL.texCoord2fv(tc.mV);
+ LLVector3 vertex = mDrawPoolp->getVertex(mDrawPoolp->getIndex(getIndicesStart() + i));
+ gGL.vertex3fv(vertex.mV);
+ }
+ }
+ gGL.end();
+ }
+ else
+ {
+ llassert(mGeomIndex >= 0);
+ if (count)
+ {
+ if (mIndicesCount > 0)
+ {
+ glDrawElements(GL_TRIANGLES, count, GL_UNSIGNED_SHORT, getRawIndices() + offset);
+ }
+ else
+ {
+ llerrs << "Rendering non-indexed volume face!" << llendl;
+ glDrawArrays(mPrimType, mGeomIndex, mGeomCount);
+ }
+ }
+ else
+ {
+ if (mIndicesCount > 0)
+ {
+ glDrawElements(GL_TRIANGLES, mIndicesCount, GL_UNSIGNED_SHORT, getRawIndices());
+ }
+ else
+ {
+ glDrawArrays(GL_TRIANGLES, mGeomIndex, mGeomCount);
+ }
+ }
+ }
- // use red/blue gradient to get coarse UV coordinates
- renderSelected(red_blue_imagep, LLColor4::white);
+ glDisable(GL_POLYGON_OFFSET_FILL);
+ if (!isState(GLOBAL))
+ {
+ // Restore the tranform for non-global objects
+ glPopMatrix();
+ }
+ if (pass == 1)
+ {
+ glMatrixMode(GL_TEXTURE);
+ glPopMatrix();
+ glMatrixMode(GL_MODELVIEW);
+ gGL.blendFunc(GL_DST_ALPHA, GL_ONE_MINUS_DST_ALPHA);
+ }
+ }
+ }
- static F32 bias = 0.f;
- static F32 factor = -10.f;
- glPolygonOffset(factor, bias);
-
- // add green dither pattern on top of red/blue gradient
- gGL.blendFunc(LLRender::BF_ONE, LLRender::BF_ONE);
- glMatrixMode(GL_TEXTURE);
- glPushMatrix();
- // make green pattern repeat once per texel in red/blue texture
- glScalef(256.f, 256.f, 1.f);
- glMatrixMode(GL_MODELVIEW);
-
- renderSelected(green_imagep, LLColor4::white);
-
- glMatrixMode(GL_TEXTURE);
- glPopMatrix();
- glMatrixMode(GL_MODELVIEW);
- gGL.blendFunc(LLRender::BF_SOURCE_ALPHA, LLRender::BF_ONE_MINUS_SOURCE_ALPHA);
+ //restore blend func
+ gGL.blendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+#endif
}
-*/
void LLFace::printDebugInfo() const
{
@@ -671,69 +760,6 @@ BOOL LLFace::genVolumeBBoxes(const LLVolume &volume, S32 f,
return TRUE;
}
-
-
-// convert surface coordinates to texture coordinates, based on
-// the values in the texture entry. probably should be
-// integrated with getGeometryVolume() for its texture coordinate
-// generation - but i'll leave that to someone more familiar
-// with the implications.
-LLVector2 LLFace::surfaceToTexture(LLVector2 surface_coord, LLVector3 position, LLVector3 normal)
-{
- LLVector2 tc = surface_coord;
-
- const LLTextureEntry *tep = getTextureEntry();
-
- if (tep == NULL)
- {
- // can't do much without the texture entry
- return surface_coord;
- }
-
- // see if we have a non-default mapping
- U8 texgen = getTextureEntry()->getTexGen();
- if (texgen != LLTextureEntry::TEX_GEN_DEFAULT)
- {
- LLVector3 center = mDrawablep->getVOVolume()->getVolume()->getVolumeFace(mTEOffset).mCenter;
-
- LLVector3 scale = (mDrawablep->getVOVolume()->isVolumeGlobal()) ? LLVector3(1,1,1) : mVObjp->getScale();
- LLVector3 vec = position;
- vec.scaleVec(scale);
-
- switch (texgen)
- {
- case LLTextureEntry::TEX_GEN_PLANAR:
- planarProjection(tc, normal, center, vec);
- break;
- case LLTextureEntry::TEX_GEN_SPHERICAL:
- sphericalProjection(tc, normal, center, vec);
- break;
- case LLTextureEntry::TEX_GEN_CYLINDRICAL:
- cylindricalProjection(tc, normal, center, vec);
- break;
- default:
- break;
- }
- }
-
- if (mTextureMatrix) // if we have a texture matrix, use it
- {
- LLVector3 tc3(tc);
- tc3 = tc3 * *mTextureMatrix;
- tc = LLVector2(tc3);
- }
-
- else // otherwise use the texture entry parameters
- {
- xform(tc, cos(tep->getRotation()), sin(tep->getRotation()),
- tep->mOffsetS, tep->mOffsetT, tep->mScaleS, tep->mScaleT);
- }
-
-
- return tc;
-}
-
-
BOOL LLFace::getGeometryVolume(const LLVolume& volume,
const S32 &f,
const LLMatrix4& mat_vert, const LLMatrix3& mat_normal,
@@ -1013,13 +1039,13 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
switch (texgen)
{
case LLTextureEntry::TEX_GEN_PLANAR:
- planarProjection(tc, vf.mVertices[i].mNormal, vf.mCenter, vec);
+ planarProjection(tc, vf.mVertices[i], vf.mCenter, vec);
break;
case LLTextureEntry::TEX_GEN_SPHERICAL:
- sphericalProjection(tc, vf.mVertices[i].mNormal, vf.mCenter, vec);
+ sphericalProjection(tc, vf.mVertices[i], vf.mCenter, vec);
break;
case LLTextureEntry::TEX_GEN_CYLINDRICAL:
- cylindricalProjection(tc, vf.mVertices[i].mNormal, vf.mCenter, vec);
+ cylindricalProjection(tc, vf.mVertices[i], vf.mCenter, vec);
break;
default:
break;