aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Environment/Modules/VectorRenderModule.cs
diff options
context:
space:
mode:
authorMW2008-03-08 20:54:34 +0000
committerMW2008-03-08 20:54:34 +0000
commitd340820826635069813e088f6c17266fbeadd393 (patch)
tree7d1a3b53a267dbd2e4b1f95d79ba3639639c0558 /OpenSim/Region/Environment/Modules/VectorRenderModule.cs
parent* Implemented 'Revert' channel in Terrain Module. (diff)
downloadopensim-SC_OLD-d340820826635069813e088f6c17266fbeadd393.zip
opensim-SC_OLD-d340820826635069813e088f6c17266fbeadd393.tar.gz
opensim-SC_OLD-d340820826635069813e088f6c17266fbeadd393.tar.bz2
opensim-SC_OLD-d340820826635069813e088f6c17266fbeadd393.tar.xz
Added Frist basic version on the VectorRenderModule, that allows scripts to do some basic drawing onto textures. Currently the method the scripts have to use is most likely not the most user friendly, but this should improve soon. And hope to allow SVG files (either loaded from a web site, or even script created) to be used. I will add a page to the wiki tomorrow, until then http://www.pastebin.ca/934425 is a example c# script that can be used to get a bit of a idea.
Also added osSetDynamicTextureDataBlend and osSetDynamicTextureURLBlend that will allow the various textures to be blended together, but currently there are still a few bugs in them. So not ready for use yet.
Diffstat (limited to 'OpenSim/Region/Environment/Modules/VectorRenderModule.cs')
-rw-r--r--OpenSim/Region/Environment/Modules/VectorRenderModule.cs308
1 files changed, 308 insertions, 0 deletions
diff --git a/OpenSim/Region/Environment/Modules/VectorRenderModule.cs b/OpenSim/Region/Environment/Modules/VectorRenderModule.cs
new file mode 100644
index 0000000..d033170
--- /dev/null
+++ b/OpenSim/Region/Environment/Modules/VectorRenderModule.cs
@@ -0,0 +1,308 @@
1
2using System;
3using System.Drawing;
4using System.IO;
5using System.Net;
6using System.Globalization;
7using libsecondlife;
8using Nini.Config;
9using OpenJPEGNet;
10using OpenSim.Framework;
11using OpenSim.Region.Environment.Interfaces;
12using OpenSim.Region.Environment.Scenes;
13//using Cairo;
14
15namespace OpenSim.Region.Environment.Modules
16{
17 public class VectorRenderModule : IRegionModule, IDynamicTextureRender
18 {
19 private Scene m_scene;
20 private string m_name = "VectorRenderModule";
21 private IDynamicTextureManager m_textureManager;
22
23 public VectorRenderModule()
24 {
25 }
26
27 public void Initialise(Scene scene, IConfigSource config)
28 {
29 if (m_scene == null)
30 {
31 m_scene = scene;
32 }
33 }
34
35 public void PostInitialise()
36 {
37 m_textureManager = m_scene.RequestModuleInterface<IDynamicTextureManager>();
38 if (m_textureManager != null)
39 {
40 m_textureManager.RegisterRender(GetContentType(), this);
41 }
42 }
43
44 public void Close()
45 {
46 }
47
48 public string Name
49 {
50 get { return m_name; }
51 }
52
53 public bool IsSharedModule
54 {
55 get { return true; }
56 }
57
58 private void Draw(string data, LLUUID id, string extraParams)
59 {
60 Bitmap bitmap = new Bitmap(256, 256, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
61
62 System.Drawing.Graphics graph = System.Drawing.Graphics.FromImage(bitmap);
63
64 extraParams = extraParams.ToLower();
65 int alpha = 255;
66 if (extraParams == "setalpha")
67 {
68 alpha = 0;
69 }
70 else
71 {
72 graph.FillRectangle(new SolidBrush(Color.White), 0, 0, 256, 256);
73 }
74
75 for (int w = 0; w < bitmap.Width; w++)
76 {
77 for (int h = 0; h < bitmap.Height; h++)
78 {
79 bitmap.SetPixel(w, h, Color.FromArgb(alpha, bitmap.GetPixel(w, h)));
80 }
81 }
82
83
84
85 GDIDraw(data, graph);
86
87 byte[] imageJ2000 = OpenJPEG.EncodeFromImage(bitmap, true);
88 m_textureManager.ReturnData(id, imageJ2000);
89
90 }
91
92 /* private void CairoDraw(string data, System.Drawing.Graphics graph)
93 {
94 using (Win32Surface draw = new Win32Surface(graph.GetHdc()))
95 {
96 Context contex = new Context(draw);
97
98 contex.Antialias = Antialias.None; //fastest method but low quality
99 contex.LineWidth = 7;
100 char[] lineDelimiter = { ';' };
101 char[] partsDelimiter = { ',' };
102 string[] lines = data.Split(lineDelimiter);
103
104 foreach (string line in lines)
105 {
106 string nextLine = line.Trim();
107
108 if (nextLine.StartsWith("MoveTO"))
109 {
110 float x = 0;
111 float y = 0;
112 GetParams(partsDelimiter, ref nextLine, ref x, ref y);
113 contex.MoveTo(x, y);
114 }
115 else if (nextLine.StartsWith("LineTo"))
116 {
117 float x = 0;
118 float y = 0;
119 GetParams(partsDelimiter, ref nextLine, ref x, ref y);
120 contex.LineTo(x, y);
121 contex.Stroke();
122 }
123 }
124 }
125 graph.ReleaseHdc();
126 }*/
127
128 private void GDIDraw(string data, System.Drawing.Graphics graph)
129 {
130 System.Drawing.Point startPoint = new System.Drawing.Point(0, 0);
131 System.Drawing.Point endPoint = new System.Drawing.Point(0, 0);
132 System.Drawing.Pen drawPen = new Pen(System.Drawing.Color.Black, 7);
133 Font myFont = new Font("Times New Roman", 14);
134 SolidBrush myBrush = new SolidBrush(Color.Black);
135 char[] lineDelimiter = { ';' };
136 char[] partsDelimiter = { ',' };
137 string[] lines = data.Split(lineDelimiter);
138
139
140 foreach (string line in lines)
141 {
142 string nextLine = line.Trim();
143
144 if (nextLine.StartsWith("MoveTo"))
145 {
146 float x = 0;
147 float y = 0;
148 GetParams(partsDelimiter, ref nextLine, 6, ref x, ref y);
149 startPoint.X = (int)x;
150 startPoint.Y = (int)y;
151 }
152 else if (nextLine.StartsWith("LineTo"))
153 {
154 float x = 0;
155 float y = 0;
156 GetParams(partsDelimiter, ref nextLine, 6, ref x, ref y);
157 endPoint.X = (int)x;
158 endPoint.Y = (int)y;
159 graph.DrawLine(drawPen, startPoint, endPoint);
160 startPoint.X = endPoint.X;
161 startPoint.Y = endPoint.Y;
162 }
163 else if (nextLine.StartsWith("Text"))
164 {
165 nextLine = nextLine.Remove(0, 4);
166 nextLine = nextLine.Trim();
167 graph.DrawString(nextLine, myFont, myBrush, startPoint);
168 }
169 else if (nextLine.StartsWith("Image"))
170 {
171 float x = 0;
172 float y = 0;
173 GetParams(partsDelimiter, ref nextLine, 5, ref x, ref y);
174 endPoint.X = (int)x;
175 endPoint.Y = (int)y;
176 System.Drawing.Image image = ImageHttpRequest(nextLine);
177 graph.DrawImage(image, (float)startPoint.X, (float)startPoint.Y, x, y);
178 startPoint.X += endPoint.X;
179 startPoint.Y += endPoint.Y;
180 }
181 else if (nextLine.StartsWith("Rectangle"))
182 {
183 float x = 0;
184 float y = 0;
185 GetParams(partsDelimiter, ref nextLine, 9, ref x, ref y);
186 endPoint.X = (int)x;
187 endPoint.Y = (int)y;
188 graph.DrawRectangle(drawPen, startPoint.X, startPoint.Y, endPoint.X, endPoint.Y);
189 startPoint.X += endPoint.X;
190 startPoint.Y += endPoint.Y;
191 }
192 else if (nextLine.StartsWith("FillRectangle"))
193 {
194 float x = 0;
195 float y = 0;
196 GetParams(partsDelimiter, ref nextLine, 13, ref x, ref y);
197 endPoint.X = (int)x;
198 endPoint.Y = (int)y;
199 graph.FillRectangle(myBrush, startPoint.X, startPoint.Y, endPoint.X, endPoint.Y);
200 startPoint.X += endPoint.X;
201 startPoint.Y += endPoint.Y;
202 }
203 else if (nextLine.StartsWith("Ellipse"))
204 {
205 float x = 0;
206 float y = 0;
207 GetParams(partsDelimiter, ref nextLine, 7, ref x, ref y);
208 endPoint.X = (int)x;
209 endPoint.Y = (int)y;
210 graph.DrawEllipse(drawPen, startPoint.X, startPoint.Y, endPoint.X, endPoint.Y);
211 startPoint.X += endPoint.X;
212 startPoint.Y += endPoint.Y;
213 }
214 else if (nextLine.StartsWith("FontSize"))
215 {
216 nextLine = nextLine.Remove(0, 8);
217 nextLine = nextLine.Trim();
218 float size = Convert.ToSingle(nextLine, CultureInfo.InvariantCulture);
219 myFont = new Font("Times New Roman", size);
220 }
221 else if (nextLine.StartsWith("PenSize"))
222 {
223 nextLine = nextLine.Remove(0, 8);
224 nextLine = nextLine.Trim();
225 float size = Convert.ToSingle(nextLine, CultureInfo.InvariantCulture);
226 drawPen.Width = size;
227 }
228 }
229 }
230
231 private static void GetParams(char[] partsDelimiter, ref string line, int startLength, ref float x, ref float y)
232 {
233 line = line.Remove(0, startLength);
234 string[] parts = line.Split(partsDelimiter);
235 if (parts.Length == 2)
236 {
237 string xVal = parts[0].Trim();
238 string yVal = parts[1].Trim();
239 x = Convert.ToSingle(xVal, CultureInfo.InvariantCulture);
240 y = Convert.ToSingle(yVal, CultureInfo.InvariantCulture);
241 }
242 else if (parts.Length > 2)
243 {
244 string xVal = parts[0].Trim();
245 string yVal = parts[1].Trim();
246 x = Convert.ToSingle(xVal, CultureInfo.InvariantCulture);
247 y = Convert.ToSingle(yVal, CultureInfo.InvariantCulture);
248
249 line = "";
250 for (int i = 2; i < parts.Length; i++)
251 {
252 line = line + parts[i].Trim();
253 line = line + " ";
254 }
255 }
256 }
257
258 private Bitmap ImageHttpRequest(string url)
259 {
260 WebRequest request = HttpWebRequest.Create(url);
261 Stream str = null;
262 HttpWebResponse response = (HttpWebResponse)(request).GetResponse();
263 if (response.StatusCode == HttpStatusCode.OK)
264 {
265 Bitmap image = new Bitmap(response.GetResponseStream());
266 return image;
267 }
268
269 return null;
270 }
271
272 public string GetContentType()
273 {
274 return ("vector");
275 }
276
277 public string GetName()
278 {
279 return m_name;
280 }
281
282 public bool SupportsAsynchronous()
283 {
284 return true;
285 }
286
287 public byte[] ConvertUrl(string url, string extraParams)
288 {
289 return null;
290 }
291
292 public byte[] ConvertStream(Stream data, string extraParams)
293 {
294 return null;
295 }
296
297 public bool AsyncConvertUrl(LLUUID id, string url, string extraParams)
298 {
299 return false;
300 }
301
302 public bool AsyncConvertData(LLUUID id, string bodyData, string extraParams)
303 {
304 Draw(bodyData, id, extraParams);
305 return true;
306 }
307 }
308} \ No newline at end of file