Esempio n. 1
0
        public void BuildData(List <Model3D.MeshData> meshes)
        {
            if (meshes.Count != 0)
            {
                System.Console.WriteLine("duplicate");
            }

            {
                int target_c = (int)TempMeshes.count + meshes.Count;
                if (meshes.Capacity < target_c)
                {
                    meshes.Capacity = target_c;
                }
            }

            Dictionary <TempVertex, TempVertex> vert_temp = null;

            Model3D.MeshData md;
            TempMesh         mesh_iter;
            TempVertex       vert_iter;
            uint             mesh_iter_n, vert_iter_n, next_ind, u_pos; int v_count;
            float            fw, fh;

            for (mesh_iter = TempMeshes.first,
                 mesh_iter_n = TempMeshes.count;
                 0 != mesh_iter_n;
                 mesh_iter = mesh_iter.next,
                 --mesh_iter_n)
            {
                v_count = null == (object)(
                    vert_temp = TempVertex.Process(ref mesh_iter.references.list, utilize: vert_temp)
                    ) ? 0 : vert_temp.Count;
                md = new Model3D.MeshData()
                {
                    vertices = new Vector3[v_count],
                    normals  = new Vector3[v_count],
                    colors   = new Vector4[v_count],
                    texCoord = new Vector2[v_count],
                    indices  = new uint[mesh_iter.references.list.count],
                    texture  = ContentPipe.LoadTexture(
                        mesh_iter.references.bmp,
                        mesh_iter.value.info.wrapS,
                        mesh_iter.value.info.wrapT),
                    material = mesh_iter.value.getMaterial(),
                };
                fw = ((uint)mesh_iter.references.bmp.Width << 5);
                fh = ((uint)mesh_iter.references.bmp.Height << 5);
                for (
                    u_pos = 0, next_ind = 0,
                    vert_iter = mesh_iter.references.list.first,
                    vert_iter_n = mesh_iter.references.list.count;
                    0 != vert_iter_n;
                    vert_iter = vert_iter.next,
                    u_pos++,
                    --vert_iter_n)
                {
                    md.indices[u_pos] = vert_iter.index;
                    if (vert_iter.index != next_ind)
                    {
                        continue;
                    }
                    md.vertices[next_ind]   = vert_iter.value.position;
                    md.texCoord[next_ind].X = vert_iter.value.texCoord.X / fw;
                    md.texCoord[next_ind].Y = vert_iter.value.texCoord.Y / fh;
                    md.normals[next_ind]    = vert_iter.value.normal;
                    md.colors[next_ind]     = vert_iter.value.color;
                    next_ind++;
                }
                meshes.Add(md);
            }
        }