After a user spend three days trying to find out why certain
textures looked red (as if they had alpha and you pressed
control-alt-T, but not all of them were like that); and nothing
helped, not relogging, not clearing cache, not even reinstalling
the viewer... I decided to take this bug serious. Note that,
according to Shyotl, there have been more users every now and
then that reported this problem.
The problem (after doing a research for 1 hour) turned out
to be that she had beacons on, highlighting prims with scripts.
The immediate bug is, of course, that this was persistent over
a relog. Upon further investigation, this bug exists because
a Debug Setting had a double meaning: it meant both "beacon
floater is visible", which you want to be persistent, and it
was later renamed and given the meaning "Keep beacons when
closing the floater". Digging deeper it turned out that there
was a REAL mess with regard to the beacons: A non-finished
floater with immature comments (called "dingdong floater") was
half-created and replaced the original floater which, according
to the comment was "so fucked over and over" (== commented out
in several places), but then everything was commented out and
replaced with a menu (because they couldn't get it to work?).
The floater simply didn't exist anymore! That reduced the
meaning of the Debug Setting to "Show beacons", although you
now could only set it in the menu by clicking on "Beacons Always On"
where 'Always' refers to also on when the floater isn't there.
I nuked the immature dingdong code, brought back the original
floater as it was in snowglobe (and still is in Imprudence),
fixed it up a bit with a nicer layout (indentation and spacing)
and disabling (graying out) when needed, and added a new checkbox
that will allow people to still keep/see the beacons after closing
the floater.
In the end this requires THREE Debug Setting variables:
ShowBeaconsFloater : TRUE when the floater is visible, FALSE when not.
This is persistent, so the floater is still
there if you relog with the floater open.
BeaconsKeepVisible : TRUE when the new checkbox is checked.
Also persistent.
BeaconsVisible : TRUE when the beacons are rendered, FALSE otherwise.
This is NOT persistent: we don't want unsuspecting
users to try and get rid of the weird 'red prims'
by relogging and failing at that.
Added a new statemachine AIFetchInventoryFolder, which can be used
to fetch the contents of a folder by name or UUID.
Also added AIEvent (and one event,
AIEvent::LLInventoryModel_mIsAgentInvUsable_true, which is needed
for AIFetchInventoryFolder).
Fixed LLInventoryModel::sBackgroundFetchActive to correctly reflect
whether or not LLInventoryModel::backgroundFetch is added to
gIdleCallbacks.
Avoid duplicated entries in sFetchQueue.
Reset sFullFetchStarted in LLInventoryModel::stopBackgroundFetch to
allow for a renewed full fetch when some single-folder fetch stops it.
Added AIStateMachine::mQueued to make calling 'cont()' more robust:
calling cont() / idle() / cont() on a row would otherwise add a
statemachine twice to the active list, which would cause a crash
when it's killed.
Call AIFilePicker::create() instead of new AIFilePicker.
Renamed deleteMe() to kill() and bs_deleted to bs_killed.
Only default to auto destruct when created with create(true),
otherwise kill() has to be called explicitely.
This fixes the bug that if you Quit while in the Singularity -> Pose
Stand, then you are permanently hovering over the group until you go
into Advanced -> Debug Settings and reset AscentAvatarZModifier.
It also fixes that before, when you changed AscentAvatarZModifier
in Advanced -> Debug Settings then you saw no effect (until the
viewer would sent an AvatarAppearance message.
After this patch, changing any of the AscentAvatar*Modifier settings
has immediate visible effect, and a pose stand (Z-offset) is reset
when quitting.
Allows to save the .llm of all mesh objects, and
all morphs of each as .obj (Wavefront OBJ File),
for import in, for example, blender.
You can also load .obj files, but of course they
will only affect what you see locally.
Also a little review of Dead objects in general.
The old code was calling 'erase' on a large vector, once for
every dead object (which are a lot, especially if you exit or
teleport), causing the whole (large) vector to be copied every
time. The new code only calls erase once per call (about once
a second at most now), erasing 20 to 100 objects at the END
of the vector. This is INCREDIBLY faster.
This makes sound beacons green when playing at
full volume, yellow when playing at a lower volume
and red when they are muted (aka, in another parcel
that you can't hear the sounds of).
Originally this was a debug patch as muted sound
sources used to be implemented by setting the volume
to zero, which happens to use like three times more
CPU: so, having a lot of muted sound source caused
the audio thread to never release a mutex anymore
(cause it was never idle anymore), causing the main
loop to hang, waiting on that mutex - dropping the
FPS drastically. Hence it was necessary to see which
sound sources were muted for debugging purposes.
(Since VWR-14914, muted source source are not played
at all anymore, so they do not take extra CPU).
It's still fun to see this extra information though,
now the patch exists anyway.
See http://redmine.kokuaviewer.org/issues/582
This happened only on opensim. The fixed was made
basically by MichelleZ. It doesn't harm anything, so
even though it appears to never happen on Agni
and it is unknown what bug is causing it, it make the
viewer resilient just-in-case...
It has happened to me that this hung the viewer. The cause is that
when you call parent->getParentFloater(child), then getParentFloater
which starts like this:
LLFloater* LLFloaterView::getParentFloater(LLView* viewp)
{
LLView* parentp = viewp->getParent();
starts with parentp == this. And the following logic causes
it to return 'viewp'!
I'm pretty sure that getParentFloater's whole design is wrong,
but I don't see another way to avoid this problem then with
this hack, except by making changes that do a lot more and
are a risk with regard breaking code elsewhere.
Added missing header to indra/newview/ascentkeyword.cpp now that
llviewerpluginmanager.h has a couple of header dependencies less.
Resolved Conflicts:
indra/llcommon/CMakeLists.txt
Proximity: addition of two independent things. Just included both.
It now is disabled if:
-Lacking hardware support for FBOs
-RenderDeferred not permitted in gpu feature table
-RenderAvatarVP not permitted in gpu feature table
-VertexShaderEnable is enabled and permitted in gpu feature table
-WindLightUseAtmosShaders is enabled and permitted in gpu feature table
Enabling deferred now requires WindLightUseAtmosShaders to be on beforehand, instead of blindly enabling it.
The previous hack wasn't thread-safe: read-only access would
access the reference counter multiple times at the same time,
which therefore would have to be thread-local to ever work.
The current solution just disables the calls to lock/unlock
for copyconstructed objects, which works if the copyconstructed
object isn't used anymore after the original is destructed.
This is the case then the copy construction only happens
upon passing a temporary to a function, which is the case.
Actually flush messages before terminating a plugin (upon
the shutdown message) and flush messages in the file- and
dirpicker before opening the blocking dialog. Flush debug
messages too (deeper into the code, just prior to the actual
blocking call).
Also, fix the context folder map to be a thread-safe
singleton and *attempt* to add support for default folders
to windows and Mac. The latter might even not compile yet
and definitely have to be tested (and fixed):
Opening a DirPicker in preferences --> Network and Set
the directory location of the cache. It should open a
Dialog window where you are already in the folder that
is the current cache directory setting (you can click
Cancel after verifying that this worked).
And, start to upload an image, select a file is some
directory (other than what it starts in). You can omit
the actual upload by clicking cancel in the preview.
Then upload again and now it should start in the same
folder as that you were just in. Possibly you need to
first open a file picker elsewhere with a different context
though, or windows might choose to open in the last
folder anyway while the code doesn't really work. Uploading
a sound before the second texture upload should do the
trick.