diff options
Diffstat (limited to 'OpenSim/Region/Physics/Meshing/Extruder.cs')
-rw-r--r-- | OpenSim/Region/Physics/Meshing/Extruder.cs | 211 |
1 files changed, 211 insertions, 0 deletions
diff --git a/OpenSim/Region/Physics/Meshing/Extruder.cs b/OpenSim/Region/Physics/Meshing/Extruder.cs index c7dcf33..480ffda 100644 --- a/OpenSim/Region/Physics/Meshing/Extruder.cs +++ b/OpenSim/Region/Physics/Meshing/Extruder.cs | |||
@@ -47,6 +47,21 @@ namespace OpenSim.Region.Physics.Meshing | |||
47 | public float twistTop = 0; | 47 | public float twistTop = 0; |
48 | public float twistBot = 0; | 48 | public float twistBot = 0; |
49 | public float twistMid = 0; | 49 | public float twistMid = 0; |
50 | public float pathScaleX = 1.0f; | ||
51 | public float pathScaleY = 0.5f; | ||
52 | public float skew = 0.0f; | ||
53 | public float radius = 0.0f; | ||
54 | public float revolutions = 1.0f; | ||
55 | |||
56 | public float pathCutBegin = 0.0f; | ||
57 | public float pathCutEnd = 1.0f; | ||
58 | |||
59 | public ushort pathBegin = 0; | ||
60 | public ushort pathEnd = 0; | ||
61 | |||
62 | public float pathTaperX = 0.0f; | ||
63 | public float pathTaperY = 0.0f; | ||
64 | |||
50 | 65 | ||
51 | public Mesh Extrude(Mesh m) | 66 | public Mesh Extrude(Mesh m) |
52 | { | 67 | { |
@@ -230,5 +245,201 @@ namespace OpenSim.Region.Physics.Meshing | |||
230 | } | 245 | } |
231 | return result; | 246 | return result; |
232 | } | 247 | } |
248 | public Mesh ExtrudeCircularPath(Mesh m) | ||
249 | { | ||
250 | //startParameter = float.MinValue; | ||
251 | //stopParameter = float.MaxValue; | ||
252 | // Currently only works for iSteps=1; | ||
253 | Mesh result = new Mesh(); | ||
254 | |||
255 | Quaternion tt = new Quaternion(); | ||
256 | Vertex v2 = new Vertex(0, 0, 0); | ||
257 | |||
258 | Mesh newLayer; | ||
259 | Mesh lastLayer = null; | ||
260 | |||
261 | int start = 0; | ||
262 | int step; | ||
263 | int steps = 24; | ||
264 | |||
265 | float twistTotal = twistTop - twistBot; | ||
266 | if (System.Math.Abs(twistTotal) > (float)System.Math.PI * 1.5) steps *= 2; | ||
267 | if (System.Math.Abs(twistTotal) > (float)System.Math.PI * 3.0) steps *= 2; | ||
268 | |||
269 | double percentOfPathMultiplier = 1.0 / steps; | ||
270 | double angleStepMultiplier = System.Math.PI * 2.0 / steps; | ||
271 | |||
272 | //System.Console.WriteLine("twistTop: " + twistTop.ToString() + " twistbot: " + twistBot.ToString() + " twisttotal: " + twistTotal.ToString()); | ||
273 | |||
274 | float yPathScale = pathScaleY * 0.5f; | ||
275 | float skewStart = -skew; | ||
276 | float skewOffset = 0.0f; | ||
277 | float totalSkew = skew * 2.0f; | ||
278 | |||
279 | |||
280 | float startAngle = (float)(System.Math.PI * 2.0 * pathCutBegin * revolutions); | ||
281 | float endAngle = (float)(System.Math.PI * 2.0 * pathCutEnd * revolutions); | ||
282 | float stepSize = (float)0.2617993878; // 2*PI / 24 segments | ||
283 | step = (int)(startAngle / stepSize); | ||
284 | float angle = startAngle; | ||
285 | |||
286 | float xProfileScale = 1.0f; | ||
287 | float yProfileScale = 1.0f; | ||
288 | |||
289 | //System.Console.WriteLine("startAngle: " + startAngle.ToString() + " endAngle: " + endAngle.ToString() + " step: " + step.ToString()); | ||
290 | bool done = false; | ||
291 | |||
292 | //System.Console.WriteLine(" PathScaleX: " + pathScaleX.ToString() + " pathScaleY: " + pathScaleY.ToString()); | ||
293 | |||
294 | //System.Console.WriteLine("taperBotFactorX: " + taperBotFactorX.ToString() + " taperBotFactorY: " + taperBotFactorY.ToString() | ||
295 | // + " taperTopFactorX: " + taperTopFactorX.ToString() + " taperTopFactorY: " + taperTopFactorY.ToString()); | ||
296 | |||
297 | |||
298 | |||
299 | do | ||
300 | { | ||
301 | float percentOfPath = 1.0f; | ||
302 | |||
303 | percentOfPath = (angle - startAngle) / (endAngle - startAngle); // endAngle should always be larger than startAngle | ||
304 | |||
305 | // System.Console.WriteLine("angle: " + angle.ToString() + " percentOfPath: " + percentOfPath.ToString()); | ||
306 | |||
307 | if (pathTaperX > 0.001f) // can't really compare to 0.0f as the value passed is never exactly zero | ||
308 | xProfileScale = 1.0f - percentOfPath * pathTaperX; | ||
309 | else if (pathTaperX < -0.001f) | ||
310 | xProfileScale = 1.0f + (1.0f - percentOfPath) * pathTaperX; | ||
311 | else xProfileScale = 1.0f; | ||
312 | |||
313 | if (pathTaperY > 0.001f) | ||
314 | yProfileScale = 1.0f - percentOfPath * pathTaperY; | ||
315 | else if (pathTaperY < -0.001f) | ||
316 | yProfileScale = 1.0f + (1.0f - percentOfPath) * pathTaperY; | ||
317 | else yProfileScale = 1.0f; | ||
318 | |||
319 | float radiusScale; | ||
320 | |||
321 | if (radius > 0.001f) | ||
322 | radiusScale = 1.0f - radius * percentOfPath; | ||
323 | else if (radius < 0.001f) | ||
324 | radiusScale = 1.0f + radius * (1.0f - percentOfPath); | ||
325 | else radiusScale = 1.0f; | ||
326 | |||
327 | //radiusScale = 1.0f; | ||
328 | |||
329 | //System.Console.WriteLine("Extruder: radius: " + radius.ToString() + " radiusScale: " + radiusScale.ToString()); | ||
330 | |||
331 | |||
332 | |||
333 | |||
334 | |||
335 | float twist = twistBot + (twistTotal * (float)percentOfPath); | ||
336 | |||
337 | float zOffset = (float)(System.Math.Sin(angle) * (0.5f - yPathScale)) * radiusScale; | ||
338 | float yOffset = (float)(System.Math.Cos(angle) * (0.5f - yPathScale)) * radiusScale; | ||
339 | float xOffset = 0.5f * (skewStart + totalSkew * (float)percentOfPath); | ||
340 | |||
341 | newLayer = m.Clone(); | ||
342 | |||
343 | Vertex vTemp = new Vertex(0.0f, 0.0f, 0.0f); | ||
344 | |||
345 | if (twistTotal != 0.0f || twistBot != 0.0f) | ||
346 | { | ||
347 | Quaternion profileRot = new Quaternion(new Vertex(0.0f, 0.0f, -1.0f), twist); | ||
348 | foreach (Vertex v in newLayer.vertices) | ||
349 | { | ||
350 | if (v != null) | ||
351 | { | ||
352 | vTemp = v * profileRot; | ||
353 | v.X = vTemp.X; | ||
354 | v.Y = vTemp.Y; | ||
355 | v.Z = vTemp.Z; | ||
356 | } | ||
357 | } | ||
358 | } | ||
359 | |||
360 | Quaternion layerRot = new Quaternion(new Vertex(-1.0f, 0.0f, 0.0f), (float)angle); | ||
361 | foreach (Vertex v in newLayer.vertices) | ||
362 | { | ||
363 | if (v != null) | ||
364 | { | ||
365 | vTemp = v * layerRot; | ||
366 | v.X = xProfileScale * vTemp.X + xOffset; | ||
367 | v.Y = yProfileScale * vTemp.Y + yOffset; | ||
368 | v.Z = vTemp.Z + zOffset; | ||
369 | } | ||
370 | } | ||
371 | |||
372 | if (angle == startAngle) // last layer, invert normals | ||
373 | foreach (Triangle t in newLayer.triangles) | ||
374 | { | ||
375 | t.invertNormal(); | ||
376 | } | ||
377 | |||
378 | result.Append(newLayer); | ||
379 | |||
380 | int iLastNull = 0; | ||
381 | |||
382 | if (lastLayer != null) | ||
383 | { | ||
384 | int i, count = newLayer.vertices.Count; | ||
385 | |||
386 | for (i = 0; i < count; i++) | ||
387 | { | ||
388 | int iNext = (i + 1); | ||
389 | |||
390 | if (lastLayer.vertices[i] == null) // cant make a simplex here | ||
391 | iLastNull = i + 1; | ||
392 | else | ||
393 | { | ||
394 | if (i == count - 1) // End of list | ||
395 | iNext = iLastNull; | ||
396 | |||
397 | if (lastLayer.vertices[iNext] == null) // Null means wrap to begin of last segment | ||
398 | iNext = iLastNull; | ||
399 | |||
400 | result.Add(new Triangle(newLayer.vertices[i], lastLayer.vertices[i], newLayer.vertices[iNext])); | ||
401 | result.Add(new Triangle(newLayer.vertices[iNext], lastLayer.vertices[i], lastLayer.vertices[iNext])); | ||
402 | } | ||
403 | } | ||
404 | } | ||
405 | lastLayer = newLayer; | ||
406 | |||
407 | |||
408 | |||
409 | |||
410 | |||
411 | |||
412 | |||
413 | |||
414 | // calc next angle | ||
415 | |||
416 | if (angle >= endAngle) | ||
417 | done = true; | ||
418 | else | ||
419 | { | ||
420 | angle = stepSize * ++step; | ||
421 | if (angle > endAngle) | ||
422 | angle = endAngle; | ||
423 | } | ||
424 | } | ||
425 | while (!done); | ||
426 | |||
427 | |||
428 | |||
429 | // scale the mesh to the desired size | ||
430 | float xScale = size.X; | ||
431 | float yScale = size.Y; | ||
432 | float zScale = size.Z; | ||
433 | |||
434 | foreach (Vertex v in result.vertices) | ||
435 | if (v != null) | ||
436 | { | ||
437 | v.X *= xScale; | ||
438 | v.Y *= yScale; | ||
439 | v.Z *= zScale; | ||
440 | } | ||
441 | |||
442 | return result; | ||
443 | } | ||
233 | } | 444 | } |
234 | } | 445 | } |