diff options
-rw-r--r-- | OpenSim/Region/Physics/Meshing/Extruder.cs | 57 |
1 files changed, 36 insertions, 21 deletions
diff --git a/OpenSim/Region/Physics/Meshing/Extruder.cs b/OpenSim/Region/Physics/Meshing/Extruder.cs index 3941107..880a23a 100644 --- a/OpenSim/Region/Physics/Meshing/Extruder.cs +++ b/OpenSim/Region/Physics/Meshing/Extruder.cs | |||
@@ -255,7 +255,6 @@ namespace OpenSim.Region.Physics.Meshing | |||
255 | Mesh newLayer; | 255 | Mesh newLayer; |
256 | Mesh lastLayer = null; | 256 | Mesh lastLayer = null; |
257 | 257 | ||
258 | //int start = 0; | ||
259 | int step; | 258 | int step; |
260 | int steps = 24; | 259 | int steps = 24; |
261 | 260 | ||
@@ -274,8 +273,17 @@ namespace OpenSim.Region.Physics.Meshing | |||
274 | float totalSkew = skew * 2.0f * pathLength; | 273 | float totalSkew = skew * 2.0f * pathLength; |
275 | float skewStart = (-skew) + pathCutBegin * 2.0f * skew; | 274 | float skewStart = (-skew) + pathCutBegin * 2.0f * skew; |
276 | 275 | ||
277 | float startAngle = (float)(System.Math.PI * 2.0 * pathCutBegin * revolutions); | 276 | // It's not quite clear what pushY (Y top shear) does, but subtracting it from the start and end |
278 | float endAngle = (float)(System.Math.PI * 2.0 * pathCutEnd * revolutions); | 277 | // angles appears to approximate it's effects on path cut. Likewise, adding it to the angle used |
278 | // to calculate the sine for generating the path radius appears to approximate it's effects there | ||
279 | // too, but there are some subtle differences in the radius which are noticeable as the prim size | ||
280 | // increases and it may affect megaprims quite a bit. The effect of the Y top shear parameter on | ||
281 | // the meshes generated with this technique appear nearly identical in shape to the same prims when | ||
282 | // displayed by the viewer. | ||
283 | |||
284 | |||
285 | float startAngle = (float)(System.Math.PI * 2.0 * pathCutBegin * revolutions) - pushY * 0.9f; | ||
286 | float endAngle = (float)(System.Math.PI * 2.0 * pathCutEnd * revolutions) - pushY * 0.9f; | ||
279 | float stepSize = (float)0.2617993878; // 2*PI / 24 segments per revolution | 287 | float stepSize = (float)0.2617993878; // 2*PI / 24 segments per revolution |
280 | 288 | ||
281 | step = (int)(startAngle / stepSize); | 289 | step = (int)(startAngle / stepSize); |
@@ -284,6 +292,7 @@ namespace OpenSim.Region.Physics.Meshing | |||
284 | float xProfileScale = 1.0f; | 292 | float xProfileScale = 1.0f; |
285 | float yProfileScale = 1.0f; | 293 | float yProfileScale = 1.0f; |
286 | 294 | ||
295 | |||
287 | #if SPAM | 296 | #if SPAM |
288 | System.Console.WriteLine("Extruder: twistTop: " + twistTop.ToString() + " twistbot: " + twistBot.ToString() + " twisttotal: " + twistTotal.ToString()); | 297 | System.Console.WriteLine("Extruder: twistTop: " + twistTop.ToString() + " twistbot: " + twistBot.ToString() + " twisttotal: " + twistTotal.ToString()); |
289 | System.Console.WriteLine("Extruder: startAngle: " + startAngle.ToString() + " endAngle: " + endAngle.ToString() + " step: " + step.ToString()); | 298 | System.Console.WriteLine("Extruder: startAngle: " + startAngle.ToString() + " endAngle: " + endAngle.ToString() + " step: " + step.ToString()); |
@@ -346,35 +355,41 @@ namespace OpenSim.Region.Physics.Meshing | |||
346 | 355 | ||
347 | float twist = twistBot + (twistTotal * (float)percentOfPath); | 356 | float twist = twistBot + (twistTotal * (float)percentOfPath); |
348 | 357 | ||
349 | float zOffset = (float)(System.Math.Sin(angle) * (0.5f - yPathScale)) * radiusScale; | 358 | float xOffset; |
350 | float yOffset = (float)(System.Math.Cos(angle) * (0.5f - yPathScale)) * radiusScale; | 359 | float yOffset; |
351 | float xOffset = 0.5f * (skewStart + totalSkew * (float)percentOfPath); | 360 | float zOffset; |
352 | 361 | ||
353 | // next apply twist rotation to the profile | 362 | |
354 | if (twistTotal != 0.0f || twistBot != 0.0f) | 363 | xOffset = 0.5f * (skewStart + totalSkew * (float)percentOfPath); |
355 | { | 364 | xOffset += (float) System.Math.Sin(angle) * pushX * 0.45f; |
356 | Quaternion profileRot = new Quaternion(new Vertex(0.0f, 0.0f, -1.0f), twist); | 365 | yOffset = (float)(System.Math.Cos(angle) * (0.5f - yPathScale)) * radiusScale; |
357 | foreach (Vertex v in newLayer.vertices) | 366 | zOffset = (float)(System.Math.Sin(angle + pushY * 0.9f) * (0.5f - yPathScale)) * radiusScale; |
367 | |||
368 | |||
369 | // next apply twist rotation to the profile layer | ||
370 | if (twistTotal != 0.0f || twistBot != 0.0f) | ||
358 | { | 371 | { |
359 | if (v != null) | 372 | Quaternion profileRot = new Quaternion(new Vertex(0.0f, 0.0f, -1.0f), twist); |
373 | foreach (Vertex v in newLayer.vertices) | ||
360 | { | 374 | { |
361 | vTemp = v * profileRot; | 375 | if (v != null) |
362 | v.X = vTemp.X; | 376 | { |
363 | v.Y = vTemp.Y; | 377 | vTemp = v * profileRot; |
364 | v.Z = vTemp.Z; | 378 | v.X = vTemp.X; |
379 | v.Y = vTemp.Y; | ||
380 | v.Z = vTemp.Z; | ||
381 | } | ||
365 | } | 382 | } |
366 | } | 383 | } |
367 | } | ||
368 | 384 | ||
369 | // now orient the rotation of the profile relative to it's position on the path | 385 | // now orient the rotation of the profile layer relative to it's position on the path |
370 | Quaternion layerRot = new Quaternion(new Vertex(-1.0f, 0.0f, 0.0f), (float)angle); | 386 | // adding pushY to the angle used to generate the quat appears to approximate the viewer |
387 | Quaternion layerRot = new Quaternion(new Vertex(-1.0f, 0.0f, 0.0f), (float)angle + pushY * 0.9f); | ||
371 | foreach (Vertex v in newLayer.vertices) | 388 | foreach (Vertex v in newLayer.vertices) |
372 | { | 389 | { |
373 | if (v != null) | 390 | if (v != null) |
374 | { | 391 | { |
375 | vTemp = v * layerRot; | 392 | vTemp = v * layerRot; |
376 | //v.X = xProfileScale * vTemp.X + xOffset; | ||
377 | //v.Y = yProfileScale * vTemp.Y + yOffset; | ||
378 | v.X = vTemp.X + xOffset; | 393 | v.X = vTemp.X + xOffset; |
379 | v.Y = vTemp.Y + yOffset; | 394 | v.Y = vTemp.Y + yOffset; |
380 | v.Z = vTemp.Z + zOffset; | 395 | v.Z = vTemp.Z + zOffset; |