00001
00032 #include "llviewerprecompiledheaders.h"
00033
00034 #include "llhudconnector.h"
00035 #include "llviewercamera.h"
00036 #include "llviewerobject.h"
00037
00038 #include "llgl.h"
00039 #include "llimagegl.h"
00040 #include "llsphere.h"
00041 #include "llhudrender.h"
00042 #include "llfontgl.h"
00043 #include "llglheaders.h"
00044
00045 LLHUDConnector::LLHUDConnector(const U8 type) :
00046 LLHUDObject(type),
00047 mZCompare(TRUE)
00048 {
00049 mColor = LLColor4(1.f, 1.f, 1.f, 1.f);
00050 mFirstColor = mColor;
00051 mSecondColor = mColor;
00052 mDoFade = TRUE;
00053 mFadeDistance = 40.f;
00054 mFadeRange = 10.f;
00055 mDrawFirst = mDrawSecond = TRUE;
00056
00057 mLabel = "Foo!";
00058 }
00059
00060 LLHUDConnector::~LLHUDConnector()
00061 {
00062 }
00063
00064 void LLHUDConnector::setLabel(const LLString &label)
00065 {
00066 mLabel = label;
00067 }
00068
00069 void LLHUDConnector::setTargets(LLViewerObject *first_object, LLViewerObject *second_object)
00070 {
00071 setSourceObject(first_object);
00072 setTargetObject(second_object);
00073 }
00074
00075 void LLHUDConnector::render()
00076 {
00077 if (mSourceObject.isNull() || mTargetObject.isNull())
00078 {
00079 mSourceObject = NULL;
00080 mTargetObject = NULL;
00081 return;
00082 }
00083
00084 if (mSourceObject->isDead() || mTargetObject->isDead())
00085 {
00086 mSourceObject = NULL;
00087 mTargetObject = NULL;
00088 return;
00089 }
00090
00091 LLVector3 first_pos_agent = mSourceObject->getPositionAgent();
00092 LLVector3 second_pos_agent = mTargetObject->getPositionAgent();
00093
00094 LLVector3 center_agent = 0.5f*(first_pos_agent + second_pos_agent);
00095 F32 dist = (center_agent - gCamera->getOrigin()).magVec();
00096 F32 alpha_factor = 1.f;
00097
00098 if (mDoFade)
00099 {
00100 if (dist > mFadeDistance)
00101 {
00102 alpha_factor = llmax(0.f, 1.f - (dist - mFadeDistance)/mFadeRange);
00103 }
00104 }
00105
00106 if (alpha_factor < 0.01f)
00107 {
00108 return;
00109 }
00110
00111 LLGLSPipelineAlpha gls_pipeline_alpha;
00112 LLImageGL::unbindTexture(0, GL_TEXTURE_2D);
00113
00114 LLVector3 dir_vec = first_pos_agent - second_pos_agent;
00115 dir_vec.normVec();
00116 dir_vec *= 0.05f;
00117
00118 LLVector3 first_line_pos = first_pos_agent - dir_vec;
00119 LLVector3 second_line_pos = second_pos_agent + dir_vec;
00120
00121 LLColor4 color;
00122
00123
00124 if (mDrawFirst)
00125 {
00126 color = mFirstColor;
00127 color.mV[3] *= alpha_factor;
00128 glColor4fv(color.mV);
00129 glPushMatrix();
00130 glTranslatef(first_pos_agent.mV[0], first_pos_agent.mV[1], first_pos_agent.mV[2]);
00131 glScalef(0.1f, 0.1f, 0.1f);
00132 gSphere.render();
00133 glPopMatrix();
00134 }
00135
00136 if (mDrawSecond)
00137 {
00138 color = mSecondColor;
00139 color.mV[3] *= alpha_factor;
00140 glColor4fv(color.mV);
00141 glPushMatrix();
00142 glTranslatef(second_pos_agent.mV[0], second_pos_agent.mV[1], second_pos_agent.mV[2]);
00143 glScalef(0.1f, 0.1f, 0.1f);
00144 gSphere.render();
00145 glPopMatrix();
00146 }
00147
00148 color = mColor;
00149 color.mV[3] *= alpha_factor;
00150 glColor4fv(color.mV);
00151 glBegin(GL_LINES);
00152 glVertex3fv(first_line_pos.mV);
00153 glVertex3fv(second_line_pos.mV);
00154 glEnd();
00155
00156 {
00157 LLGLDepthTest gls_depth(GL_FALSE);
00158
00159 if (mDrawFirst)
00160 {
00161 color = mFirstColor;
00162 color.mV[3] *= 0.25f*alpha_factor;
00163 glColor4fv(color.mV);
00164 glPushMatrix();
00165 glTranslatef(first_pos_agent.mV[0], first_pos_agent.mV[1], first_pos_agent.mV[2]);
00166 glScalef(0.1f, 0.1f, 0.1f);
00167 gSphere.render();
00168 glPopMatrix();
00169 }
00170 if (mDrawSecond)
00171 {
00172 color = mSecondColor;
00173 color.mV[3] *= 0.25f*alpha_factor;
00174 glColor4fv(color.mV);
00175 glPushMatrix();
00176 glTranslatef(second_pos_agent.mV[0], second_pos_agent.mV[1], second_pos_agent.mV[2]);
00177 glScalef(0.1f, 0.1f, 0.1f);
00178 gSphere.render();
00179 glPopMatrix();
00180 }
00181 {
00182 LLGLSNoTexture no_texture;
00183 color = mColor;
00184 color.mV[3] *= 0.25f*alpha_factor;
00185 glColor4fv(color.mV);
00186 glBegin(GL_LINES);
00187 glVertex3fv(first_line_pos.mV);
00188 glVertex3fv(second_line_pos.mV);
00189 glEnd();
00190 }
00191 }
00192
00193 LLFontGL *fontp = LLFontGL::sSansSerif;
00194 if (mLabel.size())
00195 {
00196 hud_render_utf8text(mLabel, center_agent, *fontp, LLFontGL::NORMAL, -0.5f*fontp->getWidthF32(mLabel), 0, LLColor4::white, FALSE);
00197 }
00198 }
00199
00200 void LLHUDConnector::setZCompare(const BOOL zcompare)
00201 {
00202 mZCompare = zcompare;
00203 }
00204
00205 void LLHUDConnector::setColors(const LLColor4 &color, const LLColor4 &first_color, const LLColor4 &second_color)
00206 {
00207 mColor = color;
00208 mFirstColor = first_color;
00209 mSecondColor = second_color;
00210 }
00211
00212 void LLHUDConnector::setDoFade(const BOOL do_fade)
00213 {
00214 mDoFade = do_fade;
00215 }
00216
00217 void LLHUDConnector::setEndpoints(const BOOL &first, const BOOL &second)
00218 {
00219 mDrawFirst = first;
00220 mDrawSecond = second;
00221 }