llstatbar.cpp
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:7k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llstatbar.cpp
  3.  * @brief A little map of the world with network information
  4.  *
  5.  * $LicenseInfo:firstyear=2001&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2001-2010, Linden Research, Inc.
  8.  * 
  9.  * Second Life Viewer Source Code
  10.  * The source code in this file ("Source Code") is provided by Linden Lab
  11.  * to you under the terms of the GNU General Public License, version 2.0
  12.  * ("GPL"), unless you have obtained a separate licensing agreement
  13.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  14.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  15.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  16.  * 
  17.  * There are special exceptions to the terms and conditions of the GPL as
  18.  * it is applied to this Source Code. View the full text of the exception
  19.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  20.  * online at
  21.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  22.  * 
  23.  * By copying, modifying or distributing this software, you acknowledge
  24.  * that you have read and understood your obligations described above,
  25.  * and agree to abide by those obligations.
  26.  * 
  27.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  28.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  29.  * COMPLETENESS OR PERFORMANCE.
  30.  * $/LicenseInfo$
  31.  */
  32. //#include "llviewerprecompiledheaders.h"
  33. #include "linden_common.h"
  34. #include "llstatbar.h"
  35. #include "llmath.h"
  36. #include "llui.h"
  37. #include "llgl.h"
  38. #include "llfontgl.h"
  39. #include "llstat.h"
  40. #include "lluictrlfactory.h"
  41. ///////////////////////////////////////////////////////////////////////////////////
  42. LLStatBar::LLStatBar(const Params& p)
  43. : LLView(p),
  44.   mLabel(p.label),
  45.   mUnitLabel(p.unit_label),
  46.   mMinBar(p.bar_min),
  47.   mMaxBar(p.bar_max),
  48.   mStatp(LLStat::getStat(p.stat)),
  49.   mTickSpacing(p.tick_spacing),
  50.   mLabelSpacing(p.label_spacing),
  51.   mPrecision(p.precision),
  52.   mUpdatesPerSec(p.update_rate),
  53.   mPerSec(p.show_per_sec),
  54.   mDisplayBar(p.show_bar),
  55.   mDisplayHistory(p.show_history),
  56.   mDisplayMean(p.show_mean)
  57. {
  58. }
  59. BOOL LLStatBar::handleMouseDown(S32 x, S32 y, MASK mask)
  60. {
  61. if (mDisplayBar)
  62. {
  63. if (mDisplayHistory)
  64. {
  65. mDisplayBar = FALSE;
  66. mDisplayHistory = FALSE;
  67. }
  68. else
  69. {
  70. mDisplayHistory = TRUE;
  71. }
  72. }
  73. else
  74. {
  75. mDisplayBar = TRUE;
  76. }
  77. LLView* parent = getParent();
  78. parent->reshape(parent->getRect().getWidth(), parent->getRect().getHeight(), FALSE);
  79. return FALSE;
  80. }
  81. void LLStatBar::draw()
  82. {
  83. if (!mStatp)
  84. {
  85. // llinfos << "No stats for statistics bar!" << llendl;
  86. return;
  87. }
  88. // Get the values.
  89. F32 current, min, max, mean;
  90. if (mPerSec)
  91. {
  92. current = mStatp->getCurrentPerSec();
  93. min = mStatp->getMinPerSec();
  94. max = mStatp->getMaxPerSec();
  95. mean = mStatp->getMeanPerSec();
  96. }
  97. else
  98. {
  99. current = mStatp->getCurrent();
  100. min = mStatp->getMin();
  101. max = mStatp->getMax();
  102. mean = mStatp->getMean();
  103. }
  104. if ((mUpdatesPerSec == 0.f) || (mUpdateTimer.getElapsedTimeF32() > 1.f/mUpdatesPerSec) || (mValue == 0.f))
  105. {
  106. if (mDisplayMean)
  107. {
  108. mValue = mean;
  109. }
  110. else
  111. {
  112. mValue = current;
  113. }
  114. mUpdateTimer.reset();
  115. }
  116. S32 width = getRect().getWidth() - 40;
  117. S32 max_width = width;
  118. S32 bar_top = getRect().getHeight() - 15; // 16 pixels from top.
  119. S32 bar_height = bar_top - 20;
  120. S32 tick_height = 4;
  121. S32 tick_width = 1;
  122. S32 left, top, right, bottom;
  123. F32 value_scale = max_width/(mMaxBar - mMinBar);
  124. LLFontGL::getFontMonospace()->renderUTF8(mLabel, 0, 0, getRect().getHeight(), LLColor4(1.f, 1.f, 1.f, 1.f),
  125.  LLFontGL::LEFT, LLFontGL::TOP);
  126. std::string value_format;
  127. std::string value_str;
  128. if (!mUnitLabel.empty())
  129. {
  130. value_format = llformat( "%%.%df%%s", mPrecision);
  131. value_str = llformat( value_format.c_str(), mValue, mUnitLabel.c_str());
  132. }
  133. else
  134. {
  135. value_format = llformat( "%%.%df", mPrecision);
  136. value_str = llformat( value_format.c_str(), mValue);
  137. }
  138. // Draw the value.
  139. LLFontGL::getFontMonospace()->renderUTF8(value_str, 0, width, getRect().getHeight(), 
  140.  LLColor4(1.f, 1.f, 1.f, 0.5f),
  141.  LLFontGL::RIGHT, LLFontGL::TOP);
  142. value_format = llformat( "%%.%df", mPrecision);
  143. if (mDisplayBar)
  144. {
  145. std::string tick_label;
  146. // Draw the tick marks.
  147. F32 tick_value;
  148. top = bar_top;
  149. bottom = bar_top - bar_height - tick_height/2;
  150. LLGLSUIDefault gls_ui;
  151. gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
  152. for (tick_value = mMinBar; tick_value <= mMaxBar; tick_value += mTickSpacing)
  153. {
  154. left = llfloor((tick_value - mMinBar)*value_scale);
  155. right = left + tick_width;
  156. gl_rect_2d(left, top, right, bottom, LLColor4(1.f, 1.f, 1.f, 0.1f));
  157. }
  158. // Draw the tick labels (and big ticks).
  159. bottom = bar_top - bar_height - tick_height;
  160. for (tick_value = mMinBar; tick_value <= mMaxBar; tick_value += mLabelSpacing)
  161. {
  162. left = llfloor((tick_value - mMinBar)*value_scale);
  163. right = left + tick_width;
  164. gl_rect_2d(left, top, right, bottom, LLColor4(1.f, 1.f, 1.f, 0.25f));
  165. tick_label = llformat( value_format.c_str(), tick_value);
  166. // draw labels for the tick marks
  167. LLFontGL::getFontMonospace()->renderUTF8(tick_label, 0, left - 1, bar_top - bar_height - tick_height,
  168.  LLColor4(1.f, 1.f, 1.f, 0.5f),
  169.  LLFontGL::LEFT, LLFontGL::TOP);
  170. }
  171. // Now, draw the bars
  172. top = bar_top;
  173. bottom = bar_top - bar_height;
  174. // draw background bar.
  175. left = 0;
  176. right = width;
  177. gl_rect_2d(left, top, right, bottom, LLColor4(0.f, 0.f, 0.f, 0.25f));
  178. if (mStatp->getNumValues() == 0)
  179. {
  180. // No data, don't draw anything...
  181. return;
  182. }
  183. // draw min and max
  184. left = (S32) ((min - mMinBar) * value_scale);
  185. if (left < 0)
  186. {
  187. left = 0;
  188. llwarns << "Min:" << min << llendl;
  189. }
  190. right = (S32) ((max - mMinBar) * value_scale);
  191. gl_rect_2d(left, top, right, bottom, LLColor4(1.f, 0.f, 0.f, 0.25f));
  192. S32 num_values = mStatp->getNumValues() - 1;
  193. if (mDisplayHistory)
  194. {
  195. S32 i;
  196. for (i = 0; i < num_values; i++)
  197. {
  198. if (i == mStatp->getNextBin())
  199. {
  200. continue;
  201. }
  202. if (mPerSec)
  203. {
  204. left = (S32)((mStatp->getPrevPerSec(i) - mMinBar) * value_scale);
  205. right = (S32)((mStatp->getPrevPerSec(i) - mMinBar) * value_scale) + 1;
  206. gl_rect_2d(left, bottom+i+1, right, bottom+i, LLColor4(1.f, 0.f, 0.f, 1.f));
  207. }
  208. else
  209. {
  210. left = (S32)((mStatp->getPrev(i) - mMinBar) * value_scale);
  211. right = (S32)((mStatp->getPrev(i) - mMinBar) * value_scale) + 1;
  212. gl_rect_2d(left, bottom+i+1, right, bottom+i, LLColor4(1.f, 0.f, 0.f, 1.f));
  213. }
  214. }
  215. }
  216. else
  217. {
  218. // draw current
  219. left = (S32) ((current - mMinBar) * value_scale) - 1;
  220. right = (S32) ((current - mMinBar) * value_scale) + 1;
  221. gl_rect_2d(left, top, right, bottom, LLColor4(1.f, 0.f, 0.f, 1.f));
  222. }
  223. // draw mean bar
  224. top = bar_top + 2;
  225. bottom = bar_top - bar_height - 2;
  226. left = (S32) ((mean - mMinBar) * value_scale) - 1;
  227. right = (S32) ((mean - mMinBar) * value_scale) + 1;
  228. gl_rect_2d(left, top, right, bottom, LLColor4(0.f, 1.f, 0.f, 1.f));
  229. }
  230. LLView::draw();
  231. }
  232. void LLStatBar::setRange(F32 bar_min, F32 bar_max, F32 tick_spacing, F32 label_spacing)
  233. {
  234. mMinBar = bar_min;
  235. mMaxBar = bar_max;
  236. mTickSpacing = tick_spacing;
  237. mLabelSpacing = label_spacing;
  238. }
  239. LLRect LLStatBar::getRequiredRect()
  240. {
  241. LLRect rect;
  242. if (mDisplayBar)
  243. {
  244. if (mDisplayHistory)
  245. {
  246. rect.mTop = 67;
  247. }
  248. else
  249. {
  250. rect.mTop = 40;
  251. }
  252. }
  253. else
  254. {
  255. rect.mTop = 14;
  256. }
  257. return rect;
  258. }