diff options
19 files changed, 428 insertions, 47 deletions
diff --git a/OpenSim/Framework/Communications/Cache/AssetCache.cs b/OpenSim/Framework/Communications/Cache/AssetCache.cs index d947228..2dceb54 100644 --- a/OpenSim/Framework/Communications/Cache/AssetCache.cs +++ b/OpenSim/Framework/Communications/Cache/AssetCache.cs | |||
@@ -144,14 +144,14 @@ namespace OpenSim.Framework.Communications.Caches | |||
144 | AssetBase asset = GetAsset(assetID); | 144 | AssetBase asset = GetAsset(assetID); |
145 | if (asset == null) | 145 | if (asset == null) |
146 | { | 146 | { |
147 | this._assetServer.RequestAsset(assetID, isTexture); | 147 | this._assetServer.FetchAsset(assetID, isTexture); |
148 | } | 148 | } |
149 | return asset; | 149 | return asset; |
150 | } | 150 | } |
151 | 151 | ||
152 | public void AddAsset(AssetBase asset) | 152 | public void AddAsset(AssetBase asset) |
153 | { | 153 | { |
154 | System.Console.WriteLine("adding asset " + asset.FullID.ToStringHyphenated()); | 154 | // System.Console.WriteLine("adding asset " + asset.FullID.ToStringHyphenated()); |
155 | if (asset.Type == 0) | 155 | if (asset.Type == 0) |
156 | { | 156 | { |
157 | //Console.WriteLine("which is a texture"); | 157 | //Console.WriteLine("which is a texture"); |
@@ -159,7 +159,7 @@ namespace OpenSim.Framework.Communications.Caches | |||
159 | { //texture | 159 | { //texture |
160 | TextureImage textur = new TextureImage(asset); | 160 | TextureImage textur = new TextureImage(asset); |
161 | this.Textures.Add(textur.FullID, textur); | 161 | this.Textures.Add(textur.FullID, textur); |
162 | this._assetServer.UploadNewAsset(asset); | 162 | this._assetServer.CreateAsset(asset); |
163 | } | 163 | } |
164 | else | 164 | else |
165 | { | 165 | { |
@@ -173,7 +173,7 @@ namespace OpenSim.Framework.Communications.Caches | |||
173 | { | 173 | { |
174 | AssetInfo assetInf = new AssetInfo(asset); | 174 | AssetInfo assetInf = new AssetInfo(asset); |
175 | this.Assets.Add(assetInf.FullID, assetInf); | 175 | this.Assets.Add(assetInf.FullID, assetInf); |
176 | this._assetServer.UploadNewAsset(asset); | 176 | this._assetServer.CreateAsset(asset); |
177 | } | 177 | } |
178 | } | 178 | } |
179 | } | 179 | } |
@@ -384,7 +384,7 @@ namespace OpenSim.Framework.Communications.Caches | |||
384 | request.AssetRequestSource = source; | 384 | request.AssetRequestSource = source; |
385 | request.Params = transferRequest.TransferInfo.Params; | 385 | request.Params = transferRequest.TransferInfo.Params; |
386 | this.RequestedAssets.Add(requestID, request); | 386 | this.RequestedAssets.Add(requestID, request); |
387 | this._assetServer.RequestAsset(requestID, false); | 387 | this._assetServer.FetchAsset(requestID, false); |
388 | } | 388 | } |
389 | return; | 389 | return; |
390 | } | 390 | } |
@@ -561,7 +561,7 @@ namespace OpenSim.Framework.Communications.Caches | |||
561 | request.IsTextureRequest = true; | 561 | request.IsTextureRequest = true; |
562 | request.DiscardLevel = discard; | 562 | request.DiscardLevel = discard; |
563 | this.RequestedTextures.Add(imageID, request); | 563 | this.RequestedTextures.Add(imageID, request); |
564 | this._assetServer.RequestAsset(imageID, true); | 564 | this._assetServer.FetchAsset(imageID, true); |
565 | } | 565 | } |
566 | return; | 566 | return; |
567 | } | 567 | } |
diff --git a/OpenSim/Framework/Communications/Cache/AssetServer.cs b/OpenSim/Framework/Communications/Cache/AssetServer.cs index fd203f7..4e2644c 100644 --- a/OpenSim/Framework/Communications/Cache/AssetServer.cs +++ b/OpenSim/Framework/Communications/Cache/AssetServer.cs | |||
@@ -73,7 +73,7 @@ namespace OpenSim.Framework.Communications.Caches | |||
73 | this._receiver = receiver; | 73 | this._receiver = receiver; |
74 | } | 74 | } |
75 | 75 | ||
76 | public void RequestAsset(LLUUID assetID, bool isTexture) | 76 | public void FetchAsset(LLUUID assetID, bool isTexture) |
77 | { | 77 | { |
78 | ARequest req = new ARequest(); | 78 | ARequest req = new ARequest(); |
79 | req.AssetID = assetID; | 79 | req.AssetID = assetID; |
@@ -86,7 +86,7 @@ namespace OpenSim.Framework.Communications.Caches | |||
86 | 86 | ||
87 | } | 87 | } |
88 | 88 | ||
89 | public void UploadNewAsset(AssetBase asset) | 89 | public void CreateAsset(AssetBase asset) |
90 | { | 90 | { |
91 | AssetStorage store = new AssetStorage(); | 91 | AssetStorage store = new AssetStorage(); |
92 | store.Data = asset.Data; | 92 | store.Data = asset.Data; |
diff --git a/OpenSim/Framework/Communications/Cache/SQLAssetServer.cs b/OpenSim/Framework/Communications/Cache/SQLAssetServer.cs new file mode 100644 index 0000000..50653d8 --- /dev/null +++ b/OpenSim/Framework/Communications/Cache/SQLAssetServer.cs | |||
@@ -0,0 +1,297 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://www.openmetaverse.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSim Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | * | ||
27 | */ | ||
28 | using System; | ||
29 | using System.IO; | ||
30 | using System.Threading; | ||
31 | using System.Reflection; | ||
32 | using libsecondlife; | ||
33 | using Nini.Config; | ||
34 | using OpenSim.Framework.Console; | ||
35 | using OpenSim.Framework.Interfaces; | ||
36 | using OpenSim.Framework.Types; | ||
37 | using OpenSim.Framework.Utilities; | ||
38 | |||
39 | namespace OpenSim.Framework.Communications.Caches | ||
40 | { | ||
41 | |||
42 | public class SQLAssetServer : IAssetServer | ||
43 | { | ||
44 | private IAssetReceiver _receiver; | ||
45 | private BlockingQueue<ARequest> _assetRequests; | ||
46 | private Thread _localAssetServerThread; | ||
47 | protected IAssetProvider m_plugin; | ||
48 | |||
49 | |||
50 | public SQLAssetServer() | ||
51 | { | ||
52 | _assetRequests = new BlockingQueue<ARequest>(); | ||
53 | AddPlugin("OpenSim.Framework.Data.SQLite.dll"); | ||
54 | this.SetUpAssetDatabase(); | ||
55 | |||
56 | this._localAssetServerThread = new Thread(new ThreadStart(RunRequests)); | ||
57 | this._localAssetServerThread.IsBackground = true; | ||
58 | this._localAssetServerThread.Start(); | ||
59 | |||
60 | } | ||
61 | |||
62 | public void AddPlugin(string FileName) | ||
63 | { | ||
64 | //MainLog.Instance.Verbose("SQLAssetServer", "AssetStorage: Attempting to load " + FileName); | ||
65 | Assembly pluginAssembly = Assembly.LoadFrom(FileName); | ||
66 | |||
67 | foreach (Type pluginType in pluginAssembly.GetTypes()) | ||
68 | { | ||
69 | if (!pluginType.IsAbstract) | ||
70 | { | ||
71 | Type typeInterface = pluginType.GetInterface("IAssetProvider", true); | ||
72 | |||
73 | if (typeInterface != null) | ||
74 | { | ||
75 | IAssetProvider plug = (IAssetProvider)Activator.CreateInstance(pluginAssembly.GetType(pluginType.ToString())); | ||
76 | m_plugin = plug; | ||
77 | m_plugin.Initialise("AssetStorage.db", ""); | ||
78 | |||
79 | //MainLog.Instance.Verbose("AssetStorage: Added IAssetProvider Interface"); | ||
80 | } | ||
81 | |||
82 | typeInterface = null; | ||
83 | } | ||
84 | } | ||
85 | |||
86 | pluginAssembly = null; | ||
87 | } | ||
88 | |||
89 | public void SetReceiver(IAssetReceiver receiver) | ||
90 | { | ||
91 | this._receiver = receiver; | ||
92 | } | ||
93 | |||
94 | public void FetchAsset(LLUUID assetID, bool isTexture) | ||
95 | { | ||
96 | ARequest req = new ARequest(); | ||
97 | req.AssetID = assetID; | ||
98 | req.IsTexture = isTexture; | ||
99 | this._assetRequests.Enqueue(req); | ||
100 | } | ||
101 | |||
102 | public void UpdateAsset(AssetBase asset) | ||
103 | { | ||
104 | m_plugin.UpdateAsset(asset); | ||
105 | m_plugin.CommitAssets(); | ||
106 | } | ||
107 | |||
108 | public void CreateAsset(AssetBase asset) | ||
109 | { | ||
110 | m_plugin.CreateAsset(asset); | ||
111 | m_plugin.CommitAssets(); | ||
112 | } | ||
113 | |||
114 | public void SetServerInfo(string ServerUrl, string ServerKey) | ||
115 | { | ||
116 | |||
117 | } | ||
118 | public void Close() | ||
119 | { | ||
120 | m_plugin.CommitAssets(); | ||
121 | } | ||
122 | |||
123 | private void RunRequests() | ||
124 | { | ||
125 | |||
126 | while (true) | ||
127 | { | ||
128 | ARequest req = this._assetRequests.Dequeue(); | ||
129 | |||
130 | m_plugin.FetchAsset(req.AssetID); | ||
131 | |||
132 | AssetBase asset = m_plugin.FetchAsset(req.AssetID); | ||
133 | if (asset != null) | ||
134 | { | ||
135 | _receiver.AssetReceived(asset, req.IsTexture); | ||
136 | } | ||
137 | else | ||
138 | { | ||
139 | _receiver.AssetNotFound(req.AssetID); | ||
140 | } | ||
141 | |||
142 | } | ||
143 | |||
144 | } | ||
145 | |||
146 | private void SetUpAssetDatabase() | ||
147 | { | ||
148 | MainLog.Instance.Verbose("Setting up asset database"); | ||
149 | |||
150 | AssetBase Image = new AssetBase(); | ||
151 | Image.FullID = new LLUUID("00000000-0000-0000-9999-000000000001"); | ||
152 | Image.Name = "Bricks"; | ||
153 | this.LoadAsset(Image, true, "bricks.jp2"); | ||
154 | m_plugin.CreateAsset(Image); | ||
155 | |||
156 | Image = new AssetBase(); | ||
157 | Image.FullID = new LLUUID("00000000-0000-0000-9999-000000000002"); | ||
158 | Image.Name = "Plywood"; | ||
159 | this.LoadAsset(Image, true, "plywood.jp2"); | ||
160 | m_plugin.CreateAsset(Image); | ||
161 | |||
162 | Image = new AssetBase(); | ||
163 | Image.FullID = new LLUUID("00000000-0000-0000-9999-000000000003"); | ||
164 | Image.Name = "Rocks"; | ||
165 | this.LoadAsset(Image, true, "rocks.jp2"); | ||
166 | m_plugin.CreateAsset(Image); | ||
167 | |||
168 | Image = new AssetBase(); | ||
169 | Image.FullID = new LLUUID("00000000-0000-0000-9999-000000000004"); | ||
170 | Image.Name = "Granite"; | ||
171 | this.LoadAsset(Image, true, "granite.jp2"); | ||
172 | m_plugin.CreateAsset(Image); | ||
173 | |||
174 | Image = new AssetBase(); | ||
175 | Image.FullID = new LLUUID("00000000-0000-0000-9999-000000000005"); | ||
176 | Image.Name = "Hardwood"; | ||
177 | this.LoadAsset(Image, true, "hardwood.jp2"); | ||
178 | m_plugin.CreateAsset(Image); | ||
179 | |||
180 | Image = new AssetBase(); | ||
181 | Image.FullID = new LLUUID("00000000-0000-0000-5005-000000000005"); | ||
182 | Image.Name = "Prim Base Texture"; | ||
183 | this.LoadAsset(Image, true, "plywood.jp2"); | ||
184 | m_plugin.CreateAsset(Image); | ||
185 | |||
186 | Image = new AssetBase(); | ||
187 | Image.FullID = new LLUUID("00000000-0000-0000-9999-000000000006"); | ||
188 | Image.Name = "Map Base Texture"; | ||
189 | this.LoadAsset(Image, true, "map_base.jp2"); | ||
190 | m_plugin.CreateAsset(Image); | ||
191 | |||
192 | Image = new AssetBase(); | ||
193 | Image.FullID = new LLUUID("00000000-0000-0000-9999-000000000007"); | ||
194 | Image.Name = "Map Texture"; | ||
195 | this.LoadAsset(Image, true, "map1.jp2"); | ||
196 | m_plugin.CreateAsset(Image); | ||
197 | |||
198 | Image = new AssetBase(); | ||
199 | Image.FullID = new LLUUID("00000000-0000-1111-9999-000000000010"); | ||
200 | Image.Name = "Female Body Texture"; | ||
201 | this.LoadAsset(Image, true, "femalebody.jp2"); | ||
202 | m_plugin.CreateAsset(Image); | ||
203 | |||
204 | Image = new AssetBase(); | ||
205 | Image.FullID = new LLUUID("00000000-0000-1111-9999-000000000011"); | ||
206 | Image.Name = "Female Bottom Texture"; | ||
207 | this.LoadAsset(Image, true, "femalebottom.jp2"); | ||
208 | m_plugin.CreateAsset(Image); | ||
209 | |||
210 | Image = new AssetBase(); | ||
211 | Image.FullID = new LLUUID("00000000-0000-1111-9999-000000000012"); | ||
212 | Image.Name = "Female Face Texture"; | ||
213 | this.LoadAsset(Image, true, "femaleface.jp2"); | ||
214 | m_plugin.CreateAsset(Image); | ||
215 | |||
216 | Image = new AssetBase(); | ||
217 | Image.FullID = new LLUUID("77c41e39-38f9-f75a-024e-585989bbabbb"); | ||
218 | Image.Name = "Skin"; | ||
219 | Image.Type = 13; | ||
220 | Image.InvType = 13; | ||
221 | this.LoadAsset(Image, false, "base_skin.dat"); | ||
222 | m_plugin.CreateAsset(Image); | ||
223 | |||
224 | Image = new AssetBase(); | ||
225 | Image.FullID = new LLUUID("66c41e39-38f9-f75a-024e-585989bfab73"); | ||
226 | Image.Name = "Shape"; | ||
227 | Image.Type = 13; | ||
228 | Image.InvType = 13; | ||
229 | this.LoadAsset(Image, false, "base_shape.dat"); | ||
230 | m_plugin.CreateAsset(Image); | ||
231 | |||
232 | Image = new AssetBase(); | ||
233 | Image.FullID = new LLUUID("00000000-38f9-1111-024e-222222111110"); | ||
234 | Image.Name = "Shirt"; | ||
235 | Image.Type = 5; | ||
236 | Image.InvType = 18; | ||
237 | this.LoadAsset(Image, false, "newshirt.dat"); | ||
238 | m_plugin.CreateAsset(Image); | ||
239 | |||
240 | Image = new AssetBase(); | ||
241 | Image.FullID = new LLUUID("00000000-38f9-1111-024e-222222111120"); | ||
242 | Image.Name = "Shirt"; | ||
243 | Image.Type = 5; | ||
244 | Image.InvType = 18; | ||
245 | this.LoadAsset(Image, false, "newpants.dat"); | ||
246 | m_plugin.CreateAsset(Image); | ||
247 | |||
248 | string filePath = Path.Combine(Util.configDir(), "OpenSimAssetSet.xml"); | ||
249 | if (File.Exists(filePath)) | ||
250 | { | ||
251 | XmlConfigSource source = new XmlConfigSource(filePath); | ||
252 | ReadAssetDetails(source); | ||
253 | } | ||
254 | |||
255 | m_plugin.CommitAssets(); | ||
256 | } | ||
257 | |||
258 | protected void ReadAssetDetails(IConfigSource source) | ||
259 | { | ||
260 | AssetBase newAsset = null; | ||
261 | for (int i = 0; i < source.Configs.Count; i++) | ||
262 | { | ||
263 | newAsset = new AssetBase(); | ||
264 | newAsset.FullID = new LLUUID(source.Configs[i].GetString("assetID", LLUUID.Random().ToStringHyphenated())); | ||
265 | newAsset.Name = source.Configs[i].GetString("name", ""); | ||
266 | newAsset.Type = (sbyte)source.Configs[i].GetInt("assetType", 0); | ||
267 | newAsset.InvType = (sbyte)source.Configs[i].GetInt("inventoryType", 0); | ||
268 | string fileName = source.Configs[i].GetString("fileName", ""); | ||
269 | if (fileName != "") | ||
270 | { | ||
271 | this.LoadAsset(newAsset, false, fileName); | ||
272 | m_plugin.CreateAsset(newAsset); | ||
273 | } | ||
274 | } | ||
275 | } | ||
276 | |||
277 | private void LoadAsset(AssetBase info, bool image, string filename) | ||
278 | { | ||
279 | //should request Asset from storage manager | ||
280 | //but for now read from file | ||
281 | |||
282 | string dataPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "assets"); //+ folder; | ||
283 | string fileName = Path.Combine(dataPath, filename); | ||
284 | FileInfo fInfo = new FileInfo(fileName); | ||
285 | long numBytes = fInfo.Length; | ||
286 | FileStream fStream = new FileStream(fileName, FileMode.Open, FileAccess.Read); | ||
287 | byte[] idata = new byte[numBytes]; | ||
288 | BinaryReader br = new BinaryReader(fStream); | ||
289 | idata = br.ReadBytes((int)numBytes); | ||
290 | br.Close(); | ||
291 | fStream.Close(); | ||
292 | info.Data = idata; | ||
293 | //info.loaded=true; | ||
294 | } | ||
295 | } | ||
296 | |||
297 | } | ||
diff --git a/OpenSim/Framework/Data.SQLite/SQLiteAssetData.cs b/OpenSim/Framework/Data.SQLite/SQLiteAssetData.cs index 9138673..b53076c 100644 --- a/OpenSim/Framework/Data.SQLite/SQLiteAssetData.cs +++ b/OpenSim/Framework/Data.SQLite/SQLiteAssetData.cs | |||
@@ -34,13 +34,14 @@ using System.Data.SqlTypes; | |||
34 | using Mono.Data.SqliteClient; | 34 | using Mono.Data.SqliteClient; |
35 | using OpenSim.Framework.Console; | 35 | using OpenSim.Framework.Console; |
36 | using OpenSim.Framework.Types; | 36 | using OpenSim.Framework.Types; |
37 | using OpenSim.Framework.Interfaces; | ||
37 | 38 | ||
38 | namespace OpenSim.Framework.Data.SQLite | 39 | namespace OpenSim.Framework.Data.SQLite |
39 | { | 40 | { |
40 | /// <summary> | 41 | /// <summary> |
41 | /// A User storage interface for the DB4o database system | 42 | /// A User storage interface for the DB4o database system |
42 | /// </summary> | 43 | /// </summary> |
43 | public class SQLiteAssetData : SQLiteBase | 44 | public class SQLiteAssetData : SQLiteBase, IAssetProvider |
44 | { | 45 | { |
45 | /// <summary> | 46 | /// <summary> |
46 | /// The database manager | 47 | /// The database manager |
@@ -64,7 +65,15 @@ namespace OpenSim.Framework.Data.SQLite | |||
64 | ds.Tables.Add(createAssetsTable()); | 65 | ds.Tables.Add(createAssetsTable()); |
65 | 66 | ||
66 | setupAssetCommands(da, conn); | 67 | setupAssetCommands(da, conn); |
67 | da.Fill(ds.Tables["assets"]); | 68 | try |
69 | { | ||
70 | da.Fill(ds.Tables["assets"]); | ||
71 | } | ||
72 | catch (Exception) | ||
73 | { | ||
74 | MainLog.Instance.Verbose("AssetStorage", "Caught fill error on asset table"); | ||
75 | } | ||
76 | |||
68 | 77 | ||
69 | return; | 78 | return; |
70 | } | 79 | } |
@@ -172,7 +181,14 @@ namespace OpenSim.Framework.Data.SQLite | |||
172 | { | 181 | { |
173 | row["UUID"] = asset.FullID; | 182 | row["UUID"] = asset.FullID; |
174 | row["Name"] = asset.Name; | 183 | row["Name"] = asset.Name; |
175 | row["Description"] = asset.Description; | 184 | if (asset.Description != null) |
185 | { | ||
186 | row["Description"] = asset.Description; | ||
187 | } | ||
188 | else | ||
189 | { | ||
190 | row["Description"] = " "; | ||
191 | } | ||
176 | row["Type"] = asset.Type; | 192 | row["Type"] = asset.Type; |
177 | row["InvType"] = asset.InvType; | 193 | row["InvType"] = asset.InvType; |
178 | row["Local"] = asset.Local; | 194 | row["Local"] = asset.Local; |
diff --git a/OpenSim/Framework/General/Interfaces/IAssetProvider.cs b/OpenSim/Framework/General/Interfaces/IAssetProvider.cs new file mode 100644 index 0000000..a2ef826 --- /dev/null +++ b/OpenSim/Framework/General/Interfaces/IAssetProvider.cs | |||
@@ -0,0 +1,18 @@ | |||
1 | using System; | ||
2 | using System.Collections.Generic; | ||
3 | using System.Text; | ||
4 | using OpenSim.Framework.Types; | ||
5 | using libsecondlife; | ||
6 | |||
7 | namespace OpenSim.Framework.Interfaces | ||
8 | { | ||
9 | public interface IAssetProvider | ||
10 | { | ||
11 | void Initialise(string dbfile, string dbname); | ||
12 | AssetBase FetchAsset(LLUUID uuid); | ||
13 | void CreateAsset(AssetBase asset); | ||
14 | void UpdateAsset(AssetBase asset); | ||
15 | bool ExistsAsset(LLUUID uuid); | ||
16 | void CommitAssets(); // force a sync to the database | ||
17 | } | ||
18 | } \ No newline at end of file | ||
diff --git a/OpenSim/Framework/General/Interfaces/IAssetServer.cs b/OpenSim/Framework/General/Interfaces/IAssetServer.cs index cdce979..da3f61a 100644 --- a/OpenSim/Framework/General/Interfaces/IAssetServer.cs +++ b/OpenSim/Framework/General/Interfaces/IAssetServer.cs | |||
@@ -37,9 +37,9 @@ namespace OpenSim.Framework.Interfaces | |||
37 | public interface IAssetServer | 37 | public interface IAssetServer |
38 | { | 38 | { |
39 | void SetReceiver(IAssetReceiver receiver); | 39 | void SetReceiver(IAssetReceiver receiver); |
40 | void RequestAsset(LLUUID assetID, bool isTexture); | 40 | void FetchAsset(LLUUID assetID, bool isTexture); |
41 | void UpdateAsset(AssetBase asset); | 41 | void UpdateAsset(AssetBase asset); |
42 | void UploadNewAsset(AssetBase asset); | 42 | void CreateAsset(AssetBase asset); |
43 | void SetServerInfo(string ServerUrl, string ServerKey); | 43 | void SetServerInfo(string ServerUrl, string ServerKey); |
44 | void Close(); | 44 | void Close(); |
45 | } | 45 | } |
diff --git a/OpenSim/Framework/General/Types/AssetBase.cs b/OpenSim/Framework/General/Types/AssetBase.cs index 71642a2..7d5ee7b 100644 --- a/OpenSim/Framework/General/Types/AssetBase.cs +++ b/OpenSim/Framework/General/Types/AssetBase.cs | |||
@@ -42,7 +42,8 @@ namespace OpenSim.Framework.Types | |||
42 | 42 | ||
43 | public AssetBase() | 43 | public AssetBase() |
44 | { | 44 | { |
45 | 45 | Name = " "; | |
46 | Description = " "; | ||
46 | } | 47 | } |
47 | } | 48 | } |
48 | } | 49 | } |
diff --git a/OpenSim/Region/Application/OpenSimMain.cs b/OpenSim/Region/Application/OpenSimMain.cs index 9e0bc09..8437933 100644 --- a/OpenSim/Region/Application/OpenSimMain.cs +++ b/OpenSim/Region/Application/OpenSimMain.cs | |||
@@ -266,7 +266,8 @@ namespace OpenSim | |||
266 | { | 266 | { |
267 | m_httpServerPort = m_networkServersInfo.HttpListenerPort; | 267 | m_httpServerPort = m_networkServersInfo.HttpListenerPort; |
268 | 268 | ||
269 | LocalAssetServer assetServer = new LocalAssetServer(); | 269 | // LocalAssetServer assetServer = new LocalAssetServer(); |
270 | SQLAssetServer assetServer = new SQLAssetServer(); | ||
270 | assetServer.SetServerInfo(m_networkServersInfo.AssetURL, m_networkServersInfo.AssetSendKey); | 271 | assetServer.SetServerInfo(m_networkServersInfo.AssetURL, m_networkServersInfo.AssetSendKey); |
271 | m_assetCache = new AssetCache(assetServer); | 272 | m_assetCache = new AssetCache(assetServer); |
272 | // m_assetCache = new AssetCache("OpenSim.Region.GridInterfaces.Local.dll", m_networkServersInfo.AssetURL, m_networkServersInfo.AssetSendKey); | 273 | // m_assetCache = new AssetCache("OpenSim.Region.GridInterfaces.Local.dll", m_networkServersInfo.AssetURL, m_networkServersInfo.AssetSendKey); |
diff --git a/OpenSim/Region/ClientStack/ClientView.PacketHandlers.cs b/OpenSim/Region/ClientStack/ClientView.PacketHandlers.cs index 082eec2..e2617b3 100644 --- a/OpenSim/Region/ClientStack/ClientView.PacketHandlers.cs +++ b/OpenSim/Region/ClientStack/ClientView.PacketHandlers.cs | |||
@@ -58,7 +58,7 @@ namespace OpenSim.Region.ClientStack | |||
58 | 58 | ||
59 | protected bool AgentTextureCached(ClientView simclient, Packet packet) | 59 | protected bool AgentTextureCached(ClientView simclient, Packet packet) |
60 | { | 60 | { |
61 | // Console.WriteLine(packet.ToString()); | 61 | //System.Console.WriteLine("texture cached: " + packet.ToString()); |
62 | AgentCachedTexturePacket chechedtex = (AgentCachedTexturePacket)packet; | 62 | AgentCachedTexturePacket chechedtex = (AgentCachedTexturePacket)packet; |
63 | AgentCachedTextureResponsePacket cachedresp = new AgentCachedTextureResponsePacket(); | 63 | AgentCachedTextureResponsePacket cachedresp = new AgentCachedTextureResponsePacket(); |
64 | cachedresp.AgentData.AgentID = this.AgentID; | 64 | cachedresp.AgentData.AgentID = this.AgentID; |
diff --git a/OpenSim/Region/ClientStack/ClientView.ProcessPackets.cs b/OpenSim/Region/ClientStack/ClientView.ProcessPackets.cs index a35666d..4e2599f 100644 --- a/OpenSim/Region/ClientStack/ClientView.ProcessPackets.cs +++ b/OpenSim/Region/ClientStack/ClientView.ProcessPackets.cs | |||
@@ -170,6 +170,7 @@ namespace OpenSim.Region.ClientStack | |||
170 | } | 170 | } |
171 | break; | 171 | break; |
172 | case PacketType.AgentSetAppearance: | 172 | case PacketType.AgentSetAppearance: |
173 | //OpenSim.Framework.Console.MainLog.Instance.Verbose("set appear", Pack.ToString()); | ||
173 | AgentSetAppearancePacket appear = (AgentSetAppearancePacket)Pack; | 174 | AgentSetAppearancePacket appear = (AgentSetAppearancePacket)Pack; |
174 | if (OnSetAppearance != null) | 175 | if (OnSetAppearance != null) |
175 | { | 176 | { |
@@ -366,8 +367,9 @@ namespace OpenSim.Region.ClientStack | |||
366 | m_assetCache.AddAssetRequest(this, transfer); | 367 | m_assetCache.AddAssetRequest(this, transfer); |
367 | break; | 368 | break; |
368 | case PacketType.AssetUploadRequest: | 369 | case PacketType.AssetUploadRequest: |
369 | //Console.WriteLine("upload request " + Pack.ToString()); | ||
370 | AssetUploadRequestPacket request = (AssetUploadRequestPacket)Pack; | 370 | AssetUploadRequestPacket request = (AssetUploadRequestPacket)Pack; |
371 | // Console.WriteLine("upload request " + Pack.ToString()); | ||
372 | // Console.WriteLine("upload request was for assetid: " + request.AssetBlock.TransactionID.Combine(this.SecureSessionID).ToStringHyphenated()); | ||
371 | if (OnAssetUploadRequest != null) | 373 | if (OnAssetUploadRequest != null) |
372 | { | 374 | { |
373 | OnAssetUploadRequest(this, request.AssetBlock.TransactionID.Combine(this.SecureSessionID), request.AssetBlock.TransactionID, request.AssetBlock.Type, request.AssetBlock.AssetData, request.AssetBlock.StoreLocal); | 375 | OnAssetUploadRequest(this, request.AssetBlock.TransactionID.Combine(this.SecureSessionID), request.AssetBlock.TransactionID, request.AssetBlock.Type, request.AssetBlock.AssetData, request.AssetBlock.StoreLocal); |
diff --git a/OpenSim/Region/Environment/Interfaces/IXfer.cs b/OpenSim/Region/Environment/Interfaces/IXfer.cs new file mode 100644 index 0000000..a19ba8d --- /dev/null +++ b/OpenSim/Region/Environment/Interfaces/IXfer.cs | |||
@@ -0,0 +1,11 @@ | |||
1 | using System; | ||
2 | using System.Collections.Generic; | ||
3 | using System.Text; | ||
4 | |||
5 | namespace OpenSim.Region.Environment.Interfaces | ||
6 | { | ||
7 | public interface IXfer | ||
8 | { | ||
9 | bool AddNewFile(string fileName, byte[] data); | ||
10 | } | ||
11 | } | ||
diff --git a/OpenSim/Region/Environment/ModuleLoader.cs b/OpenSim/Region/Environment/ModuleLoader.cs index be3384b..ea416cb 100644 --- a/OpenSim/Region/Environment/ModuleLoader.cs +++ b/OpenSim/Region/Environment/ModuleLoader.cs | |||
@@ -28,27 +28,23 @@ namespace OpenSim.Region.Environment | |||
28 | /// <param name="scene"></param> | 28 | /// <param name="scene"></param> |
29 | public void CreateDefaultModules(Scene scene, string exceptModules) | 29 | public void CreateDefaultModules(Scene scene, string exceptModules) |
30 | { | 30 | { |
31 | XferModule xferManager = new XferModule(); | 31 | IRegionModule module = new XferModule(); |
32 | xferManager.Initialise(scene); | 32 | InitialiseModule(module, scene); |
33 | scene.AddModule(xferManager.GetName(), xferManager); | ||
34 | LoadedModules.Add(xferManager); | ||
35 | 33 | ||
36 | ChatModule chatModule = new ChatModule(); | 34 | module = new ChatModule(); |
37 | chatModule.Initialise(scene); | 35 | InitialiseModule(module, scene); |
38 | scene.AddModule(chatModule.GetName(), chatModule); | 36 | |
39 | LoadedModules.Add(chatModule); | 37 | module = new AvatarProfilesModule(); |
40 | 38 | InitialiseModule(module, scene); | |
41 | AvatarProfilesModule avatarProfiles = new AvatarProfilesModule(); | ||
42 | avatarProfiles.Initialise(scene); | ||
43 | scene.AddModule(avatarProfiles.GetName(), avatarProfiles); | ||
44 | LoadedModules.Add(avatarProfiles); | ||
45 | 39 | ||
46 | this.LoadRegionModule("OpenSim.Region.ExtensionsScriptModule.dll", "ExtensionsScriptingModule", scene); | 40 | this.LoadRegionModule("OpenSim.Region.ExtensionsScriptModule.dll", "ExtensionsScriptingModule", scene); |
47 | 41 | ||
48 | string lslPath = System.IO.Path.Combine("ScriptEngines", "OpenSim.Region.ScriptEngine.DotNetEngine.dll"); | 42 | string lslPath = System.IO.Path.Combine("ScriptEngines", "OpenSim.Region.ScriptEngine.DotNetEngine.dll"); |
49 | this.LoadRegionModule(lslPath, "LSLScriptingModule", scene); | 43 | this.LoadRegionModule(lslPath, "LSLScriptingModule", scene); |
44 | |||
50 | } | 45 | } |
51 | 46 | ||
47 | |||
52 | public void LoadDefaultSharedModules(string exceptModules) | 48 | public void LoadDefaultSharedModules(string exceptModules) |
53 | { | 49 | { |
54 | DynamicTextureModule dynamicModule = new DynamicTextureModule(); | 50 | DynamicTextureModule dynamicModule = new DynamicTextureModule(); |
@@ -64,6 +60,13 @@ namespace OpenSim.Region.Environment | |||
64 | } | 60 | } |
65 | } | 61 | } |
66 | 62 | ||
63 | private void InitialiseModule(IRegionModule module, Scene scene) | ||
64 | { | ||
65 | module.Initialise(scene); | ||
66 | scene.AddModule(module.GetName(), module); | ||
67 | LoadedModules.Add(module); | ||
68 | } | ||
69 | |||
67 | /// <summary> | 70 | /// <summary> |
68 | /// Loads/initialises a Module instance that can be used by mutliple Regions | 71 | /// Loads/initialises a Module instance that can be used by mutliple Regions |
69 | /// </summary> | 72 | /// </summary> |
@@ -84,9 +87,7 @@ namespace OpenSim.Region.Environment | |||
84 | IRegionModule module = this.LoadModule(dllName, moduleName); | 87 | IRegionModule module = this.LoadModule(dllName, moduleName); |
85 | if (module != null) | 88 | if (module != null) |
86 | { | 89 | { |
87 | module.Initialise(scene); | 90 | this.InitialiseModule(module, scene); |
88 | scene.AddModule(module.GetName(), module); | ||
89 | LoadedModules.Add(module); | ||
90 | } | 91 | } |
91 | } | 92 | } |
92 | 93 | ||
diff --git a/OpenSim/Region/Environment/Modules/XferModule.cs b/OpenSim/Region/Environment/Modules/XferModule.cs index eec9f97..44b4d7a 100644 --- a/OpenSim/Region/Environment/Modules/XferModule.cs +++ b/OpenSim/Region/Environment/Modules/XferModule.cs | |||
@@ -10,7 +10,7 @@ using OpenSim.Region.Environment.Interfaces; | |||
10 | 10 | ||
11 | namespace OpenSim.Region.Environment.Modules | 11 | namespace OpenSim.Region.Environment.Modules |
12 | { | 12 | { |
13 | public class XferModule : IRegionModule | 13 | public class XferModule : IRegionModule, IXfer |
14 | { | 14 | { |
15 | public Dictionary<string, byte[]> NewFiles = new Dictionary<string, byte[]>(); | 15 | public Dictionary<string, byte[]> NewFiles = new Dictionary<string, byte[]>(); |
16 | public Dictionary<ulong, XferDownLoad> Transfers = new Dictionary<ulong, XferDownLoad>(); | 16 | public Dictionary<ulong, XferDownLoad> Transfers = new Dictionary<ulong, XferDownLoad>(); |
@@ -27,7 +27,7 @@ namespace OpenSim.Region.Environment.Modules | |||
27 | m_scene = scene; | 27 | m_scene = scene; |
28 | m_scene.EventManager.OnNewClient += NewClient; | 28 | m_scene.EventManager.OnNewClient += NewClient; |
29 | 29 | ||
30 | m_scene.RegisterAPIMethod("API_AddXferFile", new ModuleAPIMethod2<bool, string, byte[]>(this.AddNewFile)); | 30 | m_scene.RegisterModuleInterface<IXfer>(this); |
31 | } | 31 | } |
32 | 32 | ||
33 | public void PostInitialise() | 33 | public void PostInitialise() |
diff --git a/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs b/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs index e5ab41f..70b34cf 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs | |||
@@ -201,9 +201,9 @@ namespace OpenSim.Region.Environment.Scenes | |||
201 | bool fileChange = ((SceneObjectGroup)ent).GetPartInventoryFileName(remoteClient, primLocalID); | 201 | bool fileChange = ((SceneObjectGroup)ent).GetPartInventoryFileName(remoteClient, primLocalID); |
202 | if (fileChange) | 202 | if (fileChange) |
203 | { | 203 | { |
204 | if (this.AddXferFile != null) | 204 | if (this.XferManager != null) |
205 | { | 205 | { |
206 | ((SceneObjectGroup)ent).RequestInventoryFile(primLocalID, AddXferFile); | 206 | ((SceneObjectGroup)ent).RequestInventoryFile(primLocalID, XferManager); |
207 | } | 207 | } |
208 | } | 208 | } |
209 | break; | 209 | break; |
diff --git a/OpenSim/Region/Environment/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs index 1af41be..d0edcda 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.cs | |||
@@ -91,10 +91,9 @@ namespace OpenSim.Region.Environment.Scenes | |||
91 | public Dictionary<Type, object> ModuleInterfaces = new Dictionary<Type, object>(); | 91 | public Dictionary<Type, object> ModuleInterfaces = new Dictionary<Type, object>(); |
92 | protected Dictionary<string, object> ModuleAPIMethods = new Dictionary<string, object>(); | 92 | protected Dictionary<string, object> ModuleAPIMethods = new Dictionary<string, object>(); |
93 | 93 | ||
94 | //API method Delegates and interfaces | 94 | //API module interfaces |
95 | 95 | ||
96 | // this most likely shouldn't be handled as a API method like this, but doing it for testing purposes | 96 | public IXfer XferManager; |
97 | public ModuleAPIMethod2<bool, string, byte[]> AddXferFile = null; | ||
98 | 97 | ||
99 | private IHttpRequests m_httpRequestModule = null; | 98 | private IHttpRequests m_httpRequestModule = null; |
100 | private ISimChat m_simChatModule = null; | 99 | private ISimChat m_simChatModule = null; |
@@ -206,8 +205,7 @@ namespace OpenSim.Region.Environment.Scenes | |||
206 | m_simChatModule = this.RequestModuleInterface<ISimChat>(); | 205 | m_simChatModule = this.RequestModuleInterface<ISimChat>(); |
207 | m_httpRequestModule = this.RequestModuleInterface<IHttpRequests>(); | 206 | m_httpRequestModule = this.RequestModuleInterface<IHttpRequests>(); |
208 | 207 | ||
209 | //should change so it uses the module interface functions | 208 | XferManager = this.RequestModuleInterface<IXfer>(); |
210 | AddXferFile = (ModuleAPIMethod2<bool, string, byte[]>)this.RequestAPIMethod("API_AddXferFile"); | ||
211 | } | 209 | } |
212 | 210 | ||
213 | #region Script Handling Methods | 211 | #region Script Handling Methods |
@@ -605,7 +603,7 @@ namespace OpenSim.Region.Environment.Scenes | |||
605 | { | 603 | { |
606 | if (!Entities.ContainsKey(sceneObject.UUID)) | 604 | if (!Entities.ContainsKey(sceneObject.UUID)) |
607 | { | 605 | { |
608 | QuadTree.AddObject(sceneObject); | 606 | // QuadTree.AddObject(sceneObject); |
609 | Entities.Add(sceneObject.UUID, sceneObject); | 607 | Entities.Add(sceneObject.UUID, sceneObject); |
610 | } | 608 | } |
611 | } | 609 | } |
diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs index 45d975c..eff622a 100644 --- a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs | |||
@@ -11,6 +11,7 @@ using OpenSim.Framework.Interfaces; | |||
11 | using OpenSim.Framework.Types; | 11 | using OpenSim.Framework.Types; |
12 | using OpenSim.Region.Physics.Manager; | 12 | using OpenSim.Region.Physics.Manager; |
13 | using OpenSim.Framework.Data; | 13 | using OpenSim.Framework.Data; |
14 | using OpenSim.Region.Environment.Interfaces; | ||
14 | 15 | ||
15 | namespace OpenSim.Region.Environment.Scenes | 16 | namespace OpenSim.Region.Environment.Scenes |
16 | { | 17 | { |
@@ -676,12 +677,12 @@ namespace OpenSim.Region.Environment.Scenes | |||
676 | return false; | 677 | return false; |
677 | } | 678 | } |
678 | 679 | ||
679 | public string RequestInventoryFile(uint localID, ModuleAPIMethod2<bool, string, byte[]> addXferFile) | 680 | public string RequestInventoryFile(uint localID, IXfer xferManager) |
680 | { | 681 | { |
681 | SceneObjectPart part = this.GetChildPart(localID); | 682 | SceneObjectPart part = this.GetChildPart(localID); |
682 | if (part != null) | 683 | if (part != null) |
683 | { | 684 | { |
684 | part.RequestInventoryFile(addXferFile); | 685 | part.RequestInventoryFile(xferManager); |
685 | } | 686 | } |
686 | return ""; | 687 | return ""; |
687 | } | 688 | } |
diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs b/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs index 9e207c8..2122a4f 100644 --- a/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs | |||
@@ -12,6 +12,7 @@ using OpenSim.Framework.Types; | |||
12 | using OpenSim.Region.Environment.Scenes.Scripting; | 12 | using OpenSim.Region.Environment.Scenes.Scripting; |
13 | using OpenSim.Framework.Utilities; | 13 | using OpenSim.Framework.Utilities; |
14 | using OpenSim.Region.Physics.Manager; | 14 | using OpenSim.Region.Physics.Manager; |
15 | using OpenSim.Region.Environment.Interfaces; | ||
15 | 16 | ||
16 | namespace OpenSim.Region.Environment.Scenes | 17 | namespace OpenSim.Region.Environment.Scenes |
17 | { | 18 | { |
@@ -494,7 +495,7 @@ namespace OpenSim.Region.Environment.Scenes | |||
494 | return false; | 495 | return false; |
495 | } | 496 | } |
496 | 497 | ||
497 | public string RequestInventoryFile(ModuleAPIMethod2<bool, string, byte[]> addXferFile) | 498 | public string RequestInventoryFile(IXfer xferManager) |
498 | { | 499 | { |
499 | byte[] fileData = new byte[0]; | 500 | byte[] fileData = new byte[0]; |
500 | InventoryStringBuilder invString = new InventoryStringBuilder(m_folderID, this.UUID); | 501 | InventoryStringBuilder invString = new InventoryStringBuilder(m_folderID, this.UUID); |
@@ -528,7 +529,7 @@ namespace OpenSim.Region.Environment.Scenes | |||
528 | fileData = Helpers.StringToField(invString.BuildString); | 529 | fileData = Helpers.StringToField(invString.BuildString); |
529 | if (fileData.Length > 2) | 530 | if (fileData.Length > 2) |
530 | { | 531 | { |
531 | addXferFile(m_inventoryFileName, fileData); | 532 | xferManager.AddNewFile(m_inventoryFileName, fileData); |
532 | } | 533 | } |
533 | return ""; | 534 | return ""; |
534 | } | 535 | } |
diff --git a/OpenSim/Region/Environment/Types/UpdateQueue.cs b/OpenSim/Region/Environment/Types/UpdateQueue.cs index d7eb6ee..dab4258 100644 --- a/OpenSim/Region/Environment/Types/UpdateQueue.cs +++ b/OpenSim/Region/Environment/Types/UpdateQueue.cs | |||
@@ -12,10 +12,43 @@ namespace OpenSim.Region.Environment.Types | |||
12 | 12 | ||
13 | private List<LLUUID> m_ids; | 13 | private List<LLUUID> m_ids; |
14 | 14 | ||
15 | public int Count | ||
16 | { | ||
17 | get { return m_queue.Count; } | ||
18 | } | ||
19 | |||
15 | public UpdateQueue() | 20 | public UpdateQueue() |
16 | { | 21 | { |
17 | m_queue = new Queue<SceneObjectPart>(); | 22 | m_queue = new Queue<SceneObjectPart>(); |
18 | m_ids = new List<LLUUID>(); | 23 | m_ids = new List<LLUUID>(); |
19 | } | 24 | } |
25 | |||
26 | public void Enqueue(SceneObjectPart part) | ||
27 | { | ||
28 | lock (m_ids) | ||
29 | { | ||
30 | if (!m_ids.Contains(part.UUID)) | ||
31 | { | ||
32 | m_ids.Add(part.UUID); | ||
33 | m_queue.Enqueue(part); | ||
34 | } | ||
35 | } | ||
36 | } | ||
37 | |||
38 | public SceneObjectPart Dequeue() | ||
39 | { | ||
40 | SceneObjectPart part = null; | ||
41 | if (m_queue.Count > 0) | ||
42 | { | ||
43 | part = m_queue.Dequeue(); | ||
44 | lock (m_ids) | ||
45 | { | ||
46 | m_ids.Remove(part.UUID); | ||
47 | } | ||
48 | } | ||
49 | |||
50 | return part; | ||
51 | } | ||
52 | |||
20 | } | 53 | } |
21 | } | 54 | } |
diff --git a/OpenSim/Region/Storage/OpenSim.DataStore.MonoSqlite/MonoSqliteDataStore.cs b/OpenSim/Region/Storage/OpenSim.DataStore.MonoSqlite/MonoSqliteDataStore.cs index 5f7360e..65b03ad 100644 --- a/OpenSim/Region/Storage/OpenSim.DataStore.MonoSqlite/MonoSqliteDataStore.cs +++ b/OpenSim/Region/Storage/OpenSim.DataStore.MonoSqlite/MonoSqliteDataStore.cs | |||
@@ -187,6 +187,7 @@ namespace OpenSim.DataStore.MonoSqliteStorage | |||
187 | return retvals; | 187 | return retvals; |
188 | } | 188 | } |
189 | 189 | ||
190 | |||
190 | public void StoreTerrain(double[,] ter) | 191 | public void StoreTerrain(double[,] ter) |
191 | { | 192 | { |
192 | 193 | ||