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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llviewborder.cpp
  3.  *
  4.  * $LicenseInfo:firstyear=2001&license=viewergpl$
  5.  * 
  6.  * Copyright (c) 2001-2010, Linden Research, Inc.
  7.  * 
  8.  * Second Life Viewer Source Code
  9.  * The source code in this file ("Source Code") is provided by Linden Lab
  10.  * to you under the terms of the GNU General Public License, version 2.0
  11.  * ("GPL"), unless you have obtained a separate licensing agreement
  12.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  13.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  14.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  15.  * 
  16.  * There are special exceptions to the terms and conditions of the GPL as
  17.  * it is applied to this Source Code. View the full text of the exception
  18.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  19.  * online at
  20.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  21.  * 
  22.  * By copying, modifying or distributing this software, you acknowledge
  23.  * that you have read and understood your obligations described above,
  24.  * and agree to abide by those obligations.
  25.  * 
  26.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  27.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  28.  * COMPLETENESS OR PERFORMANCE.
  29.  * $/LicenseInfo$
  30.  */
  31. #include "linden_common.h"
  32. #include "llviewborder.h"
  33. #include "llrender.h"
  34. #include "llfocusmgr.h"
  35. #include "lluictrlfactory.h"
  36. static LLDefaultChildRegistry::Register<LLViewBorder> r("view_border");
  37. void LLViewBorder::BevelValues::declareValues()
  38. {
  39. declare("in", LLViewBorder::BEVEL_IN);
  40. declare("out", LLViewBorder::BEVEL_OUT);
  41. declare("bright", LLViewBorder::BEVEL_BRIGHT);
  42. declare("none", LLViewBorder::BEVEL_NONE);
  43. }
  44. void LLViewBorder::StyleValues::declareValues()
  45. {
  46. declare("line", LLViewBorder::STYLE_LINE);
  47. declare("texture", LLViewBorder::STYLE_TEXTURE);
  48. }
  49. LLViewBorder::Params::Params()
  50. : bevel_style("bevel_style", BEVEL_OUT),
  51. render_style("border_style", STYLE_LINE),
  52. border_thickness("border_thickness"),
  53. highlight_light_color("highlight_light_color"),
  54. highlight_dark_color("highlight_dark_color"),
  55. shadow_light_color("shadow_light_color"),
  56. shadow_dark_color("shadow_dark_color")
  57. {
  58. addSynonym(border_thickness, "thickness");
  59. addSynonym(render_style, "style");
  60. name = "view_border";
  61. mouse_opaque = false;
  62. follows.flags = FOLLOWS_ALL;
  63. }
  64. LLViewBorder::LLViewBorder(const LLViewBorder::Params& p)
  65. : LLView(p),
  66. mTexture( NULL ),
  67. mHasKeyboardFocus( FALSE ),
  68. mBorderWidth(p.border_thickness),
  69. mHighlightLight(p.highlight_light_color()),
  70. mHighlightDark(p.highlight_dark_color()),
  71. mShadowLight(p.shadow_light_color()),
  72. mShadowDark(p.shadow_dark_color()),
  73. mBevel(p.bevel_style),
  74. mStyle(p.render_style)
  75. {}
  76. void LLViewBorder::setColors( const LLColor4& shadow_dark, const LLColor4& highlight_light )
  77. {
  78. mShadowDark = shadow_dark;
  79. mHighlightLight = highlight_light;
  80. }
  81. void LLViewBorder::setColorsExtended( const LLColor4& shadow_light, const LLColor4& shadow_dark,
  82.       const LLColor4& highlight_light, const LLColor4& highlight_dark )
  83. {
  84. mShadowDark = shadow_dark;
  85. mShadowLight = shadow_light;
  86. mHighlightLight = highlight_light;
  87. mHighlightDark = highlight_dark;
  88. }
  89. void LLViewBorder::setTexture( const LLUUID &image_id )
  90. {
  91. mTexture = LLUI::getUIImageByID(image_id);
  92. }
  93. void LLViewBorder::draw()
  94. {
  95. if( STYLE_LINE == mStyle )
  96. {
  97. if( 0 == mBorderWidth )
  98. {
  99. // no visible border
  100. }
  101. else
  102. if( 1 == mBorderWidth )
  103. {
  104. drawOnePixelLines();
  105. }
  106. else
  107. if( 2 == mBorderWidth )
  108. {
  109. drawTwoPixelLines();
  110. }
  111. else
  112. {
  113. llassert( FALSE );  // not implemented
  114. }
  115. }
  116. else
  117. if( STYLE_TEXTURE == mStyle )
  118. {
  119. if( mTexture )
  120. {
  121. drawTextures();
  122. }
  123. }
  124. LLView::draw();
  125. }
  126. void LLViewBorder::drawOnePixelLines()
  127. {
  128. gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
  129. LLColor4 top_color = mHighlightLight.get();
  130. LLColor4 bottom_color = mHighlightLight.get();
  131. switch( mBevel )
  132. {
  133. case BEVEL_OUT:
  134. top_color = mHighlightLight.get();
  135. bottom_color = mShadowDark.get();
  136. break;
  137. case BEVEL_IN:
  138. top_color = mShadowDark.get();
  139. bottom_color = mHighlightLight.get();
  140. break;
  141. case BEVEL_NONE:
  142. // use defaults
  143. break;
  144. default:
  145. llassert(0);
  146. }
  147. if( mHasKeyboardFocus )
  148. {
  149. top_color = gFocusMgr.getFocusColor();
  150. bottom_color = top_color;
  151. LLUI::setLineWidth(lerp(1.f, 3.f, gFocusMgr.getFocusFlashAmt()));
  152. }
  153. S32 left = 0;
  154. S32 top = getRect().getHeight();
  155. S32 right = getRect().getWidth();
  156. S32 bottom = 0;
  157. gGL.color4fv( top_color.mV );
  158. gl_line_2d(left, bottom, left, top);
  159. gl_line_2d(left, top, right, top);
  160. gGL.color4fv( bottom_color.mV );
  161. gl_line_2d(right, top, right, bottom);
  162. gl_line_2d(left, bottom, right, bottom);
  163. LLUI::setLineWidth(1.f);
  164. }
  165. void LLViewBorder::drawTwoPixelLines()
  166. {
  167. gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
  168. LLColor4 focus_color = gFocusMgr.getFocusColor();
  169. LLColor4 top_in_color;
  170. LLColor4 top_out_color;
  171. LLColor4 bottom_in_color;
  172. LLColor4 bottom_out_color;
  173. switch( mBevel )
  174. {
  175. case BEVEL_OUT:
  176. top_in_color = mHighlightLight.get();
  177. top_out_color = mHighlightDark.get();
  178. bottom_in_color = mShadowLight.get();
  179. bottom_out_color = mShadowDark.get();
  180. break;
  181. case BEVEL_IN:
  182. top_in_color = mShadowDark.get();
  183. top_out_color = mShadowLight.get();
  184. bottom_in_color = mHighlightDark.get();
  185. bottom_out_color = mHighlightLight.get();
  186. break;
  187. case BEVEL_BRIGHT:
  188. top_in_color = mHighlightLight.get();
  189. top_out_color = mHighlightLight.get();
  190. bottom_in_color = mHighlightLight.get();
  191. bottom_out_color = mHighlightLight.get();
  192. break;
  193. case BEVEL_NONE:
  194. top_in_color = mShadowDark.get();
  195. top_out_color = mShadowDark.get();
  196. bottom_in_color = mShadowDark.get();
  197. bottom_out_color = mShadowDark.get();
  198. // use defaults
  199. break;
  200. default:
  201. llassert(0);
  202. }
  203. if( mHasKeyboardFocus )
  204. {
  205. top_out_color = focus_color;
  206. bottom_out_color = focus_color;
  207. }
  208. S32 left = 0;
  209. S32 top = getRect().getHeight();
  210. S32 right = getRect().getWidth();
  211. S32 bottom = 0;
  212. // draw borders
  213. gGL.color3fv( top_out_color.mV );
  214. gl_line_2d(left, bottom, left, top-1);
  215. gl_line_2d(left, top-1, right, top-1);
  216. gGL.color3fv( top_in_color.mV );
  217. gl_line_2d(left+1, bottom+1, left+1, top-2);
  218. gl_line_2d(left+1, top-2, right-1, top-2);
  219. gGL.color3fv( bottom_out_color.mV );
  220. gl_line_2d(right-1, top-1, right-1, bottom);
  221. gl_line_2d(left, bottom, right, bottom);
  222. gGL.color3fv( bottom_in_color.mV );
  223. gl_line_2d(right-2, top-2, right-2, bottom+1);
  224. gl_line_2d(left+1, bottom+1, right-1, bottom+1);
  225. }
  226. void LLViewBorder::drawTextures()
  227. {
  228. //LLGLSUIDefault gls_ui;
  229. //llassert( FALSE );  // TODO: finish implementing
  230. //gGL.color4fv(UI_VERTEX_COLOR.mV);
  231. //gGL.getTexUnit(0)->bind(mTexture);
  232. //gGL.getTexUnit(0)->setTextureAddressMode(LLTexUnit::TAM_WRAP);
  233. //drawTextureTrapezoid(   0.f, mBorderWidth, getRect().getWidth(),  0, 0 );
  234. //drawTextureTrapezoid(  90.f, mBorderWidth, getRect().getHeight(), (F32)getRect().getWidth(),0 );
  235. //drawTextureTrapezoid( 180.f, mBorderWidth, getRect().getWidth(),  (F32)getRect().getWidth(),(F32)getRect().getHeight() );
  236. //drawTextureTrapezoid( 270.f, mBorderWidth, getRect().getHeight(), 0, (F32)getRect().getHeight() );
  237. }
  238. void LLViewBorder::drawTextureTrapezoid( F32 degrees, S32 width, S32 length, F32 start_x, F32 start_y )
  239. {
  240. gGL.pushMatrix();
  241. {
  242. gGL.translatef(start_x, start_y, 0.f);
  243. glRotatef( degrees, 0, 0, 1 );
  244. gGL.begin(LLRender::QUADS);
  245. {
  246. //      width, width   /--------- length-width, width //
  247. //           /            //
  248. //      /     //
  249. //     /--------------- //
  250. //     0,0   length, 0 //
  251. gGL.texCoord2f( 0, 0 );
  252. gGL.vertex2i( 0, 0 );
  253. gGL.texCoord2f( (GLfloat)length, 0 );
  254. gGL.vertex2i( length, 0 );
  255. gGL.texCoord2f( (GLfloat)(length - width), (GLfloat)width );
  256. gGL.vertex2i( length - width, width );
  257. gGL.texCoord2f( (GLfloat)width, (GLfloat)width );
  258. gGL.vertex2i( width, width );
  259. }
  260. gGL.end();
  261. }
  262. gGL.popMatrix();
  263. }
  264. BOOL LLViewBorder::getBevelFromAttribute(LLXMLNodePtr node, LLViewBorder::EBevel& bevel_style)
  265. {
  266. if (node->hasAttribute("bevel_style"))
  267. {
  268. std::string bevel_string;
  269. node->getAttributeString("bevel_style", bevel_string);
  270. LLStringUtil::toLower(bevel_string);
  271. if (bevel_string == "none")
  272. {
  273. bevel_style = LLViewBorder::BEVEL_NONE;
  274. }
  275. else if (bevel_string == "in")
  276. {
  277. bevel_style = LLViewBorder::BEVEL_IN;
  278. }
  279. else if (bevel_string == "out")
  280. {
  281. bevel_style = LLViewBorder::BEVEL_OUT;
  282. }
  283. else if (bevel_string == "bright")
  284. {
  285. bevel_style = LLViewBorder::BEVEL_BRIGHT;
  286. }
  287. return TRUE;
  288. }
  289. return FALSE;
  290. }