From 1fcb6f4086af2fdc5c46dee05204977b70ca7961 Mon Sep 17 00:00:00 2001 From: Liny Date: Mon, 21 Jul 2014 20:50:36 -0700 Subject: [PATCH] Fixing up/classifying Nicky D's fsvopartgroup code --- indra/newview/CMakeLists.txt | 2 + indra/newview/fsvopartgroup.cpp | 69 +++++++++++++++++++++++++++------ indra/newview/fsvopartgroup.h | 57 +++++++++++++++++++++++++++ indra/newview/llvopartgroup.cpp | 52 ++++++++++++++----------- indra/newview/llvopartgroup.h | 9 +++++ 5 files changed, 155 insertions(+), 34 deletions(-) create mode 100644 indra/newview/fsvopartgroup.h diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 07e467f6c8..263af5843c 100755 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -184,6 +184,7 @@ set(viewer_SOURCE_FILES fsradarmenu.cpp fsscriptlibrary.cpp fsslurlcommand.cpp + fsvopartgroup.cpp fswsassetblacklist.cpp groupchatlistener.cpp #growlmanager.cpp @@ -885,6 +886,7 @@ set(viewer_HEADER_FILES fsscriptlibrary.h fsslurl.h fsslurlcommand.h + fsvopartgroup.h fswsassetblacklist.h groupchatlistener.h llaccountingcost.h diff --git a/indra/newview/fsvopartgroup.cpp b/indra/newview/fsvopartgroup.cpp index b4b61e54d3..5d7529c89d 100644 --- a/indra/newview/fsvopartgroup.cpp +++ b/indra/newview/fsvopartgroup.cpp @@ -1,8 +1,46 @@ -U32 sFreeIndex[LL_MAX_PARTICLE_COUNT/32] = {0}; -U32 sIndexGeneration = 1; -U32 sTotalParticles = 0; +/** + * @file fsvopartgroup.cpp + * @brief fsvopartgroup base class + * + * $LicenseInfo:firstyear=2001&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2010, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ -U32 bitMasks[ 32 ] = { 0xFFFFFFFF, 0x80000000, 0xC0000000, 0xE0000000, +#include "llviewerprecompiledheaders.h" + +#include "llviewerpartsim.h" // For LL_MAX_PARTICLE_COUNT + +#include "fsvopartgroup.h" + + +FSVOPartGroup::FSVOPartGroup() +{ + for(int i = 0; i < sFreeIndexSize; i++) + { + setFreeIndex(i,0); + } + setIndexGeneration(1); + setTotalParticles(0); + + U32 bitMasksTmp[ 32 ] = { 0xFFFFFFFF, 0x80000000, 0xC0000000, 0xE0000000, 0xF0000000, 0xF8000000, 0xFC000000, 0xFE000000, 0xFF000000, 0xFF800000, 0xFFC00000, 0xFFE00000, 0xFFF00000, 0xFFF80000, 0xFFFC0000, 0xFFFE0000, @@ -11,12 +49,19 @@ U32 bitMasks[ 32 ] = { 0xFFFFFFFF, 0x80000000, 0xC0000000, 0xE0000000, 0xFFFFFF00, 0xFFFFFF80, 0xFFFFFFC0, 0xFFFFFFE0, 0xFFFFFFF0, 0xFFFFFFF8, 0xFFFFFFFC, 0xFFFFFFFE }; -bool findAvailableVBSlots( S32 &idxStart, S32 &idxEnd, U32 amount ) + for(int i = 0;i<32;i++) + { + bitMasks[i] = bitMasksTmp[i]; + } +} + + +bool FSVOPartGroup::findAvailableVBSlots( S32 &idxStart, S32 &idxEnd, U32 amount ) { idxStart = idxEnd = -1; - if( amount + sTotalParticles > LL_MAX_PARTICLE_COUNT ) - amount = LL_MAX_PARTICLE_COUNT - sTotalParticles; + if( amount + getTotalParticles() > LL_MAX_PARTICLE_COUNT ) + amount = LL_MAX_PARTICLE_COUNT - getTotalParticles(); U32 u32Count = amount/32; U32 bitsLeft = amount - (u32Count*32); @@ -28,17 +73,17 @@ bool findAvailableVBSlots( S32 &idxStart, S32 &idxEnd, U32 amount ) int maxI = LL_MAX_PARTICLE_COUNT/32-u32Count; do { - while( sFreeIndex[i] != 0xFFFFFFFF && i <= maxI ) + while( getFreeIndex(i) != 0xFFFFFFFF && i <= maxI ) ++i; if( i > maxI ) continue; int j = i; - while( sFreeIndex[j] == 0xFFFFFFFF && j <= LL_MAX_PARTICLE_COUNT/32 && (j-i) != u32Count ) + while( getFreeIndex(j) == 0xFFFFFFFF && j <= LL_MAX_PARTICLE_COUNT/32 && (j-i) != u32Count ) ++j; - if( j > LL_MAX_PARTICLE_COUNT/32 || (i-j) != u32Count || (sFreeIndex[j-1] & maskLast) != maskLast ) + if( j > LL_MAX_PARTICLE_COUNT/32 || (i-j) != u32Count || (getFreeIndex(j-1) & maskLast) != maskLast ) { ++i; continue; @@ -52,13 +97,13 @@ bool findAvailableVBSlots( S32 &idxStart, S32 &idxEnd, U32 amount ) for( int l = 0; k != amount && l < 32; ++l ) { U32 mask = 1 << l; - sFreeIndex[ i ] &= ~mask; + setFreeIndex(i, getFreeIndex(i) & ~mask); ++k; } ++i; } - sTotalParticles += amount; + setTotalParticles(getTotalParticles() + amount); return true; } while( i <= maxI); diff --git a/indra/newview/fsvopartgroup.h b/indra/newview/fsvopartgroup.h new file mode 100644 index 0000000000..f51f092a3f --- /dev/null +++ b/indra/newview/fsvopartgroup.h @@ -0,0 +1,57 @@ +/** + * @file fsvopartgroup.h + * @brief fsvopartgroup base class + * + * $LicenseInfo:firstyear=2001&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2010, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + +#ifndef FS_VOPARTGROUP_H +#define FS_VOPARTGROUP_H + +#include "stdtypes.h" + +#define sFreeIndexSize LL_MAX_PARTICLE_COUNT/32 + +class FSVOPartGroup +{ +public: + FSVOPartGroup(); + ~FSVOPartGroup() {}; + + U32 getFreeIndex(int i) {return sFreeIndex[i];} + U32 getIndexGeneration() {return sIndexGeneration;} + U32 getTotalParticles() {return sTotalParticles;} + + void setFreeIndex(int i, U32 val) {sFreeIndex[i] = val;} + void setIndexGeneration(U32 val) {sIndexGeneration = val;} + void setTotalParticles(U32 val) {sTotalParticles = val;} + + bool findAvailableVBSlots( S32 &idxStart, S32 &idxEnd, U32 amount ); + +private: + U32 sFreeIndex[sFreeIndexSize]; + U32 sIndexGeneration; + U32 sTotalParticles; + + U32 bitMasks[ 32 ]; +}; +#endif // FS_VOPARTGROUP_H diff --git a/indra/newview/llvopartgroup.cpp b/indra/newview/llvopartgroup.cpp index 4107130a67..ae668402d2 100755 --- a/indra/newview/llvopartgroup.cpp +++ b/indra/newview/llvopartgroup.cpp @@ -51,7 +51,8 @@ extern U64MicrosecondsImplicit gFrameTime; LLPointer LLVOPartGroup::sVB = NULL; S32 LLVOPartGroup::sVBSlotCursor = 0; -#include "fsvopartgroup.cpp" +#include "fsvopartgroup.h" // Fixing up/classifying Nicky D's fsvopartgroup code +FSVOPartGroup *LLVOPartGroup::fsvopartgroup = NULL; void LLVOPartGroup::initClass() { @@ -61,11 +62,12 @@ void LLVOPartGroup::initClass() //static void LLVOPartGroup::restoreGL() { - sIndexGeneration += 2; + // Fixing up/classifying Nicky D's fsvopartgroup code + fsvopartgroup->setIndexGeneration( fsvopartgroup->getIndexGeneration() + 2); for( int i = 0; i < LL_MAX_PARTICLE_COUNT/32; ++i ) - sFreeIndex[i] = 0xFFFFFFFF; - + fsvopartgroup->setFreeIndex(i, 0xFFFFFFFF); + // //TODO: optimize out binormal mask here. Specular and normal coords as well. sVB = new LLVertexBuffer(VERTEX_DATA_MASK | LLVertexBuffer::MAP_TANGENT | LLVertexBuffer::MAP_TEXCOORD1 | LLVertexBuffer::MAP_TEXCOORD2, GL_STREAM_DRAW_ARB); @@ -125,11 +127,19 @@ void LLVOPartGroup::destroyGL() //static S32 LLVOPartGroup::findAvailableVBSlot() { + // Fixing up/classifying Nicky D's fsvopartgroup code + /*if (sVBSlotCursor >= LL_MAX_PARTICLE_COUNT) + { //no more available slots + return -1; + } + + return sVBSlotCursor++;*/ + for( int i = 0; i < LL_MAX_PARTICLE_COUNT/32; ++i ) { - if( sFreeIndex[i] != 0 ) + if( fsvopartgroup->getFreeIndex(i) != 0 ) { - U32 val = sFreeIndex[i]; + U32 val = fsvopartgroup->getFreeIndex(i); U32 mask = 1; int j(0); for( j = 0; j < 32; ++j ) @@ -143,21 +153,15 @@ S32 LLVOPartGroup::findAvailableVBSlot() mask <<= 1; } - sFreeIndex[ i ] = val & mask; - ++sTotalParticles; + fsvopartgroup->setFreeIndex(i, val & mask); + fsvopartgroup->setTotalParticles(fsvopartgroup->getTotalParticles()+1); return i*32+j; } } return -1; - -// if (sVBSlotCursor >= LL_MAX_PARTICLE_COUNT) -// { //no more available slots -// return -1; -// } -// -// return sVBSlotCursor++; + // } bool ll_is_part_idx_allocated(S32 idx, S32* start, S32* end) @@ -176,6 +180,7 @@ bool ll_is_part_idx_allocated(S32 idx, S32* start, S32* end) } //static +// Fixing up/classifying Nicky D's fsvopartgroup code // void LLVOPartGroup::freeVBSlot(S32 idx) void LLVOPartGroup::freeVBSlot(S32 idx, U32 generation ) { @@ -192,9 +197,10 @@ void LLVOPartGroup::freeVBSlot(S32 idx, U32 generation ) if( idx < 0 || idx >= LL_MAX_PARTICLE_COUNT ) return; - --sTotalParticles; + // Fixing up/classifying Nicky D's fsvopartgroup code + fsvopartgroup->setTotalParticles(fsvopartgroup->getTotalParticles()-1); - if( sIndexGeneration != generation ) + if( fsvopartgroup->getIndexGeneration() != generation ) return; U32 i = (idx & ~0x0000001F) / 32; @@ -202,7 +208,8 @@ void LLVOPartGroup::freeVBSlot(S32 idx, U32 generation ) U32 mask = 1 << j; - sFreeIndex[ i ] |= mask; + fsvopartgroup->setFreeIndex(i, fsvopartgroup->getFreeIndex(i) | mask); + // } LLVOPartGroup::LLVOPartGroup(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp) @@ -212,6 +219,7 @@ LLVOPartGroup::LLVOPartGroup(const LLUUID &id, const LLPCode pcode, LLViewerRegi setNumTEs(1); setTETexture(0, LLUUID::null); mbCanSelect = FALSE; // users can't select particle systems + fsvopartgroup = new FSVOPartGroup(); } @@ -914,7 +922,7 @@ void LLParticlePartition::getGeometry(LLSpatialGroup* group) (*itr)->setGeomIndex( 0 ); S32 idxStart, idxEnd; - bool bValidRange = findAvailableVBSlots( idxStart, idxEnd, mFaceList.size() ); + bool bValidRange = LLVOPartGroup::getFsvopartgroup()->findAvailableVBSlots( idxStart, idxEnd, mFaceList.size() ); // for (std::vector::iterator i = mFaceList.begin(); i != mFaceList.end(); ++i) @@ -935,14 +943,14 @@ void LLParticlePartition::getGeometry(LLSpatialGroup* group) } else idx = LLVOPartGroup::findAvailableVBSlot(); - // + // if (idx >= 0) { // Face needs to release the index when it gets destroyed. // facep->setGeomIndex(idx*4); - facep->setGeomIndex(idx*4, sIndexGeneration); - // + facep->setGeomIndex(idx*4, LLVOPartGroup::getFsvopartgroup()->getIndexGeneration()); + // facep->setIndicesIndex(idx*6); facep->setVertexBuffer(LLVOPartGroup::sVB); diff --git a/indra/newview/llvopartgroup.h b/indra/newview/llvopartgroup.h index e245a2bc16..eb98902444 100755 --- a/indra/newview/llvopartgroup.h +++ b/indra/newview/llvopartgroup.h @@ -36,6 +36,8 @@ class LLViewerPartGroup; +class FSVOPartGroup; // Fixing up/classifying Nicky D's fsvopartgroup code + class LLVOPartGroup : public LLAlphaObject { public: @@ -106,6 +108,8 @@ public: void setViewerPartGroup(LLViewerPartGroup *part_groupp) { mViewerPartGroupp = part_groupp; } LLViewerPartGroup* getViewerPartGroup() { return mViewerPartGroupp; } + static FSVOPartGroup* getFsvopartgroup() {return fsvopartgroup;}// Fixing up/classifying Nicky D's fsvopartgroup code + protected: ~LLVOPartGroup(); @@ -113,6 +117,11 @@ protected: virtual LLVector3 getCameraPosition() const; +// Fixing up/classifying Nicky D's fsvopartgroup code +private: + static FSVOPartGroup* fsvopartgroup; +// + };