HiveBrain v1.2.0
Get Started
← Back to all entries
patterncsharpMinor

Shorten up Mesh Generator Class

Submitted by: @import:stackexchange-codereview··
0
Viewed 0 times
meshclassshortengenerator

Problem

I'm currently writing a mesh generator class, and I'm making a method that generates vertices, normals and texcoords for a cube. But, as you can see, it's incredibly complicated and hard to follow. Is anyone willing to help me making this shorter?

```
public static void GenerateCube(float size, out Vector3[] vertices, out Vector2[] texCoords, out Vector3[] normals)
{
List vertexList = new List();
List texCoordList = new List();
List normalList = new List();

for (int i = 0; i <= 2; i++)
{
Vector3 normal = i == 0 ? Vector3.UnitZ : (i == 1 ? -Vector3.UnitY : Vector3.UnitX);

float ninety = (float)(Math.PI / 2);
Matrix4 matrix = i == 0 ? Matrix4.Identity : (i == 1 ? Matrix4.CreateRotationX(ninety) : Matrix4.CreateRotationY(ninety));

Vector3 vertex1a = new Vector3(-1, -1, 1);
Vector3 vertex2a = new Vector3(-1, 1, 1);
Vector3 vertex3a = new Vector3(1, 1, 1);
Vector3 vertex4a = new Vector3(1, -1, 1);

Vector3 vertex1b = new Vector3(-1, -1, 1);
Vector3 vertex2b = new Vector3(1, -1, 1);
Vector3 vertex3b = new Vector3(1, 1, 1);
Vector3 vertex4b = new Vector3(-1, 1, 1);

vertex1a = Vector3.Transform(vertex1a, matrix);
vertex2a = Vector3.Transform(vertex2a, matrix);
vertex3a = Vector3.Transform(vertex3a, matrix);
vertex4a = Vector3.Transform(vertex4a, matrix);

vertex1b = Vector3.Transform(vertex1b, matrix);
vertex2b = Vector3.Transform(vertex2b, matrix);
vertex3b = Vector3.Transform(vertex3b, matrix);
vertex4b = Vector3.Transform(vertex4b, matrix);

for (int j = -1; j <= 1; j += 2)
{
Vector3 vertex1, vertex2, vertex3, vertex4;
if (j == -1)
{
vertex1 = vertex1a;
vertex2 = vertex2a;
vertex3 = vertex3a;
vertex4 = vertex4a;
}
else
{
vertex1 = v

Solution

Im not familiar with XNA or have any experience working with matrixes, vectors and that kind of stuff. But i've made som basic refactorings to make it abit easier to read and maintain.

public static void GenerateCube(float size, out Vector3[] vertices, out Vector2[] texCoords, out Vector3[] normals)
{
        var vertexList   = new List();
        var texCoordList = new List();
        var normalList   = new List();

        const float ninety = (float)(Math.PI / 2);

        for (var i = 0; i  Vector3.Transform(x, matrix));
            vectorsB.ForEach(x => Vector3.Transform(x, matrix));

            for (var j = -1; j  vertices, float size)
    {
        for (var i = 0; i  vertexList, IList vectorsArray)
    {
        //Triangle 1
        vertexList.Add(vectorsArray[0] * j);
        vertexList.Add(vectorsArray[1] * j);
        vertexList.Add(vectorsArray[2] * j);

        //Triangle 2
        vertexList.Add(vectorsArray[0] * j);
        vertexList.Add(vectorsArray[2] * j);
        vertexList.Add(vectorsArray[3] * j);
    }

    private static void AddTextureCoordinates(ICollection texCoordList)
    {
        //Triangle 1
        texCoordList.Add(new Vector2(0, 0));
        texCoordList.Add(new Vector2(0, 1));
        texCoordList.Add(new Vector2(1, 1));

        //Triangle 2
        texCoordList.Add(new Vector2(0, 0));
        texCoordList.Add(new Vector2(1, 1));
        texCoordList.Add(new Vector2(1, 0));
    }

    private static IEnumerable CalculateSomething(int j, Vector3 normal)
    {
        var someCalculation = normal * j;
        return Enumerable.Repeat(someCalculation, 6);
    }

    private static List CreateVectorsB()
    {
        return new List
                   {
                       new Vector3(-1, -1, 1),
                       new Vector3(1, -1, 1),
                       new Vector3(1, 1, 1),
                       new Vector3(-1, 1, 1)
                   };
    }

    private static List CreateVectorsA()
    {
        return new List
                   {
                       new Vector3(-1, -1, 1),
                       new Vector3(-1, 1, 1),
                       new Vector3(1, 1, 1),
                       new Vector3(1, -1, 1)
                   };
    }

Code Snippets

public static void GenerateCube(float size, out Vector3[] vertices, out Vector2[] texCoords, out Vector3[] normals)
{
        var vertexList   = new List<Vector3>();
        var texCoordList = new List<Vector2>();
        var normalList   = new List<Vector3>();

        const float ninety = (float)(Math.PI / 2);

        for (var i = 0; i <= 2; i++)
        {
            var normal = CreateVector(i);
            var matrix = CreateMatrix(i, ninety);

            var vectorsA = CreateVectorsA();
            var vectorsB = CreateVectorsB();

            vectorsA.ForEach(x => Vector3.Transform(x, matrix));
            vectorsB.ForEach(x => Vector3.Transform(x, matrix));

            for (var j = -1; j <= 1; j += 2)
            {
                var vectors = j == -1 ? vectorsA.ToArray() : vectorsB.ToArray();

                var someCalculations = CalculateSomething(j, normal);
                normalList.AddRange(someCalculations);

                AddTextureCoordinates(texCoordList);
                AddVertexes(j, vertexList, vectors);
            }
        }

        vertices  = vertexList.ToArray();
        texCoords = texCoordList.ToArray();
        normals   = normalList.ToArray();

        SetVectorSize(vertices, size);
    }

    private static void SetVectorSize(IList<Vector3> vertices, float size)
    {
        for (var i = 0; i < vertices.Count; i++)
        {
            vertices[i] *= size;
        }
    }

    private static Vector3 CreateVector(int i)
    {
        return i == 0 ? Vector3.UnitZ : (i == 1 ? Vector3.UnitY : Vector3.UnitX);
    }

    private static Matrix4 CreateMatrix(int i, float ninety)
    {
        return i == 0 ? Matrix4.Identity : (i == 1 ? Matrix4.CreateRotationX(ninety) : Matrix4.CreateRotationY(ninety));
    }

    private static void AddVertexes(int j, ICollection<Vector3> vertexList, IList<Vector3> vectorsArray)
    {
        //Triangle 1
        vertexList.Add(vectorsArray[0] * j);
        vertexList.Add(vectorsArray[1] * j);
        vertexList.Add(vectorsArray[2] * j);

        //Triangle 2
        vertexList.Add(vectorsArray[0] * j);
        vertexList.Add(vectorsArray[2] * j);
        vertexList.Add(vectorsArray[3] * j);
    }

    private static void AddTextureCoordinates(ICollection<Vector2> texCoordList)
    {
        //Triangle 1
        texCoordList.Add(new Vector2(0, 0));
        texCoordList.Add(new Vector2(0, 1));
        texCoordList.Add(new Vector2(1, 1));

        //Triangle 2
        texCoordList.Add(new Vector2(0, 0));
        texCoordList.Add(new Vector2(1, 1));
        texCoordList.Add(new Vector2(1, 0));
    }

    private static IEnumerable<Vector3> CalculateSomething(int j, Vector3 normal)
    {
        var someCalculation = normal * j;
        return Enumerable.Repeat(someCalculation, 6);
    }

    private static List<Vector3> CreateVectorsB()
    {
        return new List<Vector3>
                   {
                       new Vector3(-1, -1, 1),
                       new Vector3(1,

Context

StackExchange Code Review Q#5103, answer score: 3

Revisions (0)

No revisions yet.