aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/CoreModules/World/Warp3DMap
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/CoreModules/World/Warp3DMap')
-rw-r--r--OpenSim/Region/CoreModules/World/Warp3DMap/TerrainSplat.cs130
-rw-r--r--OpenSim/Region/CoreModules/World/Warp3DMap/Warp3DImageModule.cs34
2 files changed, 4 insertions, 160 deletions
diff --git a/OpenSim/Region/CoreModules/World/Warp3DMap/TerrainSplat.cs b/OpenSim/Region/CoreModules/World/Warp3DMap/TerrainSplat.cs
index 77c10b8..4719ba3 100644
--- a/OpenSim/Region/CoreModules/World/Warp3DMap/TerrainSplat.cs
+++ b/OpenSim/Region/CoreModules/World/Warp3DMap/TerrainSplat.cs
@@ -79,13 +79,10 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap
79 /// <remarks>Based on the algorithm described at http://opensimulator.org/wiki/Terrain_Splatting 79 /// <remarks>Based on the algorithm described at http://opensimulator.org/wiki/Terrain_Splatting
80 /// Note we create a 256x256 dimension texture even if the actual terrain is larger. 80 /// Note we create a 256x256 dimension texture even if the actual terrain is larger.
81 /// </remarks> 81 /// </remarks>
82<<<<<<< HEAD 82
83 public static Bitmap Splat(ITerrainChannel terrain, 83 public static Bitmap Splat(ITerrainChannel terrain,
84 UUID[] textureIDs, float[] startHeights, float[] heightRanges, 84 UUID[] textureIDs, float[] startHeights, float[] heightRanges,
85 Vector3d regionPosition, IAssetService assetService, bool textureTerrain) 85 Vector3d regionPosition, IAssetService assetService, bool textureTerrain)
86=======
87 public static Bitmap Splat(ITerrainChannel terrain, UUID[] textureIDs, float[] startHeights, float[] heightRanges, Vector3d regionPosition, IAssetService assetService, bool textureTerrain)
88>>>>>>> avn/ubitvar
89 { 86 {
90 Debug.Assert(textureIDs.Length == 4); 87 Debug.Assert(textureIDs.Length == 4);
91 Debug.Assert(startHeights.Length == 4); 88 Debug.Assert(startHeights.Length == 4);
@@ -133,8 +130,8 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap
133 asset = assetService.Get(textureIDs[i].ToString()); 130 asset = assetService.Get(textureIDs[i].ToString());
134 if (asset != null) 131 if (asset != null)
135 { 132 {
136// m_log.DebugFormat( 133 // m_log.DebugFormat(
137// "[TERRAIN SPLAT]: Got cached original JPEG2000 terrain texture {0} {1}", i, asset.ID); 134 // "[TERRAIN SPLAT]: Got cached original JPEG2000 terrain texture {0} {1}", i, asset.ID);
138 135
139 try { detailTexture[i] = (Bitmap)CSJ2K.J2kImage.FromBytes(asset.Data); } 136 try { detailTexture[i] = (Bitmap)CSJ2K.J2kImage.FromBytes(asset.Data); }
140 catch (Exception ex) 137 catch (Exception ex)
@@ -144,7 +141,7 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap
144 } 141 }
145 142
146 if (detailTexture[i] != null) 143 if (detailTexture[i] != null)
147 { 144 {
148 // Make sure this texture is the correct size, otherwise resize 145 // Make sure this texture is the correct size, otherwise resize
149 if (detailTexture[i].Width != 256 || detailTexture[i].Height != 256) 146 if (detailTexture[i].Width != 256 || detailTexture[i].Height != 256)
150 { 147 {
@@ -199,74 +196,12 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap
199 using (SolidBrush brush = new SolidBrush(DEFAULT_TERRAIN_COLOR[i])) 196 using (SolidBrush brush = new SolidBrush(DEFAULT_TERRAIN_COLOR[i]))
200 gfx.FillRectangle(brush, 0, 0, 256, 256); 197 gfx.FillRectangle(brush, 0, 0, 256, 256);
201 } 198 }
202 else
203 {
204 if (detailTexture[i].Width != 256 || detailTexture[i].Height != 256)
205 {
206 detailTexture[i] = ResizeBitmap(detailTexture[i], 256, 256);
207 }
208 }
209 } 199 }
210<<<<<<< HEAD
211 else 200 else
212=======
213
214 #region Layer Map
215
216 float[,] layermap = new float[256 , 256];
217
218 int xFactor = terrain.Width / 256;
219 int yFactor = terrain.Height / 256;
220
221 for (int y = 0; y < 256; y++)
222>>>>>>> avn/ubitvar
223 { 201 {
224 if (detailTexture[i].Width != 256 || detailTexture[i].Height != 256) 202 if (detailTexture[i].Width != 256 || detailTexture[i].Height != 256)
225 { 203 {
226<<<<<<< HEAD
227 detailTexture[i] = ResizeBitmap(detailTexture[i], 256, 256); 204 detailTexture[i] = ResizeBitmap(detailTexture[i], 256, 256);
228=======
229 float height = (float)terrain[x * xFactor, y * yFactor];
230
231 float pctX = (float)x / 255f;
232 float pctY = (float)y / 255f;
233
234 // Use bilinear interpolation between the four corners of start height and
235 // height range to select the current values at this position
236 float startHeight = ImageUtils.Bilinear(
237 startHeights[0],
238 startHeights[2],
239 startHeights[1],
240 startHeights[3],
241 pctX, pctY);
242 startHeight = Utils.Clamp(startHeight, 0f, 255f);
243
244 float heightRange = ImageUtils.Bilinear(
245 heightRanges[0],
246 heightRanges[2],
247 heightRanges[1],
248 heightRanges[3],
249 pctX, pctY);
250 heightRange = Utils.Clamp(heightRange, 0f, 255f);
251
252 // Generate two frequencies of perlin noise based on our global position
253 // The magic values were taken from http://opensimulator.org/wiki/Terrain_Splatting
254 Vector3 vec = new Vector3
255 (
256 ((float)regionPosition.X + (x * xFactor)) * 0.20319f,
257 ((float)regionPosition.Y + (y * yFactor)) * 0.20319f,
258 height * 0.25f
259 );
260
261 float lowFreq = Perlin.noise2(vec.X * 0.222222f, vec.Y * 0.222222f) * 6.5f;
262 float highFreq = Perlin.turbulence2(vec.X, vec.Y, 2f) * 2.25f;
263 float noise = (lowFreq + highFreq) * 2f;
264
265 // Combine the current height, generated noise, start height, and height range parameters, then scale all of it
266 float layer = ((height + noise - startHeight) / heightRange) * 4f;
267 if (Single.IsNaN(layer)) layer = 0f;
268 layermap[x,y] = Utils.Clamp(layer, 0f, 3f);
269>>>>>>> avn/ubitvar
270 } 205 }
271 } 206 }
272 } 207 }
@@ -286,7 +221,6 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap
286 { 221 {
287 for (int x = 0; x < 256; x++) 222 for (int x = 0; x < 256; x++)
288 { 223 {
289<<<<<<< HEAD
290 float height = (float)terrain[x * xFactor, y * yFactor]; 224 float height = (float)terrain[x * xFactor, y * yFactor];
291 225
292 float pctX = (float)x / 255f; 226 float pctX = (float)x / 255f;
@@ -328,58 +262,6 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap
328 if (Single.IsNaN(layer)) 262 if (Single.IsNaN(layer))
329 layer = 0f; 263 layer = 0f;
330 layermap[x, y] = Utils.Clamp(layer, 0f, 3f); 264 layermap[x, y] = Utils.Clamp(layer, 0f, 3f);
331=======
332 // Get handles to all of the texture data arrays
333 BitmapData[] datas = new BitmapData[]
334 {
335 detailTexture[0].LockBits(new Rectangle(0, 0, 256, 256), ImageLockMode.ReadOnly, detailTexture[0].PixelFormat),
336 detailTexture[1].LockBits(new Rectangle(0, 0, 256, 256), ImageLockMode.ReadOnly, detailTexture[1].PixelFormat),
337 detailTexture[2].LockBits(new Rectangle(0, 0, 256, 256), ImageLockMode.ReadOnly, detailTexture[2].PixelFormat),
338 detailTexture[3].LockBits(new Rectangle(0, 0, 256, 256), ImageLockMode.ReadOnly, detailTexture[3].PixelFormat)
339 };
340
341 int[] comps = new int[]
342 {
343 (datas[0].PixelFormat == PixelFormat.Format32bppArgb) ? 4 : 3,
344 (datas[1].PixelFormat == PixelFormat.Format32bppArgb) ? 4 : 3,
345 (datas[2].PixelFormat == PixelFormat.Format32bppArgb) ? 4 : 3,
346 (datas[3].PixelFormat == PixelFormat.Format32bppArgb) ? 4 : 3
347 };
348
349 for (int y = 0; y < 256; y++)
350 {
351 for (int x = 0; x < 256; x++)
352 {
353 float layer = layermap[x, y];
354
355 // Select two textures
356 int l0 = (int)Math.Floor(layer);
357 int l1 = Math.Min(l0 + 1, 3);
358
359 byte* ptrA = (byte*)datas[l0].Scan0 + y * datas[l0].Stride + x * comps[l0];
360 byte* ptrB = (byte*)datas[l1].Scan0 + y * datas[l1].Stride + x * comps[l1];
361 byte* ptrO = (byte*)outputData.Scan0 + y * outputData.Stride + x * 3;
362
363 float aB = *(ptrA + 0);
364 float aG = *(ptrA + 1);
365 float aR = *(ptrA + 2);
366
367 float bB = *(ptrB + 0);
368 float bG = *(ptrB + 1);
369 float bR = *(ptrB + 2);
370
371 float layerDiff = layer - l0;
372
373 // Interpolate between the two selected textures
374 *(ptrO + 0) = (byte)Math.Floor(aB + layerDiff * (bB - aB));
375 *(ptrO + 1) = (byte)Math.Floor(aG + layerDiff * (bG - aG));
376 *(ptrO + 2) = (byte)Math.Floor(aR + layerDiff * (bR - aR));
377 }
378 }
379
380 for (int i = 0; i < 4; i++)
381 detailTexture[i].UnlockBits(datas[i]);
382>>>>>>> avn/ubitvar
383 } 265 }
384 } 266 }
385 267
@@ -471,10 +353,6 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap
471 b.Dispose(); 353 b.Dispose();
472 return result; 354 return result;
473 } 355 }
474<<<<<<< HEAD
475
476=======
477>>>>>>> avn/ubitvar
478 public static Bitmap SplatSimple(float[] heightmap) 356 public static Bitmap SplatSimple(float[] heightmap)
479 { 357 {
480 const float BASE_HSV_H = 93f / 360f; 358 const float BASE_HSV_H = 93f / 360f;
diff --git a/OpenSim/Region/CoreModules/World/Warp3DMap/Warp3DImageModule.cs b/OpenSim/Region/CoreModules/World/Warp3DMap/Warp3DImageModule.cs
index d8420d9..8e843ee 100644
--- a/OpenSim/Region/CoreModules/World/Warp3DMap/Warp3DImageModule.cs
+++ b/OpenSim/Region/CoreModules/World/Warp3DMap/Warp3DImageModule.cs
@@ -156,13 +156,6 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap
156 156
157 public Bitmap CreateMapTile() 157 public Bitmap CreateMapTile()
158 { 158 {
159<<<<<<< HEAD
160 // Vector3 camPos = new Vector3(127.5f, 127.5f, 221.7025033688163f);
161 // Camera above the middle of the region
162 Vector3 camPos = new Vector3(
163 m_scene.RegionInfo.RegionSizeX/2 - 0.5f,
164 m_scene.RegionInfo.RegionSizeY/2 - 0.5f,
165=======
166 /* this must be on all map, not just its image 159 /* this must be on all map, not just its image
167 if ((DateTime.Now - lastImageTime).TotalSeconds < 3600) 160 if ((DateTime.Now - lastImageTime).TotalSeconds < 3600)
168 { 161 {
@@ -179,16 +172,10 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap
179 Vector3 camPos = new Vector3( 172 Vector3 camPos = new Vector3(
180 m_scene.RegionInfo.RegionSizeX / 2 - 0.5f, 173 m_scene.RegionInfo.RegionSizeX / 2 - 0.5f,
181 m_scene.RegionInfo.RegionSizeY / 2 - 0.5f, 174 m_scene.RegionInfo.RegionSizeY / 2 - 0.5f,
182>>>>>>> avn/ubitvar
183 221.7025033688163f); 175 221.7025033688163f);
184 // Viewport viewing down onto the region 176 // Viewport viewing down onto the region
185 Viewport viewport = new Viewport(camPos, -Vector3.UnitZ, 1024f, 0.1f, 177 Viewport viewport = new Viewport(camPos, -Vector3.UnitZ, 1024f, 0.1f,
186 (int)m_scene.RegionInfo.RegionSizeX, (int)m_scene.RegionInfo.RegionSizeY, 178 (int)m_scene.RegionInfo.RegionSizeX, (int)m_scene.RegionInfo.RegionSizeY,
187<<<<<<< HEAD
188 (float)m_scene.RegionInfo.RegionSizeX, (float)m_scene.RegionInfo.RegionSizeY );
189 // Fill the viewport and return the image
190 return CreateMapTile(viewport, false);
191=======
192 (float)m_scene.RegionInfo.RegionSizeX, (float)m_scene.RegionInfo.RegionSizeY); 179 (float)m_scene.RegionInfo.RegionSizeX, (float)m_scene.RegionInfo.RegionSizeY);
193 180
194 Bitmap tile = CreateMapTile(viewport, false); 181 Bitmap tile = CreateMapTile(viewport, false);
@@ -199,7 +186,6 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap
199 lastImageTime = DateTime.Now; 186 lastImageTime = DateTime.Now;
200 return (Bitmap)lastImage.Clone(); 187 return (Bitmap)lastImage.Clone();
201 */ 188 */
202>>>>>>> avn/ubitvar
203 } 189 }
204 190
205 public Bitmap CreateViewImage(Vector3 camPos, Vector3 camDir, float fov, int width, int height, bool useTextures) 191 public Bitmap CreateViewImage(Vector3 camPos, Vector3 camDir, float fov, int width, int height, bool useTextures)
@@ -315,15 +301,9 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap
315 float waterHeight = (float)m_scene.RegionInfo.RegionSettings.WaterHeight; 301 float waterHeight = (float)m_scene.RegionInfo.RegionSettings.WaterHeight;
316 302
317 renderer.AddPlane("Water", m_scene.RegionInfo.RegionSizeX * 0.5f); 303 renderer.AddPlane("Water", m_scene.RegionInfo.RegionSizeX * 0.5f);
318<<<<<<< HEAD
319 renderer.Scene.sceneobject("Water").setPos(m_scene.RegionInfo.RegionSizeX/2 - 0.5f,
320 waterHeight,
321 m_scene.RegionInfo.RegionSizeY/2 - 0.5f );
322=======
323 renderer.Scene.sceneobject("Water").setPos(m_scene.RegionInfo.RegionSizeX / 2 - 0.5f, 304 renderer.Scene.sceneobject("Water").setPos(m_scene.RegionInfo.RegionSizeX / 2 - 0.5f,
324 waterHeight, 305 waterHeight,
325 m_scene.RegionInfo.RegionSizeY / 2 - 0.5f); 306 m_scene.RegionInfo.RegionSizeY / 2 - 0.5f);
326>>>>>>> avn/ubitvar
327 307
328 warp_Material waterColorMaterial = new warp_Material(ConvertColor(WATER_COLOR)); 308 warp_Material waterColorMaterial = new warp_Material(ConvertColor(WATER_COLOR));
329 waterColorMaterial.setReflectivity(0); // match water color with standard map module thanks lkalif 309 waterColorMaterial.setReflectivity(0); // match water color with standard map module thanks lkalif
@@ -352,11 +332,7 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap
352 warp_Vector pos = ConvertVector(x, y, (float)terrain[(int)x, (int)y]); 332 warp_Vector pos = ConvertVector(x, y, (float)terrain[(int)x, (int)y]);
353 obj.addVertex(new warp_Vertex(pos, 333 obj.addVertex(new warp_Vertex(pos,
354 x / (float)m_scene.RegionInfo.RegionSizeX, 334 x / (float)m_scene.RegionInfo.RegionSizeX,
355<<<<<<< HEAD
356 (((float)m_scene.RegionInfo.RegionSizeY) - y) / m_scene.RegionInfo.RegionSizeY) );
357=======
358 (((float)m_scene.RegionInfo.RegionSizeY) - y) / m_scene.RegionInfo.RegionSizeY)); 335 (((float)m_scene.RegionInfo.RegionSizeY) - y) / m_scene.RegionInfo.RegionSizeY));
359>>>>>>> avn/ubitvar
360 } 336 }
361 } 337 }
362 338
@@ -424,12 +400,8 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap
424 warp_Texture texture; 400 warp_Texture texture;
425 using ( 401 using (
426 Bitmap image 402 Bitmap image
427<<<<<<< HEAD
428 = TerrainSplat.Splat(terrain, textureIDs, startHeights, heightRanges,
429=======
430 = TerrainSplat.Splat( 403 = TerrainSplat.Splat(
431 terrain, textureIDs, startHeights, heightRanges, 404 terrain, textureIDs, startHeights, heightRanges,
432>>>>>>> avn/ubitvar
433 new Vector3d(globalX, globalY, 0.0), m_scene.AssetService, textureTerrain)) 405 new Vector3d(globalX, globalY, 0.0), m_scene.AssetService, textureTerrain))
434 { 406 {
435 texture = new warp_Texture(image); 407 texture = new warp_Texture(image);
@@ -711,12 +683,6 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap
711 return new warp_Vector(x, z, y); 683 return new warp_Vector(x, z, y);
712 } 684 }
713 685
714 // Note: axis change.
715 private static warp_Vector ConvertVector(float x, float y, float z)
716 {
717 return new warp_Vector(x, z, y);
718 }
719
720 private static warp_Vector ConvertVector(Vector3 vector) 686 private static warp_Vector ConvertVector(Vector3 vector)
721 { 687 {
722 return new warp_Vector(vector.X, vector.Z, vector.Y); 688 return new warp_Vector(vector.X, vector.Z, vector.Y);