Added a Copy() method to PrimMesh and SculptMesh as suggested by dmiles. Sync PrimMesher.cs and SculptMesh.cs with PrimMesher.dll r36.

0.6.5-rc1
Dahlia Trimble 2009-05-08 03:04:45 +00:00
parent f532767c6a
commit bd3a4e5f01
2 changed files with 75 additions and 20 deletions

View File

@ -945,33 +945,33 @@ namespace PrimMesher
this.faceUVs.Add(new UVCoord(1.0f - (0.5f + c.X), 1.0f - (0.5f - c.Y))); this.faceUVs.Add(new UVCoord(1.0f - (0.5f + c.X), 1.0f - (0.5f - c.Y)));
} }
internal Profile Clone() internal Profile Copy()
{ {
return this.Clone(true); return this.Copy(true);
} }
internal Profile Clone(bool needFaces) internal Profile Copy(bool needFaces)
{ {
Profile clone = new Profile(); Profile copy = new Profile();
clone.coords.AddRange(this.coords); copy.coords.AddRange(this.coords);
clone.faceUVs.AddRange(this.faceUVs); copy.faceUVs.AddRange(this.faceUVs);
if (needFaces) if (needFaces)
clone.faces.AddRange(this.faces); copy.faces.AddRange(this.faces);
if ((clone.calcVertexNormals = this.calcVertexNormals) == true) if ((copy.calcVertexNormals = this.calcVertexNormals) == true)
{ {
clone.vertexNormals.AddRange(this.vertexNormals); copy.vertexNormals.AddRange(this.vertexNormals);
clone.faceNormal = this.faceNormal; copy.faceNormal = this.faceNormal;
clone.cutNormal1 = this.cutNormal1; copy.cutNormal1 = this.cutNormal1;
clone.cutNormal2 = this.cutNormal2; copy.cutNormal2 = this.cutNormal2;
clone.us.AddRange(this.us); copy.us.AddRange(this.us);
clone.faceNumbers.AddRange(this.faceNumbers); copy.faceNumbers.AddRange(this.faceNumbers);
} }
clone.numOuterVerts = this.numOuterVerts; copy.numOuterVerts = this.numOuterVerts;
clone.numHollowVerts = this.numHollowVerts; copy.numHollowVerts = this.numHollowVerts;
return clone; return copy;
} }
internal void AddPos(Coord v) internal void AddPos(Coord v)
@ -1344,7 +1344,7 @@ namespace PrimMesher
bool done = false; bool done = false;
while (!done) while (!done)
{ {
Profile newLayer = profile.Clone(); Profile newLayer = profile.Copy();
if (this.taperX == 0.0f) if (this.taperX == 0.0f)
xProfileScale = 1.0f; xProfileScale = 1.0f;
@ -1730,8 +1730,8 @@ namespace PrimMesher
if (angle <= startAngle + .01f || angle >= endAngle - .01f) if (angle <= startAngle + .01f || angle >= endAngle - .01f)
isEndLayer = true; isEndLayer = true;
//Profile newLayer = profile.Clone(isEndLayer && needEndFaces); //Profile newLayer = profile.Copy(isEndLayer && needEndFaces);
Profile newLayer = profile.Clone(); Profile newLayer = profile.Copy();
float xProfileScale = (1.0f - Math.Abs(this.skew)) * this.holeSizeX; float xProfileScale = (1.0f - Math.Abs(this.skew)) * this.holeSizeX;
float yProfileScale = this.holeSizeY; float yProfileScale = this.holeSizeY;
@ -2035,6 +2035,43 @@ namespace PrimMesher
return SurfaceNormal(this.faces[faceIndex]); return SurfaceNormal(this.faces[faceIndex]);
} }
/// <summary>
/// Duplicates a PrimMesh object. All object properties are copied by value, including lists.
/// </summary>
/// <returns></returns>
public PrimMesh Copy()
{
PrimMesh copy = new PrimMesh(this.sides, this.profileStart, this.profileEnd, this.hollow, this.hollowSides);
copy.twistBegin = this.twistBegin;
copy.twistEnd = this.twistEnd;
copy.topShearX = this.topShearX;
copy.topShearY = this.topShearY;
copy.pathCutBegin = this.pathCutBegin;
copy.pathCutEnd = this.pathCutEnd;
copy.dimpleBegin = this.dimpleBegin;
copy.dimpleEnd = this.dimpleEnd;
copy.skew = this.skew;
copy.holeSizeX = this.holeSizeX;
copy.holeSizeY = this.holeSizeY;
copy.taperX = this.taperX;
copy.taperY = this.taperY;
copy.radius = this.radius;
copy.revolutions = this.revolutions;
copy.stepsPerRevolution = this.stepsPerRevolution;
copy.calcVertexNormals = this.calcVertexNormals;
copy.normalsProcessed = this.normalsProcessed;
copy.viewerMode = this.viewerMode;
copy.numPrimFaces = this.numPrimFaces;
copy.errorMessage = this.errorMessage;
copy.coords = new List<Coord>(this.coords);
copy.faces = new List<Face>(this.faces);
copy.viewerFaces = new List<ViewerFace>(this.viewerFaces);
copy.normals = new List<Coord>(this.normals);
return copy;
}
/// <summary> /// <summary>
/// Calculate surface normals for all of the faces in the list of faces in this mesh /// Calculate surface normals for all of the faces in the list of faces in this mesh
/// </summary> /// </summary>

View File

@ -376,6 +376,24 @@ namespace PrimMesher
calcVertexNormals(sculptType, width, height); calcVertexNormals(sculptType, width, height);
} }
/// <summary>
/// Duplicates a SculptMesh object. All object properties are copied by value, including lists.
/// </summary>
/// <returns></returns>
public SculptMesh Copy()
{
return new SculptMesh(this);
}
public SculptMesh(SculptMesh sm)
{
coords = new List<Coord>(sm.coords);
faces = new List<Face>(sm.faces);
viewerFaces = new List<ViewerFace>(sm.viewerFaces);
normals = new List<Coord>(sm.normals);
uvs = new List<UVCoord>(sm.uvs);
}
private void calcVertexNormals(SculptType sculptType, int xSize, int ySize) private void calcVertexNormals(SculptType sculptType, int xSize, int ySize)
{ // compute vertex normals by summing all the surface normals of all the triangles sharing { // compute vertex normals by summing all the surface normals of all the triangles sharing
// each vertex and then normalizing // each vertex and then normalizing