Adding Vertices to a dynamic mesh via Method Call

Posted by Raven Dreamer on Game Development See other posts from Game Development or by Raven Dreamer
Published on 2012-11-07T04:38:10Z Indexed on 2012/11/07 5:16 UTC
Read the original article Hit count: 410

Filed under:
|

I have a C# Struct with a static method, "Get Shape" which populates a List with the vertices of a polyhedron.

Method Signature:

public static void GetShape(Block b, int x, int y, int z,
                                List<Vector3> vertices, List<int> triangles,
                                List<Vector2> uvs, List<Vector2> uv2s)

Adding directly to the vertices list (via vertices.Add(vector3) ), the code works as expected, and the new polyhedron appears when I trigger the method. However, I want to do some processing on the vertices I'm adding (a rotation), and the most sensible way I can think to do that is by creating a separate list of Vector3s, and then combining the lists when I'm done.

However,

vertices.AddRange(newVerts) does not add the shape to the mesh, nor does a foreach loop with verts.Add(vertices[i]). And this is before I've added in any of the processing!

I have a feeling this might stem from passing the list of vertices in as a parameter, rather than returning a list and then adding to the vertices in the calling object, but since I'm filling 4 lists, I was trying to avoid having to create a data struct to return all four at once.

Any ideas? The working version of the method is reprinted below, in full:

    public static void GetShape(Block b, int x, int y, int z,
                                List<Vector3> vertices, List<int> triangles,
                                List<Vector2> uvs, List<Vector2> uv2s)
    {
                //List<Vector3> vertices = new List<Vector3>();

                int l_blockShape = b.blockShape;
                int l_blockType  = b.blockType;
                //CheckFace checks if the block is empty
                //if this block is empty, don't draw anything.


                int vertexIndex;

                //only y faces need to be hidden.
                //if((l_blockShape & BlockShape.NegZFace) == BlockShape.NegZFace)
                {
                    vertexIndex = vertices.Count;
                    //top left, top right, bottom right, bottom left
                    vertices.Add(new Vector3(x+.2f, y + 1, z+.2f));
                    vertices.Add(new Vector3(x+.8f, y + 1, z+.2f));
                    vertices.Add(new Vector3(x+.8f, y , z+.2f));
                    vertices.Add(new Vector3(x+.2f, y , z+.2f));

                    // first triangle for the face 
                    triangles.Add(vertexIndex);
                    triangles.Add(vertexIndex+1);
                    triangles.Add(vertexIndex+3);

                    // second triangle for the face
                    triangles.Add(vertexIndex+1);
                    triangles.Add(vertexIndex+2);
                    triangles.Add(vertexIndex+3);

                    //UVs for the face
                    uvs.Add( new Vector2(0,1));
                    uvs.Add( new Vector2(1,1));
                    uvs.Add( new Vector2(1,0));
                    uvs.Add( new Vector2(0,0));

                    //UV2s (lightmapping?)
                    uv2s.Add( new Vector2(0,1));
                    uv2s.Add( new Vector2(1,1));
                    uv2s.Add( new Vector2(1,0));
                    uv2s.Add( new Vector2(0,0));
                }

                //XY Z+1 face
                //if((l_blockShape & BlockShape.PosZFace) == BlockShape.PosZFace)
                {
                    vertexIndex = vertices.Count;
                    //top left, top right, bottom right, bottom left
                    vertices.Add(new Vector3(x+.8f, y + 1, z+.8f));
                    vertices.Add(new Vector3(x+.2f, y + 1, z+.8f));
                    vertices.Add(new Vector3(x+.2f, y , z+.8f));
                    vertices.Add(new Vector3(x+.8f, y , z+.8f));


                    // first triangle for the face 
                    triangles.Add(vertexIndex);
                    triangles.Add(vertexIndex+1);
                    triangles.Add(vertexIndex+3);

                    // second triangle for the face
                    triangles.Add(vertexIndex+1);
                    triangles.Add(vertexIndex+2);
                    triangles.Add(vertexIndex+3);

                    //UVs for the face
                    uvs.Add( new Vector2(0,1));
                    uvs.Add( new Vector2(1,1));
                    uvs.Add( new Vector2(1,0));
                    uvs.Add( new Vector2(0,0));

                    //UV2s (lightmapping?)
                    uv2s.Add( new Vector2(0,1));
                    uv2s.Add( new Vector2(1,1));
                    uv2s.Add( new Vector2(1,0));
                    uv2s.Add( new Vector2(0,0));
                }

                //ZY face
                //if((l_blockShape & BlockShape.NegXFace) == BlockShape.NegXFace)
                {
                    vertexIndex = vertices.Count;
                    //top left, top right, bottom right, bottom left
                    vertices.Add(new Vector3(x+.2f, y + 1, z+.8f));
                    vertices.Add(new Vector3(x+.2f, y + 1, z+.2f));
                    vertices.Add(new Vector3(x+.2f, y , z+.2f));
                    vertices.Add(new Vector3(x+.2f, y , z+.8f));

                    // first triangle for the face 
                    triangles.Add(vertexIndex);
                    triangles.Add(vertexIndex+1);
                    triangles.Add(vertexIndex+3);

                    // second triangle for the face
                    triangles.Add(vertexIndex+1);
                    triangles.Add(vertexIndex+2);
                    triangles.Add(vertexIndex+3);

                    //UVs for the face
                    uvs.Add( new Vector2(0,1));
                    uvs.Add( new Vector2(1,1));
                    uvs.Add( new Vector2(1,0));
                    uvs.Add( new Vector2(0,0));

                    //UV2s (lightmapping?)
                    uv2s.Add( new Vector2(0,1));
                    uv2s.Add( new Vector2(1,1));
                    uv2s.Add( new Vector2(1,0));
                    uv2s.Add( new Vector2(0,0));
                }

                //ZY X+1 face
            //  if((l_blockShape & BlockShape.PosXFace) == BlockShape.PosXFace)
                {
                    vertexIndex = vertices.Count;
                    //top left, top right, bottom right, bottom left
                    vertices.Add(new Vector3(x+.8f, y + 1, z+.2f));
                    vertices.Add(new Vector3(x+.8f, y + 1, z+.8f));
                    vertices.Add(new Vector3(x+.8f, y , z+.8f));
                    vertices.Add(new Vector3(x+.8f, y , z+.2f));

                    // first triangle for the face 
                    triangles.Add(vertexIndex);
                    triangles.Add(vertexIndex+1);
                    triangles.Add(vertexIndex+3);

                    // second triangle for the face
                    triangles.Add(vertexIndex+1);
                    triangles.Add(vertexIndex+2);
                    triangles.Add(vertexIndex+3);

                    //UVs for the face
                    uvs.Add( new Vector2(0,1));
                    uvs.Add( new Vector2(1,1));
                    uvs.Add( new Vector2(1,0));
                    uvs.Add( new Vector2(0,0));

                    //UV2s (lightmapping?)
                    uv2s.Add( new Vector2(0,1));
                    uv2s.Add( new Vector2(1,1));
                    uv2s.Add( new Vector2(1,0));
                    uv2s.Add( new Vector2(0,0));
                }

                //ZX face
                if((l_blockShape & BlockShape.NegYFace) == BlockShape.NegYFace)
                {
                    vertexIndex = vertices.Count;
                    //top left, top right, bottom right, bottom left
                    vertices.Add(new Vector3(x+.8f, y , z+.8f));
                    vertices.Add(new Vector3(x+.8f, y , z+.2f));
                    vertices.Add(new Vector3(x+.2f, y , z+.2f));
                    vertices.Add(new Vector3(x+.2f, y , z+.8f));

                    // first triangle for the face 
                    triangles.Add(vertexIndex+3);
                    triangles.Add(vertexIndex+1);
                    triangles.Add(vertexIndex);



                    // second triangle for the face
                    triangles.Add(vertexIndex+3);
                    triangles.Add(vertexIndex+2);
                    triangles.Add(vertexIndex+1);



                    //UVs for the face
                    uvs.Add( new Vector2(0,1));
                    uvs.Add( new Vector2(1,1));
                    uvs.Add( new Vector2(1,0));
                    uvs.Add( new Vector2(0,0));

                    //UV2s (lightmapping?)
                    uv2s.Add( new Vector2(0,1));
                    uv2s.Add( new Vector2(1,1));
                    uv2s.Add( new Vector2(1,0));
                    uv2s.Add( new Vector2(0,0));
                }

                //ZX + 1 face
                if((l_blockShape & BlockShape.PosYFace) == BlockShape.PosYFace)
                {
                    vertexIndex = vertices.Count;
                    //top left, top right, bottom right, bottom left

                    vertices.Add(new Vector3(x+.8f, y+1 , z+.2f));
                    vertices.Add(new Vector3(x+.8f, y+1 , z+.8f));
                    vertices.Add(new Vector3(x+.2f, y+1 , z+.8f));
                    vertices.Add(new Vector3(x+.2f, y+1 , z+.2f));

                    // first triangle for the face 
                    triangles.Add(vertexIndex+3);
                    triangles.Add(vertexIndex+1);
                    triangles.Add(vertexIndex);



                    // second triangle for the face
                    triangles.Add(vertexIndex+3);
                    triangles.Add(vertexIndex+2);
                    triangles.Add(vertexIndex+1);



                    //UVs for the face
                    uvs.Add( new Vector2(0,1));
                    uvs.Add( new Vector2(1,1));
                    uvs.Add( new Vector2(1,0));
                    uvs.Add( new Vector2(0,0));

                    //UV2s (lightmapping?)
                    uv2s.Add( new Vector2(0,1));
                    uv2s.Add( new Vector2(1,1));
                    uv2s.Add( new Vector2(1,0));
                    uv2s.Add( new Vector2(0,0));
                }       
    }

© Game Development or respective owner

Related posts about c#

Related posts about unity