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
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 != gWorldMap->mCurrentMap)
00049 {
00050 llwarns << "Invalid or out of date map image type returned!" << llendl;
00051 return;
00052 }
00053
00054 LLUUID image_id;
00055
00056
00057 gWorldMap->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 = gWorldMap->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 gWorldMap->mMapLayers[agent_flags].push_back(new_layer);
00084 }
00085
00086 gWorldMap->mMapLoaded[agent_flags] = TRUE;
00087 if(adjust) gFloaterWorldMap->adjustZoomSliderBounds();
00088
00089
00090
00091
00092
00093
00094
00095
00096
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
00124 if (gWorldMap->mIsTrackingUnknownLocation &&
00125 gWorldMap->mUnknownLocation.mdV[0] >= x_meters &&
00126 gWorldMap->mUnknownLocation.mdV[0] < x_meters + 256 &&
00127 gWorldMap->mUnknownLocation.mdV[1] >= y_meters &&
00128 gWorldMap->mUnknownLocation.mdV[1] < y_meters + 256)
00129 {
00130
00131 gWorldMap->mInvalidLocation = TRUE;
00132 }
00133
00134 found_null_sim = true;
00135 }
00136 else
00137 {
00138 adjust = gWorldMap->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
00145
00146 LLSimInfo* siminfo = new LLSimInfo();
00147 LLWorldMap::sim_info_map_t::iterator iter = gWorldMap->mSimInfoMap.find(handle);
00148 if (iter != gWorldMap->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 gWorldMap->mSimInfoMap[handle] = siminfo;
00158
00159 siminfo->mHandle = handle;
00160 siminfo->mName.assign( name );
00161 siminfo->mAccess = access;
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[gWorldMap->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 (gWorldMap->mIsTrackingUnknownLocation &&
00179 gWorldMap->mUnknownLocation.mdV[0] >= x_meters &&
00180 gWorldMap->mUnknownLocation.mdV[0] < x_meters + 256 &&
00181 gWorldMap->mUnknownLocation.mdV[1] >= y_meters &&
00182 gWorldMap->mUnknownLocation.mdV[1] < y_meters + 256)
00183 {
00184 if (siminfo->mAccess == SIM_ACCESS_DOWN)
00185 {
00186
00187 gWorldMap->mInvalidLocation = true;
00188 }
00189 else
00190 {
00191
00192 bool is_tracking_dbl = gWorldMap->mIsTrackingDoubleClick == TRUE;
00193 gFloaterWorldMap->trackLocation(gWorldMap->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 }