diff --git a/indra/llcommon/llversionviewer.h.in b/indra/llcommon/llversionviewer.h.in index 82285523d..40933fcd4 100644 --- a/indra/llcommon/llversionviewer.h.in +++ b/indra/llcommon/llversionviewer.h.in @@ -35,7 +35,7 @@ const S32 LL_VERSION_MAJOR = 1; const S32 LL_VERSION_MINOR = 7; -const S32 LL_VERSION_PATCH = 1; +const S32 LL_VERSION_PATCH = 2; const S32 LL_VERSION_BUILD = ${vBUILD}; const char * const LL_CHANNEL = "${VIEWER_CHANNEL}"; diff --git a/indra/llmath/lloctree.h b/indra/llmath/lloctree.h index cc1482b18..6e5e51b7e 100644 --- a/indra/llmath/lloctree.h +++ b/indra/llmath/lloctree.h @@ -81,6 +81,33 @@ public: virtual void traverse(const LLOctreeNode* node); }; +struct OctreeGuard +{ + template + OctreeGuard(const LLOctreeNode* node) + {mNode = (void*)node;getNodes().push_back(this);} + ~OctreeGuard() + {llassert_always(getNodes().back() == this); getNodes().pop_back();} + template + static bool checkGuarded(const LLOctreeNode* node) + { + for(std::vector::const_iterator it=getNodes().begin();it != getNodes().end();++it) + { + if((*it)->mNode == node) + { + OCT_ERRS << "!!! MANIPULATING OCTREE BRANCH DURING ITERATION !!!" << llendl; + return true; + } + } + return false; + } + static std::vector& getNodes() + { + static std::vector gNodes; + return gNodes; + } + void* mNode; +}; template class LLOctreeNode : public LLTreeNode { @@ -246,8 +273,8 @@ public: U32 getElementCount() const { return mElementCount; } bool isEmpty() const { return mElementCount == 0; } - element_list& getData() { return mData; } - const element_list& getData() const { return mData; } + //element_list& getData() { return mData; } + //const element_list& getData() const { return mData; } element_iter getDataBegin() { return mData; } element_iter getDataEnd() { return mDataEnd; } const_element_iter getDataBegin() const { return mData; } @@ -317,6 +344,7 @@ public: virtual bool insert(T* data) { + OctreeGuard::checkGuarded(this); if (data == NULL || data->getBinIndex() != -1) { OCT_ERRS << "!!! INVALID ELEMENT ADDED TO OCTREE BRANCH !!!" << llendl; @@ -433,7 +461,7 @@ public: void _remove(T* data, S32 i) { //precondition -- mElementCount > 0, idx is in range [0, mElementCount) - + OctreeGuard::checkGuarded(this); mElementCount--; data->setBinIndex(-1); @@ -463,6 +491,7 @@ public: bool remove(T* data) { + OctreeGuard::checkGuarded(this); S32 i = data->getBinIndex(); if (i >= 0 && i < (S32)mElementCount) @@ -508,6 +537,7 @@ public: void removeByAddress(T* data) { + OctreeGuard::checkGuarded(this); for (U32 i = 0; i < mElementCount; ++i) { if (mData[i] == data) @@ -527,6 +557,7 @@ public: void clearChildren() { + OctreeGuard::checkGuarded(this); mChildCount = 0; U32* foo = (U32*) mChildMap; @@ -587,6 +618,7 @@ public: OCT_ERRS <<"Octree node has too many children... why?" << llendl; } #endif + OctreeGuard::checkGuarded(this); mChildMap[child->getOctant()] = mChildCount; @@ -606,6 +638,8 @@ public: void removeChild(S32 index, BOOL destroy = FALSE) { + OctreeGuard::checkGuarded(this); + for (U32 i = 0; i < this->getListenerCount(); i++) { oct_listener* listener = getOctListener(i); diff --git a/indra/llplugin/slplugin/CMakeLists.txt b/indra/llplugin/slplugin/CMakeLists.txt index ea9afec16..e377434b1 100644 --- a/indra/llplugin/slplugin/CMakeLists.txt +++ b/indra/llplugin/slplugin/CMakeLists.txt @@ -52,7 +52,14 @@ add_executable(SLPlugin set_target_properties(SLPlugin PROPERTIES MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/slplugin_info.plist +) + +if (WINDOWS) + set_target_properties(SLPlugin + PROPERTIES + LINK_FLAGS "/OPT:NOREF" ) +endif() target_link_libraries(SLPlugin ${LLPLUGIN_LIBRARIES} diff --git a/indra/llrender/llpostprocess.cpp b/indra/llrender/llpostprocess.cpp index 2cedee327..d1cb1b3c5 100644 --- a/indra/llrender/llpostprocess.cpp +++ b/indra/llrender/llpostprocess.cpp @@ -48,6 +48,7 @@ extern LLGLSLShader gPostColorFilterProgram; extern LLGLSLShader gPostNightVisionProgram; extern LLGLSLShader gPostGaussianBlurProgram; extern LLGLSLShader gPostPosterizeProgram; +extern LLGLSLShader gPostMotionBlurProgram; static const unsigned int NOISE_SIZE = 512; @@ -259,6 +260,53 @@ public: } }; +class LLMotionShader : public LLPostProcessShader +{ +private: + LLShaderSetting mEnabled; + LLShaderSetting mStrength; +public: + LLMotionShader() : + mEnabled("enable_motionblur",false), + mStrength("blur_strength",false) + { + mSettings.push_back(&mEnabled); + mSettings.push_back(&mStrength); + } + bool isEnabled() { return mEnabled && gPostMotionBlurProgram.mProgramObject; } + S32 getColorChannel() { return 0; } + S32 getDepthChannel() { return 1; } + QuadType bind() + { + if(!isEnabled()) + { + return QUAD_NONE; + } + + glh::matrix4f inv_proj(gGLModelView); + inv_proj.mult_left(gGLProjection); + inv_proj = inv_proj.inverse(); + glh::matrix4f prev_proj(gGLPreviousModelView); + prev_proj.mult_left(gGLProjection); + + LLVector2 screen_rect = LLPostProcess::getInstance()->getDimensions(); + + gPostMotionBlurProgram.bind(); + gPostMotionBlurProgram.uniformMatrix4fv("prev_proj", 1, GL_FALSE, prev_proj.m); + gPostMotionBlurProgram.uniformMatrix4fv("inv_proj", 1, GL_FALSE, inv_proj.m); + gPostMotionBlurProgram.uniform2fv("screen_res", 1, screen_rect.mV); + gPostMotionBlurProgram.uniform1i("blur_strength", mStrength); + } + bool draw(U32 pass) + { + return pass == 1; + } + void unbind() + { + gPostMotionBlurProgram.unbind(); + } +}; + LLPostProcess::LLPostProcess(void) : mVBO(NULL), mDepthTexture(0), @@ -269,11 +317,13 @@ LLPostProcess::LLPostProcess(void) : mSelectedEffectInfo(LLSD::emptyMap()), mAllEffectInfo(LLSD::emptyMap()) { + mShaders.push_back(new LLMotionShader()); mShaders.push_back(new LLColorFilterShader()); mShaders.push_back(new LLNightVisionShader()); mShaders.push_back(new LLGaussBlurShader()); mShaders.push_back(new LLPosterizeShader()); + /* Do nothing. Needs to be updated to use our current shader system, and to work with the move into llrender.*/ std::string pathName(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "windlight", XML_FILENAME)); LL_DEBUGS2("AppInit", "Shaders") << "Loading PostProcess Effects settings from " << pathName << LL_ENDL; diff --git a/indra/llrender/llpostprocess.h b/indra/llrender/llpostprocess.h index ec076842d..9ecd9e293 100644 --- a/indra/llrender/llpostprocess.h +++ b/indra/llrender/llpostprocess.h @@ -142,6 +142,9 @@ private: void drawOrthoQuad(QuadType type); //Finally draws fullscreen quad with the shader currently bound. public: + LLVector2 getDimensions() { return LLVector2(mScreenWidth,mScreenHeight); } + + // UI interaction // Getters inline LLSD const & getAllEffectInfo(void) const { return mAllEffectInfo; } diff --git a/indra/llrender/llrender.cpp b/indra/llrender/llrender.cpp index feedabad5..366f506a7 100644 --- a/indra/llrender/llrender.cpp +++ b/indra/llrender/llrender.cpp @@ -42,6 +42,7 @@ LLRender gGL; //Would be best to migrate these to LLMatrix4a and LLVector4a, but that's too divergent right now. LL_ALIGN_16(F32 gGLModelView[16]); LL_ALIGN_16(F32 gGLLastModelView[16]); +LL_ALIGN_16(F32 gGLPreviousModelView[16]); LL_ALIGN_16(F32 gGLLastProjection[16]); LL_ALIGN_16(F32 gGLProjection[16]); LL_ALIGN_16(S32 gGLViewport[4]); diff --git a/indra/llrender/llrender.h b/indra/llrender/llrender.h index 0d9c5326f..d8f01a75a 100644 --- a/indra/llrender/llrender.h +++ b/indra/llrender/llrender.h @@ -474,6 +474,7 @@ private: extern F32 gGLModelView[16]; extern F32 gGLLastModelView[16]; extern F32 gGLLastProjection[16]; +extern F32 gGLPreviousModelView[16]; extern F32 gGLProjection[16]; extern S32 gGLViewport[4]; diff --git a/indra/newview/app_settings/shaders/class1/effects/MotionBlurF.glsl b/indra/newview/app_settings/shaders/class1/effects/MotionBlurF.glsl new file mode 100644 index 000000000..89aaa8f10 --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/effects/MotionBlurF.glsl @@ -0,0 +1,55 @@ +/** + * @file colorFilterF.glsl + * + * Copyright (c) 2007-$CurrentYear$, Linden Research, Inc. + * $License$ + */ + +#extension GL_ARB_texture_rectangle : enable + +#ifdef DEFINE_GL_FRAGCOLOR +out vec4 frag_color; +#else +#define frag_color gl_FragColor +#endif + +uniform sampler2DRect tex0; +uniform sampler2DRect tex1; +uniform mat4 inv_proj; +uniform mat4 prev_proj; +uniform vec2 screen_res; +uniform int blur_strength; + +VARYING vec2 vary_texcoord0; + +#define SAMPLE_COUNT 10 + +vec4 getPosition(vec2 pos_screen, out vec4 ndc) +{ + float depth = texture2DRect(tex1, pos_screen.xy).r; + vec2 sc = pos_screen.xy*2.0; + sc /= screen_res; + sc -= vec2(1.0,1.0); + ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0); + vec4 pos = inv_proj * ndc; + pos /= pos.w; + pos.w = 1.0; + return pos; +} + +void main(void) +{ + vec4 ndc; + vec4 pos = getPosition(vary_texcoord0,ndc); + vec4 prev_pos = prev_proj * pos; + prev_pos/=prev_pos.w; + prev_pos.w = 1.0; + vec2 vel = ((ndc.xy-prev_pos.xy) * .5) * screen_res * .001 * blur_strength; + vec3 color = texture2DRect(tex0, vary_texcoord0.st).rgb; + vec2 texcoord = vary_texcoord0 + vel; + for(int i = 1; i < SAMPLE_COUNT; ++i, texcoord += vel) + { + color += texture2DRect(tex0, texcoord.st).rgb; + } + frag_color = vec4(color / SAMPLE_COUNT, 1.0); +} diff --git a/indra/newview/app_settings/windlight/postprocesseffects.xml b/indra/newview/app_settings/windlight/postprocesseffects.xml index 0914b275a..b5b173b40 100644 --- a/indra/newview/app_settings/windlight/postprocesseffects.xml +++ b/indra/newview/app_settings/windlight/postprocesseffects.xml @@ -175,6 +175,8 @@ enable_gauss_blur 0 enable_posterize + 0 + enable_motionblur 0 gauss_blur_passes 2 @@ -190,6 +192,8 @@ 1 posterize_layers 10 + blur_strength + 10 \ No newline at end of file diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp index 20c390931..99dfb11e1 100644 --- a/indra/newview/llspatialpartition.cpp +++ b/indra/newview/llspatialpartition.cpp @@ -1276,6 +1276,7 @@ void LLSpatialGroup::handleDestruction(const TreeNode* node) LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION); setState(DEAD); + {OctreeGuard guard(mOctreeNode); for (element_iter i = getDataBegin(); i != getDataEnd(); ++i) { LLDrawable* drawable = *i; @@ -1284,6 +1285,7 @@ void LLSpatialGroup::handleDestruction(const TreeNode* node) drawable->setSpatialGroup(NULL); } } + } //clean up avatar attachment stats LLSpatialBridge* bridge = mSpatialPartition->asBridge(); @@ -1363,6 +1365,7 @@ void LLSpatialGroup::destroyGL(bool keep_occlusion) } + OctreeGuard guard(mOctreeNode); for (LLSpatialGroup::element_iter i = getDataBegin(); i != getDataEnd(); ++i) { LLDrawable* drawable = *i; @@ -2065,6 +2068,7 @@ public: { LLSpatialGroup::OctreeNode* branch = group->mOctreeNode; + OctreeGuard guard(branch); for (LLSpatialGroup::OctreeNode::const_element_iter i = branch->getDataBegin(); i != branch->getDataEnd(); ++i) { LLDrawable* drawable = *i; @@ -2189,6 +2193,7 @@ public: LLSpatialGroup* group = (LLSpatialGroup*) state->getListener(0); group->destroyGL(); + {OctreeGuard guard(group->mOctreeNode); for (LLSpatialGroup::element_iter i = group->getDataBegin(); i != group->getDataEnd(); ++i) { LLDrawable* drawable = *i; @@ -2197,6 +2202,7 @@ public: gPipeline.markRebuild(drawable, LLDrawable::REBUILD_ALL, TRUE); } } + } for (LLSpatialGroup::bridge_list_t::iterator i = group->mBridgeList.begin(); i != group->mBridgeList.end(); ++i) { @@ -2502,6 +2508,7 @@ void renderOctree(LLSpatialGroup* group) gGL.flush(); glLineWidth(1.f); gGL.flush(); + OctreeGuard guard(group->mOctreeNode); for (LLSpatialGroup::element_iter i = group->getDataBegin(); i != group->getDataEnd(); ++i) { LLDrawable* drawable = *i; @@ -3358,6 +3365,7 @@ void renderPhysicsShape(LLDrawable* drawable, LLVOVolume* volume) void renderPhysicsShapes(LLSpatialGroup* group) { + OctreeGuard guard(group->mOctreeNode); for (LLSpatialGroup::OctreeNode::const_element_iter i = group->getDataBegin(); i != group->getDataEnd(); ++i) { LLDrawable* drawable = *i; @@ -3885,6 +3893,7 @@ public: } } + {OctreeGuard guard(branch); for (LLSpatialGroup::OctreeNode::const_element_iter i = branch->getDataBegin(); i != branch->getDataEnd(); ++i) { LLDrawable* drawable = *i; @@ -3980,7 +3989,7 @@ public: } } } - } + }} for (LLSpatialGroup::draw_map_t::iterator i = group->mDrawMap.begin(); i != group->mDrawMap.end(); ++i) { @@ -4070,6 +4079,7 @@ public: return; } + OctreeGuard guard(branch); for (LLSpatialGroup::OctreeNode::const_element_iter i = branch->getDataBegin(); i != branch->getDataEnd(); ++i) { LLDrawable* drawable = *i; @@ -4293,6 +4303,7 @@ public: virtual void visit(const LLSpatialGroup::OctreeNode* branch) { + OctreeGuard guard(branch); for (LLSpatialGroup::OctreeNode::const_element_iter i = branch->getDataBegin(); i != branch->getDataEnd(); ++i) { check(*i); @@ -4303,6 +4314,7 @@ public: { node->accept(this); + OctreeGuard guard(node); for (U32 i = 0; i < node->getChildCount(); i++) { const LLSpatialGroup::OctreeNode* child = node->getChild(i); diff --git a/indra/newview/llspatialpartition.h b/indra/newview/llspatialpartition.h index 890a52f0d..e6b018087 100644 --- a/indra/newview/llspatialpartition.h +++ b/indra/newview/llspatialpartition.h @@ -332,7 +332,7 @@ public: void dirtyMesh() { setState(MESH_DIRTY); } //octree wrappers to make code more readable - element_list& getData() { return mOctreeNode->getData(); } + //element_list& getData() { return mOctreeNode->getData(); } element_iter getDataBegin() { return mOctreeNode->getDataBegin(); } element_iter getDataEnd() { return mOctreeNode->getDataEnd(); } U32 getElementCount() const { return mOctreeNode->getElementCount(); } diff --git a/indra/newview/llviewerdisplay.cpp b/indra/newview/llviewerdisplay.cpp index c33a668f5..8c932285b 100644 --- a/indra/newview/llviewerdisplay.cpp +++ b/indra/newview/llviewerdisplay.cpp @@ -1025,6 +1025,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot, boo //when rendering next frame's occlusion queries for (U32 i = 0; i < 16; i++) { + gGLPreviousModelView[i] = gGLLastModelView[i]; gGLLastModelView[i] = gGLModelView[i]; gGLLastProjection[i] = gGLProjection[i]; } diff --git a/indra/newview/llviewerobjectlist.cpp b/indra/newview/llviewerobjectlist.cpp index 475950f5d..27da8f4f8 100644 --- a/indra/newview/llviewerobjectlist.cpp +++ b/indra/newview/llviewerobjectlist.cpp @@ -873,11 +873,14 @@ void LLViewerObjectList::update(LLAgent &agent, LLWorld &world) LLMemType mt(LLMemType::MTYPE_OBJECT); // Update globals - LLViewerObject::setVelocityInterpolate( gSavedSettings.getBOOL("VelocityInterpolate") ); - LLViewerObject::setPingInterpolate( gSavedSettings.getBOOL("PingInterpolate") ); + static const LLCachedControl VelocityInterpolate("VelocityInterpolate"); + static const LLCachedControl PingInterpolate("PingInterpolate"); + LLViewerObject::setVelocityInterpolate( VelocityInterpolate ); + LLViewerObject::setPingInterpolate( PingInterpolate ); - F32 interp_time = gSavedSettings.getF32("InterpolationTime"); - F32 phase_out_time = gSavedSettings.getF32("InterpolationPhaseOut"); + static LLCachedControl interp_time("InterpolationTime"); + static LLCachedControl phase_out_time("InterpolationPhaseOut"); + if (interp_time < 0.0 || phase_out_time < 0.0 || phase_out_time > interp_time) @@ -889,7 +892,8 @@ void LLViewerObjectList::update(LLAgent &agent, LLWorld &world) LLViewerObject::setPhaseOutUpdateInterpolationTime( interp_time ); LLViewerObject::setMaxUpdateInterpolationTime( phase_out_time ); - gAnimateTextures = gSavedSettings.getBOOL("AnimateTextures"); + static const LLCachedControl AnimateTextures("AnimateTextures"); + gAnimateTextures = AnimateTextures; // update global timer F32 last_time = gFrameTimeSeconds; diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp index 356cc6cac..25014b640 100644 --- a/indra/newview/llviewershadermgr.cpp +++ b/indra/newview/llviewershadermgr.cpp @@ -171,6 +171,7 @@ LLGLSLShader gPostColorFilterProgram(LLViewerShaderMgr::SHADER_EFFECT); //Not LLGLSLShader gPostNightVisionProgram(LLViewerShaderMgr::SHADER_EFFECT); //Not in mShaderList LLGLSLShader gPostGaussianBlurProgram(LLViewerShaderMgr::SHADER_EFFECT); //Not in mShaderList LLGLSLShader gPostPosterizeProgram(LLViewerShaderMgr::SHADER_EFFECT); //Not in mShaderList +LLGLSLShader gPostMotionBlurProgram(LLViewerShaderMgr::SHADER_EFFECT); //Not in mShaderList // Deferred rendering shaders LLGLSLShader gDeferredImpostorProgram(LLViewerShaderMgr::SHADER_DEFERRED); @@ -977,6 +978,26 @@ BOOL LLViewerShaderMgr::loadShadersEffects() gPostPosterizeProgram.uniform1i("tex0", 0); } } + + { + vector shaderUniforms; + shaderUniforms.reserve(3); + shaderUniforms.push_back("inv_proj"); + shaderUniforms.push_back("prev_proj"); + shaderUniforms.push_back("screen_res"); + + gPostMotionBlurProgram.mName = "Motion Blur Shader (Post)"; + gPostMotionBlurProgram.mShaderFiles.clear(); + gPostMotionBlurProgram.mShaderFiles.push_back(make_pair("effects/MotionBlurF.glsl", GL_FRAGMENT_SHADER_ARB)); + gPostMotionBlurProgram.mShaderFiles.push_back(make_pair("interface/onetexturenocolorV.glsl", GL_VERTEX_SHADER_ARB)); + gPostMotionBlurProgram.mShaderLevel = mVertexShaderLevel[SHADER_EFFECT]; + if(gPostMotionBlurProgram.createShader(NULL, &shaderUniforms)) + { + gPostMotionBlurProgram.bind(); + gPostMotionBlurProgram.uniform1i("tex0", 0); + gPostMotionBlurProgram.uniform1i("tex1", 1); + } + } #endif return success; diff --git a/indra/newview/llvograss.cpp b/indra/newview/llvograss.cpp index 6434dd619..9e9b0c8a3 100644 --- a/indra/newview/llvograss.cpp +++ b/indra/newview/llvograss.cpp @@ -645,6 +645,7 @@ void LLGrassPartition::addGeometryCount(LLSpatialGroup* group, U32& vertex_count mFaceList.clear(); LLViewerCamera* camera = LLViewerCamera::getInstance(); + OctreeGuard guard(group->mOctreeNode); for (LLSpatialGroup::element_iter i = group->getDataBegin(); i != group->getDataEnd(); ++i) { LLDrawable* drawablep = *i; diff --git a/indra/newview/llvopartgroup.cpp b/indra/newview/llvopartgroup.cpp index 0a5a76900..f8c1f84a7 100644 --- a/indra/newview/llvopartgroup.cpp +++ b/indra/newview/llvopartgroup.cpp @@ -557,6 +557,7 @@ void LLParticlePartition::addGeometryCount(LLSpatialGroup* group, U32& vertex_co mFaceList.clear(); LLViewerCamera* camera = LLViewerCamera::getInstance(); + OctreeGuard guard(group->mOctreeNode); for (LLSpatialGroup::element_iter i = group->getDataBegin(); i != group->getDataEnd(); ++i) { LLDrawable* drawablep = *i; diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index 1e1ca8bad..c7a7c44b0 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -3494,6 +3494,7 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group) LLFastTimer t(FTM_REBUILD_VOLUME_FACE_LIST); //get all the faces into a list + OctreeGuard guard(group->mOctreeNode); for (LLSpatialGroup::element_iter drawable_iter = group->getDataBegin(); drawable_iter != group->getDataEnd(); ++drawable_iter) { LLDrawable* drawablep = *drawable_iter; @@ -3900,6 +3901,7 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group) if (!LLPipeline::sDelayVBUpdate) { //drawables have been rebuilt, clear rebuild status + OctreeGuard guard(group->mOctreeNode); for (LLSpatialGroup::element_iter drawable_iter = group->getDataBegin(); drawable_iter != group->getDataEnd(); ++drawable_iter) { LLDrawable* drawablep = *drawable_iter; @@ -3940,6 +3942,7 @@ void LLVolumeGeometryManager::rebuildMesh(LLSpatialGroup* group) std::set mapped_buffers; + OctreeGuard guard(group->mOctreeNode); for (LLSpatialGroup::element_iter drawable_iter = group->getDataBegin(); drawable_iter != group->getDataEnd(); ++drawable_iter) { LLDrawable* drawablep = *drawable_iter; @@ -4012,6 +4015,7 @@ void LLVolumeGeometryManager::rebuildMesh(LLSpatialGroup* group) llwarns << "Not all mapped vertex buffers are unmapped!" << llendl ; warningsCount = 1; } + OctreeGuard guard(group->mOctreeNode); for (LLSpatialGroup::element_iter drawable_iter = group->getDataBegin(); drawable_iter != group->getDataEnd(); ++drawable_iter) { LLDrawable* drawablep = *drawable_iter; @@ -4484,6 +4488,7 @@ void LLGeometryManager::addGeometryCount(LLSpatialGroup* group, U32 &vertex_coun //for each drawable + OctreeGuard guard(group->mOctreeNode); for (LLSpatialGroup::element_iter drawable_iter = group->getDataBegin(); drawable_iter != group->getDataEnd(); ++drawable_iter) { LLDrawable* drawablep = *drawable_iter; diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index 12f7c170e..a7657a4ab 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -2820,6 +2820,7 @@ void LLPipeline::stateSort(LLCamera& camera, LLCullResult &result) else { group->setVisible(); + OctreeGuard guard(group->mOctreeNode); for (LLSpatialGroup::element_iter i = group->getDataBegin(); i != group->getDataEnd(); ++i) { markVisible(*i, camera); @@ -2908,6 +2909,7 @@ void LLPipeline::stateSort(LLSpatialGroup* group, LLCamera& camera) LLMemType mt(LLMemType::MTYPE_PIPELINE_STATE_SORT); if (!sSkipUpdate && group->changeLOD()) { + OctreeGuard guard(group->mOctreeNode); for (LLSpatialGroup::element_iter i = group->getDataBegin(); i != group->getDataEnd(); ++i) { LLDrawable* drawablep = *i; @@ -3044,6 +3046,7 @@ void forAllDrawables(LLCullResult::sg_iterator begin, { for (LLCullResult::sg_iterator i = begin; i != end; ++i) { + OctreeGuard guard((*i)->mOctreeNode); for (LLSpatialGroup::element_iter j = (*i)->getDataBegin(); j != (*i)->getDataEnd(); ++j) { func(*j); diff --git a/indra/newview/skins/default/xui/en-us/floater_post_process.xml b/indra/newview/skins/default/xui/en-us/floater_post_process.xml index 771f47b0a..234652667 100644 --- a/indra/newview/skins/default/xui/en-us/floater_post_process.xml +++ b/indra/newview/skins/default/xui/en-us/floater_post_process.xml @@ -165,6 +165,25 @@ max_val="20" min_val="1" mouse_opaque="true" name="posterize_layers" show_text="true" value="10" width="200" /> + + + + Motionblur Strength + + +