lltoolmorph.cpp

Go to the documentation of this file.
00001 
00032 #include "llviewerprecompiledheaders.h"
00033 
00034 // File includes
00035 #include "lltoolmorph.h" 
00036 
00037 // Library includes
00038 #include "audioengine.h"
00039 #include "llviewercontrol.h"
00040 #include "llfontgl.h"
00041 #include "sound_ids.h"
00042 #include "v3math.h"
00043 #include "v3color.h"
00044 
00045 // Viewer includes
00046 #include "llagent.h"
00047 #include "lldrawable.h"
00048 #include "lldrawpoolavatar.h"
00049 #include "llface.h"
00050 #include "llfloatercustomize.h"
00051 #include "llmorphview.h"
00052 #include "llresmgr.h"
00053 #include "llselectmgr.h"
00054 #include "llsky.h"
00055 #include "lltexlayer.h"
00056 #include "lltoolmgr.h"
00057 #include "lltoolview.h"
00058 #include "llui.h"
00059 #include "llviewercamera.h"
00060 #include "llviewerimagelist.h"
00061 #include "llviewerobject.h"
00062 #include "llviewerwindow.h"
00063 #include "llvoavatar.h"
00064 #include "pipeline.h"
00065 #include "viewer.h"
00066 
00067 //LLToolMorph *gToolMorph = NULL;
00068 
00069 //static
00070 LLLinkedList<LLVisualParamHint> LLVisualParamHint::sInstances;
00071 BOOL LLVisualParamReset::sDirty = FALSE;
00072 
00073 //-----------------------------------------------------------------------------
00074 // LLVisualParamHint()
00075 //-----------------------------------------------------------------------------
00076 
00077 // static
00078 LLVisualParamHint::LLVisualParamHint(
00079         S32 pos_x, S32 pos_y,
00080         S32 width, S32 height, 
00081         LLViewerJointMesh *mesh, 
00082         LLViewerVisualParam *param,
00083         F32 param_weight)
00084         :
00085         LLDynamicTexture(width, height, 3, LLDynamicTexture::ORDER_MIDDLE, TRUE ),
00086         mNeedsUpdate( TRUE ),
00087         mIsVisible( FALSE ),
00088         mJointMesh( mesh ),
00089         mVisualParam( param ),
00090         mVisualParamWeight( param_weight ),
00091         mAllowsUpdates( TRUE ),
00092         mDelayFrames( 0 ),
00093         mRect( pos_x, pos_y + height, pos_x + width, pos_y ),
00094         mLastParamWeight(0.f)
00095 {
00096         LLVisualParamHint::sInstances.addData( this );
00097         LLUUID id;
00098         id.set( gViewerArt.getString("avatar_thumb_bkgrnd.tga") );
00099         mBackgroundp = gImageList.getImage(id, FALSE, TRUE);
00100 
00101 
00102         llassert(width != 0);
00103         llassert(height != 0);
00104 }
00105 
00106 //-----------------------------------------------------------------------------
00107 // ~LLVisualParamHint()
00108 //-----------------------------------------------------------------------------
00109 LLVisualParamHint::~LLVisualParamHint()
00110 {
00111         LLVisualParamHint::sInstances.removeData( this );
00112 }
00113 
00114 //-----------------------------------------------------------------------------
00115 // static
00116 // requestHintUpdates()
00117 // Requests updates for all instances (excluding two possible exceptions)  Grungy but efficient.
00118 //-----------------------------------------------------------------------------
00119 void LLVisualParamHint::requestHintUpdates( LLVisualParamHint* exception1, LLVisualParamHint* exception2 )
00120 {
00121         S32 delay_frames = 0;
00122         for(LLVisualParamHint* instance = sInstances.getFirstData();
00123                 instance;
00124                 instance = sInstances.getNextData())
00125         {
00126                 if( (instance != exception1) && (instance != exception2) )
00127                 {
00128                         if( instance->mAllowsUpdates )
00129                         {
00130                                 instance->mNeedsUpdate = TRUE;
00131                                 instance->mDelayFrames = delay_frames;
00132                                 delay_frames++;
00133                         }
00134                         else
00135                         {
00136                                 instance->mNeedsUpdate = TRUE;
00137                                 instance->mDelayFrames = 0;
00138                         }
00139                 }
00140         }
00141 }
00142 
00143 BOOL LLVisualParamHint::needsRender()
00144 {
00145         return mNeedsUpdate && mDelayFrames-- <= 0 && !gAgent.getAvatarObject()->mAppearanceAnimating && mAllowsUpdates;
00146 }
00147 
00148 void LLVisualParamHint::preRender(BOOL clear_depth)
00149 {
00150         LLVOAvatar* avatarp = gAgent.getAvatarObject();
00151 
00152         mLastParamWeight = avatarp->getVisualParamWeight(mVisualParam);
00153         avatarp->setVisualParamWeight(mVisualParam, mVisualParamWeight);
00154         avatarp->setVisualParamWeight("Blink_Left", 0.f);
00155         avatarp->setVisualParamWeight("Blink_Right", 0.f);
00156         avatarp->updateComposites();
00157         avatarp->updateVisualParams();
00158         avatarp->updateGeometry(avatarp->mDrawable);
00159         avatarp->updateLOD();
00160 
00161         LLDynamicTexture::preRender(clear_depth);
00162 }
00163 
00164 //-----------------------------------------------------------------------------
00165 // render()
00166 //-----------------------------------------------------------------------------
00167 BOOL LLVisualParamHint::render()
00168 {
00169         LLVisualParamReset::sDirty = TRUE;
00170         LLVOAvatar* avatarp = gAgent.getAvatarObject();
00171 
00172         glMatrixMode(GL_PROJECTION);
00173         glPushMatrix();
00174         glLoadIdentity();
00175         glOrtho(0.0f, mWidth, 0.0f, mHeight, -1.0f, 1.0f);
00176 
00177         glMatrixMode(GL_MODELVIEW);
00178         glPushMatrix();
00179         glLoadIdentity();
00180 
00181         LLGLSUIDefault gls_ui;
00182         //LLGLState::verify(TRUE);
00183         LLViewerImage::bindTexture(mBackgroundp);
00184         glColor4f(1.f, 1.f, 1.f, 1.f);
00185         gl_rect_2d_simple_tex( mWidth, mHeight );
00186         mBackgroundp->unbindTexture(0, GL_TEXTURE_2D);
00187 
00188         glMatrixMode(GL_PROJECTION);
00189         glPopMatrix();
00190 
00191         glMatrixMode(GL_MODELVIEW);
00192         glPopMatrix();
00193 
00194         mNeedsUpdate = FALSE;
00195         mIsVisible = TRUE;
00196 
00197         LLViewerJointMesh* cam_target_joint = NULL;
00198         const std::string& cam_target_mesh_name = mVisualParam->getCameraTargetName();
00199         if( !cam_target_mesh_name.empty() )
00200         {
00201                 cam_target_joint = (LLViewerJointMesh*)avatarp->getJoint( cam_target_mesh_name );
00202         }
00203         if( !cam_target_joint )
00204         {
00205                 cam_target_joint = (LLViewerJointMesh*)gMorphView->getCameraTargetJoint();
00206         }
00207         if( !cam_target_joint )
00208         {
00209                 cam_target_joint = (LLViewerJointMesh*)avatarp->getJoint("mHead");
00210         }
00211 
00212         LLQuaternion avatar_rotation;
00213         LLJoint* root_joint = avatarp->getRootJoint();
00214         if( root_joint )
00215         {
00216                 avatar_rotation = root_joint->getWorldRotation();
00217         }
00218 
00219         LLVector3 target_joint_pos = cam_target_joint->getWorldPosition();
00220 
00221         LLVector3 target_offset( 0, 0, mVisualParam->getCameraElevation() );
00222         LLVector3 target_pos = target_joint_pos + (target_offset * avatar_rotation);
00223 
00224         F32 cam_angle_radians = mVisualParam->getCameraAngle() * DEG_TO_RAD;
00225         LLVector3 camera_snapshot_offset( 
00226                 mVisualParam->getCameraDistance() * cosf( cam_angle_radians ),
00227                 mVisualParam->getCameraDistance() * sinf( cam_angle_radians ),
00228                 mVisualParam->getCameraElevation() );
00229         LLVector3 camera_pos = target_joint_pos + (camera_snapshot_offset * avatar_rotation);
00230         
00231         gCamera->setAspect((F32)mWidth / (F32)mHeight);
00232         gCamera->setOriginAndLookAt(
00233                 camera_pos,             // camera
00234                 LLVector3(0.f, 0.f, 1.f),                                               // up
00235                 target_pos );   // point of interest
00236 
00237         gCamera->setPerspective(FALSE, mOrigin.mX, mOrigin.mY, mWidth, mHeight, FALSE);
00238 
00239         if (avatarp->mDrawable.notNull())
00240         {
00241                 LLDrawPoolAvatar *avatarPoolp = (LLDrawPoolAvatar *)avatarp->mDrawable->getFace(0)->getPool();
00242                 LLGLDepthTest gls_depth(GL_TRUE, GL_TRUE);
00243                 avatarPoolp->renderAvatars(avatarp);  // renders only one avatar
00244         }
00245         avatarp->setVisualParamWeight(mVisualParam, mLastParamWeight);
00246         
00247         return TRUE;
00248 }
00249 
00250 
00251 //-----------------------------------------------------------------------------
00252 // draw()
00253 //-----------------------------------------------------------------------------
00254 void LLVisualParamHint::draw()
00255 {
00256         if (!mIsVisible) return;
00257 
00258         bindTexture();
00259 
00260         glColor4f(1.f, 1.f, 1.f, 1.f);
00261 
00262         LLGLSUIDefault gls_ui;
00263         glBegin(GL_QUADS);
00264         {
00265                 glTexCoord2i(0, 1);
00266                 glVertex2i(0, mHeight);
00267                 glTexCoord2i(0, 0);
00268                 glVertex2i(0, 0);
00269                 glTexCoord2i(1, 0);
00270                 glVertex2i(mWidth, 0);
00271                 glTexCoord2i(1, 1);
00272                 glVertex2i(mWidth, mHeight);
00273         }
00274         glEnd();
00275 
00276         LLImageGL::unbindTexture(0, GL_TEXTURE_2D);
00277 }
00278 
00279 //-----------------------------------------------------------------------------
00280 // LLVisualParamReset()
00281 //-----------------------------------------------------------------------------
00282 LLVisualParamReset::LLVisualParamReset() : LLDynamicTexture(1, 1, 1, ORDER_RESET, FALSE)
00283 {       
00284 }
00285 
00286 //-----------------------------------------------------------------------------
00287 // render()
00288 //-----------------------------------------------------------------------------
00289 BOOL LLVisualParamReset::render()
00290 {
00291         if (sDirty)
00292         {
00293                 LLVOAvatar* avatarp = gAgent.getAvatarObject();
00294                 avatarp->updateComposites();
00295                 avatarp->updateVisualParams();
00296                 avatarp->updateGeometry(avatarp->mDrawable);
00297                 sDirty = FALSE;
00298         }
00299 
00300         return FALSE;
00301 }

Generated on Thu Jul 1 06:09:22 2010 for Second Life Viewer by  doxygen 1.4.7