patterncsharpMinor
Shorten up Mesh Generator Class
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
```
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.