diff options
Diffstat (limited to 'OpenSim/Region/CoreModules/World/LegacyMap/TexturedMapTileRenderer.cs')
-rw-r--r-- | OpenSim/Region/CoreModules/World/LegacyMap/TexturedMapTileRenderer.cs | 64 |
1 files changed, 37 insertions, 27 deletions
diff --git a/OpenSim/Region/CoreModules/World/LegacyMap/TexturedMapTileRenderer.cs b/OpenSim/Region/CoreModules/World/LegacyMap/TexturedMapTileRenderer.cs index d13c2ef..9f23141 100644 --- a/OpenSim/Region/CoreModules/World/LegacyMap/TexturedMapTileRenderer.cs +++ b/OpenSim/Region/CoreModules/World/LegacyMap/TexturedMapTileRenderer.cs | |||
@@ -34,6 +34,8 @@ using Nini.Config; | |||
34 | using OpenMetaverse; | 34 | using OpenMetaverse; |
35 | using OpenMetaverse.Imaging; | 35 | using OpenMetaverse.Imaging; |
36 | using OpenSim.Framework; | 36 | using OpenSim.Framework; |
37 | using OpenSim.Region.Framework; | ||
38 | using OpenSim.Region.Framework.Interfaces; | ||
37 | using OpenSim.Region.Framework.Scenes; | 39 | using OpenSim.Region.Framework.Scenes; |
38 | 40 | ||
39 | namespace OpenSim.Region.CoreModules.World.LegacyMap | 41 | namespace OpenSim.Region.CoreModules.World.LegacyMap |
@@ -122,8 +124,8 @@ namespace OpenSim.Region.CoreModules.World.LegacyMap | |||
122 | { | 124 | { |
123 | #region Constants | 125 | #region Constants |
124 | 126 | ||
125 | private static readonly ILog m_log = | 127 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
126 | LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 128 | private static readonly string LogHeader = "[TEXTURED MAPTILE RENDERER]"; |
127 | 129 | ||
128 | // some hardcoded terrain UUIDs that work with SL 1.20 (the four default textures and "Blank"). | 130 | // some hardcoded terrain UUIDs that work with SL 1.20 (the four default textures and "Blank"). |
129 | // The color-values were choosen because they "look right" (at least to me) ;-) | 131 | // The color-values were choosen because they "look right" (at least to me) ;-) |
@@ -173,7 +175,7 @@ namespace OpenSim.Region.CoreModules.World.LegacyMap | |||
173 | private Bitmap fetchTexture(UUID id) | 175 | private Bitmap fetchTexture(UUID id) |
174 | { | 176 | { |
175 | AssetBase asset = m_scene.AssetService.Get(id.ToString()); | 177 | AssetBase asset = m_scene.AssetService.Get(id.ToString()); |
176 | m_log.DebugFormat("[TexturedMapTileRenderer]: Fetched texture {0}, found: {1}", id, asset != null); | 178 | m_log.DebugFormat("{0} Fetched texture {1}, found: {2}", LogHeader, id, asset != null); |
177 | if (asset == null) return null; | 179 | if (asset == null) return null; |
178 | 180 | ||
179 | ManagedImage managedImage; | 181 | ManagedImage managedImage; |
@@ -188,18 +190,15 @@ namespace OpenSim.Region.CoreModules.World.LegacyMap | |||
188 | } | 190 | } |
189 | catch (DllNotFoundException) | 191 | catch (DllNotFoundException) |
190 | { | 192 | { |
191 | m_log.ErrorFormat("[TexturedMapTileRenderer]: OpenJpeg is not installed correctly on this system. Asset Data is empty for {0}", id); | 193 | m_log.ErrorFormat("{0} OpenJpeg is not installed correctly on this system. Asset Data is empty for {1}", LogHeader, id); |
192 | |||
193 | } | 194 | } |
194 | catch (IndexOutOfRangeException) | 195 | catch (IndexOutOfRangeException) |
195 | { | 196 | { |
196 | m_log.ErrorFormat("[TexturedMapTileRenderer]: OpenJpeg was unable to encode this. Asset Data is empty for {0}", id); | 197 | m_log.ErrorFormat("{0} OpenJpeg was unable to encode this. Asset Data is empty for {1}", LogHeader, id); |
197 | |||
198 | } | 198 | } |
199 | catch (Exception) | 199 | catch (Exception) |
200 | { | 200 | { |
201 | m_log.ErrorFormat("[TexturedMapTileRenderer]: OpenJpeg was unable to encode this. Asset Data is empty for {0}", id); | 201 | m_log.ErrorFormat("{0} OpenJpeg was unable to encode this. Asset Data is empty for {1}", LogHeader, id); |
202 | |||
203 | } | 202 | } |
204 | return null; | 203 | return null; |
205 | 204 | ||
@@ -233,10 +232,14 @@ namespace OpenSim.Region.CoreModules.World.LegacyMap | |||
233 | if (textureID == UUID.Zero) return defaultColor; // not set | 232 | if (textureID == UUID.Zero) return defaultColor; // not set |
234 | if (m_mapping.ContainsKey(textureID)) return m_mapping[textureID]; // one of the predefined textures | 233 | if (m_mapping.ContainsKey(textureID)) return m_mapping[textureID]; // one of the predefined textures |
235 | 234 | ||
236 | Bitmap bmp = fetchTexture(textureID); | 235 | Color color; |
237 | Color color = bmp == null ? defaultColor : computeAverageColor(bmp); | 236 | |
238 | // store it for future reference | 237 | using (Bitmap bmp = fetchTexture(textureID)) |
239 | m_mapping[textureID] = color; | 238 | { |
239 | color = bmp == null ? defaultColor : computeAverageColor(bmp); | ||
240 | // store it for future reference | ||
241 | m_mapping[textureID] = color; | ||
242 | } | ||
240 | 243 | ||
241 | return color; | 244 | return color; |
242 | } | 245 | } |
@@ -267,8 +270,8 @@ namespace OpenSim.Region.CoreModules.World.LegacyMap | |||
267 | 270 | ||
268 | // the heigthfield might have some jumps in values. Rendered land is smooth, though, | 271 | // the heigthfield might have some jumps in values. Rendered land is smooth, though, |
269 | // as a slope is rendered at that place. So average 4 neighbour values to emulate that. | 272 | // as a slope is rendered at that place. So average 4 neighbour values to emulate that. |
270 | private float getHeight(double[,] hm, int x, int y) { | 273 | private float getHeight(ITerrainChannel hm, int x, int y) { |
271 | if (x < ((int)Constants.RegionSize - 1) && y < ((int)Constants.RegionSize - 1)) | 274 | if (x < (hm.Width - 1) && y < (hm.Height - 1)) |
272 | return (float)(hm[x, y] * .444 + (hm[x + 1, y] + hm[x, y + 1]) * .222 + hm[x + 1, y +1] * .112); | 275 | return (float)(hm[x, y] * .444 + (hm[x + 1, y] + hm[x, y + 1]) * .222 + hm[x + 1, y +1] * .112); |
273 | else | 276 | else |
274 | return (float)hm[x, y]; | 277 | return (float)hm[x, y]; |
@@ -278,7 +281,15 @@ namespace OpenSim.Region.CoreModules.World.LegacyMap | |||
278 | public void TerrainToBitmap(Bitmap mapbmp) | 281 | public void TerrainToBitmap(Bitmap mapbmp) |
279 | { | 282 | { |
280 | int tc = Environment.TickCount; | 283 | int tc = Environment.TickCount; |
281 | m_log.Debug("[MAPTILE]: Generating Maptile Step 1: Terrain"); | 284 | m_log.DebugFormat("{0} Generating Maptile Step 1: Terrain", LogHeader); |
285 | |||
286 | ITerrainChannel hm = m_scene.Heightmap; | ||
287 | |||
288 | if (mapbmp.Width != hm.Width || mapbmp.Height != hm.Height) | ||
289 | { | ||
290 | m_log.ErrorFormat("{0} TerrainToBitmap. Passed bitmap wrong dimensions. passed=<{1},{2}>, size=<{3},{4}>", | ||
291 | LogHeader, mapbmp.Width, mapbmp.Height, hm.Width, hm.Height); | ||
292 | } | ||
282 | 293 | ||
283 | // These textures should be in the AssetCache anyway, as every client conneting to this | 294 | // These textures should be in the AssetCache anyway, as every client conneting to this |
284 | // region needs them. Except on start, when the map is recreated (before anyone connected), | 295 | // region needs them. Except on start, when the map is recreated (before anyone connected), |
@@ -306,19 +317,17 @@ namespace OpenSim.Region.CoreModules.World.LegacyMap | |||
306 | 317 | ||
307 | float waterHeight = (float)settings.WaterHeight; | 318 | float waterHeight = (float)settings.WaterHeight; |
308 | 319 | ||
309 | double[,] hm = m_scene.Heightmap.GetDoubles(); | 320 | for (int x = 0; x < hm.Width; x++) |
310 | |||
311 | for (int x = 0; x < (int)Constants.RegionSize; x++) | ||
312 | { | 321 | { |
313 | float columnRatio = x / ((float)Constants.RegionSize - 1); // 0 - 1, for interpolation | 322 | float columnRatio = x / (hm.Width - 1); // 0 - 1, for interpolation |
314 | for (int y = 0; y < (int)Constants.RegionSize; y++) | 323 | for (int y = 0; y < hm.Height; y++) |
315 | { | 324 | { |
316 | float rowRatio = y / ((float)Constants.RegionSize - 1); // 0 - 1, for interpolation | 325 | float rowRatio = y / (hm.Height - 1); // 0 - 1, for interpolation |
317 | 326 | ||
318 | // Y flip the cordinates for the bitmap: hf origin is lower left, bm origin is upper left | 327 | // Y flip the cordinates for the bitmap: hf origin is lower left, bm origin is upper left |
319 | int yr = ((int)Constants.RegionSize - 1) - y; | 328 | int yr = (hm.Height - 1) - y; |
320 | 329 | ||
321 | float heightvalue = getHeight(hm, x, y); | 330 | float heightvalue = getHeight(m_scene.Heightmap, x, y); |
322 | if (Single.IsInfinity(heightvalue) || Single.IsNaN(heightvalue)) | 331 | if (Single.IsInfinity(heightvalue) || Single.IsNaN(heightvalue)) |
323 | heightvalue = 0; | 332 | heightvalue = 0; |
324 | 333 | ||
@@ -368,9 +377,9 @@ namespace OpenSim.Region.CoreModules.World.LegacyMap | |||
368 | } | 377 | } |
369 | 378 | ||
370 | // Shade the terrain for shadows | 379 | // Shade the terrain for shadows |
371 | if (x < ((int)Constants.RegionSize - 1) && y < ((int)Constants.RegionSize - 1)) | 380 | if (x < (hm.Width - 1) && y < (hm.Height - 1)) |
372 | { | 381 | { |
373 | float hfvaluecompare = getHeight(hm, x + 1, y + 1); // light from north-east => look at land height there | 382 | float hfvaluecompare = getHeight(m_scene.Heightmap, x + 1, y + 1); // light from north-east => look at land height there |
374 | if (Single.IsInfinity(hfvaluecompare) || Single.IsNaN(hfvaluecompare)) | 383 | if (Single.IsInfinity(hfvaluecompare) || Single.IsNaN(hfvaluecompare)) |
375 | hfvaluecompare = 0f; | 384 | hfvaluecompare = 0f; |
376 | 385 | ||
@@ -412,7 +421,8 @@ namespace OpenSim.Region.CoreModules.World.LegacyMap | |||
412 | } | 421 | } |
413 | } | 422 | } |
414 | } | 423 | } |
415 | m_log.Debug("[MAPTILE]: Generating Maptile Step 1: Done in " + (Environment.TickCount - tc) + " ms"); | 424 | |
425 | m_log.Debug("[TEXTURED MAP TILE RENDERER]: Generating Maptile Step 1: Done in " + (Environment.TickCount - tc) + " ms"); | ||
416 | } | 426 | } |
417 | } | 427 | } |
418 | } | 428 | } |