diff options
author | Justin Clark-Casey (justincc) | 2012-08-28 23:06:53 +0100 |
---|---|---|
committer | Justin Clark-Casey (justincc) | 2012-08-28 23:06:53 +0100 |
commit | c1cece4b82d24a17a09b66c9ec3975190cc05d95 (patch) | |
tree | 702963505eb8a359d9e0ce6f92964b3a03ac3cbe /OpenSim/Region/CoreModules/Scripting/VectorRender | |
parent | Add IDynamicTextureManager.ConvertData() to match AsyncConvertData(). Remove... (diff) | |
download | opensim-SC_OLD-c1cece4b82d24a17a09b66c9ec3975190cc05d95.zip opensim-SC_OLD-c1cece4b82d24a17a09b66c9ec3975190cc05d95.tar.gz opensim-SC_OLD-c1cece4b82d24a17a09b66c9ec3975190cc05d95.tar.bz2 opensim-SC_OLD-c1cece4b82d24a17a09b66c9ec3975190cc05d95.tar.xz |
Add experimental DynamicTextureModule.ReuseTextures flag, currently only configurable on compile.
Disabled (status quo) by default.
This flag makes the dynamic texture module reuse cache previously dynamically generated textures given the same input commands and extra params for 24 hours.
This occurs as long as those commands would always generate the same texture (e.g. they do not contain commands to fetch data from the web).
This makes texture changing faster as a viewer-cached texture uuid is sent and may reduce simulator load in regions with generation of lots of dynamic textures.
A downside is that this stops expiry of old temporary dynamic textures from the cache,
Another downside is that a jpeg2000 generation that partially failed is currently not regenerated until restart or after 24 hours.
Diffstat (limited to 'OpenSim/Region/CoreModules/Scripting/VectorRender')
-rw-r--r-- | OpenSim/Region/CoreModules/Scripting/VectorRender/Tests/VectorRenderModuleTests.cs | 125 | ||||
-rw-r--r-- | OpenSim/Region/CoreModules/Scripting/VectorRender/VectorRenderModule.cs | 48 |
2 files changed, 163 insertions, 10 deletions
diff --git a/OpenSim/Region/CoreModules/Scripting/VectorRender/Tests/VectorRenderModuleTests.cs b/OpenSim/Region/CoreModules/Scripting/VectorRender/Tests/VectorRenderModuleTests.cs index 180ea9f..b50c0bd 100644 --- a/OpenSim/Region/CoreModules/Scripting/VectorRender/Tests/VectorRenderModuleTests.cs +++ b/OpenSim/Region/CoreModules/Scripting/VectorRender/Tests/VectorRenderModuleTests.cs | |||
@@ -51,12 +51,15 @@ namespace OpenSim.Region.CoreModules.Scripting.VectorRender.Tests | |||
51 | DynamicTextureModule m_dtm; | 51 | DynamicTextureModule m_dtm; |
52 | VectorRenderModule m_vrm; | 52 | VectorRenderModule m_vrm; |
53 | 53 | ||
54 | [SetUp] | 54 | private void SetupScene(bool reuseTextures) |
55 | public void SetUp() | ||
56 | { | 55 | { |
57 | m_scene = new SceneHelpers().SetupScene(); | 56 | m_scene = new SceneHelpers().SetupScene(); |
57 | |||
58 | m_dtm = new DynamicTextureModule(); | 58 | m_dtm = new DynamicTextureModule(); |
59 | m_dtm.ReuseTextures = reuseTextures; | ||
60 | |||
59 | m_vrm = new VectorRenderModule(); | 61 | m_vrm = new VectorRenderModule(); |
62 | |||
60 | SceneHelpers.SetupSceneModules(m_scene, m_dtm, m_vrm); | 63 | SceneHelpers.SetupSceneModules(m_scene, m_dtm, m_vrm); |
61 | } | 64 | } |
62 | 65 | ||
@@ -65,6 +68,7 @@ namespace OpenSim.Region.CoreModules.Scripting.VectorRender.Tests | |||
65 | { | 68 | { |
66 | TestHelpers.InMethod(); | 69 | TestHelpers.InMethod(); |
67 | 70 | ||
71 | SetupScene(false); | ||
68 | SceneObjectGroup so = SceneHelpers.AddSceneObject(m_scene); | 72 | SceneObjectGroup so = SceneHelpers.AddSceneObject(m_scene); |
69 | UUID originalTextureID = so.RootPart.Shape.Textures.GetFace(0).TextureID; | 73 | UUID originalTextureID = so.RootPart.Shape.Textures.GetFace(0).TextureID; |
70 | 74 | ||
@@ -86,6 +90,7 @@ namespace OpenSim.Region.CoreModules.Scripting.VectorRender.Tests | |||
86 | 90 | ||
87 | string dtText = "PenColour BLACK; MoveTo 40,220; FontSize 32; Text Hello World;"; | 91 | string dtText = "PenColour BLACK; MoveTo 40,220; FontSize 32; Text Hello World;"; |
88 | 92 | ||
93 | SetupScene(false); | ||
89 | SceneObjectGroup so = SceneHelpers.AddSceneObject(m_scene); | 94 | SceneObjectGroup so = SceneHelpers.AddSceneObject(m_scene); |
90 | 95 | ||
91 | m_dtm.AddDynamicTextureData( | 96 | m_dtm.AddDynamicTextureData( |
@@ -116,6 +121,7 @@ namespace OpenSim.Region.CoreModules.Scripting.VectorRender.Tests | |||
116 | 121 | ||
117 | string dtText = "PenColour BLACK; MoveTo 40,220; FontSize 32; Text Hello World;"; | 122 | string dtText = "PenColour BLACK; MoveTo 40,220; FontSize 32; Text Hello World;"; |
118 | 123 | ||
124 | SetupScene(false); | ||
119 | SceneObjectGroup so = SceneHelpers.AddSceneObject(m_scene); | 125 | SceneObjectGroup so = SceneHelpers.AddSceneObject(m_scene); |
120 | 126 | ||
121 | m_dtm.AddDynamicTextureData( | 127 | m_dtm.AddDynamicTextureData( |
@@ -147,6 +153,121 @@ namespace OpenSim.Region.CoreModules.Scripting.VectorRender.Tests | |||
147 | string dtText | 153 | string dtText |
148 | = "PenColour BLACK; MoveTo 40,220; FontSize 32; Text Hello World; Image http://localhost/shouldnotexist.png"; | 154 | = "PenColour BLACK; MoveTo 40,220; FontSize 32; Text Hello World; Image http://localhost/shouldnotexist.png"; |
149 | 155 | ||
156 | SetupScene(false); | ||
157 | SceneObjectGroup so = SceneHelpers.AddSceneObject(m_scene); | ||
158 | |||
159 | m_dtm.AddDynamicTextureData( | ||
160 | m_scene.RegionInfo.RegionID, | ||
161 | so.UUID, | ||
162 | m_vrm.GetContentType(), | ||
163 | dtText, | ||
164 | "", | ||
165 | 0); | ||
166 | |||
167 | UUID firstDynamicTextureID = so.RootPart.Shape.Textures.GetFace(0).TextureID; | ||
168 | |||
169 | m_dtm.AddDynamicTextureData( | ||
170 | m_scene.RegionInfo.RegionID, | ||
171 | so.UUID, | ||
172 | m_vrm.GetContentType(), | ||
173 | dtText, | ||
174 | "", | ||
175 | 0); | ||
176 | |||
177 | Assert.That(firstDynamicTextureID, Is.Not.EqualTo(so.RootPart.Shape.Textures.GetFace(0).TextureID)); | ||
178 | } | ||
179 | |||
180 | [Test] | ||
181 | public void TestDrawReusingTexture() | ||
182 | { | ||
183 | TestHelpers.InMethod(); | ||
184 | |||
185 | SetupScene(true); | ||
186 | SceneObjectGroup so = SceneHelpers.AddSceneObject(m_scene); | ||
187 | UUID originalTextureID = so.RootPart.Shape.Textures.GetFace(0).TextureID; | ||
188 | |||
189 | m_dtm.AddDynamicTextureData( | ||
190 | m_scene.RegionInfo.RegionID, | ||
191 | so.UUID, | ||
192 | m_vrm.GetContentType(), | ||
193 | "PenColour BLACK; MoveTo 40,220; FontSize 32; Text Hello World;", | ||
194 | "", | ||
195 | 0); | ||
196 | |||
197 | Assert.That(originalTextureID, Is.Not.EqualTo(so.RootPart.Shape.Textures.GetFace(0).TextureID)); | ||
198 | } | ||
199 | |||
200 | [Test] | ||
201 | public void TestRepeatSameDrawReusingTexture() | ||
202 | { | ||
203 | TestHelpers.InMethod(); | ||
204 | |||
205 | string dtText = "PenColour BLACK; MoveTo 40,220; FontSize 32; Text Hello World;"; | ||
206 | |||
207 | SetupScene(true); | ||
208 | SceneObjectGroup so = SceneHelpers.AddSceneObject(m_scene); | ||
209 | |||
210 | m_dtm.AddDynamicTextureData( | ||
211 | m_scene.RegionInfo.RegionID, | ||
212 | so.UUID, | ||
213 | m_vrm.GetContentType(), | ||
214 | dtText, | ||
215 | "", | ||
216 | 0); | ||
217 | |||
218 | UUID firstDynamicTextureID = so.RootPart.Shape.Textures.GetFace(0).TextureID; | ||
219 | |||
220 | m_dtm.AddDynamicTextureData( | ||
221 | m_scene.RegionInfo.RegionID, | ||
222 | so.UUID, | ||
223 | m_vrm.GetContentType(), | ||
224 | dtText, | ||
225 | "", | ||
226 | 0); | ||
227 | |||
228 | Assert.That(firstDynamicTextureID, Is.EqualTo(so.RootPart.Shape.Textures.GetFace(0).TextureID)); | ||
229 | } | ||
230 | |||
231 | [Test] | ||
232 | public void TestRepeatSameDrawDifferentExtraParamsReusingTexture() | ||
233 | { | ||
234 | TestHelpers.InMethod(); | ||
235 | |||
236 | string dtText = "PenColour BLACK; MoveTo 40,220; FontSize 32; Text Hello World;"; | ||
237 | |||
238 | SetupScene(true); | ||
239 | SceneObjectGroup so = SceneHelpers.AddSceneObject(m_scene); | ||
240 | |||
241 | m_dtm.AddDynamicTextureData( | ||
242 | m_scene.RegionInfo.RegionID, | ||
243 | so.UUID, | ||
244 | m_vrm.GetContentType(), | ||
245 | dtText, | ||
246 | "", | ||
247 | 0); | ||
248 | |||
249 | UUID firstDynamicTextureID = so.RootPart.Shape.Textures.GetFace(0).TextureID; | ||
250 | |||
251 | m_dtm.AddDynamicTextureData( | ||
252 | m_scene.RegionInfo.RegionID, | ||
253 | so.UUID, | ||
254 | m_vrm.GetContentType(), | ||
255 | dtText, | ||
256 | "alpha:250", | ||
257 | 0); | ||
258 | |||
259 | Assert.That(firstDynamicTextureID, Is.Not.EqualTo(so.RootPart.Shape.Textures.GetFace(0).TextureID)); | ||
260 | } | ||
261 | |||
262 | [Test] | ||
263 | public void TestRepeatSameDrawContainingImageReusingTexture() | ||
264 | { | ||
265 | TestHelpers.InMethod(); | ||
266 | |||
267 | string dtText | ||
268 | = "PenColour BLACK; MoveTo 40,220; FontSize 32; Text Hello World; Image http://localhost/shouldnotexist.png"; | ||
269 | |||
270 | SetupScene(true); | ||
150 | SceneObjectGroup so = SceneHelpers.AddSceneObject(m_scene); | 271 | SceneObjectGroup so = SceneHelpers.AddSceneObject(m_scene); |
151 | 272 | ||
152 | m_dtm.AddDynamicTextureData( | 273 | m_dtm.AddDynamicTextureData( |
diff --git a/OpenSim/Region/CoreModules/Scripting/VectorRender/VectorRenderModule.cs b/OpenSim/Region/CoreModules/Scripting/VectorRender/VectorRenderModule.cs index 3a758c5..4268f2e 100644 --- a/OpenSim/Region/CoreModules/Scripting/VectorRender/VectorRenderModule.cs +++ b/OpenSim/Region/CoreModules/Scripting/VectorRender/VectorRenderModule.cs | |||
@@ -30,6 +30,7 @@ using System.Drawing; | |||
30 | using System.Drawing.Imaging; | 30 | using System.Drawing.Imaging; |
31 | using System.Globalization; | 31 | using System.Globalization; |
32 | using System.IO; | 32 | using System.IO; |
33 | using System.Linq; | ||
33 | using System.Net; | 34 | using System.Net; |
34 | using Nini.Config; | 35 | using Nini.Config; |
35 | using OpenMetaverse; | 36 | using OpenMetaverse; |
@@ -73,6 +74,12 @@ namespace OpenSim.Region.CoreModules.Scripting.VectorRender | |||
73 | return true; | 74 | return true; |
74 | } | 75 | } |
75 | 76 | ||
77 | // public bool AlwaysIdenticalConversion(string bodyData, string extraParams) | ||
78 | // { | ||
79 | // string[] lines = GetLines(bodyData); | ||
80 | // return lines.Any((str, r) => str.StartsWith("Image")); | ||
81 | // } | ||
82 | |||
76 | public byte[] ConvertUrl(string url, string extraParams) | 83 | public byte[] ConvertUrl(string url, string extraParams) |
77 | { | 84 | { |
78 | return null; | 85 | return null; |
@@ -80,7 +87,13 @@ namespace OpenSim.Region.CoreModules.Scripting.VectorRender | |||
80 | 87 | ||
81 | public byte[] ConvertData(string bodyData, string extraParams) | 88 | public byte[] ConvertData(string bodyData, string extraParams) |
82 | { | 89 | { |
83 | return Draw(bodyData, extraParams); | 90 | bool reuseable; |
91 | return Draw(bodyData, extraParams, out reuseable); | ||
92 | } | ||
93 | |||
94 | private byte[] ConvertData(string bodyData, string extraParams, out bool reuseable) | ||
95 | { | ||
96 | return Draw(bodyData, extraParams, out reuseable); | ||
84 | } | 97 | } |
85 | 98 | ||
86 | public bool AsyncConvertUrl(UUID id, string url, string extraParams) | 99 | public bool AsyncConvertUrl(UUID id, string url, string extraParams) |
@@ -91,7 +104,11 @@ namespace OpenSim.Region.CoreModules.Scripting.VectorRender | |||
91 | public bool AsyncConvertData(UUID id, string bodyData, string extraParams) | 104 | public bool AsyncConvertData(UUID id, string bodyData, string extraParams) |
92 | { | 105 | { |
93 | // XXX: This isn't actually being done asynchronously! | 106 | // XXX: This isn't actually being done asynchronously! |
94 | m_textureManager.ReturnData(id, ConvertData(bodyData, extraParams)); | 107 | bool reuseable; |
108 | byte[] data = ConvertData(bodyData, extraParams, out reuseable); | ||
109 | |||
110 | m_textureManager.ReturnData(id, data, reuseable); | ||
111 | |||
95 | return true; | 112 | return true; |
96 | } | 113 | } |
97 | 114 | ||
@@ -162,7 +179,7 @@ namespace OpenSim.Region.CoreModules.Scripting.VectorRender | |||
162 | 179 | ||
163 | #endregion | 180 | #endregion |
164 | 181 | ||
165 | private byte[] Draw(string data, string extraParams) | 182 | private byte[] Draw(string data, string extraParams, out bool reuseable) |
166 | { | 183 | { |
167 | // We need to cater for old scripts that didnt use extraParams neatly, they use either an integer size which represents both width and height, or setalpha | 184 | // We need to cater for old scripts that didnt use extraParams neatly, they use either an integer size which represents both width and height, or setalpha |
168 | // we will now support multiple comma seperated params in the form width:256,height:512,alpha:255 | 185 | // we will now support multiple comma seperated params in the form width:256,height:512,alpha:255 |
@@ -343,7 +360,7 @@ namespace OpenSim.Region.CoreModules.Scripting.VectorRender | |||
343 | } | 360 | } |
344 | } | 361 | } |
345 | 362 | ||
346 | GDIDraw(data, graph, altDataDelim); | 363 | GDIDraw(data, graph, altDataDelim, out reuseable); |
347 | } | 364 | } |
348 | 365 | ||
349 | byte[] imageJ2000 = new byte[0]; | 366 | byte[] imageJ2000 = new byte[0]; |
@@ -434,8 +451,21 @@ namespace OpenSim.Region.CoreModules.Scripting.VectorRender | |||
434 | } | 451 | } |
435 | */ | 452 | */ |
436 | 453 | ||
437 | private void GDIDraw(string data, Graphics graph, char dataDelim) | 454 | /// <summary> |
455 | /// Split input data into discrete command lines. | ||
456 | /// </summary> | ||
457 | /// <returns></returns> | ||
458 | /// <param name='data'></param> | ||
459 | /// <param name='dataDelim'></param> | ||
460 | private string[] GetLines(string data, char dataDelim) | ||
438 | { | 461 | { |
462 | char[] lineDelimiter = { dataDelim }; | ||
463 | return data.Split(lineDelimiter); | ||
464 | } | ||
465 | |||
466 | private void GDIDraw(string data, Graphics graph, char dataDelim, out bool reuseable) | ||
467 | { | ||
468 | reuseable = true; | ||
439 | Point startPoint = new Point(0, 0); | 469 | Point startPoint = new Point(0, 0); |
440 | Point endPoint = new Point(0, 0); | 470 | Point endPoint = new Point(0, 0); |
441 | Pen drawPen = null; | 471 | Pen drawPen = null; |
@@ -450,11 +480,9 @@ namespace OpenSim.Region.CoreModules.Scripting.VectorRender | |||
450 | myFont = new Font(fontName, fontSize); | 480 | myFont = new Font(fontName, fontSize); |
451 | myBrush = new SolidBrush(Color.Black); | 481 | myBrush = new SolidBrush(Color.Black); |
452 | 482 | ||
453 | char[] lineDelimiter = {dataDelim}; | ||
454 | char[] partsDelimiter = {','}; | 483 | char[] partsDelimiter = {','}; |
455 | string[] lines = data.Split(lineDelimiter); | ||
456 | 484 | ||
457 | foreach (string line in lines) | 485 | foreach (string line in GetLines(data, dataDelim)) |
458 | { | 486 | { |
459 | string nextLine = line.Trim(); | 487 | string nextLine = line.Trim(); |
460 | //replace with switch, or even better, do some proper parsing | 488 | //replace with switch, or even better, do some proper parsing |
@@ -485,6 +513,10 @@ namespace OpenSim.Region.CoreModules.Scripting.VectorRender | |||
485 | } | 513 | } |
486 | else if (nextLine.StartsWith("Image")) | 514 | else if (nextLine.StartsWith("Image")) |
487 | { | 515 | { |
516 | // We cannot reuse any generated texture involving fetching an image via HTTP since that image | ||
517 | // can change. | ||
518 | reuseable = false; | ||
519 | |||
488 | float x = 0; | 520 | float x = 0; |
489 | float y = 0; | 521 | float y = 0; |
490 | GetParams(partsDelimiter, ref nextLine, 5, ref x, ref y); | 522 | GetParams(partsDelimiter, ref nextLine, 5, ref x, ref y); |