00001 
00037 #include "llviewerprecompiledheaders.h"
00038 
00039 #include "llviewercontrol.h"
00040 
00041 #include "llgl.h"
00042 #include "llglheaders.h"
00043 #include "llparcel.h"
00044 #include "llui.h"
00045 
00046 #include "lldrawable.h"
00047 #include "lltextureentry.h"
00048 #include "llviewercamera.h"
00049 
00050 #include "llvoavatar.h"
00051 #include "llagent.h"
00052 #include "lltoolmgr.h"
00053 #include "llselectmgr.h"
00054 #include "llhudmanager.h"
00055 #include "llsphere.h"
00056 #include "llviewerobjectlist.h"
00057 #include "lltoolselectrect.h"
00058 #include "llviewerwindow.h"
00059 #include "viewer.h"
00060 #include "llcompass.h"
00061 #include "llsurface.h"
00062 #include "llwind.h"
00063 #include "llworld.h"
00064 #include "llviewerparcelmgr.h"
00065 #include "llviewerregion.h"
00066 #include "llpreviewtexture.h"
00067 #include "llresmgr.h"
00068 #include "pipeline.h"
00069  
00070 BOOL LLAgent::setLookAt(ELookAtType target_type, LLViewerObject *object, LLVector3 position)
00071 {
00072         if(object && object->isAttachment())
00073         {
00074                 LLViewerObject* parent = object;
00075                 while(parent)
00076                 {
00077                         if (parent == mAvatarObject)
00078                         {
00079                                 
00080                                 object = mAvatarObject;
00081                                 position.clearVec();
00082                         }
00083                         parent = (LLViewerObject*)parent->getParent();
00084                 }
00085         }
00086         if(!mLookAt || mLookAt->isDead())
00087         {
00088                 mLookAt = (LLHUDEffectLookAt *)gHUDManager->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_LOOKAT);
00089                 mLookAt->setSourceObject(mAvatarObject);
00090         }
00091 
00092         return mLookAt->setLookAt(target_type, object, position);
00093 }
00094 
00095 BOOL LLAgent::setPointAt(EPointAtType target_type, LLViewerObject *object, LLVector3 position)
00096 {
00097         
00098         if (object && (object->isAttachment() || object->isAvatar()))
00099         {
00100                 return FALSE;
00101         }
00102 
00103         if(!mPointAt || mPointAt->isDead())
00104         {
00105                 mPointAt = (LLHUDEffectPointAt *)gHUDManager->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_POINTAT);
00106                 mPointAt->setSourceObject(mAvatarObject);
00107         }
00108 
00109         return mPointAt->setPointAt(target_type, object, position);
00110 }
00111 
00112 ELookAtType LLAgent::getLookAtType()
00113 { 
00114         if (mLookAt) 
00115         {
00116                 return mLookAt->getLookAtType();
00117         }
00118 
00119         return LOOKAT_TARGET_NONE;
00120 }
00121 
00122 EPointAtType LLAgent::getPointAtType()
00123 { 
00124         if (mPointAt) 
00125         {
00126                 return mPointAt->getPointAtType();
00127         }
00128 
00129         return POINTAT_TARGET_NONE;
00130 }
00131 
00132 
00133 void LLAgent::renderAutoPilotTarget()
00134 {
00135         if (mAutoPilot)
00136         {
00137                 F32 height_meters;
00138                 LLVector3d target_global;
00139 
00140                 glMatrixMode(GL_MODELVIEW);
00141                 glPushMatrix();
00142 
00143                 
00144                 LLGLSNoTexture no_texture;
00145 
00146                 
00147                 glColor4f(0.f, 1.f, 1.f, 1.f);
00148 
00149                 target_global = mAutoPilotTargetGlobal;
00150 
00151                 glTranslatef((F32)(target_global.mdV[VX]), (F32)(target_global.mdV[VY]), (F32)(target_global.mdV[VZ]));
00152 
00153                 
00154 
00155 
00156 
00157 
00158 
00159 
00160 
00161 
00162 
00163 
00164 
00165 
00166 
00167 
00168 
00169                 height_meters = 1.f;
00170 
00171                 glScalef(height_meters, height_meters, height_meters);
00172 
00173                 gSphere.render(1500.f);
00174 
00175                 glPopMatrix();
00176         }
00177 }
00178 
00179 extern BOOL gDebugSelect;
00180 
00181 
00182 void LLToolSelectRect::handleRectangleSelection(S32 x, S32 y, MASK mask)
00183 {
00184         LLVector3 av_pos = gAgent.getPositionAgent();
00185         F32 select_dist_squared = gSavedSettings.getF32("MaxSelectDistance");
00186         select_dist_squared = select_dist_squared * select_dist_squared;
00187 
00188         BOOL deselect = (mask == MASK_CONTROL);
00189         S32 left =      llmin(x, mDragStartX);
00190         S32 right =     llmax(x, mDragStartX);
00191         S32 top =       llmax(y, mDragStartY);
00192         S32 bottom =llmin(y, mDragStartY);
00193 
00194         left = llround((F32) left * LLUI::sGLScaleFactor.mV[VX]);
00195         right = llround((F32) right * LLUI::sGLScaleFactor.mV[VX]);
00196         top = llround((F32) top * LLUI::sGLScaleFactor.mV[VY]);
00197         bottom = llround((F32) bottom * LLUI::sGLScaleFactor.mV[VY]);
00198 
00199         F32 old_far_plane = gCamera->getFar();
00200         F32 old_near_plane = gCamera->getNear();
00201 
00202         S32 width = right - left + 1;
00203         S32 height = top - bottom + 1;
00204 
00205         BOOL grow_selection = FALSE;
00206         BOOL shrink_selection = FALSE;
00207 
00208         if (height > mDragLastHeight || width > mDragLastWidth)
00209         {
00210                 grow_selection = TRUE;
00211         }
00212         if (height < mDragLastHeight || width < mDragLastWidth)
00213         {
00214                 shrink_selection = TRUE;
00215         }
00216 
00217         if (!grow_selection && !shrink_selection)
00218         {
00219                 
00220                 return;
00221         }
00222 
00223         mDragLastHeight = height;
00224         mDragLastWidth = width;
00225 
00226         S32 center_x = (left + right) / 2;
00227         S32 center_y = (top + bottom) / 2;
00228 
00229         
00230         glMatrixMode(GL_PROJECTION);
00231         glPushMatrix();
00232 
00233         BOOL limit_select_distance = gSavedSettings.getBOOL("LimitSelectDistance");
00234         if (limit_select_distance)
00235         {
00236                 
00237                 LLVector3 relative_av_pos = av_pos;
00238                 relative_av_pos -= gCamera->getOrigin();
00239 
00240                 F32 new_far = relative_av_pos * gCamera->getAtAxis() + gSavedSettings.getF32("MaxSelectDistance");
00241                 F32 new_near = relative_av_pos * gCamera->getAtAxis() - gSavedSettings.getF32("MaxSelectDistance");
00242 
00243                 new_near = llmax(new_near, 0.1f);
00244 
00245                 gCamera->setFar(new_far);
00246                 gCamera->setNear(new_near);
00247         }
00248         gCamera->setPerspective(FOR_SELECTION, 
00249                                                         center_x-width/2, center_y-height/2, width, height, 
00250                                                         limit_select_distance);
00251 
00252         if (shrink_selection)
00253         {
00254                 struct f : public LLSelectedObjectFunctor
00255                 {
00256                         virtual bool apply(LLViewerObject* vobjp)
00257                         {
00258                                 LLDrawable* drawable = vobjp->mDrawable;
00259                                 if (!drawable || vobjp->getPCode() != LL_PCODE_VOLUME || vobjp->isAttachment())
00260                                 {
00261                                         return true;
00262                                 }
00263                                 S32 result = gCamera->sphereInFrustum(drawable->getPositionAgent(), drawable->getRadius());
00264                                 switch (result)
00265                                 {
00266                                   case 0:
00267                                         gSelectMgr->unhighlightObjectOnly(vobjp);
00268                                         break;
00269                                   case 1:
00270                                         
00271                                         if (!gCamera->areVertsVisible(vobjp, LLSelectMgr::sRectSelectInclusive))
00272                                         {
00273                                                 gSelectMgr->unhighlightObjectOnly(vobjp);
00274                                         }
00275                                         break;
00276                                   default:
00277                                         break;
00278                                 }
00279                                 return true;
00280                         }
00281                 } func;
00282                 gSelectMgr->getHighlightedObjects()->applyToObjects(&func);
00283         }
00284 
00285         if (grow_selection)
00286         {
00287                 std::vector<LLDrawable*> potentials;
00288                 
00289                 
00290                 for (U32 i = 0; i < LLPipeline::NUM_PARTITIONS-1; i++)
00291                 {
00292                         LLSpatialPartition* part = gPipeline.getSpatialPartition(i);
00293                         if (part)
00294                         {
00295                                 part->cull(*gCamera, &potentials, TRUE);
00296                         }
00297                 }
00298                 
00299                 for (std::vector<LLDrawable*>::iterator iter = potentials.begin();
00300                          iter != potentials.end(); iter++)
00301                 {
00302                         LLDrawable* drawable = *iter;
00303                         LLViewerObject* vobjp = drawable->getVObj();
00304 
00305                         if (!drawable || !vobjp ||
00306                                 vobjp->getPCode() != LL_PCODE_VOLUME || 
00307                                 vobjp->isAttachment() ||
00308                                 (deselect && !vobjp->isSelected()))
00309                         {
00310                                 continue;
00311                         }
00312 
00313                         if (limit_select_distance && dist_vec_squared(drawable->getWorldPosition(), av_pos) > select_dist_squared)
00314                         {
00315                                 continue;
00316                         }
00317 
00318                         S32 result = gCamera->sphereInFrustum(drawable->getPositionAgent(), drawable->getRadius());
00319                         if (result)
00320                         {
00321                                 switch (result)
00322                                 {
00323                                 case 1:
00324                                         
00325                                         if (gCamera->areVertsVisible(vobjp, LLSelectMgr::sRectSelectInclusive))
00326                                         {
00327                                                 gSelectMgr->highlightObjectOnly(vobjp);
00328                                         }
00329                                         break;
00330                                 case 2:
00331                                         gSelectMgr->highlightObjectOnly(vobjp);
00332                                         break;
00333                                 default:
00334                                         break;
00335                                 }
00336                         }
00337                 }
00338         }
00339 
00340         
00341         glMatrixMode(GL_PROJECTION);
00342         glPopMatrix();
00343         glMatrixMode(GL_MODELVIEW);
00344 
00345         
00346         gCamera->setFar(old_far_plane);
00347         gCamera->setNear(old_near_plane);
00348         gViewerWindow->setup3DRender();
00349 }
00350 
00351 
00352 const F32 COMPASS_SIZE = 64;
00353 static const F32 COMPASS_RANGE = 0.33f;
00354 
00355 void LLCompass::draw()
00356 {
00357 
00358 
00359         if (!getVisible()) return;
00360 
00361         glMatrixMode(GL_MODELVIEW);
00362         glPushMatrix();
00363 
00364         S32 width = 32;
00365         S32 height = 32;
00366 
00367         LLGLSUIDefault gls_ui;
00368 
00369         glTranslatef( COMPASS_SIZE/2.f, COMPASS_SIZE/2.f, 0.f);
00370 
00371         if (mBkgndTexture)
00372         {
00373                 mBkgndTexture->bind();
00374                 glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
00375                 
00376                 glBegin(GL_QUADS);
00377                 
00378                 glTexCoord2f(1.f, 1.f);
00379                 glVertex2i(width, height);
00380                 
00381                 glTexCoord2f(0.f, 1.f);
00382                 glVertex2i(-width, height);
00383                 
00384                 glTexCoord2f(0.f, 0.f);
00385                 glVertex2i(-width, -height);
00386                 
00387                 glTexCoord2f(1.f, 0.f);
00388                 glVertex2i(width, -height);
00389                 
00390                 glEnd();
00391         }
00392 
00393         
00394         F32 rotation = atan2( gAgent.getFrameAgent().getAtAxis().mV[VX], gAgent.getFrameAgent().getAtAxis().mV[VY] );
00395         glRotatef( - rotation * RAD_TO_DEG, 0.f, 0.f, -1.f);
00396         
00397         if (mTexture)
00398         {
00399                 mTexture->bind();
00400                 glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
00401                 
00402                 glBegin(GL_QUADS);
00403                 
00404                 glTexCoord2f(1.f, 1.f);
00405                 glVertex2i(width, height);
00406                 
00407                 glTexCoord2f(0.f, 1.f);
00408                 glVertex2i(-width, height);
00409                 
00410                 glTexCoord2f(0.f, 0.f);
00411                 glVertex2i(-width, -height);
00412                 
00413                 glTexCoord2f(1.f, 0.f);
00414                 glVertex2i(width, -height);
00415                 
00416                 glEnd();
00417         }
00418 
00419         glPopMatrix();
00420 
00421 }
00422 
00423 
00424 
00425 void LLHorizontalCompass::draw()
00426 {
00427         if (!getVisible()) return;
00428 
00429         LLGLSUIDefault gls_ui;
00430         
00431         S32 width = mRect.getWidth();
00432         S32 height = mRect.getHeight();
00433         S32 half_width = width / 2;
00434 
00435         if( mTexture )
00436         {
00437                 const LLVector3& at_axis = gCamera->getAtAxis();
00438                 F32 center = atan2( at_axis.mV[VX], at_axis.mV[VY] );
00439 
00440                 center += F_PI;
00441                 center = llclamp( center, 0.0f, F_TWO_PI ); 
00442                 center /= F_TWO_PI;
00443                 F32 left = center - COMPASS_RANGE;
00444                 F32 right = center + COMPASS_RANGE;
00445 
00446                 mTexture->bind();
00447                 glColor4f(1.0f, 1.0f, 1.0f, 1.0f );
00448                 glBegin( GL_QUADS );
00449 
00450                 glTexCoord2f(right, 1.f);
00451                 glVertex2i(width, height);
00452 
00453                 glTexCoord2f(left, 1.f);
00454                 glVertex2i(0, height);
00455 
00456                 glTexCoord2f(left, 0.f);
00457                 glVertex2i(0, 0);
00458 
00459                 glTexCoord2f(right, 0.f);
00460                 glVertex2i(width, 0);
00461 
00462                 glEnd();
00463         }
00464 
00465         
00466         {
00467                 LLGLSNoTexture gls_no_texture;
00468                 glColor4fv( mFocusColor.mV );
00469                 gl_line_2d( half_width, 0, half_width, height );
00470         }
00471 }
00472 
00473 
00474 const F32 WIND_ALTITUDE                 = 180.f;
00475 
00476 
00477 void LLWind::renderVectors()
00478 {
00479         
00480         S32 i,j;
00481         F32 x,y;
00482 
00483         F32 region_width_meters = gWorldPointer->getRegionWidthInMeters();
00484 
00485         LLGLSNoTexture gls_no_texture;
00486         glPushMatrix();
00487         LLVector3 origin_agent;
00488         origin_agent = gAgent.getPosAgentFromGlobal(mOriginGlobal);
00489         glTranslatef(origin_agent.mV[VX], origin_agent.mV[VY], WIND_ALTITUDE);
00490         for (j = 0; j < mSize; j++)
00491         {
00492                 for (i = 0; i < mSize; i++)
00493                 {
00494                         x = mCloudVelX[i + j*mSize] * WIND_SCALE_HACK;
00495                         y = mCloudVelY[i + j*mSize] * WIND_SCALE_HACK;
00496                         glPushMatrix();
00497                         glTranslatef((F32)i * region_width_meters/mSize, (F32)j * region_width_meters/mSize, 0.0);
00498                         glColor3f(0,1,0);
00499                         glBegin(GL_POINTS);
00500                                 glVertex3f(0,0,0);
00501                         glEnd();
00502                         glColor3f(1,0,0);
00503                         glBegin(GL_LINES);
00504                                 glVertex3f(x * 0.1f, y * 0.1f ,0.f);
00505                                 glVertex3f(x, y, 0.f);
00506                         glEnd();
00507                         glPopMatrix();
00508                 }
00509         }
00510         glPopMatrix();
00511 }
00512 
00513 
00514 
00515 
00516 
00517 void LLViewerParcelMgr::renderRect(const LLVector3d &west_south_bottom_global, 
00518                                                                    const LLVector3d &east_north_top_global )
00519 {
00520         LLGLSUIDefault gls_ui;
00521         LLGLSNoTexture gls_no_texture;
00522         LLGLDepthTest gls_depth(GL_TRUE);
00523 
00524         LLVector3 west_south_bottom_agent = gAgent.getPosAgentFromGlobal(west_south_bottom_global);
00525         F32 west        = west_south_bottom_agent.mV[VX];
00526         F32 south       = west_south_bottom_agent.mV[VY];
00527 
00528 
00529         LLVector3 east_north_top_agent = gAgent.getPosAgentFromGlobal(east_north_top_global);
00530         F32 east        = east_north_top_agent.mV[VX];
00531         F32 north       = east_north_top_agent.mV[VY];
00532 
00533 
00534         
00535         
00536         const F32 FUDGE = 0.01f;
00537 
00538         F32 sw_bottom = gWorldp->resolveLandHeightAgent( LLVector3( west, south, 0.f ) );
00539         F32 se_bottom = gWorldp->resolveLandHeightAgent( LLVector3( east-FUDGE, south, 0.f ) );
00540         F32 ne_bottom = gWorldp->resolveLandHeightAgent( LLVector3( east-FUDGE, north-FUDGE, 0.f ) );
00541         F32 nw_bottom = gWorldp->resolveLandHeightAgent( LLVector3( west, north-FUDGE, 0.f ) );
00542 
00543         F32 sw_top = sw_bottom + PARCEL_POST_HEIGHT;
00544         F32 se_top = se_bottom + PARCEL_POST_HEIGHT;
00545         F32 ne_top = ne_bottom + PARCEL_POST_HEIGHT;
00546         F32 nw_top = nw_bottom + PARCEL_POST_HEIGHT;
00547 
00548         LLUI::setLineWidth(2.f);
00549         glColor4f(1.f, 1.f, 0.f, 1.f);
00550 
00551         
00552         glBegin(GL_LINES);
00553 
00554         glVertex3f(west, north, nw_bottom);
00555         glVertex3f(west, north, nw_top);
00556 
00557         glVertex3f(east, north, ne_bottom);
00558         glVertex3f(east, north, ne_top);
00559 
00560         glVertex3f(east, south, se_bottom);
00561         glVertex3f(east, south, se_top);
00562 
00563         glVertex3f(west, south, sw_bottom);
00564         glVertex3f(west, south, sw_top);
00565 
00566         glEnd();
00567 
00568         glColor4f(1.f, 1.f, 0.f, 0.2f);
00569         glBegin(GL_QUADS);
00570 
00571         glVertex3f(west, north, nw_bottom);
00572         glVertex3f(west, north, nw_top);
00573         glVertex3f(east, north, ne_top);
00574         glVertex3f(east, north, ne_bottom);
00575 
00576         glVertex3f(east, north, ne_bottom);
00577         glVertex3f(east, north, ne_top);
00578         glVertex3f(east, south, se_top);
00579         glVertex3f(east, south, se_bottom);
00580 
00581         glVertex3f(east, south, se_bottom);
00582         glVertex3f(east, south, se_top);
00583         glVertex3f(west, south, sw_top);
00584         glVertex3f(west, south, sw_bottom);
00585 
00586         glVertex3f(west, south, sw_bottom);
00587         glVertex3f(west, south, sw_top);
00588         glVertex3f(west, north, nw_top);
00589         glVertex3f(west, north, nw_bottom);
00590 
00591         glEnd();
00592 
00593         LLUI::setLineWidth(1.f);
00594 }
00595 
00596 
00597 
00598 
00599 
00600 
00601 
00602 
00603 
00604 
00605 
00606 
00607 
00608 
00609 
00610 
00611 
00612 
00613 
00614 
00615 
00616 
00617 
00618 
00619 
00620 
00621 
00622 
00623 
00624 
00625 
00626 
00627 
00628 
00629 
00630 
00631 
00632 
00633 
00634 
00635 
00636 
00637 
00638 
00639 
00640 
00641 
00642 
00643 
00644 
00645 
00646 
00647 
00648 
00649 
00650 
00651 
00652 
00653 
00654 
00655 
00656 
00657 
00658 
00659 
00660 
00661 
00662 
00663 
00664 
00665 
00666 
00667 
00668 
00669 
00670 
00671 
00672 
00673 
00674 
00675 
00676 
00677 
00678 
00679 
00680 
00681 
00682 
00683 
00684 
00685 void LLViewerParcelMgr::renderOneSegment(F32 x1, F32 y1, F32 x2, F32 y2, F32 height, U8 direction, LLViewerRegion* regionp)
00686 {
00687         
00688         
00689         const F32 BORDER = REGION_WIDTH_METERS - 0.1f;
00690 
00691         F32 clamped_x1 = x1;
00692         F32 clamped_y1 = y1;
00693         F32 clamped_x2 = x2;
00694         F32 clamped_y2 = y2;
00695 
00696         if (clamped_x1 > BORDER) clamped_x1 = BORDER;
00697         if (clamped_y1 > BORDER) clamped_y1 = BORDER;
00698         if (clamped_x2 > BORDER) clamped_x2 = BORDER;
00699         if (clamped_y2 > BORDER) clamped_y2 = BORDER;
00700 
00701         F32 z;
00702         F32 z1;
00703         F32 z2;
00704 
00705         z1 = regionp->getLand().resolveHeightRegion( LLVector3( clamped_x1, clamped_y1, 0.f ) );
00706         z2 = regionp->getLand().resolveHeightRegion( LLVector3( clamped_x2, clamped_y2, 0.f ) );
00707 
00708         
00709         LLVector3 origin = regionp->getOriginAgent();
00710         x1 += origin.mV[VX];
00711         x2 += origin.mV[VX];
00712         y1 += origin.mV[VY];
00713         y2 += origin.mV[VY];
00714 
00715         if (height < 1.f)
00716         {
00717                 z = z1+height;
00718                 glVertex3f(x1, y1, z);
00719 
00720                 glVertex3f(x1, y1, z1);
00721 
00722                 glVertex3f(x2, y2, z2);
00723 
00724                 z = z2+height;
00725                 glVertex3f(x2, y2, z);
00726         }
00727         else
00728         {
00729                 F32 tex_coord1;
00730                 F32 tex_coord2;
00731 
00732                 if (WEST_MASK == direction)
00733                 {
00734                         tex_coord1 = y1;
00735                         tex_coord2 = y2;
00736                 }
00737                 else if (SOUTH_MASK == direction)
00738                 {
00739                         tex_coord1 = x1;
00740                         tex_coord2 = x2;
00741                 }
00742                 else if (EAST_MASK == direction)
00743                 {
00744                         tex_coord1 = y2;
00745                         tex_coord2 = y1;
00746                 }
00747                 else 
00748                 {
00749                         tex_coord1 = x2;
00750                         tex_coord2 = x1;
00751                 }
00752 
00753 
00754                 glTexCoord2f(tex_coord1*0.5f+0.5f, z1*0.5f);
00755                 glVertex3f(x1, y1, z1);
00756 
00757                 glTexCoord2f(tex_coord2*0.5f+0.5f, z2*0.5f);
00758                 glVertex3f(x2, y2, z2);
00759 
00760                 
00761                 z = llmax(z2+height, z1+height);
00762                 glTexCoord2f(tex_coord2*0.5f+0.5f, z*0.5f);
00763                 glVertex3f(x2, y2, z);
00764 
00765                 glTexCoord2f(tex_coord1*0.5f+0.5f, z*0.5f);
00766                 glVertex3f(x1, y1, z);
00767         }
00768 }
00769 
00770 
00771 void LLViewerParcelMgr::renderHighlightSegments(const U8* segments, LLViewerRegion* regionp)
00772 {
00773         S32 x, y;
00774         F32 x1, y1;     
00775         F32 x2, y2;     
00776 
00777         LLGLSUIDefault gls_ui;
00778         LLGLSNoTexture gls_no_texture;
00779         LLGLDepthTest gls_depth(GL_TRUE);
00780 
00781         glColor4f(1.f, 1.f, 0.f, 0.2f);
00782 
00783         
00784         glBegin(GL_QUADS);
00785 
00786         const S32 STRIDE = (mParcelsPerEdge+1);
00787         for (y = 0; y < STRIDE; y++)
00788         {
00789                 for (x = 0; x < STRIDE; x++)
00790                 {
00791                         U8 segment_mask = segments[x + y*STRIDE];
00792 
00793                         if (segment_mask & SOUTH_MASK)
00794                         {
00795                                 x1 = x * PARCEL_GRID_STEP_METERS;
00796                                 y1 = y * PARCEL_GRID_STEP_METERS;
00797 
00798                                 x2 = x1 + PARCEL_GRID_STEP_METERS;
00799                                 y2 = y1;
00800 
00801                                 renderOneSegment(x1, y1, x2, y2, PARCEL_POST_HEIGHT, SOUTH_MASK, regionp);
00802                         }
00803 
00804                         if (segment_mask & WEST_MASK)
00805                         {
00806                                 x1 = x * PARCEL_GRID_STEP_METERS;
00807                                 y1 = y * PARCEL_GRID_STEP_METERS;
00808 
00809                                 x2 = x1;
00810                                 y2 = y1 + PARCEL_GRID_STEP_METERS;
00811 
00812                                 renderOneSegment(x1, y1, x2, y2, PARCEL_POST_HEIGHT, WEST_MASK, regionp);
00813                         }
00814                 }
00815         }
00816 
00817         glEnd();
00818 }
00819 
00820 
00821 void LLViewerParcelMgr::renderCollisionSegments(U8* segments, BOOL use_pass, LLViewerRegion* regionp)
00822 {
00823 
00824         S32 x, y;
00825         F32 x1, y1;     
00826         F32 x2, y2;     
00827         F32 alpha = 0;
00828         F32 dist = 0;
00829         F32 dx, dy;
00830         F32 collision_height;
00831 
00832         const S32 STRIDE = (mParcelsPerEdge+1);
00833         
00834         LLVector3 pos = gAgent.getPositionAgent();
00835 
00836         F32 pos_x = pos.mV[VX];
00837         F32 pos_y = pos.mV[VY];
00838 
00839         LLGLSUIDefault gls_ui;
00840         LLGLDepthTest gls_depth(GL_TRUE);
00841         LLGLDisable cull(GL_CULL_FACE);
00842         
00843         if (mCollisionBanned == BA_BANNED)
00844         {
00845                 collision_height = BAN_HEIGHT;
00846         }
00847         else
00848         {
00849                 collision_height = PARCEL_HEIGHT;
00850         }
00851 
00852         
00853         if (use_pass && (mCollisionBanned == BA_NOT_ON_LIST))
00854         {
00855                 LLViewerImage::bindTexture(mPassImage);
00856         }
00857         else
00858         {
00859                 LLViewerImage::bindTexture(mBlockedImage);
00860         }
00861 
00862         glBegin(GL_QUADS);
00863 
00864         for (y = 0; y < STRIDE; y++)
00865         {
00866                 for (x = 0; x < STRIDE; x++)
00867                 {
00868                         U8 segment_mask = segments[x + y*STRIDE];
00869                         U8 direction;
00870                         const F32 MAX_ALPHA = 0.95f;
00871                         const S32 DIST_OFFSET = 5;
00872                         const S32 MIN_DIST_SQ = DIST_OFFSET*DIST_OFFSET;
00873                         const S32 MAX_DIST_SQ = 169;
00874 
00875                         if (segment_mask & SOUTH_MASK)
00876                         {
00877                                 x1 = x * PARCEL_GRID_STEP_METERS;
00878                                 y1 = y * PARCEL_GRID_STEP_METERS;
00879 
00880                                 x2 = x1 + PARCEL_GRID_STEP_METERS;
00881                                 y2 = y1;
00882 
00883                                 if (gRenderForSelect)
00884                                 {
00885                                         LLColor4U color((U8)(GL_NAME_PARCEL_WALL >> 16), (U8)(GL_NAME_PARCEL_WALL >> 8), (U8)GL_NAME_PARCEL_WALL);
00886                                         glColor4ubv(color.mV);
00887                                 }
00888                                 else
00889                                 {
00890                                         dy = (pos_y - y1) + DIST_OFFSET;
00891                                         
00892                                         if (pos_x < x1)
00893                                                 dx = pos_x - x1;
00894                                         else if (pos_x > x2)
00895                                                 dx = pos_x - x2;
00896                                         else 
00897                                                 dx = 0;
00898                                         
00899                                         dist = dx*dx+dy*dy;
00900 
00901                                         if (dist < MIN_DIST_SQ)
00902                                                 alpha = MAX_ALPHA;
00903                                         else if (dist > MAX_DIST_SQ)
00904                                                 alpha = 0.0f;
00905                                         else
00906                                                 alpha = 30/dist;
00907 
00908                                         alpha = llclamp(alpha, 0.0f, MAX_ALPHA);
00909 
00910                                         glColor4f(1.f, 1.f, 1.f, alpha);
00911                                 }
00912 
00913                                 if ((pos_y - y1) < 0) direction = SOUTH_MASK;
00914                                 else            direction = NORTH_MASK;
00915 
00916                                 
00917                                 renderOneSegment(x1+0.1f, y1+0.1f, x2+0.1f, y2+0.1f, collision_height, direction, regionp);
00918 
00919                         }
00920 
00921                         if (segment_mask & WEST_MASK)
00922                         {
00923                                 x1 = x * PARCEL_GRID_STEP_METERS;
00924                                 y1 = y * PARCEL_GRID_STEP_METERS;
00925 
00926                                 x2 = x1;
00927                                 y2 = y1 + PARCEL_GRID_STEP_METERS;
00928 
00929                                 if (gRenderForSelect)
00930                                 {
00931                                         LLColor4U color((U8)(GL_NAME_PARCEL_WALL >> 16), (U8)(GL_NAME_PARCEL_WALL >> 8), (U8)GL_NAME_PARCEL_WALL);
00932                                         glColor4ubv(color.mV);
00933                                 }
00934                                 else
00935                                 {                                       
00936                                         dx = (pos_x - x1) + DIST_OFFSET;
00937                 
00938                                         if (pos_y < y1) 
00939                                                 dy = pos_y - y1;
00940                                         else if (pos_y > y2)
00941                                                 dy = pos_y - y2;
00942                                         else 
00943                                                 dy = 0;
00944 
00945                                         dist = dx*dx+dy*dy;
00946                                         
00947                                         if (dist < MIN_DIST_SQ) 
00948                                                 alpha = MAX_ALPHA;
00949                                         else if (dist > MAX_DIST_SQ)
00950                                                 alpha = 0.0f;
00951                                         else
00952                                                 alpha = 30/dist;
00953 
00954                                         alpha = llclamp(alpha, 0.0f, MAX_ALPHA);
00955 
00956                                         glColor4f(1.f, 1.f, 1.f, alpha);
00957                                 }
00958 
00959                                 if ((pos_x - x1) > 0) direction = WEST_MASK;
00960                                 else            direction = EAST_MASK;
00961                                 
00962                                 
00963                                 renderOneSegment(x1+0.1f, y1+0.1f, x2+0.1f, y2+0.1f, collision_height, direction, regionp);
00964 
00965                         }
00966                 }
00967         }
00968 
00969         glEnd();
00970 }
00971 
00972 void draw_line_cube(F32 width, const LLVector3& center)
00973 {
00974         width = 0.5f * width;
00975         glVertex3f(center.mV[VX] + width ,center.mV[VY] + width,center.mV[VZ] + width);
00976         glVertex3f(center.mV[VX] - width ,center.mV[VY] + width,center.mV[VZ] + width);
00977         glVertex3f(center.mV[VX] - width ,center.mV[VY] + width,center.mV[VZ] + width);
00978         glVertex3f(center.mV[VX] - width ,center.mV[VY] - width,center.mV[VZ] + width);
00979         glVertex3f(center.mV[VX] - width ,center.mV[VY] - width,center.mV[VZ] + width);
00980         glVertex3f(center.mV[VX] + width ,center.mV[VY] - width,center.mV[VZ] + width);
00981         glVertex3f(center.mV[VX] + width ,center.mV[VY] - width,center.mV[VZ] + width);
00982         glVertex3f(center.mV[VX] + width ,center.mV[VY] + width,center.mV[VZ] + width);
00983 
00984         glVertex3f(center.mV[VX] + width ,center.mV[VY] + width,center.mV[VZ] - width);
00985         glVertex3f(center.mV[VX] - width ,center.mV[VY] + width,center.mV[VZ] - width);
00986         glVertex3f(center.mV[VX] - width ,center.mV[VY] + width,center.mV[VZ] - width);
00987         glVertex3f(center.mV[VX] - width ,center.mV[VY] - width,center.mV[VZ] - width);
00988         glVertex3f(center.mV[VX] - width ,center.mV[VY] - width,center.mV[VZ] - width);
00989         glVertex3f(center.mV[VX] + width ,center.mV[VY] - width,center.mV[VZ] - width);
00990         glVertex3f(center.mV[VX] + width ,center.mV[VY] - width,center.mV[VZ] - width);
00991         glVertex3f(center.mV[VX] + width ,center.mV[VY] + width,center.mV[VZ] - width);
00992 
00993         glVertex3f(center.mV[VX] + width ,center.mV[VY] + width,center.mV[VZ] + width);
00994         glVertex3f(center.mV[VX] + width ,center.mV[VY] + width,center.mV[VZ] - width);
00995         glVertex3f(center.mV[VX] - width ,center.mV[VY] + width,center.mV[VZ] + width);
00996         glVertex3f(center.mV[VX] - width ,center.mV[VY] + width,center.mV[VZ] - width);
00997         glVertex3f(center.mV[VX] - width ,center.mV[VY] - width,center.mV[VZ] + width);
00998         glVertex3f(center.mV[VX] - width ,center.mV[VY] - width,center.mV[VZ] - width);
00999         glVertex3f(center.mV[VX] + width ,center.mV[VY] - width,center.mV[VZ] + width);
01000         glVertex3f(center.mV[VX] + width ,center.mV[VY] - width,center.mV[VZ] - width);
01001 }
01002 
01003 
01004 void LLViewerObjectList::renderObjectBeacons()
01005 {
01006         S32 i;
01007         
01008 
01009         LLGLSUIDefault gls_ui;
01010 
01011         S32 last_line_width = -1;
01012         
01013         {
01014                 LLGLSNoTexture gls_ui_no_texture;
01015                 glBegin(GL_LINES);
01016                 for (i = 0; i < mDebugBeacons.count(); i++)
01017                 {
01018                         const LLDebugBeacon &debug_beacon = mDebugBeacons[i];
01019                         LLColor4 color = debug_beacon.mColor;
01020                         color.mV[3] *= 0.25f;
01021                         S32 line_width = debug_beacon.mLineWidth;
01022                         if (line_width != last_line_width)
01023                         {
01024                                 glEnd();
01025                                 glLineWidth( (F32)line_width );
01026                                 last_line_width = line_width;
01027                                 glBegin(GL_LINES);
01028                         }
01029 
01030                         const LLVector3 &thisline = debug_beacon.mPositionAgent;
01031                         glColor4fv(color.mV);
01032                         glVertex3f(thisline.mV[VX],thisline.mV[VY],thisline.mV[VZ] - 50.f);
01033                         glVertex3f(thisline.mV[VX],thisline.mV[VY],thisline.mV[VZ] + 50.f);
01034                         glVertex3f(thisline.mV[VX] - 2.f,thisline.mV[VY],thisline.mV[VZ]);
01035                         glVertex3f(thisline.mV[VX] + 2.f,thisline.mV[VY],thisline.mV[VZ]);
01036                         glVertex3f(thisline.mV[VX],thisline.mV[VY] - 2.f,thisline.mV[VZ]);
01037                         glVertex3f(thisline.mV[VX],thisline.mV[VY] + 2.f,thisline.mV[VZ]);
01038 
01039                         draw_line_cube(0.10f, thisline);
01040                 }
01041                 glEnd();
01042         }
01043 
01044         {
01045                 LLGLSNoTexture gls_ui_no_texture;
01046                 LLGLDepthTest gls_depth(GL_TRUE);
01047                 
01048                 glBegin(GL_LINES);
01049                 last_line_width = -1;
01050                 for (i = 0; i < mDebugBeacons.count(); i++)
01051                 {
01052                         const LLDebugBeacon &debug_beacon = mDebugBeacons[i];
01053 
01054                         S32 line_width = debug_beacon.mLineWidth;
01055                         if (line_width != last_line_width)
01056                         {
01057                                 glEnd();
01058                                 glLineWidth( (F32)line_width );
01059                                 last_line_width = line_width;
01060                                 glBegin(GL_LINES);
01061                         }
01062 
01063                         const LLVector3 &thisline = debug_beacon.mPositionAgent;
01064                         glColor4fv(debug_beacon.mColor.mV);
01065                         glVertex3f(thisline.mV[VX],thisline.mV[VY],thisline.mV[VZ] - 0.5f);
01066                         glVertex3f(thisline.mV[VX],thisline.mV[VY],thisline.mV[VZ] + 0.5f);
01067                         glVertex3f(thisline.mV[VX] - 0.5f,thisline.mV[VY],thisline.mV[VZ]);
01068                         glVertex3f(thisline.mV[VX] + 0.5f,thisline.mV[VY],thisline.mV[VZ]);
01069                         glVertex3f(thisline.mV[VX],thisline.mV[VY] - 0.5f,thisline.mV[VZ]);
01070                         glVertex3f(thisline.mV[VX],thisline.mV[VY] + 0.5f,thisline.mV[VZ]);
01071 
01072                         draw_line_cube(0.10f, thisline);
01073                 }
01074                 glEnd();
01075         
01076                 glLineWidth(1.f);
01077 
01078                 for (i = 0; i < mDebugBeacons.count(); i++)
01079                 {
01080                         LLDebugBeacon &debug_beacon = mDebugBeacons[i];
01081                         if (debug_beacon.mString == "")
01082                         {
01083                                 continue;
01084                         }
01085                         LLHUDText *hud_textp = (LLHUDText *)LLHUDObject::addHUDObject(LLHUDObject::LL_HUD_TEXT);
01086 
01087                         hud_textp->setZCompare(FALSE);
01088                         LLColor4 color;
01089                         color = debug_beacon.mTextColor;
01090                         color.mV[3] *= 1.f;
01091 
01092                         hud_textp->setString(utf8str_to_wstring(debug_beacon.mString.c_str()));
01093                         hud_textp->setColor(color);
01094                         hud_textp->setPositionAgent(debug_beacon.mPositionAgent);
01095                         debug_beacon.mHUDObject = hud_textp;
01096                 }
01097         }
01098 }
01099 
01100 
01101 void pre_show_depth_buffer()
01102 {
01103         glClear(GL_STENCIL_BUFFER_BIT);
01104         glEnable(GL_STENCIL_TEST);
01105         glStencilFunc(GL_ALWAYS,0,0);
01106         glStencilOp(GL_INCR,GL_INCR,GL_INCR);
01107 }
01108 
01109 void post_show_depth_buffer()
01110 {
01111         int xsize =500, ysize =500;
01112         U8 *buf = new U8[xsize*ysize];
01113 
01114         glReadPixels(0,0,xsize,ysize,GL_STENCIL_INDEX,GL_UNSIGNED_BYTE, buf);
01115 
01116         int total = 0;
01117         int i;
01118         for (i=0;i<xsize*ysize;i++) 
01119         {
01120                 total += buf[i];
01121                 buf[i] <<= 3;
01122         }
01123 
01124         float DC = (float)total/(float)(ysize*xsize);
01125         int DCline = llfloor((xsize-20) * DC / 10.0f);
01126         int stride = xsize / 10;
01127 
01128         int y = 2;
01129 
01130         for (i=0;i<DCline;i++)
01131         {
01132                 if (i % stride == 0) i+=2;
01133                 if (i > xsize) y=6;
01134                 buf[ysize*(y+0)+i]=255;
01135                 buf[ysize*(y+1)+i]=255;
01136                 buf[ysize*(y+2)+i]=255;
01137         }
01138         glDrawPixels(xsize,ysize,GL_RED,GL_UNSIGNED_BYTE,buf);
01139 
01140         delete [] buf;
01141 }