diff options
64 files changed, 946 insertions, 1005 deletions
diff --git a/indra/llcommon/llmemtype.h b/indra/llcommon/llmemtype.h index 9bf6cad9f7..2e275bd523 100644 --- a/indra/llcommon/llmemtype.h +++ b/indra/llcommon/llmemtype.h @@ -84,6 +84,9 @@ public: MTYPE_REGIONS, MTYPE_INVENTORY, MTYPE_ANIMATION, + MTYPE_VOLUME, + MTYPE_PRIMITIVE, + MTYPE_NETWORK, MTYPE_PHYSICS, MTYPE_INTERESTLIST, diff --git a/indra/llcommon/llversionviewer.h b/indra/llcommon/llversionviewer.h index a1fd0ff509..dbf1d3154b 100644 --- a/indra/llcommon/llversionviewer.h +++ b/indra/llcommon/llversionviewer.h @@ -34,7 +34,7 @@ const S32 LL_VERSION_MAJOR = 1; const S32 LL_VERSION_MINOR = 20; -const S32 LL_VERSION_PATCH = 2; +const S32 LL_VERSION_PATCH = 4; const S32 LL_VERSION_BUILD = 0; const char * const LL_CHANNEL = "Second Life Release"; diff --git a/indra/llimage/llimage.cpp b/indra/llimage/llimage.cpp index c8cfad84f6..2948675396 100644 --- a/indra/llimage/llimage.cpp +++ b/indra/llimage/llimage.cpp @@ -768,8 +768,8 @@ void LLImageRaw::copyScaled( LLImageRaw* src ) LLMemType mt1((LLMemType::EMemType)mMemType); LLImageRaw* dst = this; // Just for clarity. - llassert( (1 == src->getComponents()) || (3 == src->getComponents()) || (4 == src->getComponents()) ); - llassert( src->getComponents() == dst->getComponents() ); + llassert_always( (1 == src->getComponents()) || (3 == src->getComponents()) || (4 == src->getComponents()) ); + llassert_always( src->getComponents() == dst->getComponents() ); if( (src->getWidth() == dst->getWidth()) && (src->getHeight() == dst->getHeight()) ) { @@ -779,6 +779,7 @@ void LLImageRaw::copyScaled( LLImageRaw* src ) // Vertical S32 temp_data_size = src->getWidth() * dst->getHeight() * getComponents(); + llassert_always(temp_data_size > 0); U8* temp_buffer = new U8[ temp_data_size ]; for( S32 col = 0; col < src->getWidth(); col++ ) { diff --git a/indra/llmath/llvolume.cpp b/indra/llmath/llvolume.cpp index a0990c5fc1..f4052f336f 100644 --- a/indra/llmath/llvolume.cpp +++ b/indra/llmath/llvolume.cpp @@ -34,6 +34,7 @@ #include <set> #include "llerror.h" +#include "llmemtype.h" #include "llvolumemgr.h" #include "v2math.h" @@ -155,6 +156,8 @@ BOOL LLTriangleLineSegmentIntersect( const LLVector3& pt1, const LLVector3& pt2, LLProfile::Face* LLProfile::addCap(S16 faceID) { + LLMemType m1(LLMemType::MTYPE_VOLUME); + Face *face = vector_append(mFaces, 1); face->mIndex = 0; @@ -167,6 +170,8 @@ LLProfile::Face* LLProfile::addCap(S16 faceID) LLProfile::Face* LLProfile::addFace(S32 i, S32 count, F32 scaleU, S16 faceID, BOOL flat) { + LLMemType m1(LLMemType::MTYPE_VOLUME); + Face *face = vector_append(mFaces, 1); face->mIndex = i; @@ -182,8 +187,10 @@ LLProfile::Face* LLProfile::addFace(S32 i, S32 count, F32 scaleU, S16 faceID, BO // What is the bevel parameter used for? - DJS 04/05/02 // Bevel parameter is currently unused but presumedly would support // filleted and chamfered corners -void LLProfile::genNGon(S32 sides, F32 offset, F32 bevel, F32 ang_scale, S32 split) +void LLProfile::genNGon(const LLProfileParams& params, S32 sides, F32 offset, F32 bevel, F32 ang_scale, S32 split) { + LLMemType m1(LLMemType::MTYPE_VOLUME); + // Generate an n-sided "circular" path. // 0 is (1,0), and we go counter-clockwise along a circular path from there. const F32 tableScale[] = { 1, 1, 1, 0.5f, 0.707107f, 0.53f, 0.525f, 0.5f }; @@ -194,8 +201,8 @@ void LLProfile::genNGon(S32 sides, F32 offset, F32 bevel, F32 ang_scale, S32 spl mMaxX = 0.f; mMinX = 0.f; - F32 begin = mParams.getBegin(); - F32 end = mParams.getEnd(); + F32 begin = params.getBegin(); + F32 end = params.getEnd(); t_step = 1.0f / sides; ang_step = 2.0f*F_PI*t_step*ang_scale; @@ -311,7 +318,7 @@ void LLProfile::genNGon(S32 sides, F32 offset, F32 bevel, F32 ang_scale, S32 spl mConcave = FALSE; } mOpen = TRUE; - if (!isHollow()) + if (params.getHollow() <= 0) { // put center point if not hollow. mProfile.push_back(LLVector3(0,0,0)); @@ -327,7 +334,7 @@ void LLProfile::genNGon(S32 sides, F32 offset, F32 bevel, F32 ang_scale, S32 spl mTotal = mProfile.size(); } -void LLProfile::genNormals() +void LLProfile::genNormals(const LLProfileParams& params) { S32 count = mProfile.size(); @@ -347,8 +354,7 @@ void LLProfile::genNormals() LLVector2 pt0,pt1; - BOOL hollow; - hollow = isHollow(); + BOOL hollow = (params.getHollow() > 0); S32 i0, i1, i2, i3, i4; @@ -428,7 +434,7 @@ void LLProfile::genNormals() // Hollow is percent of the original bounding box, not of this particular // profile's geometry. Thus, a swept triangle needs lower hollow values than // a swept square. -LLProfile::Face* LLProfile::addHole(BOOL flat, F32 sides, F32 offset, F32 box_hollow, F32 ang_scale, S32 split) +LLProfile::Face* LLProfile::addHole(const LLProfileParams& params, BOOL flat, F32 sides, F32 offset, F32 box_hollow, F32 ang_scale, S32 split) { // Note that addHole will NOT work for non-"circular" profiles, if we ever decide to use them. @@ -436,11 +442,12 @@ LLProfile::Face* LLProfile::addHole(BOOL flat, F32 sides, F32 offset, F32 box_ho mTotalOut = mTotal; // Why is the "bevel" parameter -1? DJS 04/05/02 - genNGon(llfloor(sides),offset,-1, ang_scale, split); + genNGon(params, llfloor(sides),offset,-1, ang_scale, split); Face *face = addFace(mTotalOut, mTotal-mTotalOut,0,LL_FACE_INNER_SIDE, flat); - LLVector3 pt[128]; + std::vector<LLVector3> pt; + pt.resize(mTotal) ; for (S32 i=mTotalOut;i<mTotal;i++) { @@ -489,8 +496,10 @@ S32 sculpt_sides(F32 detail) } -BOOL LLProfile::generate(BOOL path_open,F32 detail, S32 split, BOOL is_sculpted) +BOOL LLProfile::generate(const LLProfileParams& params, BOOL path_open,F32 detail, S32 split, BOOL is_sculpted) { + LLMemType m1(LLMemType::MTYPE_VOLUME); + if ((!mDirty) && (!is_sculpted)) { return FALSE; @@ -508,9 +517,9 @@ BOOL LLProfile::generate(BOOL path_open,F32 detail, S32 split, BOOL is_sculpted) // Generate the face data S32 i; - F32 begin = mParams.getBegin(); - F32 end = mParams.getEnd(); - F32 hollow = mParams.getHollow(); + F32 begin = params.getBegin(); + F32 end = params.getEnd(); + F32 hollow = params.getHollow(); // Quick validation to eliminate some server crashes. if (begin > end - 0.01f) @@ -521,11 +530,11 @@ BOOL LLProfile::generate(BOOL path_open,F32 detail, S32 split, BOOL is_sculpted) S32 face_num = 0; - switch (mParams.getCurveType() & LL_PCODE_PROFILE_MASK) + switch (params.getCurveType() & LL_PCODE_PROFILE_MASK) { case LL_PCODE_PROFILE_SQUARE: { - genNGon(4,-0.375, 0, 1, split); + genNGon(params, 4,-0.375, 0, 1, split); if (path_open) { addCap (LL_FACE_PATH_BEGIN); @@ -544,20 +553,20 @@ BOOL LLProfile::generate(BOOL path_open,F32 detail, S32 split, BOOL is_sculpted) if (hollow) { - switch (mParams.getCurveType() & LL_PCODE_HOLE_MASK) + switch (params.getCurveType() & LL_PCODE_HOLE_MASK) { case LL_PCODE_HOLE_TRIANGLE: // This offset is not correct, but we can't change it now... DK 11/17/04 - addHole(TRUE, 3, -0.375f, hollow, 1.f, split); + addHole(params, TRUE, 3, -0.375f, hollow, 1.f, split); break; case LL_PCODE_HOLE_CIRCLE: // TODO: Compute actual detail levels for cubes - addHole(FALSE, MIN_DETAIL_FACES * detail, -0.375f, hollow, 1.f); + addHole(params, FALSE, MIN_DETAIL_FACES * detail, -0.375f, hollow, 1.f); break; case LL_PCODE_HOLE_SAME: case LL_PCODE_HOLE_SQUARE: default: - addHole(TRUE, 4, -0.375f, hollow, 1.f, split); + addHole(params, TRUE, 4, -0.375f, hollow, 1.f, split); break; } } @@ -571,7 +580,7 @@ BOOL LLProfile::generate(BOOL path_open,F32 detail, S32 split, BOOL is_sculpted) case LL_PCODE_PROFILE_RIGHTTRI: case LL_PCODE_PROFILE_EQUALTRI: { - genNGon(3,0, 0, 1, split); + genNGon(params, 3,0, 0, 1, split); for (i = 0; i <(S32) mProfile.size(); i++) { // Scale by 3 to generate proper tex coords. @@ -593,19 +602,19 @@ BOOL LLProfile::generate(BOOL path_open,F32 detail, S32 split, BOOL is_sculpted) // because the triangle doesn't fill the bounding box. F32 triangle_hollow = hollow / 2.f; - switch (mParams.getCurveType() & LL_PCODE_HOLE_MASK) + switch (params.getCurveType() & LL_PCODE_HOLE_MASK) { case LL_PCODE_HOLE_CIRCLE: // TODO: Actually generate level of detail for triangles - addHole(FALSE, MIN_DETAIL_FACES * detail, 0, triangle_hollow, 1.f); + addHole(params, FALSE, MIN_DETAIL_FACES * detail, 0, triangle_hollow, 1.f); break; case LL_PCODE_HOLE_SQUARE: - addHole(TRUE, 4, 0, triangle_hollow, 1.f, split); + addHole(params, TRUE, 4, 0, triangle_hollow, 1.f, split); break; case LL_PCODE_HOLE_SAME: case LL_PCODE_HOLE_TRIANGLE: default: - addHole(TRUE, 3, 0, triangle_hollow, 1.f, split); + addHole(params, TRUE, 3, 0, triangle_hollow, 1.f, split); break; } } @@ -619,7 +628,7 @@ BOOL LLProfile::generate(BOOL path_open,F32 detail, S32 split, BOOL is_sculpted) F32 circle_detail = MIN_DETAIL_FACES * detail; if (hollow) { - hole_type = mParams.getCurveType() & LL_PCODE_HOLE_MASK; + hole_type = params.getCurveType() & LL_PCODE_HOLE_MASK; if (hole_type == LL_PCODE_HOLE_SQUARE) { // Snap to the next multiple of four sides, @@ -633,7 +642,7 @@ BOOL LLProfile::generate(BOOL path_open,F32 detail, S32 split, BOOL is_sculpted) if (is_sculpted) sides = sculpt_sides(detail); - genNGon(sides); + genNGon(params, sides); if (path_open) { @@ -654,15 +663,15 @@ BOOL LLProfile::generate(BOOL path_open,F32 detail, S32 split, BOOL is_sculpted) switch (hole_type) { case LL_PCODE_HOLE_SQUARE: - addHole(TRUE, 4, 0, hollow, 1.f, split); + addHole(params, TRUE, 4, 0, hollow, 1.f, split); break; case LL_PCODE_HOLE_TRIANGLE: - addHole(TRUE, 3, 0, hollow, 1.f, split); + addHole(params, TRUE, 3, 0, hollow, 1.f, split); break; case LL_PCODE_HOLE_CIRCLE: case LL_PCODE_HOLE_SAME: default: - addHole(FALSE, circle_detail, 0, hollow, 1.f); + addHole(params, FALSE, circle_detail, 0, hollow, 1.f); break; } } @@ -677,7 +686,7 @@ BOOL LLProfile::generate(BOOL path_open,F32 detail, S32 split, BOOL is_sculpted) F32 circle_detail = MIN_DETAIL_FACES * detail * 0.5f; if (hollow) { - hole_type = mParams.getCurveType() & LL_PCODE_HOLE_MASK; + hole_type = params.getCurveType() & LL_PCODE_HOLE_MASK; if (hole_type == LL_PCODE_HOLE_SQUARE) { // Snap to the next multiple of four sides (div 2), @@ -685,12 +694,12 @@ BOOL LLProfile::generate(BOOL path_open,F32 detail, S32 split, BOOL is_sculpted) circle_detail = llceil(circle_detail / 2.0f) * 2.0f; } } - genNGon(llfloor(circle_detail), 0.5f, 0.f, 0.5f); + genNGon(params, llfloor(circle_detail), 0.5f, 0.f, 0.5f); if (path_open) { addCap(LL_FACE_PATH_BEGIN); } - if (mOpen && !mParams.getHollow()) + if (mOpen && !params.getHollow()) { addFace(0,mTotal-1,0,LL_FACE_OUTER_SIDE_0, FALSE); } @@ -704,21 +713,21 @@ BOOL LLProfile::generate(BOOL path_open,F32 detail, S32 split, BOOL is_sculpted) switch (hole_type) { case LL_PCODE_HOLE_SQUARE: - addHole(TRUE, 2, 0.5f, hollow, 0.5f, split); + addHole(params, TRUE, 2, 0.5f, hollow, 0.5f, split); break; case LL_PCODE_HOLE_TRIANGLE: - addHole(TRUE, 3, 0.5f, hollow, 0.5f, split); + addHole(params, TRUE, 3, 0.5f, hollow, 0.5f, split); break; case LL_PCODE_HOLE_CIRCLE: case LL_PCODE_HOLE_SAME: default: - addHole(FALSE, circle_detail, 0.5f, hollow, 0.5f); + addHole(params, FALSE, circle_detail, 0.5f, hollow, 0.5f); break; } } // Special case for openness of sphere - if ((mParams.getEnd() - mParams.getBegin()) < 1.f) + if ((params.getEnd() - params.getBegin()) < 1.f) { mOpen = TRUE; } @@ -731,7 +740,7 @@ BOOL LLProfile::generate(BOOL path_open,F32 detail, S32 split, BOOL is_sculpted) } break; default: - llerrs << "Unknown profile: getCurveType()=" << mParams.getCurveType() << llendl; + llerrs << "Unknown profile: getCurveType()=" << params.getCurveType() << llendl; break; }; @@ -754,7 +763,7 @@ BOOL LLProfile::generate(BOOL path_open,F32 detail, S32 split, BOOL is_sculpted) } } - //genNormals(); + //genNormals(params); return TRUE; } @@ -763,6 +772,8 @@ BOOL LLProfile::generate(BOOL path_open,F32 detail, S32 split, BOOL is_sculpted) BOOL LLProfileParams::importFile(FILE *fp) { + LLMemType m1(LLMemType::MTYPE_VOLUME); + const S32 BUFSIZE = 16384; char buffer[BUFSIZE]; /* Flawfinder: ignore */ // *NOTE: changing the size or type of these buffers will require @@ -838,6 +849,8 @@ BOOL LLProfileParams::exportFile(FILE *fp) const BOOL LLProfileParams::importLegacyStream(std::istream& input_stream) { + LLMemType m1(LLMemType::MTYPE_VOLUME); + const S32 BUFSIZE = 16384; char buffer[BUFSIZE]; /* Flawfinder: ignore */ // *NOTE: changing the size or type of these buffers will require @@ -929,6 +942,7 @@ bool LLProfileParams::fromLLSD(LLSD& sd) void LLProfileParams::copyParams(const LLProfileParams ¶ms) { + LLMemType m1(LLMemType::MTYPE_VOLUME); setCurveType(params.getCurveType()); setBegin(params.getBegin()); setEnd(params.getEnd()); @@ -940,22 +954,22 @@ LLPath::~LLPath() { } -void LLPath::genNGon(S32 sides, F32 startOff, F32 end_scale, F32 twist_scale) +void LLPath::genNGon(const LLPathParams& params, S32 sides, F32 startOff, F32 end_scale, F32 twist_scale) { // Generates a circular path, starting at (1, 0, 0), counterclockwise along the xz plane. const F32 tableScale[] = { 1, 1, 1, 0.5f, 0.707107f, 0.53f, 0.525f, 0.5f }; - F32 revolutions = mParams.getRevolutions(); - F32 skew = mParams.getSkew(); + F32 revolutions = params.getRevolutions(); + F32 skew = params.getSkew(); F32 skew_mag = fabs(skew); - F32 hole_x = mParams.getScaleX() * (1.0f - skew_mag); - F32 hole_y = mParams.getScaleY(); + F32 hole_x = params.getScaleX() * (1.0f - skew_mag); + F32 hole_y = params.getScaleY(); // Calculate taper begin/end for x,y (Negative means taper the beginning) F32 taper_x_begin = 1.0f; - F32 taper_x_end = 1.0f - mParams.getTaperX(); + F32 taper_x_end = 1.0f - params.getTaperX(); F32 taper_y_begin = 1.0f; - F32 taper_y_end = 1.0f - mParams.getTaperY(); + F32 taper_y_end = 1.0f - params.getTaperY(); if ( taper_x_end > 1.0f ) { @@ -983,7 +997,7 @@ void LLPath::genNGon(S32 sides, F32 startOff, F32 end_scale, F32 twist_scale) // Now check the radius offset to calculate the start,end radius. (Negative means // decrease the start radius instead). F32 radius_end = radius_start; - F32 radius_offset = mParams.getRadiusOffset(); + F32 radius_offset = params.getRadiusOffset(); if (radius_offset < 0.f) { radius_start *= 1.f + radius_offset; @@ -994,7 +1008,7 @@ void LLPath::genNGon(S32 sides, F32 startOff, F32 end_scale, F32 twist_scale) } // Is the path NOT a closed loop? - mOpen = ( (mParams.getEnd()*end_scale - mParams.getBegin() < 1.0f) || + mOpen = ( (params.getEnd()*end_scale - params.getBegin() < 1.0f) || (skew_mag > 0.001f) || (fabs(taper_x_end - taper_x_begin) > 0.001f) || (fabs(taper_y_end - taper_y_begin) > 0.001f) || @@ -1005,22 +1019,22 @@ void LLPath::genNGon(S32 sides, F32 startOff, F32 end_scale, F32 twist_scale) PathPt *pt; LLVector3 path_axis (1.f, 0.f, 0.f); //LLVector3 twist_axis(0.f, 0.f, 1.f); - F32 twist_begin = mParams.getTwistBegin() * twist_scale; - F32 twist_end = mParams.getTwist() * twist_scale; + F32 twist_begin = params.getTwistBegin() * twist_scale; + F32 twist_end = params.getTwist() * twist_scale; // We run through this once before the main loop, to make sure // the path begins at the correct cut. F32 step= 1.0f / sides; - F32 t = mParams.getBegin(); + F32 t = params.getBegin(); pt = vector_append(mPath, 1); ang = 2.0f*F_PI*revolutions * t; s = sin(ang)*lerp(radius_start, radius_end, t); c = cos(ang)*lerp(radius_start, radius_end, t); - pt->mPos.setVec(0 + lerp(0,mParams.getShear().mV[0],s) + pt->mPos.setVec(0 + lerp(0,params.getShear().mV[0],s) + lerp(-skew ,skew, t) * 0.5f, - c + lerp(0,mParams.getShear().mV[1],s), + c + lerp(0,params.getShear().mV[1],s), s); pt->mScale.mV[VX] = hole_x * lerp(taper_x_begin, taper_x_end, t); pt->mScale.mV[VY] = hole_y * lerp(taper_y_begin, taper_y_end, t); @@ -1039,7 +1053,7 @@ void LLPath::genNGon(S32 sides, F32 startOff, F32 end_scale, F32 twist_scale) t = ((S32)(t * sides)) / (F32)sides; // Run through the non-cut dependent points. - while (t < mParams.getEnd()) + while (t < params.getEnd()) { pt = vector_append(mPath, 1); @@ -1047,9 +1061,9 @@ void LLPath::genNGon(S32 sides, F32 startOff, F32 end_scale, F32 twist_scale) c = cos(ang)*lerp(radius_start, radius_end, t); s = sin(ang)*lerp(radius_start, radius_end, t); - pt->mPos.setVec(0 + lerp(0,mParams.getShear().mV[0],s) + pt->mPos.setVec(0 + lerp(0,params.getShear().mV[0],s) + lerp(-skew ,skew, t) * 0.5f, - c + lerp(0,mParams.getShear().mV[1],s), + c + lerp(0,params.getShear().mV[1],s), s); pt->mScale.mV[VX] = hole_x * lerp(taper_x_begin, taper_x_end, t); @@ -1066,15 +1080,15 @@ void LLPath::genNGon(S32 sides, F32 startOff, F32 end_scale, F32 twist_scale) } // Make one final pass for the end cut. - t = mParams.getEnd(); + t = params.getEnd(); pt = vector_append(mPath, 1); ang = 2.0f*F_PI*revolutions * t; c = cos(ang)*lerp(radius_start, radius_end, t); s = sin(ang)*lerp(radius_start, radius_end, t); - pt->mPos.setVec(0 + lerp(0,mParams.getShear().mV[0],s) + pt->mPos.setVec(0 + lerp(0,params.getShear().mV[0],s) + lerp(-skew ,skew, t) * 0.5f, - c + lerp(0,mParams.getShear().mV[1],s), + c + lerp(0,params.getShear().mV[1],s), s); pt->mScale.mV[VX] = hole_x * lerp(taper_x_begin, taper_x_end, t); pt->mScale.mV[VY] = hole_y * lerp(taper_y_begin, taper_y_end, t); @@ -1117,8 +1131,10 @@ const LLVector2 LLPathParams::getEndScale() const return end_scale; } -BOOL LLPath::generate(F32 detail, S32 split, BOOL is_sculpted) +BOOL LLPath::generate(const LLPathParams& params, F32 detail, S32 split, BOOL is_sculpted) { + LLMemType m1(LLMemType::MTYPE_VOLUME); + if ((!mDirty) && (!is_sculpted)) { return FALSE; @@ -1137,13 +1153,13 @@ BOOL LLPath::generate(F32 detail, S32 split, BOOL is_sculpted) mOpen = TRUE; // Is this 0xf0 mask really necessary? DK 03/02/05 - switch (mParams.getCurveType() & 0xf0) + switch (params.getCurveType() & 0xf0) { default: case LL_PCODE_PATH_LINE: { // Take the begin/end twist into account for detail. - np = llfloor(fabs(mParams.getTwistBegin() - mParams.getTwist()) * 3.5f * (detail-0.5f)) + 2; + np = llfloor(fabs(params.getTwistBegin() - params.getTwist()) * 3.5f * (detail-0.5f)) + 2; if (np < split+2) { np = split+2; @@ -1153,16 +1169,16 @@ BOOL LLPath::generate(F32 detail, S32 split, BOOL is_sculpted) mPath.resize(np); - LLVector2 start_scale = mParams.getBeginScale(); - LLVector2 end_scale = mParams.getEndScale(); + LLVector2 start_scale = params.getBeginScale(); + LLVector2 end_scale = params.getEndScale(); for (S32 i=0;i<np;i++) { - F32 t = lerp(mParams.getBegin(),mParams.getEnd(),(F32)i * mStep); - mPath[i].mPos.setVec(lerp(0,mParams.getShear().mV[0],t), - lerp(0,mParams.getShear().mV[1],t), + F32 t = lerp(params.getBegin(),params.getEnd(),(F32)i * mStep); + mPath[i].mPos.setVec(lerp(0,params.getShear().mV[0],t), + lerp(0,params.getShear().mV[1],t), t - 0.5f); - mPath[i].mRot.setQuat(lerp(F_PI * mParams.getTwistBegin(),F_PI * mParams.getTwist(),t),0,0,1); + mPath[i].mRot.setQuat(lerp(F_PI * params.getTwistBegin(),F_PI * params.getTwist(),t),0,0,1); mPath[i].mScale.mV[0] = lerp(start_scale.mV[0],end_scale.mV[0],t); mPath[i].mScale.mV[1] = lerp(start_scale.mV[1],end_scale.mV[1],t); mPath[i].mTexT = t; @@ -1173,27 +1189,27 @@ BOOL LLPath::generate(F32 detail, S32 split, BOOL is_sculpted) case LL_PCODE_PATH_CIRCLE: { // Increase the detail as the revolutions and twist increase. - F32 twist_mag = fabs(mParams.getTwistBegin() - mParams.getTwist()); + F32 twist_mag = fabs(params.getTwistBegin() - params.getTwist()); - S32 sides = (S32)llfloor(llfloor((MIN_DETAIL_FACES * detail + twist_mag * 3.5f * (detail-0.5f))) * mParams.getRevolutions()); + S32 sides = (S32)llfloor(llfloor((MIN_DETAIL_FACES * detail + twist_mag * 3.5f * (detail-0.5f))) * params.getRevolutions()); if (is_sculpted) sides = sculpt_sides(detail); - genNGon(sides); + genNGon(params, sides); } break; case LL_PCODE_PATH_CIRCLE2: { - if (mParams.getEnd() - mParams.getBegin() >= 0.99f && - mParams.getScaleX() >= .99f) + if (params.getEnd() - params.getBegin() >= 0.99f && + params.getScaleX() >= .99f) { mOpen = FALSE; } - //genNGon(llfloor(MIN_DETAIL_FACES * detail), 4.f, 0.f); - genNGon(llfloor(MIN_DETAIL_FACES * detail)); + //genNGon(params, llfloor(MIN_DETAIL_FACES * detail), 4.f, 0.f); + genNGon(params, llfloor(MIN_DETAIL_FACES * detail)); F32 t = 0.f; F32 tStep = 1.0f / mPath.size(); @@ -1223,28 +1239,30 @@ BOOL LLPath::generate(F32 detail, S32 split, BOOL is_sculpted) { F32 t = (F32)i * mStep; mPath[i].mPos.setVec(0, - lerp(0, -sin(F_PI*mParams.getTwist()*t)*0.5f,t), - lerp(-0.5, cos(F_PI*mParams.getTwist()*t)*0.5f,t)); - mPath[i].mScale.mV[0] = lerp(1,mParams.getScale().mV[0],t); - mPath[i].mScale.mV[1] = lerp(1,mParams.getScale().mV[1],t); + lerp(0, -sin(F_PI*params.getTwist()*t)*0.5f,t), + lerp(-0.5, cos(F_PI*params.getTwist()*t)*0.5f,t)); + mPath[i].mScale.mV[0] = lerp(1,params.getScale().mV[0],t); + mPath[i].mScale.mV[1] = lerp(1,params.getScale().mV[1],t); mPath[i].mTexT = t; - mPath[i].mRot.setQuat(F_PI * mParams.getTwist() * t,1,0,0); + mPath[i].mRot.setQuat(F_PI * params.getTwist() * t,1,0,0); } break; }; - if (mParams.getTwist() != mParams.getTwistBegin()) mOpen = TRUE; + if (params.getTwist() != params.getTwistBegin()) mOpen = TRUE; - //if ((int(fabsf(mParams.getTwist() - mParams.getTwistBegin())*100))%100 != 0) { + //if ((int(fabsf(params.getTwist() - params.getTwistBegin())*100))%100 != 0) { // mOpen = TRUE; //} return TRUE; } -BOOL LLDynamicPath::generate(F32 detail, S32 split, BOOL is_sculpted) +BOOL LLDynamicPath::generate(const LLPathParams& params, F32 detail, S32 split, BOOL is_sculpted) { + LLMemType m1(LLMemType::MTYPE_VOLUME); + mOpen = TRUE; // Draw end caps if (getPathLength() == 0) { @@ -1266,6 +1284,8 @@ BOOL LLDynamicPath::generate(F32 detail, S32 split, BOOL is_sculpted) BOOL LLPathParams::importFile(FILE *fp) { + LLMemType m1(LLMemType::MTYPE_VOLUME); + const S32 BUFSIZE = 16384; char buffer[BUFSIZE]; /* Flawfinder: ignore */ // *NOTE: changing the size or type of these buffers will require @@ -1410,6 +1430,8 @@ BOOL LLPathParams::exportFile(FILE *fp) const BOOL LLPathParams::importLegacyStream(std::istream& input_stream) { + LLMemType m1(LLMemType::MTYPE_VOLUME); + const S32 BUFSIZE = 16384; char buffer[BUFSIZE]; /* Flawfinder: ignore */ // *NOTE: changing the size or type of these buffers will require @@ -1610,8 +1632,11 @@ LLProfile::~LLProfile() S32 LLVolume::sNumMeshPoints = 0; -LLVolume::LLVolume(const LLVolumeParams ¶ms, const F32 detail, const BOOL generate_single_face, const BOOL is_unique) : mParams(params) +LLVolume::LLVolume(const LLVolumeParams ¶ms, const F32 detail, const BOOL generate_single_face, const BOOL is_unique) + : mParams(params) { + LLMemType m1(LLMemType::MTYPE_VOLUME); + mUnique = is_unique; mFaceMask = 0x0; mDetail = detail; @@ -1620,16 +1645,14 @@ LLVolume::LLVolume(const LLVolumeParams ¶ms, const F32 detail, const BOOL ge // set defaults if (mParams.getPathParams().getCurveType() == LL_PCODE_PATH_FLEXIBLE) { - mPathp = new LLDynamicPath(mParams.getPathParams()); + mPathp = new LLDynamicPath(); } else { - mPathp = new LLPath(mParams.getPathParams()); + mPathp = new LLPath(); } - mProfilep = new LLProfile(mParams.getProfileParams()); + mProfilep = new LLProfile(); - mNumVolumeFaces = 0; - mVolumeFaces = NULL; mGenerateSingleFace = generate_single_face; generate(); @@ -1642,11 +1665,7 @@ LLVolume::LLVolume(const LLVolumeParams ¶ms, const F32 detail, const BOOL ge void LLVolume::resizePath(S32 length) { mPathp->resizePath(length); - if (mVolumeFaces != NULL) - { - delete[] mVolumeFaces; - mVolumeFaces = NULL; - } + mVolumeFaces.clear(); } void LLVolume::regen() @@ -1665,15 +1684,14 @@ LLVolume::~LLVolume() sNumMeshPoints -= mMesh.size(); delete mPathp; delete mProfilep; - delete[] mVolumeFaces; - mPathp = NULL; mProfilep = NULL; - mVolumeFaces = NULL; + mVolumeFaces.clear(); } BOOL LLVolume::generate() { + LLMemType m1(LLMemType::MTYPE_VOLUME); llassert_always(mProfilep); //Added 10.03.05 Dave Parks @@ -1682,13 +1700,13 @@ BOOL LLVolume::generate() // stretched due to twisting or scaling on the path. S32 split = (S32) ((mDetail)*0.66f); - if (mPathp->mParams.getCurveType() == LL_PCODE_PATH_LINE && - (mPathp->mParams.getScale().mV[0] != 1.0f || - mPathp->mParams.getScale().mV[1] != 1.0f) && - (mProfilep->mParams.getCurveType() == LL_PCODE_PROFILE_SQUARE || - mProfilep->mParams.getCurveType() == LL_PCODE_PROFILE_ISOTRI || - mProfilep->mParams.getCurveType() == LL_PCODE_PROFILE_EQUALTRI || - mProfilep->mParams.getCurveType() == LL_PCODE_PROFILE_RIGHTTRI)) + if (mParams.getPathParams().getCurveType() == LL_PCODE_PATH_LINE && + (mParams.getPathParams().getScale().mV[0] != 1.0f || + mParams.getPathParams().getScale().mV[1] != 1.0f) && + (mParams.getProfileParams().getCurveType() == LL_PCODE_PROFILE_SQUARE || + mParams.getProfileParams().getCurveType() == LL_PCODE_PROFILE_ISOTRI || + mParams.getProfileParams().getCurveType() == LL_PCODE_PROFILE_EQUALTRI || + mParams.getProfileParams().getCurveType() == LL_PCODE_PROFILE_RIGHTTRI)) { split = 0; } @@ -1698,8 +1716,8 @@ BOOL LLVolume::generate() F32 profile_detail = mDetail; F32 path_detail = mDetail; - U8 path_type = mPathp->mParams.getCurveType(); - U8 profile_type = mProfilep->mParams.getCurveType(); + U8 path_type = mParams.getPathParams().getCurveType(); + U8 profile_type = mParams.getProfileParams().getCurveType(); if (path_type == LL_PCODE_PATH_LINE && profile_type == LL_PCODE_PROFILE_CIRCLE) { //cylinders don't care about Z-Axis @@ -1710,8 +1728,8 @@ BOOL LLVolume::generate() mLODScaleBias.setVec(0.6f, 0.6f, 0.6f); } - BOOL regenPath = mPathp->generate(path_detail, split); - BOOL regenProf = mProfilep->generate(mPathp->isOpen(),profile_detail, split); + BOOL regenPath = mPathp->generate(mParams.getPathParams(), path_detail, split); + BOOL regenProf = mProfilep->generate(mParams.getProfileParams(), mPathp->isOpen(),profile_detail, split); if (regenPath || regenProf ) { @@ -1759,28 +1777,26 @@ BOOL LLVolume::generate() void LLVolume::createVolumeFaces() { - S32 i; + LLMemType m1(LLMemType::MTYPE_VOLUME); if (mGenerateSingleFace) { - mNumVolumeFaces = 0; + // do nothing } else { S32 num_faces = getNumFaces(); - mNumVolumeFaces = num_faces; BOOL partial_build = TRUE; - if (!mVolumeFaces) + if (num_faces != mVolumeFaces.size()) { partial_build = FALSE; - mVolumeFaces = new LLVolumeFace[num_faces]; + mVolumeFaces.resize(num_faces); } // Initialize volume faces with parameter data - for (i = 0; i < num_faces; i++) + for (S32 i = 0; i < (S32)mVolumeFaces.size(); i++) { - LLVolumeFace &vf = mVolumeFaces[i]; - LLProfile::Face &face = mProfilep->mFaces[i]; - vf.mVolumep = this; + LLVolumeFace& vf = mVolumeFaces[i]; + LLProfile::Face& face = mProfilep->mFaces[i]; vf.mBeginS = face.mIndex; vf.mNumS = face.mCount; vf.mBeginT = 0; @@ -1788,7 +1804,7 @@ void LLVolume::createVolumeFaces() vf.mID = i; // Set the type mask bits correctly - if (mProfilep->isHollow()) + if (mParams.getProfileParams().getHollow() > 0) { vf.mTypeMask |= LLVolumeFace::HOLLOW_MASK; } @@ -1835,9 +1851,10 @@ void LLVolume::createVolumeFaces() } } - for (i = 0; i < mNumVolumeFaces; i++) + for (face_list_t::iterator iter = mVolumeFaces.begin(); + iter != mVolumeFaces.end(); ++iter) { - mVolumeFaces[i].create(partial_build); + (*iter).create(this, partial_build); } } } @@ -1929,6 +1946,8 @@ F32 LLVolume::sculptGetSurfaceArea(U16 sculpt_width, U16 sculpt_height, S8 sculp // create placeholder shape void LLVolume::sculptGeneratePlaceholder() { + LLMemType m1(LLMemType::MTYPE_VOLUME); + S32 sizeS = mPathp->mPath.size(); S32 sizeT = mProfilep->mProfile.size(); @@ -1960,6 +1979,8 @@ void LLVolume::sculptGeneratePlaceholder() // create the vertices from the map void LLVolume::sculptGenerateMapVertices(U16 sculpt_width, U16 sculpt_height, S8 sculpt_components, const U8* sculpt_data, U8 sculpt_type) { + LLMemType m1(LLMemType::MTYPE_VOLUME); + S32 sizeS = mPathp->mPath.size(); S32 sizeT = mProfilep->mProfile.size(); @@ -2029,18 +2050,19 @@ void LLVolume::sculptGenerateMapVertices(U16 sculpt_width, U16 sculpt_height, S8 // sculpt replaces generate() for sculpted surfaces void LLVolume::sculpt(U16 sculpt_width, U16 sculpt_height, S8 sculpt_components, const U8* sculpt_data, S32 sculpt_level) { + LLMemType m1(LLMemType::MTYPE_VOLUME); U8 sculpt_type = mParams.getSculptType(); BOOL data_is_empty = FALSE; - if (sculpt_width == 0 || sculpt_height == 0 || sculpt_components == 0 || sculpt_data == NULL) + if (sculpt_width == 0 || sculpt_height == 0 || sculpt_components < 3 || sculpt_data == NULL) { sculpt_level = -1; data_is_empty = TRUE; } - mPathp->generate(mDetail, 0, TRUE); - mProfilep->generate(mPathp->isOpen(), mDetail, 0, TRUE); + mPathp->generate(mParams.getPathParams(), mDetail, 0, TRUE); + mProfilep->generate(mParams.getProfileParams(), mPathp->isOpen(), mDetail, 0, TRUE); S32 sizeS = mPathp->mPath.size(); S32 sizeT = mProfilep->mProfile.size(); @@ -2055,7 +2077,7 @@ void LLVolume::sculpt(U16 sculpt_width, U16 sculpt_height, S8 sculpt_components, mMesh.resize(sizeS * sizeT); sNumMeshPoints += mMesh.size(); - if (sculptGetSurfaceArea(sculpt_width, sculpt_height, sculpt_components, sculpt_data) < SCULPT_MIN_AREA) + if (!data_is_empty && sculptGetSurfaceArea(sculpt_width, sculpt_height, sculpt_components, sculpt_data) < SCULPT_MIN_AREA) data_is_empty = TRUE; //generate vertex positions @@ -2076,11 +2098,7 @@ void LLVolume::sculpt(U16 sculpt_width, U16 sculpt_height, S8 sculpt_components, mSculptLevel = sculpt_level; // Delete any existing faces so that they get regenerated - if (mVolumeFaces) - { - delete[] mVolumeFaces; - mVolumeFaces = NULL; - } + mVolumeFaces.clear(); createVolumeFaces(); } @@ -2140,6 +2158,7 @@ bool LLVolumeParams::operator<(const LLVolumeParams ¶ms) const void LLVolumeParams::copyParams(const LLVolumeParams ¶ms) { + LLMemType m1(LLMemType::MTYPE_VOLUME); mProfileParams.copyParams(params.mProfileParams); mPathParams.copyParams(params.mPathParams); mSculptID = params.getSculptID(); @@ -2511,6 +2530,8 @@ bool LLVolumeParams::validate(U8 prof_curve, F32 prof_begin, F32 prof_end, F32 h S32 *LLVolume::getTriangleIndices(U32 &num_indices) const { + LLMemType m1(LLMemType::MTYPE_VOLUME); + S32 expected_num_triangle_indices = getNumTriangleIndices(); if (expected_num_triangle_indices > MAX_VOLUME_TRIANGLE_INDICES) { @@ -2527,7 +2548,7 @@ S32 *LLVolume::getTriangleIndices(U32 &num_indices) const // Counter-clockwise triangles are forward facing... BOOL open = getProfile().isOpen(); - BOOL hollow = getProfile().isHollow(); + BOOL hollow = (mParams.getProfileParams().getHollow() > 0); BOOL path_open = getPath().isOpen(); S32 size_s, size_s_out, size_t; S32 s, t, i; @@ -3133,7 +3154,7 @@ S32 *LLVolume::getTriangleIndices(U32 &num_indices) const S32 LLVolume::getNumTriangleIndices() const { BOOL profile_open = getProfile().isOpen(); - BOOL hollow = getProfile().isHollow(); + BOOL hollow = (mParams.getProfileParams().getHollow() > 0); BOOL path_open = getPath().isOpen(); S32 size_s, size_s_out, size_t; @@ -3197,13 +3218,17 @@ void LLVolume::generateSilhouetteVertices(std::vector<LLVector3> &vertices, const LLMatrix4& mat, const LLMatrix3& norm_mat) { + LLMemType m1(LLMemType::MTYPE_VOLUME); + vertices.clear(); normals.clear(); segments.clear(); //for each face - for (S32 i = 0; i < getNumVolumeFaces(); i++) { - LLVolumeFace face = this->getVolumeFace(i); + for (face_list_t::iterator iter = mVolumeFaces.begin(); + iter != mVolumeFaces.end(); ++iter) + { + const LLVolumeFace& face = *iter; if (face.mTypeMask & (LLVolumeFace::CAP_MASK)) { @@ -3386,9 +3411,9 @@ S32 LLVolume::lineSegmentIntersect(const LLVector3& start, LLVector3& end) const LLVector3 vec = end - start; - for (U32 i = 0; i < (U32)getNumFaces(); i++) + for (S32 i = 0; i < getNumFaces(); i++) { - LLVolumeFace face = getVolumeFace(i); + const LLVolumeFace& face = getVolumeFace(i); for (U32 j = 0; j < face.mIndices.size()/3; j++) { @@ -3531,6 +3556,8 @@ BOOL LLVolume::cleanupTriangleData( const S32 num_input_vertices, S32 &num_output_triangles, S32 **output_triangles) { + LLMemType m1(LLMemType::MTYPE_VOLUME); + /* Testing: avoid any cleanup static BOOL skip_cleanup = TRUE; if ( skip_cleanup ) @@ -3752,6 +3779,8 @@ BOOL LLVolume::cleanupTriangleData( const S32 num_input_vertices, BOOL LLVolumeParams::importFile(FILE *fp) { + LLMemType m1(LLMemType::MTYPE_VOLUME); + //llinfos << "importing volume" << llendl; const S32 BUFSIZE = 16384; char buffer[BUFSIZE]; /* Flawfinder: ignore */ @@ -3806,6 +3835,8 @@ BOOL LLVolumeParams::exportFile(FILE *fp) const BOOL LLVolumeParams::importLegacyStream(std::istream& input_stream) { + LLMemType m1(LLMemType::MTYPE_VOLUME); + //llinfos << "importing volume" << llendl; const S32 BUFSIZE = 16384; // *NOTE: changing the size or type of this buffer will require @@ -3845,6 +3876,8 @@ BOOL LLVolumeParams::importLegacyStream(std::istream& input_stream) BOOL LLVolumeParams::exportLegacyStream(std::ostream& output_stream) const { + LLMemType m1(LLMemType::MTYPE_VOLUME); + output_stream <<"\tshape 0\n"; output_stream <<"\t{\n"; mPathParams.exportLegacyStream(output_stream); @@ -3998,7 +4031,7 @@ LLFaceID LLVolume::generateFaceMask() { LLFaceID new_mask = 0x0000; - switch(mProfilep->mParams.getCurveType() & LL_PCODE_PROFILE_MASK) + switch(mParams.getProfileParams().getCurveType() & LL_PCODE_PROFILE_MASK) { case LL_PCODE_PROFILE_CIRCLE: case LL_PCODE_PROFILE_CIRCLE_HALF: @@ -4006,7 +4039,7 @@ LLFaceID LLVolume::generateFaceMask() break; case LL_PCODE_PROFILE_SQUARE: { - for(S32 side = (S32)(mProfilep->mParams.getBegin() * 4.f); side < llceil(mProfilep->mParams.getEnd() * 4.f); side++) + for(S32 side = (S32)(mParams.getProfileParams().getBegin() * 4.f); side < llceil(mParams.getProfileParams().getEnd() * 4.f); side++) { new_mask |= LL_FACE_OUTER_SIDE_0 << side; } @@ -4016,7 +4049,7 @@ LLFaceID LLVolume::generateFaceMask() case LL_PCODE_PROFILE_EQUALTRI: case LL_PCODE_PROFILE_RIGHTTRI: { - for(S32 side = (S32)(mProfilep->mParams.getBegin() * 3.f); side < llceil(mProfilep->mParams.getEnd() * 3.f); side++) + for(S32 side = (S32)(mParams.getProfileParams().getBegin() * 3.f); side < llceil(mParams.getProfileParams().getEnd() * 3.f); side++) { new_mask |= LL_FACE_OUTER_SIDE_0 << side; } @@ -4028,7 +4061,7 @@ LLFaceID LLVolume::generateFaceMask() } // handle hollow objects - if (mProfilep->isHollow()) + if (mParams.getProfileParams().getHollow() > 0) { new_mask |= LL_FACE_INNER_SIDE; } @@ -4130,7 +4163,7 @@ std::ostream& operator<<(std::ostream &s, const LLPath &path) std::ostream& operator<<(std::ostream &s, const LLVolume &volume) { - s << "{params = " << volume.mParams; + s << "{params = " << volume.getParams(); s << ", path = " << *volume.mPathp; s << ", profile = " << *volume.mProfilep; s << "}"; @@ -4140,7 +4173,7 @@ std::ostream& operator<<(std::ostream &s, const LLVolume &volume) std::ostream& operator<<(std::ostream &s, const LLVolume *volumep) { - s << "{params = " << volumep->mParams; + s << "{params = " << volumep->getParams(); s << ", path = " << *(volumep->mPathp); s << ", profile = " << *(volumep->mProfilep); s << "}"; @@ -4160,15 +4193,15 @@ LLVolumeFace::LLVolumeFace() } -BOOL LLVolumeFace::create(BOOL partial_build) +BOOL LLVolumeFace::create(LLVolume* volume, BOOL partial_build) { if (mTypeMask & CAP_MASK) { - return createCap(partial_build); + return createCap(volume, partial_build); } else if ((mTypeMask & END_MASK) || (mTypeMask & SIDE_MASK)) { - return createSide(partial_build); + return createSide(volume, partial_build); } else { @@ -4190,12 +4223,14 @@ void LerpPlanarVertex(LLVolumeFace::VertexData& v0, vout.mBinormal = v0.mBinormal; } -BOOL LLVolumeFace::createUnCutCubeCap(BOOL partial_build) +BOOL LLVolumeFace::createUnCutCubeCap(LLVolume* volume, BOOL partial_build) { - const std::vector<LLVolume::Point>& mesh = mVolumep->getMesh(); - const std::vector<LLVector3>& profile = mVolumep->getProfile().mProfile; - S32 max_s = mVolumep->getProfile().getTotal(); - S32 max_t = mVolumep->getPath().mPath.size(); + LLMemType m1(LLMemType::MTYPE_VOLUME); + + const std::vector<LLVolume::Point>& mesh = volume->getMesh(); + const std::vector<LLVector3>& profile = volume->getProfile().mProfile; + S32 max_s = volume->getProfile().getTotal(); + S32 max_t = volume->getPath().mPath.size(); // S32 i; S32 num_vertices = 0, num_indices = 0; @@ -4296,23 +4331,24 @@ BOOL LLVolumeFace::createUnCutCubeCap(BOOL partial_build) } -BOOL LLVolumeFace::createCap(BOOL partial_build) +BOOL LLVolumeFace::createCap(LLVolume* volume, BOOL partial_build) { + LLMemType m1(LLMemType::MTYPE_VOLUME); + if (!(mTypeMask & HOLLOW_MASK) && !(mTypeMask & OPEN_MASK) && - ((this->mVolumep->getParams().getPathParams().getBegin()==0.0f)&& - (this->mVolumep->getParams().getPathParams().getEnd()==1.0f))&& - (mVolumep->getProfile().mParams.getCurveType()==LL_PCODE_PROFILE_SQUARE && - mVolumep->getPath().mParams.getCurveType()==LL_PCODE_PATH_LINE) + ((volume->getParams().getPathParams().getBegin()==0.0f)&& + (volume->getParams().getPathParams().getEnd()==1.0f))&& + (volume->getParams().getProfileParams().getCurveType()==LL_PCODE_PROFILE_SQUARE && + volume->getParams().getPathParams().getCurveType()==LL_PCODE_PATH_LINE) ){ - return createUnCutCubeCap(partial_build); + return createUnCutCubeCap(volume, partial_build); } - S32 i; S32 num_vertices = 0, num_indices = 0; - const std::vector<LLVolume::Point>& mesh = mVolumep->getMesh(); - const std::vector<LLVector3>& profile = mVolumep->getProfile().mProfile; + const std::vector<LLVolume::Point>& mesh = volume->getMesh(); + const std::vector<LLVector3>& profile = volume->getProfile().mProfile; // All types of caps have the same number of vertices and indices num_vertices = profile.size(); @@ -4325,8 +4361,8 @@ BOOL LLVolumeFace::createCap(BOOL partial_build) mIndices.resize(num_indices); } - S32 max_s = mVolumep->getProfile().getTotal(); - S32 max_t = mVolumep->getPath().mPath.size(); + S32 max_s = volume->getProfile().getTotal(); + S32 max_t = volume->getPath().mPath.size(); mCenter.clearVec(); @@ -4350,7 +4386,7 @@ BOOL LLVolumeFace::createCap(BOOL partial_build) LLVector3& max = mExtents[1]; // Copy the vertices into the array - for (i = 0; i < num_vertices; i++) + for (S32 i = 0; i < num_vertices; i++) { if (mTypeMask & TOP_MASK) { @@ -4414,7 +4450,7 @@ BOOL LLVolumeFace::createCap(BOOL partial_build) } - for (i = 0; i < num_vertices; i++) + for (S32 i = 0; i < num_vertices; i++) { mVertices[i].mBinormal = binormal; mVertices[i].mNormal = normal; @@ -4435,7 +4471,7 @@ BOOL LLVolumeFace::createCap(BOOL partial_build) // Does it matter if it's open or closed? - djs S32 pt1 = 0, pt2 = num_vertices - 1; - i = 0; + S32 i = 0; while (pt2 - pt1 > 1) { // Use the profile points instead of the mesh, since you want @@ -4538,7 +4574,7 @@ BOOL LLVolumeFace::createCap(BOOL partial_build) llassert(mTypeMask & BOTTOM_MASK); S32 pt1 = 0, pt2 = num_vertices - 1; - i = 0; + S32 i = 0; while (pt2 - pt1 > 1) { // Use the profile points instead of the mesh, since you want @@ -4645,7 +4681,7 @@ BOOL LLVolumeFace::createCap(BOOL partial_build) // SOLID OPEN TOP // Generate indices // This is a tri-fan, so we reuse the same first point for all triangles. - for (i = 0; i < (num_vertices - 2); i++) + for (S32 i = 0; i < (num_vertices - 2); i++) { mIndices[3*i] = num_vertices - 1; mIndices[3*i+1] = i; @@ -4655,7 +4691,7 @@ BOOL LLVolumeFace::createCap(BOOL partial_build) else { // SOLID CLOSED TOP - for (i = 0; i < (num_vertices - 2); i++) + for (S32 i = 0; i < (num_vertices - 2); i++) { //MSMSM fix these caps but only for the un-cut case mIndices[3*i] = num_vertices - 1; @@ -4671,7 +4707,7 @@ BOOL LLVolumeFace::createCap(BOOL partial_build) // SOLID OPEN BOTTOM // Generate indices // This is a tri-fan, so we reuse the same first point for all triangles. - for (i = 0; i < (num_vertices - 2); i++) + for (S32 i = 0; i < (num_vertices - 2); i++) { mIndices[3*i] = num_vertices - 1; mIndices[3*i+1] = i + 1; @@ -4681,7 +4717,7 @@ BOOL LLVolumeFace::createCap(BOOL partial_build) else { // SOLID CLOSED BOTTOM - for (i = 0; i < (num_vertices - 2); i++) + for (S32 i = 0; i < (num_vertices - 2); i++) { //MSMSM fix these caps but only for the un-cut case mIndices[3*i] = num_vertices - 1; @@ -4696,6 +4732,8 @@ BOOL LLVolumeFace::createCap(BOOL partial_build) void LLVolumeFace::createBinormals() { + LLMemType m1(LLMemType::MTYPE_VOLUME); + if (!mHasBinormals) { //generate binormals @@ -4737,16 +4775,18 @@ void LLVolumeFace::createBinormals() } } -BOOL LLVolumeFace::createSide(BOOL partial_build) +BOOL LLVolumeFace::createSide(LLVolume* volume, BOOL partial_build) { + LLMemType m1(LLMemType::MTYPE_VOLUME); + BOOL flat = mTypeMask & FLAT_MASK; S32 num_vertices, num_indices; - const std::vector<LLVolume::Point>& mesh = mVolumep->getMesh(); - const std::vector<LLVector3>& profile = mVolumep->getProfile().mProfile; - const std::vector<LLPath::PathPt>& path_data = mVolumep->getPath().mPath; + const std::vector<LLVolume::Point>& mesh = volume->getMesh(); + const std::vector<LLVector3>& profile = volume->getProfile().mProfile; + const std::vector<LLPath::PathPt>& path_data = volume->getPath().mPath; - S32 max_s = mVolumep->getProfile().getTotal(); + S32 max_s = volume->getProfile().getTotal(); S32 s, t, i; F32 ss, tt; @@ -4889,7 +4929,7 @@ BOOL LLVolumeFace::createSide(BOOL partial_build) if (t < mNumT-2) { //top right/top left neighbor face mEdge[cur_edge++] = (mNumS-1)*2*(t+1)+s*2+1; } - else if (mNumT <= 3 || mVolumep->getPath().isOpen() == TRUE) { //no neighbor + else if (mNumT <= 3 || volume->getPath().isOpen() == TRUE) { //no neighbor mEdge[cur_edge++] = -1; } else { //wrap on T @@ -4898,7 +4938,7 @@ BOOL LLVolumeFace::createSide(BOOL partial_build) if (s > 0) { //top left/bottom left neighbor face mEdge[cur_edge++] = (mNumS-1)*2*t+s*2-1; } - else if (flat_face || mVolumep->getProfile().isOpen() == TRUE) { //no neighbor + else if (flat_face || volume->getProfile().isOpen() == TRUE) { //no neighbor mEdge[cur_edge++] = -1; } else { //wrap on S @@ -4908,7 +4948,7 @@ BOOL LLVolumeFace::createSide(BOOL partial_build) if (t > 0) { //bottom left/bottom right neighbor face mEdge[cur_edge++] = (mNumS-1)*2*(t-1)+s*2; } - else if (mNumT <= 3 || mVolumep->getPath().isOpen() == TRUE) { //no neighbor + else if (mNumT <= 3 || volume->getPath().isOpen() == TRUE) { //no neighbor mEdge[cur_edge++] = -1; } else { //wrap on T @@ -4917,7 +4957,7 @@ BOOL LLVolumeFace::createSide(BOOL partial_build) if (s < mNumS-2) { //bottom right/top right neighbor face mEdge[cur_edge++] = (mNumS-1)*2*t+(s+1)*2; } - else if (flat_face || mVolumep->getProfile().isOpen() == TRUE) { //no neighbor + else if (flat_face || volume->getProfile().isOpen() == TRUE) { //no neighbor mEdge[cur_edge++] = -1; } else { //wrap on S @@ -4962,11 +5002,11 @@ BOOL LLVolumeFace::createSide(BOOL partial_build) BOOL s_bottom_converges = ((mVertices[0].mPosition - mVertices[mNumS*(mNumT-2)].mPosition).magVecSquared() < 0.000001f); BOOL s_top_converges = ((mVertices[mNumS-1].mPosition - mVertices[mNumS*(mNumT-2)+mNumS-1].mPosition).magVecSquared() < 0.000001f); - U8 sculpt_type = mVolumep->getParams().getSculptType(); + U8 sculpt_type = volume->getParams().getSculptType(); if (sculpt_type == LL_SCULPT_TYPE_NONE) // logic for non-sculpt volumes { - if (mVolumep->getPath().isOpen() == FALSE) + if (volume->getPath().isOpen() == FALSE) { //wrap normals on T for (S32 i = 0; i < mNumS; i++) { @@ -4976,7 +5016,7 @@ BOOL LLVolumeFace::createSide(BOOL partial_build) } } - if ((mVolumep->getProfile().isOpen() == FALSE) && !(s_bottom_converges)) + if ((volume->getProfile().isOpen() == FALSE) && !(s_bottom_converges)) { //wrap normals on S for (S32 i = 0; i < mNumT; i++) { @@ -4986,8 +5026,8 @@ BOOL LLVolumeFace::createSide(BOOL partial_build) } } - if (mVolumep->getPathType() == LL_PCODE_PATH_CIRCLE && - ((mVolumep->getProfileType() & LL_PCODE_PROFILE_MASK) == LL_PCODE_PROFILE_CIRCLE_HALF)) + if (volume->getPathType() == LL_PCODE_PATH_CIRCLE && + ((volume->getProfileType() & LL_PCODE_PROFILE_MASK) == LL_PCODE_PROFILE_CIRCLE_HALF)) { if (s_bottom_converges) { //all lower S have same normal @@ -5086,69 +5126,6 @@ BOOL LLVolumeFace::createSide(BOOL partial_build) return TRUE; } -// Static -BOOL LLVolumeFace::updateColors(LLColor4U *old_colors, const S32 num_old, const LLVolumeFace &old_vf, - LLStrider<LLColor4U> &new_colors, const S32 num_new, const LLVolumeFace &new_vf) -{ - if (new_vf.mTypeMask & CAP_MASK) - { - // These aren't interpolated correctly. Need to fix when shadows go in... - F32 ratio = (F32)num_old / (F32)num_new; - S32 v = 0; - for (v = 0; v < num_new; v++) - { - new_colors[v] = old_colors[(S32)(v*ratio)]; - } - return FALSE; - } - else if (new_vf.mTypeMask & END_MASK) - { - // These aren't interpolated correctly. Need to fix when shadows go in... - F32 ratio = (F32)num_old / (F32)num_new; - S32 v = 0; - for (v = 0; v < num_new; v++) - { - new_colors[v] = old_colors[(S32)(v*ratio)]; - } - return FALSE; - } - else if (new_vf.mTypeMask & SIDE_MASK) - { - S32 s, t; - F32 s_ratio = (F32)old_vf.mNumS / (F32)new_vf.mNumS; - F32 t_ratio = (F32)old_vf.mNumT / (F32)new_vf.mNumT; - - S32 v = 0; - for (t = 0; t < new_vf.mNumT; t++) - { - F32 t_frac = t * t_ratio; - S32 old_t = (S32)t_frac; - S32 t_target = llmin(old_t + 1, (old_vf.mNumT - 1)); - t_frac -= old_t; - for (s = 0; s < new_vf.mNumS; s++) - { - F32 s_frac = s * s_ratio; - S32 old_s = (S32)s_frac; - S32 s_target = llmin(old_s + 1, (old_vf.mNumS - 1)); - s_frac -= old_s; - - // Interpolate along s, then along t. - LLColor4U s_interp0 = old_colors[old_t * old_vf.mNumS + old_s].multAll(1.f - s_frac).addClampMax(old_colors[old_t * old_vf.mNumS + s_target].multAll(s_frac)); - LLColor4U s_interp1 = old_colors[t_target * old_vf.mNumS + old_s].multAll(1.f - s_frac).addClampMax(old_colors[t_target * old_vf.mNumS + s_target].multAll(s_frac)); - new_colors[v] = s_interp0.multAll(1.f - t_frac).addClampMax(s_interp1.multAll(t_frac)); - v++; - } - } - } - else - { - llerrs << "Unknown/uninitialized face type!" << llendl; - return FALSE; - } - return TRUE; -} - - // Finds binormal based on three vertices with texture coordinates. // Fills in dummy values if the triangle has degenerate texture coordinates. LLVector3 calc_binormal_from_triangle( diff --git a/indra/llmath/llvolume.h b/indra/llmath/llvolume.h index a1eba9de38..11a7c2f1c6 100644 --- a/indra/llmath/llvolume.h +++ b/indra/llmath/llvolume.h @@ -643,9 +643,8 @@ protected: class LLProfile { public: - LLProfile(const LLProfileParams ¶ms) - : mParams(params), - mOpen(FALSE), + LLProfile() + : mOpen(FALSE), mConcave(FALSE), mDirty(TRUE), mTotalOut(0), @@ -657,15 +656,12 @@ public: S32 getTotal() const { return mTotal; } S32 getTotalOut() const { return mTotalOut; } // Total number of outside points - BOOL isHollow() const { return (mParams.getHollow() > 0); } BOOL isFlat(S32 face) const { return (mFaces[face].mCount == 2); } BOOL isOpen() const { return mOpen; } void setDirty() { mDirty = TRUE; } - BOOL generate(BOOL path_open, F32 detail = 1.0f, S32 split = 0, BOOL is_sculpted = FALSE); + BOOL generate(const LLProfileParams& params, BOOL path_open, F32 detail = 1.0f, S32 split = 0, BOOL is_sculpted = FALSE); BOOL isConcave() const { return mConcave; } public: - const LLProfileParams &mParams; - struct Face { S32 mIndex; @@ -687,10 +683,10 @@ public: friend std::ostream& operator<<(std::ostream &s, const LLProfile &profile); protected: - void genNormals(); - void genNGon(S32 sides, F32 offset=0.0f, F32 bevel = 0.0f, F32 ang_scale = 1.f, S32 split = 0); + void genNormals(const LLProfileParams& params); + void genNGon(const LLProfileParams& params, S32 sides, F32 offset=0.0f, F32 bevel = 0.0f, F32 ang_scale = 1.f, S32 split = 0); - Face* addHole(BOOL flat, F32 sides, F32 offset, F32 box_hollow, F32 ang_scale, S32 split = 0); + Face* addHole(const LLProfileParams& params, BOOL flat, F32 sides, F32 offset, F32 box_hollow, F32 ang_scale, S32 split = 0); Face* addCap (S16 faceID); Face* addFace(S32 index, S32 count, F32 scaleU, S16 faceID, BOOL flat); @@ -720,9 +716,8 @@ public: }; public: - LLPath(const LLPathParams ¶ms) - : mParams(params), - mOpen(FALSE), + LLPath() + : mOpen(FALSE), mTotal(0), mDirty(TRUE), mStep(1) @@ -731,8 +726,8 @@ public: virtual ~LLPath(); - void genNGon(S32 sides, F32 offset=0.0f, F32 end_scale = 1.f, F32 twist_scale = 1.f); - virtual BOOL generate(F32 detail=1.0f, S32 split = 0, BOOL is_sculpted = FALSE); + void genNGon(const LLPathParams& params, S32 sides, F32 offset=0.0f, F32 end_scale = 1.f, F32 twist_scale = 1.f); + virtual BOOL generate(const LLPathParams& params, F32 detail=1.0f, S32 split = 0, BOOL is_sculpted = FALSE); BOOL isOpen() const { return mOpen; } F32 getStep() const { return mStep; } @@ -745,7 +740,6 @@ public: friend std::ostream& operator<<(std::ostream &s, const LLPath &path); public: - const LLPathParams &mParams; std::vector<PathPt> mPath; protected: @@ -758,8 +752,8 @@ protected: class LLDynamicPath : public LLPath { public: - LLDynamicPath(const LLPathParams ¶ms) : LLPath(params) { } - BOOL generate(F32 detail=1.0f, S32 split = 0, BOOL is_sculpted = FALSE); + LLDynamicPath() : LLPath() { } + /*virtual*/ BOOL generate(const LLPathParams& params, F32 detail=1.0f, S32 split = 0, BOOL is_sculpted = FALSE); }; // Yet another "face" class - caches volume-specific, but not instance-specific data for faces) @@ -767,7 +761,7 @@ class LLVolumeFace { public: LLVolumeFace(); - BOOL create(BOOL partial_build = FALSE); + BOOL create(LLVolume* volume, BOOL partial_build = FALSE); void createBinormals(); class VertexData @@ -811,16 +805,11 @@ public: std::vector<VertexData> mVertices; std::vector<U16> mIndices; std::vector<S32> mEdge; - LLVolume *mVolumep; // Deliberately NOT reference counted - djs 11/20/03 - otherwise would make an annoying circular reference - // Shouldn't need num_old and num_new, really - djs - static BOOL updateColors(LLColor4U *old_colors, const S32 num_old, const LLVolumeFace &old_face, - LLStrider<LLColor4U> &new_colors, const S32 num_new, const LLVolumeFace &new_face); - -protected: - BOOL createUnCutCubeCap(BOOL partial_build = FALSE); - BOOL createCap(BOOL partial_build = FALSE); - BOOL createSide(BOOL partial_build = FALSE); +private: + BOOL createUnCutCubeCap(LLVolume* volume, BOOL partial_build = FALSE); + BOOL createCap(LLVolume* volume, BOOL partial_build = FALSE); + BOOL createSide(LLVolume* volume, BOOL partial_build = FALSE); }; class LLVolume : public LLRefCount @@ -848,12 +837,12 @@ public: LLVolume(const LLVolumeParams ¶ms, const F32 detail, const BOOL generate_single_face = FALSE, const BOOL is_unique = FALSE); - U8 getProfileType() const { return mProfilep->mParams.getCurveType(); } - U8 getPathType() const { return mPathp->mParams.getCurveType(); } + U8 getProfileType() const { return mParams.getProfileParams().getCurveType(); } + U8 getPathType() const { return mParams.getPathParams().getCurveType(); } S32 getNumFaces() const { return (S32)mProfilep->mFaces.size(); } - S32 getNumVolumeFaces() const { return mNumVolumeFaces; } - F32 getDetail() const { return mDetail; } - const LLVolumeParams & getParams() const { return mParams; } + S32 getNumVolumeFaces() const { return mVolumeFaces.size(); } + F32 getDetail() const { return mDetail; } + const LLVolumeParams& getParams() const { return mParams; } LLVolumeParams getCopyOfParams() const { return mParams; } const LLProfile& getProfile() const { return *mProfilep; } LLPath& getPath() const { return *mPathp; } @@ -932,8 +921,8 @@ protected: std::vector<Point> mMesh; BOOL mGenerateSingleFace; - S32 mNumVolumeFaces; - LLVolumeFace *mVolumeFaces; + typedef std::vector<LLVolumeFace> face_list_t; + face_list_t mVolumeFaces; }; std::ostream& operator<<(std::ostream &s, const LLVolumeParams &volume_params); diff --git a/indra/llmath/llvolumemgr.cpp b/indra/llmath/llvolumemgr.cpp index f3a6b7d157..23ed0183b8 100644 --- a/indra/llmath/llvolumemgr.cpp +++ b/indra/llmath/llvolumemgr.cpp @@ -31,13 +31,10 @@ #include "linden_common.h" #include "llvolumemgr.h" +#include "llmemtype.h" #include "llvolume.h" -//#define DEBUG_VOLUME - -//LLVolumeMgr* gVolumeMgr = 0; - const F32 BASE_THRESHOLD = 0.03f; //static @@ -70,11 +67,6 @@ LLVolumeMgr::~LLVolumeMgr() BOOL LLVolumeMgr::cleanup() { - #ifdef DEBUG_VOLUME - { - lldebugs << "LLVolumeMgr::cleanup()" << llendl; - } - #endif BOOL no_refs = TRUE; if (mDataMutex) { @@ -85,14 +77,11 @@ BOOL LLVolumeMgr::cleanup() iter != end; iter++) { LLVolumeLODGroup *volgroupp = iter->second; - if (volgroupp->getNumRefs() != 1) + if (volgroupp->cleanupRefs() == false) { - llwarns << "Volume group " << volgroupp << " has " - << volgroupp->getNumRefs() << " remaining refs" << llendl; - llwarns << volgroupp->getParams() << llendl; no_refs = FALSE; } - volgroupp->unref();// this ); + delete volgroupp; } mVolumeLODGroups.clear(); if (mDataMutex) @@ -102,10 +91,11 @@ BOOL LLVolumeMgr::cleanup() return no_refs; } -// whatever calls getVolume() never owns the LLVolume* and -// cannot keep references for long since it may be deleted -// later. For best results hold it in an LLPointer<LLVolume>. -LLVolume *LLVolumeMgr::getVolume(const LLVolumeParams &volume_params, const S32 detail) +// Always only ever store the results of refVolume in a LLPointer +// Note however that LLVolumeLODGroup that contains the volume +// also holds a LLPointer so the volume will only go away after +// anything holding the volume and the LODGroup are destroyed +LLVolume* LLVolumeMgr::refVolume(const LLVolumeParams &volume_params, const S32 detail) { LLVolumeLODGroup* volgroupp; if (mDataMutex) @@ -121,17 +111,11 @@ LLVolume *LLVolumeMgr::getVolume(const LLVolumeParams &volume_params, const S32 { volgroupp = iter->second; } - volgroupp->ref(); if (mDataMutex) { mDataMutex->unlock(); } - #ifdef DEBUG_VOLUME - { - lldebugs << "LLVolumeMgr::getVolume() " << (*this) << llendl; - } - #endif - return volgroupp->getLOD(detail); + return volgroupp->getLODVolume(detail); } // virtual @@ -154,15 +138,14 @@ LLVolumeLODGroup* LLVolumeMgr::getGroup( const LLVolumeParams& volume_params ) c return volgroupp; } -// virtual -void LLVolumeMgr::cleanupVolume(LLVolume *volumep) +void LLVolumeMgr::unrefVolume(LLVolume *volumep) { if (volumep->isUnique()) { // TomY: Don't need to manage this volume. It is a unique instance. return; } - LLVolumeParams* params = (LLVolumeParams*) &(volumep->getParams()); + const LLVolumeParams* params = &(volumep->getParams()); if (mDataMutex) { mDataMutex->lock(); @@ -182,11 +165,10 @@ void LLVolumeMgr::cleanupVolume(LLVolume *volumep) LLVolumeLODGroup* volgroupp = iter->second; volgroupp->derefLOD(volumep); - volgroupp->unref();// this ); - if (volgroupp->getNumRefs() == 1) + if (volgroupp->getNumRefs() == 0) { mVolumeLODGroups.erase(params); - volgroupp->unref();// this ); + delete volgroupp; } } if (mDataMutex) @@ -194,40 +176,21 @@ void LLVolumeMgr::cleanupVolume(LLVolume *volumep) mDataMutex->unlock(); } - #ifdef DEBUG_VOLUME - { - lldebugs << "LLVolumeMgr::cleanupVolume() " << (*this) << llendl; - } - #endif -} - -#ifdef DEBUG_VOLUME -S32 LLVolumeMgr::getTotalRefCount() const -{ - S32 total_ref_count = 0; - for ( volume_lod_group_map_t::const_iterator iter = mVolumeLODGroups.begin(), - end = mVolumeLODGroups.end(); - iter != end; iter++) - { - total_ref_count += iter->second->getTotalVolumeRefCount(); - } - return total_ref_count; } -S32 LLVolumeMgr::getGroupCount() const +// protected +void LLVolumeMgr::insertGroup(LLVolumeLODGroup* volgroup) { - return mVolumeLODGroups.size(); + mVolumeLODGroups[volgroup->getVolumeParams()] = volgroup; } -#endif // protected LLVolumeLODGroup* LLVolumeMgr::createNewGroup(const LLVolumeParams& volume_params) { - LLVolumeLODGroup* group = new LLVolumeLODGroup(volume_params); - const LLVolumeParams* params = &(group->getParams()); - mVolumeLODGroups[params] = group; - group->ref(); // initial reference - return group; + LLMemType m1(LLMemType::MTYPE_VOLUME); + LLVolumeLODGroup* volgroup = new LLVolumeLODGroup(volume_params); + insertGroup(volgroup); + return volgroup; } // virtual @@ -272,9 +235,8 @@ std::ostream& operator<<(std::ostream& s, const LLVolumeMgr& volume_mgr) volume_mgr.mDataMutex->lock(); } - LLVolumeMgr::volume_lod_group_map_iter iter = volume_mgr.mVolumeLODGroups.begin(); - LLVolumeMgr::volume_lod_group_map_iter end = volume_mgr.mVolumeLODGroups.end(); - for ( ; iter != end; ++iter) + for (LLVolumeMgr::volume_lod_group_map_t::const_iterator iter = volume_mgr.mVolumeLODGroups.begin(); + iter != volume_mgr.mVolumeLODGroups.end(); ++iter) { LLVolumeLODGroup *volgroupp = iter->second; total_refs += volgroupp->getNumRefs(); @@ -291,72 +253,78 @@ std::ostream& operator<<(std::ostream& s, const LLVolumeMgr& volume_mgr) } LLVolumeLODGroup::LLVolumeLODGroup(const LLVolumeParams ¶ms) + : mVolumeParams(params), + mRefs(0) { - S32 i; - mParams = params; - - for (i = 0; i < NUM_LODS; i++) + for (S32 i = 0; i < NUM_LODS; i++) { mLODRefs[i] = 0; - // no need to initialize mVolumeLODs, they are smart pointers - //mVolumeLODs[i] = NULL; mAccessCount[i] = 0; } } -#ifdef DEBUG_VOLUME -S32 LLVolumeLODGroup::getTotalVolumeRefCount() const +LLVolumeLODGroup::~LLVolumeLODGroup() { - S32 total_ref_count = 0; for (S32 i = 0; i < NUM_LODS; i++) { - total_ref_count += mLODRefs[i]; + llassert_always(mLODRefs[i] == 0); } - return total_ref_count; -} -#endif - -// protected -LLVolumeLODGroup::~LLVolumeLODGroup() -{ - destroy(); } -// protected -void LLVolumeLODGroup::destroy() +// Called from LLVolumeMgr::cleanup +bool LLVolumeLODGroup::cleanupRefs() { - for (S32 i = 0; i < NUM_LODS; i++) + bool res = true; + if (mRefs != 0) { - // remember that mVolumeLODs are smart pointers! - mVolumeLODs[i] = NULL; + llwarns << "Volume group has remaining refs:" << getNumRefs() << llendl; + mRefs = 0; + for (S32 i = 0; i < NUM_LODS; i++) + { + if (mLODRefs[i] > 0) + { + llwarns << " LOD " << i << " refs = " << mLODRefs[i] << llendl; + mLODRefs[i] = 0; + mVolumeLODs[i] = NULL; + } + } + llwarns << *getVolumeParams() << llendl; + res = false; } + return res; } -LLVolume * LLVolumeLODGroup::getLOD(const S32 detail) +LLVolume* LLVolumeLODGroup::getLODVolume(const S32 detail) { llassert(detail >=0 && detail < NUM_LODS); mAccessCount[detail]++; - if (!mLODRefs[detail]) + mRefs++; + if (mVolumeLODs[detail].isNull()) { - mVolumeLODs[detail] = new LLVolume(mParams, mDetailScales[detail]); + LLMemType m1(LLMemType::MTYPE_VOLUME); + mVolumeLODs[detail] = new LLVolume(mVolumeParams, mDetailScales[detail]); } mLODRefs[detail]++; - return mVolumeLODs[detail].get(); + return mVolumeLODs[detail]; } BOOL LLVolumeLODGroup::derefLOD(LLVolume *volumep) { - S32 i; - for (i = 0; i < NUM_LODS; i++) + llassert_always(mRefs > 0); + mRefs--; + for (S32 i = 0; i < NUM_LODS; i++) { if (mVolumeLODs[i] == volumep) { + llassert_always(mLODRefs[i] > 0); mLODRefs[i]--; +#if 1 // SJB: Possible opt: keep other lods around if (!mLODRefs[i]) { mVolumeLODs[i] = NULL; } +#endif return TRUE; } } @@ -428,7 +396,7 @@ F32 LLVolumeLODGroup::dump() std::ostream& operator<<(std::ostream& s, const LLVolumeLODGroup& volgroup) { s << "{ numRefs=" << volgroup.getNumRefs(); - s << ", mParams=" << volgroup.mParams; + s << ", mParams=" << volgroup.getVolumeParams(); s << " }"; return s; diff --git a/indra/llmath/llvolumemgr.h b/indra/llmath/llvolumemgr.h index c28ffce631..fac194165b 100644 --- a/indra/llmath/llvolumemgr.h +++ b/indra/llmath/llvolumemgr.h @@ -41,8 +41,10 @@ class LLVolumeParams; class LLVolumeLODGroup; -class LLVolumeLODGroup : public LLThreadSafeRefCount +class LLVolumeLODGroup { + LOG_CLASS(LLVolumeLODGroup); + public: enum { @@ -50,29 +52,26 @@ public: }; LLVolumeLODGroup(const LLVolumeParams ¶ms); + ~LLVolumeLODGroup(); + bool cleanupRefs(); - BOOL derefLOD(LLVolume *volumep); static S32 getDetailFromTan(const F32 tan_angle); static void getDetailProximity(const F32 tan_angle, F32 &to_lower, F32& to_higher); static F32 getVolumeScaleFromDetail(const S32 detail); - LLVolume *getLOD(const S32 detail); - const LLVolumeParams& getParams() const { return mParams; }; + LLVolume* getLODVolume(const S32 detail); + BOOL derefLOD(LLVolume *volumep); + S32 getNumRefs() const { return mRefs; } + + const LLVolumeParams* getVolumeParams() const { return &mVolumeParams; }; F32 dump(); friend std::ostream& operator<<(std::ostream& s, const LLVolumeLODGroup& volgroup); -#ifdef DEBUG_VOLUME - S32 getTotalVolumeRefCount() const; -#endif - protected: - virtual ~LLVolumeLODGroup(); - void destroy(); - -protected: - LLVolumeParams mParams; + LLVolumeParams mVolumeParams; + S32 mRefs; S32 mLODRefs[NUM_LODS]; LLPointer<LLVolume> mVolumeLODs[NUM_LODS]; static F32 mDetailThresholds[NUM_LODS]; @@ -82,10 +81,6 @@ protected: class LLVolumeMgr { -//public: -// static void initClass(); -// static BOOL cleanupClass(); - public: LLVolumeMgr(); virtual ~LLVolumeMgr(); @@ -96,36 +91,26 @@ public: // whatever calls getVolume() never owns the LLVolume* and // cannot keep references for long since it may be deleted // later. For best results hold it in an LLPointer<LLVolume>. - LLVolume *getVolume(const LLVolumeParams &volume_params, const S32 detail); - - void cleanupVolume(LLVolume *volumep); + LLVolume *refVolume(const LLVolumeParams &volume_params, const S32 detail); + void unrefVolume(LLVolume *volumep); void dump(); // manually call this for mutex magic void useMutex(); -#ifdef DEBUG_VOLUME - S32 getTotalRefCount() const; - S32 getGroupCount() const; -#endif friend std::ostream& operator<<(std::ostream& s, const LLVolumeMgr& volume_mgr); protected: + void insertGroup(LLVolumeLODGroup* volgroup); + // Overridden in llphysics/abstract/utils/llphysicsvolumemanager.h virtual LLVolumeLODGroup* createNewGroup(const LLVolumeParams& volume_params); protected: typedef std::map<const LLVolumeParams*, LLVolumeLODGroup*, LLVolumeParams::compare> volume_lod_group_map_t; - typedef volume_lod_group_map_t::const_iterator volume_lod_group_map_iter; volume_lod_group_map_t mVolumeLODGroups; LLMutex* mDataMutex; - - // We need to be able to disable threadsafe checks to prevent - // some unit_tests from blocking on failure - bool mThreadSafe; }; -//extern LLVolumeMgr* gVolumeMgr; - #endif // LL_LLVOLUMEMGR_H diff --git a/indra/llprimitive/llprimitive.cpp b/indra/llprimitive/llprimitive.cpp index cc676f73f1..ff69cacf0f 100644 --- a/indra/llprimitive/llprimitive.cpp +++ b/indra/llprimitive/llprimitive.cpp @@ -32,6 +32,7 @@ #include "linden_common.h" #include "material_codes.h" +#include "llmemtype.h" #include "llerror.h" #include "message.h" #include "llprimitive.h" @@ -178,7 +179,7 @@ LLPrimitive::~LLPrimitive() // Cleanup handled by volume manager if (mVolumep) { - sVolumeManager->cleanupVolume(mVolumep); + sVolumeManager->unrefVolume(mVolumep); } mVolumep = NULL; } @@ -187,6 +188,7 @@ LLPrimitive::~LLPrimitive() // static LLPrimitive *LLPrimitive::createPrimitive(LLPCode p_code) { + LLMemType m1(LLMemType::MTYPE_PRIMITIVE); LLPrimitive *retval = new LLPrimitive(); if (retval) @@ -204,6 +206,7 @@ LLPrimitive *LLPrimitive::createPrimitive(LLPCode p_code) //=============================================================== void LLPrimitive::init_primitive(LLPCode p_code) { + LLMemType m1(LLMemType::MTYPE_PRIMITIVE); if (mNumTEs) { if (mTextureList) @@ -246,6 +249,7 @@ void LLPrimitive::setNumTEs(const U8 num_tes) // Right now, we don't try and preserve entries when the number of faces // changes. + LLMemType m1(LLMemType::MTYPE_PRIMITIVE); if (num_tes) { LLTextureEntry *new_tes; @@ -914,6 +918,7 @@ S32 face_index_from_id(LLFaceID face_ID, const std::vector<LLProfile::Face>& fac BOOL LLPrimitive::setVolume(const LLVolumeParams &volume_params, const S32 detail, bool unique_volume) { + LLMemType m1(LLMemType::MTYPE_VOLUME); LLVolume *volumep; if (unique_volume) { @@ -935,10 +940,10 @@ BOOL LLPrimitive::setVolume(const LLVolumeParams &volume_params, const S32 detai } } - volumep = sVolumeManager->getVolume(volume_params, detail); + volumep = sVolumeManager->refVolume(volume_params, detail); if (volumep == mVolumep) { - sVolumeManager->cleanupVolume( volumep ); // LLVolumeMgr::getVolume() creates a reference, but we don't need a second one. + sVolumeManager->unrefVolume( volumep ); // LLVolumeMgr::refVolume() creates a reference, but we don't need a second one. return TRUE; } } @@ -981,7 +986,7 @@ BOOL LLPrimitive::setVolume(const LLVolumeParams &volume_params, const S32 detai // build the new object - sVolumeManager->cleanupVolume(mVolumep); + sVolumeManager->unrefVolume(mVolumep); mVolumep = volumep; U32 new_face_mask = mVolumep->mFaceMask; diff --git a/indra/llrender/llimagegl.cpp b/indra/llrender/llimagegl.cpp index 2a8424a09b..d5ad38dff3 100644 --- a/indra/llrender/llimagegl.cpp +++ b/indra/llrender/llimagegl.cpp @@ -128,10 +128,16 @@ S32 LLImageGL::dataFormatComponents(S32 dataformat) void LLImageGL::bindExternalTexture(LLGLuint gl_name, S32 stage, LLGLenum bind_target ) { gGL.flush(); - glActiveTextureARB(GL_TEXTURE0_ARB + stage); - glClientActiveTextureARB(GL_TEXTURE0_ARB + stage); + if (stage > 0) + { + glActiveTextureARB(GL_TEXTURE0_ARB + stage); + } glBindTexture(bind_target, gl_name); sCurrentBoundTextures[stage] = gl_name; + if (stage > 0) + { + glActiveTextureARB(GL_TEXTURE0_ARB); + } } // static @@ -141,9 +147,16 @@ void LLImageGL::unbindTexture(S32 stage, LLGLenum bind_target) if (stage >= 0) { gGL.flush(); - glActiveTextureARB(GL_TEXTURE0_ARB + stage); - glClientActiveTextureARB(GL_TEXTURE0_ARB + stage); - glBindTexture(bind_target, 0); + if (stage > 0) + { + glActiveTextureARB(GL_TEXTURE0_ARB + stage); + glBindTexture(GL_TEXTURE_2D, 0); + glActiveTextureARB(GL_TEXTURE0_ARB); + } + else + { + glBindTexture(GL_TEXTURE_2D, 0); + } sCurrentBoundTextures[stage] = 0; } } @@ -151,15 +164,7 @@ void LLImageGL::unbindTexture(S32 stage, LLGLenum bind_target) // static (duplicated for speed and to avoid GL_TEXTURE_2D default argument which requires GL header dependency) void LLImageGL::unbindTexture(S32 stage) { - // LLGLSLShader can return -1 - if (stage >= 0) - { - gGL.flush(); - glActiveTextureARB(GL_TEXTURE0_ARB + stage); - glClientActiveTextureARB(GL_TEXTURE0_ARB + stage); - glBindTexture(GL_TEXTURE_2D, 0); - sCurrentBoundTextures[stage] = 0; - } + unbindTexture(stage, GL_TEXTURE_2D); } // static @@ -419,8 +424,6 @@ BOOL LLImageGL::bindTextureInternal(const S32 stage) const } - glActiveTextureARB(GL_TEXTURE0_ARB + stage); - if (sCurrentBoundTextures[stage] && sCurrentBoundTextures[stage] == mTexName) { // already set! @@ -434,10 +437,20 @@ BOOL LLImageGL::bindTextureInternal(const S32 stage) const #endif gGL.flush(); + if (stage > 0) + { + glActiveTextureARB(GL_TEXTURE0_ARB + stage); + } + glBindTexture(mBindTarget, mTexName); sCurrentBoundTextures[stage] = mTexName; sBindCount++; + if (stage > 0) + { + glActiveTextureARB(GL_TEXTURE0_ARB); + } + if (mLastBindTime != sLastFrameTime) { // we haven't accounted for this texture yet this frame @@ -451,7 +464,15 @@ BOOL LLImageGL::bindTextureInternal(const S32 stage) const else { gGL.flush(); + if (stage > 0) + { + glActiveTextureARB(GL_TEXTURE0_ARB+stage); + } glBindTexture(mBindTarget, 0); + if (stage > 0) + { + glActiveTextureARB(GL_TEXTURE0_ARB+stage); + } sCurrentBoundTextures[stage] = 0; return FALSE; } @@ -594,18 +615,25 @@ void LLImageGL::setImage(const U8* data_in, BOOL data_hasmips) S32 w = width, h = height; const U8* prev_mip_data = 0; const U8* cur_mip_data = 0; + S32 prev_mip_size = 0; + S32 cur_mip_size = 0; for (int m=0; m<nummips; m++) { if (m==0) { cur_mip_data = data_in; + cur_mip_size = width * height * mComponents; } else { S32 bytes = w * h * mComponents; + llassert(prev_mip_data); + llassert(prev_mip_size == bytes); U8* new_data = new U8[bytes]; + llassert_always(new_data); LLImageBase::generateMip(prev_mip_data, new_data, w, h, mComponents); cur_mip_data = new_data; + cur_mip_size = bytes; } llassert(w > 0 && h > 0 && cur_mip_data); { @@ -630,12 +658,14 @@ void LLImageGL::setImage(const U8* data_in, BOOL data_hasmips) delete[] prev_mip_data; } prev_mip_data = cur_mip_data; + prev_mip_size = cur_mip_size; w >>= 1; h >>= 1; } if (prev_mip_data && prev_mip_data != data_in) { delete[] prev_mip_data; + prev_mip_data = NULL; } } } @@ -985,6 +1015,21 @@ BOOL LLImageGL::setDiscardLevel(S32 discard_level) } } +BOOL LLImageGL::isValidForSculpt(S32 discard_level, S32 image_width, S32 image_height, S32 ncomponents) +{ + assert_glerror(); + S32 gl_discard = discard_level - mCurrentDiscardLevel; + LLGLint glwidth = 0; + glGetTexLevelParameteriv(mTarget, gl_discard, GL_TEXTURE_WIDTH, (GLint*)&glwidth); + LLGLint glheight = 0; + glGetTexLevelParameteriv(mTarget, gl_discard, GL_TEXTURE_HEIGHT, (GLint*)&glheight); + LLGLint glcomponents = 0 ; + glGetTexLevelParameteriv(mTarget, gl_discard, GL_TEXTURE_INTERNAL_FORMAT, (GLint*)&glcomponents); + assert_glerror(); + + return glwidth >= image_width && glheight >= image_height && (GL_RGB8 == glcomponents || GL_RGBA8 == glcomponents) ; +} + BOOL LLImageGL::readBackRaw(S32 discard_level, LLImageRaw* imageraw, bool compressed_ok) { if (discard_level < 0) @@ -1022,6 +1067,7 @@ BOOL LLImageGL::readBackRaw(S32 discard_level, LLImageRaw* imageraw, bool compre llerrs << llformat("LLImageGL::readBackRaw: bogus params: %d x %d x %d",width,height,ncomponents) << llendl; } + BOOL return_result = TRUE ; LLGLint is_compressed = 0; if (compressed_ok) { @@ -1033,16 +1079,28 @@ BOOL LLImageGL::readBackRaw(S32 discard_level, LLImageRaw* imageraw, bool compre glGetTexLevelParameteriv(mTarget, gl_discard, GL_TEXTURE_COMPRESSED_IMAGE_SIZE, (GLint*)&glbytes); imageraw->allocateDataSize(width, height, ncomponents, glbytes); glGetCompressedTexImageARB(mTarget, gl_discard, (GLvoid*)(imageraw->getData())); + if(glGetError() != GL_NO_ERROR) + { + llwarns << "Error happens when reading back the compressed texture image." << llendl ; + imageraw->deleteData() ; + return_result = FALSE ; + } stop_glerror(); } else { imageraw->allocateDataSize(width, height, ncomponents); glGetTexImage(GL_TEXTURE_2D, gl_discard, mFormatPrimary, mFormatType, (GLvoid*)(imageraw->getData())); + if(glGetError() != GL_NO_ERROR) + { + llwarns << "Error happens when reading back the texture image." << llendl ; + imageraw->deleteData() ; + return_result = FALSE ; + } stop_glerror(); } - return TRUE; + return return_result ; } void LLImageGL::destroyGLTexture() @@ -1057,7 +1115,6 @@ void LLImageGL::destroyGLTexture() { unbindTexture(i, GL_TEXTURE_2D); stop_glerror(); - glActiveTextureARB(GL_TEXTURE0_ARB); } } diff --git a/indra/llrender/llimagegl.h b/indra/llrender/llimagegl.h index 20cf4ae10f..82ea147d6e 100644 --- a/indra/llrender/llimagegl.h +++ b/indra/llrender/llimagegl.h @@ -131,6 +131,8 @@ public: BOOL getUseDiscard() const { return mUseMipMaps && !mDontDiscard; } BOOL getDontDiscard() const { return mDontDiscard; } + BOOL isValidForSculpt(S32 discard_level, S32 image_width, S32 image_height, S32 ncomponents) ; + protected: void init(BOOL usemipmaps); virtual void cleanup(); // Clean up the LLImageGL so it can be reinitialized. Be careful when using this in derived class destructors diff --git a/indra/llrender/llrendertarget.h b/indra/llrender/llrendertarget.h index 7f9c611c69..27c40fcfcf 100644 --- a/indra/llrender/llrendertarget.h +++ b/indra/llrender/llrendertarget.h @@ -71,7 +71,7 @@ public: //allocate resources for rendering //must be called before use //multiple calls will release previously allocated resources - void allocate(U32 resx, U32 resy, U32 color_fmt, BOOL depth, U32 usage = GL_TEXTURE_2D, BOOL use_fbo = TRUE); + void allocate(U32 resx, U32 resy, U32 color_fmt, BOOL depth, U32 usage = GL_TEXTURE_2D, BOOL use_fbo = FALSE); //allocate a depth texture void allocateDepth(); diff --git a/indra/llrender/llvertexbuffer.cpp b/indra/llrender/llvertexbuffer.cpp index 9303e00228..b646a02cae 100644 --- a/indra/llrender/llvertexbuffer.cpp +++ b/indra/llrender/llvertexbuffer.cpp @@ -38,6 +38,7 @@ #include "llglheaders.h" #include "llmemory.h" #include "llmemtype.h" +#include "llglimmediate.h" //============================================================================ @@ -76,6 +77,141 @@ S32 LLVertexBuffer::sTypeOffsets[LLVertexBuffer::TYPE_MAX] = sizeof(LLVector4), // TYPE_CLOTHWEIGHT, }; +U32 LLVertexBuffer::sGLMode[LLVertexBuffer::NUM_MODES] = +{ + GL_TRIANGLES, + GL_TRIANGLE_STRIP, + GL_TRIANGLE_FAN, + GL_POINTS, + GL_LINES, + GL_LINE_STRIP +}; + +//static +void LLVertexBuffer::setupClientArrays(U32 data_mask) +{ + if (LLGLImmediate::sStarted) + { + llerrs << "Cannot use LLGLImmediate and LLVertexBuffer simultaneously!" << llendl; + } + + if (sLastMask != data_mask) + { + U32 mask[] = + { + MAP_VERTEX, + MAP_NORMAL, + MAP_TEXCOORD, + MAP_COLOR + }; + + GLenum array[] = + { + GL_VERTEX_ARRAY, + GL_NORMAL_ARRAY, + GL_TEXTURE_COORD_ARRAY, + GL_COLOR_ARRAY + }; + + for (U32 i = 0; i < 4; ++i) + { + if (sLastMask & mask[i]) + { //was enabled + if (!(data_mask & mask[i]) && i > 0) + { //needs to be disabled + glDisableClientState(array[i]); + } + else + { //needs to be enabled, make sure it was (DEBUG TEMPORARY) + if (i > 0 && !glIsEnabled(array[i])) + { + llerrs << "Bad client state! " << array[i] << " disabled." << llendl; + } + } + } + else + { //was disabled + if (data_mask & mask[i]) + { //needs to be enabled + glEnableClientState(array[i]); + } + else if (glIsEnabled(array[i])) + { //needs to be disabled, make sure it was (DEBUG TEMPORARY) + llerrs << "Bad client state! " << array[i] << " enabled." << llendl; + } + } + } + + if (sLastMask & MAP_TEXCOORD2) + { + if (!(data_mask & MAP_TEXCOORD2)) + { + glClientActiveTextureARB(GL_TEXTURE1_ARB); + glDisableClientState(GL_TEXTURE_COORD_ARRAY); + glClientActiveTextureARB(GL_TEXTURE0_ARB); + } + } + else if (data_mask & MAP_TEXCOORD2) + { + glClientActiveTextureARB(GL_TEXTURE1_ARB); + glEnableClientState(GL_TEXTURE_COORD_ARRAY); + glClientActiveTextureARB(GL_TEXTURE0_ARB); + } + + sLastMask = data_mask; + } +} + +void LLVertexBuffer::drawRange(U32 mode, U32 start, U32 end, U32 count, U32 indices_offset) const +{ + if (start >= (U32) mRequestedNumVerts || + end >= (U32) mRequestedNumVerts) + { + llerrs << "Bad vertex buffer draw range: [" << start << ", " << end << "]" << llendl; + } + + if (indices_offset >= (U32) mRequestedNumIndices || + indices_offset + count > (U32) mRequestedNumIndices) + { + llerrs << "Bad index buffer draw range: [" << indices_offset << ", " << indices_offset+count << "]" << llendl; + } + + if (mGLIndices != sGLRenderIndices) + { + llerrs << "Wrong index buffer bound." << llendl; + } + + if (mGLBuffer != sGLRenderBuffer) + { + llerrs << "Wrong vertex buffer bound." << llendl; + } + + glDrawRangeElements(sGLMode[mode], start, end, count, GL_UNSIGNED_SHORT, + ((U16*) getIndicesPointer()) + indices_offset); +} + +void LLVertexBuffer::draw(U32 mode, U32 count, U32 indices_offset) const +{ + if (indices_offset >= (U32) mRequestedNumIndices || + indices_offset + count > (U32) mRequestedNumIndices) + { + llerrs << "Bad index buffer draw range: [" << indices_offset << ", " << indices_offset+count << "]" << llendl; + } + + if (mGLIndices != sGLRenderIndices) + { + llerrs << "Wrong index buffer bound." << llendl; + } + + if (mGLBuffer != sGLRenderBuffer) + { + llerrs << "Wrong vertex buffer bound." << llendl; + } + + glDrawElements(sGLMode[mode], count, GL_UNSIGNED_SHORT, + ((U16*) getIndicesPointer()) + indices_offset); +} + //static void LLVertexBuffer::initClass(bool use_vbo) { @@ -102,7 +238,8 @@ void LLVertexBuffer::unbind() sGLRenderBuffer = 0; sGLRenderIndices = 0; - sLastMask = 0; + + setupClientArrays(0); } //static @@ -118,22 +255,14 @@ void LLVertexBuffer::cleanupClass() void LLVertexBuffer::startRender() { LLMemType mt(LLMemType::MTYPE_VERTEX_DATA); - if (sEnableVBOs) - { - glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0); - glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0); - sVBOActive = FALSE; - sIBOActive = FALSE; - } - + + unbind(); sRenderActive = TRUE; - sGLRenderBuffer = 0; - sGLRenderIndices = 0; - sLastMask = 0; } void LLVertexBuffer::stopRender() { + unbind(); sRenderActive = FALSE; } @@ -615,6 +744,16 @@ U8* LLVertexBuffer::mapBuffer(S32 access) llerrs << "Mapped two VBOs at the same time!" << llendl; } sMapped = TRUE;*/ + if (!mMappedData) + { + llerrs << "glMapBuffer returned NULL (no vertex data)" << llendl; + } + + if (!mMappedIndexData) + { + llerrs << "glMapBuffer returned NULL (no index data)" << llendl; + } + sMappedCount++; } @@ -666,7 +805,12 @@ template <class T,S32 type> struct VertexBufferStrider strider_t& strider, S32 index) { - vbo.mapBuffer(); + if (vbo.mapBuffer() == NULL) + { + llwarns << "mapBuffer failed!" << llendl; + return FALSE; + } + if (type == LLVertexBuffer::TYPE_INDEX) { S32 stride = sizeof(T); @@ -828,6 +972,8 @@ void LLVertexBuffer::setBuffer(U32 data_mask) sIBOActive = FALSE; } } + + setupClientArrays(data_mask); if (mGLIndices) { @@ -846,8 +992,6 @@ void LLVertexBuffer::setBuffer(U32 data_mask) sSetCount++; } } - - sLastMask = data_mask; } // virtual (default) @@ -871,10 +1015,10 @@ void LLVertexBuffer::setupVertexBuffer(U32 data_mask) const { glClientActiveTextureARB(GL_TEXTURE1_ARB); glTexCoordPointer(2,GL_FLOAT, stride, (void*)(base + mOffsets[TYPE_TEXCOORD2])); + glClientActiveTextureARB(GL_TEXTURE0_ARB); } if (data_mask & MAP_TEXCOORD) { - glClientActiveTextureARB(GL_TEXTURE0_ARB); glTexCoordPointer(2,GL_FLOAT, stride, (void*)(base + mOffsets[TYPE_TEXCOORD])); } if (data_mask & MAP_COLOR) diff --git a/indra/llrender/llvertexbuffer.h b/indra/llrender/llvertexbuffer.h index e2a4196b0e..50f79cfc9d 100644 --- a/indra/llrender/llvertexbuffer.h +++ b/indra/llrender/llvertexbuffer.h @@ -84,6 +84,7 @@ public: static void initClass(bool use_vbo); static void cleanupClass(); + static void setupClientArrays(U32 data_mask); static void startRender(); //between start and stop render, no client copies will occur static void stopRender(); //any buffer not copied to GL will be rendered from client memory static void clientCopy(F64 max_time = 0.005); //copy data from client to GL @@ -123,6 +124,15 @@ public: MAP_UNMAPPED = 0x8000 // Indicates that buffer has been logically un-mapped }; + enum { + TRIANGLES = 0, + TRIANGLE_STRIP, + TRIANGLE_FAN, + POINTS, + LINES, + LINE_STRIP, + NUM_MODES + }; protected: friend class LLGLImmediate; @@ -194,6 +204,9 @@ public: void markDirty(U32 vert_index, U32 vert_count, U32 indices_index, U32 indices_count); + void draw(U32 mode, U32 count, U32 indices_offset) const; + void drawRange(U32 mode, U32 start, U32 end, U32 count, U32 indices_offset) const; + protected: S32 mNumVerts; // Number of vertices allocated S32 mNumIndices; // Number of indices allocated @@ -241,6 +254,7 @@ public: static BOOL sEnableVBOs; static S32 sTypeOffsets[TYPE_MAX]; + static U32 sGLMode[NUM_MODES]; static U32 sGLRenderBuffer; static U32 sGLRenderIndices; static BOOL sVBOActive; diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp index 4829d5b893..f80028656e 100644 --- a/indra/llui/llfloater.cpp +++ b/indra/llui/llfloater.cpp @@ -923,6 +923,7 @@ void LLFloater::setFocus( BOOL b ) } } +// virtual void LLFloater::setIsChrome(BOOL is_chrome) { // chrome floaters don't take focus at all @@ -941,6 +942,12 @@ void LLFloater::setIsChrome(BOOL is_chrome) LLPanel::setIsChrome(is_chrome); } +void LLFloater::setTitleVisible(bool visible) +{ + if (mDragHandle) + mDragHandle->setTitleVisible(visible); +} + // Change the draw style to account for the foreground state. void LLFloater::setForeground(BOOL front) { diff --git a/indra/llui/llfloater.h b/indra/llui/llfloater.h index 280789d64c..4e8b86d2de 100644 --- a/indra/llui/llfloater.h +++ b/indra/llui/llfloater.h @@ -146,6 +146,7 @@ public: const LLString& getTitle() const; void setShortTitle( const LLString& short_title ); LLString getShortTitle(); + void setTitleVisible(bool visible); virtual void setMinimized(BOOL b); void moveResizeHandlesToFront(); void addDependentFloater(LLFloater* dependent, BOOL reposition = TRUE); diff --git a/indra/llui/llscrollbar.cpp b/indra/llui/llscrollbar.cpp index 90659cdc70..2c4a5cbc58 100644 --- a/indra/llui/llscrollbar.cpp +++ b/indra/llui/llscrollbar.cpp @@ -501,6 +501,13 @@ void LLScrollbar::draw() } else { + // Background + rounded_rect_imagep->drawSolid(mOrientation == HORIZONTAL ? SCROLLBAR_SIZE : 0, + mOrientation == VERTICAL ? SCROLLBAR_SIZE : 0, + mOrientation == HORIZONTAL ? getRect().getWidth() - 2 * SCROLLBAR_SIZE : getRect().getWidth(), + mOrientation == VERTICAL ? getRect().getHeight() - 2 * SCROLLBAR_SIZE : getRect().getHeight(), + mTrackColor); + // Thumb LLRect outline_rect = mThumbRect; outline_rect.stretch(2); diff --git a/indra/llui/llscrollcontainer.cpp b/indra/llui/llscrollcontainer.cpp index d8df636abd..edad4c4d6b 100644 --- a/indra/llui/llscrollcontainer.cpp +++ b/indra/llui/llscrollcontainer.cpp @@ -430,7 +430,7 @@ void LLScrollableContainerView::draw() if( mIsOpaque ) { LLGLSNoTexture no_texture; - glColor4fv( mBackgroundColor.mV ); + gGL.color4fv( mBackgroundColor.mV ); gl_rect_2d( mInnerRect ); } diff --git a/indra/llui/llscrolllistctrl.cpp b/indra/llui/llscrolllistctrl.cpp index eb244a6f82..4e640eac2a 100644 --- a/indra/llui/llscrolllistctrl.cpp +++ b/indra/llui/llscrolllistctrl.cpp @@ -1759,7 +1759,7 @@ void LLScrollListCtrl::draw() if (mBackgroundVisible) { LLGLSNoTexture no_texture; - glColor4fv( getEnabled() ? mBgWriteableColor.mV : mBgReadOnlyColor.mV ); + gGL.color4fv( getEnabled() ? mBgWriteableColor.mV : mBgReadOnlyColor.mV ); gl_rect_2d(background); } diff --git a/indra/llwindow/llwindowwin32.cpp b/indra/llwindow/llwindowwin32.cpp index e6e999bac4..06b4fbde59 100644 --- a/indra/llwindow/llwindowwin32.cpp +++ b/indra/llwindow/llwindowwin32.cpp @@ -1326,8 +1326,9 @@ BOOL LLWindowWin32::switchContext(BOOL fullscreen, const LLCoordScreen &size, BO close(); OSMessageBox( "Second Life is unable to run because your video card drivers\n" - "are out of date or unsupported. Please make sure you have\n" - "the latest video card drivers installed.\n\n" + "did not install properly, are out of date, or are for unsupported\n" + "hardware. Please make sure you have the latest video card drivers\n" + "and even if you do have the latest, try reinstalling them.\n\n" "If you continue to receive this message, contact customer service.", "Error", OSMB_OK); @@ -1836,6 +1837,10 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_ break; } case WM_IME_SETCONTEXT: + if (gDebugWindowProc) + { + llinfos << "WM_IME_SETCONTEXT" << llendl; + } if (LLWinImm::isAvailable() && window_imp->mPreeditor) { l_param &= ~ISC_SHOWUICOMPOSITIONWINDOW; @@ -1844,6 +1849,10 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_ break; case WM_IME_STARTCOMPOSITION: + if (gDebugWindowProc) + { + llinfos << "WM_IME_STARTCOMPOSITION" << llendl; + } if (LLWinImm::isAvailable() && window_imp->mPreeditor) { window_imp->handleStartCompositionMessage(); @@ -1852,6 +1861,10 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_ break; case WM_IME_ENDCOMPOSITION: + if (gDebugWindowProc) + { + llinfos << "WM_IME_ENDCOMPOSITION" << llendl; + } if (LLWinImm::isAvailable() && window_imp->mPreeditor) { return 0; @@ -1859,6 +1872,10 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_ break; case WM_IME_COMPOSITION: + if (gDebugWindowProc) + { + llinfos << "WM_IME_COMPOSITION" << llendl; + } if (LLWinImm::isAvailable() && window_imp->mPreeditor) { window_imp->handleCompositionMessage(l_param); @@ -1867,6 +1884,10 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_ break; case WM_IME_REQUEST: + if (gDebugWindowProc) + { + llinfos << "WM_IME_REQUEST" << llendl; + } if (LLWinImm::isAvailable() && window_imp->mPreeditor) { LRESULT result = 0; diff --git a/indra/llxml/llcontrol.cpp b/indra/llxml/llcontrol.cpp index a1d2620a6f..2c4fb3bccc 100644 --- a/indra/llxml/llcontrol.cpp +++ b/indra/llxml/llcontrol.cpp @@ -953,7 +953,7 @@ U32 LLControlGroup::saveToFile(const LLString& filename, BOOL nondefault_only) return num_saved; } -U32 LLControlGroup::loadFromFile(const LLString& filename, BOOL require_declaration, eControlType declare_as) +U32 LLControlGroup::loadFromFile(const LLString& filename) { LLString name; LLSD settings; @@ -965,24 +965,47 @@ U32 LLControlGroup::loadFromFile(const LLString& filename, BOOL require_declarat llwarns << "Cannot find file " << filename << " to load." << llendl; return 0; } + S32 ret = LLSDSerialize::fromXML(settings, infile); + if (ret <= 0) { infile.close(); llwarns << "Unable to open LLSD control file " << filename << ". Trying Legacy Method." << llendl; - return loadFromFileLegacy(filename, require_declaration, declare_as); + return loadFromFileLegacy(filename, TRUE, TYPE_STRING); } - U32 validitems = 0; + U32 validitems = 0; int persist = 1; for(LLSD::map_const_iterator itr = settings.beginMap(); itr != settings.endMap(); ++itr) { name = (*itr).first; control_map = (*itr).second; - if(control_map.has("Persist")) persist = control_map["Persist"].asInteger(); + if(control_map.has("Persist")) + { + persist = control_map["Persist"].asInteger(); + } - declareControl(name, typeStringToEnum(control_map["Type"].asString()), control_map["Value"], control_map["Comment"].asString(), persist); + // If the control exists just set the value from the input file. + LLControlVariable* existing_control = getControl(name); + if(existing_control) + { + // Check persistence. If not persisted, we shouldn't be loading. + if(existing_control->isPersisted()) + { + existing_control->setValue(control_map["Value"]); + } + } + else + { + declareControl(name, + typeStringToEnum(control_map["Type"].asString()), + control_map["Value"], + control_map["Comment"].asString(), + persist + ); + } ++validitems; } diff --git a/indra/llxml/llcontrol.h b/indra/llxml/llcontrol.h index 7a638a7b73..7287731cfa 100644 --- a/indra/llxml/llcontrol.h +++ b/indra/llxml/llcontrol.h @@ -213,7 +213,7 @@ public: // as the given type. U32 loadFromFileLegacy(const LLString& filename, BOOL require_declaration = TRUE, eControlType declare_as = TYPE_STRING); U32 saveToFile(const LLString& filename, BOOL nondefault_only); - U32 loadFromFile(const LLString& filename, BOOL require_declaration = TRUE, eControlType declare_as = TYPE_STRING); + U32 loadFromFile(const LLString& filename); void resetToDefaults(); diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 41566d68d0..73a832ead7 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -5829,7 +5829,7 @@ <key>RenderUseCleverUI</key> <map> <key>Comment</key> - <string>Turns on the \"clever\" UI rendering optimization. It's a known performace gain (and enabled by default) on apple.</string> + <string>Turns on the \"clever\" UI rendering optimization. It's a known performace gain on apple.</string> <key>Persist</key> <integer>1</integer> <key>Type</key> @@ -9825,17 +9825,6 @@ <integer>0</integer> </array> </map> - <key>AlertedUnsupportedHardware</key> - <map> - <key>Comment</key> - <string>Toggle that lets us tell the user he's on old hardware only once</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>Boolean</string> - <key>Value</key> - <integer>0</integer> - </map> <key>RenderFastAlpha</key> <map> <key>Comment</key> diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 572927f918..ee471d21ac 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -64,6 +64,7 @@ #include "llurldispatcher.h" #include "llurlhistory.h" #include "llfirstuse.h" +#include "llglimmediate.h" #include "llweb.h" #include "llsecondlifeurls.h" @@ -416,10 +417,11 @@ static void settings_to_globals() static void settings_modify() { LLRenderTarget::sUseFBO = gSavedSettings.getBOOL("RenderUseFBO"); - LLVOAvatar::sUseImpostors = FALSE; //gSavedSettings.getBOOL("RenderUseImpostors"); + LLVOAvatar::sUseImpostors = gSavedSettings.getBOOL("RenderUseImpostors"); LLVOSurfacePatch::sLODFactor = gSavedSettings.getF32("RenderTerrainLODFactor"); LLVOSurfacePatch::sLODFactor *= LLVOSurfacePatch::sLODFactor; //sqaure lod factor to get exponential range of [1,4] - + gGL.setClever(gSavedSettings.getBOOL("RenderUseCleverUI")); + #if LL_VECTORIZE if (gSysCPU.hasAltivec()) { @@ -774,15 +776,6 @@ bool LLAppViewer::init() return 1; } -#if LL_DARWIN - // Display the release notes for the current version - if(!gHideLinks && gCurrentVersion != gLastRunVersion) - { - // Current version and last run version don't match exactly. Display the release notes. - DisplayReleaseNotes(); - } -#endif - // // Initialize the window // @@ -821,51 +814,55 @@ bool LLAppViewer::init() return 0; } - // alert the user if they are using unsupported hardware - if(!gSavedSettings.getBOOL("AlertedUnsupportedHardware")) - { - bool unsupported = false; - LLString::format_map_t args; - LLString minSpecs; + + bool unsupported = false; + LLString::format_map_t args; + LLString minSpecs; - // get cpu data from xml - std::stringstream minCPUString(LLAlertDialog::getTemplateMessage("UnsupportedCPUAmount")); - S32 minCPU = 0; - minCPUString >> minCPU; - - // get RAM data from XML - std::stringstream minRAMString(LLAlertDialog::getTemplateMessage("UnsupportedRAMAmount")); - U64 minRAM = 0; - minRAMString >> minRAM; - minRAM = minRAM * 1024 * 1024; - - if(!LLFeatureManager::getInstance()->isGPUSupported()) - { - minSpecs += LLAlertDialog::getTemplateMessage("UnsupportedGPU"); - minSpecs += "\n"; - unsupported = true; - } - if(gSysCPU.getMhz() < minCPU) - { - minSpecs += LLAlertDialog::getTemplateMessage("UnsupportedCPU"); - minSpecs += "\n"; - unsupported = true; - } - if(gSysMemory.getPhysicalMemoryClamped() < minRAM) - { - minSpecs += LLAlertDialog::getTemplateMessage("UnsupportedRAM"); - minSpecs += "\n"; - unsupported = true; - } + // get cpu data from xml + std::stringstream minCPUString(LLAlertDialog::getTemplateMessage("UnsupportedCPUAmount")); + S32 minCPU = 0; + minCPUString >> minCPU; + + // get RAM data from XML + std::stringstream minRAMString(LLAlertDialog::getTemplateMessage("UnsupportedRAMAmount")); + U64 minRAM = 0; + minRAMString >> minRAM; + minRAM = minRAM * 1024 * 1024; + + if(!LLFeatureManager::getInstance()->isGPUSupported() && LLFeatureManager::getInstance()->getGPUClass() != GPU_CLASS_UNKNOWN) + { + minSpecs += LLAlertDialog::getTemplateMessage("UnsupportedGPU"); + minSpecs += "\n"; + unsupported = true; + } + if(gSysCPU.getMhz() < minCPU) + { + minSpecs += LLAlertDialog::getTemplateMessage("UnsupportedCPU"); + minSpecs += "\n"; + unsupported = true; + } + if(gSysMemory.getPhysicalMemoryClamped() < minRAM) + { + minSpecs += LLAlertDialog::getTemplateMessage("UnsupportedRAM"); + minSpecs += "\n"; + unsupported = true; + } - if(unsupported) + if (LLFeatureManager::getInstance()->getGPUClass() == GPU_CLASS_UNKNOWN) + { + gViewerWindow->alertXml("UnknownGPU"); + } + + if(unsupported) + { + if(!gSavedSettings.controlExists("WarnUnsupportedHardware") + || gSavedSettings.getBOOL("WarnUnsupportedHardware")) { args["MINSPECS"] = minSpecs; gViewerWindow->alertXml("UnsupportedHardware", args ); - - // turn off flag - gSavedSettings.setBOOL("AlertedUnsupportedHardware", TRUE); } + } // Save the current version to the prefs file @@ -1452,10 +1449,13 @@ void LLAppViewer::loadSettingsFromDirectory(ELLPath path_index) LLString full_settings_path = gDirUtilp->getExpandedFilename(path_index, settings_file); - if(settings_name == sGlobalSettingsName) + if(settings_name == sGlobalSettingsName + && path_index == LL_PATH_USER_SETTINGS) { // The non-persistent setting, ClientSettingsFile, specifies a // custom name to use for the global settings file. + // Only apply this setting if this method is setting the 'Global' + // settings from the user_settings path. std::string custom_path; if(gSettings[sGlobalSettingsName]->controlExists("ClientSettingsFile")) { diff --git a/indra/newview/llcylinder.cpp b/indra/newview/llcylinder.cpp index 58a80c21e4..82db7788d6 100644 --- a/indra/newview/llcylinder.cpp +++ b/indra/newview/llcylinder.cpp @@ -255,7 +255,6 @@ void LLCone::render(S32 level_of_detail) // center object at 0 glTranslatef(0.f, 0.f, - height / 2.0f); - LLVertexBuffer::unbind(); drawSide(level_of_detail); drawBottom(level_of_detail); diff --git a/indra/newview/lldrawable.cpp b/indra/newview/lldrawable.cpp index 198c235a1e..06536660e2 100644 --- a/indra/newview/lldrawable.cpp +++ b/indra/newview/lldrawable.cpp @@ -1188,10 +1188,11 @@ void LLSpatialBridge::setVisible(LLCamera& camera_in, std::vector<LLDrawable*>* LLVector3 center = (mExtents[0] + mExtents[1]) * 0.5f; LLVector3 size = (mExtents[1]-mExtents[0]) * 0.5f; - if (camera_in.AABBInFrustumNoFarClip(center, size) && - AABBSphereIntersect(mExtents[0], mExtents[1], camera_in.getOrigin(), camera_in.mFrustumCornerDist)) + if (LLPipeline::sImpostorRender || + (camera_in.AABBInFrustumNoFarClip(center, size) && + AABBSphereIntersect(mExtents[0], mExtents[1], camera_in.getOrigin(), camera_in.mFrustumCornerDist))) { - if (LLPipeline::calcPixelArea(center, size, camera_in) < FORCE_INVISIBLE_AREA) + if (!LLPipeline::sImpostorRender && LLPipeline::calcPixelArea(center, size, camera_in) < FORCE_INVISIBLE_AREA) { return; } diff --git a/indra/newview/lldrawpool.cpp b/indra/newview/lldrawpool.cpp index c987f3e035..6cd2152a28 100644 --- a/indra/newview/lldrawpool.cpp +++ b/indra/newview/lldrawpool.cpp @@ -115,7 +115,6 @@ LLDrawPool::LLDrawPool(const U32 type) sNumDrawPools++; mId = sNumDrawPools; mVertexShaderLevel = 0; - mIndicesDrawn = 0; } LLDrawPool::~LLDrawPool() @@ -136,24 +135,6 @@ void LLDrawPool::beginRenderPass( S32 pass ) //virtual void LLDrawPool::endRenderPass( S32 pass ) { - glDisableClientState ( GL_TEXTURE_COORD_ARRAY ); - glDisableClientState ( GL_COLOR_ARRAY ); - glDisableClientState ( GL_NORMAL_ARRAY ); -} - -U32 LLDrawPool::getTrianglesDrawn() const -{ - return mIndicesDrawn / 3; -} - -void LLDrawPool::resetTrianglesDrawn() -{ - mIndicesDrawn = 0; -} - -void LLDrawPool::addIndicesDrawn(const U32 indices) -{ - mIndicesDrawn += indices; } //============================= @@ -224,7 +205,7 @@ void LLFacePool::drawLoop() { if (!mDrawFace.empty()) { - mIndicesDrawn += drawLoop(mDrawFace); + drawLoop(mDrawFace); } } @@ -382,10 +363,6 @@ void LLRenderPass::renderTexture(U32 type, U32 mask) void LLRenderPass::pushBatches(U32 type, U32 mask, BOOL texture) { -#if !LL_RELEASE_FOR_DOWNLOAD - LLGLState::checkClientArrays(mask); -#endif - for (LLCullResult::drawinfo_list_t::iterator i = gPipeline.beginRenderMap(type); i != gPipeline.endRenderMap(type); ++i) { LLDrawInfo* pparams = *i; @@ -436,9 +413,7 @@ void LLRenderPass::pushBatch(LLDrawInfo& params, U32 mask, BOOL texture) if (params.mVertexBuffer.notNull()) { params.mVertexBuffer->setBuffer(mask); - U16* indices_pointer = (U16*) params.mVertexBuffer->getIndicesPointer(); - glDrawRangeElements(GL_TRIANGLES, params.mStart, params.mEnd, params.mCount, - GL_UNSIGNED_SHORT, indices_pointer+params.mOffset); + params.mVertexBuffer->drawRange(LLVertexBuffer::TRIANGLES, params.mStart, params.mEnd, params.mCount, params.mOffset); gPipeline.addTrianglesDrawn(params.mCount/3); } diff --git a/indra/newview/lldrawpool.h b/indra/newview/lldrawpool.h index 30a16a24ba..3bd1f686d1 100644 --- a/indra/newview/lldrawpool.h +++ b/indra/newview/lldrawpool.h @@ -90,15 +90,10 @@ public: virtual BOOL isFacePool() { return FALSE; } virtual void resetDrawOrders() = 0; - U32 getTrianglesDrawn() const; - void resetTrianglesDrawn(); - void addIndicesDrawn(const U32 indices); - protected: S32 mVertexShaderLevel; S32 mId; U32 mType; // Type of draw pool - S32 mIndicesDrawn; }; class LLRenderPass : public LLDrawPool diff --git a/indra/newview/lldrawpoolalpha.cpp b/indra/newview/lldrawpoolalpha.cpp index d22c459278..795f6bc396 100644 --- a/indra/newview/lldrawpoolalpha.cpp +++ b/indra/newview/lldrawpoolalpha.cpp @@ -77,9 +77,6 @@ void LLDrawPoolAlpha::prerender() void LLDrawPoolAlpha::beginRenderPass(S32 pass) { LLFastTimer t(LLFastTimer::FTM_RENDER_ALPHA); - glEnableClientState(GL_TEXTURE_COORD_ARRAY); - glEnableClientState(GL_NORMAL_ARRAY); - glEnableClientState(GL_COLOR_ARRAY); if (LLPipeline::sUnderWaterRender) { @@ -128,8 +125,6 @@ void LLDrawPoolAlpha::render(S32 pass) { glUseProgramObjectARB(0); } - glDisableClientState(GL_NORMAL_ARRAY); - glDisableClientState(GL_COLOR_ARRAY); gPipeline.enableLightsFullbright(LLColor4(1,1,1,1)); glColor4f(1,0,0,1); LLViewerImage::sSmokeImagep->addTextureStats(1024.f*1024.f); @@ -141,10 +136,6 @@ void LLDrawPoolAlpha::render(S32 pass) void LLDrawPoolAlpha::renderAlpha(U32 mask) { -#if !LL_RELEASE_FOR_DOWNLOAD - LLGLState::checkClientArrays(mask); -#endif - for (LLCullResult::sg_list_t::iterator i = gPipeline.beginAlphaGroups(); i != gPipeline.endAlphaGroups(); ++i) { LLSpatialGroup* group = *i; @@ -182,9 +173,7 @@ void LLDrawPoolAlpha::renderAlphaHighlight(U32 mask) LLRenderPass::applyModelMatrix(params); params.mVertexBuffer->setBuffer(mask); - U16* indices_pointer = (U16*) params.mVertexBuffer->getIndicesPointer(); - glDrawRangeElements(GL_TRIANGLES, params.mStart, params.mEnd, params.mCount, - GL_UNSIGNED_SHORT, indices_pointer+params.mOffset); + params.mVertexBuffer->drawRange(LLVertexBuffer::TRIANGLES, params.mStart, params.mEnd, params.mCount, params.mOffset); gPipeline.addTrianglesDrawn(params.mCount/3); } } @@ -303,9 +292,7 @@ void LLDrawPoolAlpha::renderGroupAlpha(LLSpatialGroup* group, U32 type, U32 mask } params.mVertexBuffer->setBuffer(mask); - U16* indices_pointer = (U16*) params.mVertexBuffer->getIndicesPointer(); - glDrawRangeElements(GL_TRIANGLES, params.mStart, params.mEnd, params.mCount, - GL_UNSIGNED_SHORT, indices_pointer+params.mOffset); + params.mVertexBuffer->drawRange(LLVertexBuffer::TRIANGLES, params.mStart, params.mEnd, params.mCount, params.mOffset); gPipeline.addTrianglesDrawn(params.mCount/3); if (params.mTextureMatrix && texture && params.mTexture.notNull()) diff --git a/indra/newview/lldrawpoolavatar.cpp b/indra/newview/lldrawpoolavatar.cpp index 6db67fb269..99bb2049b5 100644 --- a/indra/newview/lldrawpoolavatar.cpp +++ b/indra/newview/lldrawpoolavatar.cpp @@ -216,13 +216,11 @@ void LLDrawPoolAvatar::beginFootShadow() } gPipeline.enableLightsFullbright(LLColor4(1,1,1,1)); - glEnableClientState(GL_TEXTURE_COORD_ARRAY); } void LLDrawPoolAvatar::endFootShadow() { gPipeline.enableLightsDynamic(); - glDisableClientState(GL_TEXTURE_COORD_ARRAY); } void LLDrawPoolAvatar::beginRigid() @@ -247,16 +245,11 @@ void LLDrawPoolAvatar::beginRigid() { sVertexProgram = NULL; } - - glEnableClientState(GL_NORMAL_ARRAY); - glEnableClientState(GL_TEXTURE_COORD_ARRAY); } void LLDrawPoolAvatar::endRigid() { sShaderLevel = mVertexShaderLevel; - glDisableClientState(GL_NORMAL_ARRAY); - glDisableClientState(GL_TEXTURE_COORD_ARRAY); if (sVertexProgram != NULL) { sVertexProgram->unbind(); @@ -265,9 +258,6 @@ void LLDrawPoolAvatar::endRigid() void LLDrawPoolAvatar::beginSkinned() { - glEnableClientState(GL_NORMAL_ARRAY); - glEnableClientState(GL_TEXTURE_COORD_ARRAY); - if (sShaderLevel > 0) { if (LLPipeline::sUnderWaterRender) @@ -295,8 +285,7 @@ void LLDrawPoolAvatar::beginSkinned() if (sShaderLevel > 0) // for hardware blending { sRenderingSkinned = TRUE; - glClientActiveTextureARB(GL_TEXTURE1_ARB); - + sVertexProgram->bind(); if (sShaderLevel >= SHADER_LEVEL_CLOTH) { @@ -331,7 +320,6 @@ void LLDrawPoolAvatar::endSkinned() sRenderingSkinned = FALSE; sVertexProgram->disableTexture(LLShaderMgr::BUMP_MAP); glActiveTextureARB(GL_TEXTURE0_ARB); - glClientActiveTextureARB(GL_TEXTURE0_ARB); disable_vertex_weighting(sVertexProgram->mAttribute[LLShaderMgr::AVATAR_WEIGHT]); if (sShaderLevel >= SHADER_LEVEL_BUMP) { @@ -356,10 +344,6 @@ void LLDrawPoolAvatar::endSkinned() } glActiveTextureARB(GL_TEXTURE0_ARB); - glClientActiveTextureARB(GL_TEXTURE0_ARB); - - glDisableClientState(GL_NORMAL_ARRAY); - glDisableClientState(GL_TEXTURE_COORD_ARRAY); } @@ -438,7 +422,7 @@ void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass) } else if (gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_FOOT_SHADOWS)) { - mIndicesDrawn += avatarp->renderFootShadows(); + avatarp->renderFootShadows(); } return; } @@ -451,7 +435,7 @@ void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass) if (pass == 1) { // render rigid meshes (eyeballs) first - mIndicesDrawn += avatarp->renderRigid(); + avatarp->renderRigid(); return; } @@ -548,7 +532,7 @@ void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass) color.setColor(1.0f, 1.0f, 1.0f, 1.0f); } - mIndicesDrawn += avatarp->renderSkinned(AVATAR_RENDER_PASS_SINGLE); + avatarp->renderSkinned(AVATAR_RENDER_PASS_SINGLE); } } @@ -609,9 +593,6 @@ void LLDrawPoolAvatar::renderForSelect() return; } - glEnableClientState(GL_VERTEX_ARRAY); - glEnableClientState(GL_NORMAL_ARRAY); - glEnableClientState(GL_TEXTURE_COORD_ARRAY); sVertexProgram = &gAvatarPickProgram; if (sShaderLevel > 0) { @@ -624,13 +605,12 @@ void LLDrawPoolAvatar::renderForSelect() if ((sShaderLevel > 0) && !gUseGLPick) // for hardware blending { - glClientActiveTextureARB(GL_TEXTURE0_ARB); sRenderingSkinned = TRUE; sVertexProgram->bind(); enable_vertex_weighting(sVertexProgram->mAttribute[LLShaderMgr::AVATAR_WEIGHT]); } - mIndicesDrawn += avatarp->renderSkinned(AVATAR_RENDER_PASS_SINGLE); + avatarp->renderSkinned(AVATAR_RENDER_PASS_SINGLE); // if we're in software-blending, remember to set the fence _after_ we draw so we wait till this rendering is done if ((sShaderLevel > 0) && !gUseGLPick) @@ -645,8 +625,6 @@ void LLDrawPoolAvatar::renderForSelect() // restore texture mode glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); - glDisableClientState(GL_NORMAL_ARRAY); - glDisableClientState(GL_TEXTURE_COORD_ARRAY); } //----------------------------------------------------------------------------- diff --git a/indra/newview/lldrawpoolbump.cpp b/indra/newview/lldrawpoolbump.cpp index b35ef81803..e5c9200cad 100644 --- a/indra/newview/lldrawpoolbump.cpp +++ b/indra/newview/lldrawpoolbump.cpp @@ -316,12 +316,8 @@ void LLDrawPoolBump::beginShiny(bool invisible) mShiny = TRUE; sVertexMask = VERTEX_MASK_SHINY; // Second pass: environment map - glEnableClientState(GL_VERTEX_ARRAY); - glEnableClientState(GL_NORMAL_ARRAY); - glEnableClientState(GL_COLOR_ARRAY); if (!invisible && mVertexShaderLevel > 1) { - glEnableClientState(GL_TEXTURE_COORD_ARRAY); sVertexMask = VERTEX_MASK_SHINY | LLVertexBuffer::MAP_TEXCOORD; } @@ -456,13 +452,7 @@ void LLDrawPoolBump::endShiny(bool invisible) LLImageGL::unbindTexture(0, GL_TEXTURE_2D); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); - glDisableClientState(GL_NORMAL_ARRAY); - glDisableClientState(GL_COLOR_ARRAY); - if (!invisible && mVertexShaderLevel > 1) - { - glDisableClientState(GL_TEXTURE_COORD_ARRAY); - } - + diffuse_channel = -1; cube_channel = 0; mShiny = FALSE; @@ -479,10 +469,6 @@ void LLDrawPoolBump::beginFullbrightShiny() sVertexMask = VERTEX_MASK_SHINY | LLVertexBuffer::MAP_TEXCOORD; // Second pass: environment map - glEnableClientState(GL_VERTEX_ARRAY); - glEnableClientState(GL_NORMAL_ARRAY); - glEnableClientState(GL_COLOR_ARRAY); - glEnableClientState(GL_TEXTURE_COORD_ARRAY); if (LLPipeline::sUnderWaterRender) { @@ -564,9 +550,6 @@ void LLDrawPoolBump::endFullbrightShiny() LLImageGL::unbindTexture(0, GL_TEXTURE_2D); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); - glDisableClientState(GL_NORMAL_ARRAY); - glDisableClientState(GL_COLOR_ARRAY); - glDisableClientState(GL_TEXTURE_COORD_ARRAY); diffuse_channel = -1; cube_channel = 0; @@ -607,9 +590,7 @@ void LLDrawPoolBump::renderGroup(LLSpatialGroup* group, U32 type, U32 mask, BOOL applyModelMatrix(params); params.mVertexBuffer->setBuffer(mask); - U16* indices_pointer = (U16*) params.mVertexBuffer->getIndicesPointer(); - glDrawRangeElements(GL_TRIANGLES, params.mStart, params.mEnd, params.mCount, - GL_UNSIGNED_SHORT, indices_pointer+params.mOffset); + params.mVertexBuffer->drawRange(LLVertexBuffer::TRIANGLES, params.mStart, params.mEnd, params.mCount, params.mOffset); gPipeline.addTrianglesDrawn(params.mCount/3); } } @@ -670,8 +651,6 @@ void LLDrawPoolBump::beginBump() // TEXTURE UNIT 0 // Output.rgb = texture at texture coord 0 glActiveTextureARB(GL_TEXTURE0_ARB); - glClientActiveTextureARB(GL_TEXTURE0_ARB); - glEnableClientState(GL_TEXTURE_COORD_ARRAY); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB); glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_REPLACE); @@ -686,8 +665,6 @@ void LLDrawPoolBump::beginBump() // TEXTURE UNIT 1 glActiveTextureARB(GL_TEXTURE1_ARB); - glClientActiveTextureARB(GL_TEXTURE1_ARB); - glEnableClientState(GL_TEXTURE_COORD_ARRAY); glEnable(GL_TEXTURE_2D); // Texture unit 1 @@ -752,15 +729,11 @@ void LLDrawPoolBump::endBump() // Disable texture unit 1 glActiveTextureARB(GL_TEXTURE1_ARB); - glClientActiveTextureARB(GL_TEXTURE1_ARB); glDisable(GL_TEXTURE_2D); // Texture unit 1 - glDisableClientState(GL_TEXTURE_COORD_ARRAY); glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); // Disable texture unit 0 glActiveTextureARB(GL_TEXTURE0_ARB); - glClientActiveTextureARB(GL_TEXTURE0_ARB); - glDisableClientState(GL_TEXTURE_COORD_ARRAY); glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); gGL.blendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); @@ -1091,10 +1064,6 @@ void LLBumpImageList::onSourceLoaded( BOOL success, LLViewerImage *src_vi, LLIma void LLDrawPoolBump::renderBump(U32 type, U32 mask) { -#if !LL_RELEASE_FOR_DOWNLOAD - LLGLState::checkClientArrays(mask); -#endif - LLCullResult::drawinfo_list_t::iterator begin = gPipeline.beginRenderMap(type); LLCullResult::drawinfo_list_t::iterator end = gPipeline.endRenderMap(type); @@ -1178,11 +1147,8 @@ void LLDrawPoolBump::pushBatch(LLDrawInfo& params, U32 mask, BOOL texture) } params.mVertexBuffer->setBuffer(mask); - U16* indices_pointer = (U16*) params.mVertexBuffer->getIndicesPointer(); - glDrawRangeElements(GL_TRIANGLES, params.mStart, params.mEnd, params.mCount, - GL_UNSIGNED_SHORT, indices_pointer+params.mOffset); + params.mVertexBuffer->drawRange(LLVertexBuffer::TRIANGLES, params.mStart, params.mEnd, params.mCount, params.mOffset); gPipeline.addTrianglesDrawn(params.mCount/3); - if (params.mTextureMatrix) { if (mShiny) diff --git a/indra/newview/lldrawpoolground.cpp b/indra/newview/lldrawpoolground.cpp index d71c6de9cd..3500d9471f 100644 --- a/indra/newview/lldrawpoolground.cpp +++ b/indra/newview/lldrawpoolground.cpp @@ -68,9 +68,6 @@ void LLDrawPoolGround::render(S32 pass) return; } - glEnableClientState(GL_TEXTURE_COORD_ARRAY); - glEnableClientState(GL_VERTEX_ARRAY); - LLGLSPipelineSkyBox gls_skybox; LLImageGL::unbindTexture(0, GL_TEXTURE_2D); LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE); diff --git a/indra/newview/lldrawpoolsimple.cpp b/indra/newview/lldrawpoolsimple.cpp index 174a9ac427..a2a82eada5 100644 --- a/indra/newview/lldrawpoolsimple.cpp +++ b/indra/newview/lldrawpoolsimple.cpp @@ -65,13 +65,10 @@ void LLDrawPoolGlow::render(S32 pass) gPipeline.enableLightsFullbright(LLColor4(1,1,1,1)); } - glEnableClientState(GL_TEXTURE_COORD_ARRAY); LLGLDepthTest depth(GL_TRUE, GL_FALSE); glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_TRUE); renderTexture(LLRenderPass::PASS_GLOW, getVertexDataMask()); - - glDisableClientState(GL_TEXTURE_COORD_ARRAY); - + glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_FALSE); gGL.blendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); @@ -101,10 +98,6 @@ void LLDrawPoolSimple::prerender() void LLDrawPoolSimple::beginRenderPass(S32 pass) { LLFastTimer t(LLFastTimer::FTM_RENDER_SIMPLE); - glEnableClientState(GL_VERTEX_ARRAY); - glEnableClientState(GL_TEXTURE_COORD_ARRAY); - glEnableClientState(GL_NORMAL_ARRAY); - glEnableClientState(GL_COLOR_ARRAY); if (LLPipeline::sUnderWaterRender) { @@ -136,7 +129,6 @@ void LLDrawPoolSimple::endRenderPass(S32 pass) { LLFastTimer t(LLFastTimer::FTM_RENDER_SIMPLE); LLRenderPass::endRenderPass(pass); - glDisableClientState(GL_TEXTURE_COORD_ARRAY); if (mVertexShaderLevel > 0){ @@ -177,7 +169,6 @@ void LLDrawPoolSimple::render(S32 pass) } LLFastTimer t(LLFastTimer::FTM_RENDER_FULLBRIGHT); U32 fullbright_mask = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD | LLVertexBuffer::MAP_COLOR; - glDisableClientState(GL_NORMAL_ARRAY); renderTexture(LLRenderPass::PASS_FULLBRIGHT, fullbright_mask); } diff --git a/indra/newview/lldrawpoolsky.cpp b/indra/newview/lldrawpoolsky.cpp index d3273f2eeb..828c9b0848 100644 --- a/indra/newview/lldrawpoolsky.cpp +++ b/indra/newview/lldrawpoolsky.cpp @@ -113,10 +113,6 @@ void LLDrawPoolSky::render(S32 pass) LLVector3 origin = LLViewerCamera::getInstance()->getOrigin(); glTranslatef(origin.mV[0], origin.mV[1], origin.mV[2]); - glEnableClientState(GL_VERTEX_ARRAY); - glEnableClientState(GL_TEXTURE_COORD_ARRAY); - glDisableClientState(GL_NORMAL_ARRAY); - S32 face_count = (S32)mDrawFace.size(); for (S32 i = 0; i < llmin(6, face_count); ++i) @@ -160,8 +156,6 @@ void LLDrawPoolSky::render(S32 pass) // renderHeavenlyBody(1, hbfaces[1]); } - glDisableClientState(GL_TEXTURE_COORD_ARRAY); - glPopMatrix(); } @@ -184,8 +178,6 @@ void LLDrawPoolSky::renderSkyCubeFace(U8 side) glColor4f(1, 1, 1, LLSkyTex::getInterpVal()); // lighting is disabled face.renderIndexed(); } - - mIndicesDrawn += face.getIndicesCount(); } void LLDrawPoolSky::renderHeavenlyBody(U8 hb, LLFace* face) @@ -198,7 +190,6 @@ void LLDrawPoolSky::renderHeavenlyBody(U8 hb, LLFace* face) LLColor4 color(mHB[hb]->getInterpColor()); LLOverrideFaceColor override(this, color); face->renderIndexed(); - mIndicesDrawn += face->getIndicesCount(); } @@ -215,7 +206,6 @@ void LLDrawPoolSky::renderSunHalo(LLFace* face) LLOverrideFaceColor override(this, color); face->renderIndexed(); - mIndicesDrawn += face->getIndicesCount(); } diff --git a/indra/newview/lldrawpoolterrain.cpp b/indra/newview/lldrawpoolterrain.cpp index 634b502057..4747043c78 100644 --- a/indra/newview/lldrawpoolterrain.cpp +++ b/indra/newview/lldrawpoolterrain.cpp @@ -217,14 +217,6 @@ void LLDrawPoolTerrain::render(S32 pass) void LLDrawPoolTerrain::renderFullShader() { - glEnableClientState(GL_VERTEX_ARRAY); - glEnableClientState(GL_NORMAL_ARRAY); - - if (gPipeline.getLightingDetail() >= 2) - { - glEnableClientState(GL_COLOR_ARRAY); - } - // Hack! Get the region that this draw pool is rendering from! LLViewerRegion *regionp = mDrawFace[0]->getDrawable()->getVObj()->getRegion(); LLVLComposition *compp = regionp->getComposition(); @@ -247,10 +239,8 @@ void LLDrawPoolTerrain::renderFullShader() // S32 detail0 = sShader->enableTexture(LLShaderMgr::TERRAIN_DETAIL0); LLViewerImage::bindTexture(detail_texture0p,detail0); - glClientActiveTextureARB(GL_TEXTURE0_ARB); glActiveTextureARB(GL_TEXTURE0_ARB); - glDisableClientState(GL_TEXTURE_COORD_ARRAY); glEnable(GL_TEXTURE_GEN_S); glEnable(GL_TEXTURE_GEN_T); glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR); @@ -269,9 +259,7 @@ void LLDrawPoolTerrain::renderFullShader() LLViewerImage::bindTexture(detail_texture1p,detail1); /// ALPHA TEXTURE COORDS 0: - glClientActiveTextureARB(GL_TEXTURE1_ARB); glActiveTextureARB(GL_TEXTURE1_ARB); - glEnableClientState(GL_TEXTURE_COORD_ARRAY); glMatrixMode(GL_TEXTURE); glLoadIdentity(); glMatrixMode(GL_MODELVIEW); @@ -283,9 +271,7 @@ void LLDrawPoolTerrain::renderFullShader() glEnable(GL_TEXTURE_2D); /// ALPHA TEXTURE COORDS 1: - glClientActiveTextureARB(GL_TEXTURE2_ARB); glActiveTextureARB(GL_TEXTURE2_ARB); - glEnableClientState(GL_TEXTURE_COORD_ARRAY); glMatrixMode(GL_TEXTURE); glLoadIdentity(); glTranslatef(-2.f, 0.f, 0.f); @@ -298,9 +284,7 @@ void LLDrawPoolTerrain::renderFullShader() LLViewerImage::bindTexture(detail_texture3p,detail3); /// ALPHA TEXTURE COORDS 2: - glClientActiveTextureARB(GL_TEXTURE3_ARB); glActiveTextureARB(GL_TEXTURE3_ARB); - glEnableClientState(GL_TEXTURE_COORD_ARRAY); glMatrixMode(GL_TEXTURE); glLoadIdentity(); glTranslatef(-1.f, 0.f, 0.f); @@ -323,7 +307,6 @@ void LLDrawPoolTerrain::renderFullShader() sShader->disableTexture(LLShaderMgr::TERRAIN_DETAIL3); LLImageGL::unbindTexture(alpha_ramp, GL_TEXTURE_2D); - glClientActiveTextureARB(GL_TEXTURE4_ARB); glActiveTextureARB(GL_TEXTURE4_ARB); glDisable(GL_TEXTURE_2D); // Texture unit 4 glDisable(GL_TEXTURE_GEN_S); @@ -333,10 +316,8 @@ void LLDrawPoolTerrain::renderFullShader() glMatrixMode(GL_MODELVIEW); LLImageGL::unbindTexture(detail3, GL_TEXTURE_2D); - glClientActiveTextureARB(GL_TEXTURE3_ARB); glActiveTextureARB(GL_TEXTURE3_ARB); glDisable(GL_TEXTURE_2D); - glDisableClientState(GL_TEXTURE_COORD_ARRAY); glDisable(GL_TEXTURE_GEN_S); glDisable(GL_TEXTURE_GEN_T); glMatrixMode(GL_TEXTURE); @@ -344,10 +325,8 @@ void LLDrawPoolTerrain::renderFullShader() glMatrixMode(GL_MODELVIEW); LLImageGL::unbindTexture(detail2, GL_TEXTURE_2D); - glClientActiveTextureARB(GL_TEXTURE2_ARB); glActiveTextureARB(GL_TEXTURE2_ARB); glDisable(GL_TEXTURE_2D); - glDisableClientState(GL_TEXTURE_COORD_ARRAY); glDisable(GL_TEXTURE_GEN_S); glDisable(GL_TEXTURE_GEN_T); glMatrixMode(GL_TEXTURE); @@ -355,10 +334,8 @@ void LLDrawPoolTerrain::renderFullShader() glMatrixMode(GL_MODELVIEW); LLImageGL::unbindTexture(detail1, GL_TEXTURE_2D); - glClientActiveTextureARB(GL_TEXTURE1_ARB); glActiveTextureARB(GL_TEXTURE1_ARB); glDisable(GL_TEXTURE_2D); - glDisableClientState(GL_TEXTURE_COORD_ARRAY); glDisable(GL_TEXTURE_GEN_S); glDisable(GL_TEXTURE_GEN_T); glMatrixMode(GL_TEXTURE); @@ -369,7 +346,6 @@ void LLDrawPoolTerrain::renderFullShader() // Restore Texture Unit 0 defaults LLImageGL::unbindTexture(detail0, GL_TEXTURE_2D); - glClientActiveTextureARB(GL_TEXTURE0_ARB); glActiveTextureARB(GL_TEXTURE0_ARB); glEnable(GL_TEXTURE_2D); glDisable(GL_TEXTURE_GEN_S); @@ -377,14 +353,11 @@ void LLDrawPoolTerrain::renderFullShader() glMatrixMode(GL_TEXTURE); glLoadIdentity(); glMatrixMode(GL_MODELVIEW); - - // Restore non Texture Unit specific defaults - glDisableClientState(GL_NORMAL_ARRAY); } void LLDrawPoolTerrain::renderFull4TU() { - glEnableClientState(GL_VERTEX_ARRAY); + glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_NORMAL_ARRAY); // Hack! Get the region that this draw pool is rendering from! @@ -434,9 +407,8 @@ void LLDrawPoolTerrain::renderFull4TU() // // Stage 1: Generate alpha ramp for detail0/detail1 transition // - glActiveTextureARB(GL_TEXTURE1_ARB); LLViewerImage::bindTexture(m2DAlphaRampImagep,1); - + glActiveTextureARB(GL_TEXTURE1_ARB); glEnable(GL_TEXTURE_2D); // Texture unit 1 glClientActiveTextureARB(GL_TEXTURE1_ARB); glEnableClientState(GL_TEXTURE_COORD_ARRAY); @@ -454,8 +426,8 @@ void LLDrawPoolTerrain::renderFull4TU() // // Stage 2: Interpolate detail1 with existing based on ramp // - glActiveTextureARB(GL_TEXTURE2_ARB); LLViewerImage::bindTexture(detail_texture1p,2); + glActiveTextureARB(GL_TEXTURE2_ARB); glEnable(GL_TEXTURE_2D); // Texture unit 2 glClientActiveTextureARB(GL_TEXTURE2_ARB); @@ -480,8 +452,8 @@ void LLDrawPoolTerrain::renderFull4TU() // // Stage 3: Modulate with primary (vertex) color for lighting // - glActiveTextureARB(GL_TEXTURE3_ARB); LLViewerImage::bindTexture(detail_texture1p,3); // bind any texture + glActiveTextureARB(GL_TEXTURE3_ARB); glEnable(GL_TEXTURE_2D); // Texture unit 3 glClientActiveTextureARB(GL_TEXTURE3_ARB); @@ -494,6 +466,7 @@ void LLDrawPoolTerrain::renderFull4TU() glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_PRIMARY_COLOR_ARB); glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_SRC_COLOR); + glActiveTextureARB(GL_TEXTURE0_ARB); // GL_BLEND disabled by default drawLoop(); @@ -524,9 +497,8 @@ void LLDrawPoolTerrain::renderFull4TU() // // Stage 1: Generate alpha ramp for detail2/detail3 transition // - glActiveTextureARB(GL_TEXTURE1_ARB); LLViewerImage::bindTexture(m2DAlphaRampImagep,1); - + glActiveTextureARB(GL_TEXTURE1_ARB); glEnable(GL_TEXTURE_2D); // Texture unit 1 glClientActiveTextureARB(GL_TEXTURE1_ARB); @@ -551,8 +523,8 @@ void LLDrawPoolTerrain::renderFull4TU() // // Stage 2: Interpolate detail2 with existing based on ramp // - glActiveTextureARB(GL_TEXTURE2_ARB); LLViewerImage::bindTexture(detail_texture2p,2); + glActiveTextureARB(GL_TEXTURE2_ARB); glEnable(GL_TEXTURE_2D); // Texture unit 2 glClientActiveTextureARB(GL_TEXTURE2_ARB); @@ -578,9 +550,9 @@ void LLDrawPoolTerrain::renderFull4TU() // // Stage 3: Generate alpha ramp for detail1/detail2 transition // - glActiveTextureARB(GL_TEXTURE3_ARB); LLViewerImage::bindTexture(m2DAlphaRampImagep,3); - + glActiveTextureARB(GL_TEXTURE3_ARB); + glEnable(GL_TEXTURE_2D); // Texture unit 3 glClientActiveTextureARB(GL_TEXTURE3_ARB); @@ -603,7 +575,7 @@ void LLDrawPoolTerrain::renderFull4TU() glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_TEXTURE); glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB, GL_SRC_ALPHA); - + glActiveTextureARB(GL_TEXTURE0_ARB); { LLGLEnable blend(GL_BLEND); drawLoop(); @@ -611,6 +583,7 @@ void LLDrawPoolTerrain::renderFull4TU() // Disable multitexture LLImageGL::unbindTexture(3, GL_TEXTURE_2D); + glActiveTextureARB(GL_TEXTURE3_ARB); glClientActiveTextureARB(GL_TEXTURE3_ARB); glDisableClientState(GL_TEXTURE_COORD_ARRAY); glDisable(GL_TEXTURE_2D); // Texture unit 3 @@ -619,6 +592,7 @@ void LLDrawPoolTerrain::renderFull4TU() glMatrixMode(GL_MODELVIEW); LLImageGL::unbindTexture(2, GL_TEXTURE_2D); + glActiveTextureARB(GL_TEXTURE2_ARB); glClientActiveTextureARB(GL_TEXTURE2_ARB); glDisableClientState(GL_TEXTURE_COORD_ARRAY); glDisable(GL_TEXTURE_2D); // Texture unit 2 @@ -629,6 +603,7 @@ void LLDrawPoolTerrain::renderFull4TU() glMatrixMode(GL_MODELVIEW); LLImageGL::unbindTexture(1, GL_TEXTURE_2D); + glActiveTextureARB(GL_TEXTURE1_ARB); glClientActiveTextureARB(GL_TEXTURE1_ARB); glDisableClientState(GL_TEXTURE_COORD_ARRAY); glDisable(GL_TEXTURE_2D); // Texture unit 1 @@ -642,6 +617,7 @@ void LLDrawPoolTerrain::renderFull4TU() //---------------------------------------------------------------------------- // Restore Texture Unit 0 defaults + glActiveTextureARB(GL_TEXTURE0_ARB); LLImageGL::unbindTexture(0, GL_TEXTURE_2D); glClientActiveTextureARB(GL_TEXTURE0_ARB); glActiveTextureARB(GL_TEXTURE0_ARB); @@ -658,9 +634,6 @@ void LLDrawPoolTerrain::renderFull4TU() void LLDrawPoolTerrain::renderFull2TU() { - glEnableClientState(GL_VERTEX_ARRAY); - glEnableClientState(GL_NORMAL_ARRAY); - // Hack! Get the region that this draw pool is rendering from! LLViewerRegion *regionp = mDrawFace[0]->getDrawable()->getVObj()->getRegion(); LLVLComposition *compp = regionp->getComposition(); @@ -687,9 +660,6 @@ void LLDrawPoolTerrain::renderFull2TU() // Stage 0: Render detail 0 into base // LLViewerImage::bindTexture(detail_texture0p,0); - glClientActiveTextureARB(GL_TEXTURE0_ARB); - - glDisableClientState(GL_TEXTURE_COORD_ARRAY); glEnable(GL_TEXTURE_GEN_S); glEnable(GL_TEXTURE_GEN_T); glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR); @@ -715,12 +685,10 @@ void LLDrawPoolTerrain::renderFull2TU() // Stage 0: Generate alpha ramp for detail0/detail1 transition // LLViewerImage::bindTexture(m2DAlphaRampImagep,0); - glClientActiveTextureARB(GL_TEXTURE0_ARB); - + glDisable(GL_TEXTURE_GEN_S); glDisable(GL_TEXTURE_GEN_T); - glEnableClientState(GL_TEXTURE_COORD_ARRAY); - + // Care about alpha only glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB); glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_REPLACE); @@ -736,10 +704,8 @@ void LLDrawPoolTerrain::renderFull2TU() // Stage 1: Write detail1 // LLViewerImage::bindTexture(detail_texture1p,1); // Texture unit 1 + glActiveTextureARB(GL_TEXTURE1_ARB); glEnable(GL_TEXTURE_2D); // Texture unit 1 - glClientActiveTextureARB(GL_TEXTURE1_ARB); - - glDisableClientState(GL_TEXTURE_COORD_ARRAY); glEnable(GL_TEXTURE_GEN_S); glEnable(GL_TEXTURE_GEN_T); glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR); @@ -758,6 +724,7 @@ void LLDrawPoolTerrain::renderFull2TU() glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_PREVIOUS); glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB, GL_SRC_ALPHA); + glActiveTextureARB(GL_TEXTURE0_ARB); { LLGLEnable blend(GL_BLEND); drawLoop(); @@ -769,14 +736,11 @@ void LLDrawPoolTerrain::renderFull2TU() // Stage 0: Generate alpha ramp for detail1/detail2 transition // LLViewerImage::bindTexture(m2DAlphaRampImagep,0); - glClientActiveTextureARB(GL_TEXTURE0_ARB); // Set the texture matrix glMatrixMode(GL_TEXTURE); glLoadIdentity(); glTranslatef(-1.f, 0.f, 0.f); - glEnableClientState(GL_TEXTURE_COORD_ARRAY); - // Care about alpha only glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB); glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_REPLACE); @@ -793,9 +757,7 @@ void LLDrawPoolTerrain::renderFull2TU() LLViewerImage::bindTexture(detail_texture2p,1); glEnable(GL_TEXTURE_2D); // Texture unit 1 - glClientActiveTextureARB(GL_TEXTURE1_ARB); - - glDisableClientState(GL_TEXTURE_COORD_ARRAY); + glEnable(GL_TEXTURE_GEN_S); glEnable(GL_TEXTURE_GEN_T); glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR); @@ -826,14 +788,11 @@ void LLDrawPoolTerrain::renderFull2TU() // Stage 0: Generate alpha ramp for detail2/detail3 transition // LLViewerImage::bindTexture(m2DAlphaRampImagep,0); - glClientActiveTextureARB(GL_TEXTURE0_ARB); // Set the texture matrix glMatrixMode(GL_TEXTURE); glLoadIdentity(); glTranslatef(-2.f, 0.f, 0.f); - glEnableClientState(GL_TEXTURE_COORD_ARRAY); - // Care about alpha only glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB); glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_REPLACE); @@ -847,10 +806,8 @@ void LLDrawPoolTerrain::renderFull2TU() // Stage 1: Write detail3 LLViewerImage::bindTexture(detail_texture3p,1); + glActiveTextureARB(GL_TEXTURE1_ARB); glEnable(GL_TEXTURE_2D); // Texture unit 1 - glClientActiveTextureARB(GL_TEXTURE1_ARB); - - glDisableClientState(GL_TEXTURE_COORD_ARRAY); glEnable(GL_TEXTURE_GEN_S); glEnable(GL_TEXTURE_GEN_T); glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR); @@ -869,6 +826,7 @@ void LLDrawPoolTerrain::renderFull2TU() glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_PREVIOUS); glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB, GL_SRC_ALPHA); + glActiveTextureARB(GL_TEXTURE0_ARB); { LLGLEnable blend(GL_BLEND); drawLoop(); @@ -879,8 +837,7 @@ void LLDrawPoolTerrain::renderFull2TU() // Disable multitexture LLImageGL::unbindTexture(1, GL_TEXTURE_2D); - glClientActiveTextureARB(GL_TEXTURE1_ARB); - glDisableClientState(GL_TEXTURE_COORD_ARRAY); + glActiveTextureARB(GL_TEXTURE1_ARB); glDisable(GL_TEXTURE_2D); // Texture unit 1 glDisable(GL_TEXTURE_GEN_S); glDisable(GL_TEXTURE_GEN_T); @@ -891,9 +848,9 @@ void LLDrawPoolTerrain::renderFull2TU() //---------------------------------------------------------------------------- // Restore Texture Unit 0 defaults + glActiveTextureARB(GL_TEXTURE0_ARB); LLImageGL::unbindTexture(0, GL_TEXTURE_2D); - glClientActiveTextureARB(GL_TEXTURE0_ARB); glActiveTextureARB(GL_TEXTURE0_ARB); glDisable(GL_TEXTURE_GEN_S); glDisable(GL_TEXTURE_GEN_T); @@ -902,16 +859,12 @@ void LLDrawPoolTerrain::renderFull2TU() glMatrixMode(GL_MODELVIEW); // Restore non Texture Unit specific defaults - glDisableClientState(GL_NORMAL_ARRAY); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); } void LLDrawPoolTerrain::renderSimple() { - glEnableClientState(GL_VERTEX_ARRAY); - glEnableClientState(GL_NORMAL_ARRAY); - LLVector4 tp0, tp1; //---------------------------------------------------------------------------- @@ -923,14 +876,12 @@ void LLDrawPoolTerrain::renderSimple() glActiveTextureARB(GL_TEXTURE0_ARB); glEnable(GL_TEXTURE_2D); // Texture unit 2 - glClientActiveTextureARB(GL_TEXTURE0_ARB); - + LLVector3 origin_agent = mDrawFace[0]->getDrawable()->getVObj()->getRegion()->getOriginAgent(); F32 tscale = 1.f/256.f; tp0.setVec(tscale, 0.f, 0.0f, -1.f*(origin_agent.mV[0]/256.f)); tp1.setVec(0.f, tscale, 0.0f, -1.f*(origin_agent.mV[1]/256.f)); - glDisableClientState(GL_TEXTURE_COORD_ARRAY); glEnable(GL_TEXTURE_GEN_S); glEnable(GL_TEXTURE_GEN_T); glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR); @@ -952,7 +903,6 @@ void LLDrawPoolTerrain::renderSimple() // Restore Texture Unit 0 defaults LLImageGL::unbindTexture(0, GL_TEXTURE_2D); - glClientActiveTextureARB(GL_TEXTURE0_ARB); glActiveTextureARB(GL_TEXTURE0_ARB); glDisable(GL_TEXTURE_GEN_S); glDisable(GL_TEXTURE_GEN_T); @@ -961,7 +911,6 @@ void LLDrawPoolTerrain::renderSimple() glMatrixMode(GL_MODELVIEW); // Restore non Texture Unit specific defaults - glDisableClientState(GL_NORMAL_ARRAY); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); } @@ -986,14 +935,8 @@ void LLDrawPoolTerrain::renderOwnership() LLViewerParcelOverlay *overlayp = regionp->getParcelOverlay(); LLImageGL *texturep = overlayp->getTexture(); - glEnableClientState(GL_VERTEX_ARRAY); - glDisableClientState(GL_NORMAL_ARRAY); - LLViewerImage::bindTexture(texturep); - glClientActiveTextureARB(GL_TEXTURE0_ARB); - glEnableClientState(GL_TEXTURE_COORD_ARRAY); - // *NOTE: Because the region is 256 meters wide, but has 257 pixels, the // texture coordinates for pixel 256x256 is not 1,1. This makes the // ownership map not line up with the selection. We address this with @@ -1014,9 +957,6 @@ void LLDrawPoolTerrain::renderOwnership() glMatrixMode(GL_TEXTURE); glPopMatrix(); glMatrixMode(GL_MODELVIEW); - - // Restore non Texture Unit specific defaults - glDisableClientState(GL_NORMAL_ARRAY); } diff --git a/indra/newview/lldrawpooltree.cpp b/indra/newview/lldrawpooltree.cpp index f70904eba4..eabc0f1268 100644 --- a/indra/newview/lldrawpooltree.cpp +++ b/indra/newview/lldrawpooltree.cpp @@ -67,9 +67,6 @@ void LLDrawPoolTree::prerender() void LLDrawPoolTree::beginRenderPass(S32 pass) { LLFastTimer t(LLFastTimer::FTM_RENDER_TREES); - glEnableClientState(GL_VERTEX_ARRAY); - glEnableClientState(GL_NORMAL_ARRAY); - glEnableClientState(GL_TEXTURE_COORD_ARRAY); glAlphaFunc(GL_GREATER, 0.5f); if (LLPipeline::sUnderWaterRender) @@ -110,9 +107,7 @@ void LLDrawPoolTree::endRenderPass(S32 pass) { LLFastTimer t(LLFastTimer::FTM_RENDER_TREES); glAlphaFunc(GL_GREATER, 0.01f); - glDisableClientState(GL_NORMAL_ARRAY); - glDisableClientState(GL_TEXTURE_COORD_ARRAY); - + if (gPipeline.canUseWindLightShadersOnObjects()) { shader->unbind(); @@ -126,9 +121,6 @@ void LLDrawPoolTree::renderForSelect() return; } - glEnableClientState (GL_VERTEX_ARRAY); - glEnableClientState (GL_TEXTURE_COORD_ARRAY); - LLOverrideFaceColor color(this, 1.f, 1.f, 1.f, 1.f); LLGLSObjectSelectAlpha gls_alpha; @@ -155,7 +147,6 @@ void LLDrawPoolTree::renderForSelect() gGL.blendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); - glDisableClientState (GL_TEXTURE_COORD_ARRAY); } void LLDrawPoolTree::renderTree(BOOL selecting) @@ -278,8 +269,6 @@ void LLDrawPoolTree::renderTree(BOOL selecting) //glPopMatrix(); } } - - addIndicesDrawn(indices_drawn); } BOOL LLDrawPoolTree::verify() const diff --git a/indra/newview/lldrawpoolwater.cpp b/indra/newview/lldrawpoolwater.cpp index f4e22a57f6..9ffa552895 100644 --- a/indra/newview/lldrawpoolwater.cpp +++ b/indra/newview/lldrawpoolwater.cpp @@ -163,17 +163,11 @@ void LLDrawPoolWater::render(S32 pass) LLGLDisable cullFace(GL_CULL_FACE); - glEnableClientState(GL_TEXTURE_COORD_ARRAY); - glEnableClientState(GL_VERTEX_ARRAY); - glEnableClientState(GL_NORMAL_ARRAY); - // Set up second pass first - glActiveTextureARB(GL_TEXTURE1_ARB); mWaterImagep->addTextureStats(1024.f*1024.f); mWaterImagep->bind(1); - - glClientActiveTextureARB(GL_TEXTURE1_ARB); - glDisableClientState(GL_TEXTURE_COORD_ARRAY); + glActiveTextureARB(GL_TEXTURE1_ARB); + glEnable(GL_TEXTURE_2D); // Texture unit 1 LLVector3 camera_up = LLViewerCamera::getInstance()->getUpAxis(); @@ -215,7 +209,6 @@ void LLDrawPoolWater::render(S32 pass) glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_PREVIOUS_ARB); glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB, GL_SRC_ALPHA); - glClientActiveTextureARB(GL_TEXTURE0_ARB); glActiveTextureARB(GL_TEXTURE0_ARB); glClearStencil(1); @@ -234,11 +227,9 @@ void LLDrawPoolWater::render(S32 pass) } face->bindTexture(); face->renderIndexed(); - mIndicesDrawn += face->getIndicesCount(); } // Now, disable texture coord generation on texture state 1 - glClientActiveTextureARB(GL_TEXTURE1_ARB); glActiveTextureARB(GL_TEXTURE1_ARB); glDisable(GL_TEXTURE_2D); // Texture unit 1 glDisable(GL_TEXTURE_GEN_S); //texture unit 1 @@ -246,11 +237,9 @@ void LLDrawPoolWater::render(S32 pass) LLImageGL::unbindTexture(1, GL_TEXTURE_2D); // Disable texture coordinate and color arrays - glClientActiveTextureARB(GL_TEXTURE0_ARB); glActiveTextureARB(GL_TEXTURE0_ARB); LLImageGL::unbindTexture(0, GL_TEXTURE_2D); - glDisableClientState(GL_TEXTURE_COORD_ARRAY); stop_glerror(); if (gSky.mVOSkyp->getCubeMap()) @@ -284,7 +273,6 @@ void LLDrawPoolWater::render(S32 pass) if (face->getGeomCount() > 0) { face->renderIndexed(); - mIndicesDrawn += face->getIndicesCount(); } } @@ -310,9 +298,6 @@ void LLDrawPoolWater::render(S32 pass) renderReflection(refl_face); } - glDisableClientState(GL_TEXTURE_COORD_ARRAY); - glDisableClientState(GL_NORMAL_ARRAY); - glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); } @@ -338,16 +323,10 @@ void LLDrawPoolWater::renderReflection(LLFace* face) LLGLSNoFog noFog; - glEnableClientState(GL_VERTEX_ARRAY); - glEnableClientState(GL_TEXTURE_COORD_ARRAY); - LLViewerImage::bindTexture(mHBTex[dr]); LLOverrideFaceColor override(this, face->getFaceColor().mV); face->renderIndexed(); - mIndicesDrawn += face->getIndicesCount(); - - glDisableClientState(GL_TEXTURE_COORD_ARRAY); } void LLDrawPoolWater::shade() @@ -361,10 +340,6 @@ void LLDrawPoolWater::shade() return; } - glEnableClientState(GL_TEXTURE_COORD_ARRAY); - glEnableClientState(GL_VERTEX_ARRAY); - glEnableClientState(GL_NORMAL_ARRAY); - LLGLDisable blend(GL_BLEND); LLColor3 light_diffuse(0,0,0); @@ -562,8 +537,6 @@ void LLDrawPoolWater::shade() face->renderIndexed(); } } - - mIndicesDrawn += face->getIndicesCount(); } } @@ -576,8 +549,6 @@ void LLDrawPoolWater::shade() shader->unbind(); glActiveTextureARB(GL_TEXTURE0_ARB); - glClientActiveTextureARB(GL_TEXTURE0_ARB); - glDisableClientState(GL_TEXTURE_COORD_ARRAY); glEnable(GL_TEXTURE_2D); glColorMask(GL_TRUE,GL_TRUE,GL_TRUE,GL_FALSE); diff --git a/indra/newview/lldrawpoolwlsky.cpp b/indra/newview/lldrawpoolwlsky.cpp index 63d13d61d9..e2d0c6088a 100644 --- a/indra/newview/lldrawpoolwlsky.cpp +++ b/indra/newview/lldrawpoolwlsky.cpp @@ -159,9 +159,7 @@ void LLDrawPoolWLSky::renderStars(void) const // combiners blending below requires something to be bound // and we might as well only bind once. //LLGLEnable gl_texture_2d(GL_TEXTURE_2D); - glDisableClientState(GL_TEXTURE_COORD_ARRAY); - glDisableClientState(GL_NORMAL_ARRAY); - + gPipeline.disableLights(); if (!LLPipeline::sReflectionRender) @@ -224,9 +222,6 @@ void LLDrawPoolWLSky::renderSkyClouds(F32 camHeightLocal) const void LLDrawPoolWLSky::renderHeavenlyBodies() { - glEnableClientState(GL_VERTEX_ARRAY); - glEnableClientState(GL_TEXTURE_COORD_ARRAY); - glDisableClientState(GL_NORMAL_ARRAY); LLGLSPipelineSkyBox gls_skybox; LLGLEnable blend_on(GL_BLEND); gPipeline.disableLights(); @@ -240,7 +235,6 @@ void LLDrawPoolWLSky::renderHeavenlyBodies() LLColor4 color(gSky.mVOSkyp->getSun().getInterpColor()); LLFacePool::LLOverrideFaceColor color_override(this, color); face->renderIndexed(); - mIndicesDrawn += face->getIndicesCount(); } #endif @@ -264,10 +258,7 @@ void LLDrawPoolWLSky::renderHeavenlyBodies() LLFacePool::LLOverrideFaceColor color_override(this, color); face->renderIndexed(); - mIndicesDrawn += face->getIndicesCount(); } - - glDisableClientState(GL_TEXTURE_COORD_ARRAY); } void LLDrawPoolWLSky::render(S32 pass) diff --git a/indra/newview/lldynamictexture.cpp b/indra/newview/lldynamictexture.cpp index 24ee701ff2..cdb7531341 100644 --- a/indra/newview/lldynamictexture.cpp +++ b/indra/newview/lldynamictexture.cpp @@ -223,17 +223,15 @@ BOOL LLDynamicTexture::updateAllInstances() glClear(GL_DEPTH_BUFFER_BIT); gDisplaySwapBuffers = FALSE; - LLVertexBuffer::startRender(); - gGL.start(); - dynamicTexture->preRender(); // Must be called outside of startRender() + LLVertexBuffer::startRender(); + if (dynamicTexture->render()) { result = TRUE; sNumRenders++; } - gGL.stop(); LLVertexBuffer::stopRender(); dynamicTexture->postRender(result); diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp index 2157b50eb5..5a683c4c2e 100644 --- a/indra/newview/llface.cpp +++ b/indra/newview/llface.cpp @@ -263,8 +263,14 @@ void LLFace::setDrawable(LLDrawable *drawable) void LLFace::setSize(const S32 num_vertices, const S32 num_indices) { - mGeomCount = num_vertices; - mIndicesCount = num_indices; + if (mGeomCount != num_vertices || + mIndicesCount != num_indices) + { + mGeomCount = num_vertices; + mIndicesCount = num_indices; + mVertexBuffer = NULL; + mLastVertexBuffer = NULL; + } } //============================================================================ @@ -368,8 +374,6 @@ void LLFace::renderForSelect(U32 data_mask) #if !LL_RELEASE_FOR_DOWNLOAD LLGLState::checkClientArrays(data_mask); #endif - U16* indicesp = (U16*) mVertexBuffer->getIndicesPointer() + mIndicesIndex; - if (gPickFaces && mTEOffset != -1) { // mask off high 4 bits (16 total possible faces) @@ -386,40 +390,26 @@ void LLFace::renderForSelect(U32 data_mask) { glPushMatrix(); glMultMatrixf((float*) mDrawablep->getRegion()->mRenderMatrix.mMatrix); - glDrawElements(GL_TRIANGLES, mIndicesCount, GL_UNSIGNED_SHORT, indicesp); + mVertexBuffer->draw(LLVertexBuffer::TRIANGLES, mIndicesCount, mIndicesIndex); glPopMatrix(); } else { - glDrawElements(GL_TRIANGLES, mIndicesCount, GL_UNSIGNED_SHORT, indicesp); + mVertexBuffer->draw(LLVertexBuffer::TRIANGLES, mIndicesCount, mIndicesIndex); } } else { glPushMatrix(); glMultMatrixf((float*)getRenderMatrix().mMatrix); - glDrawElements(GL_TRIANGLES, mIndicesCount, GL_UNSIGNED_SHORT, indicesp); - glPopMatrix(); - } - } - else if (mGeomCount > 0) - { - if (isState(GLOBAL)) - { - glDrawArrays(GL_TRIANGLES, mGeomIndex, mGeomCount); - } - else - { - glPushMatrix(); - glMultMatrixf((float*)getRenderMatrix().mMatrix); - glDrawArrays(GL_TRIANGLES, mGeomIndex, mGeomCount); + mVertexBuffer->draw(LLVertexBuffer::TRIANGLES, mIndicesCount, mIndicesIndex); glPopMatrix(); } } } } -void LLFace::renderSelected(LLImageGL *imagep, const LLColor4& color, const S32 offset, const S32 count) +void LLFace::renderSelected(LLImageGL *imagep, const LLColor4& color) { if(mDrawablep.isNull() || mVertexBuffer.isNull()) { @@ -443,27 +433,12 @@ void LLFace::renderSelected(LLImageGL *imagep, const LLColor4& color, const S32 glMultMatrixf((GLfloat*)mDrawablep->getRegion()->mRenderMatrix.mMatrix); } - glEnableClientState(GL_TEXTURE_COORD_ARRAY); - glEnableClientState(GL_VERTEX_ARRAY); - glEnableClientState(GL_NORMAL_ARRAY); - mVertexBuffer->setBuffer(LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_NORMAL | LLVertexBuffer::MAP_TEXCOORD); #if !LL_RELEASE_FOR_DOWNLOAD LLGLState::checkClientArrays(LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_NORMAL | LLVertexBuffer::MAP_TEXCOORD); #endif - U16* indicesp = ((U16*) mVertexBuffer->getIndicesPointer()) + mIndicesIndex; - - if (count) - { - glDrawElements(GL_TRIANGLES, count, GL_UNSIGNED_SHORT, indicesp + offset); - } - else - { - glDrawElements(GL_TRIANGLES, mIndicesCount, GL_UNSIGNED_SHORT, indicesp); - } - glDisableClientState(GL_TEXTURE_COORD_ARRAY); - glDisableClientState(GL_NORMAL_ARRAY); - + mVertexBuffer->draw(LLVertexBuffer::TRIANGLES, mIndicesCount, mIndicesIndex); + glPopMatrix(); } } @@ -542,8 +517,6 @@ void LLFace::renderSelectedUV(const S32 offset, const S32 count) } else { - glEnableClientState(GL_TEXTURE_COORD_ARRAY); - glEnableClientState(GL_VERTEX_ARRAY); llassert(mGeomIndex >= 0); if (count) { @@ -568,7 +541,6 @@ void LLFace::renderSelectedUV(const S32 offset, const S32 count) glDrawArrays(GL_TRIANGLES, mGeomIndex, mGeomCount); } } - glDisableClientState(GL_TEXTURE_COORD_ARRAY); } glDisable(GL_POLYGON_OFFSET_FILL); @@ -1251,16 +1223,7 @@ S32 LLFace::pushVertices(const U16* index_array) const { if (mIndicesCount) { - if (mGeomCount <= gGLManager.mGLMaxVertexRange && - mIndicesCount <= (U32) gGLManager.mGLMaxIndexRange) - { - glDrawRangeElements(GL_TRIANGLES, mGeomIndex, mGeomIndex + mGeomCount-1, mIndicesCount, - GL_UNSIGNED_SHORT, index_array + mIndicesIndex); - } - else - { - glDrawElements(GL_TRIANGLES, mIndicesCount, GL_UNSIGNED_SHORT, index_array+mIndicesIndex); - } + mVertexBuffer->drawRange(LLVertexBuffer::TRIANGLES, mGeomIndex, mGeomIndex+mGeomCount-1, mIndicesCount, mIndicesIndex); gPipeline.addTrianglesDrawn(mIndicesCount/3); } diff --git a/indra/newview/llface.h b/indra/newview/llface.h index 6142ba6672..070283ecd2 100644 --- a/indra/newview/llface.h +++ b/indra/newview/llface.h @@ -167,7 +167,7 @@ public: void renderSelectedUV(const S32 offset = 0, const S32 count = 0); void renderForSelect(U32 data_mask = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD); - void renderSelected(LLImageGL *image, const LLColor4 &color, const S32 offset = 0, const S32 count = 0); + void renderSelected(LLImageGL *image, const LLColor4 &color); F32 getKey() const { return mDistance; } diff --git a/indra/newview/llflexibleobject.cpp b/indra/newview/llflexibleobject.cpp index c18dc069a4..248e680c1b 100644 --- a/indra/newview/llflexibleobject.cpp +++ b/indra/newview/llflexibleobject.cpp @@ -195,7 +195,7 @@ void LLVolumeImplFlexible::remapSections(LLFlexibleObjectSection *source, S32 so //----------------------------------------------------------------------------- -void LLVolumeImplFlexible::setAttributesOfAllSections() +void LLVolumeImplFlexible::setAttributesOfAllSections(LLVector3* inScale) { LLVector2 bottom_scale, top_scale; F32 begin_rot = 0, end_rot = 0; @@ -215,8 +215,16 @@ void LLVolumeImplFlexible::setAttributesOfAllSections() S32 num_sections = 1 << mSimulateRes; - LLVector3 scale = mVO->mDrawable->getScale(); - + LLVector3 scale; + if (inScale == (LLVector3*)NULL) + { + scale = mVO->mDrawable->getScale(); + } + else + { + scale = *inScale; + } + mSection[0].mPosition = getAnchorPosition(); mSection[0].mDirection = LLVector3::z_axis * getFrameRotation(); mSection[0].mdPosition = mSection[0].mDirection; @@ -297,7 +305,7 @@ BOOL LLVolumeImplFlexible::doIdleUpdate(LLAgent &agent, LLWorld &world, const F6 new_res = mRenderRes; } - if (!mInitialized || (mSimulateRes != new_res)) + if (!mInitialized) { mSimulateRes = new_res; setAttributesOfAllSections(); @@ -644,7 +652,7 @@ void LLVolumeImplFlexible::doFlexibleRebuild() void LLVolumeImplFlexible::onSetScale(const LLVector3& scale, BOOL damped) { - setAttributesOfAllSections(); + setAttributesOfAllSections((LLVector3*) &scale); } BOOL LLVolumeImplFlexible::doUpdateGeometry(LLDrawable *drawable) diff --git a/indra/newview/llflexibleobject.h b/indra/newview/llflexibleobject.h index d4b79fb536..f711d0a57d 100644 --- a/indra/newview/llflexibleobject.h +++ b/indra/newview/llflexibleobject.h @@ -138,7 +138,7 @@ class LLVolumeImplFlexible : public LLVolumeInterface //-------------------------------------- // private methods //-------------------------------------- - void setAttributesOfAllSections (); + void setAttributesOfAllSections (LLVector3* inScale = NULL); void remapSections(LLFlexibleObjectSection *source, S32 source_sections, LLFlexibleObjectSection *dest, S32 dest_sections); diff --git a/indra/newview/llfloateranimpreview.cpp b/indra/newview/llfloateranimpreview.cpp index afa3fcddbe..aba92791e0 100644 --- a/indra/newview/llfloateranimpreview.cpp +++ b/indra/newview/llfloateranimpreview.cpp @@ -293,7 +293,6 @@ BOOL LLFloaterAnimPreview::postBuild() mAnimPreview = NULL; mMotionID.setNull(); childSetValue("bad_animation_text", getString("failed_to_initialize")); - setEnabled(FALSE); } } else @@ -1039,6 +1038,8 @@ BOOL LLPreviewAnimation::render() { mNeedsUpdate = FALSE; LLVOAvatar* avatarp = mDummyAvatar; + + gGL.start(); glMatrixMode(GL_PROJECTION); gGL.pushMatrix(); @@ -1109,7 +1110,6 @@ BOOL LLPreviewAnimation::render() avatarPoolp->renderAvatars(avatarp); // renders only one avatar } - gGL.start(); return TRUE; } diff --git a/indra/newview/llfloaterauction.cpp b/indra/newview/llfloaterauction.cpp index 25b275c8cb..2e971a8324 100644 --- a/indra/newview/llfloaterauction.cpp +++ b/indra/newview/llfloaterauction.cpp @@ -53,6 +53,7 @@ #include "llviewerdisplay.h" #include "llviewercontrol.h" #include "llui.h" +#include "llglimmediate.h" ///---------------------------------------------------------------------------- /// Local function declarations, constants, enums, and typedefs @@ -153,7 +154,7 @@ void LLFloaterAuction::draw() } { LLGLSUIDefault gls_ui; - glColor3f(1.f, 1.f, 1.f); + gGL.color3f(1.f, 1.f, 1.f); gl_draw_scaled_image(rect.mLeft, rect.mBottom, rect.getWidth(), diff --git a/indra/newview/llfloaterhud.cpp b/indra/newview/llfloaterhud.cpp index 7f311be9fd..12b1f0b4f1 100644 --- a/indra/newview/llfloaterhud.cpp +++ b/indra/newview/llfloaterhud.cpp @@ -29,16 +29,20 @@ LLFloaterHUD::LLFloaterHUD() : LLFloater("floater_hud"), mWebBrowser(0) { + // Create floater from its XML definition + LLUICtrlFactory::getInstance()->buildFloater(this, "floater_hud.xml"); + // Don't grab the focus as it will impede performing in-world actions // while using the HUD - setAutoFocus(FALSE); + setIsChrome(TRUE); + + // Chrome doesn't show the window title by default, but here we + // want to show it. + setTitleVisible(true); // Opaque background since we never get the focus setBackgroundOpaque(TRUE); - // Create floater from its XML definition - LLUICtrlFactory::getInstance()->buildFloater(this, "floater_hud.xml"); - // Position floater based on saved location LLRect saved_position_rect = gSavedSettings.getRect("FloaterHUDRect"); reshape(saved_position_rect.getWidth(), saved_position_rect.getHeight(), FALSE); @@ -47,12 +51,14 @@ LLFloaterHUD::LLFloaterHUD() mWebBrowser = getChild<LLWebBrowserCtrl>("floater_hud_browser" ); if (mWebBrowser) { - // Always refresh the browser - mWebBrowser->setAlwaysRefresh(true); - // Open links in internal browser mWebBrowser->setOpenInExternalBrowser(false); + // This is a "chrome" floater, so we don't want anything to + // take focus (as the user needs to be able to walk with + // arrow keys during tutorial). + mWebBrowser->setTakeFocusOnClick(false); + LLString language(gSavedSettings.getString("Language")); if(language == "default") { @@ -110,9 +116,3 @@ void LLFloaterHUD::close() { if (sInstance) sInstance->close(); } - -void LLFloaterHUD::onFocusReceived() -{ - // Never get the focus - setFocus(FALSE); -} diff --git a/indra/newview/llfloaterhud.h b/indra/newview/llfloaterhud.h index 9c1140986e..06da9fb44e 100644 --- a/indra/newview/llfloaterhud.h +++ b/indra/newview/llfloaterhud.h @@ -36,7 +36,7 @@ protected: LLWebBrowserCtrl* mWebBrowser; ///< the actual web browser control LLFloaterHUD(); ///< default constructor - virtual void onFocusReceived(); ///< called when we get the focus + private: static LLFloaterHUD* sInstance; }; diff --git a/indra/newview/llfloaterimagepreview.cpp b/indra/newview/llfloaterimagepreview.cpp index 51e67dcf2b..67f9ebe6b4 100644 --- a/indra/newview/llfloaterimagepreview.cpp +++ b/indra/newview/llfloaterimagepreview.cpp @@ -667,6 +667,8 @@ void LLImagePreviewAvatar::setPreviewTarget(const char* joint_name, const char* //----------------------------------------------------------------------------- BOOL LLImagePreviewAvatar::render() { + gGL.start(); + mNeedsUpdate = FALSE; LLVOAvatar* avatarp = mDummyAvatar; @@ -723,8 +725,6 @@ BOOL LLImagePreviewAvatar::render() avatarPoolp->renderAvatars(avatarp); // renders only one avatar } - gGL.start(); - return TRUE; } @@ -823,6 +823,8 @@ void LLImagePreviewSculpted::setPreviewTarget(LLImageRaw* imagep, F32 distance) //----------------------------------------------------------------------------- BOOL LLImagePreviewSculpted::render() { + gGL.start(); + mNeedsUpdate = FALSE; LLGLSUIDefault def; @@ -917,6 +919,8 @@ BOOL LLImagePreviewSculpted::render() delete [] normals; } + gGL.stop(); + return TRUE; } diff --git a/indra/newview/llglsandbox.cpp b/indra/newview/llglsandbox.cpp index 493b69f99e..f6d9ee9761 100644 --- a/indra/newview/llglsandbox.cpp +++ b/indra/newview/llglsandbox.cpp @@ -1006,17 +1006,17 @@ void LLViewerObjectList::renderObjectBeacons() return; } - S32 i; //const LLFontGL *font = LLResMgr::getInstance()->getRes(LLFONT_SANSSERIF); LLGLSUIDefault gls_ui; - S32 last_line_width = -1; - { LLGLSNoTexture gls_ui_no_texture; - gGL.begin(GL_LINES); - for (i = 0; i < mDebugBeacons.count(); i++) + + S32 last_line_width = -1; + // gGL.begin(GL_LINES); // Always happens in (line_width != last_line_width) + + for (S32 i = 0; i < mDebugBeacons.count(); i++) { const LLDebugBeacon &debug_beacon = mDebugBeacons[i]; LLColor4 color = debug_beacon.mColor; @@ -1024,8 +1024,11 @@ void LLViewerObjectList::renderObjectBeacons() S32 line_width = debug_beacon.mLineWidth; if (line_width != last_line_width) { - gGL.end(); - gGL.flush(); + if (i > 0) + { + gGL.end(); + gGL.flush(); + } glLineWidth( (F32)line_width ); last_line_width = line_width; gGL.begin(GL_LINES); @@ -1049,17 +1052,21 @@ void LLViewerObjectList::renderObjectBeacons() LLGLSNoTexture gls_ui_no_texture; LLGLDepthTest gls_depth(GL_TRUE); - gGL.begin(GL_LINES); - last_line_width = -1; - for (i = 0; i < mDebugBeacons.count(); i++) + S32 last_line_width = -1; + // gGL.begin(GL_LINES); // Always happens in (line_width != last_line_width) + + for (S32 i = 0; i < mDebugBeacons.count(); i++) { const LLDebugBeacon &debug_beacon = mDebugBeacons[i]; S32 line_width = debug_beacon.mLineWidth; if (line_width != last_line_width) { - gGL.end(); - gGL.flush(); + if (i > 0) + { + gGL.end(); + gGL.flush(); + } glLineWidth( (F32)line_width ); last_line_width = line_width; gGL.begin(GL_LINES); @@ -1076,12 +1083,12 @@ void LLViewerObjectList::renderObjectBeacons() draw_line_cube(0.10f, thisline); } + gGL.end(); - gGL.flush(); glLineWidth(1.f); - for (i = 0; i < mDebugBeacons.count(); i++) + for (S32 i = 0; i < mDebugBeacons.count(); i++) { LLDebugBeacon &debug_beacon = mDebugBeacons[i]; if (debug_beacon.mString == "") diff --git a/indra/newview/llimpanel.cpp b/indra/newview/llimpanel.cpp index 7eac7eb598..35cf36bd07 100644 --- a/indra/newview/llimpanel.cpp +++ b/indra/newview/llimpanel.cpp @@ -1061,7 +1061,7 @@ LLFloaterIMPanel::LLFloaterIMPanel( mSessionUUID(session_id), mVoiceChannel(NULL), mSessionInitialized(FALSE), - + mSessionStartMsgPos(0), mOtherParticipantUUID(other_participant_id), mDialog(dialog), mTyping(FALSE), @@ -1090,6 +1090,7 @@ LLFloaterIMPanel::LLFloaterIMPanel( mSessionUUID(session_id), mVoiceChannel(NULL), mSessionInitialized(FALSE), + mSessionStartMsgPos(0), mOtherParticipantUUID(other_participant_id), mDialog(dialog), mTyping(FALSE), @@ -1182,6 +1183,7 @@ void LLFloaterIMPanel::init(const LLString& session_label) //we don't need to need to wait for any responses //so we're already initialized mSessionInitialized = TRUE; + mSessionStartMsgPos = 0; } else { diff --git a/indra/newview/llmemoryview.cpp b/indra/newview/llmemoryview.cpp index 4b4b0a36dc..e124af1427 100644 --- a/indra/newview/llmemoryview.cpp +++ b/indra/newview/llmemoryview.cpp @@ -121,6 +121,8 @@ static const struct mtv_display_info mtv_display_table[] = { LLMemType::MTYPE_VERTEX_DATA, "Vertex Buffer", &LLColor4::blue3 }, { LLMemType::MTYPE_AVATAR, "Avatar", &LLColor4::purple1 }, { LLMemType::MTYPE_REGIONS, "Regions", &LLColor4::blue1 }, + { LLMemType::MTYPE_VOLUME, "Volume", &LLColor4::pink1 }, + { LLMemType::MTYPE_PRIMITIVE, "Profile", &LLColor4::pink2 }, { LLMemType::MTYPE_TEMP1, "Temp1", &LLColor4::red1 }, { LLMemType::MTYPE_TEMP2, "Temp2", &LLColor4::magenta1 }, { LLMemType::MTYPE_TEMP3, "Temp3", &LLColor4::red2 }, diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp index b6805f42fa..a94fcf7bc2 100644 --- a/indra/newview/llpanellogin.cpp +++ b/indra/newview/llpanellogin.cpp @@ -951,6 +951,7 @@ void LLPanelLogin::loadLoginPage() { LLAppViewer::instance()->resetURIs(); gGridChoice = (EGridInfo)grid_index; + gSavedSettings.setString("GridChoice", gGridInfo[gGridChoice].mLabel); gViewerWindow->setMenuBackgroundColor(false, !LLAppViewer::instance()->isInProductionGrid()); gLoginMenuBarView->setBackgroundColor(gMenuBarView->getBackgroundColor()); diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp index 331505166e..59fa2c4bcc 100644 --- a/indra/newview/llspatialpartition.cpp +++ b/indra/newview/llspatialpartition.cpp @@ -1906,9 +1906,8 @@ void pushVerts(LLDrawInfo* params, U32 mask) { LLRenderPass::applyModelMatrix(*params); params->mVertexBuffer->setBuffer(mask); - U16* indicesp = (U16*) params->mVertexBuffer->getIndicesPointer(); - glDrawRangeElements(params->mParticle ? GL_POINTS : GL_TRIANGLES, params->mStart, params->mEnd, params->mCount, - GL_UNSIGNED_SHORT, indicesp+params->mOffset); + params->mVertexBuffer->drawRange(params->mParticle ? LLVertexBuffer::POINTS : LLVertexBuffer::TRIANGLES, + params->mStart, params->mEnd, params->mCount, params->mOffset); } void pushVerts(LLSpatialGroup* group, U32 mask) @@ -1932,13 +1931,11 @@ void pushVerts(LLFace* face, U32 mask) if (buffer) { buffer->setBuffer(mask); - U16* indicesp = (U16*) buffer->getIndicesPointer(); U16 start = face->getGeomStart(); U16 end = start + face->getGeomCount()-1; U32 count = face->getIndicesCount(); U16 offset = face->getIndicesStart(); - - glDrawRangeElements(GL_TRIANGLES, start, end, count, GL_UNSIGNED_SHORT, indicesp + offset); + buffer->drawRange(LLVertexBuffer::TRIANGLES, start, end, count, offset); } } @@ -1948,9 +1945,7 @@ void pushBufferVerts(LLVertexBuffer* buffer, U32 mask) if (buffer) { buffer->setBuffer(mask); - U16* indicesp = (U16*) buffer->getIndicesPointer(); - glDrawRangeElements(GL_TRIANGLES, 0, buffer->getRequestedVerts(), buffer->getRequestedIndices(), - GL_UNSIGNED_SHORT, indicesp); + buffer->drawRange(LLVertexBuffer::TRIANGLES, 0, buffer->getRequestedVerts()-1, buffer->getRequestedIndices(), 0); } } @@ -1999,9 +1994,8 @@ void pushVertsColorCoded(LLSpatialGroup* group, U32 mask) LLRenderPass::applyModelMatrix(*params); glColor4f(colors[col].mV[0], colors[col].mV[1], colors[col].mV[2], 0.5f); params->mVertexBuffer->setBuffer(mask); - U16* indicesp = (U16*) params->mVertexBuffer->getIndicesPointer(); - glDrawRangeElements(params->mParticle ? GL_POINTS : GL_TRIANGLES, params->mStart, params->mEnd, params->mCount, - GL_UNSIGNED_SHORT, indicesp+params->mOffset); + params->mVertexBuffer->drawRange(params->mParticle ? LLVertexBuffer::POINTS : LLVertexBuffer::TRIANGLES, + params->mStart, params->mEnd, params->mCount, params->mOffset); col = (col+1)%col_count; } } @@ -2070,8 +2064,7 @@ void renderOctree(LLSpatialGroup* group) face->mVertexBuffer->setBuffer(LLVertexBuffer::MAP_VERTEX); //drawBox((face->mExtents[0] + face->mExtents[1])*0.5f, // (face->mExtents[1]-face->mExtents[0])*0.5f); - glDrawElements(GL_TRIANGLES, face->getIndicesCount(), GL_UNSIGNED_SHORT, - ((U16*) face->mVertexBuffer->getIndicesPointer())+face->getIndicesStart()); + face->mVertexBuffer->draw(LLVertexBuffer::TRIANGLES, face->getIndicesCount(), face->getIndicesStart()); } } diff --git a/indra/newview/lltexlayer.cpp b/indra/newview/lltexlayer.cpp index 7a2d232de6..f8931cb18b 100644 --- a/indra/newview/lltexlayer.cpp +++ b/indra/newview/lltexlayer.cpp @@ -244,6 +244,8 @@ BOOL LLTexLayerSetBuffer::render() BOOL upload_now = (gAgent.mNumPendingQueries == 0 && mNeedsUpload && mTexLayerSet->isLocalTextureDataFinal()); BOOL success = TRUE; + gGL.start(); + // Composite bump if( mBumpTexName ) { @@ -295,6 +297,8 @@ BOOL LLTexLayerSetBuffer::render() glColorMask( GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE ); gGL.blendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); + gGL.stop(); + // we have valid texture data now mInitialized = TRUE; mNeedsUpdate = FALSE; diff --git a/indra/newview/lltoolmorph.cpp b/indra/newview/lltoolmorph.cpp index 265d1082d1..85ea204645 100644 --- a/indra/newview/lltoolmorph.cpp +++ b/indra/newview/lltoolmorph.cpp @@ -163,6 +163,8 @@ void LLVisualParamHint::preRender(BOOL clear_depth) //----------------------------------------------------------------------------- BOOL LLVisualParamHint::render() { + gGL.start(); + LLVisualParamReset::sDirty = TRUE; LLVOAvatar* avatarp = gAgent.getAvatarObject(); @@ -223,6 +225,7 @@ BOOL LLVisualParamHint::render() LLVector3 camera_pos = target_joint_pos + (camera_snapshot_offset * avatar_rotation); gGL.stop(); + LLViewerCamera::getInstance()->setAspect((F32)mWidth / (F32)mHeight); LLViewerCamera::getInstance()->setOriginAndLookAt( camera_pos, // camera @@ -238,7 +241,7 @@ BOOL LLVisualParamHint::render() avatarPoolp->renderAvatars(avatarp); // renders only one avatar } avatarp->setVisualParamWeight(mVisualParam, mLastParamWeight); - gGL.start(); + return TRUE; } diff --git a/indra/newview/llviewerdisplay.cpp b/indra/newview/llviewerdisplay.cpp index 3d0daa73a2..583139298f 100644 --- a/indra/newview/llviewerdisplay.cpp +++ b/indra/newview/llviewerdisplay.cpp @@ -886,6 +886,11 @@ void render_ui_and_swap() LLGLState::checkStates(); #endif + glPushMatrix(); + glLoadMatrixd(gGLLastModelView); + glh::matrix4f saved_view = glh_get_current_modelview(); + glh_set_current_modelview(glh_copy_matrix(gGLLastModelView)); + { BOOL to_texture = gPipeline.canUseVertexShaders() && LLPipeline::sRenderGlow && @@ -936,6 +941,9 @@ void render_ui_and_swap() LLVertexBuffer::stopRender(); } + + glh_set_current_modelview(saved_view); + glPopMatrix(); } void render_ui_and_swap_if_needed() @@ -1030,11 +1038,6 @@ void render_ui_3d() // so 3d elements requiring Z buffer are moved to LLDrawPoolHUD // - // Render selections - //glDisableClientState(GL_COLOR_ARRAY); - //glDisableClientState(GL_TEXTURE_COORD_ARRAY); - //glDisableClientState(GL_NORMAL_ARRAY); - ///////////////////////////////////////////////////////////// // // Render 2.5D elements (2D elements in the world) diff --git a/indra/newview/llviewerjointmesh.cpp b/indra/newview/llviewerjointmesh.cpp index fe00c25c63..ce23efe2f0 100644 --- a/indra/newview/llviewerjointmesh.cpp +++ b/indra/newview/llviewerjointmesh.cpp @@ -501,21 +501,6 @@ int compare_int(const void *a, const void *b) else return 0; } -void llDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices) -{ - if (end-start+1 > (U32) gGLManager.mGLMaxVertexRange || - count > gGLManager.mGLMaxIndexRange) - { - glDrawElements(mode,count,type,indices); - } - else - { - glDrawRangeElements(mode,start,end,count,type,indices); - } - - gPipeline.addTrianglesDrawn(count/3); -} - //-------------------------------------------------------------------- // LLViewerJointMesh::drawShape() //-------------------------------------------------------------------- @@ -626,7 +611,7 @@ U32 LLViewerJointMesh::drawShape( F32 pixelArea, BOOL first_pass) U32 start = mMesh->mFaceVertexOffset; U32 end = start + mMesh->mFaceVertexCount - 1; U32 count = mMesh->mFaceIndexCount; - U16* indicesp = ((U16*) mFace->mVertexBuffer->getIndicesPointer()) + mMesh->mFaceIndexOffset; + U32 offset = mMesh->mFaceIndexOffset; if (mMesh->hasWeights()) { @@ -636,23 +621,21 @@ U32 LLViewerJointMesh::drawShape( F32 pixelArea, BOOL first_pass) { uploadJointMatrices(); } - llDrawRangeElements(GL_TRIANGLES, start, end, count, GL_UNSIGNED_SHORT, indicesp); - } - else - { - llDrawRangeElements(GL_TRIANGLES, start, end, count, GL_UNSIGNED_SHORT, indicesp); } + + mFace->mVertexBuffer->drawRange(LLVertexBuffer::TRIANGLES, start, end, count, offset); } else { glPushMatrix(); LLMatrix4 jointToWorld = getWorldMatrix(); glMultMatrixf((GLfloat*)jointToWorld.mMatrix); - llDrawRangeElements(GL_TRIANGLES, start, end, count, GL_UNSIGNED_SHORT, indicesp); + mFace->mVertexBuffer->drawRange(LLVertexBuffer::TRIANGLES, start, end, count, offset); glPopMatrix(); } + gPipeline.addTrianglesDrawn(count/3); - triangle_count += mMesh->mFaceIndexCount; + triangle_count += count; if (mTestImageName) { diff --git a/indra/newview/llviewerkeyboard.cpp b/indra/newview/llviewerkeyboard.cpp index bea4b910b6..e21c14637b 100644 --- a/indra/newview/llviewerkeyboard.cpp +++ b/indra/newview/llviewerkeyboard.cpp @@ -88,8 +88,6 @@ static void agent_handle_doubletap_run(EKeystate s, LLAgent::EDoubleTapRunMode m { if (KEYSTATE_UP == s) { - // Releasing a walk-key resets the double-tap timer - gAgent.mDoubleTapRunTimer.reset(); if (gAgent.mDoubleTapRunMode == mode && gAgent.getRunning() && !gAgent.getAlwaysRun()) @@ -98,17 +96,23 @@ static void agent_handle_doubletap_run(EKeystate s, LLAgent::EDoubleTapRunMode m gAgent.clearRunning(); gAgent.sendWalkRun(gAgent.getRunning()); } - gAgent.mDoubleTapRunMode = mode; } else if (gAllowTapTapHoldRun && KEYSTATE_DOWN == s && - gAgent.mDoubleTapRunMode == mode && - gAgent.mDoubleTapRunTimer.getElapsedTimeF32() < NUDGE_TIME) + !gAgent.getRunning()) { - // Same walk-key was pushed again quickly; this is a double-tap - // so engage temporary running. - gAgent.setRunning(); - gAgent.sendWalkRun(gAgent.getRunning()); + if (gAgent.mDoubleTapRunMode == mode && + gAgent.mDoubleTapRunTimer.getElapsedTimeF32() < NUDGE_TIME) + { + // Same walk-key was pushed again quickly; this is a + // double-tap so engage temporary running. + gAgent.setRunning(); + gAgent.sendWalkRun(gAgent.getRunning()); + } + + // Pressing any walk-key resets the double-tap timer + gAgent.mDoubleTapRunTimer.reset(); + gAgent.mDoubleTapRunMode = mode; } } diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index cfcd446b55..2cb60785d3 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -4897,12 +4897,12 @@ BOOL menu_check_build_tool( void* user_data ) void handle_reload_settings(void*) { gSavedSettings.resetToDefaults(); - gSavedSettings.loadFromFile(gSavedSettings.getString("ClientSettingsFile"), TRUE); + gSavedSettings.loadFromFile(gSavedSettings.getString("ClientSettingsFile")); llinfos << "Loading colors from colors.xml" << llendl; std::string color_file = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS,"colors.xml"); gColors.resetToDefaults(); - gColors.loadFromFile(color_file, FALSE, TYPE_COL4U); + gColors.loadFromFileLegacy(color_file, FALSE, TYPE_COL4U); } class LLWorldSetHomeLocation : public view_listener_t diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 99f1af61e5..8afb0879a3 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -5063,7 +5063,7 @@ void callback_load_url(S32 option, void* data) if (0 == option) { - LLWeb::loadURL(infop->mUrl); + LLWeb::loadURLExternal(infop->mUrl); } delete infop; diff --git a/indra/newview/llvotree.cpp b/indra/newview/llvotree.cpp index 16555fdc9a..5f83dd4b06 100644 --- a/indra/newview/llvotree.cpp +++ b/indra/newview/llvotree.cpp @@ -821,7 +821,7 @@ U32 LLVOTree::drawBranchPipeline(LLMatrix4& matrix, U16* indicesp, S32 trunk_LOD glLoadMatrixf((F32*) scale_mat.mMatrix); glDrawElements(GL_TRIANGLES, sLODIndexCount[trunk_LOD], GL_UNSIGNED_SHORT, indicesp + sLODIndexOffset[trunk_LOD]); - + gPipeline.addTrianglesDrawn(LEAF_INDICES/3); stop_glerror(); ret += sLODIndexCount[trunk_LOD]; } @@ -871,7 +871,7 @@ U32 LLVOTree::drawBranchPipeline(LLMatrix4& matrix, U16* indicesp, S32 trunk_LOD glLoadMatrixf((F32*) scale_mat.mMatrix); glDrawElements(GL_TRIANGLES, LEAF_INDICES, GL_UNSIGNED_SHORT, indicesp); - + gPipeline.addTrianglesDrawn(LEAF_INDICES/3); stop_glerror(); ret += LEAF_INDICES; } @@ -896,7 +896,7 @@ U32 LLVOTree::drawBranchPipeline(LLMatrix4& matrix, U16* indicesp, S32 trunk_LOD glLoadMatrixf((F32*) scale_mat.mMatrix); glDrawElements(GL_TRIANGLES, LEAF_INDICES, GL_UNSIGNED_SHORT, indicesp); - + gPipeline.addTrianglesDrawn(LEAF_INDICES/3); stop_glerror(); ret += LEAF_INDICES; diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index e7dbf0bfb8..a440ae2957 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -762,16 +762,30 @@ void LLVOVolume::sculpt() return; LLPointer<LLImageRaw> raw_image = new LLImageRaw(); - mSculptTexture->readBackRaw(discard_level, raw_image, FALSE); + BOOL is_valid = mSculptTexture->readBackRaw(discard_level, raw_image, FALSE); sculpt_height = raw_image->getHeight(); sculpt_width = raw_image->getWidth(); + sculpt_components = raw_image->getComponents(); - sculpt_components = raw_image->getComponents(); - sculpt_data = raw_image->getData(); - - llassert_always(raw_image->getDataSize() >= sculpt_height * sculpt_width * sculpt_components); - + if(is_valid) + { + is_valid = mSculptTexture->isValidForSculpt(discard_level, sculpt_width, sculpt_height, sculpt_components) ; + } + if(!is_valid) + { + sculpt_width = 0; + sculpt_height = 0; + sculpt_data = NULL ; + } + else + { + if (raw_image->getDataSize() < sculpt_height * sculpt_width * sculpt_components) + llerrs << "Sculpt: image data size = " << raw_image->getDataSize() + << " < " << sculpt_height << " x " << sculpt_width << " x " <<sculpt_components << llendl; + + sculpt_data = raw_image->getData(); + } getVolume()->sculpt(sculpt_width, sculpt_height, sculpt_components, sculpt_data, discard_level); } } diff --git a/indra/newview/llvowlsky.cpp b/indra/newview/llvowlsky.cpp index ca9f328e48..18c03d870f 100644 --- a/indra/newview/llvowlsky.cpp +++ b/indra/newview/llvowlsky.cpp @@ -484,17 +484,12 @@ BOOL LLVOWLSky::updateGeometry(LLDrawable * drawable) void LLVOWLSky::drawStars(void) { - glEnableClientState(GL_COLOR_ARRAY); - // render the stars as a sphere centered at viewer camera if (mStarsVerts.notNull()) { mStarsVerts->setBuffer(LLDrawPoolWLSky::STAR_VERTEX_DATA_MASK); - U16* indicesp = (U16*) mStarsVerts->getIndicesPointer(); - glDrawElements(GL_POINTS, getStarsNumIndices(), GL_UNSIGNED_SHORT, indicesp); + mStarsVerts->draw(LLVertexBuffer::POINTS, getStarsNumIndices(), 0); } - - glDisableClientState(GL_COLOR_ARRAY); } void LLVOWLSky::drawDome(void) @@ -507,19 +502,8 @@ void LLVOWLSky::drawDome(void) LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE); const U32 data_mask = LLDrawPoolWLSky::SKY_VERTEX_DATA_MASK; - - glEnableClientState(GL_TEXTURE_COORD_ARRAY); - + #if DOME_SLICES - //mFanVerts->setBuffer(data_mask); - //glDrawRangeElements( - // GL_TRIANGLES, - // 0, getFanNumVerts()-1, getFanNumIndices(), - // GL_UNSIGNED_SHORT, - // mFanVerts->getIndicesPointer()); - - //gPipeline.addTrianglesDrawn(getFanNumIndices()/3); - std::vector< LLPointer<LLVertexBuffer> >::const_iterator strips_vbo_iter, end_strips; end_strips = mStripsVerts.end(); for(strips_vbo_iter = mStripsVerts.begin(); strips_vbo_iter != end_strips; ++strips_vbo_iter) @@ -528,13 +512,10 @@ void LLVOWLSky::drawDome(void) strips_segment->setBuffer(data_mask); - glDrawRangeElements( - //GL_TRIANGLES, - GL_TRIANGLE_STRIP, - 0, strips_segment->getRequestedVerts()-1, strips_segment->getRequestedIndices(), - GL_UNSIGNED_SHORT, - strips_segment->getIndicesPointer()); - + strips_segment->drawRange( + LLVertexBuffer::TRIANGLE_STRIP, + 0, strips_segment->getRequestedVerts()-1, strips_segment->getRequestedIndices(), + 0); gPipeline.addTrianglesDrawn(strips_segment->getRequestedIndices() - 2); } @@ -547,8 +528,6 @@ void LLVOWLSky::drawDome(void) mStripsVerts->getIndicesPointer()); #endif - glDisableClientState(GL_TEXTURE_COORD_ARRAY); - LLVertexBuffer::unbind(); } diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index 4e679d28d5..69f2a4c4b7 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -168,7 +168,7 @@ glh::matrix4f glh_get_current_projection() return glh_copy_matrix(gGLProjection); } -void glh_copy_matrix(glh::matrix4f& src, GLdouble* dst) +void glh_copy_matrix(const glh::matrix4f& src, GLdouble* dst) { for (U32 i = 0; i < 16; i++) { @@ -176,7 +176,7 @@ void glh_copy_matrix(glh::matrix4f& src, GLdouble* dst) } } -void glh_set_current_modelview(glh::matrix4f& mat) +void glh_set_current_modelview(const glh::matrix4f& mat) { glh_copy_matrix(mat, gGLModelView); } @@ -2144,9 +2144,9 @@ void render_hud_elements() LLViewerParcelMgr::getInstance()->renderParcelCollision(); // Render debugging beacons. - gObjectList.renderObjectBeacons(); - LLHUDObject::renderAll(); - gObjectList.resetObjectBeacons(); + //gObjectList.renderObjectBeacons(); + //LLHUDObject::renderAll(); + //gObjectList.resetObjectBeacons(); } else if (gForceRenderLandFence) { @@ -2253,11 +2253,11 @@ void LLPipeline::renderGeom(LLCamera& camera, BOOL forceVBOUpdate) // // - glEnableClientState(GL_VERTEX_ARRAY); - stop_glerror(); gFrameStats.start(LLFrameStats::RENDER_SYNC); + glEnableClientState(GL_VERTEX_ARRAY); + // Do verification of GL state #ifndef LL_RELEASE_FOR_DOWNLOAD LLGLState::checkStates(); @@ -2377,10 +2377,10 @@ void LLPipeline::renderGeom(LLCamera& camera, BOOL forceVBOUpdate) break; } - p->resetTrianglesDrawn(); p->render(i); } poolp->endRenderPass(i); + LLVertexBuffer::unbind(); #ifndef LL_RELEASE_FOR_DOWNLOAD # if LL_DEBUG_GL GLint depth; @@ -2413,6 +2413,7 @@ void LLPipeline::renderGeom(LLCamera& camera, BOOL forceVBOUpdate) } } + LLVertexBuffer::unbind(); #ifndef LL_RELEASE_FOR_DOWNLOAD LLGLState::checkStates(); LLGLState::checkTextureChannels(); @@ -2452,6 +2453,15 @@ void LLPipeline::renderGeom(LLCamera& camera, BOOL forceVBOUpdate) LLVertexBuffer::stopRender(); LLVertexBuffer::unbind(); + if (!LLPipeline::sReflectionRender && gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_UI)) + { + gGL.start(); + // Render debugging beacons. + gObjectList.renderObjectBeacons(); + LLHUDObject::renderAll(); + gObjectList.resetObjectBeacons(); + gGL.stop(); + } //HACK: preserve/restore matrices around HUD render if (gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_HUD)) @@ -2472,15 +2482,9 @@ void LLPipeline::renderGeom(LLCamera& camera, BOOL forceVBOUpdate) void LLPipeline::renderGeomDeferred() { - glEnableClientState(GL_TEXTURE_COORD_ARRAY); - glEnableClientState(GL_NORMAL_ARRAY); - glEnableClientState(GL_COLOR_ARRAY); gDeferredDiffuseProgram.bind(); gPipeline.renderObjects(LLRenderPass::PASS_SIMPLE, LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD | LLVertexBuffer::MAP_COLOR | LLVertexBuffer::MAP_NORMAL, TRUE); gDeferredDiffuseProgram.unbind(); - glDisableClientState(GL_COLOR_ARRAY); - glDisableClientState(GL_NORMAL_ARRAY); - glDisableClientState(GL_TEXTURE_COORD_ARRAY); } void LLPipeline::addTrianglesDrawn(S32 count) @@ -2506,11 +2510,6 @@ void LLPipeline::renderDebug() gGL.start(); - // Disable all client state - //glDisableClientState(GL_TEXTURE_COORD_ARRAY); - //glDisableClientState(GL_NORMAL_ARRAY); - //glDisableClientState(GL_COLOR_ARRAY); - gGLLastMatrix = NULL; glLoadMatrixd(gGLModelView); glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_FALSE); @@ -2603,8 +2602,6 @@ void LLPipeline::renderForSelect(std::set<LLViewerObject*>& objects) LLGLDepthTest gls_depth(GL_TRUE,GL_TRUE); disableLights(); - glEnableClientState ( GL_VERTEX_ARRAY ); - //for each drawpool #ifndef LL_RELEASE_FOR_DOWNLOAD LLGLState::checkStates(); @@ -2619,7 +2616,7 @@ void LLPipeline::renderForSelect(std::set<LLViewerObject*>& objects) { LLFacePool* face_pool = (LLFacePool*) poolp; face_pool->renderForSelect(); - + LLVertexBuffer::unbind(); gGLLastMatrix = NULL; glLoadMatrixd(gGLModelView); @@ -2635,7 +2632,6 @@ void LLPipeline::renderForSelect(std::set<LLViewerObject*>& objects) } } - glEnableClientState(GL_TEXTURE_COORD_ARRAY); LLGLEnable alpha_test(GL_ALPHA_TEST); if (gPickTransparent) { @@ -2759,10 +2755,10 @@ void LLPipeline::renderForSelect(std::set<LLViewerObject*>& objects) } glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); - glDisableClientState( GL_TEXTURE_COORD_ARRAY ); + LLVertexBuffer::unbind(); LLVertexBuffer::stopRender(); - + glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); } @@ -4866,6 +4862,12 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in) { if (LLPipeline::sWaterReflections && assertInitialized() && LLDrawPoolWater::sNeedsReflectionUpdate) { +#ifndef LL_RELEASE_FOR_DOWNLOAD + LLGLState::checkStates(); + LLGLState::checkTextureChannels(); + LLGLState::checkClientArrays(); +#endif + LLCamera camera = camera_in; camera.setFar(camera.getFar()*0.87654321f); LLPipeline::sReflectionRender = TRUE; @@ -5052,6 +5054,12 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in) LLDrawPoolWater::sNeedsDistortionUpdate = FALSE; LLViewerCamera::getInstance()->setUserClipPlane(LLPlane(-pnorm, -pd)); LLPipeline::sUseOcclusion = occlusion; + +#ifndef LL_RELEASE_FOR_DOWNLOAD + LLGLState::checkStates(); + LLGLState::checkTextureChannels(); + LLGLState::checkClientArrays(); +#endif } } diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h index 6e02b55daf..7e38628d87 100644 --- a/indra/newview/pipeline.h +++ b/indra/newview/pipeline.h @@ -67,8 +67,9 @@ BOOL compute_min_max(LLMatrix4& box, LLVector2& min, LLVector2& max); // Shouldn bool LLRayAABB(const LLVector3 ¢er, const LLVector3 &size, const LLVector3& origin, const LLVector3& dir, LLVector3 &coord, F32 epsilon = 0); BOOL LLLineSegmentAABB(const LLVector3& start, const LLVector3& end, const LLVector3& center, const LLVector3& size); BOOL setup_hud_matrices(BOOL for_select); +glh::matrix4f glh_copy_matrix(GLdouble* src); glh::matrix4f glh_get_current_modelview(); -void glh_set_current_modelview(glh::matrix4f& mat); +void glh_set_current_modelview(const glh::matrix4f& mat); glh::matrix4f glh_get_current_projection(); void glh_set_current_projection(glh::matrix4f& mat); glh::matrix4f gl_ortho(GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat znear, GLfloat zfar); |