llmapresponders.cpp

Go to the documentation of this file.
00001 
00032 #include "llviewerprecompiledheaders.h"
00033 
00034 #include "llmapresponders.h"
00035 
00036 #include "llfloaterworldmap.h"
00037 #include "llviewerimagelist.h"
00038 #include "llworldmap.h"
00039 #include "llagent.h"
00040 
00041 //virtual 
00042 void LLMapLayerResponder::result(const LLSD& result)
00043 {
00044         llinfos << "LLMapLayerResponder::result from capabilities" << llendl;
00045 
00046         S32 agent_flags = result["AgentData"]["Flags"];
00047         
00048         if (agent_flags != LLWorldMap::getInstance()->mCurrentMap)
00049         {
00050                 llwarns << "Invalid or out of date map image type returned!" << llendl;
00051                 return;
00052         }
00053 
00054         LLUUID image_id;
00055         //U32 left, right, top, bottom;
00056 
00057         LLWorldMap::getInstance()->mMapLayers[agent_flags].clear();
00058 
00059         LLSD::array_const_iterator iter;
00060         BOOL adjust = FALSE;
00061         for(iter = result["LayerData"].beginArray(); iter != result["LayerData"].endArray(); ++iter)
00062         {
00063                 const LLSD& layer_data = *iter;
00064                 
00065                 LLWorldMapLayer new_layer;
00066                 new_layer.LayerDefined = TRUE;
00067                 new_layer.LayerImageID = layer_data["ImageID"];
00068                 new_layer.LayerImage = gImageList.getImage(new_layer.LayerImageID, MIPMAP_TRUE, FALSE);
00069                 new_layer.LayerImage->bindTexture(0);
00070                 new_layer.LayerImage->setClamp(TRUE, TRUE);
00071                 
00072                 new_layer.LayerExtents.mLeft = layer_data["Left"];
00073                 new_layer.LayerExtents.mRight = layer_data["Right"];
00074                 new_layer.LayerExtents.mBottom = layer_data["Bottom"];
00075                 new_layer.LayerExtents.mTop = layer_data["Top"];
00076 
00077                 F32 x_meters = F32(new_layer.LayerExtents.mLeft*REGION_WIDTH_UNITS);
00078                 F32 y_meters = F32(new_layer.LayerExtents.mBottom*REGION_WIDTH_UNITS);
00079                 adjust = LLWorldMap::getInstance()->extendAABB(U32(x_meters), U32(y_meters), 
00080                                                            U32(x_meters+REGION_WIDTH_UNITS*new_layer.LayerExtents.getWidth()),
00081                                                            U32(y_meters+REGION_WIDTH_UNITS*new_layer.LayerExtents.getHeight())) || adjust;
00082 
00083                 LLWorldMap::getInstance()->mMapLayers[agent_flags].push_back(new_layer);
00084         }
00085 
00086         LLWorldMap::getInstance()->mMapLoaded[agent_flags] = TRUE;
00087         if(adjust) gFloaterWorldMap->adjustZoomSliderBounds();
00088         
00089         /*
00090         U32 agent_flags;
00091         msg->getU32Fast(_PREHASH_AgentData, _PREHASH_Flags, agent_flags);
00092 
00093         if (agent_flags < 0 || agent_flags >= MAP_SIM_IMAGE_TYPES)
00094         {
00095                 llwarns << "Invalid map image type returned! " << agent_flags << llendl;
00096                 return;
00097         }
00098         */
00099 
00100         bool found_null_sim = false;
00101 
00102         adjust = FALSE;
00103         if (result.has("MapBlocks"))
00104         {
00105                 const LLSD& map_blocks = result["MapBlocks"];
00106                 for (iter = map_blocks.beginArray(); iter != map_blocks.endArray(); ++iter)
00107                 {
00108                         const LLSD& map_block = *iter;
00109                 
00110                         S32 x_regions = map_block["X"];
00111                         S32 y_regions = map_block["Y"];
00112                         std::string name = map_block["Name"];
00113                         S32 access = map_block["Access"];
00114                         S32 region_flags = map_block["RegionFlags"];
00115                         S32 water_height = map_block["WaterHeight"];
00116                         LLUUID image_id = map_block["MapImageID"];
00117 
00118                         U32 x_meters = x_regions * REGION_WIDTH_UNITS;
00119                         U32 y_meters = y_regions * REGION_WIDTH_UNITS;
00120 
00121                         if (access == 255)
00122                         {
00123                                 // This region doesn't exist
00124                                 if (LLWorldMap::getInstance()->mIsTrackingUnknownLocation &&
00125                                         LLWorldMap::getInstance()->mUnknownLocation.mdV[0] >= x_meters &&
00126                                         LLWorldMap::getInstance()->mUnknownLocation.mdV[0] < x_meters + 256 &&
00127                                         LLWorldMap::getInstance()->mUnknownLocation.mdV[1] >= y_meters &&
00128                                         LLWorldMap::getInstance()->mUnknownLocation.mdV[1] < y_meters + 256)
00129                                 {
00130                                         // We were tracking this location, but it doesn't exist
00131                                         LLWorldMap::getInstance()->mInvalidLocation = TRUE;
00132                                 }
00133 
00134                                 found_null_sim = true;
00135                         }
00136                         else
00137                         {
00138                                 adjust = LLWorldMap::getInstance()->extendAABB(x_meters, 
00139                                                                                            y_meters, 
00140                                                                                            x_meters+REGION_WIDTH_UNITS,
00141                                                                                            y_meters+REGION_WIDTH_UNITS) || adjust;
00142                                 U64 handle = to_region_handle(x_meters, y_meters);
00143 
00144                                 //                      llinfos << "Map sim " << name << " image layer " << agent_flags << " ID " << image_id.getString() << llendl;
00145                         
00146                                 LLSimInfo* siminfo = new LLSimInfo();
00147                                 LLWorldMap::sim_info_map_t::iterator iter = LLWorldMap::getInstance()->mSimInfoMap.find(handle);
00148                                 if (iter != LLWorldMap::getInstance()->mSimInfoMap.end())
00149                                 {
00150                                         LLSimInfo* oldinfo = iter->second;
00151                                         for (S32 image=0; image<MAP_SIM_IMAGE_TYPES; ++image)
00152                                         {
00153                                                 siminfo->mMapImageID[image] = oldinfo->mMapImageID[image];
00154                                         }
00155                                         delete oldinfo;
00156                                 }
00157                                 LLWorldMap::getInstance()->mSimInfoMap[handle] = siminfo;
00158 
00159                                 siminfo->mHandle = handle;
00160                                 siminfo->mName.assign( name );
00161                                 siminfo->mAccess = access;              /*Flawfinder: ignore*/
00162                                 siminfo->mRegionFlags = region_flags;
00163                                 siminfo->mWaterHeight = (F32) water_height;
00164                                 siminfo->mMapImageID[agent_flags] = image_id;
00165                                 siminfo->mCurrentImage = gImageList.getImage(siminfo->mMapImageID[LLWorldMap::getInstance()->mCurrentMap], MIPMAP_TRUE, FALSE);
00166                                 siminfo->mCurrentImage->bindTexture(0);
00167                                 siminfo->mCurrentImage->setClamp(TRUE, TRUE);
00168                         
00169                                 if (siminfo->mMapImageID[2].notNull())
00170                                 {
00171                                         siminfo->mOverlayImage = gImageList.getImage(siminfo->mMapImageID[2], MIPMAP_TRUE, FALSE);
00172                                 }
00173                                 else
00174                                 {
00175                                         siminfo->mOverlayImage = NULL;
00176                                 }
00177 
00178                                 if (LLWorldMap::getInstance()->mIsTrackingUnknownLocation &&
00179                                         LLWorldMap::getInstance()->mUnknownLocation.mdV[0] >= x_meters &&
00180                                         LLWorldMap::getInstance()->mUnknownLocation.mdV[0] < x_meters + 256 &&
00181                                         LLWorldMap::getInstance()->mUnknownLocation.mdV[1] >= y_meters &&
00182                                         LLWorldMap::getInstance()->mUnknownLocation.mdV[1] < y_meters + 256)
00183                                 {
00184                                         if (siminfo->mAccess == SIM_ACCESS_DOWN)
00185                                         {
00186                                                 // We were tracking this location, but it doesn't exist
00187                                                 LLWorldMap::getInstance()->mInvalidLocation = true;
00188                                         }
00189                                         else
00190                                         {
00191                                                 // We were tracking this location, and it does exist
00192                                                 bool is_tracking_dbl = LLWorldMap::getInstance()->mIsTrackingDoubleClick == TRUE;
00193                                                 gFloaterWorldMap->trackLocation(LLWorldMap::getInstance()->mUnknownLocation);
00194                                                 if (is_tracking_dbl)
00195                                                 {
00196                                                         LLVector3d pos_global = LLTracker::getTrackedPositionGlobal();
00197                                                         gAgent.teleportViaLocation( pos_global );
00198                                                 }
00199                                         }
00200                                 }
00201                         }
00202                 }
00203         }
00204         if(adjust) gFloaterWorldMap->adjustZoomSliderBounds();
00205         gFloaterWorldMap->updateSims(found_null_sim);
00206 }

Generated on Fri May 16 08:33:47 2008 for SecondLife by  doxygen 1.5.5