aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim')
-rw-r--r--OpenSim/Region/PhysicsModules/ubOde/ODEScene.cs34
-rw-r--r--OpenSim/Region/PhysicsModules/ubOdeMeshing/Mesh.cs23
-rw-r--r--OpenSim/Region/PhysicsModules/ubOdeMeshing/Meshmerizer.cs4
-rw-r--r--OpenSim/Region/PhysicsModules/ubOdeMeshing/PrimMesher.cs122
-rw-r--r--OpenSim/Region/PhysicsModules/ubOdeMeshing/SculptMesh.cs21
5 files changed, 96 insertions, 108 deletions
diff --git a/OpenSim/Region/PhysicsModules/ubOde/ODEScene.cs b/OpenSim/Region/PhysicsModules/ubOde/ODEScene.cs
index 97dcb69..dc65a2c 100644
--- a/OpenSim/Region/PhysicsModules/ubOde/ODEScene.cs
+++ b/OpenSim/Region/PhysicsModules/ubOde/ODEScene.cs
@@ -1558,33 +1558,36 @@ namespace OpenSim.Region.PhysicsModule.ubOde
1558 1558
1559 // tmpTime = Util.GetTimeStampMS(); 1559 // tmpTime = Util.GetTimeStampMS();
1560 1560
1561 lock (SimulationLock) 1561 // Move characters
1562 lock (_characters)
1562 { 1563 {
1563 // Move characters 1564 foreach (OdeCharacter actor in _characters)
1564 lock (_characters)
1565 { 1565 {
1566 foreach (OdeCharacter actor in _characters) 1566 lock (SimulationLock)
1567 {
1568 actor.Move(); 1567 actor.Move();
1569 }
1570 } 1568 }
1569 }
1571 1570
1572 // Move other active objects 1571 // Move other active objects
1573 lock (_activegroups) 1572 lock (_activegroups)
1573 {
1574 foreach (OdePrim aprim in _activegroups)
1574 { 1575 {
1575 foreach (OdePrim aprim in _activegroups) 1576 lock (SimulationLock)
1576 {
1577 aprim.Move(); 1577 aprim.Move();
1578 }
1579 } 1578 }
1579 }
1580 // moveTime += Util.GetTimeStampMS() - tmpTime; 1580 // moveTime += Util.GetTimeStampMS() - tmpTime;
1581 // tmpTime = Util.GetTimeStampMS(); 1581 // tmpTime = Util.GetTimeStampMS();
1582 lock (SimulationLock)
1583 {
1582 m_rayCastManager.ProcessQueuedRequests(); 1584 m_rayCastManager.ProcessQueuedRequests();
1583 // rayTime += Util.GetTimeStampMS() - tmpTime; 1585 // rayTime += Util.GetTimeStampMS() - tmpTime;
1584 1586
1585 // tmpTime = Util.GetTimeStampMS(); 1587 // tmpTime = Util.GetTimeStampMS();
1586 collision_optimized(); 1588 collision_optimized();
1587 } 1589 }
1590
1588 // collisionTime += Util.GetTimeStampMS() - tmpTime; 1591 // collisionTime += Util.GetTimeStampMS() - tmpTime;
1589 1592
1590 // tmpTime = Util.GetTimeStampMS(); 1593 // tmpTime = Util.GetTimeStampMS();
@@ -1655,7 +1658,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde
1655 } 1658 }
1656 */ 1659 */
1657 // tmpTime = Util.GetTimeStampMS(); 1660 // tmpTime = Util.GetTimeStampMS();
1658 lock (SimulationLock) 1661 //lock (SimulationLock)
1659 { 1662 {
1660 lock (_activegroups) 1663 lock (_activegroups)
1661 { 1664 {
@@ -1664,7 +1667,8 @@ namespace OpenSim.Region.PhysicsModule.ubOde
1664 { 1667 {
1665 if (actor.IsPhysical) 1668 if (actor.IsPhysical)
1666 { 1669 {
1667 actor.UpdatePositionAndVelocity(framecount); 1670 lock (SimulationLock)
1671 actor.UpdatePositionAndVelocity(framecount);
1668 } 1672 }
1669 } 1673 }
1670 } 1674 }
diff --git a/OpenSim/Region/PhysicsModules/ubOdeMeshing/Mesh.cs b/OpenSim/Region/PhysicsModules/ubOdeMeshing/Mesh.cs
index 5d2b1f7..380cce2 100644
--- a/OpenSim/Region/PhysicsModules/ubOdeMeshing/Mesh.cs
+++ b/OpenSim/Region/PhysicsModules/ubOdeMeshing/Mesh.cs
@@ -218,7 +218,6 @@ namespace OpenSim.Region.PhysicsModule.ubODEMeshing
218 m_bdata.m_obbZmax = z; 218 m_bdata.m_obbZmax = z;
219 if (z < m_bdata.m_obbZmin) 219 if (z < m_bdata.m_obbZmin)
220 m_bdata.m_obbZmin = z; 220 m_bdata.m_obbZmin = z;
221
222 } 221 }
223 222
224 public void Add(Triangle triangle) 223 public void Add(Triangle triangle)
@@ -324,13 +323,15 @@ namespace OpenSim.Region.PhysicsModule.ubODEMeshing
324 if (m_bdata.m_vertices == null) 323 if (m_bdata.m_vertices == null)
325 throw new NotSupportedException(); 324 throw new NotSupportedException();
326 float[] result = new float[m_bdata.m_vertices.Count * 3]; 325 float[] result = new float[m_bdata.m_vertices.Count * 3];
326 int k = 0;
327 foreach (KeyValuePair<Vertex, int> kvp in m_bdata.m_vertices) 327 foreach (KeyValuePair<Vertex, int> kvp in m_bdata.m_vertices)
328 { 328 {
329 Vertex v = kvp.Key; 329 Vertex v = kvp.Key;
330 int i = kvp.Value; 330 int i = kvp.Value;
331 result[3 * i + 0] = v.X; 331 k = 3 * i;
332 result[3 * i + 1] = v.Y; 332 result[k] = v.X;
333 result[3 * i + 2] = v.Z; 333 result[k + 1] = v.Y;
334 result[k + 2] = v.Z;
334 } 335 }
335 return result; 336 return result;
336 } 337 }
@@ -364,12 +365,14 @@ namespace OpenSim.Region.PhysicsModule.ubODEMeshing
364 if (m_bdata.m_triangles == null) 365 if (m_bdata.m_triangles == null)
365 throw new NotSupportedException(); 366 throw new NotSupportedException();
366 int[] result = new int[m_bdata.m_triangles.Count * 3]; 367 int[] result = new int[m_bdata.m_triangles.Count * 3];
368 int k;
367 for (int i = 0; i < m_bdata.m_triangles.Count; i++) 369 for (int i = 0; i < m_bdata.m_triangles.Count; i++)
368 { 370 {
371 k= 3 * i;
369 Triangle t = m_bdata.m_triangles[i]; 372 Triangle t = m_bdata.m_triangles[i];
370 result[3 * i + 0] = m_bdata.m_vertices[t.v1]; 373 result[k] = m_bdata.m_vertices[t.v1];
371 result[3 * i + 1] = m_bdata.m_vertices[t.v2]; 374 result[k + 1] = m_bdata.m_vertices[t.v2];
372 result[3 * i + 2] = m_bdata.m_vertices[t.v3]; 375 result[k + 2] = m_bdata.m_vertices[t.v3];
373 } 376 }
374 return result; 377 return result;
375 } 378 }
@@ -463,9 +466,9 @@ namespace OpenSim.Region.PhysicsModule.ubODEMeshing
463 if (v == null) 466 if (v == null)
464 continue; 467 continue;
465 float x, y, z; 468 float x, y, z;
466 x = v.X*matrix[0, 0] + v.Y*matrix[1, 0] + v.Z*matrix[2, 0]; 469 x = v.X * matrix[0, 0] + v.Y * matrix[1, 0] + v.Z * matrix[2, 0];
467 y = v.X*matrix[0, 1] + v.Y*matrix[1, 1] + v.Z*matrix[2, 1]; 470 y = v.X * matrix[0, 1] + v.Y * matrix[1, 1] + v.Z * matrix[2, 1];
468 z = v.X*matrix[0, 2] + v.Y*matrix[1, 2] + v.Z*matrix[2, 2]; 471 z = v.X * matrix[0, 2] + v.Y * matrix[1, 2] + v.Z * matrix[2, 2];
469 v.X = x + offset[0]; 472 v.X = x + offset[0];
470 v.Y = y + offset[1]; 473 v.Y = y + offset[1];
471 v.Z = z + offset[2]; 474 v.Z = z + offset[2];
diff --git a/OpenSim/Region/PhysicsModules/ubOdeMeshing/Meshmerizer.cs b/OpenSim/Region/PhysicsModules/ubOdeMeshing/Meshmerizer.cs
index 1b2f41a..6950f2d 100644
--- a/OpenSim/Region/PhysicsModules/ubOdeMeshing/Meshmerizer.cs
+++ b/OpenSim/Region/PhysicsModules/ubOdeMeshing/Meshmerizer.cs
@@ -945,7 +945,7 @@ namespace OpenSim.Region.PhysicsModule.ubODEMeshing
945#endif 945#endif
946 try 946 try
947 { 947 {
948 primMesh.ExtrudeLinear(); 948 primMesh.Extrude(PathType.Linear); ;
949 } 949 }
950 catch (Exception ex) 950 catch (Exception ex)
951 { 951 {
@@ -978,7 +978,7 @@ namespace OpenSim.Region.PhysicsModule.ubODEMeshing
978#endif 978#endif
979 try 979 try
980 { 980 {
981 primMesh.ExtrudeCircular(); 981 primMesh.Extrude(PathType.Circular);
982 } 982 }
983 catch (Exception ex) 983 catch (Exception ex)
984 { 984 {
diff --git a/OpenSim/Region/PhysicsModules/ubOdeMeshing/PrimMesher.cs b/OpenSim/Region/PhysicsModules/ubOdeMeshing/PrimMesher.cs
index 23e87d1..f3a57d3 100644
--- a/OpenSim/Region/PhysicsModules/ubOdeMeshing/PrimMesher.cs
+++ b/OpenSim/Region/PhysicsModules/ubOdeMeshing/PrimMesher.cs
@@ -212,14 +212,34 @@ namespace PrimMesher
212 212
213 public static Coord operator *(Coord v, Quat q) 213 public static Coord operator *(Coord v, Quat q)
214 { 214 {
215 float rx = q.W * v.X + q.Y * v.Z - q.Z * v.Y; 215 float x = q.X;
216 float ry = q.W * v.Y + q.Z * v.X - q.X * v.Z; 216 float y = q.Y;
217 float rz = q.W * v.Z + q.X * v.Y - q.Y * v.X; 217 float x2 = x + x;
218 float z = q.Z;
219 float y2 = y + y;
220 float w = q.W;
221 float z2 = z + z;
222
223 float zz2 = z * z2;
224
225 float xx2 = x * x2;
226 float xy2 = x * y2;
227 float xz2 = x * z2;
228 z = v.Z;
229
230 float yy2 = y * y2;
231 float yz2 = y * z2;
232 x = v.X;
233
234 float wx2 = w * x2;
235 float wy2 = w * y2;
236 float wz2 = w * z2;
237 y = v.Y;
218 238
219 return new Coord( 239 return new Coord(
220 2.0f * (rz * q.Y - ry * q.Z) + v.X, 240 x * (1.0f - yy2 - zz2) + y * (xy2 - wz2) + z * (xz2 + wy2),
221 2.0f * (rx * q.Z - rz * q.X) + v.Y, 241 x * (xy2 + wz2) + y * (1.0f - xx2 - zz2) + z * (yz2 - wx2),
222 2.0f * (ry * q.X - rx * q.Y) + v.Z ); 242 x * (xz2 - wy2) + y * (yz2 + wx2) + z * (1.0f - xx2 - yy2));
223 } 243 }
224 } 244 }
225 245
@@ -248,9 +268,9 @@ namespace PrimMesher
248 internal float X; 268 internal float X;
249 internal float Y; 269 internal float Y;
250 270
251 internal Angle(float angle, float x, float y) 271 internal Angle(float _angle, float x, float y)
252 { 272 {
253 this.angle = angle; // 1 is 2pi 273 angle = _angle; // 1 is 2pi
254 X = x; // cos 274 X = x; // cos
255 Y = y; // sin 275 Y = y; // sin
256 } 276 }
@@ -359,8 +379,8 @@ namespace PrimMesher
359 { 379 {
360 angles = new List<Angle>(); 380 angles = new List<Angle>();
361 381
362 const float twoPi = (float)(Math.PI * 2.0); 382 const float twoPi = 2.0f * (float)Math.PI;
363 const float twoPiInv = (float)(0.5 / Math.PI); 383 const float twoPiInv = 0.5f / (float)Math.PI;
364 384
365 if (sides < 1) 385 if (sides < 1)
366 throw new Exception("number of sides not greater than zero"); 386 throw new Exception("number of sides not greater than zero");
@@ -479,7 +499,7 @@ namespace PrimMesher
479 /// </summary> 499 /// </summary>
480 public class Profile 500 public class Profile
481 { 501 {
482 private const float twoPi = (float)(2.0 * Math.PI); 502 private const float twoPi = 2.0f * (float)Math.PI;
483 503
484 public string errorMessage = null; 504 public string errorMessage = null;
485 505
@@ -533,7 +553,6 @@ namespace PrimMesher
533 try { angles.makeAngles(sides, startAngle, stopAngle,hasProfileCut); } 553 try { angles.makeAngles(sides, startAngle, stopAngle,hasProfileCut); }
534 catch (Exception ex) 554 catch (Exception ex)
535 { 555 {
536
537 errorMessage = "makeAngles failed: Exception: " + ex.ToString() 556 errorMessage = "makeAngles failed: Exception: " + ex.ToString()
538 + "\nsides: " + sides.ToString() + " startAngle: " + startAngle.ToString() + " stopAngle: " + stopAngle.ToString(); 557 + "\nsides: " + sides.ToString() + " startAngle: " + startAngle.ToString() + " stopAngle: " + stopAngle.ToString();
539 558
@@ -791,7 +810,6 @@ namespace PrimMesher
791 } 810 }
792 } 811 }
793 812
794
795 hollowCoords = null; 813 hollowCoords = null;
796 } 814 }
797 815
@@ -833,7 +851,7 @@ namespace PrimMesher
833 vert.X += x; 851 vert.X += x;
834 vert.Y += y; 852 vert.Y += y;
835 vert.Z += z; 853 vert.Z += z;
836 this.coords[i] = vert; 854 coords[i] = vert;
837 } 855 }
838 } 856 }
839 857
@@ -1228,7 +1246,6 @@ namespace PrimMesher
1228 get { return hasHollow; } 1246 get { return hasHollow; }
1229 } 1247 }
1230 1248
1231
1232 /// <summary> 1249 /// <summary>
1233 /// Constructs a PrimMesh object and creates the profile for extrusion. 1250 /// Constructs a PrimMesh object and creates the profile for extrusion.
1234 /// </summary> 1251 /// </summary>
@@ -1257,13 +1274,13 @@ namespace PrimMesher
1257 profileStart = 0.0f; 1274 profileStart = 0.0f;
1258 if (profileEnd > 1.0f) 1275 if (profileEnd > 1.0f)
1259 profileEnd = 1.0f; 1276 profileEnd = 1.0f;
1260 if (profileEnd < 0.02f) 1277 else if (profileEnd < 0.02f)
1261 profileEnd = 0.02f; 1278 profileEnd = 0.02f;
1262 if (profileStart >= profileEnd) 1279 if (profileStart >= profileEnd)
1263 profileStart = profileEnd - 0.02f; 1280 profileStart = profileEnd - 0.02f;
1264 if (hollow > 0.99f) 1281 if (hollow > 0.99f)
1265 hollow = 0.99f; 1282 hollow = 0.99f;
1266 if (hollow < 0.0f) 1283 else if (hollow < 0.0f)
1267 hollow = 0.0f; 1284 hollow = 0.0f;
1268 } 1285 }
1269 1286
@@ -1281,9 +1298,7 @@ namespace PrimMesher
1281 1298
1282 float length = pathCutEnd - pathCutBegin; 1299 float length = pathCutEnd - pathCutBegin;
1283 1300
1284 hasProfileCut = this.profileEnd - this.profileStart < 0.9999f; 1301 hasProfileCut = profileEnd - profileStart < 0.9999f;
1285
1286 hasHollow = (this.hollow > 0.001f);
1287 1302
1288 float twistTotal = twistEnd - twistBegin; 1303 float twistTotal = twistEnd - twistBegin;
1289 float twistTotalAbs = Math.Abs(twistTotal); 1304 float twistTotalAbs = Math.Abs(twistTotal);
@@ -1291,6 +1306,8 @@ namespace PrimMesher
1291 steps += (int)(twistTotalAbs * 3.66); // dahlia's magic number 1306 steps += (int)(twistTotalAbs * 3.66); // dahlia's magic number
1292 1307
1293 float hollow = this.hollow; 1308 float hollow = this.hollow;
1309 hasHollow = hollow > 0.001f;
1310
1294 float initialProfileRot = 0.0f; 1311 float initialProfileRot = 0.0f;
1295 1312
1296 if (pathType == PathType.Circular) 1313 if (pathType == PathType.Circular)
@@ -1516,29 +1533,6 @@ namespace PrimMesher
1516 // more cleanup will be done at Meshmerizer.cs 1533 // more cleanup will be done at Meshmerizer.cs
1517 } 1534 }
1518 1535
1519
1520 /// <summary>
1521 /// DEPRICATED - use Extrude(PathType.Linear) instead
1522 /// Extrudes a profile along a straight line path. Used for prim types box, cylinder, and prism.
1523 /// </summary>
1524 ///
1525 public void ExtrudeLinear()
1526 {
1527 Extrude(PathType.Linear);
1528 }
1529
1530
1531 /// <summary>
1532 /// DEPRICATED - use Extrude(PathType.Circular) instead
1533 /// Extrude a profile into a circular path prim mesh. Used for prim types torus, tube, and ring.
1534 /// </summary>
1535 ///
1536 public void ExtrudeCircular()
1537 {
1538 Extrude(PathType.Circular);
1539 }
1540
1541
1542 private Coord SurfaceNormal(Coord c1, Coord c2, Coord c3) 1536 private Coord SurfaceNormal(Coord c1, Coord c2, Coord c3)
1543 { 1537 {
1544 Coord edge1 = new Coord(c2.X - c1.X, c2.Y - c1.Y, c2.Z - c1.Z); 1538 Coord edge1 = new Coord(c2.X - c1.X, c2.Y - c1.Y, c2.Z - c1.Z);
@@ -1553,7 +1547,7 @@ namespace PrimMesher
1553 1547
1554 private Coord SurfaceNormal(Face face) 1548 private Coord SurfaceNormal(Face face)
1555 { 1549 {
1556 return SurfaceNormal(this.coords[face.v1], this.coords[face.v2], this.coords[face.v3]); 1550 return SurfaceNormal(coords[face.v1], coords[face.v2], coords[face.v3]);
1557 } 1551 }
1558 1552
1559 /// <summary> 1553 /// <summary>
@@ -1563,11 +1557,11 @@ namespace PrimMesher
1563 /// <returns></returns> 1557 /// <returns></returns>
1564 public Coord SurfaceNormal(int faceIndex) 1558 public Coord SurfaceNormal(int faceIndex)
1565 { 1559 {
1566 int numFaces = this.faces.Count; 1560 int numFaces = faces.Count;
1567 if (faceIndex < 0 || faceIndex >= numFaces) 1561 if (faceIndex < 0 || faceIndex >= numFaces)
1568 throw new Exception("faceIndex out of range"); 1562 throw new Exception("faceIndex out of range");
1569 1563
1570 return SurfaceNormal(this.faces[faceIndex]); 1564 return SurfaceNormal(faces[faceIndex]);
1571 } 1565 }
1572 1566
1573 /// <summary> 1567 /// <summary>
@@ -1612,16 +1606,16 @@ namespace PrimMesher
1612 public void AddPos(float x, float y, float z) 1606 public void AddPos(float x, float y, float z)
1613 { 1607 {
1614 int i; 1608 int i;
1615 int numVerts = this.coords.Count; 1609 int numVerts = coords.Count;
1616 Coord vert; 1610 Coord vert;
1617 1611
1618 for (i = 0; i < numVerts; i++) 1612 for (i = 0; i < numVerts; i++)
1619 { 1613 {
1620 vert = this.coords[i]; 1614 vert = coords[i];
1621 vert.X += x; 1615 vert.X += x;
1622 vert.Y += y; 1616 vert.Y += y;
1623 vert.Z += z; 1617 vert.Z += z;
1624 this.coords[i] = vert; 1618 coords[i] = vert;
1625 } 1619 }
1626 } 1620 }
1627 1621
@@ -1632,18 +1626,11 @@ namespace PrimMesher
1632 public void AddRot(Quat q) 1626 public void AddRot(Quat q)
1633 { 1627 {
1634 int i; 1628 int i;
1635 int numVerts = this.coords.Count; 1629 int numVerts = coords.Count;
1636 1630
1637 for (i = 0; i < numVerts; i++) 1631 for (i = 0; i < numVerts; i++)
1638 this.coords[i] *= q; 1632 coords[i] *= q;
1639 }
1640
1641#if VERTEX_INDEXER
1642 public VertexIndexer GetVertexIndexer()
1643 {
1644 return null;
1645 } 1633 }
1646#endif
1647 1634
1648 /// <summary> 1635 /// <summary>
1649 /// Scales the mesh 1636 /// Scales the mesh
@@ -1659,7 +1646,7 @@ namespace PrimMesher
1659 1646
1660 Coord m = new Coord(x, y, z); 1647 Coord m = new Coord(x, y, z);
1661 for (i = 0; i < numVerts; i++) 1648 for (i = 0; i < numVerts; i++)
1662 this.coords[i] *= m; 1649 coords[i] *= m;
1663 } 1650 }
1664 1651
1665 /// <summary> 1652 /// <summary>
@@ -1674,18 +1661,15 @@ namespace PrimMesher
1674 return; 1661 return;
1675 String fileName = name + "_" + title + ".raw"; 1662 String fileName = name + "_" + title + ".raw";
1676 String completePath = System.IO.Path.Combine(path, fileName); 1663 String completePath = System.IO.Path.Combine(path, fileName);
1677 StreamWriter sw = new StreamWriter(completePath); 1664 using (StreamWriter sw = new StreamWriter(completePath))
1678
1679 for (int i = 0; i < this.faces.Count; i++)
1680 { 1665 {
1681 string s = this.coords[this.faces[i].v1].ToString(); 1666 for (int i = 0; i < this.faces.Count; i++)
1682 s += " " + this.coords[this.faces[i].v2].ToString(); 1667 {
1683 s += " " + this.coords[this.faces[i].v3].ToString(); 1668 sw.Write(coords[faces[i].v1].ToString());
1684 1669 sw.Write(coords[faces[i].v2].ToString());
1685 sw.WriteLine(s); 1670 sw.WriteLine(coords[faces[i].v3].ToString());
1671 }
1686 } 1672 }
1687
1688 sw.Close();
1689 } 1673 }
1690 } 1674 }
1691} 1675}
diff --git a/OpenSim/Region/PhysicsModules/ubOdeMeshing/SculptMesh.cs b/OpenSim/Region/PhysicsModules/ubOdeMeshing/SculptMesh.cs
index bc1375b..184221d 100644
--- a/OpenSim/Region/PhysicsModules/ubOdeMeshing/SculptMesh.cs
+++ b/OpenSim/Region/PhysicsModules/ubOdeMeshing/SculptMesh.cs
@@ -165,8 +165,8 @@ namespace PrimMesher
165 f2 = new Face(p1, p4, p2); 165 f2 = new Face(p1, p4, p2);
166 } 166 }
167 167
168 this.faces.Add(f1); 168 faces.Add(f1);
169 this.faces.Add(f2); 169 faces.Add(f2);
170 } 170 }
171 } 171 }
172 } 172 }
@@ -203,18 +203,15 @@ namespace PrimMesher
203 return; 203 return;
204 String fileName = name + "_" + title + ".raw"; 204 String fileName = name + "_" + title + ".raw";
205 String completePath = System.IO.Path.Combine(path, fileName); 205 String completePath = System.IO.Path.Combine(path, fileName);
206 StreamWriter sw = new StreamWriter(completePath); 206 using(StreamWriter sw = new StreamWriter(completePath))
207
208 for (int i = 0; i < this.faces.Count; i++)
209 { 207 {
210 string s = this.coords[this.faces[i].v1].ToString(); 208 for (int i = 0; i < faces.Count; i++)
211 s += " " + this.coords[this.faces[i].v2].ToString(); 209 {
212 s += " " + this.coords[this.faces[i].v3].ToString(); 210 sw.Write(coords[faces[i].v1].ToString());
213 211 sw.Write(coords[faces[i].v2].ToString());
214 sw.WriteLine(s); 212 sw.WriteLine(coords[faces[i].v3].ToString());
213 }
215 } 214 }
216
217 sw.Close();
218 } 215 }
219 } 216 }
220} 217}