/// <summary> /// Builds a line list containing a line for each face binormal. /// </summary> public List <Vector3> BuildLineListForFaceBinormals() { List <Vector3> result = new List <Vector3>(); //Generate all lines foreach (Triangle actTriangle in this.Triangles) { //Get all vertices of current face GeometryData geo1 = m_owner.RawGeometry[actTriangle.Index1]; GeometryData geo2 = m_owner.RawGeometry[actTriangle.Index2]; GeometryData geo3 = m_owner.RawGeometry[actTriangle.Index3]; //Get average values for current face Vector3 averageBinormal = Vector3.Normalize(Vector3Ex.Average(geo1.Binormal, geo2.Binormal, geo3.Binormal)); Vector3 averagePosition = Vector3Ex.Average(geo1.Position, geo2.Position, geo3.Position); averageBinormal *= 0.2f; //Generate a line if (averageBinormal.Length() > 0.1f) { result.Add(averagePosition); result.Add(averagePosition + averageBinormal); } } return(result); }
/// <summary> /// Copies this structure and replaces the given values /// </summary> public GeometryData Copy(Vector3 newPosition) { GeometryData result = this; result.m_position = newPosition; return(result); }
public Vertex AddVertex( int indexToCloneFrom = -1) { if (indexToCloneFrom > -1) { indexToCloneFrom.EnsureInRange(0, m_rawGeometry.Count - 1, nameof(indexToCloneFrom)); GeometryData geoData = m_rawGeometry[indexToCloneFrom]; TextureData texData = m_rawTexture != null ? m_rawTexture[indexToCloneFrom] : default(TextureData); AnimationData animData = m_rawAnimation != null ? m_rawAnimation[indexToCloneFrom] : default(AnimationData); m_rawGeometry.Add(geoData); m_rawTexture?.Add(texData); m_rawAnimation?.Add(animData); return(new Vertex(this, m_rawGeometry.Count - 1)); } else { m_rawGeometry.Add(new GeometryData()); if (m_rawAnimation != null) { m_rawAnimation.Add(new AnimationData()); } if (m_rawTexture != null) { m_rawTexture.Add(new TextureData()); } return(new Vertex(this, m_rawGeometry.Count - 1)); } }
/// <summary> /// Copies this structure and replaces the given values /// </summary> public GeometryData Copy(Vector3 newPosition, Vector3 newNormal) { GeometryData result = this; result.m_position = newPosition; result.m_normal = newNormal; return(result); }
/// <summary> /// Changes the color on each vertex. /// </summary> /// <param name="newColor">The new color.</param> public void SetColorOnEachVertex(Color4 newColor) { for (int loop = 0; loop < m_rawGeometry.Count; loop++) { GeometryData rawGeo = m_rawGeometry[loop]; rawGeo.Color = newColor; m_rawGeometry[loop] = rawGeo; } }
/// <summary> /// Calculates normals for all triangles specifyed by the given parameters. /// </summary> /// <param name="startVertex">The vertex index on which to start.</param> /// <param name="vertexCount">Total count of vertices to be updated.</param> public void CalculateNormals(int startVertex, int vertexCount) { if ((startVertex < 0) || (startVertex >= m_rawGeometry.Count)) { throw new ArgumentException("startVertex"); } if (vertexCount + startVertex > m_rawGeometry.Count) { throw new ArgumentException("vertexCount"); } for (int actVertexIndex = startVertex; actVertexIndex < startVertex + vertexCount; actVertexIndex++) { // Find all triangles connected to this vertex and get normals from them Vector3 finalNormalHelper = Vector3.Zero; Vector3 finalNormalHelper2 = Vector3.Zero; int normalCount = 0; int surfaceCount = m_surfaces.Count; for (int actSurfaceIndex = 0; actSurfaceIndex < surfaceCount; actSurfaceIndex++) { VertexStructureSurface actSurface = m_surfaces[actSurfaceIndex]; int triangleCount = actSurface.CountTriangles; for (int loopTriangle = 0; loopTriangle < triangleCount; loopTriangle++) { int triangleStartIndex = loopTriangle * 3; if ((actSurface.IndicesInternal[triangleStartIndex] == actVertexIndex) || (actSurface.IndicesInternal[triangleStartIndex + 1] == actVertexIndex) || (actSurface.IndicesInternal[triangleStartIndex + 2] == actVertexIndex)) { GeometryData geo1 = m_rawGeometry[actSurface.IndicesInternal[triangleStartIndex]]; GeometryData geo2 = m_rawGeometry[actSurface.IndicesInternal[triangleStartIndex + 1]]; GeometryData geo3 = m_rawGeometry[actSurface.IndicesInternal[triangleStartIndex + 2]]; finalNormalHelper += Vector3Ex.CalculateTriangleNormal(geo1.Position, geo2.Position, geo3.Position, false); normalCount++; } } } // Calculate final normal if (normalCount > 0) { GeometryData actGeometry = m_rawGeometry[actVertexIndex]; actGeometry.Normal = finalNormalHelper / finalNormalHelper.Length(); m_rawGeometry[actVertexIndex] = actGeometry; normalCount = 0; } } }