diff options
33 files changed, 426 insertions, 231 deletions
diff --git a/indra/llcommon/lllslconstants.h b/indra/llcommon/lllslconstants.h index 5c9017e43b..bd14e8ce04 100644 --- a/indra/llcommon/lllslconstants.h +++ b/indra/llcommon/lllslconstants.h @@ -136,4 +136,8 @@ const S32 LIST_STAT_SUM_SQUARES = 7; const S32 LIST_STAT_NUM_COUNT = 8; const S32 LIST_STAT_GEO_MEAN = 9; +const S32 STRING_TRIM_HEAD = 0x01; +const S32 STRING_TRIM_TAIL = 0x02; +const S32 STRING_TRIM = STRING_TRIM_HEAD | STRING_TRIM_TAIL; + #endif diff --git a/indra/llinventory/llinventory.h b/indra/llinventory/llinventory.h index 8a6fdfd0ad..e19604c9f0 100644 --- a/indra/llinventory/llinventory.h +++ b/indra/llinventory/llinventory.h @@ -364,6 +364,12 @@ struct SetItemOwnerAndGroup LLPermissions perm = item->getPermissions(); bool is_atomic = (LLAssetType::AT_OBJECT == item->getType()) ? false : true; perm.setOwnerAndGroup(mAuthorityID, mOwnerID, mGroupID, is_atomic); + // If no owner id is set, this is equivalent to a deed action. + // Clear 'share with group'. + if (mOwnerID.isNull()) + { + perm.setMaskGroup(PERM_NONE); + } item->setPermissions(perm); } }; diff --git a/indra/llinventory/llpermissions.cpp b/indra/llinventory/llpermissions.cpp index ac106eb09c..e55163f30d 100644 --- a/indra/llinventory/llpermissions.cpp +++ b/indra/llinventory/llpermissions.cpp @@ -264,6 +264,7 @@ BOOL LLPermissions::deedToGroup(const LLUUID& agent, const LLUUID& group) mOwner.setNull(); } mMaskBase = mMaskNextOwner; + mMaskGroup = PERM_NONE; mGroup = group; mIsGroupOwned = true; fixFairUse(); diff --git a/indra/llmessage/llcachename.cpp b/indra/llmessage/llcachename.cpp index 6841dda9a4..339fdda9ef 100644 --- a/indra/llmessage/llcachename.cpp +++ b/indra/llmessage/llcachename.cpp @@ -257,6 +257,40 @@ void LLCacheName::addObserver(LLCacheNameCallback callback) impl.mObservers.push_back(callback); } +void LLCacheName::removeObserver(LLCacheNameCallback callback) +{ + Observers::iterator it = impl.mObservers.begin(); + Observers::iterator end = impl.mObservers.end(); + + for ( ; it != end; ++it) + { + const LLCacheNameCallback& cb = (*it); + if (cb == callback) + { + impl.mObservers.erase(it); + return; + } + } +} + +void LLCacheName::cancelCallback(const LLUUID& id, LLCacheNameCallback callback, void* user_data) +{ + ReplyQueue::iterator it = impl.mReplyQueue.begin(); + ReplyQueue::iterator end = impl.mReplyQueue.end(); + + for(; it != end; ++it) + { + const PendingReply& reply = (*it); + + if ((callback == reply.mCallback) + && (id == reply.mID) + && (user_data == reply.mData) ) + { + impl.mReplyQueue.erase(it); + return; + } + } +} void LLCacheName::importFile(FILE* fp) { diff --git a/indra/llmessage/llcachename.h b/indra/llmessage/llcachename.h index ec9c467d8b..af49903c88 100644 --- a/indra/llmessage/llcachename.h +++ b/indra/llmessage/llcachename.h @@ -41,6 +41,8 @@ public: void addObserver(LLCacheNameCallback callback); void removeObserver(LLCacheNameCallback callback); + void cancelCallback(const LLUUID& id, LLCacheNameCallback callback, void* user_data = NULL); + // storing cache on disk; for viewer, in name.cache void importFile(FILE* fp); void exportFile(FILE* fp); diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp index 3b855a6360..0922de70af 100644 --- a/indra/llui/llfloater.cpp +++ b/indra/llui/llfloater.cpp @@ -489,6 +489,15 @@ void LLFloater::setVisible( BOOL visible ) void LLFloater::open() /* Flawfinder: ignore */ { + if (mSoundFlags != SILENT + // don't play open sound for hosted (tabbed) windows + && !getHost() + && !sHostp + && (!getVisible() || isMinimized())) + { + make_ui_sound("UISndWindowOpen"); + } + //RN: for now, we don't allow rehosting from one multifloater to another // just need to fix the bugs LLMultiFloater* hostp = getHost(); @@ -509,14 +518,6 @@ void LLFloater::open() /* Flawfinder: ignore */ setVisibleAndFrontmost(mAutoFocus); } - if (mSoundFlags != SILENT) - { - if (!getVisible() || isMinimized()) - { - make_ui_sound("UISndWindowOpen"); - } - } - onOpen(); } @@ -535,6 +536,7 @@ void LLFloater::close(bool app_quitting) if (mSoundFlags != SILENT && getVisible() + && !getHost() && !app_quitting) { make_ui_sound("UISndWindowClose"); @@ -2458,7 +2460,6 @@ void LLMultiFloater::open() /* Flawfinder: ignore */ if (mTabContainer->getTabCount() > 0) { LLFloater::open(); /* Flawfinder: ignore */ - resizeToContents(); } else { diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp index a7c9cf0f92..d46a866e2b 100644 --- a/indra/llui/llmenugl.cpp +++ b/indra/llui/llmenugl.cpp @@ -1647,7 +1647,8 @@ BOOL LLMenuItemBranchDownGL::handleAcceleratorKey(KEY key, MASK mask) BOOL LLMenuItemBranchDownGL::handleKeyHere(KEY key, MASK mask, BOOL called_from_parent) { BOOL menu_open = mBranch->getVisible(); - if (getHighlight() && getMenu()->getVisible()) + // don't do keyboard navigation of top-level menus unless in keyboard mode, or menu expanded + if (getHighlight() && getMenu()->getVisible() && (isActive() || LLMenuGL::getKeyboardMode())) { if (key == KEY_LEFT) { @@ -4144,9 +4145,9 @@ void LLMenuBarGL::checkMenuTrigger() BOOL LLMenuBarGL::jumpKeysActive() { - // require item to be highlighted to activate key triggers - // as menu bars are always visible - return getHighlightedItem() && LLMenuGL::jumpKeysActive(); + // require user to be in keyboard navigation mode to activate key triggers + // as menu bars are always visible and it is easy to leave the mouse cursor over them + return LLMenuGL::getKeyboardMode() && getHighlightedItem() && LLMenuGL::jumpKeysActive(); } // rearrange the child rects so they fit the shape of the menu bar. @@ -4404,6 +4405,7 @@ BOOL LLMenuHolderGL::hideMenus() BOOL menu_visible = hasVisibleMenu(); if (menu_visible) { + LLMenuGL::setKeyboardMode(FALSE); // clicked off of menu, hide them all for ( child_list_const_iter_t child_it = getChildList()->begin(); child_it != getChildList()->end(); ++child_it) { diff --git a/indra/llui/llscrollbar.cpp b/indra/llui/llscrollbar.cpp index 4a5ae1dadf..c21bbdcc75 100644 --- a/indra/llui/llscrollbar.cpp +++ b/indra/llui/llscrollbar.cpp @@ -386,21 +386,23 @@ BOOL LLScrollbar::handleScrollWheel(S32 x, S32 y, S32 clicks) BOOL LLScrollbar::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, EDragAndDropType cargo_type, void *carge_data, EAcceptance *accept, LLString &tooltip_msg) { - if (!drop) - { - //TODO: refactor this - S32 variable_lines = getDocPosMax(); - S32 pos = (VERTICAL == mOrientation) ? y : x; - S32 thumb_length = (VERTICAL == mOrientation) ? mThumbRect.getHeight() : mThumbRect.getWidth(); - S32 thumb_track_length = (VERTICAL == mOrientation) ? (mRect.getHeight() - 2 * SCROLLBAR_SIZE) : (mRect.getWidth() - 2 * SCROLLBAR_SIZE); - S32 usable_track_length = thumb_track_length - thumb_length; - F32 ratio = (VERTICAL == mOrientation) ? F32(pos - SCROLLBAR_SIZE - thumb_length) / usable_track_length - : F32(pos - SCROLLBAR_SIZE) / usable_track_length; - S32 new_pos = (VERTICAL == mOrientation) ? llclamp( S32(variable_lines - ratio * variable_lines + 0.5f), 0, variable_lines ) - : llclamp( S32(ratio * variable_lines + 0.5f), 0, variable_lines ); - changeLine( new_pos - mDocPos, TRUE ); - } - return TRUE; + // enable this to get drag and drop to control scrollbars + //if (!drop) + //{ + // //TODO: refactor this + // S32 variable_lines = getDocPosMax(); + // S32 pos = (VERTICAL == mOrientation) ? y : x; + // S32 thumb_length = (VERTICAL == mOrientation) ? mThumbRect.getHeight() : mThumbRect.getWidth(); + // S32 thumb_track_length = (VERTICAL == mOrientation) ? (mRect.getHeight() - 2 * SCROLLBAR_SIZE) : (mRect.getWidth() - 2 * SCROLLBAR_SIZE); + // S32 usable_track_length = thumb_track_length - thumb_length; + // F32 ratio = (VERTICAL == mOrientation) ? F32(pos - SCROLLBAR_SIZE - thumb_length) / usable_track_length + // : F32(pos - SCROLLBAR_SIZE) / usable_track_length; + // S32 new_pos = (VERTICAL == mOrientation) ? llclamp( S32(variable_lines - ratio * variable_lines + 0.5f), 0, variable_lines ) + // : llclamp( S32(ratio * variable_lines + 0.5f), 0, variable_lines ); + // changeLine( new_pos - mDocPos, TRUE ); + //} + //return TRUE; + return FALSE; } BOOL LLScrollbar::handleMouseUp(S32 x, S32 y, MASK mask) diff --git a/indra/lscript/lscript_compile/indra.l b/indra/lscript/lscript_compile/indra.l index 2ee219a8ee..e93cc6082d 100644 --- a/indra/lscript/lscript_compile/indra.l +++ b/indra/lscript/lscript_compile/indra.l @@ -4,7 +4,7 @@ L [a-zA-Z_] H [a-fA-F0-9] E [Ee][+-]?{D}+ FS (f|F) -%e 8000 +%e 9000 %n 4000 %p 5000 @@ -559,6 +559,10 @@ extern "C" { int yyerror(const char *fmt, ...); } "PARCEL_DETAILS_GROUP" { count(); yylval.ival = PARCEL_DETAILS_GROUP; return(INTEGER_CONSTANT); } "PARCEL_DETAILS_AREA" { count(); yylval.ival = PARCEL_DETAILS_AREA; return(INTEGER_CONSTANT); } +"STRING_TRIM_HEAD" { count(); yylval.ival = STRING_TRIM_HEAD; return(INTEGER_CONSTANT); } +"STRING_TRIM_TAIL" { count(); yylval.ival = STRING_TRIM_TAIL; return(INTEGER_CONSTANT); } +"STRING_TRIM" { count(); yylval.ival = STRING_TRIM; return(INTEGER_CONSTANT); } + {L}({L}|{N})* { count(); yylval.sval = new char[strlen(yytext) + 1]; strcpy(yylval.sval, yytext); return(IDENTIFIER); } {D}+{E} { count(); yylval.fval = (F32)atof(yytext); return(FP_CONSTANT); } diff --git a/indra/lscript/lscript_library/lscript_library.cpp b/indra/lscript/lscript_library/lscript_library.cpp index 0a2e896aea..5e87928ae6 100644 --- a/indra/lscript/lscript_library/lscript_library.cpp +++ b/indra/lscript/lscript_library/lscript_library.cpp @@ -403,6 +403,8 @@ void LLScriptLibrary::init() addFunction(new LLScriptLibraryFunction(10.f, 0.2f, dummy_func, "llSetLinkTexture", NULL, "isi", "llSetLinkTexture(integer link_pos, string texture, integer face)\nSets the texture of face for link_pos")); + addFunction(new LLScriptLibraryFunction(10.f, 0.f, dummy_func, "llStringTrim", "s", "si", "string llStringTrim(string src, integer trim_type)\nTrim leading and/or trailing spaces from a string.\nUses trim_type of STRING_TRIM, STRING_TRIM_HEAD or STRING_TRIM_TAIL.")); + // energy, sleep, dummy_func, name, return type, parameters, help text, gods-only // IF YOU ADD NEW SCRIPT CALLS, YOU MUST PUT THEM AT THE END OF THIS LIST. diff --git a/indra/newview/app_settings/keywords.ini b/indra/newview/app_settings/keywords.ini index 0545c38959..bf49c2c5d5 100644 --- a/indra/newview/app_settings/keywords.ini +++ b/indra/newview/app_settings/keywords.ini @@ -468,6 +468,10 @@ PARCEL_DETAILS_OWNER Used with llGetParcelDetails to get the parcel owner id. PARCEL_DETAILS_GROUP Used with llGetParcelDetails to get the parcel group id. PARCEL_DETAILS_AREA Used with llGetParcelDetails to get the parcel area in square meters. +STRING_TRIM_HEAD Used with llStringTrim to trim leading spaces from a string. +STRING_TRIM_TAIL Used with llStringTrim to trim trailing spaces from a string. +STRING_TRIM Used with llStringTrim to trim both leading and trailing spaces from a string. + # string constants [word .1, .3, .5] NULL_KEY Indicates an empty key diff --git a/indra/newview/app_settings/viewerart.xml b/indra/newview/app_settings/viewerart.xml index 1ae2010002..d56efeae09 100644 --- a/indra/newview/app_settings/viewerart.xml +++ b/indra/newview/app_settings/viewerart.xml @@ -113,4 +113,4 @@ <avatar_yes_happy.bvh value="b8c8b2a3-9008-1771-3bfc-90924955ab2d"/> <avatar_yes_head.bvh value="15dd911d-be82-2856-26db-27659b142875"/> <avatar_yoga_float.bvh value="42ecd00b-9947-a97c-400a-bbc9174c7aeb"/> -</settings> +</settings>
\ No newline at end of file diff --git a/indra/newview/linux_tools/client-readme.txt b/indra/newview/linux_tools/client-readme.txt index 42d7eff0dd..7c972bb8d1 100644 --- a/indra/newview/linux_tools/client-readme.txt +++ b/indra/newview/linux_tools/client-readme.txt @@ -71,27 +71,31 @@ you wish. 4. KNOWN ISSUES -=-=-=-=-=-=-=- -The following user-visible features are currently not fully implemented on -the Linux client and are therefore known not to work properly: +These are the most commonly-encountered known issues which are specific to +the Alpha release of the Linux client. + +* VISUAL EFFECTS AND PERFORMANCE - many Linux graphics drivers are not as + robust as their counterparts for other operating systems, so some advanced + Second Life graphical features have been DISABLED by default to aid + stability. See PROBLEM 3 in the TROUBLESHOOTING section if you wish to + turn these on to possibly enhance your experience. + +* MISC - The following user-visible features are not currently fully + implemented on the Linux client and are therefore known not to work properly + at this time: * QuickTime movie playback and movie recording * Video memory detection * Full Unicode font rendering * Auto-updater +* UPLOAD / SAVE / COLOR-PICKER DIALOGS - These only appear when the client + is in 'windowed' mode, not 'fullscreen' mode. + * UPDATING - when the client detects that a new version of Second Life is available, it will ask you if you wish to download the new version. This option is not implemented; to upgrade, you should manually download a new version from the Second Life web site, <http://www.secondlife.com/>. -* UPLOAD / SAVE / COLOR-PICKER DIALOGS - These only function when the client - is in 'windowed' mode, not 'fullscreen' mode. - -* GRAPHICAL SPEED/QUALITY - as many Linux graphics drivers are not as robust - as their counterparts for some other operating systems, advanced Second Life - graphical features have been disabled to aid stability. See PROBLEM 3 in the - TROUBLESHOOTING section if you wish to turn these on to enhance your - experience. - 5. TROUBLESHOOTING -=-=-=-=-=-=-=-=-= @@ -130,8 +134,8 @@ SOLUTION:- As a last resort, you can disable most of Second Life's advanced from the line which reads '#export LL_GL_NOEXT=x' PROBLEM 3:- Performance or graphical quality are not as high as I expect. +PROBLEM:- 'SHINY' doesn't work. PROBLEM:- I can't turn on Anisotropic Filtering, Ripple Water, or AGP. -PROBLEM:- 'Shiny' doesn't work. SOLUTION:- Some graphics performance features in Second Life are disabled by default for the Linux version due to stability issues with some common Linux graphic drivers. You can re-enable these features at the slight diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index 07daf89f1c..c0ad9ffb03 100644 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -4649,14 +4649,26 @@ void LLAgent::requestStopMotion( LLMotion* motion ) // Notify all avatars that a motion has stopped. // This is needed to clear the animation state bits LLUUID anim_state = motion->getID(); + onAnimStop(motion->getID()); // if motion is not looping, it could have stopped by running out of time // so we need to tell the server this // llinfos << "Sending stop for motion " << motion->getName() << llendl; sendAnimationRequest( anim_state, ANIM_REQUEST_STOP ); +} +void LLAgent::onAnimStop(const LLUUID& id) +{ // handle automatic state transitions (based on completion of animation playback) - if (anim_state == ANIM_AGENT_STANDUP) + if (id == ANIM_AGENT_STAND) + { + stopFidget(); + } + else if (id == ANIM_AGENT_AWAY) + { + clearAFK(); + } + else if (id == ANIM_AGENT_STANDUP) { // send stand up command setControlFlags(AGENT_CONTROL_FINISH_ANIM); @@ -4665,7 +4677,7 @@ void LLAgent::requestStopMotion( LLMotion* motion ) if (mAvatarObject.notNull() && !mAvatarObject->mBelowWater && rand() % 3 == 0) sendAnimationRequest( ANIM_AGENT_BRUSH, ANIM_REQUEST_START ); } - else if (anim_state == ANIM_AGENT_PRE_JUMP || anim_state == ANIM_AGENT_LAND || anim_state == ANIM_AGENT_MEDIUM_LAND) + else if (id == ANIM_AGENT_PRE_JUMP || id == ANIM_AGENT_LAND || id == ANIM_AGENT_MEDIUM_LAND) { setControlFlags(AGENT_CONTROL_FINISH_ANIM); } diff --git a/indra/newview/llagent.h b/indra/newview/llagent.h index a8e4d2f0b4..b86dc03807 100644 --- a/indra/newview/llagent.h +++ b/indra/newview/llagent.h @@ -331,6 +331,7 @@ public: // Animation functions void requestStopMotion( LLMotion* motion ); + void onAnimStop(const LLUUID& id); void sendAnimationRequests(LLDynamicArray<LLUUID> &anim_ids, EAnimRequest request); void sendAnimationRequest(const LLUUID &anim_id, EAnimRequest request); diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp index bb76957da1..6c00874982 100644 --- a/indra/newview/llface.cpp +++ b/indra/newview/llface.cpp @@ -944,19 +944,26 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume, { LLVOVolume* vobj = (LLVOVolume*) (LLViewerObject*) mVObjp; U8 mode = vobj->mTexAnimMode; - if (mode & LLViewerTextureAnim::TRANSLATE) + if (!mode) { - os = ot = 0.f; + clearState(TEXTURE_ANIM); } - if (mode & LLViewerTextureAnim::ROTATE) - { - r = 0.f; - cos_ang = 1.f; - sin_ang = 0.f; - } - if (mode & LLViewerTextureAnim::SCALE) + else { - ms = mt = 1.f; + if (mode & LLViewerTextureAnim::TRANSLATE) + { + os = ot = 0.f; + } + if (mode & LLViewerTextureAnim::ROTATE) + { + r = 0.f; + cos_ang = 1.f; + sin_ang = 0.f; + } + if (mode & LLViewerTextureAnim::SCALE) + { + ms = mt = 1.f; + } } } diff --git a/indra/newview/llfloatertos.cpp b/indra/newview/llfloatertos.cpp index c178d0d416..f7bf4de34f 100644 --- a/indra/newview/llfloatertos.cpp +++ b/indra/newview/llfloatertos.cpp @@ -106,9 +106,9 @@ BOOL LLFloaterTOS::postBuild() childSetAction("Cancel", onCancel, this); childSetCommitCallback("tos_agreement", updateAgree, this); - // this displays the critical message if ( mType != TOS_TOS ) { + // this displays the critical message LLTextEditor *Editor = LLUICtrlFactory::getTextEditorByName(this, "tos_text"); if (Editor) { @@ -118,25 +118,11 @@ BOOL LLFloaterTOS::postBuild() Editor->setWordWrap(TRUE); Editor->setFocus(TRUE); } - childSetValue("tos_text", LLSD(mMessage)); - }; - - // this displays the critical message - if ( mType != TOS_TOS ) - { - LLTextEditor *Editor = LLUICtrlFactory::getTextEditorByName(this, "tos_text"); - if (Editor) - { - Editor->setHandleEditKeysDirectly( TRUE ); - Editor->setEnabled( FALSE ); - Editor->setReadOnlyFgColor(LLColor4::white); - Editor->setWordWrap(TRUE); - Editor->setFocus(TRUE); - } - childSetValue("tos_text", LLSD(mMessage)); - }; + childSetValue("tos_text", LLSD(mMessage)); + return TRUE; + } - #if LL_LIBXUL_ENABLED +#if LL_LIBXUL_ENABLED // disable Agree to TOS radio button until the page has fully loaded LLRadioGroup* tos_agreement = LLUICtrlFactory::getRadioGroupByName(this, "tos_agreement"); if ( tos_agreement ) @@ -163,7 +149,18 @@ BOOL LLFloaterTOS::postBuild() gResponsePtr = LLIamHere::build( this ); LLHTTPClient::get( childGetValue( "real_url" ).asString(), gResponsePtr ); }; - #endif +#else + LLTextEditor *Editor = LLUICtrlFactory::getTextEditorByName(this, "tos_text"); + if (Editor) + { + Editor->setHandleEditKeysDirectly( TRUE ); + Editor->setEnabled( FALSE ); + Editor->setReadOnlyFgColor(LLColor4::white); + Editor->setWordWrap(TRUE); + Editor->setFocus(TRUE); + } + childSetValue("tos_text", LLSD(mMessage)); +#endif return TRUE; } diff --git a/indra/newview/llfloaterworldmap.cpp b/indra/newview/llfloaterworldmap.cpp index a39c2be6bf..d8ed27173d 100644 --- a/indra/newview/llfloaterworldmap.cpp +++ b/indra/newview/llfloaterworldmap.cpp @@ -439,6 +439,14 @@ void LLFloaterWorldMap::draw() return; } + // On orientation island, users don't have a home location yet, so don't + // let them teleport "home". It dumps them in an often-crowed welcome + // area (infohub) and they get confused. JC + LLViewerRegion* regionp = gAgent.getRegion(); + bool agent_on_prelude = (regionp && regionp->isPrelude()); + bool enable_go_home = gAgent.isGodlike() || !agent_on_prelude; + childSetEnabled("Go Home", enable_go_home); + updateLocation(); LLTracker::ETrackingStatus tracking_status = LLTracker::getTrackingStatus(); diff --git a/indra/newview/llfloaterworldmap.h b/indra/newview/llfloaterworldmap.h index 32112a995f..5867ea179c 100644 --- a/indra/newview/llfloaterworldmap.h +++ b/indra/newview/llfloaterworldmap.h @@ -37,18 +37,18 @@ public: static void *createWorldMapView(void* data); BOOL postBuild(); - virtual void onClose(bool app_quitting); + /*virtual*/ void onClose(bool app_quitting); static void show(void*, BOOL center_on_target ); static void reloadIcons(void*); static void toggle(void*); static void hide(void*); - virtual void reshape( S32 width, S32 height, BOOL called_from_parent = TRUE ); - virtual BOOL handleHover(S32 x, S32 y, MASK mask); - virtual BOOL handleScrollWheel(S32 x, S32 y, S32 clicks); - virtual void setVisible(BOOL visible); - virtual void draw(); + /*virtual*/ void reshape( S32 width, S32 height, BOOL called_from_parent = TRUE ); + /*virtual*/ BOOL handleHover(S32 x, S32 y, MASK mask); + /*virtual*/ BOOL handleScrollWheel(S32 x, S32 y, S32 clicks); + /*virtual*/ void setVisible(BOOL visible); + /*virtual*/ void draw(); // methods for dealing with inventory. The observe() method is // called during program startup. inventoryUpdated() will be diff --git a/indra/newview/llfolderview.cpp b/indra/newview/llfolderview.cpp index 0dc7daa587..5f37d756fe 100644 --- a/indra/newview/llfolderview.cpp +++ b/indra/newview/llfolderview.cpp @@ -4449,14 +4449,15 @@ std::string::size_type LLInventoryFilter::getStringMatchOffset() const return mSubStringMatchOffset; } +// has user modified default filter params? BOOL LLInventoryFilter::isActive() { - return mFilterOps.mFilterTypes != 0xffffffff + return mFilterOps.mFilterTypes != mDefaultFilterOps.mFilterTypes || mFilterSubString.size() - || mFilterOps.mPermissions != PERM_NONE - || mFilterOps.mMinDate != 0 - || mFilterOps.mMaxDate != U32_MAX - || mFilterOps.mHoursAgo != 0; + || mFilterOps.mPermissions != mDefaultFilterOps.mPermissions + || mFilterOps.mMinDate != mDefaultFilterOps.mMinDate + || mFilterOps.mMaxDate != mDefaultFilterOps.mMaxDate + || mFilterOps.mHoursAgo != mDefaultFilterOps.mHoursAgo; } BOOL LLInventoryFilter::isModified() diff --git a/indra/newview/llfolderview.h b/indra/newview/llfolderview.h index 575d05cd0a..84dcddedbb 100644 --- a/indra/newview/llfolderview.h +++ b/indra/newview/llfolderview.h @@ -798,7 +798,6 @@ public: static void idle(void* user_data); - void setAutoSelectOverride(bool override) { mAutoSelectOverride = override; } BOOL needsAutoSelect() { return mNeedsAutoSelect && !mAutoSelectOverride; } BOOL getDebugFilters() { return mDebugFilters; } diff --git a/indra/newview/llpreviewnotecard.cpp b/indra/newview/llpreviewnotecard.cpp index 154ce5b07c..be6ef4caf4 100644 --- a/indra/newview/llpreviewnotecard.cpp +++ b/indra/newview/llpreviewnotecard.cpp @@ -128,6 +128,7 @@ BOOL LLPreviewNotecard::postBuild() if (ed) { ed->setNotecardInfo(mNotecardItemID, mObjectID); + ed->makePristine(); } return TRUE; } diff --git a/indra/newview/llpreviewscript.cpp b/indra/newview/llpreviewscript.cpp index a7d29a6591..eb86934a54 100644 --- a/indra/newview/llpreviewscript.cpp +++ b/indra/newview/llpreviewscript.cpp @@ -169,6 +169,18 @@ LLFloaterScriptSearch::LLFloaterScriptSearch(std::string title, LLRect rect, LLS sInstance = this; childSetFocus("search_text", TRUE); + + // find floater in which script panel is embedded + LLView* viewp = (LLView*)editor_core; + while(viewp) + { + if (viewp->getWidgetType() == WIDGET_TYPE_FLOATER) + { + ((LLFloater*)viewp)->addDependentFloater(this); + break; + } + viewp = viewp->getParent(); + } } //static diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp index 62903011cf..38c4f72fc9 100644 --- a/indra/newview/llspatialpartition.cpp +++ b/indra/newview/llspatialpartition.cpp @@ -2312,6 +2312,14 @@ S32 LLSpatialPartition::getLights(const LLVector3& pos, F32 rad, LLDrawable::dra return getDrawables(pos, rad, results, TRUE); } +void pushVerts(LLDrawInfo* params, U32 mask) +{ + params->mVertexBuffer->setBuffer(mask); + U32* indicesp = (U32*) params->mVertexBuffer->getIndicesPointer(); + glDrawRangeElements(params->mParticle ? GL_POINTS : GL_TRIANGLES, params->mStart, params->mEnd, params->mCount, + GL_UNSIGNED_INT, indicesp+params->mOffset); +} + void pushVerts(LLSpatialGroup* group, U32 mask) { LLDrawInfo* params = NULL; @@ -2321,10 +2329,7 @@ void pushVerts(LLSpatialGroup* group, U32 mask) for (std::vector<LLDrawInfo*>::iterator j = i->second.begin(); j != i->second.end(); ++j) { params = *j; - params->mVertexBuffer->setBuffer(mask); - U32* indicesp = (U32*) params->mVertexBuffer->getIndicesPointer(); - glDrawRangeElements(params->mParticle ? GL_POINTS : GL_TRIANGLES, params->mStart, params->mEnd, params->mCount, - GL_UNSIGNED_INT, indicesp+params->mOffset); + pushVerts(params, mask); } } } @@ -2617,6 +2622,18 @@ void renderPoints(LLDrawable* drawablep) glEnd(); } +void renderTextureAnim(LLDrawInfo* params) +{ + if (!params->mTextureMatrix) + { + return; + } + + LLGLEnable blend(GL_BLEND); + glColor4f(1,1,0,0.5f); + pushVerts(params, LLVertexBuffer::MAP_VERTEX); +} + class LLOctreeRenderNonOccluded : public LLOctreeTraveler<LLDrawable> { public: @@ -2685,6 +2702,19 @@ public: renderPoints(drawable); } } + + for (LLSpatialGroup::draw_map_t::iterator i = group->mDrawMap.begin(); i != group->mDrawMap.end(); ++i) + { + std::vector<LLDrawInfo*>& draw_vec = i->second; + for (std::vector<LLDrawInfo*>::iterator j = draw_vec.begin(); j != draw_vec.end(); ++j) + { + LLDrawInfo* draw_info = *j; + if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_TEXTURE_ANIM)) + { + renderTextureAnim(draw_info); + } + } + } } }; @@ -2694,7 +2724,8 @@ void LLSpatialPartition::renderDebug() LLPipeline::RENDER_DEBUG_OCCLUSION | LLPipeline::RENDER_DEBUG_BBOXES | LLPipeline::RENDER_DEBUG_POINTS | - LLPipeline::RENDER_DEBUG_TEXTURE_PRIORITY)) + LLPipeline::RENDER_DEBUG_TEXTURE_PRIORITY | + LLPipeline::RENDER_DEBUG_TEXTURE_ANIM)) { return; } diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp index 794281965e..39feb40109 100644 --- a/indra/newview/lltexturectrl.cpp +++ b/indra/newview/lltexturectrl.cpp @@ -95,6 +95,7 @@ public: EAcceptance *accept, LLString& tooltip_msg); virtual void draw(); + virtual BOOL handleKeyHere(KEY key, MASK mask, BOOL called_from_parent); // LLFloater overrides virtual void onClose(bool app_quitting); @@ -156,6 +157,7 @@ protected: BOOL mCanApplyImmediately; BOOL mNoCopyTextureSelected; F32 mContextConeOpacity; + LLSaveFolderState mSavedFolderState; }; LLFloaterTexturePicker::LLFloaterTexturePicker( @@ -210,13 +212,16 @@ LLFloaterTexturePicker::LLFloaterTexturePicker( filter_types |= 0x1 << LLInventoryType::IT_TEXTURE; filter_types |= 0x1 << LLInventoryType::IT_SNAPSHOT; - mInventoryPanel->setAutoSelectOverride(true); mInventoryPanel->setFilterTypes(filter_types); //mInventoryPanel->setFilterPermMask(getFilterPermMask()); //Commented out due to no-copy texture loss. mInventoryPanel->setFilterPermMask(immediate_filter_perm_mask); mInventoryPanel->setSelectCallback(onSelectionChange, this); mInventoryPanel->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS); mInventoryPanel->setAllowMultiSelect(FALSE); + + // store this filter as the default one + mInventoryPanel->getRootFolder()->getFilter()->markDefault(); + // Commented out to stop opening all folders with textures // mInventoryPanel->openDefaultFolderForType(LLAssetType::AT_TEXTURE); @@ -244,6 +249,8 @@ LLFloaterTexturePicker::LLFloaterTexturePicker( updateFilterPermMask(); setCanMinimize(FALSE); + + mSavedFolderState.setApply(FALSE); } LLFloaterTexturePicker::~LLFloaterTexturePicker() @@ -379,6 +386,41 @@ BOOL LLFloaterTexturePicker::handleDragAndDrop( return handled; } +BOOL LLFloaterTexturePicker::handleKeyHere(KEY key, MASK mask, BOOL called_from_parent) +{ + LLFolderView* root_folder = mInventoryPanel->getRootFolder(); + + if (!called_from_parent && root_folder && + mSearchEdit && mSearchEdit->hasFocus() && + (key == KEY_RETURN || key == KEY_DOWN) && mask == MASK_NONE) + { + if (!root_folder->getCurSelectedItem()) + { + LLFolderViewItem* itemp = root_folder->getItemByID(gAgent.getInventoryRootID()); + if (itemp) + { + root_folder->setSelection(itemp, FALSE, FALSE); + } + } + root_folder->scrollToShowSelection(); + + // move focus to inventory proper + root_folder->setFocus(TRUE); + + // treat this as a user selection of the first filtered result + commitIfImmediateSet(); + + return TRUE; + } + + if (root_folder->hasFocus() && key == KEY_UP) + { + mSearchEdit->focusFirstItem(TRUE); + } + + return LLFloater::handleKeyHere(key, mask, called_from_parent); +} + // virtual void LLFloaterTexturePicker::onClose(bool app_quitting) { @@ -738,53 +780,36 @@ void LLFloaterTexturePicker::onSearchEdit(const LLString& search_string, void* u { LLFloaterTexturePicker* picker = (LLFloaterTexturePicker*)user_data; - std::string filter_text = search_string; - - if (filter_text.empty()&& picker->mInventoryPanel->getFilterSubString().empty()) - { - // current filter and new filter empty, do nothing - return; - } - std::string upper_case_search_string = filter_text; + std::string upper_case_search_string = search_string; LLString::toUpper(upper_case_search_string); - picker->mInventoryPanel->setFilterSubString(upper_case_search_string); - - LLFolderView* root_folder = picker->mInventoryPanel->getRootFolder(); - - //if (search_string.size()) - //{ - // LLSelectFirstFilteredItem filter; - // root_folder->applyFunctorRecursively(filter); - // //...and scroll to show it - // root_folder->scrollToShowSelection(); - //} - - KEY key = gKeyboard->currentKey(); - - if ((key == KEY_RETURN || key == KEY_DOWN) && gKeyboard->currentMask(FALSE) == MASK_NONE) + if (upper_case_search_string.empty()) { - if (search_string.size()) + if (picker->mInventoryPanel->getFilterSubString().empty()) { - LLSelectFirstFilteredItem filter; - root_folder->applyFunctorRecursively(filter); - //...and scroll to show it - root_folder->scrollToShowSelection(); + // current filter and new filter empty, do nothing + return; } - if (!root_folder->getCurSelectedItem()) + picker->mSavedFolderState.setApply(TRUE); + picker->mInventoryPanel->getRootFolder()->applyFunctorRecursively(picker->mSavedFolderState); + // add folder with current item to list of previously opened folders + LLOpenFoldersWithSelection opener; + picker->mInventoryPanel->getRootFolder()->applyFunctorRecursively(opener); + picker->mInventoryPanel->getRootFolder()->scrollToShowSelection(); + + } + else if (picker->mInventoryPanel->getFilterSubString().empty()) + { + // first letter in search term, save existing folder open state + if (!picker->mInventoryPanel->getRootFolder()->isFilterActive()) { - LLFolderViewItem* itemp = root_folder->getItemByID(gAgent.getInventoryRootID()); - if (itemp) - { - root_folder->setSelection(itemp, FALSE, FALSE); - } + picker->mSavedFolderState.setApply(FALSE); + picker->mInventoryPanel->getRootFolder()->applyFunctorRecursively(picker->mSavedFolderState); } - - // move focus to inventory proper - root_folder->setFocus(TRUE); - root_folder->scrollToShowSelection(); } + + picker->mInventoryPanel->setFilterSubString(upper_case_search_string); } //static diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index a638d99381..0cce868b4a 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -1131,6 +1131,9 @@ void init_debug_rendering_menu(LLMenuGL* menu) sub_menu->append(new LLMenuItemCheckGL("Occlusion", &LLPipeline::toggleRenderDebug, NULL, &LLPipeline::toggleRenderDebugControl, (void*)LLPipeline::RENDER_DEBUG_OCCLUSION)); + sub_menu->append(new LLMenuItemCheckGL("Animated Textures", &LLPipeline::toggleRenderDebug, NULL, + &LLPipeline::toggleRenderDebugControl, + (void*)LLPipeline::RENDER_DEBUG_TEXTURE_ANIM)); sub_menu->append(new LLMenuItemCheckGL("Texture Priority", &LLPipeline::toggleRenderDebug, NULL, &LLPipeline::toggleRenderDebugControl, (void*)LLPipeline::RENDER_DEBUG_TEXTURE_PRIORITY)); @@ -7787,6 +7790,18 @@ class LLWorldEnableSetHomeLocation : public view_listener_t } }; +class LLWorldEnableTeleportHome : public view_listener_t +{ + bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) + { + LLViewerRegion* regionp = gAgent.getRegion(); + bool agent_on_prelude = (regionp && regionp->isPrelude()); + bool enable_teleport_home = gAgent.isGodlike() || !agent_on_prelude; + gMenuHolder->findControl(userdata["control"].asString())->setValue(enable_teleport_home); + return true; + } +}; + BOOL enable_region_owner(void*) { if(gAgent.getRegion() && gAgent.getRegion()->getOwner() == gAgent.getID()) @@ -8603,6 +8618,7 @@ void initialize_menu_actions() (new LLWorldEnableCreateLandmark())->registerListener(gMenuHolder, "World.EnableCreateLandmark"); (new LLWorldEnableSetHomeLocation())->registerListener(gMenuHolder, "World.EnableSetHomeLocation"); + (new LLWorldEnableTeleportHome())->registerListener(gMenuHolder, "World.EnableTeleportHome"); (new LLWorldEnableBuyLand())->registerListener(gMenuHolder, "World.EnableBuyLand"); (new LLWorldCheckAlwaysRun())->registerListener(gMenuHolder, "World.CheckAlwaysRun"); diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 6d4170e437..ed13f6dbe9 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -1978,6 +1978,7 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data) is_linden = gMuteListp->isLinden(from_name); } + BOOL is_audible = (CHAT_AUDIBLE_FULLY == chat.mAudible); chatter = gObjectList.findObject(from_id); if (chatter) { @@ -1997,7 +1998,8 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data) } // only pay attention to other people chatting - if ((is_linden || (!is_muted && !is_busy)) + if (is_audible + && (is_linden || (!is_muted && !is_busy)) && chatter != gAgent.getAvatarObject()) { gAgent.heardChat(chat); @@ -2010,7 +2012,6 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data) is_owned_by_me = chatter->permYouOwner(); } - BOOL is_audible = (CHAT_AUDIBLE_FULLY == chat.mAudible); if (is_audible) { BOOL visible_in_chat_bubble = FALSE; diff --git a/indra/newview/llviewerobjectlist.cpp b/indra/newview/llviewerobjectlist.cpp index 68193604bb..b80aabab34 100644 --- a/indra/newview/llviewerobjectlist.cpp +++ b/indra/newview/llviewerobjectlist.cpp @@ -1217,7 +1217,7 @@ LLViewerObject *LLViewerObjectList::createObjectViewer(const LLPCode pcode, LLVi LLViewerObject *objectp = LLViewerObject::createObject(fullid, pcode, regionp); if (!objectp) { - llwarns << "Couldn't create object of type " << LLPrimitive::pCodeToString(pcode) << llendl; +// llwarns << "Couldn't create object of type " << LLPrimitive::pCodeToString(pcode) << llendl; return NULL; } @@ -1251,7 +1251,7 @@ LLViewerObject *LLViewerObjectList::createObject(const LLPCode pcode, LLViewerRe LLViewerObject *objectp = LLViewerObject::createObject(fullid, pcode, regionp); if (!objectp) { - llwarns << "Couldn't create object of type " << LLPrimitive::pCodeToString(pcode) << " id:" << fullid << llendl; +// llwarns << "Couldn't create object of type " << LLPrimitive::pCodeToString(pcode) << " id:" << fullid << llendl; return NULL; } diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 36c08321ed..a2dadcc438 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -2172,7 +2172,9 @@ BOOL LLViewerWindow::handleKey(KEY key, MASK mask) } // don't pass keys on to world when something in ui has focus - return gFocusMgr.childHasKeyboardFocus(mRootView) || (gMenuBarView && gMenuBarView->getHighlightedItem()); + return gFocusMgr.childHasKeyboardFocus(mRootView) + || LLMenuGL::getKeyboardMode() + || (gMenuBarView && gMenuBarView->getHighlightedItem() && gMenuBarView->getHighlightedItem()->isActive()); } diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index afeffa0aec..f9ee5064a1 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -2014,7 +2014,7 @@ void LLVOAvatar::buildCharacter() continue; } LLMenuItemCallGL* item = new LLMenuItemCallGL(attachment->getName(), - NULL, &object_selected_and_point_valid, &attach_label, NULL); + NULL, &object_selected_and_point_valid, &attach_label, attachment); item->addListener(gMenuHolder->getListenerByName("Object.AttachToAvatar"), "on_click", mAttachmentPoints.reverseLookup(attachment)); gAttachSubMenu->append(item); @@ -4508,14 +4508,7 @@ BOOL LLVOAvatar::stopMotion(const LLUUID& id, BOOL stop_immediate) { if (mIsSelf) { - if (id == ANIM_AGENT_STAND) - { - LLAgent::stopFidget(); - } - else if (id == ANIM_AGENT_AWAY) - { - gAgent.clearAFK(); - } + gAgent.onAnimStop(id); } if (id == ANIM_AGENT_WALK) diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index d08c5311d7..6619531953 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -59,6 +59,7 @@ LLVOVolume::LLVOVolume(const LLUUID &id, const LLPCode pcode, LLViewerRegion *re : LLViewerObject(id, pcode, regionp), mVolumeImpl(NULL) { + mTexAnimMode = 0; mRelativeXform.identity(); mRelativeXformInvTrans.identity(); @@ -118,8 +119,8 @@ U32 LLVOVolume::processUpdateMessage(LLMessageSystem *mesgsys, mTextureAnimp->reset(); } } + mTexAnimMode = 0; mTextureAnimp->unpackTAMessage(mesgsys, block_num); - gPipeline.markTextured(mDrawable); } else { @@ -129,6 +130,7 @@ U32 LLVOVolume::processUpdateMessage(LLMessageSystem *mesgsys, mTextureAnimp = NULL; gPipeline.markTextured(mDrawable); mFaceMappingChanged = TRUE; + mTexAnimMode = 0; } } @@ -201,12 +203,16 @@ U32 LLVOVolume::processUpdateMessage(LLMessageSystem *mesgsys, mTextureAnimp->reset(); } } + mTexAnimMode = 0; mTextureAnimp->unpackTAMessage(*dp); } - else + else if (mTextureAnimp) { delete mTextureAnimp; mTextureAnimp = NULL; + gPipeline.markTextured(mDrawable); + mFaceMappingChanged = TRUE; + mTexAnimMode = 0; } } else @@ -229,94 +235,105 @@ U32 LLVOVolume::processUpdateMessage(LLMessageSystem *mesgsys, } -BOOL LLVOVolume::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time) +void LLVOVolume::animateTextures() { - LLViewerObject::idleUpdate(agent, world, time); - - /////////////////////// - // - // Do texture animation stuff - // - - if (mTextureAnimp && gAnimateTextures) + F32 off_s = 0.f, off_t = 0.f, scale_s = 1.f, scale_t = 1.f, rot = 0.f; + S32 result; + + if (result = mTextureAnimp->animateTextures(off_s, off_t, scale_s, scale_t, rot)) { - F32 off_s = 0.f, off_t = 0.f, scale_s = 1.f, scale_t = 1.f, rot = 0.f; - S32 result; - if (result = mTextureAnimp->animateTextures(off_s, off_t, scale_s, scale_t, rot)) + if (!mTexAnimMode) { - mTexAnimMode = mTextureAnimp->mMode | result; - - S32 start, end; - if (mTextureAnimp->mFace == -1) - { - start = 0; - end = mDrawable->getNumFaces(); - } - else + mFaceMappingChanged = TRUE; + gPipeline.markTextured(mDrawable); + } + mTexAnimMode = result | mTextureAnimp->mMode; + + S32 start=0, end=mDrawable->getNumFaces()-1; + if (mTextureAnimp->mFace >= 0 && mTextureAnimp->mFace <= end) + { + start = end = mTextureAnimp->mFace; + } + + for (S32 i = start; i <= end; i++) + { + LLQuaternion quat; + LLVector3 scale(1,1,1); + + LLFace* facep = mDrawable->getFace(i); + const LLTextureEntry* te = facep->getTextureEntry(); + LLMatrix4& tex_mat = facep->mTextureMatrix; + + if (!te) { - start = mTextureAnimp->mFace; - end = start + 1; + continue; } - - for (S32 i = start; i < end; i++) + if (result & LLViewerTextureAnim::ROTATE) { - LLQuaternion quat; - LLVector3 scale(1,1,1); - - LLFace* facep = mDrawable->getFace(i); - const LLTextureEntry* te = facep->getTextureEntry(); - LLMatrix4& tex_mat = facep->mTextureMatrix; - - if (!te) + F32 axis = -1; + F32 s,t; + te->getScale(&s,&t); + if (s < 0) { - continue; + axis = -axis; } - if (result & LLViewerTextureAnim::ROTATE) + if (t < 0) { - F32 axis = -1; - F32 s,t; - te->getScale(&s,&t); - if (s < 0) - { - axis = -axis; - } - if (t < 0) - { - axis = -axis; - } - quat.setQuat(rot, 0, 0, axis); + axis = -axis; } - - if (!(result & LLViewerTextureAnim::TRANSLATE)) - { - te->getOffset(&off_s,&off_t); - } + quat.setQuat(rot, 0, 0, axis); + } + + if (!(result & LLViewerTextureAnim::TRANSLATE)) + { + te->getOffset(&off_s,&off_t); + } - LLVector3 trans(off_s+0.5f, off_t+0.5f, 0.f); + LLVector3 trans(off_s+0.5f, off_t+0.5f, 0.f); - tex_mat.identity(); - tex_mat.translate(LLVector3(-0.5f, -0.5f, 0.f)); - tex_mat.rotate(quat); - - if (result & LLViewerTextureAnim::SCALE) - { - scale.setVec(scale_s, scale_t, 1.f); - LLMatrix4 mat; - mat.initAll(scale, LLQuaternion(), LLVector3()); - tex_mat *= mat; - } - - tex_mat.translate(trans); + tex_mat.identity(); + tex_mat.translate(LLVector3(-0.5f, -0.5f, 0.f)); + tex_mat.rotate(quat); + + if (result & LLViewerTextureAnim::SCALE) + { + scale.setVec(scale_s, scale_t, 1.f); + LLMatrix4 mat; + mat.initAll(scale, LLQuaternion(), LLVector3()); + tex_mat *= mat; } + + tex_mat.translate(trans); } - else + } + else + { + if (mTexAnimMode && mTextureAnimp->mRate == 0) { - if (mTextureAnimp->mRate == 0) - { - mTexAnimMode = 0; - } + gPipeline.markTextured(mDrawable); + mFaceMappingChanged = TRUE; + mTexAnimMode = 0; } } +} +BOOL LLVOVolume::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time) +{ + LLViewerObject::idleUpdate(agent, world, time); + + if (mDead || mDrawable.isNull()) + { + return TRUE; + } + + /////////////////////// + // + // Do texture animation stuff + // + + if (mTextureAnimp && gAnimateTextures) + { + animateTextures(); + } // Dispatch to implementation if (mVolumeImpl) @@ -717,15 +734,26 @@ void LLVOVolume::setParent(LLViewerObject* parent) void LLVOVolume::regenFaces() { // remove existing faces - deleteFaces(); + BOOL count_changed = mNumFaces != getNumTEs(); - // add new faces - mNumFaces = getNumTEs(); + if (count_changed) + { + deleteFaces(); + // add new faces + mNumFaces = getNumTEs(); + } + for (S32 i = 0; i < mNumFaces; i++) { - LLFace* facep = addFace(i); - facep->setViewerObject(this); + LLFace* facep = count_changed ? addFace(i) : mDrawable->getFace(i); facep->setTEOffset(i); + facep->setTexture(getTEImage(i)); + facep->setViewerObject(this); + } + + if (!count_changed) + { + updateFaceFlags(); } } @@ -2062,21 +2090,14 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group) facep->setState(LLFace::FULLBRIGHT); } - if (vobj->mTextureAnimp) + if (vobj->mTextureAnimp && vobj->mTexAnimMode) { if (vobj->mTextureAnimp->mFace <= -1) { S32 face; for (face = 0; face < vobj->getNumTEs(); face++) { - if (vobj->mTextureAnimp->mMode & LLViewerTextureAnim::ON) - { - drawablep->getFace(face)->setState(LLFace::TEXTURE_ANIM); - } - else - { - drawablep->getFace(face)->clearState(LLFace::TEXTURE_ANIM); - } + drawablep->getFace(face)->setState(LLFace::TEXTURE_ANIM); } } else if (vobj->mTextureAnimp->mFace < vobj->getNumTEs()) diff --git a/indra/newview/llvovolume.h b/indra/newview/llvovolume.h index 76b469e6aa..16a91bce8e 100644 --- a/indra/newview/llvovolume.h +++ b/indra/newview/llvovolume.h @@ -71,6 +71,7 @@ public: void deleteFaces(); + void animateTextures(); /*virtual*/ BOOL idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time); /*virtual*/ BOOL isActive() const; diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h index 0fadae0a61..5061ef742c 100644 --- a/indra/newview/pipeline.h +++ b/indra/newview/pipeline.h @@ -327,6 +327,7 @@ public: RENDER_DEBUG_TEXTURE_AREA = 0x08000, RENDER_DEBUG_FACE_AREA = 0x10000, RENDER_DEBUG_PARTICLES = 0x20000, + RENDER_DEBUG_TEXTURE_ANIM = 0x40000, }; LLPointer<LLViewerImage> mAlphaSizzleImagep; |