summaryrefslogtreecommitdiff
path: root/indra/newview/lltextureview.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'indra/newview/lltextureview.cpp')
-rw-r--r--indra/newview/lltextureview.cpp304
1 files changed, 304 insertions, 0 deletions
diff --git a/indra/newview/lltextureview.cpp b/indra/newview/lltextureview.cpp
new file mode 100644
index 0000000000..01bc0bd5fd
--- /dev/null
+++ b/indra/newview/lltextureview.cpp
@@ -0,0 +1,304 @@
+/**
+ * @file lltextureview.cpp
+ * @brief LLTextureView class implementation
+ *
+ * Copyright (c) 2001-$CurrentYear$, Linden Research, Inc.
+ * $License$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include <set>
+
+#include "lltextureview.h"
+
+#include "llrect.h"
+#include "llerror.h"
+
+#include "viewer.h"
+#include "llui.h"
+
+#include "llviewerimagelist.h"
+#include "llselectmgr.h"
+#include "llviewerobject.h"
+#include "llviewerimage.h"
+#include "llhoverview.h"
+
+LLTextureView *gTextureView = NULL;
+
+//static
+std::set<LLViewerImage*> LLTextureView::sDebugImages;
+
+// Used for sorting
+struct SortTextureBars
+{
+ bool operator()(const LLView* i1, const LLView* i2)
+ {
+ LLTextureBar* bar1p = (LLTextureBar*)i1;
+ LLTextureBar* bar2p = (LLTextureBar*)i2;
+ LLViewerImage *i1p = bar1p->mImagep;
+ LLViewerImage *i2p = bar2p->mImagep;
+ F32 pri1 = i1p->getDecodePriority(); // i1p->mRequestedDownloadPriority
+ F32 pri2 = i2p->getDecodePriority(); // i2p->mRequestedDownloadPriority
+ if (pri1 > pri2)
+ return true;
+ else if (pri2 > pri1)
+ return false;
+ else
+ return i1p->getID() < i2p->getID();
+ }
+};
+
+LLTextureView::LLTextureView(const std::string& name, const LLRect& rect)
+: LLContainerView(name, rect)
+{
+ setVisible(FALSE);
+ mFreezeView = FALSE;
+
+ mNumTextureBars = 0;
+ setDisplayChildren(TRUE);
+ mGLTexMemBar = 0;
+}
+
+LLTextureView::~LLTextureView()
+{
+ // Children all cleaned up by default view destructor.
+ delete mGLTexMemBar;
+ mGLTexMemBar = 0;
+}
+
+EWidgetType LLTextureView::getWidgetType() const
+{
+ return WIDGET_TYPE_TEXTURE_VIEW;
+}
+
+LLString LLTextureView::getWidgetTag() const
+{
+ return LL_TEXTURE_VIEW_TAG;
+}
+
+
+typedef std::pair<F32,LLViewerImage*> decode_pair_t;
+struct compare_decode_pair
+{
+ bool operator()(const decode_pair_t& a, const decode_pair_t& b)
+ {
+ return a.first > b.first;
+ }
+};
+
+void LLTextureView::draw()
+{
+ if (!mFreezeView)
+ {
+// LLViewerObject *objectp;
+// S32 te;
+
+ for_each(mTextureBars.begin(), mTextureBars.end(), DeletePointer());
+ mTextureBars.clear();
+
+ delete mGLTexMemBar;
+ mGLTexMemBar = 0;
+
+ typedef std::multiset<decode_pair_t, compare_decode_pair > display_list_t;
+ display_list_t display_image_list;
+
+ for (LLViewerImageList::image_list_t::iterator iter = gImageList.mImageList.begin();
+ iter != gImageList.mImageList.end(); )
+ {
+ LLPointer<LLViewerImage> imagep = *iter++;
+#if 1
+ if (imagep->getDontDiscard())
+ {
+ continue;
+ }
+#endif
+ if (imagep->isMissingAsset())
+ {
+ continue;
+ }
+
+#define HIGH_PRIORITY 100000000.f
+ F32 pri = imagep->getDecodePriority();
+
+ if (sDebugImages.find(imagep) != sDebugImages.end())
+ {
+ pri += 3*HIGH_PRIORITY;
+ }
+
+#if 1
+ if (pri < HIGH_PRIORITY && gSelectMgr)
+ {
+ S32 te;
+ LLViewerObject *objectp;
+ for (gSelectMgr->getFirstTE(&objectp, &te); objectp; gSelectMgr->getNextTE(&objectp, &te))
+ {
+ if (imagep == objectp->getTEImage(te))
+ {
+ pri += 2*HIGH_PRIORITY;
+ break;
+ }
+ }
+ }
+#endif
+#if 1
+ if (pri < HIGH_PRIORITY)
+ {
+ LLViewerObject *objectp = gHoverView->getLastHoverObject();
+ if (objectp)
+ {
+ S32 tex_count = objectp->getNumTEs();
+ for (S32 i = 0; i < tex_count; i++)
+ {
+ if (imagep == objectp->getTEImage(i))
+ {
+ pri += 2*HIGH_PRIORITY;
+ break;
+ }
+ }
+ }
+ }
+#endif
+#if 0
+ if (pri < HIGH_PRIORITY)
+ {
+ if (imagep->mBoostPriority)
+ {
+ pri += 4*HIGH_PRIORITY;
+ }
+ }
+#endif
+#if 1
+ if (pri > 0.f && pri < HIGH_PRIORITY)
+ {
+ if (imagep->mLastPacketTimer.getElapsedTimeF32() < 1.f ||
+ imagep->mLastDecodeTime.getElapsedTimeF32() < 1.f)
+ {
+ pri += 1*HIGH_PRIORITY;
+ }
+ }
+#endif
+// if (pri > 0.0f)
+ {
+ display_image_list.insert(std::make_pair(pri, imagep));
+ }
+ }
+
+ static S32 max_count = 50;
+ S32 count = 0;
+ for (display_list_t::iterator iter = display_image_list.begin();
+ iter != display_image_list.end(); iter++)
+ {
+ LLViewerImage* imagep = iter->second;
+ S32 hilite = 0;
+ F32 pri = iter->first;
+ if (pri >= 1 * HIGH_PRIORITY)
+ {
+ hilite = (S32)((pri+1) / HIGH_PRIORITY) - 1;
+ }
+ if ((hilite || count < max_count-10) && (count < max_count))
+ {
+ if (addBar(imagep, hilite))
+ {
+ count++;
+ }
+ }
+ }
+
+ sortChildren(SortTextureBars());
+
+ mGLTexMemBar = new LLGLTexMemBar("gl texmem bar");
+ addChild(mGLTexMemBar);
+
+ reshape(mRect.getWidth(), mRect.getHeight(), TRUE);
+
+ /*
+ count = gImageList.getNumImages();
+ char info_string[512];
+ sprintf(info_string, "Global Info:\nTexture Count: %d", count);
+ mInfoTextp->setText(info_string);
+ */
+
+
+ for (child_list_const_iter_t child_iter = getChildList()->begin();
+ child_iter != getChildList()->end(); ++child_iter)
+ {
+ LLView *viewp = *child_iter;
+ if (viewp->getRect().mBottom < 0)
+ {
+ viewp->setVisible(FALSE);
+ }
+ }
+ }
+
+ LLContainerView::draw();
+
+}
+
+BOOL LLTextureView::addBar(LLViewerImage *imagep, S32 hilite)
+{
+ if (!imagep)
+ {
+ return FALSE;
+ }
+
+ LLTextureBar *barp;
+ LLRect r;
+
+ mNumTextureBars++;
+
+ for (std::vector<LLTextureBar*>::iterator iter = mTextureBars.begin();
+ iter != mTextureBars.end(); iter++)
+ {
+ LLTextureBar* barp = *iter;
+ if (barp->mImagep == imagep)
+ {
+ barp->mHilite = hilite;
+ return FALSE;
+ }
+ }
+
+ barp = new LLTextureBar("texture bar", r);
+ barp->mImagep = imagep;
+ barp->mHilite = hilite;
+
+ addChild(barp);
+ mTextureBars.push_back(barp);
+
+ // Rearrange all child bars.
+ reshape(mRect.getWidth(), mRect.getHeight());
+ return TRUE;
+}
+
+BOOL LLTextureView::handleMouseDown(S32 x, S32 y, MASK mask)
+{
+ if (mask & MASK_SHIFT)
+ {
+ mFreezeView = !mFreezeView;
+ return TRUE;
+ }
+ else if (mask & MASK_CONTROL)
+ {
+ return FALSE;
+ }
+ else
+ {
+ return FALSE;
+ }
+}
+
+BOOL LLTextureView::handleMouseUp(S32 x, S32 y, MASK mask)
+{
+ return FALSE;
+}
+
+BOOL LLTextureView::handleKey(KEY key, MASK mask, BOOL called_from_parent)
+{
+ if (key == ' ')
+ {
+ mFreezeView = !mFreezeView;
+ return TRUE;
+ }
+ return FALSE;
+}
+