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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llhudrender.cpp
  3.  * @brief LLHUDRender class implementation
  4.  *
  5.  * $LicenseInfo:firstyear=2002&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2002-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 "llhudrender.h"
  34. #include "llrender.h"
  35. #include "llgl.h"
  36. #include "llviewercamera.h"
  37. #include "v3math.h"
  38. #include "llquaternion.h"
  39. #include "llfontgl.h"
  40. #include "llglheaders.h"
  41. #include "llviewerwindow.h"
  42. #include "llui.h"
  43. void hud_render_utf8text(const std::string &str, const LLVector3 &pos_agent,
  44.  const LLFontGL &font,
  45.  const U8 style,
  46.  const LLFontGL::ShadowType shadow,
  47.  const F32 x_offset, const F32 y_offset,
  48.  const LLColor4& color,
  49.  const BOOL orthographic)
  50. {
  51. LLWString wstr(utf8str_to_wstring(str));
  52. hud_render_text(wstr, pos_agent, font, style, shadow, x_offset, y_offset, color, orthographic);
  53. }
  54. void hud_render_text(const LLWString &wstr, const LLVector3 &pos_agent,
  55. const LLFontGL &font,
  56. const U8 style,
  57. const LLFontGL::ShadowType shadow,
  58. const F32 x_offset, const F32 y_offset,
  59. const LLColor4& color,
  60. const BOOL orthographic)
  61. {
  62. LLViewerCamera* camera = LLViewerCamera::getInstance();
  63. // Do cheap plane culling
  64. LLVector3 dir_vec = pos_agent - camera->getOrigin();
  65. dir_vec /= dir_vec.magVec();
  66. if (wstr.empty() || (!orthographic && dir_vec * camera->getAtAxis() <= 0.f))
  67. {
  68. return;
  69. }
  70. LLVector3 right_axis;
  71. LLVector3 up_axis;
  72. if (orthographic)
  73. {
  74. right_axis.setVec(0.f, -1.f / gViewerWindow->getWorldViewWidthRaw(), 0.f);
  75. up_axis.setVec(0.f, 0.f, 1.f / gViewerWindow->getWorldViewHeightRaw());
  76. }
  77. else
  78. {
  79. camera->getPixelVectors(pos_agent, up_axis, right_axis);
  80. }
  81. LLCoordFrame render_frame = *camera;
  82. LLQuaternion rot;
  83. if (!orthographic)
  84. {
  85. rot = render_frame.getQuaternion();
  86. rot = rot * LLQuaternion(-F_PI_BY_TWO, camera->getYAxis());
  87. rot = rot * LLQuaternion(F_PI_BY_TWO, camera->getXAxis());
  88. }
  89. else
  90. {
  91. rot = LLQuaternion(-F_PI_BY_TWO, LLVector3(0.f, 0.f, 1.f));
  92. rot = rot * LLQuaternion(-F_PI_BY_TWO, LLVector3(0.f, 1.f, 0.f));
  93. }
  94. F32 angle;
  95. LLVector3 axis;
  96. rot.getAngleAxis(&angle, axis);
  97. LLVector3 render_pos = pos_agent + (floorf(x_offset) * right_axis) + (floorf(y_offset) * up_axis);
  98. //get the render_pos in screen space
  99. F64 winX, winY, winZ;
  100. LLRect world_view_rect = gViewerWindow->getWorldViewRectRaw();
  101. S32 viewport[4];
  102. viewport[0] = world_view_rect.mLeft;
  103. viewport[1] = world_view_rect.mBottom;
  104. viewport[2] = world_view_rect.getWidth();
  105. viewport[3] = world_view_rect.getHeight();
  106. gluProject(render_pos.mV[0], render_pos.mV[1], render_pos.mV[2],
  107. gGLModelView, gGLProjection, (GLint*) viewport,
  108. &winX, &winY, &winZ);
  109. //fonts all render orthographically, set up projection``
  110. glMatrixMode(GL_PROJECTION);
  111. glPushMatrix();
  112. glMatrixMode(GL_MODELVIEW);
  113. LLUI::pushMatrix();
  114. gl_state_for_2d(world_view_rect.getWidth(), world_view_rect.getHeight());
  115. gViewerWindow->setup3DViewport();
  116. //gViewerWindow->setup2DRender();
  117. winX -= world_view_rect.mLeft;
  118. winY -= world_view_rect.mBottom;
  119. LLUI::loadIdentity();
  120. LLUI::translate((F32) winX*1.0f/LLFontGL::sScaleX, (F32) winY*1.0f/(LLFontGL::sScaleY), -(((F32) winZ*2.f)-1.f));
  121. //glRotatef(angle * RAD_TO_DEG, axis.mV[VX], axis.mV[VY], axis.mV[VZ]);
  122. //glScalef(right_scale, up_scale, 1.f);
  123. F32 right_x;
  124. font.render(wstr, 0, 0, 0, color, LLFontGL::LEFT, LLFontGL::BASELINE, style, shadow, wstr.length(), 1000, &right_x);
  125. LLUI::popMatrix();
  126. glMatrixMode(GL_PROJECTION);
  127. glPopMatrix();
  128. glMatrixMode(GL_MODELVIEW);
  129. }