Hi,
I’m trying to generate a box procedurally. Everything is almost working, except I have only one face showing up, and it’s always the first face to be processed. Here is my code:
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class BlockPart : MonoBehaviour
{
MeshFilter filter;
Renderer myRenderer;
public Vector3 dimensions;
public Texture2D tex;
public List<Vector3> vertices;
public List<int> triangles;
public List<Vector3> normals;
public List<Vector2> uv;
List<Vector3> tmpVert = new List<Vector3>();
List<int> tmpTris = new List<int>();
List<Vector3> tmpNorm = new List<Vector3>();
List<Vector2> tmpUvs = new List<Vector2>();
public float myAngle = 0;
void Awake()
{
dimensions = new Vector3(1, 2.2f, 1);
filter = GetComponent<MeshFilter>();
myRenderer = GetComponent<Renderer>();
}
public void reinit()
{
filter.mesh = new Mesh();
vertices = new List<Vector3>();
triangles = new List<int>();
normals = new List<Vector3>();
uv = new List<Vector2>();
}
public void addPane(Vector3 norm, Vector3 first, Vector3 second, Vector3 third, Vector3 forth)
{
tmpVert = new List<Vector3>() { new Vector3(), new Vector3(), new Vector3(), new Vector3() };
tmpTris = new List<int>() { 0, 0, 0, 0, 0, 0 };
tmpNorm = new List<Vector3>() { new Vector3(), new Vector3(), new Vector3(), new Vector3() };
tmpUvs = new List<Vector2>() { new Vector2(), new Vector2(), new Vector2(), new Vector2() };
tmpVert[0] = first;
tmpVert[1] = second;
tmpVert[2] = third;
tmpVert[3] = forth;
tmpTris[0] = 0;
tmpTris[1] = 1;
tmpTris[2] = 2;
tmpTris[3] = 0;
tmpTris[4] = 2;
tmpTris[5] = 3;
tmpNorm[0] = norm;
tmpNorm[1] = norm;
tmpNorm[2] = norm;
tmpNorm[3] = norm;
tmpUvs[0] = new Vector2(0, 0);
tmpUvs[1] = new Vector2(0, 1);
tmpUvs[2] = new Vector2(1, 1);
tmpUvs[3] = new Vector2(1, 0);
vertices.AddRange(tmpVert);
triangles.AddRange(tmpTris);
normals.AddRange(tmpNorm);
uv.AddRange(tmpUvs);
}
public Vector3 newV(float x, float y, float z)
{
return new Vector3(x, y, z);
}
public void addBox()
{
}
public Vector3 RotatePointAroundPivot(Vector3 point, float angle)
{
return Quaternion.AngleAxis(angle, Vector3.up) * point;
}
void createMesh()
{
filter.mesh.vertices = vertices.ToArray();
filter.mesh.normals = normals.ToArray();
filter.mesh.uv = uv.ToArray();
filter.mesh.triangles = triangles.ToArray();
myRenderer.material.mainTexture = tex;
filter.mesh.RecalculateBounds();
filter.mesh.RecalculateNormals();
filter.mesh.Optimize();
}
void Update ()
{
// Here, no matter what I do the first call on "addPane" will be the only one to be drawn
myAngle += Time.deltaTime * 5f;
reinit();
addPane(-Vector3.forward,
newV(-0.05f, 0, -0.05f),
newV(-0.05f, 2.2f, -0.05f),
newV(0.05f, 2.2f, -0.05f),
newV(0.05f, 0, -0.05f));
addPane(Vector3.forward,
newV(0.05f, 0, 0.05f),
newV(0.05f, 2.2f, 0.05f),
newV(-0.05f, 2.2f, 0.05f),
newV(-0.05f, 0, 0.05f));
addPane(-Vector3.left,
newV(-0.05f, 0, 0.05f),
newV(-0.05f, 2.2f, 0.05f),
newV(-0.05f, 2.2f, -0.05f),
newV(-0.05f, 0, -0.05f));
addPane(Vector3.right,
newV(0.05f, 0, -0.05f),
newV(0.05f, 2.2f, -0.05f),
newV(0.05f, 2.2f, 0.05f),
newV(0.05f, 0, 0.05f));
createMesh();
}
}
I’ve tried several approaches and I am running out of ideas.
edit: Separately, the faces are correct. They are all clockwise, display correctly with the proper UV, normals and triangles.
Thanks for your help.