diff options
Diffstat (limited to 'OpenSim')
35 files changed, 4839 insertions, 4635 deletions
diff --git a/OpenSim/Framework/Communications/Cache/AssetCache.cs b/OpenSim/Framework/Communications/Cache/AssetCache.cs index 3d0fd76..a3480ec 100644 --- a/OpenSim/Framework/Communications/Cache/AssetCache.cs +++ b/OpenSim/Framework/Communications/Cache/AssetCache.cs | |||
@@ -1,561 +1,561 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (c) Contributors, http://www.openmetaverse.org/ | 2 | * Copyright (c) Contributors, http://www.openmetaverse.org/ |
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | 3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. |
4 | * | 4 | * |
5 | * Redistribution and use in source and binary forms, with or without | 5 | * Redistribution and use in source and binary forms, with or without |
6 | * modification, are permitted provided that the following conditions are met: | 6 | * modification, are permitted provided that the following conditions are met: |
7 | * * Redistributions of source code must retain the above copyright | 7 | * * Redistributions of source code must retain the above copyright |
8 | * notice, this list of conditions and the following disclaimer. | 8 | * notice, this list of conditions and the following disclaimer. |
9 | * * Redistributions in binary form must reproduce the above copyright | 9 | * * Redistributions in binary form must reproduce the above copyright |
10 | * notice, this list of conditions and the following disclaimer in the | 10 | * notice, this list of conditions and the following disclaimer in the |
11 | * documentation and/or other materials provided with the distribution. | 11 | * documentation and/or other materials provided with the distribution. |
12 | * * Neither the name of the OpenSim Project nor the | 12 | * * Neither the name of the OpenSim Project nor the |
13 | * names of its contributors may be used to endorse or promote products | 13 | * names of its contributors may be used to endorse or promote products |
14 | * derived from this software without specific prior written permission. | 14 | * derived from this software without specific prior written permission. |
15 | * | 15 | * |
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY | 16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY |
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | 17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | 18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | 19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY |
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | 20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | 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 | 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 | 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 | 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. | 25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
26 | * | 26 | * |
27 | */ | 27 | */ |
28 | using System; | 28 | using System; |
29 | using System.Collections; | 29 | using System.Collections; |
30 | using System.Collections.Generic; | 30 | using System.Collections.Generic; |
31 | using System.Text; | 31 | using System.Text; |
32 | using System.Reflection; | 32 | using System.Reflection; |
33 | using System.Threading; | 33 | using System.Threading; |
34 | using libsecondlife; | 34 | using libsecondlife; |
35 | using libsecondlife.Packets; | 35 | using libsecondlife.Packets; |
36 | using OpenSim.Framework.Interfaces; | 36 | using OpenSim.Framework.Interfaces; |
37 | using OpenSim.Framework.Servers; | 37 | using OpenSim.Framework.Servers; |
38 | using OpenSim.Framework.Types; | 38 | using OpenSim.Framework.Types; |
39 | using OpenSim.Framework.Utilities; | 39 | using OpenSim.Framework.Utilities; |
40 | 40 | ||
41 | namespace OpenSim.Framework.Communications.Caches | 41 | namespace OpenSim.Framework.Communications.Caches |
42 | { | 42 | { |
43 | public delegate void DownloadComplete(AssetCache.TextureSender sender); | 43 | public delegate void DownloadComplete(AssetCache.TextureSender sender); |
44 | 44 | ||
45 | public class AssetCache : IAssetReceiver | 45 | public class AssetCache : IAssetReceiver |
46 | { | 46 | { |
47 | // Fields | 47 | // Fields |
48 | private Thread _assetCacheThread; | 48 | private Thread _assetCacheThread; |
49 | private IAssetServer _assetServer; | 49 | private IAssetServer _assetServer; |
50 | public List<AssetRequest> AssetRequests; | 50 | public List<AssetRequest> AssetRequests; |
51 | public Dictionary<LLUUID, AssetInfo> Assets; | 51 | public Dictionary<LLUUID, AssetInfo> Assets; |
52 | public Dictionary<LLUUID, AssetRequest> RequestedAssets; | 52 | public Dictionary<LLUUID, AssetRequest> RequestedAssets; |
53 | public Dictionary<LLUUID, AssetRequest> RequestedTextures; | 53 | public Dictionary<LLUUID, AssetRequest> RequestedTextures; |
54 | public Dictionary<LLUUID, TextureSender> SendingTextures; | 54 | public Dictionary<LLUUID, TextureSender> SendingTextures; |
55 | private LLUUID[] textureList; | 55 | private LLUUID[] textureList; |
56 | public List<AssetRequest> TextureRequests; | 56 | public List<AssetRequest> TextureRequests; |
57 | public Dictionary<LLUUID, TextureImage> Textures; | 57 | public Dictionary<LLUUID, TextureImage> Textures; |
58 | 58 | ||
59 | // Methods | 59 | // Methods |
60 | public AssetCache(IAssetServer assetServer) | 60 | public AssetCache(IAssetServer assetServer) |
61 | { | 61 | { |
62 | this.AssetRequests = new List<AssetRequest>(); | 62 | this.AssetRequests = new List<AssetRequest>(); |
63 | this.TextureRequests = new List<AssetRequest>(); | 63 | this.TextureRequests = new List<AssetRequest>(); |
64 | this.RequestedAssets = new Dictionary<LLUUID, AssetRequest>(); | 64 | this.RequestedAssets = new Dictionary<LLUUID, AssetRequest>(); |
65 | this.RequestedTextures = new Dictionary<LLUUID, AssetRequest>(); | 65 | this.RequestedTextures = new Dictionary<LLUUID, AssetRequest>(); |
66 | this.SendingTextures = new Dictionary<LLUUID, TextureSender>(); | 66 | this.SendingTextures = new Dictionary<LLUUID, TextureSender>(); |
67 | this.textureList = new LLUUID[5]; | 67 | this.textureList = new LLUUID[5]; |
68 | Console.WriteLine("Creating Asset cache"); | 68 | Console.WriteLine("Creating Asset cache"); |
69 | this._assetServer = assetServer; | 69 | this._assetServer = assetServer; |
70 | this._assetServer.SetReceiver(this); | 70 | this._assetServer.SetReceiver(this); |
71 | this.Assets = new Dictionary<LLUUID, AssetInfo>(); | 71 | this.Assets = new Dictionary<LLUUID, AssetInfo>(); |
72 | this.Textures = new Dictionary<LLUUID, TextureImage>(); | 72 | this.Textures = new Dictionary<LLUUID, TextureImage>(); |
73 | this._assetCacheThread = new Thread(new ThreadStart(this.RunAssetManager)); | 73 | this._assetCacheThread = new Thread(new ThreadStart(this.RunAssetManager)); |
74 | this._assetCacheThread.IsBackground = true; | 74 | this._assetCacheThread.IsBackground = true; |
75 | this._assetCacheThread.Start(); | 75 | this._assetCacheThread.Start(); |
76 | } | 76 | } |
77 | 77 | ||
78 | public AssetCache(string assetServerDLLName, string assetServerURL, string assetServerKey) | 78 | public AssetCache(string assetServerDLLName, string assetServerURL, string assetServerKey) |
79 | { | 79 | { |
80 | this.AssetRequests = new List<AssetRequest>(); | 80 | this.AssetRequests = new List<AssetRequest>(); |
81 | this.TextureRequests = new List<AssetRequest>(); | 81 | this.TextureRequests = new List<AssetRequest>(); |
82 | this.RequestedAssets = new Dictionary<LLUUID, AssetRequest>(); | 82 | this.RequestedAssets = new Dictionary<LLUUID, AssetRequest>(); |
83 | this.RequestedTextures = new Dictionary<LLUUID, AssetRequest>(); | 83 | this.RequestedTextures = new Dictionary<LLUUID, AssetRequest>(); |
84 | this.SendingTextures = new Dictionary<LLUUID, TextureSender>(); | 84 | this.SendingTextures = new Dictionary<LLUUID, TextureSender>(); |
85 | this.textureList = new LLUUID[5]; | 85 | this.textureList = new LLUUID[5]; |
86 | Console.WriteLine("Creating Asset cache"); | 86 | Console.WriteLine("Creating Asset cache"); |
87 | this._assetServer = this.LoadAssetDll(assetServerDLLName); | 87 | this._assetServer = this.LoadAssetDll(assetServerDLLName); |
88 | this._assetServer.SetServerInfo(assetServerURL, assetServerKey); | 88 | this._assetServer.SetServerInfo(assetServerURL, assetServerKey); |
89 | this._assetServer.SetReceiver(this); | 89 | this._assetServer.SetReceiver(this); |
90 | this.Assets = new Dictionary<LLUUID, AssetInfo>(); | 90 | this.Assets = new Dictionary<LLUUID, AssetInfo>(); |
91 | this.Textures = new Dictionary<LLUUID, TextureImage>(); | 91 | this.Textures = new Dictionary<LLUUID, TextureImage>(); |
92 | this._assetCacheThread = new Thread(new ThreadStart(this.RunAssetManager)); | 92 | this._assetCacheThread = new Thread(new ThreadStart(this.RunAssetManager)); |
93 | this._assetCacheThread.IsBackground = true; | 93 | this._assetCacheThread.IsBackground = true; |
94 | this._assetCacheThread.Start(); | 94 | this._assetCacheThread.Start(); |
95 | } | 95 | } |
96 | 96 | ||
97 | public void AddAsset(AssetBase asset) | 97 | public void AddAsset(AssetBase asset) |
98 | { | 98 | { |
99 | if (asset.Type == 0) | 99 | if (asset.Type == 0) |
100 | { | 100 | { |
101 | if (!this.Textures.ContainsKey(asset.FullID)) | 101 | if (!this.Textures.ContainsKey(asset.FullID)) |
102 | { | 102 | { |
103 | TextureImage image = new TextureImage(asset); | 103 | TextureImage image = new TextureImage(asset); |
104 | this.Textures.Add(image.FullID, image); | 104 | this.Textures.Add(image.FullID, image); |
105 | this._assetServer.UploadNewAsset(asset); | 105 | this._assetServer.UploadNewAsset(asset); |
106 | } | 106 | } |
107 | } | 107 | } |
108 | else if (!this.Assets.ContainsKey(asset.FullID)) | 108 | else if (!this.Assets.ContainsKey(asset.FullID)) |
109 | { | 109 | { |
110 | AssetInfo info = new AssetInfo(asset); | 110 | AssetInfo info = new AssetInfo(asset); |
111 | this.Assets.Add(info.FullID, info); | 111 | this.Assets.Add(info.FullID, info); |
112 | this._assetServer.UploadNewAsset(asset); | 112 | this._assetServer.UploadNewAsset(asset); |
113 | } | 113 | } |
114 | } | 114 | } |
115 | 115 | ||
116 | public void AddAssetRequest(IClientAPI userInfo, TransferRequestPacket transferRequest) | 116 | public void AddAssetRequest(IClientAPI userInfo, TransferRequestPacket transferRequest) |
117 | { | 117 | { |
118 | LLUUID assetID = new LLUUID(transferRequest.TransferInfo.Params, 0); | 118 | LLUUID assetID = new LLUUID(transferRequest.TransferInfo.Params, 0); |
119 | if (!this.Assets.ContainsKey(assetID)) | 119 | if (!this.Assets.ContainsKey(assetID)) |
120 | { | 120 | { |
121 | if (!this.RequestedAssets.ContainsKey(assetID)) | 121 | if (!this.RequestedAssets.ContainsKey(assetID)) |
122 | { | 122 | { |
123 | AssetRequest request = new AssetRequest(); | 123 | AssetRequest request = new AssetRequest(); |
124 | request.RequestUser = userInfo; | 124 | request.RequestUser = userInfo; |
125 | request.RequestAssetID = assetID; | 125 | request.RequestAssetID = assetID; |
126 | request.TransferRequestID = transferRequest.TransferInfo.TransferID; | 126 | request.TransferRequestID = transferRequest.TransferInfo.TransferID; |
127 | this.RequestedAssets.Add(assetID, request); | 127 | this.RequestedAssets.Add(assetID, request); |
128 | this._assetServer.RequestAsset(assetID, false); | 128 | this._assetServer.RequestAsset(assetID, false); |
129 | } | 129 | } |
130 | } | 130 | } |
131 | else | 131 | else |
132 | { | 132 | { |
133 | AssetInfo info = this.Assets[assetID]; | 133 | AssetInfo info = this.Assets[assetID]; |
134 | AssetRequest request2 = new AssetRequest(); | 134 | AssetRequest request2 = new AssetRequest(); |
135 | request2.RequestUser = userInfo; | 135 | request2.RequestUser = userInfo; |
136 | request2.RequestAssetID = assetID; | 136 | request2.RequestAssetID = assetID; |
137 | request2.TransferRequestID = transferRequest.TransferInfo.TransferID; | 137 | request2.TransferRequestID = transferRequest.TransferInfo.TransferID; |
138 | request2.AssetInf = info; | 138 | request2.AssetInf = info; |
139 | if (info.Data.LongLength > 600) | 139 | if (info.Data.LongLength > 600) |
140 | { | 140 | { |
141 | request2.NumPackets = 1 + (((info.Data.Length - 600) + 0x3e7) / 0x3e8); | 141 | request2.NumPackets = 1 + (((info.Data.Length - 600) + 0x3e7) / 0x3e8); |
142 | } | 142 | } |
143 | else | 143 | else |
144 | { | 144 | { |
145 | request2.NumPackets = 1; | 145 | request2.NumPackets = 1; |
146 | } | 146 | } |
147 | this.AssetRequests.Add(request2); | 147 | this.AssetRequests.Add(request2); |
148 | } | 148 | } |
149 | } | 149 | } |
150 | 150 | ||
151 | public void AddTextureRequest(IClientAPI userInfo, LLUUID imageID) | 151 | public void AddTextureRequest(IClientAPI userInfo, LLUUID imageID) |
152 | { | 152 | { |
153 | if (!this.Textures.ContainsKey(imageID)) | 153 | if (!this.Textures.ContainsKey(imageID)) |
154 | { | 154 | { |
155 | if (!this.RequestedTextures.ContainsKey(imageID)) | 155 | if (!this.RequestedTextures.ContainsKey(imageID)) |
156 | { | 156 | { |
157 | AssetRequest request = new AssetRequest(); | 157 | AssetRequest request = new AssetRequest(); |
158 | request.RequestUser = userInfo; | 158 | request.RequestUser = userInfo; |
159 | request.RequestAssetID = imageID; | 159 | request.RequestAssetID = imageID; |
160 | request.IsTextureRequest = true; | 160 | request.IsTextureRequest = true; |
161 | this.RequestedTextures.Add(imageID, request); | 161 | this.RequestedTextures.Add(imageID, request); |
162 | this._assetServer.RequestAsset(imageID, true); | 162 | this._assetServer.RequestAsset(imageID, true); |
163 | } | 163 | } |
164 | } | 164 | } |
165 | else | 165 | else |
166 | { | 166 | { |
167 | TextureImage image = this.Textures[imageID]; | 167 | TextureImage image = this.Textures[imageID]; |
168 | AssetRequest request2 = new AssetRequest(); | 168 | AssetRequest request2 = new AssetRequest(); |
169 | request2.RequestUser = userInfo; | 169 | request2.RequestUser = userInfo; |
170 | request2.RequestAssetID = imageID; | 170 | request2.RequestAssetID = imageID; |
171 | request2.IsTextureRequest = true; | 171 | request2.IsTextureRequest = true; |
172 | request2.ImageInfo = image; | 172 | request2.ImageInfo = image; |
173 | if (image.Data.LongLength > 600) | 173 | if (image.Data.LongLength > 600) |
174 | { | 174 | { |
175 | request2.NumPackets = 1 + (((image.Data.Length - 600) + 0x3e7) / 0x3e8); | 175 | request2.NumPackets = 1 + (((image.Data.Length - 600) + 0x3e7) / 0x3e8); |
176 | } | 176 | } |
177 | else | 177 | else |
178 | { | 178 | { |
179 | request2.NumPackets = 1; | 179 | request2.NumPackets = 1; |
180 | } | 180 | } |
181 | this.TextureRequests.Add(request2); | 181 | this.TextureRequests.Add(request2); |
182 | } | 182 | } |
183 | } | 183 | } |
184 | 184 | ||
185 | public void AssetNotFound(AssetBase asset) | 185 | public void AssetNotFound(AssetBase asset) |
186 | { | 186 | { |
187 | } | 187 | } |
188 | 188 | ||
189 | public void AssetReceived(AssetBase asset, bool IsTexture) | 189 | public void AssetReceived(AssetBase asset, bool IsTexture) |
190 | { | 190 | { |
191 | if (asset.FullID != LLUUID.Zero) | 191 | if (asset.FullID != LLUUID.Zero) |
192 | { | 192 | { |
193 | if (IsTexture) | 193 | if (IsTexture) |
194 | { | 194 | { |
195 | TextureImage image = new TextureImage(asset); | 195 | TextureImage image = new TextureImage(asset); |
196 | this.Textures.Add(image.FullID, image); | 196 | this.Textures.Add(image.FullID, image); |
197 | if (this.RequestedTextures.ContainsKey(image.FullID)) | 197 | if (this.RequestedTextures.ContainsKey(image.FullID)) |
198 | { | 198 | { |
199 | AssetRequest request = this.RequestedTextures[image.FullID]; | 199 | AssetRequest request = this.RequestedTextures[image.FullID]; |
200 | request.ImageInfo = image; | 200 | request.ImageInfo = image; |
201 | if (image.Data.LongLength > 600) | 201 | if (image.Data.LongLength > 600) |
202 | { | 202 | { |
203 | request.NumPackets = 1 + (((image.Data.Length - 600) + 0x3e7) / 0x3e8); | 203 | request.NumPackets = 1 + (((image.Data.Length - 600) + 0x3e7) / 0x3e8); |
204 | } | 204 | } |
205 | else | 205 | else |
206 | { | 206 | { |
207 | request.NumPackets = 1; | 207 | request.NumPackets = 1; |
208 | } | 208 | } |
209 | this.RequestedTextures.Remove(image.FullID); | 209 | this.RequestedTextures.Remove(image.FullID); |
210 | this.TextureRequests.Add(request); | 210 | this.TextureRequests.Add(request); |
211 | } | 211 | } |
212 | } | 212 | } |
213 | else | 213 | else |
214 | { | 214 | { |
215 | AssetInfo info = new AssetInfo(asset); | 215 | AssetInfo info = new AssetInfo(asset); |
216 | this.Assets.Add(info.FullID, info); | 216 | this.Assets.Add(info.FullID, info); |
217 | if (this.RequestedAssets.ContainsKey(info.FullID)) | 217 | if (this.RequestedAssets.ContainsKey(info.FullID)) |
218 | { | 218 | { |
219 | AssetRequest request2 = this.RequestedAssets[info.FullID]; | 219 | AssetRequest request2 = this.RequestedAssets[info.FullID]; |
220 | request2.AssetInf = info; | 220 | request2.AssetInf = info; |
221 | if (info.Data.LongLength > 600) | 221 | if (info.Data.LongLength > 600) |
222 | { | 222 | { |
223 | request2.NumPackets = 1 + (((info.Data.Length - 600) + 0x3e7) / 0x3e8); | 223 | request2.NumPackets = 1 + (((info.Data.Length - 600) + 0x3e7) / 0x3e8); |
224 | } | 224 | } |
225 | else | 225 | else |
226 | { | 226 | { |
227 | request2.NumPackets = 1; | 227 | request2.NumPackets = 1; |
228 | } | 228 | } |
229 | this.RequestedAssets.Remove(info.FullID); | 229 | this.RequestedAssets.Remove(info.FullID); |
230 | this.AssetRequests.Add(request2); | 230 | this.AssetRequests.Add(request2); |
231 | } | 231 | } |
232 | } | 232 | } |
233 | } | 233 | } |
234 | } | 234 | } |
235 | 235 | ||
236 | public AssetInfo CloneAsset(LLUUID newOwner, AssetInfo sourceAsset) | 236 | public AssetInfo CloneAsset(LLUUID newOwner, AssetInfo sourceAsset) |
237 | { | 237 | { |
238 | AssetInfo info = new AssetInfo(); | 238 | AssetInfo info = new AssetInfo(); |
239 | info.Data = new byte[sourceAsset.Data.Length]; | 239 | info.Data = new byte[sourceAsset.Data.Length]; |
240 | Array.Copy(sourceAsset.Data, info.Data, sourceAsset.Data.Length); | 240 | Array.Copy(sourceAsset.Data, info.Data, sourceAsset.Data.Length); |
241 | info.FullID = LLUUID.Random(); | 241 | info.FullID = LLUUID.Random(); |
242 | info.Type = sourceAsset.Type; | 242 | info.Type = sourceAsset.Type; |
243 | info.InvType = sourceAsset.InvType; | 243 | info.InvType = sourceAsset.InvType; |
244 | return info; | 244 | return info; |
245 | } | 245 | } |
246 | 246 | ||
247 | public TextureImage CloneImage(LLUUID newOwner, TextureImage source) | 247 | public TextureImage CloneImage(LLUUID newOwner, TextureImage source) |
248 | { | 248 | { |
249 | TextureImage image = new TextureImage(); | 249 | TextureImage image = new TextureImage(); |
250 | image.Data = new byte[source.Data.Length]; | 250 | image.Data = new byte[source.Data.Length]; |
251 | Array.Copy(source.Data, image.Data, source.Data.Length); | 251 | Array.Copy(source.Data, image.Data, source.Data.Length); |
252 | image.FullID = LLUUID.Random(); | 252 | image.FullID = LLUUID.Random(); |
253 | image.Name = source.Name; | 253 | image.Name = source.Name; |
254 | return image; | 254 | return image; |
255 | } | 255 | } |
256 | 256 | ||
257 | public AssetBase[] CreateNewInventorySet(LLUUID agentID) | 257 | public AssetBase[] CreateNewInventorySet(LLUUID agentID) |
258 | { | 258 | { |
259 | AssetBase[] baseArray = new AssetBase[this.textureList.Length]; | 259 | AssetBase[] baseArray = new AssetBase[this.textureList.Length]; |
260 | for (int i = 0; i < this.textureList.Length; i++) | 260 | for (int i = 0; i < this.textureList.Length; i++) |
261 | { | 261 | { |
262 | if (this.Textures.ContainsKey(this.textureList[i])) | 262 | if (this.Textures.ContainsKey(this.textureList[i])) |
263 | { | 263 | { |
264 | baseArray[i] = this.CloneImage(agentID, this.Textures[this.textureList[i]]); | 264 | baseArray[i] = this.CloneImage(agentID, this.Textures[this.textureList[i]]); |
265 | TextureImage asset = new TextureImage(baseArray[i]); | 265 | TextureImage asset = new TextureImage(baseArray[i]); |
266 | this.Textures.Add(asset.FullID, asset); | 266 | this.Textures.Add(asset.FullID, asset); |
267 | this._assetServer.UploadNewAsset(asset); | 267 | this._assetServer.UploadNewAsset(asset); |
268 | } | 268 | } |
269 | } | 269 | } |
270 | return baseArray; | 270 | return baseArray; |
271 | } | 271 | } |
272 | 272 | ||
273 | public AssetBase GetAsset(LLUUID assetID) | 273 | public AssetBase GetAsset(LLUUID assetID) |
274 | { | 274 | { |
275 | AssetBase base2 = null; | 275 | AssetBase base2 = null; |
276 | if (this.Textures.ContainsKey(assetID)) | 276 | if (this.Textures.ContainsKey(assetID)) |
277 | { | 277 | { |
278 | return this.Textures[assetID]; | 278 | return this.Textures[assetID]; |
279 | } | 279 | } |
280 | if (this.Assets.ContainsKey(assetID)) | 280 | if (this.Assets.ContainsKey(assetID)) |
281 | { | 281 | { |
282 | base2 = this.Assets[assetID]; | 282 | base2 = this.Assets[assetID]; |
283 | } | 283 | } |
284 | return base2; | 284 | return base2; |
285 | } | 285 | } |
286 | 286 | ||
287 | private IAssetServer LoadAssetDll(string dllName) | 287 | private IAssetServer LoadAssetDll(string dllName) |
288 | { | 288 | { |
289 | Assembly assembly = Assembly.LoadFrom(dllName); | 289 | Assembly assembly = Assembly.LoadFrom(dllName); |
290 | IAssetServer assetServer = null; | 290 | IAssetServer assetServer = null; |
291 | foreach (Type type in assembly.GetTypes()) | 291 | foreach (Type type in assembly.GetTypes()) |
292 | { | 292 | { |
293 | if (type.IsPublic && !type.IsAbstract) | 293 | if (type.IsPublic && !type.IsAbstract) |
294 | { | 294 | { |
295 | if (type.GetInterface("IAssetPlugin", true) != null) | 295 | if (type.GetInterface("IAssetPlugin", true) != null) |
296 | { | 296 | { |
297 | assetServer = ((IAssetPlugin)Activator.CreateInstance(assembly.GetType(type.ToString()))).GetAssetServer(); | 297 | assetServer = ((IAssetPlugin)Activator.CreateInstance(assembly.GetType(type.ToString()))).GetAssetServer(); |
298 | break; | 298 | break; |
299 | } | 299 | } |
300 | } | 300 | } |
301 | } | 301 | } |
302 | assembly = null; | 302 | assembly = null; |
303 | return assetServer; | 303 | return assetServer; |
304 | } | 304 | } |
305 | 305 | ||
306 | public void LoadDefaultTextureSet() | 306 | public void LoadDefaultTextureSet() |
307 | { | 307 | { |
308 | this.textureList[0] = new LLUUID("00000000-0000-0000-9999-000000000001"); | 308 | this.textureList[0] = new LLUUID("00000000-0000-0000-9999-000000000001"); |
309 | this.textureList[1] = new LLUUID("00000000-0000-0000-9999-000000000002"); | 309 | this.textureList[1] = new LLUUID("00000000-0000-0000-9999-000000000002"); |
310 | this.textureList[2] = new LLUUID("00000000-0000-0000-9999-000000000003"); | 310 | this.textureList[2] = new LLUUID("00000000-0000-0000-9999-000000000003"); |
311 | this.textureList[3] = new LLUUID("00000000-0000-0000-9999-000000000004"); | 311 | this.textureList[3] = new LLUUID("00000000-0000-0000-9999-000000000004"); |
312 | this.textureList[4] = new LLUUID("00000000-0000-0000-9999-000000000005"); | 312 | this.textureList[4] = new LLUUID("00000000-0000-0000-9999-000000000005"); |
313 | for (int i = 0; i < this.textureList.Length; i++) | 313 | for (int i = 0; i < this.textureList.Length; i++) |
314 | { | 314 | { |
315 | this._assetServer.RequestAsset(this.textureList[i], true); | 315 | this._assetServer.RequestAsset(this.textureList[i], true); |
316 | } | 316 | } |
317 | } | 317 | } |
318 | 318 | ||
319 | private void ProcessAssetQueue() | 319 | private void ProcessAssetQueue() |
320 | { | 320 | { |
321 | if (this.AssetRequests.Count != 0) | 321 | if (this.AssetRequests.Count != 0) |
322 | { | 322 | { |
323 | int num; | 323 | int num; |
324 | if (this.AssetRequests.Count < 5) | 324 | if (this.AssetRequests.Count < 5) |
325 | { | 325 | { |
326 | num = this.AssetRequests.Count; | 326 | num = this.AssetRequests.Count; |
327 | } | 327 | } |
328 | else | 328 | else |
329 | { | 329 | { |
330 | num = 5; | 330 | num = 5; |
331 | } | 331 | } |
332 | for (int i = 0; i < num; i++) | 332 | for (int i = 0; i < num; i++) |
333 | { | 333 | { |
334 | AssetRequest request = this.AssetRequests[i]; | 334 | AssetRequest request = this.AssetRequests[i]; |
335 | TransferInfoPacket newPack = new TransferInfoPacket(); | 335 | TransferInfoPacket newPack = new TransferInfoPacket(); |
336 | newPack.TransferInfo.ChannelType = 2; | 336 | newPack.TransferInfo.ChannelType = 2; |
337 | newPack.TransferInfo.Status = 0; | 337 | newPack.TransferInfo.Status = 0; |
338 | newPack.TransferInfo.TargetType = 0; | 338 | newPack.TransferInfo.TargetType = 0; |
339 | newPack.TransferInfo.Params = request.RequestAssetID.GetBytes(); | 339 | newPack.TransferInfo.Params = request.RequestAssetID.GetBytes(); |
340 | newPack.TransferInfo.Size = request.AssetInf.Data.Length; | 340 | newPack.TransferInfo.Size = request.AssetInf.Data.Length; |
341 | newPack.TransferInfo.TransferID = request.TransferRequestID; | 341 | newPack.TransferInfo.TransferID = request.TransferRequestID; |
342 | request.RequestUser.OutPacket(newPack); | 342 | request.RequestUser.OutPacket(newPack); |
343 | if (request.NumPackets == 1) | 343 | if (request.NumPackets == 1) |
344 | { | 344 | { |
345 | TransferPacketPacket packet2 = new TransferPacketPacket(); | 345 | TransferPacketPacket packet2 = new TransferPacketPacket(); |
346 | packet2.TransferData.Packet = 0; | 346 | packet2.TransferData.Packet = 0; |
347 | packet2.TransferData.ChannelType = 2; | 347 | packet2.TransferData.ChannelType = 2; |
348 | packet2.TransferData.TransferID = request.TransferRequestID; | 348 | packet2.TransferData.TransferID = request.TransferRequestID; |
349 | packet2.TransferData.Data = request.AssetInf.Data; | 349 | packet2.TransferData.Data = request.AssetInf.Data; |
350 | packet2.TransferData.Status = 1; | 350 | packet2.TransferData.Status = 1; |
351 | request.RequestUser.OutPacket(packet2); | 351 | request.RequestUser.OutPacket(packet2); |
352 | } | 352 | } |
353 | else | 353 | else |
354 | { | 354 | { |
355 | TransferPacketPacket packet3 = new TransferPacketPacket(); | 355 | TransferPacketPacket packet3 = new TransferPacketPacket(); |
356 | packet3.TransferData.Packet = 0; | 356 | packet3.TransferData.Packet = 0; |
357 | packet3.TransferData.ChannelType = 2; | 357 | packet3.TransferData.ChannelType = 2; |
358 | packet3.TransferData.TransferID = request.TransferRequestID; | 358 | packet3.TransferData.TransferID = request.TransferRequestID; |
359 | byte[] destinationArray = new byte[0x3e8]; | 359 | byte[] destinationArray = new byte[0x3e8]; |
360 | Array.Copy(request.AssetInf.Data, destinationArray, 0x3e8); | 360 | Array.Copy(request.AssetInf.Data, destinationArray, 0x3e8); |
361 | packet3.TransferData.Data = destinationArray; | 361 | packet3.TransferData.Data = destinationArray; |
362 | packet3.TransferData.Status = 0; | 362 | packet3.TransferData.Status = 0; |
363 | request.RequestUser.OutPacket(packet3); | 363 | request.RequestUser.OutPacket(packet3); |
364 | packet3 = new TransferPacketPacket(); | 364 | packet3 = new TransferPacketPacket(); |
365 | packet3.TransferData.Packet = 1; | 365 | packet3.TransferData.Packet = 1; |
366 | packet3.TransferData.ChannelType = 2; | 366 | packet3.TransferData.ChannelType = 2; |
367 | packet3.TransferData.TransferID = request.TransferRequestID; | 367 | packet3.TransferData.TransferID = request.TransferRequestID; |
368 | byte[] buffer2 = new byte[request.AssetInf.Data.Length - 0x3e8]; | 368 | byte[] buffer2 = new byte[request.AssetInf.Data.Length - 0x3e8]; |
369 | Array.Copy(request.AssetInf.Data, 0x3e8, buffer2, 0, buffer2.Length); | 369 | Array.Copy(request.AssetInf.Data, 0x3e8, buffer2, 0, buffer2.Length); |
370 | packet3.TransferData.Data = buffer2; | 370 | packet3.TransferData.Data = buffer2; |
371 | packet3.TransferData.Status = 1; | 371 | packet3.TransferData.Status = 1; |
372 | request.RequestUser.OutPacket(packet3); | 372 | request.RequestUser.OutPacket(packet3); |
373 | } | 373 | } |
374 | } | 374 | } |
375 | for (int j = 0; j < num; j++) | 375 | for (int j = 0; j < num; j++) |
376 | { | 376 | { |
377 | this.AssetRequests.RemoveAt(0); | 377 | this.AssetRequests.RemoveAt(0); |
378 | } | 378 | } |
379 | } | 379 | } |
380 | } | 380 | } |
381 | 381 | ||
382 | private void ProcessTextureQueue() | 382 | private void ProcessTextureQueue() |
383 | { | 383 | { |
384 | if (this.TextureRequests.Count != 0) | 384 | if (this.TextureRequests.Count != 0) |
385 | { | 385 | { |
386 | int num = this.TextureRequests.Count; | 386 | int num = this.TextureRequests.Count; |
387 | for (int i = 0; i < num; i++) | 387 | for (int i = 0; i < num; i++) |
388 | { | 388 | { |
389 | AssetRequest req = this.TextureRequests[i]; | 389 | AssetRequest req = this.TextureRequests[i]; |
390 | if (!this.SendingTextures.ContainsKey(req.ImageInfo.FullID)) | 390 | if (!this.SendingTextures.ContainsKey(req.ImageInfo.FullID)) |
391 | { | 391 | { |
392 | TextureSender sender = new TextureSender(req); | 392 | TextureSender sender = new TextureSender(req); |
393 | sender.OnComplete += new DownloadComplete(this.TextureSent); | 393 | sender.OnComplete += new DownloadComplete(this.TextureSent); |
394 | lock (this.SendingTextures) | 394 | lock (this.SendingTextures) |
395 | { | 395 | { |
396 | this.SendingTextures.Add(req.ImageInfo.FullID, sender); | 396 | this.SendingTextures.Add(req.ImageInfo.FullID, sender); |
397 | } | 397 | } |
398 | } | 398 | } |
399 | } | 399 | } |
400 | this.TextureRequests.Clear(); | 400 | this.TextureRequests.Clear(); |
401 | } | 401 | } |
402 | } | 402 | } |
403 | 403 | ||
404 | public void RunAssetManager() | 404 | public void RunAssetManager() |
405 | { | 405 | { |
406 | Label_0000: | 406 | Label_0000: |
407 | try | 407 | try |
408 | { | 408 | { |
409 | this.ProcessAssetQueue(); | 409 | this.ProcessAssetQueue(); |
410 | this.ProcessTextureQueue(); | 410 | this.ProcessTextureQueue(); |
411 | Thread.Sleep(500); | 411 | Thread.Sleep(500); |
412 | goto Label_0000; | 412 | goto Label_0000; |
413 | } | 413 | } |
414 | catch (Exception exception) | 414 | catch (Exception exception) |
415 | { | 415 | { |
416 | Console.WriteLine(exception.Message); | 416 | Console.WriteLine(exception.Message); |
417 | goto Label_0000; | 417 | goto Label_0000; |
418 | } | 418 | } |
419 | } | 419 | } |
420 | 420 | ||
421 | public void TextureSent(TextureSender sender) | 421 | public void TextureSent(TextureSender sender) |
422 | { | 422 | { |
423 | if (this.SendingTextures.ContainsKey(sender.request.ImageInfo.FullID)) | 423 | if (this.SendingTextures.ContainsKey(sender.request.ImageInfo.FullID)) |
424 | { | 424 | { |
425 | lock (this.SendingTextures) | 425 | lock (this.SendingTextures) |
426 | { | 426 | { |
427 | this.SendingTextures.Remove(sender.request.ImageInfo.FullID); | 427 | this.SendingTextures.Remove(sender.request.ImageInfo.FullID); |
428 | } | 428 | } |
429 | } | 429 | } |
430 | } | 430 | } |
431 | 431 | ||
432 | // Nested Types | 432 | // Nested Types |
433 | public class AssetInfo : AssetBase | 433 | public class AssetInfo : AssetBase |
434 | { | 434 | { |
435 | // Methods | 435 | // Methods |
436 | public AssetInfo() | 436 | public AssetInfo() |
437 | { | 437 | { |
438 | } | 438 | } |
439 | 439 | ||
440 | public AssetInfo(AssetBase aBase) | 440 | public AssetInfo(AssetBase aBase) |
441 | { | 441 | { |
442 | base.Data = aBase.Data; | 442 | base.Data = aBase.Data; |
443 | base.FullID = aBase.FullID; | 443 | base.FullID = aBase.FullID; |
444 | base.Type = aBase.Type; | 444 | base.Type = aBase.Type; |
445 | base.InvType = aBase.InvType; | 445 | base.InvType = aBase.InvType; |
446 | base.Name = aBase.Name; | 446 | base.Name = aBase.Name; |
447 | base.Description = aBase.Description; | 447 | base.Description = aBase.Description; |
448 | } | 448 | } |
449 | } | 449 | } |
450 | 450 | ||
451 | public class AssetRequest | 451 | public class AssetRequest |
452 | { | 452 | { |
453 | // Fields | 453 | // Fields |
454 | public AssetCache.AssetInfo AssetInf; | 454 | public AssetCache.AssetInfo AssetInf; |
455 | public long DataPointer; | 455 | public long DataPointer; |
456 | public AssetCache.TextureImage ImageInfo; | 456 | public AssetCache.TextureImage ImageInfo; |
457 | public bool IsTextureRequest; | 457 | public bool IsTextureRequest; |
458 | public int NumPackets; | 458 | public int NumPackets; |
459 | public int PacketCounter; | 459 | public int PacketCounter; |
460 | public LLUUID RequestAssetID; | 460 | public LLUUID RequestAssetID; |
461 | public IClientAPI RequestUser; | 461 | public IClientAPI RequestUser; |
462 | public LLUUID TransferRequestID; | 462 | public LLUUID TransferRequestID; |
463 | } | 463 | } |
464 | 464 | ||
465 | public class TextureImage : AssetBase | 465 | public class TextureImage : AssetBase |
466 | { | 466 | { |
467 | // Methods | 467 | // Methods |
468 | public TextureImage() | 468 | public TextureImage() |
469 | { | 469 | { |
470 | } | 470 | } |
471 | 471 | ||
472 | public TextureImage(AssetBase aBase) | 472 | public TextureImage(AssetBase aBase) |
473 | { | 473 | { |
474 | base.Data = aBase.Data; | 474 | base.Data = aBase.Data; |
475 | base.FullID = aBase.FullID; | 475 | base.FullID = aBase.FullID; |
476 | base.Type = aBase.Type; | 476 | base.Type = aBase.Type; |
477 | base.InvType = aBase.InvType; | 477 | base.InvType = aBase.InvType; |
478 | base.Name = aBase.Name; | 478 | base.Name = aBase.Name; |
479 | base.Description = aBase.Description; | 479 | base.Description = aBase.Description; |
480 | } | 480 | } |
481 | } | 481 | } |
482 | 482 | ||
483 | public class TextureSender | 483 | public class TextureSender |
484 | { | 484 | { |
485 | // Fields | 485 | // Fields |
486 | private Thread m_thread; | 486 | private Thread m_thread; |
487 | public AssetCache.AssetRequest request; | 487 | public AssetCache.AssetRequest request; |
488 | 488 | ||
489 | // Events | 489 | // Events |
490 | public event DownloadComplete OnComplete; | 490 | public event DownloadComplete OnComplete; |
491 | 491 | ||
492 | // Methods | 492 | // Methods |
493 | public TextureSender(AssetCache.AssetRequest req) | 493 | public TextureSender(AssetCache.AssetRequest req) |
494 | { | 494 | { |
495 | this.request = req; | 495 | this.request = req; |
496 | this.m_thread = new Thread(new ThreadStart(this.SendTexture)); | 496 | this.m_thread = new Thread(new ThreadStart(this.SendTexture)); |
497 | this.m_thread.IsBackground = true; | 497 | this.m_thread.IsBackground = true; |
498 | this.m_thread.Start(); | 498 | this.m_thread.Start(); |
499 | } | 499 | } |
500 | 500 | ||
501 | public void SendPacket() | 501 | public void SendPacket() |
502 | { | 502 | { |
503 | AssetCache.AssetRequest request = this.request; | 503 | AssetCache.AssetRequest request = this.request; |
504 | if (request.PacketCounter == 0) | 504 | if (request.PacketCounter == 0) |
505 | { | 505 | { |
506 | if (request.NumPackets == 1) | 506 | if (request.NumPackets == 1) |
507 | { | 507 | { |
508 | ImageDataPacket newPack = new ImageDataPacket(); | 508 | ImageDataPacket newPack = new ImageDataPacket(); |
509 | newPack.ImageID.Packets = 1; | 509 | newPack.ImageID.Packets = 1; |
510 | newPack.ImageID.ID = request.ImageInfo.FullID; | 510 | newPack.ImageID.ID = request.ImageInfo.FullID; |
511 | newPack.ImageID.Size = (uint)request.ImageInfo.Data.Length; | 511 | newPack.ImageID.Size = (uint)request.ImageInfo.Data.Length; |
512 | newPack.ImageData.Data = request.ImageInfo.Data; | 512 | newPack.ImageData.Data = request.ImageInfo.Data; |
513 | newPack.ImageID.Codec = 2; | 513 | newPack.ImageID.Codec = 2; |
514 | request.RequestUser.OutPacket(newPack); | 514 | request.RequestUser.OutPacket(newPack); |
515 | request.PacketCounter++; | 515 | request.PacketCounter++; |
516 | } | 516 | } |
517 | else | 517 | else |
518 | { | 518 | { |
519 | ImageDataPacket packet2 = new ImageDataPacket(); | 519 | ImageDataPacket packet2 = new ImageDataPacket(); |
520 | packet2.ImageID.Packets = (ushort)request.NumPackets; | 520 | packet2.ImageID.Packets = (ushort)request.NumPackets; |
521 | packet2.ImageID.ID = request.ImageInfo.FullID; | 521 | packet2.ImageID.ID = request.ImageInfo.FullID; |
522 | packet2.ImageID.Size = (uint)request.ImageInfo.Data.Length; | 522 | packet2.ImageID.Size = (uint)request.ImageInfo.Data.Length; |
523 | packet2.ImageData.Data = new byte[600]; | 523 | packet2.ImageData.Data = new byte[600]; |
524 | Array.Copy(request.ImageInfo.Data, 0, packet2.ImageData.Data, 0, 600); | 524 | Array.Copy(request.ImageInfo.Data, 0, packet2.ImageData.Data, 0, 600); |
525 | packet2.ImageID.Codec = 2; | 525 | packet2.ImageID.Codec = 2; |
526 | request.RequestUser.OutPacket(packet2); | 526 | request.RequestUser.OutPacket(packet2); |
527 | request.PacketCounter++; | 527 | request.PacketCounter++; |
528 | } | 528 | } |
529 | } | 529 | } |
530 | else | 530 | else |
531 | { | 531 | { |
532 | ImagePacketPacket packet3 = new ImagePacketPacket(); | 532 | ImagePacketPacket packet3 = new ImagePacketPacket(); |
533 | packet3.ImageID.Packet = (ushort)request.PacketCounter; | 533 | packet3.ImageID.Packet = (ushort)request.PacketCounter; |
534 | packet3.ImageID.ID = request.ImageInfo.FullID; | 534 | packet3.ImageID.ID = request.ImageInfo.FullID; |
535 | int length = (request.ImageInfo.Data.Length - 600) - (0x3e8 * (request.PacketCounter - 1)); | 535 | int length = (request.ImageInfo.Data.Length - 600) - (0x3e8 * (request.PacketCounter - 1)); |
536 | if (length > 0x3e8) | 536 | if (length > 0x3e8) |
537 | { | 537 | { |
538 | length = 0x3e8; | 538 | length = 0x3e8; |
539 | } | 539 | } |
540 | packet3.ImageData.Data = new byte[length]; | 540 | packet3.ImageData.Data = new byte[length]; |
541 | Array.Copy(request.ImageInfo.Data, 600 + (0x3e8 * (request.PacketCounter - 1)), packet3.ImageData.Data, 0, length); | 541 | Array.Copy(request.ImageInfo.Data, 600 + (0x3e8 * (request.PacketCounter - 1)), packet3.ImageData.Data, 0, length); |
542 | request.RequestUser.OutPacket(packet3); | 542 | request.RequestUser.OutPacket(packet3); |
543 | request.PacketCounter++; | 543 | request.PacketCounter++; |
544 | } | 544 | } |
545 | } | 545 | } |
546 | 546 | ||
547 | public void SendTexture() | 547 | public void SendTexture() |
548 | { | 548 | { |
549 | while (this.request.PacketCounter != this.request.NumPackets) | 549 | while (this.request.PacketCounter != this.request.NumPackets) |
550 | { | 550 | { |
551 | this.SendPacket(); | 551 | this.SendPacket(); |
552 | Thread.Sleep(500); | 552 | Thread.Sleep(500); |
553 | } | 553 | } |
554 | if (this.OnComplete != null) | 554 | if (this.OnComplete != null) |
555 | { | 555 | { |
556 | this.OnComplete(this); | 556 | this.OnComplete(this); |
557 | } | 557 | } |
558 | } | 558 | } |
559 | } | 559 | } |
560 | } | 560 | } |
561 | } | 561 | } |
diff --git a/OpenSim/Framework/Communications/Cache/AssetTransactionManager.cs b/OpenSim/Framework/Communications/Cache/AssetTransactionManager.cs index 8b485af..f9f814a 100644 --- a/OpenSim/Framework/Communications/Cache/AssetTransactionManager.cs +++ b/OpenSim/Framework/Communications/Cache/AssetTransactionManager.cs | |||
@@ -1,81 +1,81 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (c) Contributors, http://www.openmetaverse.org/ | 2 | * Copyright (c) Contributors, http://www.openmetaverse.org/ |
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | 3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. |
4 | * | 4 | * |
5 | * Redistribution and use in source and binary forms, with or without | 5 | * Redistribution and use in source and binary forms, with or without |
6 | * modification, are permitted provided that the following conditions are met: | 6 | * modification, are permitted provided that the following conditions are met: |
7 | * * Redistributions of source code must retain the above copyright | 7 | * * Redistributions of source code must retain the above copyright |
8 | * notice, this list of conditions and the following disclaimer. | 8 | * notice, this list of conditions and the following disclaimer. |
9 | * * Redistributions in binary form must reproduce the above copyright | 9 | * * Redistributions in binary form must reproduce the above copyright |
10 | * notice, this list of conditions and the following disclaimer in the | 10 | * notice, this list of conditions and the following disclaimer in the |
11 | * documentation and/or other materials provided with the distribution. | 11 | * documentation and/or other materials provided with the distribution. |
12 | * * Neither the name of the OpenSim Project nor the | 12 | * * Neither the name of the OpenSim Project nor the |
13 | * names of its contributors may be used to endorse or promote products | 13 | * names of its contributors may be used to endorse or promote products |
14 | * derived from this software without specific prior written permission. | 14 | * derived from this software without specific prior written permission. |
15 | * | 15 | * |
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY | 16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY |
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | 17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | 18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | 19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY |
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | 20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | 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 | 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 | 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 | 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. | 25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
26 | * | 26 | * |
27 | */ | 27 | */ |
28 | using System; | 28 | using System; |
29 | using System.Collections; | 29 | using System.Collections; |
30 | using System.Collections.Generic; | 30 | using System.Collections.Generic; |
31 | using System.Text; | 31 | using System.Text; |
32 | using System.IO; | 32 | using System.IO; |
33 | using libsecondlife; | 33 | using libsecondlife; |
34 | using OpenSim.Framework.Interfaces; | 34 | using OpenSim.Framework.Interfaces; |
35 | using OpenSim.Framework.Types; | 35 | using OpenSim.Framework.Types; |
36 | using OpenSim.Framework.Utilities; | 36 | using OpenSim.Framework.Utilities; |
37 | using OpenSim.Framework.Data; | 37 | using OpenSim.Framework.Data; |
38 | 38 | ||
39 | namespace OpenSim.Framework.Communications.Caches | 39 | namespace OpenSim.Framework.Communications.Caches |
40 | { | 40 | { |
41 | public class AssetTransactionManager | 41 | public class AssetTransactionManager |
42 | { | 42 | { |
43 | // Fields | 43 | // Fields |
44 | public Dictionary<LLUUID, AgentAssetTransactions> AgentTransactions = new Dictionary<LLUUID, AgentAssetTransactions>(); | 44 | public Dictionary<LLUUID, AgentAssetTransactions> AgentTransactions = new Dictionary<LLUUID, AgentAssetTransactions>(); |
45 | 45 | ||
46 | // Methods | 46 | // Methods |
47 | public AgentAssetTransactions AddUser(LLUUID userID) | 47 | public AgentAssetTransactions AddUser(LLUUID userID) |
48 | { | 48 | { |
49 | if (!this.AgentTransactions.ContainsKey(userID)) | 49 | if (!this.AgentTransactions.ContainsKey(userID)) |
50 | { | 50 | { |
51 | AgentAssetTransactions transactions = new AgentAssetTransactions(userID); | 51 | AgentAssetTransactions transactions = new AgentAssetTransactions(userID); |
52 | this.AgentTransactions.Add(userID, transactions); | 52 | this.AgentTransactions.Add(userID, transactions); |
53 | return transactions; | 53 | return transactions; |
54 | } | 54 | } |
55 | return null; | 55 | return null; |
56 | } | 56 | } |
57 | 57 | ||
58 | public AgentAssetTransactions GetUserTransActions(LLUUID userID) | 58 | public AgentAssetTransactions GetUserTransActions(LLUUID userID) |
59 | { | 59 | { |
60 | if (this.AgentTransactions.ContainsKey(userID)) | 60 | if (this.AgentTransactions.ContainsKey(userID)) |
61 | { | 61 | { |
62 | return this.AgentTransactions[userID]; | 62 | return this.AgentTransactions[userID]; |
63 | } | 63 | } |
64 | return null; | 64 | return null; |
65 | } | 65 | } |
66 | 66 | ||
67 | public void HandleInventoryFromTransaction() | 67 | public void HandleInventoryFromTransaction() |
68 | { | 68 | { |
69 | } | 69 | } |
70 | 70 | ||
71 | public void HandleUDPUploadRequest() | 71 | public void HandleUDPUploadRequest() |
72 | { | 72 | { |
73 | } | 73 | } |
74 | 74 | ||
75 | public void HandleXfer(IClientAPI remoteClient, uint xferID, uint packetID, byte[] data) | 75 | public void HandleXfer(IClientAPI remoteClient, uint xferID, uint packetID, byte[] data) |
76 | { | 76 | { |
77 | } | 77 | } |
78 | } | 78 | } |
79 | } | 79 | } |
80 | 80 | ||
81 | 81 | ||
diff --git a/OpenSim/Framework/Communications/Cache/AssetTransactions.cs b/OpenSim/Framework/Communications/Cache/AssetTransactions.cs index 6741969..c906b76 100644 --- a/OpenSim/Framework/Communications/Cache/AssetTransactions.cs +++ b/OpenSim/Framework/Communications/Cache/AssetTransactions.cs | |||
@@ -1,275 +1,275 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (c) Contributors, http://www.openmetaverse.org/ | 2 | * Copyright (c) Contributors, http://www.openmetaverse.org/ |
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | 3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. |
4 | * | 4 | * |
5 | * Redistribution and use in source and binary forms, with or without | 5 | * Redistribution and use in source and binary forms, with or without |
6 | * modification, are permitted provided that the following conditions are met: | 6 | * modification, are permitted provided that the following conditions are met: |
7 | * * Redistributions of source code must retain the above copyright | 7 | * * Redistributions of source code must retain the above copyright |
8 | * notice, this list of conditions and the following disclaimer. | 8 | * notice, this list of conditions and the following disclaimer. |
9 | * * Redistributions in binary form must reproduce the above copyright | 9 | * * Redistributions in binary form must reproduce the above copyright |
10 | * notice, this list of conditions and the following disclaimer in the | 10 | * notice, this list of conditions and the following disclaimer in the |
11 | * documentation and/or other materials provided with the distribution. | 11 | * documentation and/or other materials provided with the distribution. |
12 | * * Neither the name of the OpenSim Project nor the | 12 | * * Neither the name of the OpenSim Project nor the |
13 | * names of its contributors may be used to endorse or promote products | 13 | * names of its contributors may be used to endorse or promote products |
14 | * derived from this software without specific prior written permission. | 14 | * derived from this software without specific prior written permission. |
15 | * | 15 | * |
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY | 16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY |
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | 17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | 18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | 19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY |
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | 20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | 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 | 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 | 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 | 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. | 25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
26 | * | 26 | * |
27 | */ | 27 | */ |
28 | using System; | 28 | using System; |
29 | using System.Collections; | 29 | using System.Collections; |
30 | using System.Collections.Generic; | 30 | using System.Collections.Generic; |
31 | using System.Text; | 31 | using System.Text; |
32 | using System.IO; | 32 | using System.IO; |
33 | using libsecondlife; | 33 | using libsecondlife; |
34 | using libsecondlife.Packets; | 34 | using libsecondlife.Packets; |
35 | using OpenSim.Framework.Interfaces; | 35 | using OpenSim.Framework.Interfaces; |
36 | using OpenSim.Framework.Types; | 36 | using OpenSim.Framework.Types; |
37 | using OpenSim.Framework.Utilities; | 37 | using OpenSim.Framework.Utilities; |
38 | using OpenSim.Region.Capabilities; | 38 | using OpenSim.Region.Capabilities; |
39 | using OpenSim.Framework.Servers; | 39 | using OpenSim.Framework.Servers; |
40 | 40 | ||
41 | namespace OpenSim.Framework.Communications.Caches | 41 | namespace OpenSim.Framework.Communications.Caches |
42 | { | 42 | { |
43 | public class AgentAssetTransactions | 43 | public class AgentAssetTransactions |
44 | { | 44 | { |
45 | // Fields | 45 | // Fields |
46 | public List<AssetCapsUploader> CapsUploaders = new List<AssetCapsUploader>(); | 46 | public List<AssetCapsUploader> CapsUploaders = new List<AssetCapsUploader>(); |
47 | public List<NoteCardCapsUpdate> NotecardUpdaters = new List<NoteCardCapsUpdate>(); | 47 | public List<NoteCardCapsUpdate> NotecardUpdaters = new List<NoteCardCapsUpdate>(); |
48 | public LLUUID UserID; | 48 | public LLUUID UserID; |
49 | public Dictionary<LLUUID, AssetXferUploader> XferUploaders = new Dictionary<LLUUID, AssetXferUploader>(); | 49 | public Dictionary<LLUUID, AssetXferUploader> XferUploaders = new Dictionary<LLUUID, AssetXferUploader>(); |
50 | 50 | ||
51 | // Methods | 51 | // Methods |
52 | public AgentAssetTransactions(LLUUID agentID) | 52 | public AgentAssetTransactions(LLUUID agentID) |
53 | { | 53 | { |
54 | this.UserID = agentID; | 54 | this.UserID = agentID; |
55 | } | 55 | } |
56 | 56 | ||
57 | public AssetCapsUploader RequestCapsUploader() | 57 | public AssetCapsUploader RequestCapsUploader() |
58 | { | 58 | { |
59 | AssetCapsUploader uploader = new AssetCapsUploader(); | 59 | AssetCapsUploader uploader = new AssetCapsUploader(); |
60 | this.CapsUploaders.Add(uploader); | 60 | this.CapsUploaders.Add(uploader); |
61 | return uploader; | 61 | return uploader; |
62 | } | 62 | } |
63 | 63 | ||
64 | public NoteCardCapsUpdate RequestNoteCardUpdater() | 64 | public NoteCardCapsUpdate RequestNoteCardUpdater() |
65 | { | 65 | { |
66 | NoteCardCapsUpdate update = new NoteCardCapsUpdate(); | 66 | NoteCardCapsUpdate update = new NoteCardCapsUpdate(); |
67 | this.NotecardUpdaters.Add(update); | 67 | this.NotecardUpdaters.Add(update); |
68 | return update; | 68 | return update; |
69 | } | 69 | } |
70 | 70 | ||
71 | public AssetXferUploader RequestXferUploader(LLUUID transactionID) | 71 | public AssetXferUploader RequestXferUploader(LLUUID transactionID) |
72 | { | 72 | { |
73 | AssetXferUploader uploader = new AssetXferUploader(); | 73 | AssetXferUploader uploader = new AssetXferUploader(); |
74 | this.XferUploaders.Add(transactionID, uploader); | 74 | this.XferUploaders.Add(transactionID, uploader); |
75 | return uploader; | 75 | return uploader; |
76 | } | 76 | } |
77 | 77 | ||
78 | // Nested Types | 78 | // Nested Types |
79 | public class AssetCapsUploader | 79 | public class AssetCapsUploader |
80 | { | 80 | { |
81 | // Fields | 81 | // Fields |
82 | private BaseHttpServer httpListener; | 82 | private BaseHttpServer httpListener; |
83 | private LLUUID inventoryItemID; | 83 | private LLUUID inventoryItemID; |
84 | private string m_assetDescription = ""; | 84 | private string m_assetDescription = ""; |
85 | private string m_assetName = ""; | 85 | private string m_assetName = ""; |
86 | private LLUUID m_folderID; | 86 | private LLUUID m_folderID; |
87 | private LLUUID newAssetID; | 87 | private LLUUID newAssetID; |
88 | private bool SaveImages = false; | 88 | private bool SaveImages = false; |
89 | private string uploaderPath = ""; | 89 | private string uploaderPath = ""; |
90 | 90 | ||
91 | // Events | 91 | // Events |
92 | public event UpLoadedTexture OnUpLoad; | 92 | public event UpLoadedTexture OnUpLoad; |
93 | 93 | ||
94 | // Methods | 94 | // Methods |
95 | public void Initialise(string assetName, string assetDescription, LLUUID assetID, LLUUID inventoryItem, LLUUID folderID, string path, BaseHttpServer httpServer) | 95 | public void Initialise(string assetName, string assetDescription, LLUUID assetID, LLUUID inventoryItem, LLUUID folderID, string path, BaseHttpServer httpServer) |
96 | { | 96 | { |
97 | this.m_assetName = assetName; | 97 | this.m_assetName = assetName; |
98 | this.m_assetDescription = assetDescription; | 98 | this.m_assetDescription = assetDescription; |
99 | this.m_folderID = folderID; | 99 | this.m_folderID = folderID; |
100 | this.newAssetID = assetID; | 100 | this.newAssetID = assetID; |
101 | this.inventoryItemID = inventoryItem; | 101 | this.inventoryItemID = inventoryItem; |
102 | this.uploaderPath = path; | 102 | this.uploaderPath = path; |
103 | this.httpListener = httpServer; | 103 | this.httpListener = httpServer; |
104 | } | 104 | } |
105 | 105 | ||
106 | private void SaveImageToFile(string filename, byte[] data) | 106 | private void SaveImageToFile(string filename, byte[] data) |
107 | { | 107 | { |
108 | FileStream output = File.Create(filename); | 108 | FileStream output = File.Create(filename); |
109 | BinaryWriter writer = new BinaryWriter(output); | 109 | BinaryWriter writer = new BinaryWriter(output); |
110 | writer.Write(data); | 110 | writer.Write(data); |
111 | writer.Close(); | 111 | writer.Close(); |
112 | output.Close(); | 112 | output.Close(); |
113 | } | 113 | } |
114 | 114 | ||
115 | public string uploaderCaps(byte[] data, string path, string param) | 115 | public string uploaderCaps(byte[] data, string path, string param) |
116 | { | 116 | { |
117 | LLUUID inventoryItemID = this.inventoryItemID; | 117 | LLUUID inventoryItemID = this.inventoryItemID; |
118 | string text = ""; | 118 | string text = ""; |
119 | LLSDAssetUploadComplete complete = new LLSDAssetUploadComplete(); | 119 | LLSDAssetUploadComplete complete = new LLSDAssetUploadComplete(); |
120 | complete.new_asset = this.newAssetID.ToStringHyphenated(); | 120 | complete.new_asset = this.newAssetID.ToStringHyphenated(); |
121 | complete.new_inventory_item = inventoryItemID; | 121 | complete.new_inventory_item = inventoryItemID; |
122 | complete.state = "complete"; | 122 | complete.state = "complete"; |
123 | text = LLSDHelpers.SerialiseLLSDReply(complete); | 123 | text = LLSDHelpers.SerialiseLLSDReply(complete); |
124 | this.httpListener.RemoveStreamHandler("POST", this.uploaderPath); | 124 | this.httpListener.RemoveStreamHandler("POST", this.uploaderPath); |
125 | if (this.SaveImages) | 125 | if (this.SaveImages) |
126 | { | 126 | { |
127 | this.SaveImageToFile(this.m_assetName + ".jp2", data); | 127 | this.SaveImageToFile(this.m_assetName + ".jp2", data); |
128 | } | 128 | } |
129 | if (this.OnUpLoad != null) | 129 | if (this.OnUpLoad != null) |
130 | { | 130 | { |
131 | this.OnUpLoad(this.m_assetName, this.newAssetID, inventoryItemID, data); | 131 | this.OnUpLoad(this.m_assetName, this.newAssetID, inventoryItemID, data); |
132 | } | 132 | } |
133 | return text; | 133 | return text; |
134 | } | 134 | } |
135 | } | 135 | } |
136 | 136 | ||
137 | public class AssetXferUploader | 137 | public class AssetXferUploader |
138 | { | 138 | { |
139 | // Fields | 139 | // Fields |
140 | public bool AddToInventory; | 140 | public bool AddToInventory; |
141 | public AssetBase Asset; | 141 | public AssetBase Asset; |
142 | public LLUUID InventFolder = LLUUID.Zero; | 142 | public LLUUID InventFolder = LLUUID.Zero; |
143 | private IClientAPI ourClient; | 143 | private IClientAPI ourClient; |
144 | public LLUUID TransactionID = LLUUID.Zero; | 144 | public LLUUID TransactionID = LLUUID.Zero; |
145 | public bool UploadComplete; | 145 | public bool UploadComplete; |
146 | public uint XferID; | 146 | public uint XferID; |
147 | 147 | ||
148 | // Methods | 148 | // Methods |
149 | public void HandleXferPacket(uint xferID, uint packetID, byte[] data) | 149 | public void HandleXferPacket(uint xferID, uint packetID, byte[] data) |
150 | { | 150 | { |
151 | if (this.XferID == xferID) | 151 | if (this.XferID == xferID) |
152 | { | 152 | { |
153 | if (this.Asset.Data.Length > 1) | 153 | if (this.Asset.Data.Length > 1) |
154 | { | 154 | { |
155 | byte[] destinationArray = new byte[this.Asset.Data.Length + data.Length]; | 155 | byte[] destinationArray = new byte[this.Asset.Data.Length + data.Length]; |
156 | Array.Copy(this.Asset.Data, 0, destinationArray, 0, this.Asset.Data.Length); | 156 | Array.Copy(this.Asset.Data, 0, destinationArray, 0, this.Asset.Data.Length); |
157 | Array.Copy(data, 0, destinationArray, this.Asset.Data.Length, data.Length); | 157 | Array.Copy(data, 0, destinationArray, this.Asset.Data.Length, data.Length); |
158 | this.Asset.Data = destinationArray; | 158 | this.Asset.Data = destinationArray; |
159 | } | 159 | } |
160 | else | 160 | else |
161 | { | 161 | { |
162 | byte[] buffer2 = new byte[data.Length - 4]; | 162 | byte[] buffer2 = new byte[data.Length - 4]; |
163 | Array.Copy(data, 4, buffer2, 0, data.Length - 4); | 163 | Array.Copy(data, 4, buffer2, 0, data.Length - 4); |
164 | this.Asset.Data = buffer2; | 164 | this.Asset.Data = buffer2; |
165 | } | 165 | } |
166 | ConfirmXferPacketPacket newPack = new ConfirmXferPacketPacket(); | 166 | ConfirmXferPacketPacket newPack = new ConfirmXferPacketPacket(); |
167 | newPack.XferID.ID = xferID; | 167 | newPack.XferID.ID = xferID; |
168 | newPack.XferID.Packet = packetID; | 168 | newPack.XferID.Packet = packetID; |
169 | this.ourClient.OutPacket(newPack); | 169 | this.ourClient.OutPacket(newPack); |
170 | if ((packetID & 0x80000000) != 0) | 170 | if ((packetID & 0x80000000) != 0) |
171 | { | 171 | { |
172 | this.SendCompleteMessage(); | 172 | this.SendCompleteMessage(); |
173 | } | 173 | } |
174 | } | 174 | } |
175 | } | 175 | } |
176 | 176 | ||
177 | public void Initialise(IClientAPI remoteClient, LLUUID assetID, LLUUID transaction, sbyte type, byte[] data) | 177 | public void Initialise(IClientAPI remoteClient, LLUUID assetID, LLUUID transaction, sbyte type, byte[] data) |
178 | { | 178 | { |
179 | this.ourClient = remoteClient; | 179 | this.ourClient = remoteClient; |
180 | this.Asset = new AssetBase(); | 180 | this.Asset = new AssetBase(); |
181 | this.Asset.FullID = assetID; | 181 | this.Asset.FullID = assetID; |
182 | this.Asset.InvType = type; | 182 | this.Asset.InvType = type; |
183 | this.Asset.Type = type; | 183 | this.Asset.Type = type; |
184 | this.Asset.Data = data; | 184 | this.Asset.Data = data; |
185 | this.Asset.Name = "blank"; | 185 | this.Asset.Name = "blank"; |
186 | this.Asset.Description = "empty"; | 186 | this.Asset.Description = "empty"; |
187 | this.TransactionID = transaction; | 187 | this.TransactionID = transaction; |
188 | if (this.Asset.Data.Length > 2) | 188 | if (this.Asset.Data.Length > 2) |
189 | { | 189 | { |
190 | this.SendCompleteMessage(); | 190 | this.SendCompleteMessage(); |
191 | } | 191 | } |
192 | else | 192 | else |
193 | { | 193 | { |
194 | this.ReqestStartXfer(); | 194 | this.ReqestStartXfer(); |
195 | } | 195 | } |
196 | } | 196 | } |
197 | 197 | ||
198 | protected void ReqestStartXfer() | 198 | protected void ReqestStartXfer() |
199 | { | 199 | { |
200 | this.UploadComplete = false; | 200 | this.UploadComplete = false; |
201 | this.XferID = Util.GetNextXferID(); | 201 | this.XferID = Util.GetNextXferID(); |
202 | RequestXferPacket newPack = new RequestXferPacket(); | 202 | RequestXferPacket newPack = new RequestXferPacket(); |
203 | newPack.XferID.ID = this.XferID; | 203 | newPack.XferID.ID = this.XferID; |
204 | newPack.XferID.VFileType = this.Asset.Type; | 204 | newPack.XferID.VFileType = this.Asset.Type; |
205 | newPack.XferID.VFileID = this.Asset.FullID; | 205 | newPack.XferID.VFileID = this.Asset.FullID; |
206 | newPack.XferID.FilePath = 0; | 206 | newPack.XferID.FilePath = 0; |
207 | newPack.XferID.Filename = new byte[0]; | 207 | newPack.XferID.Filename = new byte[0]; |
208 | this.ourClient.OutPacket(newPack); | 208 | this.ourClient.OutPacket(newPack); |
209 | } | 209 | } |
210 | 210 | ||
211 | protected void SendCompleteMessage() | 211 | protected void SendCompleteMessage() |
212 | { | 212 | { |
213 | this.UploadComplete = true; | 213 | this.UploadComplete = true; |
214 | AssetUploadCompletePacket newPack = new AssetUploadCompletePacket(); | 214 | AssetUploadCompletePacket newPack = new AssetUploadCompletePacket(); |
215 | newPack.AssetBlock.Type = this.Asset.Type; | 215 | newPack.AssetBlock.Type = this.Asset.Type; |
216 | newPack.AssetBlock.Success = true; | 216 | newPack.AssetBlock.Success = true; |
217 | newPack.AssetBlock.UUID = this.Asset.FullID; | 217 | newPack.AssetBlock.UUID = this.Asset.FullID; |
218 | this.ourClient.OutPacket(newPack); | 218 | this.ourClient.OutPacket(newPack); |
219 | } | 219 | } |
220 | } | 220 | } |
221 | 221 | ||
222 | public class NoteCardCapsUpdate | 222 | public class NoteCardCapsUpdate |
223 | { | 223 | { |
224 | // Fields | 224 | // Fields |
225 | private BaseHttpServer httpListener; | 225 | private BaseHttpServer httpListener; |
226 | private LLUUID inventoryItemID; | 226 | private LLUUID inventoryItemID; |
227 | private string m_assetName = ""; | 227 | private string m_assetName = ""; |
228 | private LLUUID newAssetID; | 228 | private LLUUID newAssetID; |
229 | private bool SaveImages = false; | 229 | private bool SaveImages = false; |
230 | private string uploaderPath = ""; | 230 | private string uploaderPath = ""; |
231 | 231 | ||
232 | // Events | 232 | // Events |
233 | public event UpLoadedTexture OnUpLoad; | 233 | public event UpLoadedTexture OnUpLoad; |
234 | 234 | ||
235 | // Methods | 235 | // Methods |
236 | public void Initialise(LLUUID inventoryItem, string path, BaseHttpServer httpServer) | 236 | public void Initialise(LLUUID inventoryItem, string path, BaseHttpServer httpServer) |
237 | { | 237 | { |
238 | this.inventoryItemID = inventoryItem; | 238 | this.inventoryItemID = inventoryItem; |
239 | this.uploaderPath = path; | 239 | this.uploaderPath = path; |
240 | this.httpListener = httpServer; | 240 | this.httpListener = httpServer; |
241 | this.newAssetID = LLUUID.Random(); | 241 | this.newAssetID = LLUUID.Random(); |
242 | } | 242 | } |
243 | 243 | ||
244 | private void SaveImageToFile(string filename, byte[] data) | 244 | private void SaveImageToFile(string filename, byte[] data) |
245 | { | 245 | { |
246 | FileStream output = File.Create(filename); | 246 | FileStream output = File.Create(filename); |
247 | BinaryWriter writer = new BinaryWriter(output); | 247 | BinaryWriter writer = new BinaryWriter(output); |
248 | writer.Write(data); | 248 | writer.Write(data); |
249 | writer.Close(); | 249 | writer.Close(); |
250 | output.Close(); | 250 | output.Close(); |
251 | } | 251 | } |
252 | 252 | ||
253 | public string uploaderCaps(byte[] data, string path, string param) | 253 | public string uploaderCaps(byte[] data, string path, string param) |
254 | { | 254 | { |
255 | LLUUID inventoryItemID = this.inventoryItemID; | 255 | LLUUID inventoryItemID = this.inventoryItemID; |
256 | string text = ""; | 256 | string text = ""; |
257 | LLSDAssetUploadComplete complete = new LLSDAssetUploadComplete(); | 257 | LLSDAssetUploadComplete complete = new LLSDAssetUploadComplete(); |
258 | complete.new_asset = this.newAssetID.ToStringHyphenated(); | 258 | complete.new_asset = this.newAssetID.ToStringHyphenated(); |
259 | complete.new_inventory_item = inventoryItemID; | 259 | complete.new_inventory_item = inventoryItemID; |
260 | complete.state = "complete"; | 260 | complete.state = "complete"; |
261 | text = LLSDHelpers.SerialiseLLSDReply(complete); | 261 | text = LLSDHelpers.SerialiseLLSDReply(complete); |
262 | this.httpListener.RemoveStreamHandler("POST", this.uploaderPath); | 262 | this.httpListener.RemoveStreamHandler("POST", this.uploaderPath); |
263 | if (this.SaveImages) | 263 | if (this.SaveImages) |
264 | { | 264 | { |
265 | this.SaveImageToFile(this.m_assetName + "notecard.txt", data); | 265 | this.SaveImageToFile(this.m_assetName + "notecard.txt", data); |
266 | } | 266 | } |
267 | if (this.OnUpLoad != null) | 267 | if (this.OnUpLoad != null) |
268 | { | 268 | { |
269 | this.OnUpLoad(this.m_assetName, this.newAssetID, inventoryItemID, data); | 269 | this.OnUpLoad(this.m_assetName, this.newAssetID, inventoryItemID, data); |
270 | } | 270 | } |
271 | return text; | 271 | return text; |
272 | } | 272 | } |
273 | } | 273 | } |
274 | } | 274 | } |
275 | } \ No newline at end of file | 275 | } \ No newline at end of file |
diff --git a/OpenSim/Framework/Communications/Cache/CachedUserInfo.cs b/OpenSim/Framework/Communications/Cache/CachedUserInfo.cs index 2660df3..d850305 100644 --- a/OpenSim/Framework/Communications/Cache/CachedUserInfo.cs +++ b/OpenSim/Framework/Communications/Cache/CachedUserInfo.cs | |||
@@ -1,94 +1,94 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (c) Contributors, http://www.openmetaverse.org/ | 2 | * Copyright (c) Contributors, http://www.openmetaverse.org/ |
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | 3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. |
4 | * | 4 | * |
5 | * Redistribution and use in source and binary forms, with or without | 5 | * Redistribution and use in source and binary forms, with or without |
6 | * modification, are permitted provided that the following conditions are met: | 6 | * modification, are permitted provided that the following conditions are met: |
7 | * * Redistributions of source code must retain the above copyright | 7 | * * Redistributions of source code must retain the above copyright |
8 | * notice, this list of conditions and the following disclaimer. | 8 | * notice, this list of conditions and the following disclaimer. |
9 | * * Redistributions in binary form must reproduce the above copyright | 9 | * * Redistributions in binary form must reproduce the above copyright |
10 | * notice, this list of conditions and the following disclaimer in the | 10 | * notice, this list of conditions and the following disclaimer in the |
11 | * documentation and/or other materials provided with the distribution. | 11 | * documentation and/or other materials provided with the distribution. |
12 | * * Neither the name of the OpenSim Project nor the | 12 | * * Neither the name of the OpenSim Project nor the |
13 | * names of its contributors may be used to endorse or promote products | 13 | * names of its contributors may be used to endorse or promote products |
14 | * derived from this software without specific prior written permission. | 14 | * derived from this software without specific prior written permission. |
15 | * | 15 | * |
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY | 16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY |
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | 17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | 18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | 19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY |
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | 20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | 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 | 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 | 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 | 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. | 25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
26 | * | 26 | * |
27 | */ | 27 | */ |
28 | using System; | 28 | using System; |
29 | using System.Collections; | 29 | using System.Collections; |
30 | using System.Collections.Generic; | 30 | using System.Collections.Generic; |
31 | using System.Text; | 31 | using System.Text; |
32 | using System.IO; | 32 | using System.IO; |
33 | using libsecondlife; | 33 | using libsecondlife; |
34 | using OpenSim.Framework.Interfaces; | 34 | using OpenSim.Framework.Interfaces; |
35 | using OpenSim.Framework.Types; | 35 | using OpenSim.Framework.Types; |
36 | using OpenSim.Framework.Data; | 36 | using OpenSim.Framework.Data; |
37 | using OpenSim.Framework.Utilities; | 37 | using OpenSim.Framework.Utilities; |
38 | 38 | ||
39 | namespace OpenSim.Framework.Communications.Caches | 39 | namespace OpenSim.Framework.Communications.Caches |
40 | { | 40 | { |
41 | public class CachedUserInfo | 41 | public class CachedUserInfo |
42 | { | 42 | { |
43 | // Fields | 43 | // Fields |
44 | public InventoryFolder RootFolder; | 44 | public InventoryFolder RootFolder; |
45 | public UserProfileData UserProfile; | 45 | public UserProfileData UserProfile; |
46 | 46 | ||
47 | // Methods | 47 | // Methods |
48 | public void FolderReceive(LLUUID userID, InventoryFolder folderInfo) | 48 | public void FolderReceive(LLUUID userID, InventoryFolder folderInfo) |
49 | { | 49 | { |
50 | if (userID == this.UserProfile.UUID) | 50 | if (userID == this.UserProfile.UUID) |
51 | { | 51 | { |
52 | if (this.RootFolder == null) | 52 | if (this.RootFolder == null) |
53 | { | 53 | { |
54 | if (folderInfo.parentID == LLUUID.Zero) | 54 | if (folderInfo.parentID == LLUUID.Zero) |
55 | { | 55 | { |
56 | this.RootFolder = folderInfo; | 56 | this.RootFolder = folderInfo; |
57 | } | 57 | } |
58 | } | 58 | } |
59 | else if (this.RootFolder.folderID == folderInfo.parentID) | 59 | else if (this.RootFolder.folderID == folderInfo.parentID) |
60 | { | 60 | { |
61 | this.RootFolder.SubFolders.Add(folderInfo.folderID, folderInfo); | 61 | this.RootFolder.SubFolders.Add(folderInfo.folderID, folderInfo); |
62 | } | 62 | } |
63 | else | 63 | else |
64 | { | 64 | { |
65 | InventoryFolder folder = this.RootFolder.HasSubFolder(folderInfo.parentID); | 65 | InventoryFolder folder = this.RootFolder.HasSubFolder(folderInfo.parentID); |
66 | if (folder != null) | 66 | if (folder != null) |
67 | { | 67 | { |
68 | folder.SubFolders.Add(folderInfo.folderID, folderInfo); | 68 | folder.SubFolders.Add(folderInfo.folderID, folderInfo); |
69 | } | 69 | } |
70 | } | 70 | } |
71 | } | 71 | } |
72 | } | 72 | } |
73 | 73 | ||
74 | public void ItemReceive(LLUUID userID, InventoryItemBase itemInfo) | 74 | public void ItemReceive(LLUUID userID, InventoryItemBase itemInfo) |
75 | { | 75 | { |
76 | if ((userID == this.UserProfile.UUID) && (this.RootFolder != null)) | 76 | if ((userID == this.UserProfile.UUID) && (this.RootFolder != null)) |
77 | { | 77 | { |
78 | if (itemInfo.parentFolderID == this.RootFolder.folderID) | 78 | if (itemInfo.parentFolderID == this.RootFolder.folderID) |
79 | { | 79 | { |
80 | this.RootFolder.Items.Add(itemInfo.inventoryID, itemInfo); | 80 | this.RootFolder.Items.Add(itemInfo.inventoryID, itemInfo); |
81 | } | 81 | } |
82 | else | 82 | else |
83 | { | 83 | { |
84 | InventoryFolder folder = this.RootFolder.HasSubFolder(itemInfo.parentFolderID); | 84 | InventoryFolder folder = this.RootFolder.HasSubFolder(itemInfo.parentFolderID); |
85 | if (folder != null) | 85 | if (folder != null) |
86 | { | 86 | { |
87 | folder.Items.Add(itemInfo.inventoryID, itemInfo); | 87 | folder.Items.Add(itemInfo.inventoryID, itemInfo); |
88 | } | 88 | } |
89 | } | 89 | } |
90 | } | 90 | } |
91 | } | 91 | } |
92 | } | 92 | } |
93 | } | 93 | } |
94 | 94 | ||
diff --git a/OpenSim/Framework/Communications/Cache/InventoryFolder.cs b/OpenSim/Framework/Communications/Cache/InventoryFolder.cs index 8670eb0..300a6e3 100644 --- a/OpenSim/Framework/Communications/Cache/InventoryFolder.cs +++ b/OpenSim/Framework/Communications/Cache/InventoryFolder.cs | |||
@@ -1,109 +1,109 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (c) Contributors, http://www.openmetaverse.org/ | 2 | * Copyright (c) Contributors, http://www.openmetaverse.org/ |
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | 3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. |
4 | * | 4 | * |
5 | * Redistribution and use in source and binary forms, with or without | 5 | * Redistribution and use in source and binary forms, with or without |
6 | * modification, are permitted provided that the following conditions are met: | 6 | * modification, are permitted provided that the following conditions are met: |
7 | * * Redistributions of source code must retain the above copyright | 7 | * * Redistributions of source code must retain the above copyright |
8 | * notice, this list of conditions and the following disclaimer. | 8 | * notice, this list of conditions and the following disclaimer. |
9 | * * Redistributions in binary form must reproduce the above copyright | 9 | * * Redistributions in binary form must reproduce the above copyright |
10 | * notice, this list of conditions and the following disclaimer in the | 10 | * notice, this list of conditions and the following disclaimer in the |
11 | * documentation and/or other materials provided with the distribution. | 11 | * documentation and/or other materials provided with the distribution. |
12 | * * Neither the name of the OpenSim Project nor the | 12 | * * Neither the name of the OpenSim Project nor the |
13 | * names of its contributors may be used to endorse or promote products | 13 | * names of its contributors may be used to endorse or promote products |
14 | * derived from this software without specific prior written permission. | 14 | * derived from this software without specific prior written permission. |
15 | * | 15 | * |
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY | 16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY |
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | 17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | 18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | 19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY |
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | 20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | 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 | 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 | 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 | 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. | 25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
26 | * | 26 | * |
27 | */ | 27 | */ |
28 | using System; | 28 | using System; |
29 | using System.Collections; | 29 | using System.Collections; |
30 | using System.Collections.Generic; | 30 | using System.Collections.Generic; |
31 | using System.Text; | 31 | using System.Text; |
32 | using System.IO; | 32 | using System.IO; |
33 | using libsecondlife; | 33 | using libsecondlife; |
34 | using OpenSim.Framework.Interfaces; | 34 | using OpenSim.Framework.Interfaces; |
35 | using OpenSim.Framework.Data; | 35 | using OpenSim.Framework.Data; |
36 | using OpenSim.Framework.Types; | 36 | using OpenSim.Framework.Types; |
37 | using OpenSim.Framework.Utilities; | 37 | using OpenSim.Framework.Utilities; |
38 | 38 | ||
39 | namespace OpenSim.Framework.Communications.Caches | 39 | namespace OpenSim.Framework.Communications.Caches |
40 | { | 40 | { |
41 | public class InventoryFolder : InventoryFolderBase | 41 | public class InventoryFolder : InventoryFolderBase |
42 | { | 42 | { |
43 | // Fields | 43 | // Fields |
44 | public Dictionary<LLUUID, InventoryItemBase> Items = new Dictionary<LLUUID, InventoryItemBase>(); | 44 | public Dictionary<LLUUID, InventoryItemBase> Items = new Dictionary<LLUUID, InventoryItemBase>(); |
45 | public Dictionary<LLUUID, InventoryFolder> SubFolders = new Dictionary<LLUUID, InventoryFolder>(); | 45 | public Dictionary<LLUUID, InventoryFolder> SubFolders = new Dictionary<LLUUID, InventoryFolder>(); |
46 | 46 | ||
47 | // Methods | 47 | // Methods |
48 | public InventoryFolder CreateNewSubFolder(LLUUID folderID, string folderName, ushort type) | 48 | public InventoryFolder CreateNewSubFolder(LLUUID folderID, string folderName, ushort type) |
49 | { | 49 | { |
50 | InventoryFolder subFold = new InventoryFolder(); | 50 | InventoryFolder subFold = new InventoryFolder(); |
51 | subFold.name = folderName; | 51 | subFold.name = folderName; |
52 | subFold.folderID = folderID; | 52 | subFold.folderID = folderID; |
53 | subFold.type = type; | 53 | subFold.type = (short) type; |
54 | subFold.parentID = this.folderID; | 54 | subFold.parentID = this.folderID; |
55 | subFold.agentID = this.agentID; | 55 | subFold.agentID = this.agentID; |
56 | this.SubFolders.Add(subFold.folderID, subFold); | 56 | this.SubFolders.Add(subFold.folderID, subFold); |
57 | return subFold; | 57 | return subFold; |
58 | } | 58 | } |
59 | 59 | ||
60 | public InventoryItemBase HasItem(LLUUID itemID) | 60 | public InventoryItemBase HasItem(LLUUID itemID) |
61 | { | 61 | { |
62 | InventoryItemBase base2 = null; | 62 | InventoryItemBase base2 = null; |
63 | if (this.Items.ContainsKey(itemID)) | 63 | if (this.Items.ContainsKey(itemID)) |
64 | { | 64 | { |
65 | return this.Items[itemID]; | 65 | return this.Items[itemID]; |
66 | } | 66 | } |
67 | foreach (InventoryFolder folder in this.SubFolders.Values) | 67 | foreach (InventoryFolder folder in this.SubFolders.Values) |
68 | { | 68 | { |
69 | base2 = folder.HasItem(itemID); | 69 | base2 = folder.HasItem(itemID); |
70 | if (base2 != null) | 70 | if (base2 != null) |
71 | { | 71 | { |
72 | break; | 72 | break; |
73 | } | 73 | } |
74 | } | 74 | } |
75 | return base2; | 75 | return base2; |
76 | } | 76 | } |
77 | 77 | ||
78 | public InventoryFolder HasSubFolder(LLUUID folderID) | 78 | public InventoryFolder HasSubFolder(LLUUID folderID) |
79 | { | 79 | { |
80 | InventoryFolder returnFolder = null; | 80 | InventoryFolder returnFolder = null; |
81 | if (this.SubFolders.ContainsKey(folderID)) | 81 | if (this.SubFolders.ContainsKey(folderID)) |
82 | { | 82 | { |
83 | returnFolder = this.SubFolders[folderID]; | 83 | returnFolder = this.SubFolders[folderID]; |
84 | } | 84 | } |
85 | else | 85 | else |
86 | { | 86 | { |
87 | foreach (InventoryFolder folder in this.SubFolders.Values) | 87 | foreach (InventoryFolder folder in this.SubFolders.Values) |
88 | { | 88 | { |
89 | returnFolder = folder.HasSubFolder(folderID); | 89 | returnFolder = folder.HasSubFolder(folderID); |
90 | if (returnFolder != null) | 90 | if (returnFolder != null) |
91 | { | 91 | { |
92 | break; | 92 | break; |
93 | } | 93 | } |
94 | } | 94 | } |
95 | } | 95 | } |
96 | return returnFolder; | 96 | return returnFolder; |
97 | } | 97 | } |
98 | 98 | ||
99 | public List<InventoryItemBase> RequestListOfItems() | 99 | public List<InventoryItemBase> RequestListOfItems() |
100 | { | 100 | { |
101 | List<InventoryItemBase> itemList = new List<InventoryItemBase>(); | 101 | List<InventoryItemBase> itemList = new List<InventoryItemBase>(); |
102 | foreach (InventoryItemBase item in this.Items.Values) | 102 | foreach (InventoryItemBase item in this.Items.Values) |
103 | { | 103 | { |
104 | itemList.Add(item); | 104 | itemList.Add(item); |
105 | } | 105 | } |
106 | return itemList; | 106 | return itemList; |
107 | } | 107 | } |
108 | } | 108 | } |
109 | } | 109 | } |
diff --git a/OpenSim/Framework/Communications/Cache/LibraryRootFolder.cs b/OpenSim/Framework/Communications/Cache/LibraryRootFolder.cs new file mode 100644 index 0000000..2608145 --- /dev/null +++ b/OpenSim/Framework/Communications/Cache/LibraryRootFolder.cs | |||
@@ -0,0 +1,89 @@ | |||
1 | using System; | ||
2 | using System.Collections.Generic; | ||
3 | using System.Text; | ||
4 | using libsecondlife; | ||
5 | using OpenSim.Framework.Data; | ||
6 | |||
7 | namespace OpenSim.Framework.Communications.Caches | ||
8 | { | ||
9 | public class LibraryRootFolder : InventoryFolder | ||
10 | { | ||
11 | private LLUUID libOwner = new LLUUID("11111111-1111-0000-0000-000100bba000"); | ||
12 | |||
13 | public LibraryRootFolder() | ||
14 | { | ||
15 | this.agentID = libOwner; | ||
16 | this.folderID = new LLUUID("00000112-000f-0000-0000-000100bba000"); | ||
17 | this.name = "OpenSim Library"; | ||
18 | this.parentID = LLUUID.Zero; | ||
19 | this.type = (short)-1; | ||
20 | this.version = (ushort) 1; | ||
21 | |||
22 | InventoryItemBase item = new InventoryItemBase(); | ||
23 | item.avatarID = libOwner; | ||
24 | item.creatorsID = libOwner; | ||
25 | item.inventoryID = LLUUID.Random(); | ||
26 | item.assetID = new LLUUID("00000000-0000-0000-9999-000000000002"); | ||
27 | item.inventoryDescription = "Plywood texture"; | ||
28 | item.inventoryName = "Plywood"; | ||
29 | item.type =0; | ||
30 | item.parentFolderID = this.folderID; | ||
31 | item.inventoryCurrentPermissions = 2147483647; | ||
32 | item.inventoryNextPermissions = 2147483647; | ||
33 | this.Items.Add(item.inventoryID, item); | ||
34 | |||
35 | item = new InventoryItemBase(); | ||
36 | item.avatarID = libOwner; | ||
37 | item.creatorsID = libOwner; | ||
38 | item.inventoryID = LLUUID.Random(); | ||
39 | item.assetID = new LLUUID("00000000-0000-0000-9999-000000000003"); | ||
40 | item.inventoryDescription = "Rocks texture"; | ||
41 | item.inventoryName = "Rocks"; | ||
42 | item.type = 0; | ||
43 | item.parentFolderID = this.folderID; | ||
44 | item.inventoryCurrentPermissions = 2147483647; | ||
45 | item.inventoryNextPermissions = 2147483647; | ||
46 | this.Items.Add(item.inventoryID, item); | ||
47 | |||
48 | item = new InventoryItemBase(); | ||
49 | item.avatarID = libOwner; | ||
50 | item.creatorsID = libOwner; | ||
51 | item.inventoryID = LLUUID.Random(); | ||
52 | item.assetID = new LLUUID("00000000-0000-0000-9999-000000000001"); | ||
53 | item.inventoryDescription = "Bricks texture"; | ||
54 | item.inventoryName = "Bricks"; | ||
55 | item.type = 0; | ||
56 | item.parentFolderID = this.folderID; | ||
57 | item.inventoryCurrentPermissions = 2147483647; | ||
58 | item.inventoryNextPermissions = 2147483647; | ||
59 | this.Items.Add(item.inventoryID, item); | ||
60 | |||
61 | item = new InventoryItemBase(); | ||
62 | item.avatarID = libOwner; | ||
63 | item.creatorsID = libOwner; | ||
64 | item.inventoryID = LLUUID.Random(); | ||
65 | item.assetID = new LLUUID("00000000-0000-0000-9999-000000000004"); | ||
66 | item.inventoryDescription = "Granite texture"; | ||
67 | item.inventoryName = "Granite"; | ||
68 | item.type = 0; | ||
69 | item.parentFolderID = this.folderID; | ||
70 | item.inventoryCurrentPermissions = 2147483647; | ||
71 | item.inventoryNextPermissions = 2147483647; | ||
72 | this.Items.Add(item.inventoryID, item); | ||
73 | |||
74 | item = new InventoryItemBase(); | ||
75 | item.avatarID = libOwner; | ||
76 | item.creatorsID = libOwner; | ||
77 | item.inventoryID = LLUUID.Random(); | ||
78 | item.assetID = new LLUUID("00000000-0000-0000-9999-000000000005"); | ||
79 | item.inventoryDescription = "Hardwood texture"; | ||
80 | item.inventoryName = "Hardwood"; | ||
81 | item.type = 0; | ||
82 | item.parentFolderID = this.folderID; | ||
83 | item.inventoryCurrentPermissions = 2147483647; | ||
84 | item.inventoryNextPermissions = 2147483647; | ||
85 | this.Items.Add(item.inventoryID, item); | ||
86 | } | ||
87 | |||
88 | } | ||
89 | } | ||
diff --git a/OpenSim/Framework/Communications/Cache/UserProfileCache.cs b/OpenSim/Framework/Communications/Cache/UserProfileCache.cs index 8210702..7b4f6a5 100644 --- a/OpenSim/Framework/Communications/Cache/UserProfileCache.cs +++ b/OpenSim/Framework/Communications/Cache/UserProfileCache.cs | |||
@@ -1,170 +1,216 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (c) Contributors, http://www.openmetaverse.org/ | 2 | * Copyright (c) Contributors, http://www.openmetaverse.org/ |
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | 3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. |
4 | * | 4 | * |
5 | * Redistribution and use in source and binary forms, with or without | 5 | * Redistribution and use in source and binary forms, with or without |
6 | * modification, are permitted provided that the following conditions are met: | 6 | * modification, are permitted provided that the following conditions are met: |
7 | * * Redistributions of source code must retain the above copyright | 7 | * * Redistributions of source code must retain the above copyright |
8 | * notice, this list of conditions and the following disclaimer. | 8 | * notice, this list of conditions and the following disclaimer. |
9 | * * Redistributions in binary form must reproduce the above copyright | 9 | * * Redistributions in binary form must reproduce the above copyright |
10 | * notice, this list of conditions and the following disclaimer in the | 10 | * notice, this list of conditions and the following disclaimer in the |
11 | * documentation and/or other materials provided with the distribution. | 11 | * documentation and/or other materials provided with the distribution. |
12 | * * Neither the name of the OpenSim Project nor the | 12 | * * Neither the name of the OpenSim Project nor the |
13 | * names of its contributors may be used to endorse or promote products | 13 | * names of its contributors may be used to endorse or promote products |
14 | * derived from this software without specific prior written permission. | 14 | * derived from this software without specific prior written permission. |
15 | * | 15 | * |
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY | 16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY |
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | 17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | 18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | 19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY |
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | 20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | 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 | 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 | 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 | 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. | 25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
26 | * | 26 | * |
27 | */ | 27 | */ |
28 | using System; | 28 | using System; |
29 | using System.Collections; | 29 | using System.Collections; |
30 | using System.Collections.Generic; | 30 | using System.Collections.Generic; |
31 | using System.Text; | 31 | using System.Text; |
32 | using System.IO; | 32 | using System.IO; |
33 | using libsecondlife; | 33 | using libsecondlife; |
34 | using OpenSim.Framework.Interfaces; | 34 | using OpenSim.Framework.Interfaces; |
35 | using OpenSim.Framework.Types; | 35 | using OpenSim.Framework.Types; |
36 | using OpenSim.Framework.Utilities; | 36 | using OpenSim.Framework.Utilities; |
37 | using OpenSim.Framework.Data; | 37 | using OpenSim.Framework.Data; |
38 | 38 | ||
39 | namespace OpenSim.Framework.Communications.Caches | 39 | namespace OpenSim.Framework.Communications.Caches |
40 | { | 40 | { |
41 | 41 | public class UserProfileCache | |
42 | public class UserProfileCache | 42 | { |
43 | { | 43 | // Fields |
44 | // Fields | 44 | private CommunicationsManager m_parent; |
45 | private CommunicationsManager m_parent; | 45 | public Dictionary<LLUUID, CachedUserInfo> UserProfiles = new Dictionary<LLUUID, CachedUserInfo>(); |
46 | public Dictionary<LLUUID, CachedUserInfo> UserProfiles = new Dictionary<LLUUID, CachedUserInfo>(); | 46 | |
47 | 47 | public LibraryRootFolder libraryRoot = new LibraryRootFolder(); | |
48 | // Methods | 48 | |
49 | public UserProfileCache(CommunicationsManager parent) | 49 | // Methods |
50 | { | 50 | public UserProfileCache(CommunicationsManager parent) |
51 | this.m_parent = parent; | 51 | { |
52 | } | 52 | this.m_parent = parent; |
53 | 53 | } | |
54 | public void AddNewUser(LLUUID userID) | 54 | |
55 | { | 55 | /// <summary> |
56 | if (!this.UserProfiles.ContainsKey(userID)) | 56 | /// A new user has moved into a region in this instance |
57 | { | 57 | /// so get info from servers |
58 | CachedUserInfo userInfo = new CachedUserInfo(); | 58 | /// </summary> |
59 | userInfo.UserProfile = this.RequestUserProfileForUser(userID); | 59 | /// <param name="userID"></param> |
60 | if (userInfo.UserProfile != null) | 60 | public void AddNewUser(LLUUID userID) |
61 | { | 61 | { |
62 | this.RequestInventoryForUser(userID, userInfo); | 62 | if (!this.UserProfiles.ContainsKey(userID)) |
63 | this.UserProfiles.Add(userID, userInfo); | 63 | { |
64 | } | 64 | CachedUserInfo userInfo = new CachedUserInfo(); |
65 | else | 65 | userInfo.UserProfile = this.RequestUserProfileForUser(userID); |
66 | { | 66 | if (userInfo.UserProfile != null) |
67 | Console.WriteLine("UserProfileCache.cs: user profile for user not found"); | 67 | { |
68 | } | 68 | this.RequestInventoryForUser(userID, userInfo); |
69 | } | 69 | this.UserProfiles.Add(userID, userInfo); |
70 | } | 70 | } |
71 | 71 | else | |
72 | public void AddNewUser(string firstName, string lastName) | 72 | { |
73 | { | 73 | Console.WriteLine("UserProfileCache.cs: user profile for user not found"); |
74 | } | 74 | } |
75 | 75 | } | |
76 | public CachedUserInfo GetUserDetails(LLUUID userID) | 76 | } |
77 | { | 77 | |
78 | if (this.UserProfiles.ContainsKey(userID)) | 78 | /// <summary> |
79 | { | 79 | /// A new user has moved into a region in this instance |
80 | return this.UserProfiles[userID]; | 80 | /// so get info from servers |
81 | } | 81 | /// </summary> |
82 | return null; | 82 | /// <param name="firstName"></param> |
83 | } | 83 | /// <param name="lastName"></param> |
84 | 84 | public void AddNewUser(string firstName, string lastName) | |
85 | public void HandleCreateInventoryFolder(IClientAPI remoteClient, LLUUID folderID, ushort folderType, string folderName, LLUUID parentID) | 85 | { |
86 | { | 86 | } |
87 | if (this.UserProfiles.ContainsKey(remoteClient.AgentId)) | 87 | |
88 | { | 88 | public CachedUserInfo GetUserDetails(LLUUID userID) |
89 | CachedUserInfo info = this.UserProfiles[remoteClient.AgentId]; | 89 | { |
90 | if (info.RootFolder.folderID == parentID) | 90 | if (this.UserProfiles.ContainsKey(userID)) |
91 | { | 91 | { |
92 | info.RootFolder.CreateNewSubFolder(folderID, folderName, folderType); | 92 | return this.UserProfiles[userID]; |
93 | } | 93 | } |
94 | else | 94 | return null; |
95 | { | 95 | } |
96 | InventoryFolder folder = info.RootFolder.HasSubFolder(parentID); | 96 | |
97 | if (folder != null) | 97 | public void HandleCreateInventoryFolder(IClientAPI remoteClient, LLUUID folderID, ushort folderType, string folderName, LLUUID parentID) |
98 | { | 98 | { |
99 | folder.CreateNewSubFolder(folderID, folderName, folderType); | 99 | if (this.UserProfiles.ContainsKey(remoteClient.AgentId)) |
100 | } | 100 | { |
101 | } | 101 | CachedUserInfo info = this.UserProfiles[remoteClient.AgentId]; |
102 | } | 102 | if (info.RootFolder.folderID == parentID) |
103 | } | 103 | { |
104 | 104 | info.RootFolder.CreateNewSubFolder(folderID, folderName, folderType); | |
105 | public void HandleFecthInventoryDescendents(IClientAPI remoteClient, LLUUID folderID, LLUUID ownerID, bool fetchFolders, bool fetchItems, int sortOrder) | 105 | } |
106 | { | 106 | else |
107 | if (this.UserProfiles.ContainsKey(remoteClient.AgentId)) | 107 | { |
108 | { | 108 | InventoryFolder folder = info.RootFolder.HasSubFolder(parentID); |
109 | CachedUserInfo info = this.UserProfiles[remoteClient.AgentId]; | 109 | if (folder != null) |
110 | if (info.RootFolder.folderID == folderID) | 110 | { |
111 | { | 111 | folder.CreateNewSubFolder(folderID, folderName, folderType); |
112 | if (fetchItems) | 112 | } |
113 | { | 113 | } |
114 | remoteClient.SendInventoryFolderDetails(remoteClient.AgentId, folderID, info.RootFolder.RequestListOfItems()); | 114 | } |
115 | } | 115 | } |
116 | } | 116 | |
117 | else | 117 | public void HandleFecthInventoryDescendents(IClientAPI remoteClient, LLUUID folderID, LLUUID ownerID, bool fetchFolders, bool fetchItems, int sortOrder) |
118 | { | 118 | { |
119 | InventoryFolder folder = info.RootFolder.HasSubFolder(folderID); | 119 | if (folderID == libraryRoot.folderID ) |
120 | if ((folder != null) && fetchItems) | 120 | { |
121 | { | 121 | remoteClient.SendInventoryFolderDetails(libraryRoot.agentID, libraryRoot.folderID, libraryRoot.RequestListOfItems()); |
122 | remoteClient.SendInventoryFolderDetails(remoteClient.AgentId, folderID, folder.RequestListOfItems()); | 122 | } |
123 | } | 123 | else if (this.UserProfiles.ContainsKey(remoteClient.AgentId)) |
124 | } | 124 | { |
125 | } | 125 | CachedUserInfo info = this.UserProfiles[remoteClient.AgentId]; |
126 | } | 126 | if (info.RootFolder.folderID == folderID) |
127 | 127 | { | |
128 | public void HandleFetchInventory(IClientAPI remoteClient, LLUUID itemID, LLUUID ownerID) | 128 | if (fetchItems) |
129 | { | 129 | { |
130 | if (this.UserProfiles.ContainsKey(remoteClient.AgentId)) | 130 | remoteClient.SendInventoryFolderDetails(remoteClient.AgentId, folderID, info.RootFolder.RequestListOfItems()); |
131 | { | 131 | } |
132 | InventoryItemBase item = this.UserProfiles[remoteClient.AgentId].RootFolder.HasItem(itemID); | 132 | } |
133 | if (item != null) | 133 | else |
134 | { | 134 | { |
135 | remoteClient.SendInventoryItemDetails(ownerID, item); | 135 | InventoryFolder folder = info.RootFolder.HasSubFolder(folderID); |
136 | } | 136 | if ((folder != null) && fetchItems) |
137 | } | 137 | { |
138 | } | 138 | remoteClient.SendInventoryFolderDetails(remoteClient.AgentId, folderID, folder.RequestListOfItems()); |
139 | 139 | } | |
140 | private void RequestInventoryForUser(LLUUID userID, CachedUserInfo userInfo) | 140 | } |
141 | { | 141 | } |
142 | InventoryFolder folderInfo = new InventoryFolder(); | 142 | } |
143 | folderInfo.agentID = userID; | 143 | |
144 | folderInfo.folderID = userInfo.UserProfile.rootInventoryFolderID; | 144 | public void HandleFetchInventory(IClientAPI remoteClient, LLUUID itemID, LLUUID ownerID) |
145 | folderInfo.name = "My Inventory"; | 145 | { |
146 | folderInfo.parentID = LLUUID.Zero; | 146 | if (ownerID == libraryRoot.agentID) |
147 | folderInfo.type = 8; | 147 | { |
148 | folderInfo.version = 1; | 148 | //Console.WriteLine("request info for library item"); |
149 | userInfo.FolderReceive(userID, folderInfo); | 149 | } |
150 | } | 150 | else if (this.UserProfiles.ContainsKey(remoteClient.AgentId)) |
151 | 151 | { | |
152 | private UserProfileData RequestUserProfileForUser(LLUUID userID) | 152 | InventoryItemBase item = this.UserProfiles[remoteClient.AgentId].RootFolder.HasItem(itemID); |
153 | { | 153 | if (item != null) |
154 | return this.m_parent.UserServer.GetUserProfile(userID); | 154 | { |
155 | } | 155 | remoteClient.SendInventoryItemDetails(ownerID, item); |
156 | 156 | } | |
157 | private void UpdateInventoryToServer(LLUUID userID) | 157 | } |
158 | { | 158 | } |
159 | } | 159 | |
160 | 160 | /// <summary> | |
161 | private void UpdateUserProfileToServer(LLUUID userID) | 161 | /// Request Iventory Info from Inventory server |
162 | { | 162 | /// </summary> |
163 | } | 163 | /// <param name="userID"></param> |
164 | 164 | private void RequestInventoryForUser(LLUUID userID, CachedUserInfo userInfo) | |
165 | public void UserLogOut(LLUUID userID) | 165 | { |
166 | { | 166 | // this.m_parent.InventoryServer.RequestInventoryForUser(userID, userInfo.FolderReceive, userInfo.ItemReceive); |
167 | } | 167 | |
168 | } | 168 | //for now we manually create the root folder, |
169 | } | 169 | // but should be requesting all inventory from inventory server. |
170 | 170 | InventoryFolder folderInfo = new InventoryFolder(); | |
171 | folderInfo.agentID = userID; | ||
172 | folderInfo.folderID = userInfo.UserProfile.rootInventoryFolderID; | ||
173 | folderInfo.name = "My Inventory"; | ||
174 | folderInfo.parentID = LLUUID.Zero; | ||
175 | folderInfo.type = 8; | ||
176 | folderInfo.version = 1; | ||
177 | userInfo.FolderReceive(userID, folderInfo); | ||
178 | } | ||
179 | |||
180 | /// <summary> | ||
181 | /// Request the user profile from User server | ||
182 | /// </summary> | ||
183 | /// <param name="userID"></param> | ||
184 | private UserProfileData RequestUserProfileForUser(LLUUID userID) | ||
185 | { | ||
186 | return this.m_parent.UserServer.GetUserProfile(userID); | ||
187 | } | ||
188 | |||
189 | /// <summary> | ||
190 | /// Update Inventory data to Inventory server | ||
191 | /// </summary> | ||
192 | /// <param name="userID"></param> | ||
193 | private void UpdateInventoryToServer(LLUUID userID) | ||
194 | { | ||
195 | } | ||
196 | |||
197 | /// <summary> | ||
198 | /// Make sure UserProfile is updated on user server | ||
199 | /// </summary> | ||
200 | /// <param name="userID"></param> | ||
201 | private void UpdateUserProfileToServer(LLUUID userID) | ||
202 | { | ||
203 | } | ||
204 | |||
205 | /// <summary> | ||
206 | /// A user has left this instance | ||
207 | /// so make sure servers have been updated | ||
208 | /// Then remove cached info | ||
209 | /// </summary> | ||
210 | /// <param name="userID"></param> | ||
211 | public void UserLogOut(LLUUID userID) | ||
212 | { | ||
213 | } | ||
214 | } | ||
215 | } | ||
216 | |||
diff --git a/OpenSim/Framework/Communications/CommunicationsManager.cs b/OpenSim/Framework/Communications/CommunicationsManager.cs index e220e17..ac882ba 100644 --- a/OpenSim/Framework/Communications/CommunicationsManager.cs +++ b/OpenSim/Framework/Communications/CommunicationsManager.cs | |||
@@ -44,7 +44,7 @@ namespace OpenSim.Framework.Communications | |||
44 | public IGridServices GridServer; | 44 | public IGridServices GridServer; |
45 | public IInventoryServices InventoryServer; | 45 | public IInventoryServices InventoryServer; |
46 | public IInterRegionCommunications InterRegion; | 46 | public IInterRegionCommunications InterRegion; |
47 | public UserProfileCache UserProfilesCache; | 47 | public UserProfileCache UserProfiles; |
48 | public AssetCache AssetCache; | 48 | public AssetCache AssetCache; |
49 | 49 | ||
50 | public NetworkServersInfo ServersInfo; | 50 | public NetworkServersInfo ServersInfo; |
@@ -52,21 +52,28 @@ namespace OpenSim.Framework.Communications | |||
52 | { | 52 | { |
53 | ServersInfo = serversInfo; | 53 | ServersInfo = serversInfo; |
54 | this.AssetCache = assetCache; | 54 | this.AssetCache = assetCache; |
55 | UserProfilesCache = new UserProfileCache(this); | 55 | UserProfiles = new UserProfileCache(this); |
56 | } | 56 | } |
57 | 57 | ||
58 | #region Packet Handlers | 58 | #region Packet Handlers |
59 | public void HandleUUIDNameRequest(LLUUID uuid, IClientAPI remote_client) | 59 | public void HandleUUIDNameRequest(LLUUID uuid, IClientAPI remote_client) |
60 | { | 60 | { |
61 | UserProfileData profileData = this.UserServer.GetUserProfile(uuid); | 61 | if (uuid == UserProfiles.libraryRoot.agentID) |
62 | if (profileData != null) | ||
63 | { | 62 | { |
64 | LLUUID profileId = profileData.UUID; | 63 | remote_client.SendNameReply(uuid , "Mr" , "OpenSim"); |
65 | string firstname = profileData.username; | 64 | } |
66 | string lastname = profileData.surname; | 65 | else |
66 | { | ||
67 | UserProfileData profileData = this.UserServer.GetUserProfile(uuid); | ||
68 | if (profileData != null) | ||
69 | { | ||
70 | LLUUID profileId = profileData.UUID; | ||
71 | string firstname = profileData.username; | ||
72 | string lastname = profileData.surname; | ||
67 | 73 | ||
68 | remote_client.SendNameReply(profileId, firstname, lastname); | 74 | remote_client.SendNameReply(profileId, firstname, lastname); |
69 | } | 75 | } |
76 | } | ||
70 | } | 77 | } |
71 | 78 | ||
72 | #endregion | 79 | #endregion |
diff --git a/OpenSim/Framework/Data/InventoryData.cs b/OpenSim/Framework/Data/InventoryData.cs index 87013cf..d7130f4 100644 --- a/OpenSim/Framework/Data/InventoryData.cs +++ b/OpenSim/Framework/Data/InventoryData.cs | |||
@@ -101,7 +101,7 @@ namespace OpenSim.Framework.Data | |||
101 | /// <summary> | 101 | /// <summary> |
102 | /// Tyep of Items normally stored in this folder | 102 | /// Tyep of Items normally stored in this folder |
103 | /// </summary> | 103 | /// </summary> |
104 | public ushort type; | 104 | public short type; |
105 | /// <summary> | 105 | /// <summary> |
106 | /// | 106 | /// |
107 | /// </summary> | 107 | /// </summary> |
diff --git a/OpenSim/Framework/InventoryServiceBase/InventoryServiceBase.cs b/OpenSim/Framework/InventoryServiceBase/InventoryServiceBase.cs index d407cdb..49e2e6f 100644 --- a/OpenSim/Framework/InventoryServiceBase/InventoryServiceBase.cs +++ b/OpenSim/Framework/InventoryServiceBase/InventoryServiceBase.cs | |||
@@ -50,7 +50,7 @@ namespace OpenSim.Framework.InventoryServiceBase | |||
50 | } | 50 | } |
51 | 51 | ||
52 | /// <summary> | 52 | /// <summary> |
53 | /// | 53 | /// Returns the root folder plus any folders in root (so down one level in the Inventory folders tree) |
54 | /// </summary> | 54 | /// </summary> |
55 | /// <param name="userID"></param> | 55 | /// <param name="userID"></param> |
56 | /// <returns></returns> | 56 | /// <returns></returns> |
diff --git a/OpenSim/Framework/UserManager/LoginResponse.cs b/OpenSim/Framework/UserManager/LoginResponse.cs index 4d5ec5f..b5a4184 100644 --- a/OpenSim/Framework/UserManager/LoginResponse.cs +++ b/OpenSim/Framework/UserManager/LoginResponse.cs | |||
@@ -27,6 +27,8 @@ namespace OpenSim.Framework.UserManagement | |||
27 | private ArrayList inventoryRoot; | 27 | private ArrayList inventoryRoot; |
28 | private ArrayList initialOutfit; | 28 | private ArrayList initialOutfit; |
29 | private ArrayList agentInventory; | 29 | private ArrayList agentInventory; |
30 | private ArrayList inventoryLibraryOwner; | ||
31 | private ArrayList inventoryLibrary; | ||
30 | 32 | ||
31 | private UserInfo userProfile; | 33 | private UserInfo userProfile; |
32 | 34 | ||
@@ -87,6 +89,8 @@ namespace OpenSim.Framework.UserManagement | |||
87 | this.inventoryRoot = new ArrayList(); | 89 | this.inventoryRoot = new ArrayList(); |
88 | this.initialOutfit = new ArrayList(); | 90 | this.initialOutfit = new ArrayList(); |
89 | this.agentInventory = new ArrayList(); | 91 | this.agentInventory = new ArrayList(); |
92 | this.inventoryLibrary = new ArrayList(); | ||
93 | this.inventoryLibraryOwner = new ArrayList(); | ||
90 | 94 | ||
91 | this.xmlRpcResponse = new XmlRpcResponse(); | 95 | this.xmlRpcResponse = new XmlRpcResponse(); |
92 | this.defaultXmlRpcResponse = new XmlRpcResponse(); | 96 | this.defaultXmlRpcResponse = new XmlRpcResponse(); |
@@ -234,10 +238,10 @@ namespace OpenSim.Framework.UserManagement | |||
234 | responseData["ui-config"] = this.uiConfig; | 238 | responseData["ui-config"] = this.uiConfig; |
235 | 239 | ||
236 | responseData["inventory-skeleton"] = this.agentInventory; | 240 | responseData["inventory-skeleton"] = this.agentInventory; |
237 | responseData["inventory-skel-lib"] = new ArrayList(); // todo | 241 | responseData["inventory-skel-lib"] = this.inventoryLibrary; |
238 | responseData["inventory-root"] = this.inventoryRoot; | 242 | responseData["inventory-root"] = this.inventoryRoot; |
239 | responseData["gestures"] = new ArrayList(); // todo | 243 | responseData["gestures"] = new ArrayList(); // todo |
240 | responseData["inventory-lib-owner"] = new ArrayList(); // todo | 244 | responseData["inventory-lib-owner"] = this.inventoryLibraryOwner; |
241 | responseData["initial-outfit"] = this.initialOutfit; | 245 | responseData["initial-outfit"] = this.initialOutfit; |
242 | responseData["start_location"] = this.startLocation; | 246 | responseData["start_location"] = this.startLocation; |
243 | responseData["seed_capability"] = this.seedCapability; | 247 | responseData["seed_capability"] = this.seedCapability; |
@@ -600,6 +604,30 @@ namespace OpenSim.Framework.UserManagement | |||
600 | } | 604 | } |
601 | } | 605 | } |
602 | 606 | ||
607 | public ArrayList InventoryLibrary | ||
608 | { | ||
609 | get | ||
610 | { | ||
611 | return this.inventoryLibrary; | ||
612 | } | ||
613 | set | ||
614 | { | ||
615 | this.inventoryLibrary = value; | ||
616 | } | ||
617 | } | ||
618 | |||
619 | public ArrayList InventoryLibraryOwner | ||
620 | { | ||
621 | get | ||
622 | { | ||
623 | return this.inventoryLibraryOwner; | ||
624 | } | ||
625 | set | ||
626 | { | ||
627 | this.inventoryLibraryOwner = value; | ||
628 | } | ||
629 | } | ||
630 | |||
603 | public string Home | 631 | public string Home |
604 | { | 632 | { |
605 | get | 633 | get |
diff --git a/OpenSim/Framework/UserManager/UserManagerBase.cs b/OpenSim/Framework/UserManager/UserManagerBase.cs index a103f25..1acafeb 100644 --- a/OpenSim/Framework/UserManager/UserManagerBase.cs +++ b/OpenSim/Framework/UserManager/UserManagerBase.cs | |||
@@ -347,6 +347,38 @@ namespace OpenSim.Framework.UserManagement | |||
347 | } | 347 | } |
348 | 348 | ||
349 | /// <summary> | 349 | /// <summary> |
350 | /// | ||
351 | /// </summary> | ||
352 | /// <returns></returns> | ||
353 | protected virtual ArrayList GetInventoryLibrary() | ||
354 | { | ||
355 | //return new ArrayList(); | ||
356 | Hashtable TempHash = new Hashtable(); | ||
357 | TempHash["name"] = "OpenSim Library"; | ||
358 | TempHash["parent_id"] = LLUUID.Zero.ToStringHyphenated(); | ||
359 | TempHash["version"] = "1"; | ||
360 | TempHash["type_default"] = "-1"; | ||
361 | TempHash["folder_id"] = "00000112-000f-0000-0000-000100bba000"; | ||
362 | ArrayList temp = new ArrayList(); | ||
363 | temp.Add(TempHash); | ||
364 | return temp; | ||
365 | } | ||
366 | |||
367 | /// <summary> | ||
368 | /// | ||
369 | /// </summary> | ||
370 | /// <returns></returns> | ||
371 | protected virtual ArrayList GetLibraryOwner() | ||
372 | { | ||
373 | //for now create random inventory library owner | ||
374 | Hashtable TempHash = new Hashtable(); | ||
375 | TempHash["agent_id"] = "11111111-1111-0000-0000-000100bba000"; | ||
376 | ArrayList inventoryLibOwner = new ArrayList(); | ||
377 | inventoryLibOwner.Add(TempHash); | ||
378 | return inventoryLibOwner; | ||
379 | } | ||
380 | |||
381 | /// <summary> | ||
350 | /// Customises the login response and fills in missing values. | 382 | /// Customises the login response and fills in missing values. |
351 | /// </summary> | 383 | /// </summary> |
352 | /// <param name="response">The existing response</param> | 384 | /// <param name="response">The existing response</param> |
@@ -446,6 +478,8 @@ namespace OpenSim.Framework.UserManagement | |||
446 | logResponse.SecureSessionID = userProfile.currentAgent.secureSessionID.ToStringHyphenated(); | 478 | logResponse.SecureSessionID = userProfile.currentAgent.secureSessionID.ToStringHyphenated(); |
447 | logResponse.InventoryRoot = InventoryRoot; | 479 | logResponse.InventoryRoot = InventoryRoot; |
448 | logResponse.InventorySkeleton = AgentInventoryArray; | 480 | logResponse.InventorySkeleton = AgentInventoryArray; |
481 | logResponse.InventoryLibrary = this.GetInventoryLibrary(); | ||
482 | logResponse.InventoryLibraryOwner = this.GetLibraryOwner(); | ||
449 | logResponse.CircuitCode = (Int32)circode; | 483 | logResponse.CircuitCode = (Int32)circode; |
450 | //logResponse.RegionX = 0; //overwritten | 484 | //logResponse.RegionX = 0; //overwritten |
451 | //logResponse.RegionY = 0; //overwritten | 485 | //logResponse.RegionY = 0; //overwritten |
diff --git a/OpenSim/Region/Environment/Scenes/Scene.PacketHandlers.cs b/OpenSim/Region/Environment/Scenes/Scene.PacketHandlers.cs index 27def3d..11c2030 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.PacketHandlers.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.PacketHandlers.cs | |||
@@ -669,7 +669,7 @@ namespace OpenSim.Region.Environment.Scenes | |||
669 | /// <param name="nextOwnerMask"></param> | 669 | /// <param name="nextOwnerMask"></param> |
670 | public void CreateNewInventoryItem(IClientAPI remoteClient, LLUUID transActionID, LLUUID folderID, uint callbackID, string description, string name, sbyte invType, sbyte type, byte wearableType, uint nextOwnerMask) | 670 | public void CreateNewInventoryItem(IClientAPI remoteClient, LLUUID transActionID, LLUUID folderID, uint callbackID, string description, string name, sbyte invType, sbyte type, byte wearableType, uint nextOwnerMask) |
671 | { | 671 | { |
672 | CachedUserInfo userInfo = commsManager.UserProfilesCache.GetUserDetails(remoteClient.AgentId); | 672 | CachedUserInfo userInfo = commsManager.UserProfiles.GetUserDetails(remoteClient.AgentId); |
673 | if (userInfo != null) | 673 | if (userInfo != null) |
674 | { | 674 | { |
675 | AssetBase asset = new AssetBase(); | 675 | AssetBase asset = new AssetBase(); |
diff --git a/OpenSim/Region/Environment/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs index 9849145..0e25e54 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.cs | |||
@@ -546,7 +546,7 @@ namespace OpenSim.Region.Environment.Scenes | |||
546 | m_estateManager.sendRegionHandshake(client); | 546 | m_estateManager.sendRegionHandshake(client); |
547 | CreateAndAddScenePresence(client); | 547 | CreateAndAddScenePresence(client); |
548 | m_LandManager.sendParcelOverlay(client); | 548 | m_LandManager.sendParcelOverlay(client); |
549 | // commsManager.UserProfilesCache.AddNewUser(client.AgentId); | 549 | //commsManager.UserProfiles.AddNewUser(client.AgentId); |
550 | } | 550 | } |
551 | 551 | ||
552 | protected virtual void SubscribeToClientEvents(IClientAPI client) | 552 | protected virtual void SubscribeToClientEvents(IClientAPI client) |
@@ -591,9 +591,9 @@ namespace OpenSim.Region.Environment.Scenes | |||
591 | client.OnEstateOwnerMessage += new EstateOwnerMessageRequest(m_estateManager.handleEstateOwnerMessage); | 591 | client.OnEstateOwnerMessage += new EstateOwnerMessageRequest(m_estateManager.handleEstateOwnerMessage); |
592 | 592 | ||
593 | // client.OnCreateNewInventoryItem += CreateNewInventoryItem; | 593 | // client.OnCreateNewInventoryItem += CreateNewInventoryItem; |
594 | // client.OnCreateNewInventoryFolder += commsManager.UserProfilesCache.HandleCreateInventoryFolder; | 594 | //client.OnCreateNewInventoryFolder += commsManager.UserProfiles.HandleCreateInventoryFolder; |
595 | // client.OnFetchInventoryDescendents += commsManager.UserProfilesCache.HandleFecthInventoryDescendents; | 595 | client.OnFetchInventoryDescendents += commsManager.UserProfiles.HandleFecthInventoryDescendents; |
596 | // client.OnRequestTaskInventory += RequestTaskInventory; | 596 | client.OnRequestTaskInventory += RequestTaskInventory; |
597 | } | 597 | } |
598 | 598 | ||
599 | protected ScenePresence CreateAndAddScenePresence(IClientAPI client) | 599 | protected ScenePresence CreateAndAddScenePresence(IClientAPI client) |
diff --git a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Bitmap/Bitmap.cs b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Bitmap/Bitmap.cs index 1ef09fc..4093f51 100644 --- a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Bitmap/Bitmap.cs +++ b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Bitmap/Bitmap.cs | |||
@@ -1,74 +1,74 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (c) Contributors, http://www.openmetaverse.org/ | 2 | * Copyright (c) Contributors, http://www.openmetaverse.org/ |
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | 3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. |
4 | * | 4 | * |
5 | * Redistribution and use in source and binary forms, with or without | 5 | * Redistribution and use in source and binary forms, with or without |
6 | * modification, are permitted provided that the following conditions are met: | 6 | * modification, are permitted provided that the following conditions are met: |
7 | * * Redistributions of source code must retain the above copyright | 7 | * * Redistributions of source code must retain the above copyright |
8 | * notice, this list of conditions and the following disclaimer. | 8 | * notice, this list of conditions and the following disclaimer. |
9 | * * Redistributions in binary form must reproduce the above copyright | 9 | * * Redistributions in binary form must reproduce the above copyright |
10 | * notice, this list of conditions and the following disclaimer in the | 10 | * notice, this list of conditions and the following disclaimer in the |
11 | * documentation and/or other materials provided with the distribution. | 11 | * documentation and/or other materials provided with the distribution. |
12 | * * Neither the name of the OpenSim Project nor the | 12 | * * Neither the name of the OpenSim Project nor the |
13 | * names of its contributors may be used to endorse or promote products | 13 | * names of its contributors may be used to endorse or promote products |
14 | * derived from this software without specific prior written permission. | 14 | * derived from this software without specific prior written permission. |
15 | * | 15 | * |
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY | 16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY |
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | 17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | 18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | 19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY |
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | 20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | 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 | 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 | 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 | 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. | 25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
26 | * | 26 | * |
27 | */ | 27 | */ |
28 | 28 | ||
29 | using System; | 29 | using System; |
30 | using System.Collections.Generic; | 30 | using System.Collections.Generic; |
31 | using System.Text; | 31 | using System.Text; |
32 | using System.Drawing; | 32 | using System.Drawing; |
33 | 33 | ||
34 | namespace libTerrain | 34 | namespace libTerrain |
35 | { | 35 | { |
36 | class Raster | 36 | class Raster |
37 | { | 37 | { |
38 | int w; | 38 | int w; |
39 | int h; | 39 | int h; |
40 | Bitmap bmp; | 40 | Bitmap bmp; |
41 | 41 | ||
42 | public Raster(int width, int height) | 42 | public Raster(int width, int height) |
43 | { | 43 | { |
44 | w = width; | 44 | w = width; |
45 | h = height; | 45 | h = height; |
46 | bmp = new Bitmap(width, height, System.Drawing.Imaging.PixelFormat.Format24bppRgb); | 46 | bmp = new Bitmap(width, height, System.Drawing.Imaging.PixelFormat.Format24bppRgb); |
47 | } | 47 | } |
48 | 48 | ||
49 | public Channel ToChannel() | 49 | public Channel ToChannel() |
50 | { | 50 | { |
51 | Channel chan = new Channel(bmp.Width, bmp.Height); | 51 | Channel chan = new Channel(bmp.Width, bmp.Height); |
52 | 52 | ||
53 | int x, y; | 53 | int x, y; |
54 | for (x = 0; x < bmp.Width; x++) | 54 | for (x = 0; x < bmp.Width; x++) |
55 | { | 55 | { |
56 | for (y = 0; y < bmp.Height; y++) | 56 | for (y = 0; y < bmp.Height; y++) |
57 | { | 57 | { |
58 | Color val = bmp.GetPixel(x, y); | 58 | Color val = bmp.GetPixel(x, y); |
59 | chan.map[x, y] = (((double)val.R + (double)val.G + (double)val.B) / 3.0) / 255.0; | 59 | chan.map[x, y] = (((double)val.R + (double)val.G + (double)val.B) / 3.0) / 255.0; |
60 | } | 60 | } |
61 | } | 61 | } |
62 | 62 | ||
63 | return chan; | 63 | return chan; |
64 | } | 64 | } |
65 | 65 | ||
66 | public void DrawText(string txt, string font, double size) | 66 | public void DrawText(string txt, string font, double size) |
67 | { | 67 | { |
68 | Graphics gd = Graphics.FromImage(bmp); | 68 | Graphics gd = Graphics.FromImage(bmp); |
69 | //gd.DrawString(txt, | 69 | //gd.DrawString(txt, |
70 | 70 | ||
71 | 71 | ||
72 | } | 72 | } |
73 | } | 73 | } |
74 | } | 74 | } |
diff --git a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Channel.cs b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Channel.cs index 6dfee1f..2e84409 100644 --- a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Channel.cs +++ b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Channel.cs | |||
@@ -1,66 +1,66 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (c) Contributors, http://www.openmetaverse.org/ | 2 | * Copyright (c) Contributors, http://www.openmetaverse.org/ |
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | 3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. |
4 | * | 4 | * |
5 | * Redistribution and use in source and binary forms, with or without | 5 | * Redistribution and use in source and binary forms, with or without |
6 | * modification, are permitted provided that the following conditions are met: | 6 | * modification, are permitted provided that the following conditions are met: |
7 | * * Redistributions of source code must retain the above copyright | 7 | * * Redistributions of source code must retain the above copyright |
8 | * notice, this list of conditions and the following disclaimer. | 8 | * notice, this list of conditions and the following disclaimer. |
9 | * * Redistributions in binary form must reproduce the above copyright | 9 | * * Redistributions in binary form must reproduce the above copyright |
10 | * notice, this list of conditions and the following disclaimer in the | 10 | * notice, this list of conditions and the following disclaimer in the |
11 | * documentation and/or other materials provided with the distribution. | 11 | * documentation and/or other materials provided with the distribution. |
12 | * * Neither the name of the OpenSim Project nor the | 12 | * * Neither the name of the OpenSim Project nor the |
13 | * names of its contributors may be used to endorse or promote products | 13 | * names of its contributors may be used to endorse or promote products |
14 | * derived from this software without specific prior written permission. | 14 | * derived from this software without specific prior written permission. |
15 | * | 15 | * |
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY | 16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY |
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | 17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | 18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | 19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY |
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | 20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | 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 | 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 | 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 | 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. | 25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
26 | * | 26 | * |
27 | */ | 27 | */ |
28 | 28 | ||
29 | using System; | 29 | using System; |
30 | using System.Collections.Generic; | 30 | using System.Collections.Generic; |
31 | using System.Text; | 31 | using System.Text; |
32 | 32 | ||
33 | 33 | ||
34 | /* Channel | 34 | /* Channel |
35 | * A channel is a single heightmap array | 35 | * A channel is a single heightmap array |
36 | * */ | 36 | * */ |
37 | 37 | ||
38 | namespace libTerrain | 38 | namespace libTerrain |
39 | { | 39 | { |
40 | partial class Channel | 40 | partial class Channel |
41 | { | 41 | { |
42 | public double[,] map; | 42 | public double[,] map; |
43 | public int[,] diff; | 43 | public int[,] diff; |
44 | public int w; | 44 | public int w; |
45 | public int h; | 45 | public int h; |
46 | 46 | ||
47 | public int seed = 1338; // One better than 1337 | 47 | public int seed = 1338; // One better than 1337 |
48 | 48 | ||
49 | public Channel() | 49 | public Channel() |
50 | { | 50 | { |
51 | w = 256; | 51 | w = 256; |
52 | h = 256; | 52 | h = 256; |
53 | map = new double[w, h]; | 53 | map = new double[w, h]; |
54 | diff = new int[(int)(w / 16), (int)(h / 16)]; | 54 | diff = new int[(int)(w / 16), (int)(h / 16)]; |
55 | } | 55 | } |
56 | 56 | ||
57 | public Channel(int width, int height) | 57 | public Channel(int width, int height) |
58 | { | 58 | { |
59 | w = width; | 59 | w = width; |
60 | h = height; | 60 | h = height; |
61 | map = new double[w, h]; | 61 | map = new double[w, h]; |
62 | diff = new int[(int)(w / 16), (int)(h / 16)]; | 62 | diff = new int[(int)(w / 16), (int)(h / 16)]; |
63 | } | 63 | } |
64 | 64 | ||
65 | } | 65 | } |
66 | } | 66 | } |
diff --git a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Common.cs b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Common.cs index 1750418..b0182dc 100644 --- a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Common.cs +++ b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Common.cs | |||
@@ -1,277 +1,277 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (c) Contributors, http://www.openmetaverse.org/ | 2 | * Copyright (c) Contributors, http://www.openmetaverse.org/ |
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | 3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. |
4 | * | 4 | * |
5 | * Redistribution and use in source and binary forms, with or without | 5 | * Redistribution and use in source and binary forms, with or without |
6 | * modification, are permitted provided that the following conditions are met: | 6 | * modification, are permitted provided that the following conditions are met: |
7 | * * Redistributions of source code must retain the above copyright | 7 | * * Redistributions of source code must retain the above copyright |
8 | * notice, this list of conditions and the following disclaimer. | 8 | * notice, this list of conditions and the following disclaimer. |
9 | * * Redistributions in binary form must reproduce the above copyright | 9 | * * Redistributions in binary form must reproduce the above copyright |
10 | * notice, this list of conditions and the following disclaimer in the | 10 | * notice, this list of conditions and the following disclaimer in the |
11 | * documentation and/or other materials provided with the distribution. | 11 | * documentation and/or other materials provided with the distribution. |
12 | * * Neither the name of the OpenSim Project nor the | 12 | * * Neither the name of the OpenSim Project nor the |
13 | * names of its contributors may be used to endorse or promote products | 13 | * names of its contributors may be used to endorse or promote products |
14 | * derived from this software without specific prior written permission. | 14 | * derived from this software without specific prior written permission. |
15 | * | 15 | * |
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY | 16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY |
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | 17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | 18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | 19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY |
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | 20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | 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 | 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 | 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 | 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. | 25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
26 | * | 26 | * |
27 | */ | 27 | */ |
28 | 28 | ||
29 | 29 | ||
30 | using System; | 30 | using System; |
31 | using System.Collections.Generic; | 31 | using System.Collections.Generic; |
32 | using System.Text; | 32 | using System.Text; |
33 | 33 | ||
34 | namespace libTerrain | 34 | namespace libTerrain |
35 | { | 35 | { |
36 | public partial class Channel | 36 | public partial class Channel |
37 | { | 37 | { |
38 | public int GetWidth() | 38 | public int GetWidth() |
39 | { | 39 | { |
40 | return w; | 40 | return w; |
41 | } | 41 | } |
42 | public int GetHeight() | 42 | public int GetHeight() |
43 | { | 43 | { |
44 | return h; | 44 | return h; |
45 | } | 45 | } |
46 | 46 | ||
47 | public Channel Copy() | 47 | public Channel Copy() |
48 | { | 48 | { |
49 | Channel x = new Channel(w, h); | 49 | Channel x = new Channel(w, h); |
50 | x.map = (double[,])this.map.Clone(); | 50 | x.map = (double[,])this.map.Clone(); |
51 | return x; | 51 | return x; |
52 | } | 52 | } |
53 | 53 | ||
54 | public void SetDiff() | 54 | public void SetDiff() |
55 | { | 55 | { |
56 | SetDiff(1); | 56 | SetDiff(1); |
57 | } | 57 | } |
58 | 58 | ||
59 | public void SetDiff(int val) | 59 | public void SetDiff(int val) |
60 | { | 60 | { |
61 | for (int x = 0; x < w / 16; x++) | 61 | for (int x = 0; x < w / 16; x++) |
62 | { | 62 | { |
63 | for (int y = 0; y < h / 16; y++) | 63 | for (int y = 0; y < h / 16; y++) |
64 | { | 64 | { |
65 | diff[x, y] = val; | 65 | diff[x, y] = val; |
66 | } | 66 | } |
67 | } | 67 | } |
68 | } | 68 | } |
69 | 69 | ||
70 | public void SetDiff(int x, int y) | 70 | public void SetDiff(int x, int y) |
71 | { | 71 | { |
72 | diff[x / 16, y / 16]++; | 72 | diff[x / 16, y / 16]++; |
73 | } | 73 | } |
74 | 74 | ||
75 | public void Set(int x, int y, double val) | 75 | public void Set(int x, int y, double val) |
76 | { | 76 | { |
77 | if (x >= w) | 77 | if (x >= w) |
78 | throw new Exception("Bounds error while setting pixel (width)"); | 78 | throw new Exception("Bounds error while setting pixel (width)"); |
79 | if (y >= h) | 79 | if (y >= h) |
80 | throw new Exception("Bounds error while setting pixel (height)"); | 80 | throw new Exception("Bounds error while setting pixel (height)"); |
81 | if (x < 0) | 81 | if (x < 0) |
82 | throw new Exception("Bounds error while setting pixel (width)"); | 82 | throw new Exception("Bounds error while setting pixel (width)"); |
83 | if (y < 0) | 83 | if (y < 0) |
84 | throw new Exception("Bounds error while setting pixel (height)"); | 84 | throw new Exception("Bounds error while setting pixel (height)"); |
85 | 85 | ||
86 | if (map[x, y] != val) | 86 | if (map[x, y] != val) |
87 | { | 87 | { |
88 | SetDiff(x, y); | 88 | SetDiff(x, y); |
89 | 89 | ||
90 | map[x, y] = val; | 90 | map[x, y] = val; |
91 | } | 91 | } |
92 | } | 92 | } |
93 | 93 | ||
94 | public void SetClip(int x, int y, double val) | 94 | public void SetClip(int x, int y, double val) |
95 | { | 95 | { |
96 | SetDiff(x, y); | 96 | SetDiff(x, y); |
97 | 97 | ||
98 | if (x >= w) | 98 | if (x >= w) |
99 | throw new Exception("Bounds error while setting pixel (width)"); | 99 | throw new Exception("Bounds error while setting pixel (width)"); |
100 | if (y >= h) | 100 | if (y >= h) |
101 | throw new Exception("Bounds error while setting pixel (height)"); | 101 | throw new Exception("Bounds error while setting pixel (height)"); |
102 | if (x < 0) | 102 | if (x < 0) |
103 | throw new Exception("Bounds error while setting pixel (width)"); | 103 | throw new Exception("Bounds error while setting pixel (width)"); |
104 | if (y < 0) | 104 | if (y < 0) |
105 | throw new Exception("Bounds error while setting pixel (height)"); | 105 | throw new Exception("Bounds error while setting pixel (height)"); |
106 | 106 | ||
107 | if (val > 1.0) | 107 | if (val > 1.0) |
108 | val = 1.0; | 108 | val = 1.0; |
109 | if (val < 0.0) | 109 | if (val < 0.0) |
110 | val = 0.0; | 110 | val = 0.0; |
111 | 111 | ||
112 | map[x, y] = val; | 112 | map[x, y] = val; |
113 | } | 113 | } |
114 | 114 | ||
115 | private double GetBilinearInterpolate(double x, double y) | 115 | private double GetBilinearInterpolate(double x, double y) |
116 | { | 116 | { |
117 | if (x > w - 2.0) | 117 | if (x > w - 2.0) |
118 | x = w - 2.0; | 118 | x = w - 2.0; |
119 | if (y > h - 2.0) | 119 | if (y > h - 2.0) |
120 | y = h - 2.0; | 120 | y = h - 2.0; |
121 | if (x < 0.0) | 121 | if (x < 0.0) |
122 | x = 0.0; | 122 | x = 0.0; |
123 | if (y < 0.0) | 123 | if (y < 0.0) |
124 | y = 0.0; | 124 | y = 0.0; |
125 | 125 | ||
126 | int stepSize = 1; | 126 | int stepSize = 1; |
127 | double h00 = Get((int)x, (int)y); | 127 | double h00 = Get((int)x, (int)y); |
128 | double h10 = Get((int)x + stepSize, (int)y); | 128 | double h10 = Get((int)x + stepSize, (int)y); |
129 | double h01 = Get((int)x, (int)y + stepSize); | 129 | double h01 = Get((int)x, (int)y + stepSize); |
130 | double h11 = Get((int)x + stepSize, (int)y + stepSize); | 130 | double h11 = Get((int)x + stepSize, (int)y + stepSize); |
131 | double h1 = h00; | 131 | double h1 = h00; |
132 | double h2 = h10; | 132 | double h2 = h10; |
133 | double h3 = h01; | 133 | double h3 = h01; |
134 | double h4 = h11; | 134 | double h4 = h11; |
135 | double a00 = h1; | 135 | double a00 = h1; |
136 | double a10 = h2 - h1; | 136 | double a10 = h2 - h1; |
137 | double a01 = h3 - h1; | 137 | double a01 = h3 - h1; |
138 | double a11 = h1 - h2 - h3 + h4; | 138 | double a11 = h1 - h2 - h3 + h4; |
139 | double partialx = x - (int)x; | 139 | double partialx = x - (int)x; |
140 | double partialz = y - (int)y; | 140 | double partialz = y - (int)y; |
141 | double hi = a00 + (a10 * partialx) + (a01 * partialz) + (a11 * partialx * partialz); | 141 | double hi = a00 + (a10 * partialx) + (a01 * partialz) + (a11 * partialx * partialz); |
142 | return hi; | 142 | return hi; |
143 | } | 143 | } |
144 | 144 | ||
145 | public double Get(int x, int y) | 145 | public double Get(int x, int y) |
146 | { | 146 | { |
147 | if (x >= w) | 147 | if (x >= w) |
148 | x = w - 1; | 148 | x = w - 1; |
149 | if (y >= h) | 149 | if (y >= h) |
150 | y = h - 1; | 150 | y = h - 1; |
151 | if (x < 0) | 151 | if (x < 0) |
152 | x = 0; | 152 | x = 0; |
153 | if (y < 0) | 153 | if (y < 0) |
154 | y = 0; | 154 | y = 0; |
155 | return map[x, y]; | 155 | return map[x, y]; |
156 | } | 156 | } |
157 | 157 | ||
158 | public void SetWrap(int x, int y, double val) | 158 | public void SetWrap(int x, int y, double val) |
159 | { | 159 | { |
160 | SetDiff(x, y); | 160 | SetDiff(x, y); |
161 | 161 | ||
162 | map[x % w, y % h] = val; | 162 | map[x % w, y % h] = val; |
163 | } | 163 | } |
164 | 164 | ||
165 | public void SetWrapClip(int x, int y, double val) | 165 | public void SetWrapClip(int x, int y, double val) |
166 | { | 166 | { |
167 | SetDiff(x, y); | 167 | SetDiff(x, y); |
168 | 168 | ||
169 | if (val > 1.0) | 169 | if (val > 1.0) |
170 | val = 1.0; | 170 | val = 1.0; |
171 | if (val < 0.0) | 171 | if (val < 0.0) |
172 | val = 0.0; | 172 | val = 0.0; |
173 | 173 | ||
174 | map[x % w, y % h] = val; | 174 | map[x % w, y % h] = val; |
175 | } | 175 | } |
176 | 176 | ||
177 | public void Fill(double val) | 177 | public void Fill(double val) |
178 | { | 178 | { |
179 | SetDiff(); | 179 | SetDiff(); |
180 | 180 | ||
181 | int x, y; | 181 | int x, y; |
182 | for (x = 0; x < w; x++) | 182 | for (x = 0; x < w; x++) |
183 | { | 183 | { |
184 | for (y = 0; y < h; y++) | 184 | for (y = 0; y < h; y++) |
185 | { | 185 | { |
186 | map[x, y] = val; | 186 | map[x, y] = val; |
187 | } | 187 | } |
188 | } | 188 | } |
189 | } | 189 | } |
190 | 190 | ||
191 | public void Fill(double min, double max, double val) | 191 | public void Fill(double min, double max, double val) |
192 | { | 192 | { |
193 | SetDiff(); | 193 | SetDiff(); |
194 | 194 | ||
195 | int x, y; | 195 | int x, y; |
196 | for (x = 0; x < w; x++) | 196 | for (x = 0; x < w; x++) |
197 | { | 197 | { |
198 | for (y = 0; y < h; y++) | 198 | for (y = 0; y < h; y++) |
199 | { | 199 | { |
200 | if (map[x, y] >= min && map[x, y] <= max) | 200 | if (map[x, y] >= min && map[x, y] <= max) |
201 | map[x, y] = val; | 201 | map[x, y] = val; |
202 | } | 202 | } |
203 | } | 203 | } |
204 | } | 204 | } |
205 | 205 | ||
206 | public double FindMax() | 206 | public double FindMax() |
207 | { | 207 | { |
208 | int x, y; | 208 | int x, y; |
209 | double max = double.MinValue; | 209 | double max = double.MinValue; |
210 | 210 | ||
211 | for (x = 0; x < w; x++) | 211 | for (x = 0; x < w; x++) |
212 | { | 212 | { |
213 | for (y = 0; y < h; y++) | 213 | for (y = 0; y < h; y++) |
214 | { | 214 | { |
215 | if (map[x, y] > max) | 215 | if (map[x, y] > max) |
216 | max = map[x, y]; | 216 | max = map[x, y]; |
217 | } | 217 | } |
218 | } | 218 | } |
219 | 219 | ||
220 | return max; | 220 | return max; |
221 | } | 221 | } |
222 | 222 | ||
223 | public double FindMin() | 223 | public double FindMin() |
224 | { | 224 | { |
225 | int x, y; | 225 | int x, y; |
226 | double min = double.MaxValue; | 226 | double min = double.MaxValue; |
227 | 227 | ||
228 | for (x = 0; x < w; x++) | 228 | for (x = 0; x < w; x++) |
229 | { | 229 | { |
230 | for (y = 0; y < h; y++) | 230 | for (y = 0; y < h; y++) |
231 | { | 231 | { |
232 | if (map[x, y] < min) | 232 | if (map[x, y] < min) |
233 | min = map[x, y]; | 233 | min = map[x, y]; |
234 | } | 234 | } |
235 | } | 235 | } |
236 | 236 | ||
237 | return min; | 237 | return min; |
238 | } | 238 | } |
239 | 239 | ||
240 | public double Sum() | 240 | public double Sum() |
241 | { | 241 | { |
242 | int x, y; | 242 | int x, y; |
243 | double sum = 0.0; | 243 | double sum = 0.0; |
244 | 244 | ||
245 | for (x = 0; x < w; x++) | 245 | for (x = 0; x < w; x++) |
246 | { | 246 | { |
247 | for (y = 0; y < h; y++) | 247 | for (y = 0; y < h; y++) |
248 | { | 248 | { |
249 | sum += map[x, y]; | 249 | sum += map[x, y]; |
250 | } | 250 | } |
251 | } | 251 | } |
252 | 252 | ||
253 | return sum; | 253 | return sum; |
254 | } | 254 | } |
255 | 255 | ||
256 | public double Avg() | 256 | public double Avg() |
257 | { | 257 | { |
258 | return Sum() / (w * h); | 258 | return Sum() / (w * h); |
259 | } | 259 | } |
260 | 260 | ||
261 | public bool ContainsNaN() | 261 | public bool ContainsNaN() |
262 | { | 262 | { |
263 | int x, y; | 263 | int x, y; |
264 | for (x = 0; x < w; x++) | 264 | for (x = 0; x < w; x++) |
265 | { | 265 | { |
266 | for (y = 0; y < h; y++) | 266 | for (y = 0; y < h; y++) |
267 | { | 267 | { |
268 | double elm = map[x, y]; | 268 | double elm = map[x, y]; |
269 | 269 | ||
270 | if (Double.IsNaN(elm)) | 270 | if (Double.IsNaN(elm)) |
271 | return true; | 271 | return true; |
272 | } | 272 | } |
273 | } | 273 | } |
274 | return false; | 274 | return false; |
275 | } | 275 | } |
276 | } | 276 | } |
277 | } | 277 | } |
diff --git a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Editing/Flatten.cs b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Editing/Flatten.cs index 48f02e8..713ae23 100644 --- a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Editing/Flatten.cs +++ b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Editing/Flatten.cs | |||
@@ -1,149 +1,149 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (c) Contributors, http://www.openmetaverse.org/ | 2 | * Copyright (c) Contributors, http://www.openmetaverse.org/ |
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | 3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. |
4 | * | 4 | * |
5 | * Redistribution and use in source and binary forms, with or without | 5 | * Redistribution and use in source and binary forms, with or without |
6 | * modification, are permitted provided that the following conditions are met: | 6 | * modification, are permitted provided that the following conditions are met: |
7 | * * Redistributions of source code must retain the above copyright | 7 | * * Redistributions of source code must retain the above copyright |
8 | * notice, this list of conditions and the following disclaimer. | 8 | * notice, this list of conditions and the following disclaimer. |
9 | * * Redistributions in binary form must reproduce the above copyright | 9 | * * Redistributions in binary form must reproduce the above copyright |
10 | * notice, this list of conditions and the following disclaimer in the | 10 | * notice, this list of conditions and the following disclaimer in the |
11 | * documentation and/or other materials provided with the distribution. | 11 | * documentation and/or other materials provided with the distribution. |
12 | * * Neither the name of the OpenSim Project nor the | 12 | * * Neither the name of the OpenSim Project nor the |
13 | * names of its contributors may be used to endorse or promote products | 13 | * names of its contributors may be used to endorse or promote products |
14 | * derived from this software without specific prior written permission. | 14 | * derived from this software without specific prior written permission. |
15 | * | 15 | * |
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY | 16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY |
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | 17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | 18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | 19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY |
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | 20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | 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 | 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 | 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 | 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. | 25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
26 | * | 26 | * |
27 | */ | 27 | */ |
28 | 28 | ||
29 | 29 | ||
30 | using System; | 30 | using System; |
31 | using System.Collections.Generic; | 31 | using System.Collections.Generic; |
32 | using System.Text; | 32 | using System.Text; |
33 | 33 | ||
34 | namespace libTerrain | 34 | namespace libTerrain |
35 | { | 35 | { |
36 | partial class Channel | 36 | partial class Channel |
37 | { | 37 | { |
38 | /// <summary> | 38 | /// <summary> |
39 | /// Flattens the area underneath rx,ry by moving it to the average of the area. Uses a spherical mask provided by the raise() function. | 39 | /// Flattens the area underneath rx,ry by moving it to the average of the area. Uses a spherical mask provided by the raise() function. |
40 | /// </summary> | 40 | /// </summary> |
41 | /// <param name="rx">The X coordinate of the terrain mask</param> | 41 | /// <param name="rx">The X coordinate of the terrain mask</param> |
42 | /// <param name="ry">The Y coordinate of the terrain mask</param> | 42 | /// <param name="ry">The Y coordinate of the terrain mask</param> |
43 | /// <param name="size">The size of the terrain mask</param> | 43 | /// <param name="size">The size of the terrain mask</param> |
44 | /// <param name="amount">The scale of the terrain mask</param> | 44 | /// <param name="amount">The scale of the terrain mask</param> |
45 | public void Flatten(double rx, double ry, double size, double amount) | 45 | public void Flatten(double rx, double ry, double size, double amount) |
46 | { | 46 | { |
47 | FlattenSlow(rx, ry, size, amount); | 47 | FlattenSlow(rx, ry, size, amount); |
48 | } | 48 | } |
49 | 49 | ||
50 | private void FlattenSlow(double rx, double ry, double size, double amount) | 50 | private void FlattenSlow(double rx, double ry, double size, double amount) |
51 | { | 51 | { |
52 | // Generate the mask | 52 | // Generate the mask |
53 | Channel temp = new Channel(w, h); | 53 | Channel temp = new Channel(w, h); |
54 | temp.Fill(0); | 54 | temp.Fill(0); |
55 | temp.Raise(rx, ry, size, amount); | 55 | temp.Raise(rx, ry, size, amount); |
56 | temp.Normalise(); | 56 | temp.Normalise(); |
57 | double total_mod = temp.Sum(); | 57 | double total_mod = temp.Sum(); |
58 | 58 | ||
59 | // Establish the average height under the area | 59 | // Establish the average height under the area |
60 | Channel newmap = new Channel(w, h); | 60 | Channel newmap = new Channel(w, h); |
61 | newmap.map = (double[,])map.Clone(); | 61 | newmap.map = (double[,])map.Clone(); |
62 | 62 | ||
63 | newmap *= temp; | 63 | newmap *= temp; |
64 | 64 | ||
65 | double total_terrain = newmap.Sum(); | 65 | double total_terrain = newmap.Sum(); |
66 | double avg_height = total_terrain / total_mod; | 66 | double avg_height = total_terrain / total_mod; |
67 | 67 | ||
68 | // Create a flat terrain using the average height | 68 | // Create a flat terrain using the average height |
69 | Channel flat = new Channel(w, h); | 69 | Channel flat = new Channel(w, h); |
70 | flat.Fill(avg_height); | 70 | flat.Fill(avg_height); |
71 | 71 | ||
72 | // Blend the current terrain with the average height terrain | 72 | // Blend the current terrain with the average height terrain |
73 | // using the "raised" empty terrain as a mask | 73 | // using the "raised" empty terrain as a mask |
74 | Blend(flat, temp); | 74 | Blend(flat, temp); |
75 | 75 | ||
76 | } | 76 | } |
77 | 77 | ||
78 | private void FlattenFast(double rx, double ry, double size, double amount) | 78 | private void FlattenFast(double rx, double ry, double size, double amount) |
79 | { | 79 | { |
80 | int x, y; | 80 | int x, y; |
81 | double avg = 0; | 81 | double avg = 0; |
82 | double div = 0; | 82 | double div = 0; |
83 | 83 | ||
84 | int minX = Math.Max(0, (int)(rx - (size + 1))); | 84 | int minX = Math.Max(0, (int)(rx - (size + 1))); |
85 | int maxX = Math.Min(w, (int)(rx + (size + 1))); | 85 | int maxX = Math.Min(w, (int)(rx + (size + 1))); |
86 | int minY = Math.Max(0, (int)(ry - (size + 1))); | 86 | int minY = Math.Max(0, (int)(ry - (size + 1))); |
87 | int maxY = Math.Min(h, (int)(ry + (size + 1))); | 87 | int maxY = Math.Min(h, (int)(ry + (size + 1))); |
88 | 88 | ||
89 | for (x = minX; x < maxX; x++) | 89 | for (x = minX; x < maxX; x++) |
90 | { | 90 | { |
91 | for (y = minY; y < maxY; y++) | 91 | for (y = minY; y < maxY; y++) |
92 | { | 92 | { |
93 | double z = size; | 93 | double z = size; |
94 | z *= z; | 94 | z *= z; |
95 | z -= ((x - rx) * (x - rx)) + ((y - ry) * (y - ry)); | 95 | z -= ((x - rx) * (x - rx)) + ((y - ry) * (y - ry)); |
96 | 96 | ||
97 | if (z < 0) | 97 | if (z < 0) |
98 | z = 0; | 98 | z = 0; |
99 | 99 | ||
100 | avg += z * amount; | 100 | avg += z * amount; |
101 | div += z; | 101 | div += z; |
102 | } | 102 | } |
103 | } | 103 | } |
104 | 104 | ||
105 | double height = avg / div; | 105 | double height = avg / div; |
106 | 106 | ||
107 | for (x = minX; x < maxX; x++) | 107 | for (x = minX; x < maxX; x++) |
108 | { | 108 | { |
109 | for (y = minY; y < maxY; y++) | 109 | for (y = minY; y < maxY; y++) |
110 | { | 110 | { |
111 | double z = size; | 111 | double z = size; |
112 | z *= z; | 112 | z *= z; |
113 | z -= ((x - rx) * (x - rx)) + ((y - ry) * (y - ry)); | 113 | z -= ((x - rx) * (x - rx)) + ((y - ry) * (y - ry)); |
114 | 114 | ||
115 | if (z < 0) | 115 | if (z < 0) |
116 | z = 0; | 116 | z = 0; |
117 | 117 | ||
118 | Set(x, y, Tools.linearInterpolate(map[x, y], height, z)); | 118 | Set(x, y, Tools.linearInterpolate(map[x, y], height, z)); |
119 | } | 119 | } |
120 | } | 120 | } |
121 | } | 121 | } |
122 | 122 | ||
123 | public void Flatten(Channel mask, double amount) | 123 | public void Flatten(Channel mask, double amount) |
124 | { | 124 | { |
125 | // Generate the mask | 125 | // Generate the mask |
126 | Channel temp = mask * amount; | 126 | Channel temp = mask * amount; |
127 | temp.Clip(0, 1); // Cut off out-of-bounds values | 127 | temp.Clip(0, 1); // Cut off out-of-bounds values |
128 | 128 | ||
129 | double total_mod = temp.Sum(); | 129 | double total_mod = temp.Sum(); |
130 | 130 | ||
131 | // Establish the average height under the area | 131 | // Establish the average height under the area |
132 | Channel map = new Channel(w, h); | 132 | Channel map = new Channel(w, h); |
133 | map.map = (double[,])this.map.Clone(); | 133 | map.map = (double[,])this.map.Clone(); |
134 | 134 | ||
135 | map *= temp; | 135 | map *= temp; |
136 | 136 | ||
137 | double total_terrain = map.Sum(); | 137 | double total_terrain = map.Sum(); |
138 | double avg_height = total_terrain / total_mod; | 138 | double avg_height = total_terrain / total_mod; |
139 | 139 | ||
140 | // Create a flat terrain using the average height | 140 | // Create a flat terrain using the average height |
141 | Channel flat = new Channel(w, h); | 141 | Channel flat = new Channel(w, h); |
142 | flat.Fill(avg_height); | 142 | flat.Fill(avg_height); |
143 | 143 | ||
144 | // Blend the current terrain with the average height terrain | 144 | // Blend the current terrain with the average height terrain |
145 | // using the "raised" empty terrain as a mask | 145 | // using the "raised" empty terrain as a mask |
146 | Blend(flat, temp); | 146 | Blend(flat, temp); |
147 | } | 147 | } |
148 | } | 148 | } |
149 | } \ No newline at end of file | 149 | } \ No newline at end of file |
diff --git a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Editing/Raise.cs b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Editing/Raise.cs index 1d04a4f..64d175c 100644 --- a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Editing/Raise.cs +++ b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Editing/Raise.cs | |||
@@ -1,139 +1,139 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (c) Contributors, http://www.openmetaverse.org/ | 2 | * Copyright (c) Contributors, http://www.openmetaverse.org/ |
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | 3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. |
4 | * | 4 | * |
5 | * Redistribution and use in source and binary forms, with or without | 5 | * Redistribution and use in source and binary forms, with or without |
6 | * modification, are permitted provided that the following conditions are met: | 6 | * modification, are permitted provided that the following conditions are met: |
7 | * * Redistributions of source code must retain the above copyright | 7 | * * Redistributions of source code must retain the above copyright |
8 | * notice, this list of conditions and the following disclaimer. | 8 | * notice, this list of conditions and the following disclaimer. |
9 | * * Redistributions in binary form must reproduce the above copyright | 9 | * * Redistributions in binary form must reproduce the above copyright |
10 | * notice, this list of conditions and the following disclaimer in the | 10 | * notice, this list of conditions and the following disclaimer in the |
11 | * documentation and/or other materials provided with the distribution. | 11 | * documentation and/or other materials provided with the distribution. |
12 | * * Neither the name of the OpenSim Project nor the | 12 | * * Neither the name of the OpenSim Project nor the |
13 | * names of its contributors may be used to endorse or promote products | 13 | * names of its contributors may be used to endorse or promote products |
14 | * derived from this software without specific prior written permission. | 14 | * derived from this software without specific prior written permission. |
15 | * | 15 | * |
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY | 16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY |
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | 17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | 18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | 19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY |
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | 20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | 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 | 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 | 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 | 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. | 25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
26 | * | 26 | * |
27 | */ | 27 | */ |
28 | 28 | ||
29 | 29 | ||
30 | using System; | 30 | using System; |
31 | using System.Collections.Generic; | 31 | using System.Collections.Generic; |
32 | using System.Text; | 32 | using System.Text; |
33 | 33 | ||
34 | namespace libTerrain | 34 | namespace libTerrain |
35 | { | 35 | { |
36 | partial class Channel | 36 | partial class Channel |
37 | { | 37 | { |
38 | /// <summary> | 38 | /// <summary> |
39 | /// Raises land around the selection | 39 | /// Raises land around the selection |
40 | /// </summary> | 40 | /// </summary> |
41 | /// <param name="rx">The center the X coordinate of where you wish to raise the land</param> | 41 | /// <param name="rx">The center the X coordinate of where you wish to raise the land</param> |
42 | /// <param name="ry">The center the Y coordinate of where you wish to raise the land</param> | 42 | /// <param name="ry">The center the Y coordinate of where you wish to raise the land</param> |
43 | /// <param name="size">The radius of the dimple</param> | 43 | /// <param name="size">The radius of the dimple</param> |
44 | /// <param name="amount">How much impact to add to the terrain (0..2 usually)</param> | 44 | /// <param name="amount">How much impact to add to the terrain (0..2 usually)</param> |
45 | public void Raise(double rx, double ry, double size, double amount) | 45 | public void Raise(double rx, double ry, double size, double amount) |
46 | { | 46 | { |
47 | RaiseSphere(rx, ry, size, amount); | 47 | RaiseSphere(rx, ry, size, amount); |
48 | } | 48 | } |
49 | 49 | ||
50 | /// <summary> | 50 | /// <summary> |
51 | /// Raises land in a sphere around the selection | 51 | /// Raises land in a sphere around the selection |
52 | /// </summary> | 52 | /// </summary> |
53 | /// <param name="rx">The center the X coordinate of where you wish to raise the land</param> | 53 | /// <param name="rx">The center the X coordinate of where you wish to raise the land</param> |
54 | /// <param name="ry">The center the Y coordinate of where you wish to raise the land</param> | 54 | /// <param name="ry">The center the Y coordinate of where you wish to raise the land</param> |
55 | /// <param name="size">The radius of the sphere dimple</param> | 55 | /// <param name="size">The radius of the sphere dimple</param> |
56 | /// <param name="amount">How much impact to add to the terrain (0..2 usually)</param> | 56 | /// <param name="amount">How much impact to add to the terrain (0..2 usually)</param> |
57 | public void RaiseSphere(double rx, double ry, double size, double amount) | 57 | public void RaiseSphere(double rx, double ry, double size, double amount) |
58 | { | 58 | { |
59 | int x, y; | 59 | int x, y; |
60 | for (x = 0; x < w; x++) | 60 | for (x = 0; x < w; x++) |
61 | { | 61 | { |
62 | for (y = 0; y < h; y++) | 62 | for (y = 0; y < h; y++) |
63 | { | 63 | { |
64 | double z = size; | 64 | double z = size; |
65 | z *= z; | 65 | z *= z; |
66 | z -= ((x - rx) * (x - rx)) + ((y - ry) * (y - ry)); | 66 | z -= ((x - rx) * (x - rx)) + ((y - ry) * (y - ry)); |
67 | 67 | ||
68 | if (z < 0) | 68 | if (z < 0) |
69 | z = 0; | 69 | z = 0; |
70 | 70 | ||
71 | Set(x, y, map[x, y] + (z * amount)); | 71 | Set(x, y, map[x, y] + (z * amount)); |
72 | } | 72 | } |
73 | } | 73 | } |
74 | } | 74 | } |
75 | 75 | ||
76 | /// <summary> | 76 | /// <summary> |
77 | /// Raises land in a cone around the selection | 77 | /// Raises land in a cone around the selection |
78 | /// </summary> | 78 | /// </summary> |
79 | /// <param name="rx">The center the X coordinate of where you wish to raise the land</param> | 79 | /// <param name="rx">The center the X coordinate of where you wish to raise the land</param> |
80 | /// <param name="ry">The center the Y coordinate of where you wish to raise the land</param> | 80 | /// <param name="ry">The center the Y coordinate of where you wish to raise the land</param> |
81 | /// <param name="size">The radius of the cone</param> | 81 | /// <param name="size">The radius of the cone</param> |
82 | /// <param name="amount">How much impact to add to the terrain (0..2 usually)</param> | 82 | /// <param name="amount">How much impact to add to the terrain (0..2 usually)</param> |
83 | public void RaiseCone(double rx, double ry, double size, double amount) | 83 | public void RaiseCone(double rx, double ry, double size, double amount) |
84 | { | 84 | { |
85 | int x, y; | 85 | int x, y; |
86 | for (x = 0; x < w; x++) | 86 | for (x = 0; x < w; x++) |
87 | { | 87 | { |
88 | for (y = 0; y < h; y++) | 88 | for (y = 0; y < h; y++) |
89 | { | 89 | { |
90 | double z = size; | 90 | double z = size; |
91 | z -= Math.Sqrt(((x - rx) * (x - rx)) + ((y - ry) * (y - ry))); | 91 | z -= Math.Sqrt(((x - rx) * (x - rx)) + ((y - ry) * (y - ry))); |
92 | 92 | ||
93 | if (z < 0) | 93 | if (z < 0) |
94 | z = 0; | 94 | z = 0; |
95 | 95 | ||
96 | Set(x, y, map[x, y] + (z * amount)); | 96 | Set(x, y, map[x, y] + (z * amount)); |
97 | } | 97 | } |
98 | } | 98 | } |
99 | } | 99 | } |
100 | 100 | ||
101 | /// <summary> | 101 | /// <summary> |
102 | /// Lowers land in a sphere around the selection | 102 | /// Lowers land in a sphere around the selection |
103 | /// </summary> | 103 | /// </summary> |
104 | /// <param name="rx">The center the X coordinate of where you wish to lower the land</param> | 104 | /// <param name="rx">The center the X coordinate of where you wish to lower the land</param> |
105 | /// <param name="ry">The center the Y coordinate of where you wish to lower the land</param> | 105 | /// <param name="ry">The center the Y coordinate of where you wish to lower the land</param> |
106 | /// <param name="size">The radius of the sphere dimple</param> | 106 | /// <param name="size">The radius of the sphere dimple</param> |
107 | /// <param name="amount">How much impact to remove from the terrain (0..2 usually)</param> | 107 | /// <param name="amount">How much impact to remove from the terrain (0..2 usually)</param> |
108 | public void Lower(double rx, double ry, double size, double amount) | 108 | public void Lower(double rx, double ry, double size, double amount) |
109 | { | 109 | { |
110 | LowerSphere(rx, ry, size, amount); | 110 | LowerSphere(rx, ry, size, amount); |
111 | } | 111 | } |
112 | 112 | ||
113 | /// <summary> | 113 | /// <summary> |
114 | /// Lowers land in a sphere around the selection | 114 | /// Lowers land in a sphere around the selection |
115 | /// </summary> | 115 | /// </summary> |
116 | /// <param name="rx">The center the X coordinate of where you wish to lower the land</param> | 116 | /// <param name="rx">The center the X coordinate of where you wish to lower the land</param> |
117 | /// <param name="ry">The center the Y coordinate of where you wish to lower the land</param> | 117 | /// <param name="ry">The center the Y coordinate of where you wish to lower the land</param> |
118 | /// <param name="size">The radius of the sphere dimple</param> | 118 | /// <param name="size">The radius of the sphere dimple</param> |
119 | /// <param name="amount">How much impact to remove from the terrain (0..2 usually)</param> | 119 | /// <param name="amount">How much impact to remove from the terrain (0..2 usually)</param> |
120 | public void LowerSphere(double rx, double ry, double size, double amount) | 120 | public void LowerSphere(double rx, double ry, double size, double amount) |
121 | { | 121 | { |
122 | int x, y; | 122 | int x, y; |
123 | for (x = 0; x < w; x++) | 123 | for (x = 0; x < w; x++) |
124 | { | 124 | { |
125 | for (y = 0; y < h; y++) | 125 | for (y = 0; y < h; y++) |
126 | { | 126 | { |
127 | double z = size; | 127 | double z = size; |
128 | z *= z; | 128 | z *= z; |
129 | z -= ((x - rx) * (x - rx)) + ((y - ry) * (y - ry)); | 129 | z -= ((x - rx) * (x - rx)) + ((y - ry) * (y - ry)); |
130 | 130 | ||
131 | if (z < 0) | 131 | if (z < 0) |
132 | z = 0; | 132 | z = 0; |
133 | 133 | ||
134 | Set(x, y, map[x, y] - (z * amount)); | 134 | Set(x, y, map[x, y] - (z * amount)); |
135 | } | 135 | } |
136 | } | 136 | } |
137 | } | 137 | } |
138 | } | 138 | } |
139 | } \ No newline at end of file | 139 | } \ No newline at end of file |
diff --git a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/File.cs b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/File.cs index c0173c0..cfefb6b 100644 --- a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/File.cs +++ b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/File.cs | |||
@@ -1,77 +1,77 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (c) Contributors, http://www.openmetaverse.org/ | 2 | * Copyright (c) Contributors, http://www.openmetaverse.org/ |
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | 3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. |
4 | * | 4 | * |
5 | * Redistribution and use in source and binary forms, with or without | 5 | * Redistribution and use in source and binary forms, with or without |
6 | * modification, are permitted provided that the following conditions are met: | 6 | * modification, are permitted provided that the following conditions are met: |
7 | * * Redistributions of source code must retain the above copyright | 7 | * * Redistributions of source code must retain the above copyright |
8 | * notice, this list of conditions and the following disclaimer. | 8 | * notice, this list of conditions and the following disclaimer. |
9 | * * Redistributions in binary form must reproduce the above copyright | 9 | * * Redistributions in binary form must reproduce the above copyright |
10 | * notice, this list of conditions and the following disclaimer in the | 10 | * notice, this list of conditions and the following disclaimer in the |
11 | * documentation and/or other materials provided with the distribution. | 11 | * documentation and/or other materials provided with the distribution. |
12 | * * Neither the name of the OpenSim Project nor the | 12 | * * Neither the name of the OpenSim Project nor the |
13 | * names of its contributors may be used to endorse or promote products | 13 | * names of its contributors may be used to endorse or promote products |
14 | * derived from this software without specific prior written permission. | 14 | * derived from this software without specific prior written permission. |
15 | * | 15 | * |
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY | 16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY |
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | 17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | 18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | 19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY |
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | 20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | 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 | 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 | 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 | 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. | 25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
26 | * | 26 | * |
27 | */ | 27 | */ |
28 | 28 | ||
29 | using System; | 29 | using System; |
30 | using System.Collections.Generic; | 30 | using System.Collections.Generic; |
31 | using System.Text; | 31 | using System.Text; |
32 | using System.Drawing; | 32 | using System.Drawing; |
33 | 33 | ||
34 | namespace libTerrain | 34 | namespace libTerrain |
35 | { | 35 | { |
36 | partial class Channel | 36 | partial class Channel |
37 | { | 37 | { |
38 | public Channel LoadImage(string filename) | 38 | public Channel LoadImage(string filename) |
39 | { | 39 | { |
40 | SetDiff(); | 40 | SetDiff(); |
41 | 41 | ||
42 | Bitmap bit = new Bitmap(filename); | 42 | Bitmap bit = new Bitmap(filename); |
43 | Channel chan = new Channel(bit.Width, bit.Height); | 43 | Channel chan = new Channel(bit.Width, bit.Height); |
44 | 44 | ||
45 | int x, y; | 45 | int x, y; |
46 | for (x = 0; x < bit.Width; x++) | 46 | for (x = 0; x < bit.Width; x++) |
47 | { | 47 | { |
48 | for (y = 0; y < bit.Height; y++) | 48 | for (y = 0; y < bit.Height; y++) |
49 | { | 49 | { |
50 | Color val = bit.GetPixel(x, y); | 50 | Color val = bit.GetPixel(x, y); |
51 | chan.map[x, y] = (((double)val.R + (double)val.G + (double)val.B) / 3.0) / 255.0; | 51 | chan.map[x, y] = (((double)val.R + (double)val.G + (double)val.B) / 3.0) / 255.0; |
52 | } | 52 | } |
53 | } | 53 | } |
54 | 54 | ||
55 | return chan; | 55 | return chan; |
56 | } | 56 | } |
57 | 57 | ||
58 | public void SaveImage(string filename) | 58 | public void SaveImage(string filename) |
59 | { | 59 | { |
60 | Channel outmap = this.Copy(); | 60 | Channel outmap = this.Copy(); |
61 | outmap.Normalise(); | 61 | outmap.Normalise(); |
62 | 62 | ||
63 | Bitmap bit = new Bitmap(w, h, System.Drawing.Imaging.PixelFormat.Format24bppRgb); | 63 | Bitmap bit = new Bitmap(w, h, System.Drawing.Imaging.PixelFormat.Format24bppRgb); |
64 | int x, y; | 64 | int x, y; |
65 | for (x = 0; x < w; x++) | 65 | for (x = 0; x < w; x++) |
66 | { | 66 | { |
67 | for (y = 0; y < h; y++) | 67 | for (y = 0; y < h; y++) |
68 | { | 68 | { |
69 | int val = Math.Min(255, (int)(outmap.map[x,y] * 255)); | 69 | int val = Math.Min(255, (int)(outmap.map[x,y] * 255)); |
70 | Color col = Color.FromArgb(val,val,val); | 70 | Color col = Color.FromArgb(val,val,val); |
71 | bit.SetPixel(x, y, col); | 71 | bit.SetPixel(x, y, col); |
72 | } | 72 | } |
73 | } | 73 | } |
74 | bit.Save(filename); | 74 | bit.Save(filename); |
75 | } | 75 | } |
76 | } | 76 | } |
77 | } | 77 | } |
diff --git a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Generators/Fracture.cs b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Generators/Fracture.cs index 13dd1bc..2d42759 100644 --- a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Generators/Fracture.cs +++ b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Generators/Fracture.cs | |||
@@ -1,145 +1,145 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (c) Contributors, http://www.openmetaverse.org/ | 2 | * Copyright (c) Contributors, http://www.openmetaverse.org/ |
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | 3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. |
4 | * | 4 | * |
5 | * Redistribution and use in source and binary forms, with or without | 5 | * Redistribution and use in source and binary forms, with or without |
6 | * modification, are permitted provided that the following conditions are met: | 6 | * modification, are permitted provided that the following conditions are met: |
7 | * * Redistributions of source code must retain the above copyright | 7 | * * Redistributions of source code must retain the above copyright |
8 | * notice, this list of conditions and the following disclaimer. | 8 | * notice, this list of conditions and the following disclaimer. |
9 | * * Redistributions in binary form must reproduce the above copyright | 9 | * * Redistributions in binary form must reproduce the above copyright |
10 | * notice, this list of conditions and the following disclaimer in the | 10 | * notice, this list of conditions and the following disclaimer in the |
11 | * documentation and/or other materials provided with the distribution. | 11 | * documentation and/or other materials provided with the distribution. |
12 | * * Neither the name of the OpenSim Project nor the | 12 | * * Neither the name of the OpenSim Project nor the |
13 | * names of its contributors may be used to endorse or promote products | 13 | * names of its contributors may be used to endorse or promote products |
14 | * derived from this software without specific prior written permission. | 14 | * derived from this software without specific prior written permission. |
15 | * | 15 | * |
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY | 16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY |
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | 17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | 18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | 19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY |
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | 20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | 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 | 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 | 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 | 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. | 25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
26 | * | 26 | * |
27 | */ | 27 | */ |
28 | 28 | ||
29 | using System; | 29 | using System; |
30 | using System.Collections.Generic; | 30 | using System.Collections.Generic; |
31 | using System.Text; | 31 | using System.Text; |
32 | 32 | ||
33 | namespace libTerrain | 33 | namespace libTerrain |
34 | { | 34 | { |
35 | partial class Channel | 35 | partial class Channel |
36 | { | 36 | { |
37 | /// <summary> | 37 | /// <summary> |
38 | /// Produces a set of coordinates defined by an edge point. Eg - 0 = 0,0. 256 = 0,256. 512 = 256,256 | 38 | /// Produces a set of coordinates defined by an edge point. Eg - 0 = 0,0. 256 = 0,256. 512 = 256,256 |
39 | /// Assumes a 256^2 heightmap. This needs fixing for input values of w,h | 39 | /// Assumes a 256^2 heightmap. This needs fixing for input values of w,h |
40 | /// </summary> | 40 | /// </summary> |
41 | /// <param name="val"></param> | 41 | /// <param name="val"></param> |
42 | /// <param name="w"></param> | 42 | /// <param name="w"></param> |
43 | /// <param name="h"></param> | 43 | /// <param name="h"></param> |
44 | /// <returns></returns> | 44 | /// <returns></returns> |
45 | private int[] RadialEdge256(int val) | 45 | private int[] RadialEdge256(int val) |
46 | { | 46 | { |
47 | // Four cases: | 47 | // Four cases: |
48 | // 1. 000..255 return 0,val | 48 | // 1. 000..255 return 0,val |
49 | // 2. 256..511 return val - 256,255 | 49 | // 2. 256..511 return val - 256,255 |
50 | // 3. 512..767 return 255, val - 511 | 50 | // 3. 512..767 return 255, val - 511 |
51 | // 4. 768..1023 return val - 768,0 | 51 | // 4. 768..1023 return val - 768,0 |
52 | 52 | ||
53 | int[] ret = new int[2]; | 53 | int[] ret = new int[2]; |
54 | 54 | ||
55 | if (val < 256) | 55 | if (val < 256) |
56 | { | 56 | { |
57 | ret[0] = 0; | 57 | ret[0] = 0; |
58 | ret[1] = val; | 58 | ret[1] = val; |
59 | return ret; | 59 | return ret; |
60 | } | 60 | } |
61 | if (val < 512) | 61 | if (val < 512) |
62 | { | 62 | { |
63 | ret[0] = (val % 256); | 63 | ret[0] = (val % 256); |
64 | ret[1] = 255; | 64 | ret[1] = 255; |
65 | return ret; | 65 | return ret; |
66 | } | 66 | } |
67 | if (val < 768) | 67 | if (val < 768) |
68 | { | 68 | { |
69 | ret[0] = 255; | 69 | ret[0] = 255; |
70 | ret[1] = 255 - (val % 256); | 70 | ret[1] = 255 - (val % 256); |
71 | return ret; | 71 | return ret; |
72 | } | 72 | } |
73 | if (val < 1024) | 73 | if (val < 1024) |
74 | { | 74 | { |
75 | ret[0] = 255 - (val % 256); | 75 | ret[0] = 255 - (val % 256); |
76 | ret[1] = 255; | 76 | ret[1] = 255; |
77 | return ret; | 77 | return ret; |
78 | } | 78 | } |
79 | 79 | ||
80 | throw new Exception("Out of bounds parameter (val)"); | 80 | throw new Exception("Out of bounds parameter (val)"); |
81 | } | 81 | } |
82 | 82 | ||
83 | public void Fracture(int number, double scalemin, double scalemax) | 83 | public void Fracture(int number, double scalemin, double scalemax) |
84 | { | 84 | { |
85 | SetDiff(); | 85 | SetDiff(); |
86 | 86 | ||
87 | Random rand = new Random(seed); | 87 | Random rand = new Random(seed); |
88 | 88 | ||
89 | for (int i = 0; i < number; i++) | 89 | for (int i = 0; i < number; i++) |
90 | { | 90 | { |
91 | int[] a, b; | 91 | int[] a, b; |
92 | 92 | ||
93 | a = RadialEdge256(rand.Next(1023)); // TODO: Broken | 93 | a = RadialEdge256(rand.Next(1023)); // TODO: Broken |
94 | b = RadialEdge256(rand.Next(1023)); // TODO: Broken | 94 | b = RadialEdge256(rand.Next(1023)); // TODO: Broken |
95 | double z = rand.NextDouble(); | 95 | double z = rand.NextDouble(); |
96 | double u = rand.NextDouble(); | 96 | double u = rand.NextDouble(); |
97 | double v = rand.NextDouble(); | 97 | double v = rand.NextDouble(); |
98 | 98 | ||
99 | for (int x = 0; x < w; x++) | 99 | for (int x = 0; x < w; x++) |
100 | { | 100 | { |
101 | for (int y = 0; y < h; y++) | 101 | for (int y = 0; y < h; y++) |
102 | { | 102 | { |
103 | double miny = Tools.linearInterpolate(a[1], b[1], (double)x / (double)w); | 103 | double miny = Tools.linearInterpolate(a[1], b[1], (double)x / (double)w); |
104 | 104 | ||
105 | if (v >= 0.5) | 105 | if (v >= 0.5) |
106 | { | 106 | { |
107 | if (u >= 0.5) | 107 | if (u >= 0.5) |
108 | { | 108 | { |
109 | if (y > miny) | 109 | if (y > miny) |
110 | { | 110 | { |
111 | map[x, y] += Tools.linearInterpolate(scalemin, scalemax, z); | 111 | map[x, y] += Tools.linearInterpolate(scalemin, scalemax, z); |
112 | } | 112 | } |
113 | } | 113 | } |
114 | else | 114 | else |
115 | { | 115 | { |
116 | if (y < miny) | 116 | if (y < miny) |
117 | { | 117 | { |
118 | map[x, y] += Tools.linearInterpolate(scalemin, scalemax, z); | 118 | map[x, y] += Tools.linearInterpolate(scalemin, scalemax, z); |
119 | } | 119 | } |
120 | } | 120 | } |
121 | } | 121 | } |
122 | else | 122 | else |
123 | { | 123 | { |
124 | if (u >= 0.5) | 124 | if (u >= 0.5) |
125 | { | 125 | { |
126 | if (x > miny) | 126 | if (x > miny) |
127 | { | 127 | { |
128 | map[x, y] += Tools.linearInterpolate(scalemin, scalemax, z); | 128 | map[x, y] += Tools.linearInterpolate(scalemin, scalemax, z); |
129 | } | 129 | } |
130 | } | 130 | } |
131 | else | 131 | else |
132 | { | 132 | { |
133 | if (x < miny) | 133 | if (x < miny) |
134 | { | 134 | { |
135 | map[x, y] += Tools.linearInterpolate(scalemin, scalemax, z); | 135 | map[x, y] += Tools.linearInterpolate(scalemin, scalemax, z); |
136 | } | 136 | } |
137 | } | 137 | } |
138 | } | 138 | } |
139 | } | 139 | } |
140 | } | 140 | } |
141 | } | 141 | } |
142 | Normalise(); | 142 | Normalise(); |
143 | } | 143 | } |
144 | } | 144 | } |
145 | } \ No newline at end of file | 145 | } \ No newline at end of file |
diff --git a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Generators/Gradient.cs b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Generators/Gradient.cs index 47b7a66..141fe04 100644 --- a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Generators/Gradient.cs +++ b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Generators/Gradient.cs | |||
@@ -1,66 +1,66 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (c) Contributors, http://www.openmetaverse.org/ | 2 | * Copyright (c) Contributors, http://www.openmetaverse.org/ |
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | 3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. |
4 | * | 4 | * |
5 | * Redistribution and use in source and binary forms, with or without | 5 | * Redistribution and use in source and binary forms, with or without |
6 | * modification, are permitted provided that the following conditions are met: | 6 | * modification, are permitted provided that the following conditions are met: |
7 | * * Redistributions of source code must retain the above copyright | 7 | * * Redistributions of source code must retain the above copyright |
8 | * notice, this list of conditions and the following disclaimer. | 8 | * notice, this list of conditions and the following disclaimer. |
9 | * * Redistributions in binary form must reproduce the above copyright | 9 | * * Redistributions in binary form must reproduce the above copyright |
10 | * notice, this list of conditions and the following disclaimer in the | 10 | * notice, this list of conditions and the following disclaimer in the |
11 | * documentation and/or other materials provided with the distribution. | 11 | * documentation and/or other materials provided with the distribution. |
12 | * * Neither the name of the OpenSim Project nor the | 12 | * * Neither the name of the OpenSim Project nor the |
13 | * names of its contributors may be used to endorse or promote products | 13 | * names of its contributors may be used to endorse or promote products |
14 | * derived from this software without specific prior written permission. | 14 | * derived from this software without specific prior written permission. |
15 | * | 15 | * |
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY | 16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY |
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | 17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | 18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | 19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY |
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | 20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | 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 | 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 | 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 | 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. | 25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
26 | * | 26 | * |
27 | */ | 27 | */ |
28 | 28 | ||
29 | using System; | 29 | using System; |
30 | using System.Collections.Generic; | 30 | using System.Collections.Generic; |
31 | using System.Text; | 31 | using System.Text; |
32 | 32 | ||
33 | namespace libTerrain | 33 | namespace libTerrain |
34 | { | 34 | { |
35 | partial class Channel | 35 | partial class Channel |
36 | { | 36 | { |
37 | 37 | ||
38 | public void GradientCube() | 38 | public void GradientCube() |
39 | { | 39 | { |
40 | SetDiff(); | 40 | SetDiff(); |
41 | 41 | ||
42 | int x, y; | 42 | int x, y; |
43 | for (x = 0; x < w; x++) | 43 | for (x = 0; x < w; x++) |
44 | { | 44 | { |
45 | for (y = 0; y < h; y++) | 45 | for (y = 0; y < h; y++) |
46 | { | 46 | { |
47 | map[x, y] = x*y; | 47 | map[x, y] = x*y; |
48 | } | 48 | } |
49 | } | 49 | } |
50 | Normalise(); | 50 | Normalise(); |
51 | } | 51 | } |
52 | 52 | ||
53 | public void GradientStripe() | 53 | public void GradientStripe() |
54 | { | 54 | { |
55 | int x, y; | 55 | int x, y; |
56 | for (x = 0; x < w; x++) | 56 | for (x = 0; x < w; x++) |
57 | { | 57 | { |
58 | for (y = 0; y < h; y++) | 58 | for (y = 0; y < h; y++) |
59 | { | 59 | { |
60 | map[x, y] = x; | 60 | map[x, y] = x; |
61 | } | 61 | } |
62 | } | 62 | } |
63 | Normalise(); | 63 | Normalise(); |
64 | } | 64 | } |
65 | } | 65 | } |
66 | } \ No newline at end of file | 66 | } \ No newline at end of file |
diff --git a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Generators/HillPlanter.cs b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Generators/HillPlanter.cs index 5a697b1..aa18e40 100644 --- a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Generators/HillPlanter.cs +++ b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Generators/HillPlanter.cs | |||
@@ -1,283 +1,283 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (c) Contributors, http://www.openmetaverse.org/ | 2 | * Copyright (c) Contributors, http://www.openmetaverse.org/ |
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | 3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. |
4 | * | 4 | * |
5 | * Redistribution and use in source and binary forms, with or without | 5 | * Redistribution and use in source and binary forms, with or without |
6 | * modification, are permitted provided that the following conditions are met: | 6 | * modification, are permitted provided that the following conditions are met: |
7 | * * Redistributions of source code must retain the above copyright | 7 | * * Redistributions of source code must retain the above copyright |
8 | * notice, this list of conditions and the following disclaimer. | 8 | * notice, this list of conditions and the following disclaimer. |
9 | * * Redistributions in binary form must reproduce the above copyright | 9 | * * Redistributions in binary form must reproduce the above copyright |
10 | * notice, this list of conditions and the following disclaimer in the | 10 | * notice, this list of conditions and the following disclaimer in the |
11 | * documentation and/or other materials provided with the distribution. | 11 | * documentation and/or other materials provided with the distribution. |
12 | * * Neither the name of the OpenSim Project nor the | 12 | * * Neither the name of the OpenSim Project nor the |
13 | * names of its contributors may be used to endorse or promote products | 13 | * names of its contributors may be used to endorse or promote products |
14 | * derived from this software without specific prior written permission. | 14 | * derived from this software without specific prior written permission. |
15 | * | 15 | * |
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY | 16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY |
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | 17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | 18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | 19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY |
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | 20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | 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 | 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 | 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 | 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. | 25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
26 | * | 26 | * |
27 | */ | 27 | */ |
28 | 28 | ||
29 | using System; | 29 | using System; |
30 | using System.Collections.Generic; | 30 | using System.Collections.Generic; |
31 | using System.Text; | 31 | using System.Text; |
32 | 32 | ||
33 | namespace libTerrain | 33 | namespace libTerrain |
34 | { | 34 | { |
35 | partial class Channel | 35 | partial class Channel |
36 | { | 36 | { |
37 | /// <summary> | 37 | /// <summary> |
38 | /// Generates a series of spheres which are then either max()'d or added together. Inspired by suggestion from jh. | 38 | /// Generates a series of spheres which are then either max()'d or added together. Inspired by suggestion from jh. |
39 | /// </summary> | 39 | /// </summary> |
40 | /// <remarks>3-Clause BSD Licensed</remarks> | 40 | /// <remarks>3-Clause BSD Licensed</remarks> |
41 | /// <param name="number">The number of hills to generate</param> | 41 | /// <param name="number">The number of hills to generate</param> |
42 | /// <param name="scale_min">The minimum size of each hill</param> | 42 | /// <param name="scale_min">The minimum size of each hill</param> |
43 | /// <param name="scale_range">The maximum size of each hill</param> | 43 | /// <param name="scale_range">The maximum size of each hill</param> |
44 | /// <param name="island">Whether to bias hills towards the center of the map</param> | 44 | /// <param name="island">Whether to bias hills towards the center of the map</param> |
45 | /// <param name="additive">Whether to add hills together or to pick the largest value</param> | 45 | /// <param name="additive">Whether to add hills together or to pick the largest value</param> |
46 | /// <param name="noisy">Generates hill-shaped noise instead of consistent hills</param> | 46 | /// <param name="noisy">Generates hill-shaped noise instead of consistent hills</param> |
47 | public void HillsSpheres(int number, double scale_min, double scale_range, bool island, bool additive, bool noisy) | 47 | public void HillsSpheres(int number, double scale_min, double scale_range, bool island, bool additive, bool noisy) |
48 | { | 48 | { |
49 | SetDiff(); | 49 | SetDiff(); |
50 | 50 | ||
51 | Random random = new Random(seed); | 51 | Random random = new Random(seed); |
52 | 52 | ||
53 | int x, y; | 53 | int x, y; |
54 | int i; | 54 | int i; |
55 | 55 | ||
56 | for (i = 0; i < number; i++) | 56 | for (i = 0; i < number; i++) |
57 | { | 57 | { |
58 | double rx = Math.Min(255.0, random.NextDouble() * w); | 58 | double rx = Math.Min(255.0, random.NextDouble() * w); |
59 | double ry = Math.Min(255.0, random.NextDouble() * h); | 59 | double ry = Math.Min(255.0, random.NextDouble() * h); |
60 | double rand = random.NextDouble(); | 60 | double rand = random.NextDouble(); |
61 | 61 | ||
62 | if (island) | 62 | if (island) |
63 | { | 63 | { |
64 | // Move everything towards the center | 64 | // Move everything towards the center |
65 | rx -= w / 2; | 65 | rx -= w / 2; |
66 | rx /= 2; | 66 | rx /= 2; |
67 | rx += w / 2; | 67 | rx += w / 2; |
68 | 68 | ||
69 | ry -= h / 2; | 69 | ry -= h / 2; |
70 | ry /= 2; | 70 | ry /= 2; |
71 | ry += h / 2; | 71 | ry += h / 2; |
72 | } | 72 | } |
73 | 73 | ||
74 | for (x = 0; x < w; x++) | 74 | for (x = 0; x < w; x++) |
75 | { | 75 | { |
76 | for (y = 0; y < h; y++) | 76 | for (y = 0; y < h; y++) |
77 | { | 77 | { |
78 | if (noisy) | 78 | if (noisy) |
79 | rand = random.NextDouble(); | 79 | rand = random.NextDouble(); |
80 | 80 | ||
81 | double z = (scale_min + (scale_range * rand)); | 81 | double z = (scale_min + (scale_range * rand)); |
82 | z *= z; | 82 | z *= z; |
83 | z -= ((x - rx) * (x - rx)) + ((y - ry) * (y - ry)); | 83 | z -= ((x - rx) * (x - rx)) + ((y - ry) * (y - ry)); |
84 | 84 | ||
85 | if (z < 0) | 85 | if (z < 0) |
86 | z = 0; | 86 | z = 0; |
87 | 87 | ||
88 | if (additive) | 88 | if (additive) |
89 | { | 89 | { |
90 | map[x, y] += z; | 90 | map[x, y] += z; |
91 | } | 91 | } |
92 | else | 92 | else |
93 | { | 93 | { |
94 | map[x, y] = Math.Max(map[x, y], z); | 94 | map[x, y] = Math.Max(map[x, y], z); |
95 | } | 95 | } |
96 | } | 96 | } |
97 | } | 97 | } |
98 | } | 98 | } |
99 | 99 | ||
100 | Normalise(); | 100 | Normalise(); |
101 | } | 101 | } |
102 | 102 | ||
103 | /// <summary> | 103 | /// <summary> |
104 | /// Generates a series of cones which are then either max()'d or added together. Inspired by suggestion from jh. | 104 | /// Generates a series of cones which are then either max()'d or added together. Inspired by suggestion from jh. |
105 | /// </summary> | 105 | /// </summary> |
106 | /// <remarks>3-Clause BSD Licensed</remarks> | 106 | /// <remarks>3-Clause BSD Licensed</remarks> |
107 | /// <param name="number">The number of hills to generate</param> | 107 | /// <param name="number">The number of hills to generate</param> |
108 | /// <param name="scale_min">The minimum size of each hill</param> | 108 | /// <param name="scale_min">The minimum size of each hill</param> |
109 | /// <param name="scale_range">The maximum size of each hill</param> | 109 | /// <param name="scale_range">The maximum size of each hill</param> |
110 | /// <param name="island">Whether to bias hills towards the center of the map</param> | 110 | /// <param name="island">Whether to bias hills towards the center of the map</param> |
111 | /// <param name="additive">Whether to add hills together or to pick the largest value</param> | 111 | /// <param name="additive">Whether to add hills together or to pick the largest value</param> |
112 | /// <param name="noisy">Generates hill-shaped noise instead of consistent hills</param> | 112 | /// <param name="noisy">Generates hill-shaped noise instead of consistent hills</param> |
113 | public void HillsCones(int number, double scale_min, double scale_range, bool island, bool additive, bool noisy) | 113 | public void HillsCones(int number, double scale_min, double scale_range, bool island, bool additive, bool noisy) |
114 | { | 114 | { |
115 | SetDiff(); | 115 | SetDiff(); |
116 | 116 | ||
117 | Random random = new Random(seed); | 117 | Random random = new Random(seed); |
118 | 118 | ||
119 | int x, y; | 119 | int x, y; |
120 | int i; | 120 | int i; |
121 | 121 | ||
122 | for (i = 0; i < number; i++) | 122 | for (i = 0; i < number; i++) |
123 | { | 123 | { |
124 | double rx = Math.Min(255.0, random.NextDouble() * w); | 124 | double rx = Math.Min(255.0, random.NextDouble() * w); |
125 | double ry = Math.Min(255.0, random.NextDouble() * h); | 125 | double ry = Math.Min(255.0, random.NextDouble() * h); |
126 | double rand = random.NextDouble(); | 126 | double rand = random.NextDouble(); |
127 | 127 | ||
128 | if (island) | 128 | if (island) |
129 | { | 129 | { |
130 | // Move everything towards the center | 130 | // Move everything towards the center |
131 | rx -= w / 2; | 131 | rx -= w / 2; |
132 | rx /= 2; | 132 | rx /= 2; |
133 | rx += w / 2; | 133 | rx += w / 2; |
134 | 134 | ||
135 | ry -= h / 2; | 135 | ry -= h / 2; |
136 | ry /= 2; | 136 | ry /= 2; |
137 | ry += h / 2; | 137 | ry += h / 2; |
138 | } | 138 | } |
139 | 139 | ||
140 | for (x = 0; x < w; x++) | 140 | for (x = 0; x < w; x++) |
141 | { | 141 | { |
142 | for (y = 0; y < h; y++) | 142 | for (y = 0; y < h; y++) |
143 | { | 143 | { |
144 | if (noisy) | 144 | if (noisy) |
145 | rand = random.NextDouble(); | 145 | rand = random.NextDouble(); |
146 | 146 | ||
147 | double z = (scale_min + (scale_range * rand)); | 147 | double z = (scale_min + (scale_range * rand)); |
148 | z -= Math.Sqrt(((x - rx) * (x - rx)) + ((y - ry) * (y - ry))); | 148 | z -= Math.Sqrt(((x - rx) * (x - rx)) + ((y - ry) * (y - ry))); |
149 | 149 | ||
150 | if (z < 0) | 150 | if (z < 0) |
151 | z = 0; | 151 | z = 0; |
152 | 152 | ||
153 | if (additive) | 153 | if (additive) |
154 | { | 154 | { |
155 | map[x, y] += z; | 155 | map[x, y] += z; |
156 | } | 156 | } |
157 | else | 157 | else |
158 | { | 158 | { |
159 | map[x, y] = Math.Max(map[x, y], z); | 159 | map[x, y] = Math.Max(map[x, y], z); |
160 | } | 160 | } |
161 | } | 161 | } |
162 | } | 162 | } |
163 | } | 163 | } |
164 | 164 | ||
165 | Normalise(); | 165 | Normalise(); |
166 | } | 166 | } |
167 | 167 | ||
168 | public void HillsBlocks(int number, double scale_min, double scale_range, bool island, bool additive, bool noisy) | 168 | public void HillsBlocks(int number, double scale_min, double scale_range, bool island, bool additive, bool noisy) |
169 | { | 169 | { |
170 | SetDiff(); | 170 | SetDiff(); |
171 | 171 | ||
172 | Random random = new Random(seed); | 172 | Random random = new Random(seed); |
173 | 173 | ||
174 | int x, y; | 174 | int x, y; |
175 | int i; | 175 | int i; |
176 | 176 | ||
177 | for (i = 0; i < number; i++) | 177 | for (i = 0; i < number; i++) |
178 | { | 178 | { |
179 | double rx = Math.Min(255.0, random.NextDouble() * w); | 179 | double rx = Math.Min(255.0, random.NextDouble() * w); |
180 | double ry = Math.Min(255.0, random.NextDouble() * h); | 180 | double ry = Math.Min(255.0, random.NextDouble() * h); |
181 | double rand = random.NextDouble(); | 181 | double rand = random.NextDouble(); |
182 | 182 | ||
183 | if (island) | 183 | if (island) |
184 | { | 184 | { |
185 | // Move everything towards the center | 185 | // Move everything towards the center |
186 | rx -= w / 2; | 186 | rx -= w / 2; |
187 | rx /= 2; | 187 | rx /= 2; |
188 | rx += w / 2; | 188 | rx += w / 2; |
189 | 189 | ||
190 | ry -= h / 2; | 190 | ry -= h / 2; |
191 | ry /= 2; | 191 | ry /= 2; |
192 | ry += h / 2; | 192 | ry += h / 2; |
193 | } | 193 | } |
194 | 194 | ||
195 | for (x = 0; x < w; x++) | 195 | for (x = 0; x < w; x++) |
196 | { | 196 | { |
197 | for (y = 0; y < h; y++) | 197 | for (y = 0; y < h; y++) |
198 | { | 198 | { |
199 | if (noisy) | 199 | if (noisy) |
200 | rand = random.NextDouble(); | 200 | rand = random.NextDouble(); |
201 | 201 | ||
202 | double z = (scale_min + (scale_range * rand)); | 202 | double z = (scale_min + (scale_range * rand)); |
203 | z -= Math.Abs(x-rx) + Math.Abs(y-ry); | 203 | z -= Math.Abs(x-rx) + Math.Abs(y-ry); |
204 | //z -= Math.Sqrt(((x - rx) * (x - rx)) + ((y - ry) * (y - ry))); | 204 | //z -= Math.Sqrt(((x - rx) * (x - rx)) + ((y - ry) * (y - ry))); |
205 | 205 | ||
206 | if (z < 0) | 206 | if (z < 0) |
207 | z = 0; | 207 | z = 0; |
208 | 208 | ||
209 | if (additive) | 209 | if (additive) |
210 | { | 210 | { |
211 | map[x, y] += z; | 211 | map[x, y] += z; |
212 | } | 212 | } |
213 | else | 213 | else |
214 | { | 214 | { |
215 | map[x, y] = Math.Max(map[x, y], z); | 215 | map[x, y] = Math.Max(map[x, y], z); |
216 | } | 216 | } |
217 | } | 217 | } |
218 | } | 218 | } |
219 | } | 219 | } |
220 | 220 | ||
221 | Normalise(); | 221 | Normalise(); |
222 | } | 222 | } |
223 | 223 | ||
224 | public void HillsSquared(int number, double scale_min, double scale_range, bool island, bool additive, bool noisy) | 224 | public void HillsSquared(int number, double scale_min, double scale_range, bool island, bool additive, bool noisy) |
225 | { | 225 | { |
226 | SetDiff(); | 226 | SetDiff(); |
227 | 227 | ||
228 | Random random = new Random(seed); | 228 | Random random = new Random(seed); |
229 | 229 | ||
230 | int x, y; | 230 | int x, y; |
231 | int i; | 231 | int i; |
232 | 232 | ||
233 | for (i = 0; i < number; i++) | 233 | for (i = 0; i < number; i++) |
234 | { | 234 | { |
235 | double rx = Math.Min(255.0, random.NextDouble() * w); | 235 | double rx = Math.Min(255.0, random.NextDouble() * w); |
236 | double ry = Math.Min(255.0, random.NextDouble() * h); | 236 | double ry = Math.Min(255.0, random.NextDouble() * h); |
237 | double rand = random.NextDouble(); | 237 | double rand = random.NextDouble(); |
238 | 238 | ||
239 | if (island) | 239 | if (island) |
240 | { | 240 | { |
241 | // Move everything towards the center | 241 | // Move everything towards the center |
242 | rx -= w / 2; | 242 | rx -= w / 2; |
243 | rx /= 2; | 243 | rx /= 2; |
244 | rx += w / 2; | 244 | rx += w / 2; |
245 | 245 | ||
246 | ry -= h / 2; | 246 | ry -= h / 2; |
247 | ry /= 2; | 247 | ry /= 2; |
248 | ry += h / 2; | 248 | ry += h / 2; |
249 | } | 249 | } |
250 | 250 | ||
251 | for (x = 0; x < w; x++) | 251 | for (x = 0; x < w; x++) |
252 | { | 252 | { |
253 | for (y = 0; y < h; y++) | 253 | for (y = 0; y < h; y++) |
254 | { | 254 | { |
255 | if (noisy) | 255 | if (noisy) |
256 | rand = random.NextDouble(); | 256 | rand = random.NextDouble(); |
257 | 257 | ||
258 | double z = (scale_min + (scale_range * rand)); | 258 | double z = (scale_min + (scale_range * rand)); |
259 | z *= z * z * z; | 259 | z *= z * z * z; |
260 | double dx = Math.Abs(x - rx); | 260 | double dx = Math.Abs(x - rx); |
261 | double dy = Math.Abs(y - ry); | 261 | double dy = Math.Abs(y - ry); |
262 | z -= (dx * dx * dx * dx) + (dy * dy * dy * dy); | 262 | z -= (dx * dx * dx * dx) + (dy * dy * dy * dy); |
263 | 263 | ||
264 | if (z < 0) | 264 | if (z < 0) |
265 | z = 0; | 265 | z = 0; |
266 | 266 | ||
267 | if (additive) | 267 | if (additive) |
268 | { | 268 | { |
269 | map[x, y] += z; | 269 | map[x, y] += z; |
270 | } | 270 | } |
271 | else | 271 | else |
272 | { | 272 | { |
273 | map[x, y] = Math.Max(map[x, y], z); | 273 | map[x, y] = Math.Max(map[x, y], z); |
274 | } | 274 | } |
275 | } | 275 | } |
276 | } | 276 | } |
277 | } | 277 | } |
278 | 278 | ||
279 | Normalise(); | 279 | Normalise(); |
280 | } | 280 | } |
281 | 281 | ||
282 | } | 282 | } |
283 | } | 283 | } |
diff --git a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Generators/Noise.cs b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Generators/Noise.cs index 3cefcfe..d40302c 100644 --- a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Generators/Noise.cs +++ b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Generators/Noise.cs | |||
@@ -1,56 +1,56 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (c) Contributors, http://www.openmetaverse.org/ | 2 | * Copyright (c) Contributors, http://www.openmetaverse.org/ |
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | 3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. |
4 | * | 4 | * |
5 | * Redistribution and use in source and binary forms, with or without | 5 | * Redistribution and use in source and binary forms, with or without |
6 | * modification, are permitted provided that the following conditions are met: | 6 | * modification, are permitted provided that the following conditions are met: |
7 | * * Redistributions of source code must retain the above copyright | 7 | * * Redistributions of source code must retain the above copyright |
8 | * notice, this list of conditions and the following disclaimer. | 8 | * notice, this list of conditions and the following disclaimer. |
9 | * * Redistributions in binary form must reproduce the above copyright | 9 | * * Redistributions in binary form must reproduce the above copyright |
10 | * notice, this list of conditions and the following disclaimer in the | 10 | * notice, this list of conditions and the following disclaimer in the |
11 | * documentation and/or other materials provided with the distribution. | 11 | * documentation and/or other materials provided with the distribution. |
12 | * * Neither the name of the OpenSim Project nor the | 12 | * * Neither the name of the OpenSim Project nor the |
13 | * names of its contributors may be used to endorse or promote products | 13 | * names of its contributors may be used to endorse or promote products |
14 | * derived from this software without specific prior written permission. | 14 | * derived from this software without specific prior written permission. |
15 | * | 15 | * |
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY | 16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY |
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | 17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | 18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | 19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY |
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | 20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | 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 | 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 | 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 | 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. | 25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
26 | * | 26 | * |
27 | */ | 27 | */ |
28 | 28 | ||
29 | using System; | 29 | using System; |
30 | using System.Collections.Generic; | 30 | using System.Collections.Generic; |
31 | using System.Text; | 31 | using System.Text; |
32 | 32 | ||
33 | namespace libTerrain | 33 | namespace libTerrain |
34 | { | 34 | { |
35 | partial class Channel | 35 | partial class Channel |
36 | { | 36 | { |
37 | /// <summary> | 37 | /// <summary> |
38 | /// Fills a channel with 0..1 noise | 38 | /// Fills a channel with 0..1 noise |
39 | /// </summary> | 39 | /// </summary> |
40 | /// <remarks>3-Clause BSD Licensed</remarks> | 40 | /// <remarks>3-Clause BSD Licensed</remarks> |
41 | public void Noise() | 41 | public void Noise() |
42 | { | 42 | { |
43 | SetDiff(); | 43 | SetDiff(); |
44 | 44 | ||
45 | Random rand = new Random(seed); | 45 | Random rand = new Random(seed); |
46 | int x, y; | 46 | int x, y; |
47 | for (x = 0; x < w; x++) | 47 | for (x = 0; x < w; x++) |
48 | { | 48 | { |
49 | for (y = 0; y < h; y++) | 49 | for (y = 0; y < h; y++) |
50 | { | 50 | { |
51 | map[x, y] = rand.NextDouble(); | 51 | map[x, y] = rand.NextDouble(); |
52 | } | 52 | } |
53 | } | 53 | } |
54 | } | 54 | } |
55 | } | 55 | } |
56 | } | 56 | } |
diff --git a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Generators/Spiral.cs b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Generators/Spiral.cs index 80abfe5..59d877a 100644 --- a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Generators/Spiral.cs +++ b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Generators/Spiral.cs | |||
@@ -1,156 +1,156 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (c) Contributors, http://www.openmetaverse.org/ | 2 | * Copyright (c) Contributors, http://www.openmetaverse.org/ |
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | 3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. |
4 | * | 4 | * |
5 | * Redistribution and use in source and binary forms, with or without | 5 | * Redistribution and use in source and binary forms, with or without |
6 | * modification, are permitted provided that the following conditions are met: | 6 | * modification, are permitted provided that the following conditions are met: |
7 | * * Redistributions of source code must retain the above copyright | 7 | * * Redistributions of source code must retain the above copyright |
8 | * notice, this list of conditions and the following disclaimer. | 8 | * notice, this list of conditions and the following disclaimer. |
9 | * * Redistributions in binary form must reproduce the above copyright | 9 | * * Redistributions in binary form must reproduce the above copyright |
10 | * notice, this list of conditions and the following disclaimer in the | 10 | * notice, this list of conditions and the following disclaimer in the |
11 | * documentation and/or other materials provided with the distribution. | 11 | * documentation and/or other materials provided with the distribution. |
12 | * * Neither the name of the OpenSim Project nor the | 12 | * * Neither the name of the OpenSim Project nor the |
13 | * names of its contributors may be used to endorse or promote products | 13 | * names of its contributors may be used to endorse or promote products |
14 | * derived from this software without specific prior written permission. | 14 | * derived from this software without specific prior written permission. |
15 | * | 15 | * |
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY | 16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY |
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | 17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | 18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | 19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY |
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | 20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | 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 | 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 | 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 | 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. | 25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
26 | * | 26 | * |
27 | */ | 27 | */ |
28 | 28 | ||
29 | using System; | 29 | using System; |
30 | using System.Collections.Generic; | 30 | using System.Collections.Generic; |
31 | using System.Text; | 31 | using System.Text; |
32 | 32 | ||
33 | namespace libTerrain | 33 | namespace libTerrain |
34 | { | 34 | { |
35 | partial class Channel | 35 | partial class Channel |
36 | { | 36 | { |
37 | private double[] CoordinatesToPolar(int x, int y) | 37 | private double[] CoordinatesToPolar(int x, int y) |
38 | { | 38 | { |
39 | double theta = Math.Atan2(x - (w / 2), y - (h / 2)); | 39 | double theta = Math.Atan2(x - (w / 2), y - (h / 2)); |
40 | double rx = (double)x - ((double)w / 2); | 40 | double rx = (double)x - ((double)w / 2); |
41 | double ry = (double)y - ((double)h / 2); | 41 | double ry = (double)y - ((double)h / 2); |
42 | double r = Math.Sqrt((rx * rx) + (ry * ry)); | 42 | double r = Math.Sqrt((rx * rx) + (ry * ry)); |
43 | 43 | ||
44 | double[] coords = new double[2]; | 44 | double[] coords = new double[2]; |
45 | coords[0] = r; | 45 | coords[0] = r; |
46 | coords[1] = theta; | 46 | coords[1] = theta; |
47 | return coords; | 47 | return coords; |
48 | } | 48 | } |
49 | 49 | ||
50 | public int[] PolarToCoordinates(double r, double theta) { | 50 | public int[] PolarToCoordinates(double r, double theta) { |
51 | double nx; | 51 | double nx; |
52 | double ny; | 52 | double ny; |
53 | 53 | ||
54 | nx = (double)r * Math.Cos(theta); | 54 | nx = (double)r * Math.Cos(theta); |
55 | ny = (double)r * Math.Sin(theta); | 55 | ny = (double)r * Math.Sin(theta); |
56 | 56 | ||
57 | nx += w / 2; | 57 | nx += w / 2; |
58 | ny += h / 2; | 58 | ny += h / 2; |
59 | 59 | ||
60 | if (nx >= w) | 60 | if (nx >= w) |
61 | nx = w - 1; | 61 | nx = w - 1; |
62 | 62 | ||
63 | if (ny >= h) | 63 | if (ny >= h) |
64 | ny = h - 1; | 64 | ny = h - 1; |
65 | 65 | ||
66 | if (nx < 0) | 66 | if (nx < 0) |
67 | nx = 0; | 67 | nx = 0; |
68 | 68 | ||
69 | if (ny < 0) | 69 | if (ny < 0) |
70 | ny = 0; | 70 | ny = 0; |
71 | 71 | ||
72 | int[] coords = new int[2]; | 72 | int[] coords = new int[2]; |
73 | coords[0] = (int)nx; | 73 | coords[0] = (int)nx; |
74 | coords[1] = (int)ny; | 74 | coords[1] = (int)ny; |
75 | return coords; | 75 | return coords; |
76 | } | 76 | } |
77 | 77 | ||
78 | public void Polar() | 78 | public void Polar() |
79 | { | 79 | { |
80 | SetDiff(); | 80 | SetDiff(); |
81 | 81 | ||
82 | Channel n = this.Copy(); | 82 | Channel n = this.Copy(); |
83 | 83 | ||
84 | int x, y; | 84 | int x, y; |
85 | for (x = 0; x < w; x++) | 85 | for (x = 0; x < w; x++) |
86 | { | 86 | { |
87 | for (y = 0; y < h; y++) | 87 | for (y = 0; y < h; y++) |
88 | { | 88 | { |
89 | double[] coords = CoordinatesToPolar(x,y); | 89 | double[] coords = CoordinatesToPolar(x,y); |
90 | 90 | ||
91 | coords[0] += w / 2.0; | 91 | coords[0] += w / 2.0; |
92 | coords[1] += h / 2.0; | 92 | coords[1] += h / 2.0; |
93 | 93 | ||
94 | map[x, y] = n.map[(int)coords[0] % n.w, (int)coords[1] % n.h]; | 94 | map[x, y] = n.map[(int)coords[0] % n.w, (int)coords[1] % n.h]; |
95 | } | 95 | } |
96 | } | 96 | } |
97 | } | 97 | } |
98 | 98 | ||
99 | public void SpiralPlanter(int steps, double incAngle, double incRadius, double offsetRadius, double offsetAngle) | 99 | public void SpiralPlanter(int steps, double incAngle, double incRadius, double offsetRadius, double offsetAngle) |
100 | { | 100 | { |
101 | SetDiff(); | 101 | SetDiff(); |
102 | 102 | ||
103 | int i; | 103 | int i; |
104 | double r = offsetRadius; | 104 | double r = offsetRadius; |
105 | double theta = offsetAngle; | 105 | double theta = offsetAngle; |
106 | for (i = 0; i < steps; i++) | 106 | for (i = 0; i < steps; i++) |
107 | { | 107 | { |
108 | r += incRadius; | 108 | r += incRadius; |
109 | theta += incAngle; | 109 | theta += incAngle; |
110 | 110 | ||
111 | int[] coords = PolarToCoordinates(r,theta); | 111 | int[] coords = PolarToCoordinates(r,theta); |
112 | Raise(coords[0], coords[1], 20, 1); | 112 | Raise(coords[0], coords[1], 20, 1); |
113 | } | 113 | } |
114 | } | 114 | } |
115 | 115 | ||
116 | public void SpiralCells(int steps, double incAngle, double incRadius, double offsetRadius, double offsetAngle, double[] c) | 116 | public void SpiralCells(int steps, double incAngle, double incRadius, double offsetRadius, double offsetAngle, double[] c) |
117 | { | 117 | { |
118 | SetDiff(); | 118 | SetDiff(); |
119 | 119 | ||
120 | List<Point2D> points = new List<Point2D>(); | 120 | List<Point2D> points = new List<Point2D>(); |
121 | 121 | ||
122 | int i; | 122 | int i; |
123 | double r = offsetRadius; | 123 | double r = offsetRadius; |
124 | double theta = offsetAngle; | 124 | double theta = offsetAngle; |
125 | for (i = 0; i < steps; i++) | 125 | for (i = 0; i < steps; i++) |
126 | { | 126 | { |
127 | r += incRadius; | 127 | r += incRadius; |
128 | theta += incAngle; | 128 | theta += incAngle; |
129 | 129 | ||
130 | int[] coords = PolarToCoordinates(r, theta); | 130 | int[] coords = PolarToCoordinates(r, theta); |
131 | points.Add(new Point2D(coords[0],coords[1])); | 131 | points.Add(new Point2D(coords[0],coords[1])); |
132 | } | 132 | } |
133 | 133 | ||
134 | VoronoiDiagram(points, c); | 134 | VoronoiDiagram(points, c); |
135 | } | 135 | } |
136 | 136 | ||
137 | public void Spiral(double wid, double hig, double offset) | 137 | public void Spiral(double wid, double hig, double offset) |
138 | { | 138 | { |
139 | SetDiff(); | 139 | SetDiff(); |
140 | 140 | ||
141 | int x, y, z; | 141 | int x, y, z; |
142 | z = 0; | 142 | z = 0; |
143 | for (x = 0; x < w; x++) | 143 | for (x = 0; x < w; x++) |
144 | { | 144 | { |
145 | for (y = 0; y < h; y++) | 145 | for (y = 0; y < h; y++) |
146 | { | 146 | { |
147 | z++; | 147 | z++; |
148 | double dx = Math.Abs((w / 2) - x); | 148 | double dx = Math.Abs((w / 2) - x); |
149 | double dy = Math.Abs((h / 2) - y); | 149 | double dy = Math.Abs((h / 2) - y); |
150 | map[x, y] += Math.Sin(dx / wid) + Math.Cos(dy / hig); | 150 | map[x, y] += Math.Sin(dx / wid) + Math.Cos(dy / hig); |
151 | } | 151 | } |
152 | } | 152 | } |
153 | Normalise(); | 153 | Normalise(); |
154 | } | 154 | } |
155 | } | 155 | } |
156 | } \ No newline at end of file | 156 | } \ No newline at end of file |
diff --git a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Generators/Voronoi.cs b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Generators/Voronoi.cs index eb8f7ba..3411ccf 100644 --- a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Generators/Voronoi.cs +++ b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Generators/Voronoi.cs | |||
@@ -1,214 +1,214 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (c) Contributors, http://www.openmetaverse.org/ | 2 | * Copyright (c) Contributors, http://www.openmetaverse.org/ |
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | 3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. |
4 | * | 4 | * |
5 | * Redistribution and use in source and binary forms, with or without | 5 | * Redistribution and use in source and binary forms, with or without |
6 | * modification, are permitted provided that the following conditions are met: | 6 | * modification, are permitted provided that the following conditions are met: |
7 | * * Redistributions of source code must retain the above copyright | 7 | * * Redistributions of source code must retain the above copyright |
8 | * notice, this list of conditions and the following disclaimer. | 8 | * notice, this list of conditions and the following disclaimer. |
9 | * * Redistributions in binary form must reproduce the above copyright | 9 | * * Redistributions in binary form must reproduce the above copyright |
10 | * notice, this list of conditions and the following disclaimer in the | 10 | * notice, this list of conditions and the following disclaimer in the |
11 | * documentation and/or other materials provided with the distribution. | 11 | * documentation and/or other materials provided with the distribution. |
12 | * * Neither the name of the OpenSim Project nor the | 12 | * * Neither the name of the OpenSim Project nor the |
13 | * names of its contributors may be used to endorse or promote products | 13 | * names of its contributors may be used to endorse or promote products |
14 | * derived from this software without specific prior written permission. | 14 | * derived from this software without specific prior written permission. |
15 | * | 15 | * |
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY | 16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY |
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | 17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | 18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | 19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY |
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | 20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | 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 | 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 | 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 | 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. | 25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
26 | * | 26 | * |
27 | */ | 27 | */ |
28 | 28 | ||
29 | using System; | 29 | using System; |
30 | using System.Collections.Generic; | 30 | using System.Collections.Generic; |
31 | using System.Text; | 31 | using System.Text; |
32 | 32 | ||
33 | namespace libTerrain | 33 | namespace libTerrain |
34 | { | 34 | { |
35 | partial class Channel | 35 | partial class Channel |
36 | { | 36 | { |
37 | /// <summary> | 37 | /// <summary> |
38 | /// Generates a Voronoi diagram (sort of a stained glass effect) which will fill the entire channel | 38 | /// Generates a Voronoi diagram (sort of a stained glass effect) which will fill the entire channel |
39 | /// </summary> | 39 | /// </summary> |
40 | /// <remarks>3-Clause BSD Licensed</remarks> | 40 | /// <remarks>3-Clause BSD Licensed</remarks> |
41 | /// <param name="pointsPerBlock">The number of generator points in each block</param> | 41 | /// <param name="pointsPerBlock">The number of generator points in each block</param> |
42 | /// <param name="blockSize">A multiple of the channel width and height which will have voronoi points generated in it. | 42 | /// <param name="blockSize">A multiple of the channel width and height which will have voronoi points generated in it. |
43 | /// <para>This is to ensure a more even distribution of the points than pure random allocation.</para></param> | 43 | /// <para>This is to ensure a more even distribution of the points than pure random allocation.</para></param> |
44 | /// <param name="c">The Voronoi diagram type. Usually an array with values consisting of [-1,1]. Experiment with the chain, you can have as many values as you like.</param> | 44 | /// <param name="c">The Voronoi diagram type. Usually an array with values consisting of [-1,1]. Experiment with the chain, you can have as many values as you like.</param> |
45 | public void VoronoiDiagram(int pointsPerBlock, int blockSize, double[] c) | 45 | public void VoronoiDiagram(int pointsPerBlock, int blockSize, double[] c) |
46 | { | 46 | { |
47 | SetDiff(); | 47 | SetDiff(); |
48 | 48 | ||
49 | List<Point2D> points = new List<Point2D>(); | 49 | List<Point2D> points = new List<Point2D>(); |
50 | Random generator = new Random(seed); | 50 | Random generator = new Random(seed); |
51 | 51 | ||
52 | // Generate the emitter points | 52 | // Generate the emitter points |
53 | int x, y, i; | 53 | int x, y, i; |
54 | for (x = -blockSize; x < w + blockSize; x += blockSize) | 54 | for (x = -blockSize; x < w + blockSize; x += blockSize) |
55 | { | 55 | { |
56 | for (y = -blockSize; y < h + blockSize; y += blockSize) | 56 | for (y = -blockSize; y < h + blockSize; y += blockSize) |
57 | { | 57 | { |
58 | for (i = 0; i < pointsPerBlock; i++) | 58 | for (i = 0; i < pointsPerBlock; i++) |
59 | { | 59 | { |
60 | double pX = x + (generator.NextDouble() * (double)blockSize); | 60 | double pX = x + (generator.NextDouble() * (double)blockSize); |
61 | double pY = y + (generator.NextDouble() * (double)blockSize); | 61 | double pY = y + (generator.NextDouble() * (double)blockSize); |
62 | 62 | ||
63 | points.Add(new Point2D(pX, pY)); | 63 | points.Add(new Point2D(pX, pY)); |
64 | } | 64 | } |
65 | } | 65 | } |
66 | } | 66 | } |
67 | 67 | ||
68 | double[] distances = new double[points.Count]; | 68 | double[] distances = new double[points.Count]; |
69 | 69 | ||
70 | // Calculate the distance each pixel is from an emitter | 70 | // Calculate the distance each pixel is from an emitter |
71 | for (x = 0; x < w; x++) | 71 | for (x = 0; x < w; x++) |
72 | { | 72 | { |
73 | for (y = 0; y < h; y++) | 73 | for (y = 0; y < h; y++) |
74 | { | 74 | { |
75 | for (i = 0; i < points.Count; i++) | 75 | for (i = 0; i < points.Count; i++) |
76 | { | 76 | { |
77 | double dx, dy; | 77 | double dx, dy; |
78 | dx = Math.Abs((double)x - points[i].x); | 78 | dx = Math.Abs((double)x - points[i].x); |
79 | dy = Math.Abs((double)y - points[i].y); | 79 | dy = Math.Abs((double)y - points[i].y); |
80 | 80 | ||
81 | distances[i] = (dx * dx + dy * dy); | 81 | distances[i] = (dx * dx + dy * dy); |
82 | } | 82 | } |
83 | 83 | ||
84 | Array.Sort(distances); | 84 | Array.Sort(distances); |
85 | 85 | ||
86 | double f = 0.0; | 86 | double f = 0.0; |
87 | 87 | ||
88 | // Multiply the distances with their 'c' counterpart | 88 | // Multiply the distances with their 'c' counterpart |
89 | // ordering the distances descending | 89 | // ordering the distances descending |
90 | for (i = 0; i < c.Length; i++) | 90 | for (i = 0; i < c.Length; i++) |
91 | { | 91 | { |
92 | if (i >= points.Count) | 92 | if (i >= points.Count) |
93 | break; | 93 | break; |
94 | 94 | ||
95 | f += c[i] * distances[i]; | 95 | f += c[i] * distances[i]; |
96 | } | 96 | } |
97 | 97 | ||
98 | map[x, y] = f; | 98 | map[x, y] = f; |
99 | } | 99 | } |
100 | } | 100 | } |
101 | 101 | ||
102 | // Normalise the result | 102 | // Normalise the result |
103 | Normalise(); | 103 | Normalise(); |
104 | } | 104 | } |
105 | 105 | ||
106 | public void VoronoiDiagram(List<Point2D> points, double[] c) | 106 | public void VoronoiDiagram(List<Point2D> points, double[] c) |
107 | { | 107 | { |
108 | SetDiff(); | 108 | SetDiff(); |
109 | 109 | ||
110 | Random generator = new Random(seed); | 110 | Random generator = new Random(seed); |
111 | int x, y, i; | 111 | int x, y, i; |
112 | double[] distances = new double[points.Count]; | 112 | double[] distances = new double[points.Count]; |
113 | 113 | ||
114 | // Calculate the distance each pixel is from an emitter | 114 | // Calculate the distance each pixel is from an emitter |
115 | for (x = 0; x < w; x++) | 115 | for (x = 0; x < w; x++) |
116 | { | 116 | { |
117 | for (y = 0; y < h; y++) | 117 | for (y = 0; y < h; y++) |
118 | { | 118 | { |
119 | for (i = 0; i < points.Count; i++) | 119 | for (i = 0; i < points.Count; i++) |
120 | { | 120 | { |
121 | double dx, dy; | 121 | double dx, dy; |
122 | dx = Math.Abs((double)x - points[i].x); | 122 | dx = Math.Abs((double)x - points[i].x); |
123 | dy = Math.Abs((double)y - points[i].y); | 123 | dy = Math.Abs((double)y - points[i].y); |
124 | 124 | ||
125 | distances[i] = (dx * dx + dy * dy); | 125 | distances[i] = (dx * dx + dy * dy); |
126 | } | 126 | } |
127 | 127 | ||
128 | Array.Sort(distances); | 128 | Array.Sort(distances); |
129 | 129 | ||
130 | double f = 0.0; | 130 | double f = 0.0; |
131 | 131 | ||
132 | // Multiply the distances with their 'c' counterpart | 132 | // Multiply the distances with their 'c' counterpart |
133 | // ordering the distances descending | 133 | // ordering the distances descending |
134 | for (i = 0; i < c.Length; i++) | 134 | for (i = 0; i < c.Length; i++) |
135 | { | 135 | { |
136 | if (i >= points.Count) | 136 | if (i >= points.Count) |
137 | break; | 137 | break; |
138 | 138 | ||
139 | f += c[i] * distances[i]; | 139 | f += c[i] * distances[i]; |
140 | } | 140 | } |
141 | 141 | ||
142 | map[x, y] = f; | 142 | map[x, y] = f; |
143 | } | 143 | } |
144 | } | 144 | } |
145 | 145 | ||
146 | // Normalise the result | 146 | // Normalise the result |
147 | Normalise(); | 147 | Normalise(); |
148 | } | 148 | } |
149 | 149 | ||
150 | public void VoroflatDiagram(int pointsPerBlock, int blockSize) | 150 | public void VoroflatDiagram(int pointsPerBlock, int blockSize) |
151 | { | 151 | { |
152 | SetDiff(); | 152 | SetDiff(); |
153 | 153 | ||
154 | List<Point2D> points = new List<Point2D>(); | 154 | List<Point2D> points = new List<Point2D>(); |
155 | Random generator = new Random(seed); | 155 | Random generator = new Random(seed); |
156 | 156 | ||
157 | // Generate the emitter points | 157 | // Generate the emitter points |
158 | int x, y, i; | 158 | int x, y, i; |
159 | for (x = -blockSize; x < w + blockSize; x += blockSize) | 159 | for (x = -blockSize; x < w + blockSize; x += blockSize) |
160 | { | 160 | { |
161 | for (y = -blockSize; y < h + blockSize; y += blockSize) | 161 | for (y = -blockSize; y < h + blockSize; y += blockSize) |
162 | { | 162 | { |
163 | for (i = 0; i < pointsPerBlock; i++) | 163 | for (i = 0; i < pointsPerBlock; i++) |
164 | { | 164 | { |
165 | double pX = x + (generator.NextDouble() * (double)blockSize); | 165 | double pX = x + (generator.NextDouble() * (double)blockSize); |
166 | double pY = y + (generator.NextDouble() * (double)blockSize); | 166 | double pY = y + (generator.NextDouble() * (double)blockSize); |
167 | 167 | ||
168 | points.Add(new Point2D(pX, pY)); | 168 | points.Add(new Point2D(pX, pY)); |
169 | } | 169 | } |
170 | } | 170 | } |
171 | } | 171 | } |
172 | 172 | ||
173 | double[] distances = new double[points.Count]; | 173 | double[] distances = new double[points.Count]; |
174 | 174 | ||
175 | // Calculate the distance each pixel is from an emitter | 175 | // Calculate the distance each pixel is from an emitter |
176 | for (x = 0; x < w; x++) | 176 | for (x = 0; x < w; x++) |
177 | { | 177 | { |
178 | for (y = 0; y < h; y++) | 178 | for (y = 0; y < h; y++) |
179 | { | 179 | { |
180 | for (i = 0; i < points.Count; i++) | 180 | for (i = 0; i < points.Count; i++) |
181 | { | 181 | { |
182 | double dx, dy; | 182 | double dx, dy; |
183 | dx = Math.Abs((double)x - points[i].x); | 183 | dx = Math.Abs((double)x - points[i].x); |
184 | dy = Math.Abs((double)y - points[i].y); | 184 | dy = Math.Abs((double)y - points[i].y); |
185 | 185 | ||
186 | distances[i] = (dx * dx + dy * dy); | 186 | distances[i] = (dx * dx + dy * dy); |
187 | } | 187 | } |
188 | 188 | ||
189 | //Array.Sort(distances); | 189 | //Array.Sort(distances); |
190 | 190 | ||
191 | double f = 0.0; | 191 | double f = 0.0; |
192 | 192 | ||
193 | double min = double.MaxValue; | 193 | double min = double.MaxValue; |
194 | for (int j = 0; j < distances.Length;j++ ) | 194 | for (int j = 0; j < distances.Length;j++ ) |
195 | { | 195 | { |
196 | if (distances[j] < min) | 196 | if (distances[j] < min) |
197 | { | 197 | { |
198 | min = distances[j]; | 198 | min = distances[j]; |
199 | f = j; | 199 | f = j; |
200 | } | 200 | } |
201 | } | 201 | } |
202 | 202 | ||
203 | // Multiply the distances with their 'c' counterpart | 203 | // Multiply the distances with their 'c' counterpart |
204 | // ordering the distances descending | 204 | // ordering the distances descending |
205 | 205 | ||
206 | map[x, y] = f; | 206 | map[x, y] = f; |
207 | } | 207 | } |
208 | } | 208 | } |
209 | 209 | ||
210 | // Normalise the result | 210 | // Normalise the result |
211 | Normalise(); | 211 | Normalise(); |
212 | } | 212 | } |
213 | } | 213 | } |
214 | } | 214 | } |
diff --git a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Generators/Worms.cs b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Generators/Worms.cs index ce36daf..ba2fad6 100644 --- a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Generators/Worms.cs +++ b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Generators/Worms.cs | |||
@@ -1,74 +1,74 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (c) Contributors, http://www.openmetaverse.org/ | 2 | * Copyright (c) Contributors, http://www.openmetaverse.org/ |
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | 3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. |
4 | * | 4 | * |
5 | * Redistribution and use in source and binary forms, with or without | 5 | * Redistribution and use in source and binary forms, with or without |
6 | * modification, are permitted provided that the following conditions are met: | 6 | * modification, are permitted provided that the following conditions are met: |
7 | * * Redistributions of source code must retain the above copyright | 7 | * * Redistributions of source code must retain the above copyright |
8 | * notice, this list of conditions and the following disclaimer. | 8 | * notice, this list of conditions and the following disclaimer. |
9 | * * Redistributions in binary form must reproduce the above copyright | 9 | * * Redistributions in binary form must reproduce the above copyright |
10 | * notice, this list of conditions and the following disclaimer in the | 10 | * notice, this list of conditions and the following disclaimer in the |
11 | * documentation and/or other materials provided with the distribution. | 11 | * documentation and/or other materials provided with the distribution. |
12 | * * Neither the name of the OpenSim Project nor the | 12 | * * Neither the name of the OpenSim Project nor the |
13 | * names of its contributors may be used to endorse or promote products | 13 | * names of its contributors may be used to endorse or promote products |
14 | * derived from this software without specific prior written permission. | 14 | * derived from this software without specific prior written permission. |
15 | * | 15 | * |
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY | 16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY |
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | 17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | 18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | 19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY |
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | 20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | 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 | 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 | 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 | 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. | 25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
26 | * | 26 | * |
27 | */ | 27 | */ |
28 | 28 | ||
29 | using System; | 29 | using System; |
30 | using System.Collections.Generic; | 30 | using System.Collections.Generic; |
31 | using System.Text; | 31 | using System.Text; |
32 | 32 | ||
33 | namespace libTerrain | 33 | namespace libTerrain |
34 | { | 34 | { |
35 | partial class Channel | 35 | partial class Channel |
36 | { | 36 | { |
37 | /// <summary> | 37 | /// <summary> |
38 | /// Generates 'number' of worms which navigate randomly around the landscape creating terrain as they go. | 38 | /// Generates 'number' of worms which navigate randomly around the landscape creating terrain as they go. |
39 | /// </summary> | 39 | /// </summary> |
40 | /// <param name="number">The number of worms which will traverse the map</param> | 40 | /// <param name="number">The number of worms which will traverse the map</param> |
41 | /// <param name="rounds">The number of steps each worm will traverse</param> | 41 | /// <param name="rounds">The number of steps each worm will traverse</param> |
42 | /// <param name="movement">The maximum distance each worm will move each step</param> | 42 | /// <param name="movement">The maximum distance each worm will move each step</param> |
43 | /// <param name="size">The size of the area around the worm modified</param> | 43 | /// <param name="size">The size of the area around the worm modified</param> |
44 | /// <param name="centerspawn">Do worms start in the middle, or randomly?</param> | 44 | /// <param name="centerspawn">Do worms start in the middle, or randomly?</param> |
45 | public void Worms(int number, int rounds, double movement, double size, bool centerspawn) | 45 | public void Worms(int number, int rounds, double movement, double size, bool centerspawn) |
46 | { | 46 | { |
47 | SetDiff(); | 47 | SetDiff(); |
48 | 48 | ||
49 | Random random = new Random(seed); | 49 | Random random = new Random(seed); |
50 | int i, j; | 50 | int i, j; |
51 | 51 | ||
52 | for (i = 0; i < number; i++) | 52 | for (i = 0; i < number; i++) |
53 | { | 53 | { |
54 | double rx, ry; | 54 | double rx, ry; |
55 | if (centerspawn) | 55 | if (centerspawn) |
56 | { | 56 | { |
57 | rx = w / 2.0; | 57 | rx = w / 2.0; |
58 | ry = h / 2.0; | 58 | ry = h / 2.0; |
59 | } | 59 | } |
60 | else | 60 | else |
61 | { | 61 | { |
62 | rx = random.NextDouble() * (w - 1); | 62 | rx = random.NextDouble() * (w - 1); |
63 | ry = random.NextDouble() * (h - 1); | 63 | ry = random.NextDouble() * (h - 1); |
64 | } | 64 | } |
65 | for (j = 0; j < rounds; j++) | 65 | for (j = 0; j < rounds; j++) |
66 | { | 66 | { |
67 | rx += (random.NextDouble() * movement) - (movement / 2.0); | 67 | rx += (random.NextDouble() * movement) - (movement / 2.0); |
68 | ry += (random.NextDouble() * movement) - (movement / 2.0); | 68 | ry += (random.NextDouble() * movement) - (movement / 2.0); |
69 | Raise(rx, ry, size, 1.0); | 69 | Raise(rx, ry, size, 1.0); |
70 | } | 70 | } |
71 | } | 71 | } |
72 | } | 72 | } |
73 | } | 73 | } |
74 | } \ No newline at end of file | 74 | } \ No newline at end of file |
diff --git a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Grid.cs b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Grid.cs index e6b18f4..18e40b5 100644 --- a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Grid.cs +++ b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Grid.cs | |||
@@ -1,350 +1,350 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (c) Contributors, http://www.openmetaverse.org/ | 2 | * Copyright (c) Contributors, http://www.openmetaverse.org/ |
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | 3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. |
4 | * | 4 | * |
5 | * Redistribution and use in source and binary forms, with or without | 5 | * Redistribution and use in source and binary forms, with or without |
6 | * modification, are permitted provided that the following conditions are met: | 6 | * modification, are permitted provided that the following conditions are met: |
7 | * * Redistributions of source code must retain the above copyright | 7 | * * Redistributions of source code must retain the above copyright |
8 | * notice, this list of conditions and the following disclaimer. | 8 | * notice, this list of conditions and the following disclaimer. |
9 | * * Redistributions in binary form must reproduce the above copyright | 9 | * * Redistributions in binary form must reproduce the above copyright |
10 | * notice, this list of conditions and the following disclaimer in the | 10 | * notice, this list of conditions and the following disclaimer in the |
11 | * documentation and/or other materials provided with the distribution. | 11 | * documentation and/or other materials provided with the distribution. |
12 | * * Neither the name of the OpenSim Project nor the | 12 | * * Neither the name of the OpenSim Project nor the |
13 | * names of its contributors may be used to endorse or promote products | 13 | * names of its contributors may be used to endorse or promote products |
14 | * derived from this software without specific prior written permission. | 14 | * derived from this software without specific prior written permission. |
15 | * | 15 | * |
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY | 16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY |
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | 17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | 18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | 19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY |
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | 20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | 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 | 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 | 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 | 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. | 25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
26 | * | 26 | * |
27 | */ | 27 | */ |
28 | 28 | ||
29 | using System; | 29 | using System; |
30 | using System.Collections.Generic; | 30 | using System.Collections.Generic; |
31 | using System.Text; | 31 | using System.Text; |
32 | 32 | ||
33 | namespace libTerrain | 33 | namespace libTerrain |
34 | { | 34 | { |
35 | partial class Channel | 35 | partial class Channel |
36 | { | 36 | { |
37 | public Channel Normalise() | 37 | public Channel Normalise() |
38 | { | 38 | { |
39 | SetDiff(); | 39 | SetDiff(); |
40 | 40 | ||
41 | double max = FindMax(); | 41 | double max = FindMax(); |
42 | double min = FindMin(); | 42 | double min = FindMin(); |
43 | 43 | ||
44 | int x, y; | 44 | int x, y; |
45 | 45 | ||
46 | if (max != min) | 46 | if (max != min) |
47 | { | 47 | { |
48 | for (x = 0; x < w; x++) | 48 | for (x = 0; x < w; x++) |
49 | { | 49 | { |
50 | for (y = 0; y < h; y++) | 50 | for (y = 0; y < h; y++) |
51 | { | 51 | { |
52 | map[x, y] = (map[x, y] - min) * (1.0 / (max - min)); | 52 | map[x, y] = (map[x, y] - min) * (1.0 / (max - min)); |
53 | } | 53 | } |
54 | } | 54 | } |
55 | } | 55 | } |
56 | else | 56 | else |
57 | { | 57 | { |
58 | this.Fill(0.5); | 58 | this.Fill(0.5); |
59 | } | 59 | } |
60 | 60 | ||
61 | return this; | 61 | return this; |
62 | } | 62 | } |
63 | 63 | ||
64 | public Channel Normalise(double minv, double maxv) | 64 | public Channel Normalise(double minv, double maxv) |
65 | { | 65 | { |
66 | SetDiff(); | 66 | SetDiff(); |
67 | 67 | ||
68 | double max = FindMax(); | 68 | double max = FindMax(); |
69 | double min = FindMin(); | 69 | double min = FindMin(); |
70 | 70 | ||
71 | int x, y; | 71 | int x, y; |
72 | 72 | ||
73 | for (x = 0; x < w; x++) | 73 | for (x = 0; x < w; x++) |
74 | { | 74 | { |
75 | for (y = 0; y < h; y++) | 75 | for (y = 0; y < h; y++) |
76 | { | 76 | { |
77 | double val = (map[x, y] - min) * (1.0 / max - min); | 77 | double val = (map[x, y] - min) * (1.0 / max - min); |
78 | val *= maxv - minv; | 78 | val *= maxv - minv; |
79 | val += minv; | 79 | val += minv; |
80 | 80 | ||
81 | map[x, y] = val; | 81 | map[x, y] = val; |
82 | } | 82 | } |
83 | } | 83 | } |
84 | 84 | ||
85 | return this; | 85 | return this; |
86 | } | 86 | } |
87 | 87 | ||
88 | public Channel Clip() | 88 | public Channel Clip() |
89 | { | 89 | { |
90 | int x, y; | 90 | int x, y; |
91 | 91 | ||
92 | for (x = 0; x < w; x++) | 92 | for (x = 0; x < w; x++) |
93 | { | 93 | { |
94 | for (y = 0; y < h; y++) | 94 | for (y = 0; y < h; y++) |
95 | { | 95 | { |
96 | SetClip(x, y, map[x, y]); | 96 | SetClip(x, y, map[x, y]); |
97 | } | 97 | } |
98 | } | 98 | } |
99 | 99 | ||
100 | return this; | 100 | return this; |
101 | } | 101 | } |
102 | 102 | ||
103 | public Channel Clip(double min, double max) | 103 | public Channel Clip(double min, double max) |
104 | { | 104 | { |
105 | int x, y; | 105 | int x, y; |
106 | for (x = 0; x < w; x++) | 106 | for (x = 0; x < w; x++) |
107 | { | 107 | { |
108 | for (y = 0; y < h; y++) | 108 | for (y = 0; y < h; y++) |
109 | { | 109 | { |
110 | double val = map[x, y]; | 110 | double val = map[x, y]; |
111 | if (val > max) val = max; | 111 | if (val > max) val = max; |
112 | if (val < min) val = min; | 112 | if (val < min) val = min; |
113 | 113 | ||
114 | Set(x, y, val); | 114 | Set(x, y, val); |
115 | } | 115 | } |
116 | } | 116 | } |
117 | return this; | 117 | return this; |
118 | } | 118 | } |
119 | 119 | ||
120 | public Channel Crop(int x1, int y1, int x2, int y2) | 120 | public Channel Crop(int x1, int y1, int x2, int y2) |
121 | { | 121 | { |
122 | int width = x1 - x2 + 1; | 122 | int width = x1 - x2 + 1; |
123 | int height = y1 - y2 + 1; | 123 | int height = y1 - y2 + 1; |
124 | Channel chan = new Channel(width, height); | 124 | Channel chan = new Channel(width, height); |
125 | 125 | ||
126 | int x, y; | 126 | int x, y; |
127 | int nx, ny; | 127 | int nx, ny; |
128 | 128 | ||
129 | nx = 0; | 129 | nx = 0; |
130 | for (x = x1; x < x2; x++) | 130 | for (x = x1; x < x2; x++) |
131 | { | 131 | { |
132 | ny = 0; | 132 | ny = 0; |
133 | for (y = y1; y < y2; y++) | 133 | for (y = y1; y < y2; y++) |
134 | { | 134 | { |
135 | chan.map[nx, ny] = map[x, y]; | 135 | chan.map[nx, ny] = map[x, y]; |
136 | 136 | ||
137 | ny++; | 137 | ny++; |
138 | } | 138 | } |
139 | nx++; | 139 | nx++; |
140 | } | 140 | } |
141 | 141 | ||
142 | return this; | 142 | return this; |
143 | } | 143 | } |
144 | 144 | ||
145 | public Channel AddClip(Channel other) | 145 | public Channel AddClip(Channel other) |
146 | { | 146 | { |
147 | SetDiff(); | 147 | SetDiff(); |
148 | 148 | ||
149 | int x, y; | 149 | int x, y; |
150 | for (x = 0; x < w; x++) | 150 | for (x = 0; x < w; x++) |
151 | { | 151 | { |
152 | for (y = 0; y < h; y++) | 152 | for (y = 0; y < h; y++) |
153 | { | 153 | { |
154 | map[x, y] = other.map[x, y]; | 154 | map[x, y] = other.map[x, y]; |
155 | if (map[x, y] > 1) | 155 | if (map[x, y] > 1) |
156 | map[x, y] = 1; | 156 | map[x, y] = 1; |
157 | if (map[x, y] < 0) | 157 | if (map[x, y] < 0) |
158 | map[x, y] = 0; | 158 | map[x, y] = 0; |
159 | } | 159 | } |
160 | } | 160 | } |
161 | return this; | 161 | return this; |
162 | } | 162 | } |
163 | 163 | ||
164 | public void Smooth(double amount) | 164 | public void Smooth(double amount) |
165 | { | 165 | { |
166 | SetDiff(); | 166 | SetDiff(); |
167 | 167 | ||
168 | double area = amount; | 168 | double area = amount; |
169 | double step = amount / 4.0; | 169 | double step = amount / 4.0; |
170 | 170 | ||
171 | double[,] manipulate = new double[w, h]; | 171 | double[,] manipulate = new double[w, h]; |
172 | int x, y; | 172 | int x, y; |
173 | double n, l; | 173 | double n, l; |
174 | for (x = 0; x < w; x++) | 174 | for (x = 0; x < w; x++) |
175 | { | 175 | { |
176 | for (y = 0; y < h; y++) | 176 | for (y = 0; y < h; y++) |
177 | { | 177 | { |
178 | double average = 0.0; | 178 | double average = 0.0; |
179 | int avgsteps = 0; | 179 | int avgsteps = 0; |
180 | 180 | ||
181 | for (n = 0.0 - area; n < area; n += step) | 181 | for (n = 0.0 - area; n < area; n += step) |
182 | { | 182 | { |
183 | for (l = 0.0 - area; l < area; l += step) | 183 | for (l = 0.0 - area; l < area; l += step) |
184 | { | 184 | { |
185 | avgsteps++; | 185 | avgsteps++; |
186 | average += GetBilinearInterpolate(x + n, y + l); | 186 | average += GetBilinearInterpolate(x + n, y + l); |
187 | } | 187 | } |
188 | } | 188 | } |
189 | 189 | ||
190 | manipulate[x, y] = average / avgsteps; | 190 | manipulate[x, y] = average / avgsteps; |
191 | } | 191 | } |
192 | } | 192 | } |
193 | map = manipulate; | 193 | map = manipulate; |
194 | } | 194 | } |
195 | 195 | ||
196 | public void Pertubation(double amount) | 196 | public void Pertubation(double amount) |
197 | { | 197 | { |
198 | SetDiff(); | 198 | SetDiff(); |
199 | 199 | ||
200 | // Simple pertubation filter | 200 | // Simple pertubation filter |
201 | double[,] manipulated = new double[w, h]; | 201 | double[,] manipulated = new double[w, h]; |
202 | Random generator = new Random(seed); // Seeds FTW! | 202 | Random generator = new Random(seed); // Seeds FTW! |
203 | //double amount = 8.0; | 203 | //double amount = 8.0; |
204 | 204 | ||
205 | int x, y; | 205 | int x, y; |
206 | for (x = 0; x < w; x++) | 206 | for (x = 0; x < w; x++) |
207 | { | 207 | { |
208 | for (y = 0; y < h; y++) | 208 | for (y = 0; y < h; y++) |
209 | { | 209 | { |
210 | double offset_x = (double)x + (generator.NextDouble() * amount) - (amount / 2.0); | 210 | double offset_x = (double)x + (generator.NextDouble() * amount) - (amount / 2.0); |
211 | double offset_y = (double)y + (generator.NextDouble() * amount) - (amount / 2.0); | 211 | double offset_y = (double)y + (generator.NextDouble() * amount) - (amount / 2.0); |
212 | double p = GetBilinearInterpolate(offset_x, offset_y); | 212 | double p = GetBilinearInterpolate(offset_x, offset_y); |
213 | manipulated[x, y] = p; | 213 | manipulated[x, y] = p; |
214 | } | 214 | } |
215 | } | 215 | } |
216 | map = manipulated; | 216 | map = manipulated; |
217 | } | 217 | } |
218 | 218 | ||
219 | public void PertubationMask(Channel mask) | 219 | public void PertubationMask(Channel mask) |
220 | { | 220 | { |
221 | // Simple pertubation filter | 221 | // Simple pertubation filter |
222 | double[,] manipulated = new double[w, h]; | 222 | double[,] manipulated = new double[w, h]; |
223 | Random generator = new Random(seed); // Seeds FTW! | 223 | Random generator = new Random(seed); // Seeds FTW! |
224 | //double amount = 8.0; | 224 | //double amount = 8.0; |
225 | 225 | ||
226 | double amount; | 226 | double amount; |
227 | 227 | ||
228 | int x, y; | 228 | int x, y; |
229 | for (x = 0; x < w; x++) | 229 | for (x = 0; x < w; x++) |
230 | { | 230 | { |
231 | for (y = 0; y < h; y++) | 231 | for (y = 0; y < h; y++) |
232 | { | 232 | { |
233 | amount = mask.map[x, y]; | 233 | amount = mask.map[x, y]; |
234 | double offset_x = (double)x + (generator.NextDouble() * amount) - (amount / 2.0); | 234 | double offset_x = (double)x + (generator.NextDouble() * amount) - (amount / 2.0); |
235 | double offset_y = (double)y + (generator.NextDouble() * amount) - (amount / 2.0); | 235 | double offset_y = (double)y + (generator.NextDouble() * amount) - (amount / 2.0); |
236 | 236 | ||
237 | if (offset_x > w) | 237 | if (offset_x > w) |
238 | offset_x = w - 1; | 238 | offset_x = w - 1; |
239 | if (offset_y > h) | 239 | if (offset_y > h) |
240 | offset_y = h - 1; | 240 | offset_y = h - 1; |
241 | if (offset_y < 0) | 241 | if (offset_y < 0) |
242 | offset_y = 0; | 242 | offset_y = 0; |
243 | if (offset_x < 0) | 243 | if (offset_x < 0) |
244 | offset_x = 0; | 244 | offset_x = 0; |
245 | 245 | ||
246 | double p = GetBilinearInterpolate(offset_x, offset_y); | 246 | double p = GetBilinearInterpolate(offset_x, offset_y); |
247 | manipulated[x, y] = p; | 247 | manipulated[x, y] = p; |
248 | SetDiff(x, y); | 248 | SetDiff(x, y); |
249 | } | 249 | } |
250 | } | 250 | } |
251 | map = manipulated; | 251 | map = manipulated; |
252 | } | 252 | } |
253 | 253 | ||
254 | public void Distort(Channel mask, double str) | 254 | public void Distort(Channel mask, double str) |
255 | { | 255 | { |
256 | // Simple pertubation filter | 256 | // Simple pertubation filter |
257 | double[,] manipulated = new double[w, h]; | 257 | double[,] manipulated = new double[w, h]; |
258 | 258 | ||
259 | double amount; | 259 | double amount; |
260 | 260 | ||
261 | int x, y; | 261 | int x, y; |
262 | for (x = 0; x < w; x++) | 262 | for (x = 0; x < w; x++) |
263 | { | 263 | { |
264 | for (y = 0; y < h; y++) | 264 | for (y = 0; y < h; y++) |
265 | { | 265 | { |
266 | amount = mask.map[x, y]; | 266 | amount = mask.map[x, y]; |
267 | double offset_x = (double)x + (amount * str) - (0.5 * str); | 267 | double offset_x = (double)x + (amount * str) - (0.5 * str); |
268 | double offset_y = (double)y + (amount * str) - (0.5 * str); | 268 | double offset_y = (double)y + (amount * str) - (0.5 * str); |
269 | 269 | ||
270 | if (offset_x > w) | 270 | if (offset_x > w) |
271 | offset_x = w - 1; | 271 | offset_x = w - 1; |
272 | if (offset_y > h) | 272 | if (offset_y > h) |
273 | offset_y = h - 1; | 273 | offset_y = h - 1; |
274 | if (offset_y < 0) | 274 | if (offset_y < 0) |
275 | offset_y = 0; | 275 | offset_y = 0; |
276 | if (offset_x < 0) | 276 | if (offset_x < 0) |
277 | offset_x = 0; | 277 | offset_x = 0; |
278 | 278 | ||
279 | double p = GetBilinearInterpolate(offset_x, offset_y); | 279 | double p = GetBilinearInterpolate(offset_x, offset_y); |
280 | manipulated[x, y] = p; | 280 | manipulated[x, y] = p; |
281 | SetDiff(x, y); | 281 | SetDiff(x, y); |
282 | } | 282 | } |
283 | } | 283 | } |
284 | map = manipulated; | 284 | map = manipulated; |
285 | 285 | ||
286 | } | 286 | } |
287 | 287 | ||
288 | public void Distort(Channel mask, Channel mask2, double str) | 288 | public void Distort(Channel mask, Channel mask2, double str) |
289 | { | 289 | { |
290 | // Simple pertubation filter | 290 | // Simple pertubation filter |
291 | double[,] manipulated = new double[w, h]; | 291 | double[,] manipulated = new double[w, h]; |
292 | 292 | ||
293 | double amountX; | 293 | double amountX; |
294 | double amountY; | 294 | double amountY; |
295 | 295 | ||
296 | int x, y; | 296 | int x, y; |
297 | for (x = 0; x < w; x++) | 297 | for (x = 0; x < w; x++) |
298 | { | 298 | { |
299 | for (y = 0; y < h; y++) | 299 | for (y = 0; y < h; y++) |
300 | { | 300 | { |
301 | amountX = mask.map[x, y]; | 301 | amountX = mask.map[x, y]; |
302 | amountY = mask2.map[x, y]; | 302 | amountY = mask2.map[x, y]; |
303 | double offset_x = (double)x + (amountX * str) - (0.5 * str); | 303 | double offset_x = (double)x + (amountX * str) - (0.5 * str); |
304 | double offset_y = (double)y + (amountY * str) - (0.5 * str); | 304 | double offset_y = (double)y + (amountY * str) - (0.5 * str); |
305 | 305 | ||
306 | if (offset_x > w) | 306 | if (offset_x > w) |
307 | offset_x = w - 1; | 307 | offset_x = w - 1; |
308 | if (offset_y > h) | 308 | if (offset_y > h) |
309 | offset_y = h - 1; | 309 | offset_y = h - 1; |
310 | if (offset_y < 0) | 310 | if (offset_y < 0) |
311 | offset_y = 0; | 311 | offset_y = 0; |
312 | if (offset_x < 0) | 312 | if (offset_x < 0) |
313 | offset_x = 0; | 313 | offset_x = 0; |
314 | 314 | ||
315 | double p = GetBilinearInterpolate(offset_x, offset_y); | 315 | double p = GetBilinearInterpolate(offset_x, offset_y); |
316 | manipulated[x, y] = p; | 316 | manipulated[x, y] = p; |
317 | SetDiff(x, y); | 317 | SetDiff(x, y); |
318 | } | 318 | } |
319 | } | 319 | } |
320 | map = manipulated; | 320 | map = manipulated; |
321 | 321 | ||
322 | } | 322 | } |
323 | 323 | ||
324 | public Channel Blend(Channel other, double amount) | 324 | public Channel Blend(Channel other, double amount) |
325 | { | 325 | { |
326 | int x, y; | 326 | int x, y; |
327 | for (x = 0; x < w; x++) | 327 | for (x = 0; x < w; x++) |
328 | { | 328 | { |
329 | for (y = 0; y < h; y++) | 329 | for (y = 0; y < h; y++) |
330 | { | 330 | { |
331 | Set(x, y, Tools.linearInterpolate(map[x, y], other.map[x, y], amount)); | 331 | Set(x, y, Tools.linearInterpolate(map[x, y], other.map[x, y], amount)); |
332 | } | 332 | } |
333 | } | 333 | } |
334 | return this; | 334 | return this; |
335 | } | 335 | } |
336 | 336 | ||
337 | public Channel Blend(Channel other, Channel amount) | 337 | public Channel Blend(Channel other, Channel amount) |
338 | { | 338 | { |
339 | int x, y; | 339 | int x, y; |
340 | for (x = 0; x < w; x++) | 340 | for (x = 0; x < w; x++) |
341 | { | 341 | { |
342 | for (y = 0; y < h; y++) | 342 | for (y = 0; y < h; y++) |
343 | { | 343 | { |
344 | Set(x, y, Tools.linearInterpolate(map[x, y], other.map[x, y], amount.map[x, y])); | 344 | Set(x, y, Tools.linearInterpolate(map[x, y], other.map[x, y], amount.map[x, y])); |
345 | } | 345 | } |
346 | } | 346 | } |
347 | return this; | 347 | return this; |
348 | } | 348 | } |
349 | } | 349 | } |
350 | } | 350 | } |
diff --git a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Manipulators/AerobicErosion.cs b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Manipulators/AerobicErosion.cs index 589d360..5d2b4d4 100644 --- a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Manipulators/AerobicErosion.cs +++ b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Manipulators/AerobicErosion.cs | |||
@@ -1,213 +1,213 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (c) Contributors, http://www.openmetaverse.org/ | 2 | * Copyright (c) Contributors, http://www.openmetaverse.org/ |
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | 3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. |
4 | * | 4 | * |
5 | * Redistribution and use in source and binary forms, with or without | 5 | * Redistribution and use in source and binary forms, with or without |
6 | * modification, are permitted provided that the following conditions are met: | 6 | * modification, are permitted provided that the following conditions are met: |
7 | * * Redistributions of source code must retain the above copyright | 7 | * * Redistributions of source code must retain the above copyright |
8 | * notice, this list of conditions and the following disclaimer. | 8 | * notice, this list of conditions and the following disclaimer. |
9 | * * Redistributions in binary form must reproduce the above copyright | 9 | * * Redistributions in binary form must reproduce the above copyright |
10 | * notice, this list of conditions and the following disclaimer in the | 10 | * notice, this list of conditions and the following disclaimer in the |
11 | * documentation and/or other materials provided with the distribution. | 11 | * documentation and/or other materials provided with the distribution. |
12 | * * Neither the name of the OpenSim Project nor the | 12 | * * Neither the name of the OpenSim Project nor the |
13 | * names of its contributors may be used to endorse or promote products | 13 | * names of its contributors may be used to endorse or promote products |
14 | * derived from this software without specific prior written permission. | 14 | * derived from this software without specific prior written permission. |
15 | * | 15 | * |
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY | 16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY |
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | 17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | 18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | 19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY |
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | 20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | 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 | 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 | 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 | 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. | 25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
26 | * | 26 | * |
27 | */ | 27 | */ |
28 | 28 | ||
29 | using System; | 29 | using System; |
30 | using System.Collections.Generic; | 30 | using System.Collections.Generic; |
31 | using System.Text; | 31 | using System.Text; |
32 | 32 | ||
33 | namespace libTerrain | 33 | namespace libTerrain |
34 | { | 34 | { |
35 | partial class Channel | 35 | partial class Channel |
36 | { | 36 | { |
37 | // Ideas for Aerobic erosion | 37 | // Ideas for Aerobic erosion |
38 | // | 38 | // |
39 | // Unlike thermal (gravity) and hydraulic (water suspension) | 39 | // Unlike thermal (gravity) and hydraulic (water suspension) |
40 | // aerobic erosion should displace mass by moving sediment | 40 | // aerobic erosion should displace mass by moving sediment |
41 | // in "hops". The length of the hop being dictated by the | 41 | // in "hops". The length of the hop being dictated by the |
42 | // presence of sharp cliffs and wind speed. | 42 | // presence of sharp cliffs and wind speed. |
43 | 43 | ||
44 | // The ability to pickup sediment is defined by the total | 44 | // The ability to pickup sediment is defined by the total |
45 | // surface area, such that: | 45 | // surface area, such that: |
46 | // 0 0 0 | 46 | // 0 0 0 |
47 | // 0 1 0 | 47 | // 0 1 0 |
48 | // 0 0 0 | 48 | // 0 0 0 |
49 | // Would be the best possible value for sediment to be | 49 | // Would be the best possible value for sediment to be |
50 | // picked up (total difference = 8) and flatter land | 50 | // picked up (total difference = 8) and flatter land |
51 | // will erode less quickly. | 51 | // will erode less quickly. |
52 | 52 | ||
53 | // Suspended particles assist the erosion process by hitting | 53 | // Suspended particles assist the erosion process by hitting |
54 | // the surface and chiselling additional particles off faster | 54 | // the surface and chiselling additional particles off faster |
55 | // than alone. | 55 | // than alone. |
56 | 56 | ||
57 | // Particles are deposited when one of two conditions is met | 57 | // Particles are deposited when one of two conditions is met |
58 | // First: | 58 | // First: |
59 | // When particles hit a wall - such that the | 59 | // When particles hit a wall - such that the |
60 | // wind direction points at a difference >= the | 60 | // wind direction points at a difference >= the |
61 | // deposition mininum talus. | 61 | // deposition mininum talus. |
62 | // Second: | 62 | // Second: |
63 | // When wind speed is lowered to below the minimum | 63 | // When wind speed is lowered to below the minimum |
64 | // required for transit. An idea for this is to | 64 | // required for transit. An idea for this is to |
65 | // use the navier-stokes algorithms for simulating | 65 | // use the navier-stokes algorithms for simulating |
66 | // pressure across the terrain. | 66 | // pressure across the terrain. |
67 | 67 | ||
68 | /// <summary> | 68 | /// <summary> |
69 | /// An experimental erosion algorithm developed by Adam. Moves sediment by factoring the surface area of each height point. | 69 | /// An experimental erosion algorithm developed by Adam. Moves sediment by factoring the surface area of each height point. |
70 | /// </summary> | 70 | /// </summary> |
71 | /// <param name="windspeed">0..1 The speed of the wind</param> | 71 | /// <param name="windspeed">0..1 The speed of the wind</param> |
72 | /// <param name="pickup_talus_minimum">The minimum angle at which rock is eroded 0..1 (recommended: <= 0.30)</param> | 72 | /// <param name="pickup_talus_minimum">The minimum angle at which rock is eroded 0..1 (recommended: <= 0.30)</param> |
73 | /// <param name="drop_talus_minimum">The minimum angle at which rock is dropped 0..1 (recommended: >= 0.00)</param> | 73 | /// <param name="drop_talus_minimum">The minimum angle at which rock is dropped 0..1 (recommended: >= 0.00)</param> |
74 | /// <param name="carry">The percentage of rock which can be picked up to pickup 0..1</param> | 74 | /// <param name="carry">The percentage of rock which can be picked up to pickup 0..1</param> |
75 | /// <param name="rounds">The number of erosion rounds (recommended: 25+)</param> | 75 | /// <param name="rounds">The number of erosion rounds (recommended: 25+)</param> |
76 | /// <param name="lowest">Drop sediment at the lowest point?</param> | 76 | /// <param name="lowest">Drop sediment at the lowest point?</param> |
77 | public void AerobicErosion(double windspeed, double pickupTalusMinimum, double dropTalusMinimum, double carry, int rounds, bool lowest, bool usingFluidDynamics) | 77 | public void AerobicErosion(double windspeed, double pickupTalusMinimum, double dropTalusMinimum, double carry, int rounds, bool lowest, bool usingFluidDynamics) |
78 | { | 78 | { |
79 | bool debugImages = false; | 79 | bool debugImages = false; |
80 | 80 | ||
81 | Channel wind = new Channel(w, h) ; | 81 | Channel wind = new Channel(w, h) ; |
82 | Channel sediment = new Channel(w, h); | 82 | Channel sediment = new Channel(w, h); |
83 | int x, y, i, j; | 83 | int x, y, i, j; |
84 | 84 | ||
85 | this.Normalise(); | 85 | this.Normalise(); |
86 | 86 | ||
87 | wind = this.Copy(); | 87 | wind = this.Copy(); |
88 | wind.Noise(); | 88 | wind.Noise(); |
89 | 89 | ||
90 | if (debugImages) | 90 | if (debugImages) |
91 | wind.SaveImage("testimg/wind_start.png"); | 91 | wind.SaveImage("testimg/wind_start.png"); |
92 | 92 | ||
93 | if (usingFluidDynamics) | 93 | if (usingFluidDynamics) |
94 | { | 94 | { |
95 | wind.navierStokes(20, 0.1, 0.0, 0.0); | 95 | wind.navierStokes(20, 0.1, 0.0, 0.0); |
96 | } | 96 | } |
97 | else | 97 | else |
98 | { | 98 | { |
99 | wind.Pertubation(30); | 99 | wind.Pertubation(30); |
100 | } | 100 | } |
101 | 101 | ||
102 | if (debugImages) | 102 | if (debugImages) |
103 | wind.SaveImage("testimg/wind_begin.png"); | 103 | wind.SaveImage("testimg/wind_begin.png"); |
104 | 104 | ||
105 | for (i = 0; i < rounds; i++) | 105 | for (i = 0; i < rounds; i++) |
106 | { | 106 | { |
107 | // Convert some rocks to sand | 107 | // Convert some rocks to sand |
108 | for (x = 1; x < w - 1; x++) | 108 | for (x = 1; x < w - 1; x++) |
109 | { | 109 | { |
110 | for (y = 1; y < h - 1; y++) | 110 | for (y = 1; y < h - 1; y++) |
111 | { | 111 | { |
112 | double me = Get(x, y); | 112 | double me = Get(x, y); |
113 | double surfacearea = 0.3; // Everything will erode even if it's flat. Just slower. | 113 | double surfacearea = 0.3; // Everything will erode even if it's flat. Just slower. |
114 | 114 | ||
115 | for (j = 0; j < 9; j++) | 115 | for (j = 0; j < 9; j++) |
116 | { | 116 | { |
117 | int[] coords = Neighbours(NeighbourSystem.Moore, j); | 117 | int[] coords = Neighbours(NeighbourSystem.Moore, j); |
118 | double target = Get(x + coords[0], y + coords[1]); | 118 | double target = Get(x + coords[0], y + coords[1]); |
119 | 119 | ||
120 | surfacearea += Math.Abs(target - me); | 120 | surfacearea += Math.Abs(target - me); |
121 | } | 121 | } |
122 | 122 | ||
123 | double amount = surfacearea * wind.map[x, y] * carry; | 123 | double amount = surfacearea * wind.map[x, y] * carry; |
124 | 124 | ||
125 | if (amount < 0) | 125 | if (amount < 0) |
126 | amount = 0; | 126 | amount = 0; |
127 | 127 | ||
128 | if (surfacearea > pickupTalusMinimum) | 128 | if (surfacearea > pickupTalusMinimum) |
129 | { | 129 | { |
130 | Set(x, y, map[x, y] - amount); | 130 | Set(x, y, map[x, y] - amount); |
131 | sediment.map[x, y] += amount; | 131 | sediment.map[x, y] += amount; |
132 | } | 132 | } |
133 | } | 133 | } |
134 | } | 134 | } |
135 | 135 | ||
136 | if (usingFluidDynamics) | 136 | if (usingFluidDynamics) |
137 | { | 137 | { |
138 | sediment.navierStokes(7, 0.1, 0.0, 0.1); | 138 | sediment.navierStokes(7, 0.1, 0.0, 0.1); |
139 | 139 | ||
140 | Channel noiseChan = new Channel(w, h); | 140 | Channel noiseChan = new Channel(w, h); |
141 | noiseChan.Noise(); | 141 | noiseChan.Noise(); |
142 | wind.Blend(noiseChan, 0.01); | 142 | wind.Blend(noiseChan, 0.01); |
143 | 143 | ||
144 | wind.navierStokes(10, 0.1, 0.01, 0.01); | 144 | wind.navierStokes(10, 0.1, 0.01, 0.01); |
145 | 145 | ||
146 | sediment.Distort(wind, windspeed); | 146 | sediment.Distort(wind, windspeed); |
147 | } | 147 | } |
148 | else | 148 | else |
149 | { | 149 | { |
150 | wind.Pertubation(15); // Can do better later | 150 | wind.Pertubation(15); // Can do better later |
151 | wind.seed++; | 151 | wind.seed++; |
152 | sediment.Pertubation(10); // Sediment is blown around a bit | 152 | sediment.Pertubation(10); // Sediment is blown around a bit |
153 | sediment.seed++; | 153 | sediment.seed++; |
154 | } | 154 | } |
155 | 155 | ||
156 | if (debugImages) | 156 | if (debugImages) |
157 | wind.SaveImage("testimg/wind_" + i.ToString() + ".png"); | 157 | wind.SaveImage("testimg/wind_" + i.ToString() + ".png"); |
158 | 158 | ||
159 | // Convert some sand to rock | 159 | // Convert some sand to rock |
160 | for (x = 1; x < w - 1; x++) | 160 | for (x = 1; x < w - 1; x++) |
161 | { | 161 | { |
162 | for (y = 1; y < h - 1; y++) | 162 | for (y = 1; y < h - 1; y++) |
163 | { | 163 | { |
164 | double me = Get(x, y); | 164 | double me = Get(x, y); |
165 | double surfacearea = 0.01; // Flat land does not get deposition | 165 | double surfacearea = 0.01; // Flat land does not get deposition |
166 | double min = double.MaxValue; | 166 | double min = double.MaxValue; |
167 | int[] minside = new int[2]; | 167 | int[] minside = new int[2]; |
168 | 168 | ||
169 | for (j = 0; j < 9; j++) | 169 | for (j = 0; j < 9; j++) |
170 | { | 170 | { |
171 | int[] coords = Neighbours(NeighbourSystem.Moore, j); | 171 | int[] coords = Neighbours(NeighbourSystem.Moore, j); |
172 | double target = Get(x + coords[0], y + coords[1]); | 172 | double target = Get(x + coords[0], y + coords[1]); |
173 | 173 | ||
174 | surfacearea += Math.Abs(target - me); | 174 | surfacearea += Math.Abs(target - me); |
175 | 175 | ||
176 | if (target < min && lowest) | 176 | if (target < min && lowest) |
177 | { | 177 | { |
178 | minside = (int[])coords.Clone(); | 178 | minside = (int[])coords.Clone(); |
179 | min = target; | 179 | min = target; |
180 | } | 180 | } |
181 | } | 181 | } |
182 | 182 | ||
183 | double amount = surfacearea * (1.0 - wind.map[x, y]) * carry; | 183 | double amount = surfacearea * (1.0 - wind.map[x, y]) * carry; |
184 | 184 | ||
185 | if (amount < 0) | 185 | if (amount < 0) |
186 | amount = 0; | 186 | amount = 0; |
187 | 187 | ||
188 | if (surfacearea > dropTalusMinimum) | 188 | if (surfacearea > dropTalusMinimum) |
189 | { | 189 | { |
190 | Set(x + minside[0], y + minside[1], map[x + minside[0], y + minside[1]] + amount); | 190 | Set(x + minside[0], y + minside[1], map[x + minside[0], y + minside[1]] + amount); |
191 | sediment.map[x, y] -= amount; | 191 | sediment.map[x, y] -= amount; |
192 | } | 192 | } |
193 | } | 193 | } |
194 | } | 194 | } |
195 | 195 | ||
196 | if (debugImages) | 196 | if (debugImages) |
197 | sediment.SaveImage("testimg/sediment_" + i.ToString() + ".png"); | 197 | sediment.SaveImage("testimg/sediment_" + i.ToString() + ".png"); |
198 | 198 | ||
199 | wind.Normalise(); | 199 | wind.Normalise(); |
200 | wind *= windspeed; | 200 | wind *= windspeed; |
201 | 201 | ||
202 | this.Normalise(); | 202 | this.Normalise(); |
203 | } | 203 | } |
204 | 204 | ||
205 | Channel myself = this; | 205 | Channel myself = this; |
206 | myself += sediment; | 206 | myself += sediment; |
207 | myself.Normalise(); | 207 | myself.Normalise(); |
208 | 208 | ||
209 | if (debugImages) | 209 | if (debugImages) |
210 | this.SaveImage("testimg/output.png"); | 210 | this.SaveImage("testimg/output.png"); |
211 | } | 211 | } |
212 | } | 212 | } |
213 | } \ No newline at end of file | 213 | } \ No newline at end of file |
diff --git a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Manipulators/HydraulicErosion.cs b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Manipulators/HydraulicErosion.cs index 36da77c..fb9e21e 100644 --- a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Manipulators/HydraulicErosion.cs +++ b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Manipulators/HydraulicErosion.cs | |||
@@ -1,146 +1,146 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (c) Contributors, http://www.openmetaverse.org/ | 2 | * Copyright (c) Contributors, http://www.openmetaverse.org/ |
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | 3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. |
4 | * | 4 | * |
5 | * Redistribution and use in source and binary forms, with or without | 5 | * Redistribution and use in source and binary forms, with or without |
6 | * modification, are permitted provided that the following conditions are met: | 6 | * modification, are permitted provided that the following conditions are met: |
7 | * * Redistributions of source code must retain the above copyright | 7 | * * Redistributions of source code must retain the above copyright |
8 | * notice, this list of conditions and the following disclaimer. | 8 | * notice, this list of conditions and the following disclaimer. |
9 | * * Redistributions in binary form must reproduce the above copyright | 9 | * * Redistributions in binary form must reproduce the above copyright |
10 | * notice, this list of conditions and the following disclaimer in the | 10 | * notice, this list of conditions and the following disclaimer in the |
11 | * documentation and/or other materials provided with the distribution. | 11 | * documentation and/or other materials provided with the distribution. |
12 | * * Neither the name of the OpenSim Project nor the | 12 | * * Neither the name of the OpenSim Project nor the |
13 | * names of its contributors may be used to endorse or promote products | 13 | * names of its contributors may be used to endorse or promote products |
14 | * derived from this software without specific prior written permission. | 14 | * derived from this software without specific prior written permission. |
15 | * | 15 | * |
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY | 16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY |
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | 17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | 18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | 19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY |
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | 20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | 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 | 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 | 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 | 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. | 25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
26 | * | 26 | * |
27 | */ | 27 | */ |
28 | 28 | ||
29 | using System; | 29 | using System; |
30 | using System.Collections.Generic; | 30 | using System.Collections.Generic; |
31 | using System.Text; | 31 | using System.Text; |
32 | 32 | ||
33 | namespace libTerrain | 33 | namespace libTerrain |
34 | { | 34 | { |
35 | partial class Channel | 35 | partial class Channel |
36 | { | 36 | { |
37 | public void HydraulicErosion(Channel rain, double evaporation, double solubility, int frequency, int rounds) | 37 | public void HydraulicErosion(Channel rain, double evaporation, double solubility, int frequency, int rounds) |
38 | { | 38 | { |
39 | SetDiff(); | 39 | SetDiff(); |
40 | 40 | ||
41 | Channel water = new Channel(w, h); | 41 | Channel water = new Channel(w, h); |
42 | Channel sediment = new Channel(w, h); | 42 | Channel sediment = new Channel(w, h); |
43 | Channel terrain = this; | 43 | Channel terrain = this; |
44 | Channel waterFlow = new Channel(w, h); | 44 | Channel waterFlow = new Channel(w, h); |
45 | 45 | ||
46 | NeighbourSystem type = NeighbourSystem.Moore; | 46 | NeighbourSystem type = NeighbourSystem.Moore; |
47 | int NEIGHBOUR_ME = 4; | 47 | int NEIGHBOUR_ME = 4; |
48 | 48 | ||
49 | int NEIGHBOUR_MAX = type == NeighbourSystem.Moore ? 9 : 5; | 49 | int NEIGHBOUR_MAX = type == NeighbourSystem.Moore ? 9 : 5; |
50 | 50 | ||
51 | for (int i = 0; i < rounds; i++) | 51 | for (int i = 0; i < rounds; i++) |
52 | { | 52 | { |
53 | water += rain; | 53 | water += rain; |
54 | 54 | ||
55 | sediment = terrain * water; | 55 | sediment = terrain * water; |
56 | terrain -= sediment; | 56 | terrain -= sediment; |
57 | 57 | ||
58 | for (int x = 1; x < w - 1; x++) | 58 | for (int x = 1; x < w - 1; x++) |
59 | { | 59 | { |
60 | for (int y = 1; y < h - 1; y++) | 60 | for (int y = 1; y < h - 1; y++) |
61 | { | 61 | { |
62 | double[] heights = new double[NEIGHBOUR_MAX]; | 62 | double[] heights = new double[NEIGHBOUR_MAX]; |
63 | double[] diffs = new double[NEIGHBOUR_MAX]; | 63 | double[] diffs = new double[NEIGHBOUR_MAX]; |
64 | 64 | ||
65 | double heightCenter = map[x, y]; | 65 | double heightCenter = map[x, y]; |
66 | 66 | ||
67 | for (int j = 0; j < NEIGHBOUR_MAX; j++) | 67 | for (int j = 0; j < NEIGHBOUR_MAX; j++) |
68 | { | 68 | { |
69 | if (j != NEIGHBOUR_ME) | 69 | if (j != NEIGHBOUR_ME) |
70 | { | 70 | { |
71 | int[] coords = Neighbours(type, j); | 71 | int[] coords = Neighbours(type, j); |
72 | coords[0] += x; | 72 | coords[0] += x; |
73 | coords[1] += y; | 73 | coords[1] += y; |
74 | 74 | ||
75 | heights[j] = map[coords[0], coords[1]] + water.map[coords[0], coords[1]] + sediment.map[coords[0], coords[1]]; | 75 | heights[j] = map[coords[0], coords[1]] + water.map[coords[0], coords[1]] + sediment.map[coords[0], coords[1]]; |
76 | diffs[j] = heightCenter - heights[j]; | 76 | diffs[j] = heightCenter - heights[j]; |
77 | } | 77 | } |
78 | } | 78 | } |
79 | 79 | ||
80 | double totalHeight = 0; | 80 | double totalHeight = 0; |
81 | double totalHeightDiff = 0; | 81 | double totalHeightDiff = 0; |
82 | int totalCellsCounted = 1; | 82 | int totalCellsCounted = 1; |
83 | 83 | ||
84 | for (int j = 0; j < NEIGHBOUR_MAX; j++) | 84 | for (int j = 0; j < NEIGHBOUR_MAX; j++) |
85 | { | 85 | { |
86 | if (j != NEIGHBOUR_ME) | 86 | if (j != NEIGHBOUR_ME) |
87 | { | 87 | { |
88 | if (diffs[j] > 0) | 88 | if (diffs[j] > 0) |
89 | { | 89 | { |
90 | totalHeight += heights[j]; | 90 | totalHeight += heights[j]; |
91 | totalHeightDiff += diffs[j]; | 91 | totalHeightDiff += diffs[j]; |
92 | totalCellsCounted++; | 92 | totalCellsCounted++; |
93 | } | 93 | } |
94 | } | 94 | } |
95 | } | 95 | } |
96 | 96 | ||
97 | if (totalCellsCounted == 1) | 97 | if (totalCellsCounted == 1) |
98 | continue; | 98 | continue; |
99 | 99 | ||
100 | double averageHeight = totalHeight / totalCellsCounted; | 100 | double averageHeight = totalHeight / totalCellsCounted; |
101 | double waterAmount = Math.Min(water.map[x, y], heightCenter - averageHeight); | 101 | double waterAmount = Math.Min(water.map[x, y], heightCenter - averageHeight); |
102 | 102 | ||
103 | // TODO: Check this. | 103 | // TODO: Check this. |
104 | waterFlow.map[x, y] += waterFlow.map[x, y] - waterAmount; | 104 | waterFlow.map[x, y] += waterFlow.map[x, y] - waterAmount; |
105 | 105 | ||
106 | double totalInverseDiff = waterAmount / totalHeightDiff; | 106 | double totalInverseDiff = waterAmount / totalHeightDiff; |
107 | 107 | ||
108 | for (int j = 0; j < NEIGHBOUR_MAX; j++) | 108 | for (int j = 0; j < NEIGHBOUR_MAX; j++) |
109 | { | 109 | { |
110 | if (j != NEIGHBOUR_ME) | 110 | if (j != NEIGHBOUR_ME) |
111 | { | 111 | { |
112 | int[] coords = Neighbours(type, j); | 112 | int[] coords = Neighbours(type, j); |
113 | coords[0] += x; | 113 | coords[0] += x; |
114 | coords[1] += y; | 114 | coords[1] += y; |
115 | 115 | ||
116 | if (diffs[j] > 0) | 116 | if (diffs[j] > 0) |
117 | { | 117 | { |
118 | waterFlow.SetWrap(coords[0], coords[1], waterFlow.map[coords[0], coords[1]] + diffs[j] * totalInverseDiff); | 118 | waterFlow.SetWrap(coords[0], coords[1], waterFlow.map[coords[0], coords[1]] + diffs[j] * totalInverseDiff); |
119 | } | 119 | } |
120 | } | 120 | } |
121 | } | 121 | } |
122 | } | 122 | } |
123 | } | 123 | } |
124 | 124 | ||
125 | water += waterFlow; | 125 | water += waterFlow; |
126 | waterFlow.Fill(0); | 126 | waterFlow.Fill(0); |
127 | 127 | ||
128 | water *= evaporation; | 128 | water *= evaporation; |
129 | 129 | ||
130 | for (int x = 0; x < w; x++) | 130 | for (int x = 0; x < w; x++) |
131 | { | 131 | { |
132 | for (int y = 0; y < h; y++) | 132 | for (int y = 0; y < h; y++) |
133 | { | 133 | { |
134 | double deposition = sediment.map[x, y] - water.map[x, y] * solubility; | 134 | double deposition = sediment.map[x, y] - water.map[x, y] * solubility; |
135 | if (deposition > 0) | 135 | if (deposition > 0) |
136 | { | 136 | { |
137 | sediment.map[x, y] -= deposition; | 137 | sediment.map[x, y] -= deposition; |
138 | terrain.map[x, y] += deposition; | 138 | terrain.map[x, y] += deposition; |
139 | } | 139 | } |
140 | } | 140 | } |
141 | } | 141 | } |
142 | 142 | ||
143 | } | 143 | } |
144 | } | 144 | } |
145 | } | 145 | } |
146 | } \ No newline at end of file | 146 | } \ No newline at end of file |
diff --git a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Manipulators/NavierStokes.cs b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Manipulators/NavierStokes.cs index 8a111ed..1cd213b 100644 --- a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Manipulators/NavierStokes.cs +++ b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Manipulators/NavierStokes.cs | |||
@@ -1,307 +1,307 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (c) Contributors, http://www.openmetaverse.org/ | 2 | * Copyright (c) Contributors, http://www.openmetaverse.org/ |
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | 3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. |
4 | * | 4 | * |
5 | * Redistribution and use in source and binary forms, with or without | 5 | * Redistribution and use in source and binary forms, with or without |
6 | * modification, are permitted provided that the following conditions are met: | 6 | * modification, are permitted provided that the following conditions are met: |
7 | * * Redistributions of source code must retain the above copyright | 7 | * * Redistributions of source code must retain the above copyright |
8 | * notice, this list of conditions and the following disclaimer. | 8 | * notice, this list of conditions and the following disclaimer. |
9 | * * Redistributions in binary form must reproduce the above copyright | 9 | * * Redistributions in binary form must reproduce the above copyright |
10 | * notice, this list of conditions and the following disclaimer in the | 10 | * notice, this list of conditions and the following disclaimer in the |
11 | * documentation and/or other materials provided with the distribution. | 11 | * documentation and/or other materials provided with the distribution. |
12 | * * Neither the name of the OpenSim Project nor the | 12 | * * Neither the name of the OpenSim Project nor the |
13 | * names of its contributors may be used to endorse or promote products | 13 | * names of its contributors may be used to endorse or promote products |
14 | * derived from this software without specific prior written permission. | 14 | * derived from this software without specific prior written permission. |
15 | * | 15 | * |
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY | 16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY |
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | 17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | 18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | 19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY |
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | 20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | 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 | 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 | 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 | 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. | 25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
26 | * | 26 | * |
27 | */ | 27 | */ |
28 | 28 | ||
29 | using System; | 29 | using System; |
30 | using System.Collections.Generic; | 30 | using System.Collections.Generic; |
31 | using System.Text; | 31 | using System.Text; |
32 | 32 | ||
33 | namespace libTerrain | 33 | namespace libTerrain |
34 | { | 34 | { |
35 | partial class Channel | 35 | partial class Channel |
36 | { | 36 | { |
37 | // Navier Stokes Algorithms ported from | 37 | // Navier Stokes Algorithms ported from |
38 | // "Real-Time Fluid Dynamics for Games" by Jos Stam. | 38 | // "Real-Time Fluid Dynamics for Games" by Jos Stam. |
39 | // presented at GDC 2003. | 39 | // presented at GDC 2003. |
40 | 40 | ||
41 | // Poorly ported from C++. (I gave up making it properly native somewhere after nsSetBnd) | 41 | // Poorly ported from C++. (I gave up making it properly native somewhere after nsSetBnd) |
42 | 42 | ||
43 | private static int nsIX(int i, int j, int N) | 43 | private static int nsIX(int i, int j, int N) |
44 | { | 44 | { |
45 | return ((i) + (N + 2) * (j)); | 45 | return ((i) + (N + 2) * (j)); |
46 | } | 46 | } |
47 | 47 | ||
48 | private static void nsSwap(ref double x0, ref double x) | 48 | private static void nsSwap(ref double x0, ref double x) |
49 | { | 49 | { |
50 | double tmp = x0; | 50 | double tmp = x0; |
51 | x0 = x; | 51 | x0 = x; |
52 | x = tmp; | 52 | x = tmp; |
53 | } | 53 | } |
54 | 54 | ||
55 | private static void nsSwap(ref double[] x0, ref double[] x) | 55 | private static void nsSwap(ref double[] x0, ref double[] x) |
56 | { | 56 | { |
57 | double[] tmp = x0; | 57 | double[] tmp = x0; |
58 | x0 = x; | 58 | x0 = x; |
59 | x = tmp; | 59 | x = tmp; |
60 | } | 60 | } |
61 | 61 | ||
62 | private void nsAddSource(int N, ref double[] x, ref double[] s, double dt) | 62 | private void nsAddSource(int N, ref double[] x, ref double[] s, double dt) |
63 | { | 63 | { |
64 | int i; | 64 | int i; |
65 | int size = (N + 2) * (N + 2); | 65 | int size = (N + 2) * (N + 2); |
66 | for (i = 0; i < size; i++) | 66 | for (i = 0; i < size; i++) |
67 | { | 67 | { |
68 | x[i] += dt * s[i]; | 68 | x[i] += dt * s[i]; |
69 | } | 69 | } |
70 | } | 70 | } |
71 | 71 | ||
72 | private void nsSetBnd(int N, int b, ref double[] x) | 72 | private void nsSetBnd(int N, int b, ref double[] x) |
73 | { | 73 | { |
74 | int i; | 74 | int i; |
75 | for (i = 0; i <= N; i++) | 75 | for (i = 0; i <= N; i++) |
76 | { | 76 | { |
77 | x[nsIX(0, i, N)] = b == 1 ? -x[nsIX(1, i, N)] : x[nsIX(1, i, N)]; | 77 | x[nsIX(0, i, N)] = b == 1 ? -x[nsIX(1, i, N)] : x[nsIX(1, i, N)]; |
78 | x[nsIX(0, N + 1, N)] = b == 1 ? -x[nsIX(N, i, N)] : x[nsIX(N, i, N)]; | 78 | x[nsIX(0, N + 1, N)] = b == 1 ? -x[nsIX(N, i, N)] : x[nsIX(N, i, N)]; |
79 | x[nsIX(i, 0, N)] = b == 2 ? -x[nsIX(i, 1, N)] : x[nsIX(i, 1, N)]; | 79 | x[nsIX(i, 0, N)] = b == 2 ? -x[nsIX(i, 1, N)] : x[nsIX(i, 1, N)]; |
80 | x[nsIX(i, N + 1, N)] = b == 2 ? -x[nsIX(i, N, N)] : x[nsIX(i, N, N)]; | 80 | x[nsIX(i, N + 1, N)] = b == 2 ? -x[nsIX(i, N, N)] : x[nsIX(i, N, N)]; |
81 | } | 81 | } |
82 | x[nsIX(0, 0, N)] = 0.5f * (x[nsIX(1, 0, N)] + x[nsIX(0, 1, N)]); | 82 | x[nsIX(0, 0, N)] = 0.5f * (x[nsIX(1, 0, N)] + x[nsIX(0, 1, N)]); |
83 | x[nsIX(0, N + 1, N)] = 0.5f * (x[nsIX(1, N + 1, N)] + x[nsIX(0, N, N)]); | 83 | x[nsIX(0, N + 1, N)] = 0.5f * (x[nsIX(1, N + 1, N)] + x[nsIX(0, N, N)]); |
84 | x[nsIX(N + 1, 0, N)] = 0.5f * (x[nsIX(N, 0, N)] + x[nsIX(N + 1, 1, N)]); | 84 | x[nsIX(N + 1, 0, N)] = 0.5f * (x[nsIX(N, 0, N)] + x[nsIX(N + 1, 1, N)]); |
85 | x[nsIX(N + 1, N + 1, N)] = 0.5f * (x[nsIX(N, N + 1, N)] + x[nsIX(N + 1, N, N)]); | 85 | x[nsIX(N + 1, N + 1, N)] = 0.5f * (x[nsIX(N, N + 1, N)] + x[nsIX(N + 1, N, N)]); |
86 | } | 86 | } |
87 | 87 | ||
88 | private void nsLinSolve(int N, int b, ref double[] x, ref double[] x0, double a, double c) | 88 | private void nsLinSolve(int N, int b, ref double[] x, ref double[] x0, double a, double c) |
89 | { | 89 | { |
90 | int i, j; | 90 | int i, j; |
91 | for (i = 1; i <= N; i++) | 91 | for (i = 1; i <= N; i++) |
92 | { | 92 | { |
93 | for (j = 1; j <= N; j++) | 93 | for (j = 1; j <= N; j++) |
94 | { | 94 | { |
95 | x[nsIX(i, j, N)] = (x0[nsIX(i, j, N)] + a * | 95 | x[nsIX(i, j, N)] = (x0[nsIX(i, j, N)] + a * |
96 | (x[nsIX(i - 1, j, N)] + | 96 | (x[nsIX(i - 1, j, N)] + |
97 | x[nsIX(i + 1, j, N)] + | 97 | x[nsIX(i + 1, j, N)] + |
98 | x[nsIX(i, j - 1, N)] + x[nsIX(i, j + 1, N)]) | 98 | x[nsIX(i, j - 1, N)] + x[nsIX(i, j + 1, N)]) |
99 | ) / c; | 99 | ) / c; |
100 | } | 100 | } |
101 | } | 101 | } |
102 | 102 | ||
103 | nsSetBnd(N, b, ref x); | 103 | nsSetBnd(N, b, ref x); |
104 | } | 104 | } |
105 | 105 | ||
106 | private void nsDiffuse(int N, int b, ref double[] x, ref double[] x0, double diff, double dt) | 106 | private void nsDiffuse(int N, int b, ref double[] x, ref double[] x0, double diff, double dt) |
107 | { | 107 | { |
108 | double a = dt * diff * N * N; | 108 | double a = dt * diff * N * N; |
109 | nsLinSolve(N, b, ref x, ref x0, a, 1 + 4 * a); | 109 | nsLinSolve(N, b, ref x, ref x0, a, 1 + 4 * a); |
110 | } | 110 | } |
111 | 111 | ||
112 | private void nsAdvect(int N, int b, ref double[] d, ref double[] d0, ref double[] u, ref double[] v, double dt) | 112 | private void nsAdvect(int N, int b, ref double[] d, ref double[] d0, ref double[] u, ref double[] v, double dt) |
113 | { | 113 | { |
114 | int i, j, i0, j0, i1, j1; | 114 | int i, j, i0, j0, i1, j1; |
115 | double x, y, s0, t0, s1, t1, dt0; | 115 | double x, y, s0, t0, s1, t1, dt0; |
116 | 116 | ||
117 | dt0 = dt * N; | 117 | dt0 = dt * N; |
118 | 118 | ||
119 | for (i = 1; i <= N; i++) | 119 | for (i = 1; i <= N; i++) |
120 | { | 120 | { |
121 | for (j = 1; j <= N; j++) | 121 | for (j = 1; j <= N; j++) |
122 | { | 122 | { |
123 | x = i - dt0 * u[nsIX(i, j, N)]; | 123 | x = i - dt0 * u[nsIX(i, j, N)]; |
124 | y = j - dt0 * v[nsIX(i, j, N)]; | 124 | y = j - dt0 * v[nsIX(i, j, N)]; |
125 | 125 | ||
126 | if (x < 0.5) | 126 | if (x < 0.5) |
127 | x = 0.5; | 127 | x = 0.5; |
128 | if (x > N + 0.5) | 128 | if (x > N + 0.5) |
129 | x = N + 0.5; | 129 | x = N + 0.5; |
130 | i0 = (int)x; | 130 | i0 = (int)x; |
131 | i1 = i0 + 1; | 131 | i1 = i0 + 1; |
132 | 132 | ||
133 | if (y < 0.5) | 133 | if (y < 0.5) |
134 | y = 0.5; | 134 | y = 0.5; |
135 | if (y > N + 0.5) | 135 | if (y > N + 0.5) |
136 | y = N + 0.5; | 136 | y = N + 0.5; |
137 | j0 = (int)y; | 137 | j0 = (int)y; |
138 | j1 = j0 + 1; | 138 | j1 = j0 + 1; |
139 | 139 | ||
140 | s1 = x - i0; | 140 | s1 = x - i0; |
141 | s0 = 1 - s1; | 141 | s0 = 1 - s1; |
142 | t1 = y - j0; | 142 | t1 = y - j0; |
143 | t0 = 1 - t1; | 143 | t0 = 1 - t1; |
144 | 144 | ||
145 | d[nsIX(i, j, N)] = s0 * (t0 * d0[nsIX(i0, j0, N)] + t1 * d0[nsIX(i0, j1, N)]) + | 145 | d[nsIX(i, j, N)] = s0 * (t0 * d0[nsIX(i0, j0, N)] + t1 * d0[nsIX(i0, j1, N)]) + |
146 | s1 * (t0 * d0[nsIX(i1, j0, N)] + t1 * d0[nsIX(i1, j1, N)]); | 146 | s1 * (t0 * d0[nsIX(i1, j0, N)] + t1 * d0[nsIX(i1, j1, N)]); |
147 | } | 147 | } |
148 | } | 148 | } |
149 | 149 | ||
150 | nsSetBnd(N, b, ref d); | 150 | nsSetBnd(N, b, ref d); |
151 | } | 151 | } |
152 | 152 | ||
153 | public void nsProject(int N, ref double[] u, ref double[] v, ref double[] p, ref double[] div) | 153 | public void nsProject(int N, ref double[] u, ref double[] v, ref double[] p, ref double[] div) |
154 | { | 154 | { |
155 | int i, j; | 155 | int i, j; |
156 | 156 | ||
157 | for (i = 1; i <= N; i++) | 157 | for (i = 1; i <= N; i++) |
158 | { | 158 | { |
159 | for (j = 1; j <= N; j++) | 159 | for (j = 1; j <= N; j++) |
160 | { | 160 | { |
161 | div[nsIX(i, j, N)] = -0.5 * (u[nsIX(i + 1, j, N)] - u[nsIX(i - 1, j, N)] + v[nsIX(i, j + 1, N)] - v[nsIX(i, j - 1, N)]) / N; | 161 | div[nsIX(i, j, N)] = -0.5 * (u[nsIX(i + 1, j, N)] - u[nsIX(i - 1, j, N)] + v[nsIX(i, j + 1, N)] - v[nsIX(i, j - 1, N)]) / N; |
162 | p[nsIX(i, j, N)] = 0; | 162 | p[nsIX(i, j, N)] = 0; |
163 | } | 163 | } |
164 | } | 164 | } |
165 | 165 | ||
166 | nsSetBnd(N, 0, ref div); | 166 | nsSetBnd(N, 0, ref div); |
167 | nsSetBnd(N, 0, ref p); | 167 | nsSetBnd(N, 0, ref p); |
168 | 168 | ||
169 | nsLinSolve(N, 0, ref p, ref div, 1, 4); | 169 | nsLinSolve(N, 0, ref p, ref div, 1, 4); |
170 | 170 | ||
171 | for (i = 1; i <= N; i++) | 171 | for (i = 1; i <= N; i++) |
172 | { | 172 | { |
173 | for (j = 1; j <= N; j++) | 173 | for (j = 1; j <= N; j++) |
174 | { | 174 | { |
175 | u[nsIX(i, j, N)] -= 0.5 * N * (p[nsIX(i + 1, j, N)] - p[nsIX(i - 1, j, N)]); | 175 | u[nsIX(i, j, N)] -= 0.5 * N * (p[nsIX(i + 1, j, N)] - p[nsIX(i - 1, j, N)]); |
176 | v[nsIX(i, j, N)] -= 0.5 * N * (p[nsIX(i, j + 1, N)] - p[nsIX(i, j - 1, N)]); | 176 | v[nsIX(i, j, N)] -= 0.5 * N * (p[nsIX(i, j + 1, N)] - p[nsIX(i, j - 1, N)]); |
177 | } | 177 | } |
178 | } | 178 | } |
179 | 179 | ||
180 | nsSetBnd(N, 1, ref u); | 180 | nsSetBnd(N, 1, ref u); |
181 | nsSetBnd(N, 2, ref v); | 181 | nsSetBnd(N, 2, ref v); |
182 | } | 182 | } |
183 | 183 | ||
184 | private void nsDensStep(int N, ref double[] x, ref double[] x0, ref double[] u, ref double[] v, double diff, double dt) | 184 | private void nsDensStep(int N, ref double[] x, ref double[] x0, ref double[] u, ref double[] v, double diff, double dt) |
185 | { | 185 | { |
186 | nsAddSource(N, ref x, ref x0, dt); | 186 | nsAddSource(N, ref x, ref x0, dt); |
187 | nsSwap(ref x0, ref x); | 187 | nsSwap(ref x0, ref x); |
188 | nsDiffuse(N, 0, ref x, ref x0, diff, dt); | 188 | nsDiffuse(N, 0, ref x, ref x0, diff, dt); |
189 | nsSwap(ref x0, ref x); | 189 | nsSwap(ref x0, ref x); |
190 | nsAdvect(N, 0, ref x, ref x0, ref u, ref v, dt); | 190 | nsAdvect(N, 0, ref x, ref x0, ref u, ref v, dt); |
191 | } | 191 | } |
192 | 192 | ||
193 | private void nsVelStep(int N, ref double[] u, ref double[] v, ref double[] u0, ref double[] v0, double visc, double dt) | 193 | private void nsVelStep(int N, ref double[] u, ref double[] v, ref double[] u0, ref double[] v0, double visc, double dt) |
194 | { | 194 | { |
195 | nsAddSource(N, ref u, ref u0, dt); | 195 | nsAddSource(N, ref u, ref u0, dt); |
196 | nsAddSource(N, ref v, ref v0, dt); | 196 | nsAddSource(N, ref v, ref v0, dt); |
197 | nsSwap(ref u0, ref u); | 197 | nsSwap(ref u0, ref u); |
198 | nsDiffuse(N, 1, ref u, ref u0, visc, dt); | 198 | nsDiffuse(N, 1, ref u, ref u0, visc, dt); |
199 | nsSwap(ref v0, ref v); | 199 | nsSwap(ref v0, ref v); |
200 | nsDiffuse(N, 2, ref v, ref v0, visc, dt); | 200 | nsDiffuse(N, 2, ref v, ref v0, visc, dt); |
201 | nsProject(N, ref u, ref v, ref u0, ref v0); | 201 | nsProject(N, ref u, ref v, ref u0, ref v0); |
202 | nsSwap(ref u0, ref u); | 202 | nsSwap(ref u0, ref u); |
203 | nsSwap(ref v0, ref v); | 203 | nsSwap(ref v0, ref v); |
204 | nsAdvect(N, 1, ref u, ref u0, ref u0, ref v0, dt); | 204 | nsAdvect(N, 1, ref u, ref u0, ref u0, ref v0, dt); |
205 | nsAdvect(N, 2, ref v, ref v0, ref u0, ref v0, dt); | 205 | nsAdvect(N, 2, ref v, ref v0, ref u0, ref v0, dt); |
206 | nsProject(N, ref u, ref v, ref u0, ref v0); | 206 | nsProject(N, ref u, ref v, ref u0, ref v0); |
207 | } | 207 | } |
208 | 208 | ||
209 | private void nsBufferToDoubles(ref double[] dens, int N, ref double[,] doubles) | 209 | private void nsBufferToDoubles(ref double[] dens, int N, ref double[,] doubles) |
210 | { | 210 | { |
211 | int i; | 211 | int i; |
212 | int j; | 212 | int j; |
213 | 213 | ||
214 | for (i = 1; i <= N; i++) | 214 | for (i = 1; i <= N; i++) |
215 | { | 215 | { |
216 | for (j = 1; j <= N; j++) | 216 | for (j = 1; j <= N; j++) |
217 | { | 217 | { |
218 | doubles[i - 1, j - 1] = dens[nsIX(i, j, N)]; | 218 | doubles[i - 1, j - 1] = dens[nsIX(i, j, N)]; |
219 | } | 219 | } |
220 | } | 220 | } |
221 | } | 221 | } |
222 | 222 | ||
223 | private void nsDoublesToBuffer(double[,] doubles, int N, ref double[] dens) | 223 | private void nsDoublesToBuffer(double[,] doubles, int N, ref double[] dens) |
224 | { | 224 | { |
225 | int i; | 225 | int i; |
226 | int j; | 226 | int j; |
227 | 227 | ||
228 | for (i = 1; i <= N; i++) | 228 | for (i = 1; i <= N; i++) |
229 | { | 229 | { |
230 | for (j = 1; j <= N; j++) | 230 | for (j = 1; j <= N; j++) |
231 | { | 231 | { |
232 | dens[nsIX(i, j, N)] = doubles[i - 1, j - 1]; | 232 | dens[nsIX(i, j, N)] = doubles[i - 1, j - 1]; |
233 | } | 233 | } |
234 | } | 234 | } |
235 | } | 235 | } |
236 | 236 | ||
237 | private void nsSimulate(int N, int rounds, double dt, double diff, double visc) | 237 | private void nsSimulate(int N, int rounds, double dt, double diff, double visc) |
238 | { | 238 | { |
239 | int size = (N * 2) * (N * 2); | 239 | int size = (N * 2) * (N * 2); |
240 | 240 | ||
241 | double[] u = new double[size]; // Force, X axis | 241 | double[] u = new double[size]; // Force, X axis |
242 | double[] v = new double[size]; // Force, Y axis | 242 | double[] v = new double[size]; // Force, Y axis |
243 | double[] u_prev = new double[size]; | 243 | double[] u_prev = new double[size]; |
244 | double[] v_prev = new double[size]; | 244 | double[] v_prev = new double[size]; |
245 | double[] dens = new double[size]; | 245 | double[] dens = new double[size]; |
246 | double[] dens_prev = new double[size]; | 246 | double[] dens_prev = new double[size]; |
247 | 247 | ||
248 | nsDoublesToBuffer(this.map, N, ref dens); | 248 | nsDoublesToBuffer(this.map, N, ref dens); |
249 | nsDoublesToBuffer(this.map, N, ref dens_prev); | 249 | nsDoublesToBuffer(this.map, N, ref dens_prev); |
250 | 250 | ||
251 | for (int i = 0; i < rounds; i++) | 251 | for (int i = 0; i < rounds; i++) |
252 | { | 252 | { |
253 | u_prev = u; | 253 | u_prev = u; |
254 | v_prev = v; | 254 | v_prev = v; |
255 | dens_prev = dens; | 255 | dens_prev = dens; |
256 | 256 | ||
257 | nsVelStep(N, ref u, ref v, ref u_prev, ref v_prev, visc, dt); | 257 | nsVelStep(N, ref u, ref v, ref u_prev, ref v_prev, visc, dt); |
258 | nsDensStep(N, ref dens, ref dens_prev, ref u, ref v, diff, dt); | 258 | nsDensStep(N, ref dens, ref dens_prev, ref u, ref v, diff, dt); |
259 | } | 259 | } |
260 | 260 | ||
261 | nsBufferToDoubles(ref dens, N, ref this.map); | 261 | nsBufferToDoubles(ref dens, N, ref this.map); |
262 | } | 262 | } |
263 | 263 | ||
264 | /// <summary> | 264 | /// <summary> |
265 | /// Performs computational fluid dynamics on a channel | 265 | /// Performs computational fluid dynamics on a channel |
266 | /// </summary> | 266 | /// </summary> |
267 | /// <param name="rounds">The number of steps to perform (Recommended: 20)</param> | 267 | /// <param name="rounds">The number of steps to perform (Recommended: 20)</param> |
268 | /// <param name="dt">Delta Time - The time between steps (Recommended: 0.1)</param> | 268 | /// <param name="dt">Delta Time - The time between steps (Recommended: 0.1)</param> |
269 | /// <param name="diff">Fluid diffusion rate (Recommended: 0.0)</param> | 269 | /// <param name="diff">Fluid diffusion rate (Recommended: 0.0)</param> |
270 | /// <param name="visc">Fluid viscosity (Recommended: 0.0)</param> | 270 | /// <param name="visc">Fluid viscosity (Recommended: 0.0)</param> |
271 | public void navierStokes(int rounds, double dt, double diff, double visc) | 271 | public void navierStokes(int rounds, double dt, double diff, double visc) |
272 | { | 272 | { |
273 | nsSimulate(this.h, rounds, dt, diff, visc); | 273 | nsSimulate(this.h, rounds, dt, diff, visc); |
274 | } | 274 | } |
275 | 275 | ||
276 | public void navierStokes(int rounds, double dt, double diff, double visc, ref double[,] uret, ref double[,] vret) | 276 | public void navierStokes(int rounds, double dt, double diff, double visc, ref double[,] uret, ref double[,] vret) |
277 | { | 277 | { |
278 | int N = this.h; | 278 | int N = this.h; |
279 | 279 | ||
280 | int size = (N * 2) * (N * 2); | 280 | int size = (N * 2) * (N * 2); |
281 | 281 | ||
282 | double[] u = new double[size]; // Force, X axis | 282 | double[] u = new double[size]; // Force, X axis |
283 | double[] v = new double[size]; // Force, Y axis | 283 | double[] v = new double[size]; // Force, Y axis |
284 | double[] u_prev = new double[size]; | 284 | double[] u_prev = new double[size]; |
285 | double[] v_prev = new double[size]; | 285 | double[] v_prev = new double[size]; |
286 | double[] dens = new double[size]; | 286 | double[] dens = new double[size]; |
287 | double[] dens_prev = new double[size]; | 287 | double[] dens_prev = new double[size]; |
288 | 288 | ||
289 | nsDoublesToBuffer(this.map, N, ref dens); | 289 | nsDoublesToBuffer(this.map, N, ref dens); |
290 | nsDoublesToBuffer(this.map, N, ref dens_prev); | 290 | nsDoublesToBuffer(this.map, N, ref dens_prev); |
291 | 291 | ||
292 | for (int i = 0; i < rounds; i++) | 292 | for (int i = 0; i < rounds; i++) |
293 | { | 293 | { |
294 | u_prev = u; | 294 | u_prev = u; |
295 | v_prev = v; | 295 | v_prev = v; |
296 | dens_prev = dens; | 296 | dens_prev = dens; |
297 | 297 | ||
298 | nsVelStep(N, ref u, ref v, ref u_prev, ref v_prev, visc, dt); | 298 | nsVelStep(N, ref u, ref v, ref u_prev, ref v_prev, visc, dt); |
299 | nsDensStep(N, ref dens, ref dens_prev, ref u, ref v, diff, dt); | 299 | nsDensStep(N, ref dens, ref dens_prev, ref u, ref v, diff, dt); |
300 | } | 300 | } |
301 | 301 | ||
302 | nsBufferToDoubles(ref u, N, ref uret); | 302 | nsBufferToDoubles(ref u, N, ref uret); |
303 | nsBufferToDoubles(ref v, N, ref vret); | 303 | nsBufferToDoubles(ref v, N, ref vret); |
304 | nsBufferToDoubles(ref dens, N, ref this.map); | 304 | nsBufferToDoubles(ref dens, N, ref this.map); |
305 | } | 305 | } |
306 | } | 306 | } |
307 | } \ No newline at end of file | 307 | } \ No newline at end of file |
diff --git a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Manipulators/ThermalWeathering.cs b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Manipulators/ThermalWeathering.cs index 07c7d66..695d501 100644 --- a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Manipulators/ThermalWeathering.cs +++ b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Manipulators/ThermalWeathering.cs | |||
@@ -1,112 +1,112 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (c) Contributors, http://www.openmetaverse.org/ | 2 | * Copyright (c) Contributors, http://www.openmetaverse.org/ |
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | 3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. |
4 | * | 4 | * |
5 | * Redistribution and use in source and binary forms, with or without | 5 | * Redistribution and use in source and binary forms, with or without |
6 | * modification, are permitted provided that the following conditions are met: | 6 | * modification, are permitted provided that the following conditions are met: |
7 | * * Redistributions of source code must retain the above copyright | 7 | * * Redistributions of source code must retain the above copyright |
8 | * notice, this list of conditions and the following disclaimer. | 8 | * notice, this list of conditions and the following disclaimer. |
9 | * * Redistributions in binary form must reproduce the above copyright | 9 | * * Redistributions in binary form must reproduce the above copyright |
10 | * notice, this list of conditions and the following disclaimer in the | 10 | * notice, this list of conditions and the following disclaimer in the |
11 | * documentation and/or other materials provided with the distribution. | 11 | * documentation and/or other materials provided with the distribution. |
12 | * * Neither the name of the OpenSim Project nor the | 12 | * * Neither the name of the OpenSim Project nor the |
13 | * names of its contributors may be used to endorse or promote products | 13 | * names of its contributors may be used to endorse or promote products |
14 | * derived from this software without specific prior written permission. | 14 | * derived from this software without specific prior written permission. |
15 | * | 15 | * |
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY | 16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY |
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | 17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | 18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | 19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY |
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | 20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | 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 | 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 | 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 | 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. | 25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
26 | * | 26 | * |
27 | */ | 27 | */ |
28 | 28 | ||
29 | using System; | 29 | using System; |
30 | using System.Collections.Generic; | 30 | using System.Collections.Generic; |
31 | using System.Text; | 31 | using System.Text; |
32 | 32 | ||
33 | namespace libTerrain | 33 | namespace libTerrain |
34 | { | 34 | { |
35 | partial class Channel | 35 | partial class Channel |
36 | { | 36 | { |
37 | /// <summary> | 37 | /// <summary> |
38 | /// A thermal weathering implementation based on Musgrave's original 1989 algorithm. This is Adam's custom implementation which may differ slightly from the original. | 38 | /// A thermal weathering implementation based on Musgrave's original 1989 algorithm. This is Adam's custom implementation which may differ slightly from the original. |
39 | /// </summary> | 39 | /// </summary> |
40 | /// <param name="talus">The rock angle (represented as a dy/dx ratio) at which point it will be succeptible to breakage</param> | 40 | /// <param name="talus">The rock angle (represented as a dy/dx ratio) at which point it will be succeptible to breakage</param> |
41 | /// <param name="rounds">The number of erosion rounds</param> | 41 | /// <param name="rounds">The number of erosion rounds</param> |
42 | /// <param name="c">The amount of rock to carry each round</param> | 42 | /// <param name="c">The amount of rock to carry each round</param> |
43 | public Channel ThermalWeathering(double talus, int rounds, double c) | 43 | public Channel ThermalWeathering(double talus, int rounds, double c) |
44 | { | 44 | { |
45 | SetDiff(); | 45 | SetDiff(); |
46 | 46 | ||
47 | double[,] lastFrame; | 47 | double[,] lastFrame; |
48 | double[,] thisFrame; | 48 | double[,] thisFrame; |
49 | 49 | ||
50 | lastFrame = (double[,])map.Clone(); | 50 | lastFrame = (double[,])map.Clone(); |
51 | thisFrame = (double[,])map.Clone(); | 51 | thisFrame = (double[,])map.Clone(); |
52 | 52 | ||
53 | NeighbourSystem type = NeighbourSystem.Moore; // Using moore neighbourhood (twice as computationally expensive) | 53 | NeighbourSystem type = NeighbourSystem.Moore; // Using moore neighbourhood (twice as computationally expensive) |
54 | int NEIGHBOUR_ME = 4; // I am always 4 in both systems. | 54 | int NEIGHBOUR_ME = 4; // I am always 4 in both systems. |
55 | 55 | ||
56 | int NEIGHBOUR_MAX = type == NeighbourSystem.Moore ? 9 : 5; | 56 | int NEIGHBOUR_MAX = type == NeighbourSystem.Moore ? 9 : 5; |
57 | 57 | ||
58 | int frames = rounds; // Number of thermal erosion iterations to run | 58 | int frames = rounds; // Number of thermal erosion iterations to run |
59 | int i, j; | 59 | int i, j; |
60 | int x, y; | 60 | int x, y; |
61 | 61 | ||
62 | for (i = 0; i < frames; i++) | 62 | for (i = 0; i < frames; i++) |
63 | { | 63 | { |
64 | for (x = 0; x < w; x++) | 64 | for (x = 0; x < w; x++) |
65 | { | 65 | { |
66 | for (y = 0; y < h; y++) | 66 | for (y = 0; y < h; y++) |
67 | { | 67 | { |
68 | for (j = 0; j < NEIGHBOUR_MAX; j++) | 68 | for (j = 0; j < NEIGHBOUR_MAX; j++) |
69 | { | 69 | { |
70 | if (j != NEIGHBOUR_ME) | 70 | if (j != NEIGHBOUR_ME) |
71 | { | 71 | { |
72 | int[] coords = Neighbours(type, j); | 72 | int[] coords = Neighbours(type, j); |
73 | 73 | ||
74 | coords[0] += x; | 74 | coords[0] += x; |
75 | coords[1] += y; | 75 | coords[1] += y; |
76 | 76 | ||
77 | if (coords[0] > w - 1) | 77 | if (coords[0] > w - 1) |
78 | coords[0] = w - 1; | 78 | coords[0] = w - 1; |
79 | if (coords[1] > h - 1) | 79 | if (coords[1] > h - 1) |
80 | coords[1] = h - 1; | 80 | coords[1] = h - 1; |
81 | if (coords[0] < 0) | 81 | if (coords[0] < 0) |
82 | coords[0] = 0; | 82 | coords[0] = 0; |
83 | if (coords[1] < 0) | 83 | if (coords[1] < 0) |
84 | coords[1] = 0; | 84 | coords[1] = 0; |
85 | 85 | ||
86 | double heightF = thisFrame[x, y]; | 86 | double heightF = thisFrame[x, y]; |
87 | double target = thisFrame[coords[0], coords[1]]; | 87 | double target = thisFrame[coords[0], coords[1]]; |
88 | 88 | ||
89 | if (target > heightF + talus) | 89 | if (target > heightF + talus) |
90 | { | 90 | { |
91 | double calc = c * ((target - heightF) - talus); | 91 | double calc = c * ((target - heightF) - talus); |
92 | heightF += calc; | 92 | heightF += calc; |
93 | target -= calc; | 93 | target -= calc; |
94 | } | 94 | } |
95 | 95 | ||
96 | thisFrame[x, y] = heightF; | 96 | thisFrame[x, y] = heightF; |
97 | thisFrame[coords[0], coords[1]] = target; | 97 | thisFrame[coords[0], coords[1]] = target; |
98 | 98 | ||
99 | } | 99 | } |
100 | } | 100 | } |
101 | } | 101 | } |
102 | } | 102 | } |
103 | lastFrame = (double[,])thisFrame.Clone(); | 103 | lastFrame = (double[,])thisFrame.Clone(); |
104 | } | 104 | } |
105 | 105 | ||
106 | map = thisFrame; | 106 | map = thisFrame; |
107 | 107 | ||
108 | Normalise(); // Just to guaruntee a smooth 0..1 value | 108 | Normalise(); // Just to guaruntee a smooth 0..1 value |
109 | return this; | 109 | return this; |
110 | } | 110 | } |
111 | } | 111 | } |
112 | } | 112 | } |
diff --git a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Neighbours.cs b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Neighbours.cs index 6dc2e30..da03871 100644 --- a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Neighbours.cs +++ b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Neighbours.cs | |||
@@ -1,141 +1,141 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (c) Contributors, http://www.openmetaverse.org/ | 2 | * Copyright (c) Contributors, http://www.openmetaverse.org/ |
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | 3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. |
4 | * | 4 | * |
5 | * Redistribution and use in source and binary forms, with or without | 5 | * Redistribution and use in source and binary forms, with or without |
6 | * modification, are permitted provided that the following conditions are met: | 6 | * modification, are permitted provided that the following conditions are met: |
7 | * * Redistributions of source code must retain the above copyright | 7 | * * Redistributions of source code must retain the above copyright |
8 | * notice, this list of conditions and the following disclaimer. | 8 | * notice, this list of conditions and the following disclaimer. |
9 | * * Redistributions in binary form must reproduce the above copyright | 9 | * * Redistributions in binary form must reproduce the above copyright |
10 | * notice, this list of conditions and the following disclaimer in the | 10 | * notice, this list of conditions and the following disclaimer in the |
11 | * documentation and/or other materials provided with the distribution. | 11 | * documentation and/or other materials provided with the distribution. |
12 | * * Neither the name of the OpenSim Project nor the | 12 | * * Neither the name of the OpenSim Project nor the |
13 | * names of its contributors may be used to endorse or promote products | 13 | * names of its contributors may be used to endorse or promote products |
14 | * derived from this software without specific prior written permission. | 14 | * derived from this software without specific prior written permission. |
15 | * | 15 | * |
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY | 16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY |
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | 17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | 18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | 19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY |
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | 20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | 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 | 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 | 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 | 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. | 25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
26 | * | 26 | * |
27 | */ | 27 | */ |
28 | 28 | ||
29 | using System; | 29 | using System; |
30 | using System.Collections.Generic; | 30 | using System.Collections.Generic; |
31 | using System.Text; | 31 | using System.Text; |
32 | 32 | ||
33 | namespace libTerrain | 33 | namespace libTerrain |
34 | { | 34 | { |
35 | partial class Channel | 35 | partial class Channel |
36 | { | 36 | { |
37 | enum NeighbourSystem | 37 | enum NeighbourSystem |
38 | { | 38 | { |
39 | Moore, | 39 | Moore, |
40 | VonNeumann | 40 | VonNeumann |
41 | }; | 41 | }; |
42 | 42 | ||
43 | private int[] Neighbours(NeighbourSystem type, int index) | 43 | private int[] Neighbours(NeighbourSystem type, int index) |
44 | { | 44 | { |
45 | int[] coord = new int[2]; | 45 | int[] coord = new int[2]; |
46 | 46 | ||
47 | index++; | 47 | index++; |
48 | 48 | ||
49 | switch (type) | 49 | switch (type) |
50 | { | 50 | { |
51 | case NeighbourSystem.Moore: | 51 | case NeighbourSystem.Moore: |
52 | switch (index) | 52 | switch (index) |
53 | { | 53 | { |
54 | case 1: | 54 | case 1: |
55 | coord[0] = -1; | 55 | coord[0] = -1; |
56 | coord[1] = -1; | 56 | coord[1] = -1; |
57 | break; | 57 | break; |
58 | 58 | ||
59 | case 2: | 59 | case 2: |
60 | coord[0] = -0; | 60 | coord[0] = -0; |
61 | coord[1] = -1; | 61 | coord[1] = -1; |
62 | break; | 62 | break; |
63 | 63 | ||
64 | case 3: | 64 | case 3: |
65 | coord[0] = +1; | 65 | coord[0] = +1; |
66 | coord[1] = -1; | 66 | coord[1] = -1; |
67 | break; | 67 | break; |
68 | 68 | ||
69 | case 4: | 69 | case 4: |
70 | coord[0] = -1; | 70 | coord[0] = -1; |
71 | coord[1] = -0; | 71 | coord[1] = -0; |
72 | break; | 72 | break; |
73 | 73 | ||
74 | case 5: | 74 | case 5: |
75 | coord[0] = -0; | 75 | coord[0] = -0; |
76 | coord[1] = -0; | 76 | coord[1] = -0; |
77 | break; | 77 | break; |
78 | 78 | ||
79 | case 6: | 79 | case 6: |
80 | coord[0] = +1; | 80 | coord[0] = +1; |
81 | coord[1] = -0; | 81 | coord[1] = -0; |
82 | break; | 82 | break; |
83 | 83 | ||
84 | case 7: | 84 | case 7: |
85 | coord[0] = -1; | 85 | coord[0] = -1; |
86 | coord[1] = +1; | 86 | coord[1] = +1; |
87 | break; | 87 | break; |
88 | 88 | ||
89 | case 8: | 89 | case 8: |
90 | coord[0] = -0; | 90 | coord[0] = -0; |
91 | coord[1] = +1; | 91 | coord[1] = +1; |
92 | break; | 92 | break; |
93 | 93 | ||
94 | case 9: | 94 | case 9: |
95 | coord[0] = +1; | 95 | coord[0] = +1; |
96 | coord[1] = +1; | 96 | coord[1] = +1; |
97 | break; | 97 | break; |
98 | 98 | ||
99 | default: | 99 | default: |
100 | break; | 100 | break; |
101 | } | 101 | } |
102 | break; | 102 | break; |
103 | 103 | ||
104 | case NeighbourSystem.VonNeumann: | 104 | case NeighbourSystem.VonNeumann: |
105 | switch (index) | 105 | switch (index) |
106 | { | 106 | { |
107 | case 1: | 107 | case 1: |
108 | coord[0] = 0; | 108 | coord[0] = 0; |
109 | coord[1] = -1; | 109 | coord[1] = -1; |
110 | break; | 110 | break; |
111 | 111 | ||
112 | case 2: | 112 | case 2: |
113 | coord[0] = -1; | 113 | coord[0] = -1; |
114 | coord[1] = 0; | 114 | coord[1] = 0; |
115 | break; | 115 | break; |
116 | 116 | ||
117 | case 3: | 117 | case 3: |
118 | coord[0] = +1; | 118 | coord[0] = +1; |
119 | coord[1] = 0; | 119 | coord[1] = 0; |
120 | break; | 120 | break; |
121 | 121 | ||
122 | case 4: | 122 | case 4: |
123 | coord[0] = 0; | 123 | coord[0] = 0; |
124 | coord[1] = +1; | 124 | coord[1] = +1; |
125 | break; | 125 | break; |
126 | 126 | ||
127 | case 5: | 127 | case 5: |
128 | coord[0] = -0; | 128 | coord[0] = -0; |
129 | coord[1] = -0; | 129 | coord[1] = -0; |
130 | break; | 130 | break; |
131 | 131 | ||
132 | default: | 132 | default: |
133 | break; | 133 | break; |
134 | } | 134 | } |
135 | break; | 135 | break; |
136 | } | 136 | } |
137 | 137 | ||
138 | return coord; | 138 | return coord; |
139 | } | 139 | } |
140 | } | 140 | } |
141 | } | 141 | } |
diff --git a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Operators.cs b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Operators.cs index 3199ddc..8184f06 100644 --- a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Operators.cs +++ b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Operators.cs | |||
@@ -1,243 +1,243 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (c) Contributors, http://www.openmetaverse.org/ | 2 | * Copyright (c) Contributors, http://www.openmetaverse.org/ |
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | 3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. |
4 | * | 4 | * |
5 | * Redistribution and use in source and binary forms, with or without | 5 | * Redistribution and use in source and binary forms, with or without |
6 | * modification, are permitted provided that the following conditions are met: | 6 | * modification, are permitted provided that the following conditions are met: |
7 | * * Redistributions of source code must retain the above copyright | 7 | * * Redistributions of source code must retain the above copyright |
8 | * notice, this list of conditions and the following disclaimer. | 8 | * notice, this list of conditions and the following disclaimer. |
9 | * * Redistributions in binary form must reproduce the above copyright | 9 | * * Redistributions in binary form must reproduce the above copyright |
10 | * notice, this list of conditions and the following disclaimer in the | 10 | * notice, this list of conditions and the following disclaimer in the |
11 | * documentation and/or other materials provided with the distribution. | 11 | * documentation and/or other materials provided with the distribution. |
12 | * * Neither the name of the OpenSim Project nor the | 12 | * * Neither the name of the OpenSim Project nor the |
13 | * names of its contributors may be used to endorse or promote products | 13 | * names of its contributors may be used to endorse or promote products |
14 | * derived from this software without specific prior written permission. | 14 | * derived from this software without specific prior written permission. |
15 | * | 15 | * |
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY | 16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY |
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | 17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | 18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | 19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY |
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | 20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | 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 | 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 | 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 | 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. | 25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
26 | * | 26 | * |
27 | */ | 27 | */ |
28 | 28 | ||
29 | using System; | 29 | using System; |
30 | using System.Collections.Generic; | 30 | using System.Collections.Generic; |
31 | using System.Text; | 31 | using System.Text; |
32 | 32 | ||
33 | namespace libTerrain | 33 | namespace libTerrain |
34 | { | 34 | { |
35 | partial class Channel | 35 | partial class Channel |
36 | { | 36 | { |
37 | /* Operator combination of channel datatypes */ | 37 | /* Operator combination of channel datatypes */ |
38 | 38 | ||
39 | public static Channel operator +(Channel A, Channel B) | 39 | public static Channel operator +(Channel A, Channel B) |
40 | { | 40 | { |
41 | if (A.h != B.h) | 41 | if (A.h != B.h) |
42 | throw new Exception("Cannot add heightmaps, of different height."); | 42 | throw new Exception("Cannot add heightmaps, of different height."); |
43 | if (A.w != B.w) | 43 | if (A.w != B.w) |
44 | throw new Exception("Cannot add heightmaps, of different width."); | 44 | throw new Exception("Cannot add heightmaps, of different width."); |
45 | 45 | ||
46 | int x, y; | 46 | int x, y; |
47 | 47 | ||
48 | for (x = 0; x < A.w; x++) | 48 | for (x = 0; x < A.w; x++) |
49 | { | 49 | { |
50 | for (y = 0; y < A.h; y++) | 50 | for (y = 0; y < A.h; y++) |
51 | { | 51 | { |
52 | if (B.map[x, y] != 0) | 52 | if (B.map[x, y] != 0) |
53 | A.SetDiff(x, y); | 53 | A.SetDiff(x, y); |
54 | 54 | ||
55 | A.map[x, y] += B.map[x, y]; | 55 | A.map[x, y] += B.map[x, y]; |
56 | } | 56 | } |
57 | } | 57 | } |
58 | 58 | ||
59 | return A; | 59 | return A; |
60 | } | 60 | } |
61 | 61 | ||
62 | public static Channel operator *(Channel A, Channel B) | 62 | public static Channel operator *(Channel A, Channel B) |
63 | { | 63 | { |
64 | if (A.h != B.h) | 64 | if (A.h != B.h) |
65 | throw new Exception("Cannot multiply heightmaps, of different height."); | 65 | throw new Exception("Cannot multiply heightmaps, of different height."); |
66 | if (A.w != B.w) | 66 | if (A.w != B.w) |
67 | throw new Exception("Cannot multiply heightmaps, of different width."); | 67 | throw new Exception("Cannot multiply heightmaps, of different width."); |
68 | 68 | ||
69 | int x, y; | 69 | int x, y; |
70 | 70 | ||
71 | for (x = 0; x < A.w; x++) | 71 | for (x = 0; x < A.w; x++) |
72 | { | 72 | { |
73 | for (y = 0; y < A.h; y++) | 73 | for (y = 0; y < A.h; y++) |
74 | { | 74 | { |
75 | A.map[x, y] *= B.map[x, y]; | 75 | A.map[x, y] *= B.map[x, y]; |
76 | } | 76 | } |
77 | } | 77 | } |
78 | 78 | ||
79 | A.SetDiff(); | 79 | A.SetDiff(); |
80 | 80 | ||
81 | return A; | 81 | return A; |
82 | } | 82 | } |
83 | 83 | ||
84 | public static Channel operator -(Channel A, Channel B) | 84 | public static Channel operator -(Channel A, Channel B) |
85 | { | 85 | { |
86 | if (A.h != B.h) | 86 | if (A.h != B.h) |
87 | throw new Exception("Cannot subtract heightmaps, of different height."); | 87 | throw new Exception("Cannot subtract heightmaps, of different height."); |
88 | if (A.w != B.w) | 88 | if (A.w != B.w) |
89 | throw new Exception("Cannot subtract heightmaps, of different width."); | 89 | throw new Exception("Cannot subtract heightmaps, of different width."); |
90 | 90 | ||
91 | int x, y; | 91 | int x, y; |
92 | 92 | ||
93 | for (x = 0; x < A.w; x++) | 93 | for (x = 0; x < A.w; x++) |
94 | { | 94 | { |
95 | for (y = 0; y < A.h; y++) | 95 | for (y = 0; y < A.h; y++) |
96 | { | 96 | { |
97 | if (B.map[x, y] != 0) | 97 | if (B.map[x, y] != 0) |
98 | A.SetDiff(x, y); | 98 | A.SetDiff(x, y); |
99 | A.map[x, y] -= B.map[x, y]; | 99 | A.map[x, y] -= B.map[x, y]; |
100 | } | 100 | } |
101 | } | 101 | } |
102 | 102 | ||
103 | return A; | 103 | return A; |
104 | } | 104 | } |
105 | 105 | ||
106 | public static Channel operator /(Channel A, Channel B) | 106 | public static Channel operator /(Channel A, Channel B) |
107 | { | 107 | { |
108 | if (A.h != B.h) | 108 | if (A.h != B.h) |
109 | throw new Exception("Cannot divide heightmaps, of different height."); | 109 | throw new Exception("Cannot divide heightmaps, of different height."); |
110 | if (A.w != B.w) | 110 | if (A.w != B.w) |
111 | throw new Exception("Cannot divide heightmaps, of different width."); | 111 | throw new Exception("Cannot divide heightmaps, of different width."); |
112 | 112 | ||
113 | int x, y; | 113 | int x, y; |
114 | 114 | ||
115 | for (x = 0; x < A.w; x++) | 115 | for (x = 0; x < A.w; x++) |
116 | { | 116 | { |
117 | for (y = 0; y < A.h; y++) | 117 | for (y = 0; y < A.h; y++) |
118 | { | 118 | { |
119 | A.map[x, y] /= B.map[x, y]; | 119 | A.map[x, y] /= B.map[x, y]; |
120 | } | 120 | } |
121 | } | 121 | } |
122 | 122 | ||
123 | A.SetDiff(); | 123 | A.SetDiff(); |
124 | 124 | ||
125 | return A; | 125 | return A; |
126 | } | 126 | } |
127 | 127 | ||
128 | public static Channel operator ^(Channel A, Channel B) | 128 | public static Channel operator ^(Channel A, Channel B) |
129 | { | 129 | { |
130 | if (A.h != B.h) | 130 | if (A.h != B.h) |
131 | throw new Exception("Cannot divide heightmaps, of different height."); | 131 | throw new Exception("Cannot divide heightmaps, of different height."); |
132 | if (A.w != B.w) | 132 | if (A.w != B.w) |
133 | throw new Exception("Cannot divide heightmaps, of different width."); | 133 | throw new Exception("Cannot divide heightmaps, of different width."); |
134 | 134 | ||
135 | int x, y; | 135 | int x, y; |
136 | 136 | ||
137 | for (x = 0; x < A.w; x++) | 137 | for (x = 0; x < A.w; x++) |
138 | { | 138 | { |
139 | for (y = 0; y < A.h; y++) | 139 | for (y = 0; y < A.h; y++) |
140 | { | 140 | { |
141 | A.map[x, y] = Math.Pow(A.map[x,y],B.map[x, y]); | 141 | A.map[x, y] = Math.Pow(A.map[x,y],B.map[x, y]); |
142 | } | 142 | } |
143 | } | 143 | } |
144 | 144 | ||
145 | A.SetDiff(); | 145 | A.SetDiff(); |
146 | 146 | ||
147 | return A; | 147 | return A; |
148 | } | 148 | } |
149 | 149 | ||
150 | 150 | ||
151 | /* Operator combination of channel and double datatypes */ | 151 | /* Operator combination of channel and double datatypes */ |
152 | 152 | ||
153 | public static Channel operator +(Channel A, double B) | 153 | public static Channel operator +(Channel A, double B) |
154 | { | 154 | { |
155 | int x, y; | 155 | int x, y; |
156 | 156 | ||
157 | for (x = 0; x < A.w; x++) | 157 | for (x = 0; x < A.w; x++) |
158 | { | 158 | { |
159 | for (y = 0; y < A.h; y++) | 159 | for (y = 0; y < A.h; y++) |
160 | { | 160 | { |
161 | A.map[x, y] += B; | 161 | A.map[x, y] += B; |
162 | } | 162 | } |
163 | } | 163 | } |
164 | 164 | ||
165 | if (B != 0) | 165 | if (B != 0) |
166 | A.SetDiff(); | 166 | A.SetDiff(); |
167 | 167 | ||
168 | return A; | 168 | return A; |
169 | } | 169 | } |
170 | 170 | ||
171 | public static Channel operator -(Channel A, double B) | 171 | public static Channel operator -(Channel A, double B) |
172 | { | 172 | { |
173 | int x, y; | 173 | int x, y; |
174 | 174 | ||
175 | for (x = 0; x < A.w; x++) | 175 | for (x = 0; x < A.w; x++) |
176 | { | 176 | { |
177 | for (y = 0; y < A.h; y++) | 177 | for (y = 0; y < A.h; y++) |
178 | { | 178 | { |
179 | A.map[x, y] -= B; | 179 | A.map[x, y] -= B; |
180 | } | 180 | } |
181 | } | 181 | } |
182 | 182 | ||
183 | if (B != 0) | 183 | if (B != 0) |
184 | A.SetDiff(); | 184 | A.SetDiff(); |
185 | 185 | ||
186 | return A; | 186 | return A; |
187 | } | 187 | } |
188 | 188 | ||
189 | public static Channel operator *(Channel A, double B) | 189 | public static Channel operator *(Channel A, double B) |
190 | { | 190 | { |
191 | int x, y; | 191 | int x, y; |
192 | 192 | ||
193 | for (x = 0; x < A.w; x++) | 193 | for (x = 0; x < A.w; x++) |
194 | { | 194 | { |
195 | for (y = 0; y < A.h; y++) | 195 | for (y = 0; y < A.h; y++) |
196 | { | 196 | { |
197 | A.map[x, y] *= B; | 197 | A.map[x, y] *= B; |
198 | } | 198 | } |
199 | } | 199 | } |
200 | 200 | ||
201 | if (B != 1) | 201 | if (B != 1) |
202 | A.SetDiff(); | 202 | A.SetDiff(); |
203 | 203 | ||
204 | return A; | 204 | return A; |
205 | } | 205 | } |
206 | 206 | ||
207 | public static Channel operator /(Channel A, double B) | 207 | public static Channel operator /(Channel A, double B) |
208 | { | 208 | { |
209 | int x, y; | 209 | int x, y; |
210 | 210 | ||
211 | for (x = 0; x < A.w; x++) | 211 | for (x = 0; x < A.w; x++) |
212 | { | 212 | { |
213 | for (y = 0; y < A.h; y++) | 213 | for (y = 0; y < A.h; y++) |
214 | { | 214 | { |
215 | A.map[x, y] /= B; | 215 | A.map[x, y] /= B; |
216 | } | 216 | } |
217 | } | 217 | } |
218 | 218 | ||
219 | if (B != 1) | 219 | if (B != 1) |
220 | A.SetDiff(); | 220 | A.SetDiff(); |
221 | 221 | ||
222 | return A; | 222 | return A; |
223 | } | 223 | } |
224 | 224 | ||
225 | public static Channel operator ^(Channel A, double B) | 225 | public static Channel operator ^(Channel A, double B) |
226 | { | 226 | { |
227 | int x, y; | 227 | int x, y; |
228 | 228 | ||
229 | for (x = 0; x < A.w; x++) | 229 | for (x = 0; x < A.w; x++) |
230 | { | 230 | { |
231 | for (y = 0; y < A.h; y++) | 231 | for (y = 0; y < A.h; y++) |
232 | { | 232 | { |
233 | A.map[x, y] = Math.Pow(A.map[x,y],B); | 233 | A.map[x, y] = Math.Pow(A.map[x,y],B); |
234 | } | 234 | } |
235 | } | 235 | } |
236 | 236 | ||
237 | A.SetDiff(); | 237 | A.SetDiff(); |
238 | 238 | ||
239 | return A; | 239 | return A; |
240 | } | 240 | } |
241 | 241 | ||
242 | } | 242 | } |
243 | } | 243 | } |
diff --git a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Tools/Point2D.cs b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Tools/Point2D.cs index 69c1148..785ba0d 100644 --- a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Tools/Point2D.cs +++ b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Tools/Point2D.cs | |||
@@ -1,49 +1,49 @@ | |||
1 | /* | 1 | /* |
2 | Redistribution and use in source and binary forms, with or without | 2 | Redistribution and use in source and binary forms, with or without |
3 | modification, are permitted provided that the following conditions are | 3 | modification, are permitted provided that the following conditions are |
4 | met: | 4 | met: |
5 | 5 | ||
6 | * Redistributions of source code must retain the above copyright | 6 | * Redistributions of source code must retain the above copyright |
7 | notice, this list of conditions and the following disclaimer. | 7 | notice, this list of conditions and the following disclaimer. |
8 | 8 | ||
9 | * Redistributions in binary form must reproduce the above | 9 | * Redistributions in binary form must reproduce the above |
10 | copyright notice, this list of conditions and the following | 10 | copyright notice, this list of conditions and the following |
11 | disclaimer in the documentation and/or other materials provided | 11 | disclaimer in the documentation and/or other materials provided |
12 | with the distribution. | 12 | with the distribution. |
13 | 13 | ||
14 | * Neither the name of libTerrain nor the names of | 14 | * Neither the name of libTerrain nor the names of |
15 | its contributors may be used to endorse or promote products | 15 | its contributors may be used to endorse or promote products |
16 | derived from this software without specific prior written | 16 | derived from this software without specific prior written |
17 | permission. | 17 | permission. |
18 | 18 | ||
19 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | 19 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
20 | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | 20 | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
21 | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | 21 | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
22 | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | 22 | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
23 | OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | 23 | OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
24 | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | 24 | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
25 | LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | 25 | LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
26 | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 26 | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
27 | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 27 | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
28 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 28 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
29 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 29 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
30 | */ | 30 | */ |
31 | 31 | ||
32 | using System; | 32 | using System; |
33 | using System.Collections.Generic; | 33 | using System.Collections.Generic; |
34 | using System.Text; | 34 | using System.Text; |
35 | 35 | ||
36 | namespace libTerrain | 36 | namespace libTerrain |
37 | { | 37 | { |
38 | public class Point2D | 38 | public class Point2D |
39 | { | 39 | { |
40 | public double x; | 40 | public double x; |
41 | public double y; | 41 | public double y; |
42 | 42 | ||
43 | public Point2D(double X, double Y) | 43 | public Point2D(double X, double Y) |
44 | { | 44 | { |
45 | x = X; | 45 | x = X; |
46 | y = Y; | 46 | y = Y; |
47 | } | 47 | } |
48 | } | 48 | } |
49 | } | 49 | } |