aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorJonathan Freedman2010-10-03 18:04:38 -0400
committerJonathan Freedman2010-10-03 18:04:38 -0400
commite3099d48f9ebfaa7b1feede2d6f2788bdc93552b (patch)
tree4bddd7ea4e3d4671c9c4956fc7f6105219d88338
parent* additional serveruri cleanup (diff)
parentUpgraded Mono.Addins.dll to 0.5, coming from here: http://monoaddins.codeplex... (diff)
downloadopensim-SC_OLD-e3099d48f9ebfaa7b1feede2d6f2788bdc93552b.zip
opensim-SC_OLD-e3099d48f9ebfaa7b1feede2d6f2788bdc93552b.tar.gz
opensim-SC_OLD-e3099d48f9ebfaa7b1feede2d6f2788bdc93552b.tar.bz2
opensim-SC_OLD-e3099d48f9ebfaa7b1feede2d6f2788bdc93552b.tar.xz
Merge branch 'master' of git://opensimulator.org/git/opensim
-rw-r--r--OpenSim/Framework/Util.cs11
-rw-r--r--OpenSim/Region/CoreModules/Resources/CoreModulePlugin.addin.xml1
-rw-r--r--OpenSim/Region/CoreModules/ServiceConnectorsOut/Asset/HGAssetBroker.cs55
-rw-r--r--OpenSim/Region/CoreModules/World/LegacyMap/IMapTileTerrainRenderer.cs (renamed from OpenSim/Region/CoreModules/World/WorldMap/IMapTileTerrainRenderer.cs)2
-rw-r--r--OpenSim/Region/CoreModules/World/LegacyMap/MapImageModule.cs (renamed from OpenSim/Region/CoreModules/World/WorldMap/MapImageModule.cs)47
-rw-r--r--OpenSim/Region/CoreModules/World/LegacyMap/ShadedMapTileRenderer.cs (renamed from OpenSim/Region/CoreModules/World/WorldMap/ShadedMapTileRenderer.cs)2
-rw-r--r--OpenSim/Region/CoreModules/World/LegacyMap/TexturedMapTileRenderer.cs (renamed from OpenSim/Region/CoreModules/World/WorldMap/TexturedMapTileRenderer.cs)2
-rw-r--r--OpenSim/Region/CoreModules/World/Warp3DMap/MapImageModule.cs624
-rw-r--r--OpenSim/Region/CoreModules/World/Warp3DMap/Perlin.cs273
-rw-r--r--OpenSim/Region/CoreModules/World/Warp3DMap/TerrainSplat.cs343
-rw-r--r--OpenSim/Region/CoreModules/World/Warp3DMap/Viewport.cs165
-rw-r--r--OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs2
-rw-r--r--OpenSim/Region/Framework/Interfaces/ITerrain.cs4
-rw-r--r--OpenSim/Services/Connectors/SimianGrid/SimianGridServiceConnector.cs2
-rw-r--r--ThirdPartyLicenses/MonoAddins.txt41
-rw-r--r--bin/Mono.Addins.CecilReflector.dllbin0 -> 364032 bytes
-rw-r--r--bin/Mono.Addins.Setup.dllbin0 -> 103424 bytes
-rw-r--r--bin/Mono.Addins.dllbin185344 -> 202752 bytes
-rw-r--r--bin/Warp3D.dllbin0 -> 77824 bytes
-rw-r--r--prebuild.xml3
20 files changed, 1506 insertions, 71 deletions
diff --git a/OpenSim/Framework/Util.cs b/OpenSim/Framework/Util.cs
index e7a7f49..addfe5d 100644
--- a/OpenSim/Framework/Util.cs
+++ b/OpenSim/Framework/Util.cs
@@ -92,6 +92,17 @@ namespace OpenSim.Framework
92 public static FireAndForgetMethod FireAndForgetMethod = FireAndForgetMethod.SmartThreadPool; 92 public static FireAndForgetMethod FireAndForgetMethod = FireAndForgetMethod.SmartThreadPool;
93 93
94 /// <summary> 94 /// <summary>
95 /// Gets the name of the directory where the current running executable
96 /// is located
97 /// </summary>
98 /// <returns>Filesystem path to the directory containing the current
99 /// executable</returns>
100 public static string ExecutingDirectory()
101 {
102 return Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
103 }
104
105 /// <summary>
95 /// Linear interpolates B<->C using percent A 106 /// Linear interpolates B<->C using percent A
96 /// </summary> 107 /// </summary>
97 /// <param name="a"></param> 108 /// <param name="a"></param>
diff --git a/OpenSim/Region/CoreModules/Resources/CoreModulePlugin.addin.xml b/OpenSim/Region/CoreModules/Resources/CoreModulePlugin.addin.xml
index ee07075..e85e4e9 100644
--- a/OpenSim/Region/CoreModules/Resources/CoreModulePlugin.addin.xml
+++ b/OpenSim/Region/CoreModules/Resources/CoreModulePlugin.addin.xml
@@ -18,6 +18,7 @@
18 <RegionModule id="CapabilitiesModule" type="OpenSim.Region.CoreModules.Agent.Capabilities.CapabilitiesModule" /> 18 <RegionModule id="CapabilitiesModule" type="OpenSim.Region.CoreModules.Agent.Capabilities.CapabilitiesModule" />
19 <RegionModule id="TerrainModule" type="OpenSim.Region.CoreModules.World.Terrain.TerrainModule" /> 19 <RegionModule id="TerrainModule" type="OpenSim.Region.CoreModules.World.Terrain.TerrainModule" />
20 <RegionModule id="WorldMapModule" type="OpenSim.Region.CoreModules.World.WorldMap.WorldMapModule" /> 20 <RegionModule id="WorldMapModule" type="OpenSim.Region.CoreModules.World.WorldMap.WorldMapModule" />
21 <RegionModule id="Warp3DImageModule" type="OpenSim.Region.CoreModules.World.Warp3DMap.Warp3DImageModule" />
21 <RegionModule id="HGWorldMapModule" type="OpenSim.Region.CoreModules.Hypergrid.HGWorldMapModule" /> 22 <RegionModule id="HGWorldMapModule" type="OpenSim.Region.CoreModules.Hypergrid.HGWorldMapModule" />
22 <RegionModule id="UrlModule" type="OpenSim.Region.CoreModules.Scripting.LSLHttp.UrlModule" /> 23 <RegionModule id="UrlModule" type="OpenSim.Region.CoreModules.Scripting.LSLHttp.UrlModule" />
23 <RegionModule id="Chat" type="OpenSim.Region.CoreModules.Avatar.Chat.ChatModule" /> 24 <RegionModule id="Chat" type="OpenSim.Region.CoreModules.Avatar.Chat.ChatModule" />
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Asset/HGAssetBroker.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Asset/HGAssetBroker.cs
index 034e692..e31be21 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Asset/HGAssetBroker.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Asset/HGAssetBroker.cs
@@ -219,11 +219,8 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Asset
219 else 219 else
220 asset = m_GridService.Get(id); 220 asset = m_GridService.Get(id);
221 221
222 if (asset != null) 222 if (m_Cache != null)
223 { 223 m_Cache.Cache(asset);
224 if (m_Cache != null)
225 m_Cache.Cache(asset);
226 }
227 224
228 return asset; 225 return asset;
229 } 226 }
@@ -273,18 +270,10 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Asset
273 } 270 }
274 271
275 if (IsHG(id)) 272 if (IsHG(id))
276 asset = m_HGService.Get(id); 273 return m_HGService.GetData(id);
277 else 274 else
278 asset = m_GridService.Get(id); 275 return m_GridService.GetData(id);
279
280 if (asset != null)
281 {
282 if (m_Cache != null)
283 m_Cache.Cache(asset);
284 return asset.Data;
285 }
286 276
287 return null;
288 } 277 }
289 278
290 public bool Get(string id, Object sender, AssetRetrieved handler) 279 public bool Get(string id, Object sender, AssetRetrieved handler)
@@ -304,7 +293,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Asset
304 { 293 {
305 return m_HGService.Get(id, sender, delegate (string assetID, Object s, AssetBase a) 294 return m_HGService.Get(id, sender, delegate (string assetID, Object s, AssetBase a)
306 { 295 {
307 if (a != null && m_Cache != null) 296 if (m_Cache != null)
308 m_Cache.Cache(a); 297 m_Cache.Cache(a);
309 handler(assetID, s, a); 298 handler(assetID, s, a);
310 }); 299 });
@@ -313,7 +302,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Asset
313 { 302 {
314 return m_GridService.Get(id, sender, delegate (string assetID, Object s, AssetBase a) 303 return m_GridService.Get(id, sender, delegate (string assetID, Object s, AssetBase a)
315 { 304 {
316 if (a != null && m_Cache != null) 305 if (m_Cache != null)
317 m_Cache.Cache(a); 306 m_Cache.Cache(a);
318 handler(assetID, s, a); 307 handler(assetID, s, a);
319 }); 308 });
@@ -331,12 +320,30 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Asset
331 m_Cache.Cache(asset); 320 m_Cache.Cache(asset);
332 321
333 if (asset.Temporary || asset.Local) 322 if (asset.Temporary || asset.Local)
323 {
324 if (m_Cache != null)
325 m_Cache.Cache(asset);
334 return asset.ID; 326 return asset.ID;
327 }
335 328
329 string id = string.Empty;
336 if (IsHG(asset.ID)) 330 if (IsHG(asset.ID))
337 return m_HGService.Store(asset); 331 id = m_HGService.Store(asset);
338 else 332 else
339 return m_GridService.Store(asset); 333 id = m_GridService.Store(asset);
334
335 if (id != String.Empty)
336 {
337 // Placing this here, so that this work with old asset servers that don't send any reply back
338 // SynchronousRestObjectRequester returns somethins that is not an empty string
339 if (id != null)
340 asset.ID = id;
341
342 if (m_Cache != null)
343 m_Cache.Cache(asset);
344 }
345 return id;
346
340 } 347 }
341 348
342 public bool UpdateContent(string id, byte[] data) 349 public bool UpdateContent(string id, byte[] data)
@@ -363,10 +370,16 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Asset
363 if (m_Cache != null) 370 if (m_Cache != null)
364 m_Cache.Expire(id); 371 m_Cache.Expire(id);
365 372
373 bool result = false;
366 if (IsHG(id)) 374 if (IsHG(id))
367 return m_HGService.Delete(id); 375 result = m_HGService.Delete(id);
368 else 376 else
369 return m_GridService.Delete(id); 377 result = m_GridService.Delete(id);
378
379 if (result && m_Cache != null)
380 m_Cache.Expire(id);
381
382 return result;
370 } 383 }
371 384
372 #region IHyperAssetService 385 #region IHyperAssetService
diff --git a/OpenSim/Region/CoreModules/World/WorldMap/IMapTileTerrainRenderer.cs b/OpenSim/Region/CoreModules/World/LegacyMap/IMapTileTerrainRenderer.cs
index de9bb1d..e892b14 100644
--- a/OpenSim/Region/CoreModules/World/WorldMap/IMapTileTerrainRenderer.cs
+++ b/OpenSim/Region/CoreModules/World/LegacyMap/IMapTileTerrainRenderer.cs
@@ -29,7 +29,7 @@ using System.Drawing;
29using Nini.Config; 29using Nini.Config;
30using OpenSim.Region.Framework.Scenes; 30using OpenSim.Region.Framework.Scenes;
31 31
32namespace OpenSim.Region.CoreModules.World.WorldMap 32namespace OpenSim.Region.CoreModules.World.LegacyMap
33{ 33{
34 public interface IMapTileTerrainRenderer 34 public interface IMapTileTerrainRenderer
35 { 35 {
diff --git a/OpenSim/Region/CoreModules/World/WorldMap/MapImageModule.cs b/OpenSim/Region/CoreModules/World/LegacyMap/MapImageModule.cs
index c83ac85..9e6e366 100644
--- a/OpenSim/Region/CoreModules/World/WorldMap/MapImageModule.cs
+++ b/OpenSim/Region/CoreModules/World/LegacyMap/MapImageModule.cs
@@ -37,7 +37,7 @@ using OpenSim.Framework;
37using OpenSim.Region.Framework.Interfaces; 37using OpenSim.Region.Framework.Interfaces;
38using OpenSim.Region.Framework.Scenes; 38using OpenSim.Region.Framework.Scenes;
39 39
40namespace OpenSim.Region.CoreModules.World.WorldMap 40namespace OpenSim.Region.CoreModules.World.LegacyMap
41{ 41{
42 public enum DrawRoutine 42 public enum DrawRoutine
43 { 43 {
@@ -70,7 +70,7 @@ namespace OpenSim.Region.CoreModules.World.WorldMap
70 70
71 #region IMapImageGenerator Members 71 #region IMapImageGenerator Members
72 72
73 public Bitmap CreateMapTile(string gradientmap) 73 public Bitmap CreateMapTile()
74 { 74 {
75 bool drawPrimVolume = true; 75 bool drawPrimVolume = true;
76 bool textureTerrain = false; 76 bool textureTerrain = false;
@@ -113,11 +113,11 @@ namespace OpenSim.Region.CoreModules.World.WorldMap
113 return mapbmp; 113 return mapbmp;
114 } 114 }
115 115
116 public byte[] WriteJpeg2000Image(string gradientmap) 116 public byte[] WriteJpeg2000Image()
117 { 117 {
118 try 118 try
119 { 119 {
120 using (Bitmap mapbmp = CreateMapTile(gradientmap)) 120 using (Bitmap mapbmp = CreateMapTile())
121 return OpenJPEG.EncodeFromImage(mapbmp, true); 121 return OpenJPEG.EncodeFromImage(mapbmp, true);
122 } 122 }
123 catch (Exception e) // LEGIT: Catching problems caused by OpenJPEG p/invoke 123 catch (Exception e) // LEGIT: Catching problems caused by OpenJPEG p/invoke
@@ -545,44 +545,5 @@ namespace OpenSim.Region.CoreModules.World.WorldMap
545 545
546 return returnpt; 546 return returnpt;
547 } 547 }
548
549// TODO: unused:
550// #region Deprecated Maptile Generation. Adam may update this
551// private Bitmap TerrainToBitmap(string gradientmap)
552// {
553// Bitmap gradientmapLd = new Bitmap(gradientmap);
554//
555// int pallete = gradientmapLd.Height;
556//
557// Bitmap bmp = new Bitmap(m_scene.Heightmap.Width, m_scene.Heightmap.Height);
558// Color[] colours = new Color[pallete];
559//
560// for (int i = 0; i < pallete; i++)
561// {
562// colours[i] = gradientmapLd.GetPixel(0, i);
563// }
564//
565// lock (m_scene.Heightmap)
566// {
567// ITerrainChannel copy = m_scene.Heightmap;
568// for (int y = 0; y < copy.Height; y++)
569// {
570// for (int x = 0; x < copy.Width; x++)
571// {
572// // 512 is the largest possible height before colours clamp
573// int colorindex = (int) (Math.Max(Math.Min(1.0, copy[x, y] / 512.0), 0.0) * (pallete - 1));
574//
575// // Handle error conditions
576// if (colorindex > pallete - 1 || colorindex < 0)
577// bmp.SetPixel(x, copy.Height - y - 1, Color.Red);
578// else
579// bmp.SetPixel(x, copy.Height - y - 1, colours[colorindex]);
580// }
581// }
582// ShadeBuildings(bmp);
583// return bmp;
584// }
585// }
586// #endregion
587 } 548 }
588} 549}
diff --git a/OpenSim/Region/CoreModules/World/WorldMap/ShadedMapTileRenderer.cs b/OpenSim/Region/CoreModules/World/LegacyMap/ShadedMapTileRenderer.cs
index fef2ef3..eb1a27f 100644
--- a/OpenSim/Region/CoreModules/World/WorldMap/ShadedMapTileRenderer.cs
+++ b/OpenSim/Region/CoreModules/World/LegacyMap/ShadedMapTileRenderer.cs
@@ -33,7 +33,7 @@ using Nini.Config;
33using OpenSim.Framework; 33using OpenSim.Framework;
34using OpenSim.Region.Framework.Scenes; 34using OpenSim.Region.Framework.Scenes;
35 35
36namespace OpenSim.Region.CoreModules.World.WorldMap 36namespace OpenSim.Region.CoreModules.World.LegacyMap
37{ 37{
38 public class ShadedMapTileRenderer : IMapTileTerrainRenderer 38 public class ShadedMapTileRenderer : IMapTileTerrainRenderer
39 { 39 {
diff --git a/OpenSim/Region/CoreModules/World/WorldMap/TexturedMapTileRenderer.cs b/OpenSim/Region/CoreModules/World/LegacyMap/TexturedMapTileRenderer.cs
index 8b34f6e..071314a 100644
--- a/OpenSim/Region/CoreModules/World/WorldMap/TexturedMapTileRenderer.cs
+++ b/OpenSim/Region/CoreModules/World/LegacyMap/TexturedMapTileRenderer.cs
@@ -36,7 +36,7 @@ using OpenMetaverse.Imaging;
36using OpenSim.Framework; 36using OpenSim.Framework;
37using OpenSim.Region.Framework.Scenes; 37using OpenSim.Region.Framework.Scenes;
38 38
39namespace OpenSim.Region.CoreModules.World.WorldMap 39namespace OpenSim.Region.CoreModules.World.LegacyMap
40{ 40{
41 // Hue, Saturation, Value; used for color-interpolation 41 // Hue, Saturation, Value; used for color-interpolation
42 struct HSV { 42 struct HSV {
diff --git a/OpenSim/Region/CoreModules/World/Warp3DMap/MapImageModule.cs b/OpenSim/Region/CoreModules/World/Warp3DMap/MapImageModule.cs
new file mode 100644
index 0000000..a99b20c
--- /dev/null
+++ b/OpenSim/Region/CoreModules/World/Warp3DMap/MapImageModule.cs
@@ -0,0 +1,624 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using System.Collections.Generic;
30using System.Drawing;
31using System.Drawing.Imaging;
32using System.IO;
33using System.Reflection;
34using CSJ2K;
35using Nini.Config;
36using log4net;
37using Rednettle.Warp3D;
38using OpenMetaverse;
39using OpenMetaverse.Imaging;
40using OpenMetaverse.Rendering;
41using OpenMetaverse.StructuredData;
42using OpenSim.Framework;
43using OpenSim.Region.Framework.Interfaces;
44using OpenSim.Region.Framework.Scenes;
45using OpenSim.Region.Physics.Manager;
46using OpenSim.Services.Interfaces;
47
48using WarpRenderer = global::Warp3D.Warp3D;
49
50namespace OpenSim.Region.CoreModules.World.Warp3DMap
51{
52 public class Warp3DImageModule : IMapImageGenerator, IRegionModule
53 {
54 private static readonly UUID TEXTURE_METADATA_MAGIC = new UUID("802dc0e0-f080-4931-8b57-d1be8611c4f3");
55 private static readonly Color4 WATER_COLOR = new Color4(29, 71, 95, 216);
56
57 private static readonly ILog m_log =
58 LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
59
60 private Scene m_scene;
61 private IRendering m_primMesher;
62 private IConfigSource m_config;
63 private Dictionary<UUID, Color4> m_colors = new Dictionary<UUID, Color4>();
64 private bool m_useAntiAliasing = true; // TODO: Make this a config option
65
66 #region IRegionModule Members
67
68 public void Initialise(Scene scene, IConfigSource source)
69 {
70 m_scene = scene;
71 m_config = source;
72
73 IConfig startupConfig = m_config.Configs["Startup"];
74 if (startupConfig.GetString("MapImageModule", "MapImageModule") != "Warp3DImageModule")
75 return;
76
77 List<string> renderers = RenderingLoader.ListRenderers(Util.ExecutingDirectory());
78 if (renderers.Count > 0)
79 {
80 m_primMesher = RenderingLoader.LoadRenderer(renderers[0]);
81 m_log.Info("[MAPTILE]: Loaded prim mesher " + m_primMesher.ToString());
82 }
83 else
84 {
85 m_log.Info("[MAPTILE]: No prim mesher loaded, prim rendering will be disabled");
86 }
87
88 m_scene.RegisterModuleInterface<IMapImageGenerator>(this);
89 }
90
91 public void PostInitialise()
92 {
93 }
94
95 public void Close()
96 {
97 }
98
99 public string Name
100 {
101 get { return "Warp3DImageModule"; }
102 }
103
104 public bool IsSharedModule
105 {
106 get { return false; }
107 }
108
109 #endregion
110
111 #region IMapImageGenerator Members
112
113 public Bitmap CreateMapTile()
114 {
115 bool drawPrimVolume = true;
116 bool textureTerrain = true;
117
118 try
119 {
120 IConfig startupConfig = m_config.Configs["Startup"];
121 drawPrimVolume = startupConfig.GetBoolean("DrawPrimOnMapTile", drawPrimVolume);
122 textureTerrain = startupConfig.GetBoolean("TextureOnMapTile", textureTerrain);
123 }
124 catch
125 {
126 m_log.Warn("[MAPTILE]: Failed to load StartupConfig");
127 }
128
129 m_colors.Clear();
130
131 Vector3 camPos = new Vector3(127.5f, 127.5f, 221.7025033688163f);
132 Viewport viewport = new Viewport(camPos, -Vector3.UnitZ, 1024f, 0.1f, (int)Constants.RegionSize, (int)Constants.RegionSize, (float)Constants.RegionSize, (float)Constants.RegionSize);
133
134 int width = viewport.Width;
135 int height = viewport.Height;
136
137 if (m_useAntiAliasing)
138 {
139 width *= 2;
140 height *= 2;
141 }
142
143 WarpRenderer renderer = new WarpRenderer();
144 renderer.CreateScene(width, height);
145 renderer.Scene.autoCalcNormals = false;
146
147 #region Camera
148
149 warp_Vector pos = ConvertVector(viewport.Position);
150 pos.z -= 0.001f; // Works around an issue with the Warp3D camera
151 warp_Vector lookat = warp_Vector.add(ConvertVector(viewport.Position), ConvertVector(viewport.LookDirection));
152
153 renderer.Scene.defaultCamera.setPos(pos);
154 renderer.Scene.defaultCamera.lookAt(lookat);
155
156 if (viewport.Orthographic)
157 {
158 renderer.Scene.defaultCamera.isOrthographic = true;
159 renderer.Scene.defaultCamera.orthoViewWidth = viewport.OrthoWindowWidth;
160 renderer.Scene.defaultCamera.orthoViewHeight = viewport.OrthoWindowHeight;
161 }
162 else
163 {
164 float fov = viewport.FieldOfView;
165 fov *= 1.75f; // FIXME: ???
166 renderer.Scene.defaultCamera.setFov(fov);
167 }
168
169 #endregion Camera
170
171 renderer.Scene.addLight("Light1", new warp_Light(new warp_Vector(0.2f, 0.2f, 1f), 0xffffff, 320, 80));
172 renderer.Scene.addLight("Light2", new warp_Light(new warp_Vector(-1f, -1f, 1f), 0xffffff, 100, 40));
173
174 CreateWater(renderer);
175 CreateTerrain(renderer, textureTerrain);
176 if (drawPrimVolume)
177 CreateAllPrims(renderer);
178
179 renderer.Render();
180 Bitmap bitmap = renderer.Scene.getImage();
181
182 if (m_useAntiAliasing)
183 bitmap = ImageUtils.ResizeImage(bitmap, viewport.Width, viewport.Height);
184
185 return bitmap;
186 }
187
188 public byte[] WriteJpeg2000Image()
189 {
190 try
191 {
192 using (Bitmap mapbmp = CreateMapTile())
193 return OpenJPEG.EncodeFromImage(mapbmp, true);
194 }
195 catch (Exception e)
196 {
197 // JPEG2000 encoder failed
198 m_log.Error("[MAPTILE]: Failed generating terrain map: " + e);
199 }
200
201 return null;
202 }
203
204 #endregion
205
206 #region Rendering Methods
207
208 private void CreateWater(WarpRenderer renderer)
209 {
210 float waterHeight = (float)m_scene.RegionInfo.RegionSettings.WaterHeight;
211
212 renderer.AddPlane("Water", 256f * 0.5f);
213 renderer.Scene.sceneobject("Water").setPos(127.5f, waterHeight, 127.5f);
214
215 renderer.AddMaterial("WaterColor", ConvertColor(WATER_COLOR));
216 renderer.Scene.material("WaterColor").setTransparency((byte)((1f - WATER_COLOR.A) * 255f));
217 renderer.SetObjectMaterial("Water", "WaterColor");
218 }
219
220 private void CreateTerrain(WarpRenderer renderer, bool textureTerrain)
221 {
222 ITerrainChannel terrain = m_scene.Heightmap;
223 float[] heightmap = terrain.GetFloatsSerialised();
224
225 warp_Object obj = new warp_Object(256 * 256, 255 * 255 * 2);
226
227 for (int y = 0; y < 256; y++)
228 {
229 for (int x = 0; x < 256; x++)
230 {
231 int v = y * 256 + x;
232 float height = heightmap[v];
233
234 warp_Vector pos = ConvertVector(new Vector3(x, y, height));
235 obj.addVertex(new warp_Vertex(pos, (float)x / 255f, (float)(255 - y) / 255f));
236 }
237 }
238
239 for (int y = 0; y < 256; y++)
240 {
241 for (int x = 0; x < 256; x++)
242 {
243 if (x < 255 && y < 255)
244 {
245 int v = y * 256 + x;
246
247 // Normal
248 Vector3 v1 = new Vector3(x, y, heightmap[y * 256 + x]);
249 Vector3 v2 = new Vector3(x + 1, y, heightmap[y * 256 + x + 1]);
250 Vector3 v3 = new Vector3(x, y + 1, heightmap[(y + 1) * 256 + x]);
251 warp_Vector norm = ConvertVector(SurfaceNormal(v1, v2, v3));
252 norm = norm.reverse();
253 obj.vertex(v).n = norm;
254
255 // Triangle 1
256 obj.addTriangle(
257 v,
258 v + 1,
259 v + 256);
260
261 // Triangle 2
262 obj.addTriangle(
263 v + 256 + 1,
264 v + 256,
265 v + 1);
266 }
267 }
268 }
269
270 renderer.Scene.addObject("Terrain", obj);
271
272 UUID[] textureIDs = new UUID[4];
273 float[] startHeights = new float[4];
274 float[] heightRanges = new float[4];
275
276 RegionSettings regionInfo = m_scene.RegionInfo.RegionSettings;
277
278 textureIDs[0] = regionInfo.TerrainTexture1;
279 textureIDs[1] = regionInfo.TerrainTexture2;
280 textureIDs[2] = regionInfo.TerrainTexture3;
281 textureIDs[3] = regionInfo.TerrainTexture4;
282
283 startHeights[0] = (float)regionInfo.Elevation1SW;
284 startHeights[1] = (float)regionInfo.Elevation1NW;
285 startHeights[2] = (float)regionInfo.Elevation1SE;
286 startHeights[3] = (float)regionInfo.Elevation1NE;
287
288 heightRanges[0] = (float)regionInfo.Elevation2SW;
289 heightRanges[1] = (float)regionInfo.Elevation2NW;
290 heightRanges[2] = (float)regionInfo.Elevation2SE;
291 heightRanges[3] = (float)regionInfo.Elevation2NE;
292
293 uint globalX, globalY;
294 Utils.LongToUInts(m_scene.RegionInfo.RegionHandle, out globalX, out globalY);
295
296 Bitmap image = TerrainSplat.Splat(heightmap, textureIDs, startHeights, heightRanges, new Vector3d(globalX, globalY, 0.0), m_scene.AssetService, textureTerrain);
297 warp_Texture texture = new warp_Texture(image);
298 warp_Material material = new warp_Material(texture);
299 material.setReflectivity(50);
300 renderer.Scene.addMaterial("TerrainColor", material);
301 renderer.SetObjectMaterial("Terrain", "TerrainColor");
302 }
303
304 private void CreateAllPrims(WarpRenderer renderer)
305 {
306 if (m_primMesher == null)
307 return;
308
309 m_scene.ForEachSOG(
310 delegate(SceneObjectGroup group)
311 {
312 CreatePrim(renderer, group.RootPart);
313 foreach (SceneObjectPart child in group.Parts)
314 CreatePrim(renderer, child);
315 }
316 );
317 }
318
319 private void CreatePrim(WarpRenderer renderer, SceneObjectPart prim)
320 {
321 const float MIN_SIZE = 2f;
322
323 if ((PCode)prim.Shape.PCode != PCode.Prim)
324 return;
325 if (prim.Scale.LengthSquared() < MIN_SIZE * MIN_SIZE)
326 return;
327
328 Primitive omvPrim = prim.Shape.ToOmvPrimitive(prim.OffsetPosition, prim.RotationOffset);
329 FacetedMesh renderMesh = m_primMesher.GenerateFacetedMesh(omvPrim, DetailLevel.Medium);
330 if (renderMesh == null)
331 return;
332
333 warp_Vector primPos = ConvertVector(prim.AbsolutePosition);
334 warp_Quaternion primRot = ConvertQuaternion(prim.RotationOffset);
335
336 warp_Matrix m = warp_Matrix.quaternionMatrix(primRot);
337
338 if (prim.ParentID != 0)
339 {
340 SceneObjectGroup group = m_scene.SceneGraph.GetGroupByPrim(prim.LocalId);
341 if (group != null)
342 m.transform(warp_Matrix.quaternionMatrix(ConvertQuaternion(group.RootPart.RotationOffset)));
343 }
344
345 warp_Vector primScale = ConvertVector(prim.Scale);
346
347 string primID = prim.UUID.ToString();
348
349 // Create the prim faces
350 for (int i = 0; i < renderMesh.Faces.Count; i++)
351 {
352 Face face = renderMesh.Faces[i];
353 string meshName = primID + "-Face-" + i.ToString();
354
355 warp_Object faceObj = new warp_Object(face.Vertices.Count, face.Indices.Count / 3);
356
357 for (int j = 0; j < face.Vertices.Count; j++)
358 {
359 Vertex v = face.Vertices[j];
360
361 warp_Vector pos = ConvertVector(v.Position);
362 warp_Vector norm = ConvertVector(v.Normal);
363
364 if (prim.Shape.SculptTexture == UUID.Zero)
365 norm = norm.reverse();
366 warp_Vertex vert = new warp_Vertex(pos, norm, v.TexCoord.X, v.TexCoord.Y);
367
368 faceObj.addVertex(vert);
369 }
370
371 for (int j = 0; j < face.Indices.Count; j += 3)
372 {
373 faceObj.addTriangle(
374 face.Indices[j + 0],
375 face.Indices[j + 1],
376 face.Indices[j + 2]);
377 }
378
379 Primitive.TextureEntryFace teFace = prim.Shape.Textures.GetFace((uint)i);
380 Color4 faceColor = GetFaceColor(teFace);
381 string materialName = GetOrCreateMaterial(renderer, faceColor);
382
383 faceObj.transform(m);
384 faceObj.setPos(primPos);
385 faceObj.scaleSelf(primScale.x, primScale.y, primScale.z);
386
387 renderer.Scene.addObject(meshName, faceObj);
388
389 renderer.SetObjectMaterial(meshName, materialName);
390 }
391 }
392
393 private Color4 GetFaceColor(Primitive.TextureEntryFace face)
394 {
395 Color4 color;
396
397 if (face.TextureID == UUID.Zero)
398 return face.RGBA;
399
400 if (!m_colors.TryGetValue(face.TextureID, out color))
401 {
402 bool fetched = false;
403
404 // Attempt to fetch the texture metadata
405 UUID metadataID = UUID.Combine(face.TextureID, TEXTURE_METADATA_MAGIC);
406 AssetBase metadata = m_scene.AssetService.GetCached(metadataID.ToString());
407 if (metadata != null)
408 {
409 OSDMap map = null;
410 try { map = OSDParser.Deserialize(metadata.Data) as OSDMap; } catch { }
411
412 if (map != null)
413 {
414 color = map["X-JPEG2000-RGBA"].AsColor4();
415 fetched = true;
416 }
417 }
418
419 if (!fetched)
420 {
421 // Fetch the texture, decode and get the average color,
422 // then save it to a temporary metadata asset
423 AssetBase textureAsset = m_scene.AssetService.Get(face.TextureID.ToString());
424 if (textureAsset != null)
425 {
426 int width, height;
427 color = GetAverageColor(textureAsset.FullID, textureAsset.Data, out width, out height);
428
429 OSDMap data = new OSDMap { { "X-JPEG2000-RGBA", OSD.FromColor4(color) } };
430 metadata = new AssetBase
431 {
432 Data = System.Text.Encoding.UTF8.GetBytes(OSDParser.SerializeJsonString(data)),
433 Description = "Metadata for JPEG2000 texture " + face.TextureID.ToString(),
434 Flags = AssetFlags.Collectable,
435 FullID = metadataID,
436 ID = metadataID.ToString(),
437 Local = true,
438 Temporary = true,
439 Name = String.Empty,
440 Type = (sbyte)AssetType.Unknown
441 };
442 m_scene.AssetService.Store(metadata);
443 }
444 else
445 {
446 color = new Color4(0.5f, 0.5f, 0.5f, 1.0f);
447 }
448 }
449
450 m_colors[face.TextureID] = color;
451 }
452
453 return color * face.RGBA;
454 }
455
456 private string GetOrCreateMaterial(WarpRenderer renderer, Color4 color)
457 {
458 string name = color.ToString();
459
460 warp_Material material = renderer.Scene.material(name);
461 if (material != null)
462 return name;
463
464 renderer.AddMaterial(name, ConvertColor(color));
465 if (color.A < 1f)
466 renderer.Scene.material(name).setTransparency((byte)((1f - color.A) * 255f));
467 return name;
468 }
469
470 #endregion Rendering Methods
471
472 #region Static Helpers
473
474 private static warp_Vector ConvertVector(Vector3 vector)
475 {
476 return new warp_Vector(vector.X, vector.Z, vector.Y);
477 }
478
479 private static warp_Quaternion ConvertQuaternion(Quaternion quat)
480 {
481 return new warp_Quaternion(quat.X, quat.Z, quat.Y, -quat.W);
482 }
483
484 private static int ConvertColor(Color4 color)
485 {
486 int c = warp_Color.getColor((byte)(color.R * 255f), (byte)(color.G * 255f), (byte)(color.B * 255f));
487 if (color.A < 1f)
488 c |= (byte)(color.A * 255f) << 24;
489
490 return c;
491 }
492
493 private static Vector3 SurfaceNormal(Vector3 c1, Vector3 c2, Vector3 c3)
494 {
495 Vector3 edge1 = new Vector3(c2.X - c1.X, c2.Y - c1.Y, c2.Z - c1.Z);
496 Vector3 edge2 = new Vector3(c3.X - c1.X, c3.Y - c1.Y, c3.Z - c1.Z);
497
498 Vector3 normal = Vector3.Cross(edge1, edge2);
499 normal.Normalize();
500
501 return normal;
502 }
503
504 public static Color4 GetAverageColor(UUID textureID, byte[] j2kData, out int width, out int height)
505 {
506 ulong r = 0;
507 ulong g = 0;
508 ulong b = 0;
509 ulong a = 0;
510
511 using (MemoryStream stream = new MemoryStream(j2kData))
512 {
513 try
514 {
515 Bitmap bitmap = (Bitmap)J2kImage.FromStream(stream);
516 width = bitmap.Width;
517 height = bitmap.Height;
518
519 BitmapData bitmapData = bitmap.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadOnly, bitmap.PixelFormat);
520 int pixelBytes = (bitmap.PixelFormat == PixelFormat.Format24bppRgb) ? 3 : 4;
521
522 // Sum up the individual channels
523 unsafe
524 {
525 if (pixelBytes == 4)
526 {
527 for (int y = 0; y < height; y++)
528 {
529 byte* row = (byte*)bitmapData.Scan0 + (y * bitmapData.Stride);
530
531 for (int x = 0; x < width; x++)
532 {
533 b += row[x * pixelBytes + 0];
534 g += row[x * pixelBytes + 1];
535 r += row[x * pixelBytes + 2];
536 a += row[x * pixelBytes + 3];
537 }
538 }
539 }
540 else
541 {
542 for (int y = 0; y < height; y++)
543 {
544 byte* row = (byte*)bitmapData.Scan0 + (y * bitmapData.Stride);
545
546 for (int x = 0; x < width; x++)
547 {
548 b += row[x * pixelBytes + 0];
549 g += row[x * pixelBytes + 1];
550 r += row[x * pixelBytes + 2];
551 }
552 }
553 }
554 }
555
556 // Get the averages for each channel
557 const decimal OO_255 = 1m / 255m;
558 decimal totalPixels = (decimal)(width * height);
559
560 decimal rm = ((decimal)r / totalPixels) * OO_255;
561 decimal gm = ((decimal)g / totalPixels) * OO_255;
562 decimal bm = ((decimal)b / totalPixels) * OO_255;
563 decimal am = ((decimal)a / totalPixels) * OO_255;
564
565 if (pixelBytes == 3)
566 am = 1m;
567
568 return new Color4((float)rm, (float)gm, (float)bm, (float)am);
569 }
570 catch (Exception ex)
571 {
572 m_log.WarnFormat("[MAPTILE]: Error decoding JPEG2000 texture {0} ({1} bytes): {2}", textureID, j2kData.Length, ex.Message);
573 width = 0;
574 height = 0;
575 return new Color4(0.5f, 0.5f, 0.5f, 1.0f);
576 }
577 }
578 }
579
580 #endregion Static Helpers
581 }
582
583 public static class ImageUtils
584 {
585 /// <summary>
586 /// Performs bilinear interpolation between four values
587 /// </summary>
588 /// <param name="v00">First, or top left value</param>
589 /// <param name="v01">Second, or top right value</param>
590 /// <param name="v10">Third, or bottom left value</param>
591 /// <param name="v11">Fourth, or bottom right value</param>
592 /// <param name="xPercent">Interpolation value on the X axis, between 0.0 and 1.0</param>
593 /// <param name="yPercent">Interpolation value on fht Y axis, between 0.0 and 1.0</param>
594 /// <returns>The bilinearly interpolated result</returns>
595 public static float Bilinear(float v00, float v01, float v10, float v11, float xPercent, float yPercent)
596 {
597 return Utils.Lerp(Utils.Lerp(v00, v01, xPercent), Utils.Lerp(v10, v11, xPercent), yPercent);
598 }
599
600 /// <summary>
601 /// Performs a high quality image resize
602 /// </summary>
603 /// <param name="image">Image to resize</param>
604 /// <param name="width">New width</param>
605 /// <param name="height">New height</param>
606 /// <returns>Resized image</returns>
607 public static Bitmap ResizeImage(Image image, int width, int height)
608 {
609 Bitmap result = new Bitmap(width, height);
610
611 using (Graphics graphics = Graphics.FromImage(result))
612 {
613 graphics.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
614 graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
615 graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
616 graphics.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality;
617
618 graphics.DrawImage(image, 0, 0, result.Width, result.Height);
619 }
620
621 return result;
622 }
623 }
624}
diff --git a/OpenSim/Region/CoreModules/World/Warp3DMap/Perlin.cs b/OpenSim/Region/CoreModules/World/Warp3DMap/Perlin.cs
new file mode 100644
index 0000000..af59d7a
--- /dev/null
+++ b/OpenSim/Region/CoreModules/World/Warp3DMap/Perlin.cs
@@ -0,0 +1,273 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using OpenMetaverse;
30
31namespace OpenSim.Region.CoreModules.World.Warp3DMap
32{
33 public static class Perlin
34 {
35 // We use a hardcoded seed to keep the noise generation consistent between runs
36 private const int SEED = 42;
37
38 private const int SAMPLE_SIZE = 1024;
39 private const int B = SAMPLE_SIZE;
40 private const int BM = SAMPLE_SIZE - 1;
41 private const int N = 0x1000;
42
43 private static readonly int[] p = new int[SAMPLE_SIZE + SAMPLE_SIZE + 2];
44 private static readonly float[,] g3 = new float[SAMPLE_SIZE + SAMPLE_SIZE + 2, 3];
45 private static readonly float[,] g2 = new float[SAMPLE_SIZE + SAMPLE_SIZE + 2, 2];
46 private static readonly float[] g1 = new float[SAMPLE_SIZE + SAMPLE_SIZE + 2];
47
48 static Perlin()
49 {
50 Random rng = new Random(SEED);
51 int i, j, k;
52
53 for (i = 0; i < B; i++)
54 {
55 p[i] = i;
56 g1[i] = (float)((rng.Next() % (B + B)) - B) / B;
57
58 for (j = 0; j < 2; j++)
59 g2[i, j] = (float)((rng.Next() % (B + B)) - B) / B;
60 normalize2(g2, i);
61
62 for (j = 0; j < 3; j++)
63 g3[i, j] = (float)((rng.Next() % (B + B)) - B) / B;
64 normalize3(g3, i);
65 }
66
67 while (--i > 0)
68 {
69 k = p[i];
70 p[i] = p[j = rng.Next() % B];
71 p[j] = k;
72 }
73
74 for (i = 0; i < B + 2; i++)
75 {
76 p[B + i] = p[i];
77 g1[B + i] = g1[i];
78 for (j = 0; j < 2; j++)
79 g2[B + i, j] = g2[i, j];
80 for (j = 0; j < 3; j++)
81 g3[B + i, j] = g3[i, j];
82 }
83 }
84
85 public static float noise1(float arg)
86 {
87 int bx0, bx1;
88 float rx0, rx1, sx, t, u, v, a;
89
90 a = arg;
91
92 t = arg + N;
93 bx0 = ((int)t) & BM;
94 bx1 = (bx0 + 1) & BM;
95 rx0 = t - (int)t;
96 rx1 = rx0 - 1f;
97
98 sx = s_curve(rx0);
99
100 u = rx0 * g1[p[bx0]];
101 v = rx1 * g1[p[bx1]];
102
103 return Utils.Lerp(u, v, sx);
104 }
105
106 public static float noise2(float x, float y)
107 {
108 int bx0, bx1, by0, by1, b00, b10, b01, b11;
109 float rx0, rx1, ry0, ry1, sx, sy, a, b, t, u, v;
110 int i, j;
111
112 t = x + N;
113 bx0 = ((int)t) & BM;
114 bx1 = (bx0 + 1) & BM;
115 rx0 = t - (int)t;
116 rx1 = rx0 - 1f;
117
118 t = y + N;
119 by0 = ((int)t) & BM;
120 by1 = (by0 + 1) & BM;
121 ry0 = t - (int)t;
122 ry1 = ry0 - 1f;
123
124 i = p[bx0];
125 j = p[bx1];
126
127 b00 = p[i + by0];
128 b10 = p[j + by0];
129 b01 = p[i + by1];
130 b11 = p[j + by1];
131
132 sx = s_curve(rx0);
133 sy = s_curve(ry0);
134
135 u = rx0 * g2[b00, 0] + ry0 * g2[b00, 1];
136 v = rx1 * g2[b10, 0] + ry0 * g2[b10, 1];
137 a = Utils.Lerp(u, v, sx);
138
139 u = rx0 * g2[b01, 0] + ry1 * g2[b01, 1];
140 v = rx1 * g2[b11, 0] + ry1 * g2[b11, 1];
141 b = Utils.Lerp(u, v, sx);
142
143 return Utils.Lerp(a, b, sy);
144 }
145
146 public static float noise3(float x, float y, float z)
147 {
148 int bx0, bx1, by0, by1, bz0, bz1, b00, b10, b01, b11;
149 float rx0, rx1, ry0, ry1, rz0, rz1, sy, sz, a, b, c, d, t, u, v;
150 int i, j;
151
152 t = x + N;
153 bx0 = ((int)t) & BM;
154 bx1 = (bx0 + 1) & BM;
155 rx0 = t - (int)t;
156 rx1 = rx0 - 1f;
157
158 t = y + N;
159 by0 = ((int)t) & BM;
160 by1 = (by0 + 1) & BM;
161 ry0 = t - (int)t;
162 ry1 = ry0 - 1f;
163
164 t = z + N;
165 bz0 = ((int)t) & BM;
166 bz1 = (bz0 + 1) & BM;
167 rz0 = t - (int)t;
168 rz1 = rz0 - 1f;
169
170 i = p[bx0];
171 j = p[bx1];
172
173 b00 = p[i + by0];
174 b10 = p[j + by0];
175 b01 = p[i + by1];
176 b11 = p[j + by1];
177
178 t = s_curve(rx0);
179 sy = s_curve(ry0);
180 sz = s_curve(rz0);
181
182 u = rx0 * g3[b00 + bz0, 0] + ry0 * g3[b00 + bz0, 1] + rz0 * g3[b00 + bz0, 2];
183 v = rx1 * g3[b10 + bz0, 0] + ry0 * g3[b10 + bz0, 1] + rz0 * g3[b10 + bz0, 2];
184 a = Utils.Lerp(u, v, t);
185
186 u = rx0 * g3[b01 + bz0, 0] + ry1 * g3[b01 + bz0, 1] + rz0 * g3[b01 + bz0, 2];
187 v = rx1 * g3[b11 + bz0, 0] + ry1 * g3[b11 + bz0, 1] + rz0 * g3[b11 + bz0, 2];
188 b = Utils.Lerp(u, v, t);
189
190 c = Utils.Lerp(a, b, sy);
191
192 u = rx0 * g3[b00 + bz1, 0] + ry0 * g3[b00 + bz1, 1] + rz1 * g3[b00 + bz1, 2];
193 v = rx1 * g3[b10 + bz1, 0] + ry0 * g3[b10 + bz1, 1] + rz1 * g3[b10 + bz1, 2];
194 a = Utils.Lerp(u, v, t);
195
196 u = rx0 * g3[b01 + bz1, 0] + ry1 * g3[b01 + bz1, 1] + rz1 * g3[b01 + bz1, 2];
197 v = rx1 * g3[b11 + bz1, 0] + ry1 * g3[b11 + bz1, 1] + rz1 * g3[b11 + bz1, 2];
198 b = Utils.Lerp(u, v, t);
199
200 d = Utils.Lerp(a, b, sy);
201 return Utils.Lerp(c, d, sz);
202 }
203
204 public static float turbulence1(float x, float freq)
205 {
206 float t;
207 float v;
208
209 for (t = 0f; freq >= 1f; freq *= 0.5f)
210 {
211 v = freq * x;
212 t += noise1(v) / freq;
213 }
214 return t;
215 }
216
217 public static float turbulence2(float x, float y, float freq)
218 {
219 float t;
220 Vector2 vec;
221
222 for (t = 0f; freq >= 1f; freq *= 0.5f)
223 {
224 vec.X = freq * x;
225 vec.Y = freq * y;
226 t += noise2(vec.X, vec.Y) / freq;
227 }
228 return t;
229 }
230
231 public static float turbulence3(float x, float y, float z, float freq)
232 {
233 float t;
234 Vector3 vec;
235
236 for (t = 0f; freq >= 1f; freq *= 0.5f)
237 {
238 vec.X = freq * x;
239 vec.Y = freq * y;
240 vec.Z = freq * z;
241 t += noise3(vec.X, vec.Y, vec.Z) / freq;
242 }
243 return t;
244 }
245
246 private static void normalize2(float[,] v, int i)
247 {
248 float s;
249
250 s = (float)Math.Sqrt(v[i, 0] * v[i, 0] + v[i, 1] * v[i, 1]);
251 s = 1.0f / s;
252 v[i, 0] = v[i, 0] * s;
253 v[i, 1] = v[i, 1] * s;
254 }
255
256 private static void normalize3(float[,] v, int i)
257 {
258 float s;
259
260 s = (float)Math.Sqrt(v[i, 0] * v[i, 0] + v[i, 1] * v[i, 1] + v[i, 2] * v[i, 2]);
261 s = 1.0f / s;
262
263 v[i, 0] = v[i, 0] * s;
264 v[i, 1] = v[i, 1] * s;
265 v[i, 2] = v[i, 2] * s;
266 }
267
268 private static float s_curve(float t)
269 {
270 return t * t * (3f - 2f * t);
271 }
272 }
273}
diff --git a/OpenSim/Region/CoreModules/World/Warp3DMap/TerrainSplat.cs b/OpenSim/Region/CoreModules/World/Warp3DMap/TerrainSplat.cs
new file mode 100644
index 0000000..7bf675d
--- /dev/null
+++ b/OpenSim/Region/CoreModules/World/Warp3DMap/TerrainSplat.cs
@@ -0,0 +1,343 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using System.Diagnostics;
30using System.Drawing;
31using System.Drawing.Imaging;
32using log4net;
33using OpenMetaverse;
34using OpenSim.Framework;
35using OpenSim.Services.Interfaces;
36
37namespace OpenSim.Region.CoreModules.World.Warp3DMap
38{
39 public static class TerrainSplat
40 {
41 #region Constants
42
43 private static readonly UUID DIRT_DETAIL = new UUID("0bc58228-74a0-7e83-89bc-5c23464bcec5");
44 private static readonly UUID GRASS_DETAIL = new UUID("63338ede-0037-c4fd-855b-015d77112fc8");
45 private static readonly UUID MOUNTAIN_DETAIL = new UUID("303cd381-8560-7579-23f1-f0a880799740");
46 private static readonly UUID ROCK_DETAIL = new UUID("53a2f406-4895-1d13-d541-d2e3b86bc19c");
47
48 private static readonly UUID[] DEFAULT_TERRAIN_DETAIL = new UUID[]
49 {
50 DIRT_DETAIL,
51 GRASS_DETAIL,
52 MOUNTAIN_DETAIL,
53 ROCK_DETAIL
54 };
55
56 private static readonly Color[] DEFAULT_TERRAIN_COLOR = new Color[]
57 {
58 Color.FromArgb(255, 164, 136, 117),
59 Color.FromArgb(255, 65, 87, 47),
60 Color.FromArgb(255, 157, 145, 131),
61 Color.FromArgb(255, 125, 128, 130)
62 };
63
64 private static readonly UUID TERRAIN_CACHE_MAGIC = new UUID("2c0c7ef2-56be-4eb8-aacb-76712c535b4b");
65
66 #endregion Constants
67
68 private static readonly ILog m_log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name);
69
70 /// <summary>
71 /// Builds a composited terrain texture given the region texture
72 /// and heightmap settings
73 /// </summary>
74 /// <param name="heightmap">Terrain heightmap</param>
75 /// <param name="regionInfo">Region information including terrain texture parameters</param>
76 /// <returns>A composited 256x256 RGB texture ready for rendering</returns>
77 /// <remarks>Based on the algorithm described at http://opensimulator.org/wiki/Terrain_Splatting
78 /// </remarks>
79 public static Bitmap Splat(float[] heightmap, UUID[] textureIDs, float[] startHeights, float[] heightRanges, Vector3d regionPosition, IAssetService assetService, bool textureTerrain)
80 {
81 Debug.Assert(heightmap.Length == 256 * 256);
82 Debug.Assert(textureIDs.Length == 4);
83 Debug.Assert(startHeights.Length == 4);
84 Debug.Assert(heightRanges.Length == 4);
85
86 Bitmap[] detailTexture = new Bitmap[4];
87
88 if (textureTerrain)
89 {
90 // Swap empty terrain textureIDs with default IDs
91 for (int i = 0; i < textureIDs.Length; i++)
92 {
93 if (textureIDs[i] == UUID.Zero)
94 textureIDs[i] = DEFAULT_TERRAIN_DETAIL[i];
95 }
96
97 #region Texture Fetching
98
99 if (assetService != null)
100 {
101 for (int i = 0; i < 4; i++)
102 {
103 AssetBase asset;
104 UUID cacheID = UUID.Combine(TERRAIN_CACHE_MAGIC, textureIDs[i]);
105
106 // Try to fetch a cached copy of the decoded/resized version of this texture
107 asset = assetService.GetCached(cacheID.ToString());
108 if (asset != null)
109 {
110 try
111 {
112 using (System.IO.MemoryStream stream = new System.IO.MemoryStream(asset.Data))
113 detailTexture[i] = (Bitmap)Image.FromStream(stream);
114 }
115 catch (Exception ex)
116 {
117 m_log.Warn("Failed to decode cached terrain texture " + cacheID +
118 " (textureID: " + textureIDs[i] + "): " + ex.Message);
119 }
120 }
121
122 if (detailTexture[i] == null)
123 {
124 // Try to fetch the original JPEG2000 texture, resize if needed, and cache as PNG
125 asset = assetService.Get(textureIDs[i].ToString());
126 if (asset != null)
127 {
128 try { detailTexture[i] = (Bitmap)CSJ2K.J2kImage.FromBytes(asset.Data); }
129 catch (Exception ex)
130 {
131 m_log.Warn("Failed to decode terrain texture " + asset.ID + ": " + ex.Message);
132 }
133 }
134
135 if (detailTexture[i] != null)
136 {
137 Bitmap bitmap = detailTexture[i];
138
139 // Make sure this texture is the correct size, otherwise resize
140 if (bitmap.Width != 256 || bitmap.Height != 256)
141 bitmap = ImageUtils.ResizeImage(bitmap, 256, 256);
142
143 // Save the decoded and resized texture to the cache
144 byte[] data;
145 using (System.IO.MemoryStream stream = new System.IO.MemoryStream())
146 {
147 bitmap.Save(stream, ImageFormat.Png);
148 data = stream.ToArray();
149 }
150
151 // Cache a PNG copy of this terrain texture
152 AssetBase newAsset = new AssetBase
153 {
154 Data = data,
155 Description = "PNG",
156 Flags = AssetFlags.Collectable,
157 FullID = cacheID,
158 ID = cacheID.ToString(),
159 Local = true,
160 Name = String.Empty,
161 Temporary = true,
162 Type = (sbyte)AssetType.Unknown
163 };
164 newAsset.Metadata.ContentType = "image/png";
165 assetService.Store(newAsset);
166 }
167 }
168 }
169 }
170
171 #endregion Texture Fetching
172 }
173
174 // Fill in any missing textures with a solid color
175 for (int i = 0; i < 4; i++)
176 {
177 if (detailTexture[i] == null)
178 {
179 // Create a solid color texture for this layer
180 detailTexture[i] = new Bitmap(256, 256, PixelFormat.Format24bppRgb);
181 using (Graphics gfx = Graphics.FromImage(detailTexture[i]))
182 {
183 using (SolidBrush brush = new SolidBrush(DEFAULT_TERRAIN_COLOR[i]))
184 gfx.FillRectangle(brush, 0, 0, 256, 256);
185 }
186 }
187 }
188
189 #region Layer Map
190
191 float[] layermap = new float[256 * 256];
192
193 for (int y = 0; y < 256; y++)
194 {
195 for (int x = 0; x < 256; x++)
196 {
197 float height = heightmap[y * 256 + x];
198
199 float pctX = (float)x / 255f;
200 float pctY = (float)y / 255f;
201
202 // Use bilinear interpolation between the four corners of start height and
203 // height range to select the current values at this position
204 float startHeight = ImageUtils.Bilinear(
205 startHeights[0],
206 startHeights[2],
207 startHeights[1],
208 startHeights[3],
209 pctX, pctY);
210 startHeight = Utils.Clamp(startHeight, 0f, 255f);
211
212 float heightRange = ImageUtils.Bilinear(
213 heightRanges[0],
214 heightRanges[2],
215 heightRanges[1],
216 heightRanges[3],
217 pctX, pctY);
218 heightRange = Utils.Clamp(heightRange, 0f, 255f);
219
220 // Generate two frequencies of perlin noise based on our global position
221 // The magic values were taken from http://opensimulator.org/wiki/Terrain_Splatting
222 Vector3 vec = new Vector3
223 (
224 ((float)regionPosition.X + x) * 0.20319f,
225 ((float)regionPosition.Y + y) * 0.20319f,
226 height * 0.25f
227 );
228
229 float lowFreq = Perlin.noise2(vec.X * 0.222222f, vec.Y * 0.222222f) * 6.5f;
230 float highFreq = Perlin.turbulence2(vec.X, vec.Y, 2f) * 2.25f;
231 float noise = (lowFreq + highFreq) * 2f;
232
233 // Combine the current height, generated noise, start height, and height range parameters, then scale all of it
234 float layer = ((height + noise - startHeight) / heightRange) * 4f;
235 if (Single.IsNaN(layer)) layer = 0f;
236 layermap[y * 256 + x] = Utils.Clamp(layer, 0f, 3f);
237 }
238 }
239
240 #endregion Layer Map
241
242 #region Texture Compositing
243
244 Bitmap output = new Bitmap(256, 256, PixelFormat.Format24bppRgb);
245 BitmapData outputData = output.LockBits(new Rectangle(0, 0, 256, 256), ImageLockMode.WriteOnly, PixelFormat.Format24bppRgb);
246
247 unsafe
248 {
249 // Get handles to all of the texture data arrays
250 BitmapData[] datas = new BitmapData[]
251 {
252 detailTexture[0].LockBits(new Rectangle(0, 0, 256, 256), ImageLockMode.ReadOnly, detailTexture[0].PixelFormat),
253 detailTexture[1].LockBits(new Rectangle(0, 0, 256, 256), ImageLockMode.ReadOnly, detailTexture[1].PixelFormat),
254 detailTexture[2].LockBits(new Rectangle(0, 0, 256, 256), ImageLockMode.ReadOnly, detailTexture[2].PixelFormat),
255 detailTexture[3].LockBits(new Rectangle(0, 0, 256, 256), ImageLockMode.ReadOnly, detailTexture[3].PixelFormat)
256 };
257
258 int[] comps = new int[]
259 {
260 (datas[0].PixelFormat == PixelFormat.Format32bppArgb) ? 4 : 3,
261 (datas[1].PixelFormat == PixelFormat.Format32bppArgb) ? 4 : 3,
262 (datas[2].PixelFormat == PixelFormat.Format32bppArgb) ? 4 : 3,
263 (datas[3].PixelFormat == PixelFormat.Format32bppArgb) ? 4 : 3
264 };
265
266 for (int y = 0; y < 256; y++)
267 {
268 for (int x = 0; x < 256; x++)
269 {
270 float layer = layermap[y * 256 + x];
271
272 // Select two textures
273 int l0 = (int)Math.Floor(layer);
274 int l1 = Math.Min(l0 + 1, 3);
275
276 byte* ptrA = (byte*)datas[l0].Scan0 + y * datas[l0].Stride + x * comps[l0];
277 byte* ptrB = (byte*)datas[l1].Scan0 + y * datas[l1].Stride + x * comps[l1];
278 byte* ptrO = (byte*)outputData.Scan0 + y * outputData.Stride + x * 3;
279
280 float aB = *(ptrA + 0);
281 float aG = *(ptrA + 1);
282 float aR = *(ptrA + 2);
283
284 float bB = *(ptrB + 0);
285 float bG = *(ptrB + 1);
286 float bR = *(ptrB + 2);
287
288 float layerDiff = layer - l0;
289
290 // Interpolate between the two selected textures
291 *(ptrO + 0) = (byte)Math.Floor(aB + layerDiff * (bB - aB));
292 *(ptrO + 1) = (byte)Math.Floor(aG + layerDiff * (bG - aG));
293 *(ptrO + 2) = (byte)Math.Floor(aR + layerDiff * (bR - aR));
294 }
295 }
296
297 for (int i = 0; i < 4; i++)
298 detailTexture[i].UnlockBits(datas[i]);
299 }
300
301 output.UnlockBits(outputData);
302
303 // We generated the texture upside down, so flip it
304 output.RotateFlip(RotateFlipType.RotateNoneFlipY);
305
306 #endregion Texture Compositing
307
308 return output;
309 }
310
311 public static Bitmap SplatSimple(float[] heightmap)
312 {
313 const float BASE_HSV_H = 93f / 360f;
314 const float BASE_HSV_S = 44f / 100f;
315 const float BASE_HSV_V = 34f / 100f;
316
317 Bitmap img = new Bitmap(256, 256);
318 BitmapData bitmapData = img.LockBits(new Rectangle(0, 0, 256, 256), ImageLockMode.WriteOnly, PixelFormat.Format24bppRgb);
319
320 unsafe
321 {
322 for (int y = 255; y >= 0; y--)
323 {
324 for (int x = 0; x < 256; x++)
325 {
326 float normHeight = heightmap[y * 256 + x] / 255f;
327 normHeight = Utils.Clamp(normHeight, BASE_HSV_V, 1.0f);
328
329 Color4 color = Color4.FromHSV(BASE_HSV_H, BASE_HSV_S, normHeight);
330
331 byte* ptr = (byte*)bitmapData.Scan0 + y * bitmapData.Stride + x * 3;
332 *(ptr + 0) = (byte)(color.B * 255f);
333 *(ptr + 1) = (byte)(color.G * 255f);
334 *(ptr + 2) = (byte)(color.R * 255f);
335 }
336 }
337 }
338
339 img.UnlockBits(bitmapData);
340 return img;
341 }
342 }
343}
diff --git a/OpenSim/Region/CoreModules/World/Warp3DMap/Viewport.cs b/OpenSim/Region/CoreModules/World/Warp3DMap/Viewport.cs
new file mode 100644
index 0000000..472f86e
--- /dev/null
+++ b/OpenSim/Region/CoreModules/World/Warp3DMap/Viewport.cs
@@ -0,0 +1,165 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using System.Drawing;
30using OpenMetaverse;
31
32namespace OpenSim.Region.CoreModules.World.Warp3DMap
33{
34 public class Viewport
35 {
36 private const float DEG_TO_RAD = (float)Math.PI / 180f;
37 private static readonly Vector3 UP_DIRECTION = Vector3.UnitZ;
38
39 public Vector3 Position;
40 public Vector3 LookDirection;
41 public float FieldOfView;
42 public float NearPlaneDistance;
43 public float FarPlaneDistance;
44 public int Width;
45 public int Height;
46 public bool Orthographic;
47 public float OrthoWindowWidth;
48 public float OrthoWindowHeight;
49
50 public Viewport(Vector3 position, Vector3 lookDirection, float fieldOfView, float farPlaneDist, float nearPlaneDist, int width, int height)
51 {
52 // Perspective projection mode
53 Position = position;
54 LookDirection = lookDirection;
55 FieldOfView = fieldOfView;
56 FarPlaneDistance = farPlaneDist;
57 NearPlaneDistance = nearPlaneDist;
58 Width = width;
59 Height = height;
60 }
61
62 public Viewport(Vector3 position, Vector3 lookDirection, float farPlaneDist, float nearPlaneDist, int width, int height, float orthoWindowWidth, float orthoWindowHeight)
63 {
64 // Orthographic projection mode
65 Position = position;
66 LookDirection = lookDirection;
67 FarPlaneDistance = farPlaneDist;
68 NearPlaneDistance = nearPlaneDist;
69 Width = width;
70 Height = height;
71 OrthoWindowWidth = orthoWindowWidth;
72 OrthoWindowHeight = orthoWindowHeight;
73 Orthographic = true;
74 }
75
76 public Point VectorToScreen(Vector3 v)
77 {
78 Matrix4 m = GetWorldToViewportMatrix();
79 Vector3 screenPoint = v * m;
80 return new Point((int)screenPoint.X, (int)screenPoint.Y);
81 }
82
83 public Matrix4 GetWorldToViewportMatrix()
84 {
85 Matrix4 result = GetViewMatrix();
86 result *= GetPerspectiveProjectionMatrix();
87 result *= GetViewportMatrix();
88
89 return result;
90 }
91
92 public Matrix4 GetViewMatrix()
93 {
94 Vector3 zAxis = -LookDirection;
95 zAxis.Normalize();
96
97 Vector3 xAxis = Vector3.Cross(UP_DIRECTION, zAxis);
98 xAxis.Normalize();
99
100 Vector3 yAxis = Vector3.Cross(zAxis, xAxis);
101
102 Vector3 position = Position;
103 float offsetX = -Vector3.Dot(xAxis, position);
104 float offsetY = -Vector3.Dot(yAxis, position);
105 float offsetZ = -Vector3.Dot(zAxis, position);
106
107 return new Matrix4(
108 xAxis.X, yAxis.X, zAxis.X, 0f,
109 xAxis.Y, yAxis.Y, zAxis.Y, 0f,
110 xAxis.Z, yAxis.Z, zAxis.Z, 0f,
111 offsetX, offsetY, offsetZ, 1f);
112 }
113
114 public Matrix4 GetPerspectiveProjectionMatrix()
115 {
116 float aspectRatio = (float)Width / (float)Height;
117
118 float hFoV = FieldOfView * DEG_TO_RAD;
119 float zn = NearPlaneDistance;
120 float zf = FarPlaneDistance;
121
122 float xScale = 1f / (float)Math.Tan(hFoV / 2f);
123 float yScale = aspectRatio * xScale;
124 float m33 = (zf == double.PositiveInfinity) ? -1 : (zf / (zn - zf));
125 float m43 = zn * m33;
126
127 return new Matrix4(
128 xScale, 0f, 0f, 0f,
129 0f, yScale, 0f, 0f,
130 0f, 0f, m33, -1f,
131 0f, 0f, m43, 0f);
132 }
133
134 public Matrix4 GetOrthographicProjectionMatrix(float aspectRatio)
135 {
136 float w = Width;
137 float h = Height;
138 float zn = NearPlaneDistance;
139 float zf = FarPlaneDistance;
140
141 float m33 = 1 / (zn - zf);
142 float m43 = zn * m33;
143
144 return new Matrix4(
145 2f / w, 0f, 0f, 0f,
146 0f, 2f / h, 0f, 0f,
147 0f, 0f, m33, 0f,
148 0f, 0f, m43, 1f);
149 }
150
151 public Matrix4 GetViewportMatrix()
152 {
153 float scaleX = (float)Width * 0.5f;
154 float scaleY = (float)Height * 0.5f;
155 float offsetX = 0f + scaleX;
156 float offsetY = 0f + scaleY;
157
158 return new Matrix4(
159 scaleX, 0f, 0f, 0f,
160 0f, -scaleY, 0f, 0f,
161 0f, 0f, 1f, 0f,
162 offsetX, offsetY, 0f, 1f);
163 }
164 }
165}
diff --git a/OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs b/OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs
index 71cf306..fdbbccf 100644
--- a/OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs
+++ b/OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs
@@ -1011,7 +1011,7 @@ namespace OpenSim.Region.CoreModules.World.WorldMap
1011 if (terrain == null) 1011 if (terrain == null)
1012 return; 1012 return;
1013 1013
1014 byte[] data = terrain.WriteJpeg2000Image("defaultstripe.png"); 1014 byte[] data = terrain.WriteJpeg2000Image();
1015 if (data == null) 1015 if (data == null)
1016 return; 1016 return;
1017 1017
diff --git a/OpenSim/Region/Framework/Interfaces/ITerrain.cs b/OpenSim/Region/Framework/Interfaces/ITerrain.cs
index b42e872..8aacb35 100644
--- a/OpenSim/Region/Framework/Interfaces/ITerrain.cs
+++ b/OpenSim/Region/Framework/Interfaces/ITerrain.cs
@@ -73,7 +73,7 @@ namespace OpenSim.Region.Framework.Interfaces
73 73
74 public interface IMapImageGenerator 74 public interface IMapImageGenerator
75 { 75 {
76 System.Drawing.Bitmap CreateMapTile(string gradientmap); 76 System.Drawing.Bitmap CreateMapTile();
77 byte[] WriteJpeg2000Image(string gradientmap); 77 byte[] WriteJpeg2000Image();
78 } 78 }
79} 79}
diff --git a/OpenSim/Services/Connectors/SimianGrid/SimianGridServiceConnector.cs b/OpenSim/Services/Connectors/SimianGrid/SimianGridServiceConnector.cs
index 0a9f230..8076fab 100644
--- a/OpenSim/Services/Connectors/SimianGrid/SimianGridServiceConnector.cs
+++ b/OpenSim/Services/Connectors/SimianGrid/SimianGridServiceConnector.cs
@@ -411,7 +411,7 @@ namespace OpenSim.Services.Connectors.SimianGrid
411 return; 411 return;
412 } 412 }
413 413
414 using (Image mapTile = tileGenerator.CreateMapTile("defaultstripe.png")) 414 using (Image mapTile = tileGenerator.CreateMapTile())
415 { 415 {
416 using (MemoryStream stream = new MemoryStream()) 416 using (MemoryStream stream = new MemoryStream())
417 { 417 {
diff --git a/ThirdPartyLicenses/MonoAddins.txt b/ThirdPartyLicenses/MonoAddins.txt
new file mode 100644
index 0000000..10c23b3
--- /dev/null
+++ b/ThirdPartyLicenses/MonoAddins.txt
@@ -0,0 +1,41 @@
1Authors: Lluis Sanchez Gual <lluis@novell.com>
2
3The MIT License
4
5Copyright (C) 2007 Novell, Inc (http://www.novell.com)
6
7
8
9Permission is hereby granted, free of charge, to any person obtaining
10a copy
11 of this software and associated documentation files (the "Software"),
12to deal
13 in the Software without restriction, including without limitation
14the rights
15to use, copy, modify, merge, publish, distribute, sublicense,
16and/or sell
17copies of the Software, and to permit persons to whom the
18Software is
19furnished to do so, subject to the following conditions:
20
21
22
23The above copyright notice and this permission notice shall be included in
24
25all copies or substantial portions of the Software.
26
27
28
29THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
30EXPRESS OR
31IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
32MERCHANTABILITY,
33FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT.
34IN NO EVENT SHALL THE
35AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
36DAMAGES OR OTHER
37LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
38OTHERWISE, ARISING FROM,
39OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
40THE USE OR OTHER DEALINGS IN
41THE SOFTWARE.
diff --git a/bin/Mono.Addins.CecilReflector.dll b/bin/Mono.Addins.CecilReflector.dll
new file mode 100644
index 0000000..a1a6382
--- /dev/null
+++ b/bin/Mono.Addins.CecilReflector.dll
Binary files differ
diff --git a/bin/Mono.Addins.Setup.dll b/bin/Mono.Addins.Setup.dll
new file mode 100644
index 0000000..8aa6d5f
--- /dev/null
+++ b/bin/Mono.Addins.Setup.dll
Binary files differ
diff --git a/bin/Mono.Addins.dll b/bin/Mono.Addins.dll
index 5dc9520..ea330fd 100644
--- a/bin/Mono.Addins.dll
+++ b/bin/Mono.Addins.dll
Binary files differ
diff --git a/bin/Warp3D.dll b/bin/Warp3D.dll
new file mode 100644
index 0000000..8781a82
--- /dev/null
+++ b/bin/Warp3D.dll
Binary files differ
diff --git a/prebuild.xml b/prebuild.xml
index 530c417..5746890 100644
--- a/prebuild.xml
+++ b/prebuild.xml
@@ -1370,11 +1370,13 @@
1370 <Configuration name="Debug"> 1370 <Configuration name="Debug">
1371 <Options> 1371 <Options>
1372 <OutputPath>../../../bin/</OutputPath> 1372 <OutputPath>../../../bin/</OutputPath>
1373 <AllowUnsafe>true</AllowUnsafe>
1373 </Options> 1374 </Options>
1374 </Configuration> 1375 </Configuration>
1375 <Configuration name="Release"> 1376 <Configuration name="Release">
1376 <Options> 1377 <Options>
1377 <OutputPath>../../../bin/</OutputPath> 1378 <OutputPath>../../../bin/</OutputPath>
1379 <AllowUnsafe>true</AllowUnsafe>
1378 </Options> 1380 </Options>
1379 </Configuration> 1381 </Configuration>
1380 1382
@@ -1389,6 +1391,7 @@
1389 <Reference name="OpenMetaverse.StructuredData" path="../../../bin/"/> 1391 <Reference name="OpenMetaverse.StructuredData" path="../../../bin/"/>
1390 <Reference name="OpenMetaverse" path="../../../bin/"/> 1392 <Reference name="OpenMetaverse" path="../../../bin/"/>
1391 <Reference name="CSJ2K" path="../../../bin/"/> 1393 <Reference name="CSJ2K" path="../../../bin/"/>
1394 <Reference name="Warp3D" path="../../../bin/" localCopy="true"/>
1392 <Reference name="OpenSim.Framework"/> 1395 <Reference name="OpenSim.Framework"/>
1393 <Reference name="OpenSim.Framework.Capabilities"/> 1396 <Reference name="OpenSim.Framework.Capabilities"/>
1394 <Reference name="OpenSim.Framework.Communications"/> 1397 <Reference name="OpenSim.Framework.Communications"/>