llhudconnector.cpp

Go to the documentation of this file.
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         // Spheres on ends of connectors
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                 // Spheres on ends of connectors
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 }

Generated on Thu Jul 1 06:08:42 2010 for Second Life Viewer by  doxygen 1.4.7