示例#1
0
 /// <summary>
 /// 等値関数
 /// </summary>
 /// <param name="v">v</param>
 /// <returns></returns>
 public bool Equals(UnifiedPositionVertex v)
 {
     if ((object)v == null)
     {
         return(false);
     }
     return(this.position == v.position);
 }
示例#2
0
        /// <summary>
        /// 面リストを生成します。
        /// </summary>
        public static List <TSOFace> CreateFaces(TSOMesh mesh)
        {
            unified_position_vert_heap = new Heap <UnifiedPositionVertex>();
            List <TSOFace> faces = new List <TSOFace>();

            foreach (TSOSubMesh sub in mesh.sub_meshes)
            {
                ushort[] vert_indices = new ushort[sub.vertices.Length];
                for (int i = 0; i < vert_indices.Length; i++)
                {
                    UnifiedPositionVertex v = new UnifiedPositionVertex(sub.vertices[i], sub.bone_indices, sub.spec);
                    if (!unified_position_vert_heap.ContainsKey(v))
                    {
                        unified_position_vert_heap.Add(v);
                    }
                    vert_indices[i] = unified_position_vert_heap[v];
                }
                for (int i = 2; i < vert_indices.Length; i++)
                {
                    FaceVertex a, b, c;
                    if (i % 2 != 0)
                    {
                        a.i = vert_indices[i - 2];
                        b.i = vert_indices[i - 0];
                        c.i = vert_indices[i - 1];
                    }
                    else
                    {
                        a.i = vert_indices[i - 2];
                        b.i = vert_indices[i - 1];
                        c.i = vert_indices[i - 0];
                    }
                    if (a.i != b.i && b.i != c.i && c.i != a.i)
                    {
                        if (i % 2 != 0)
                        {
                            a.u = sub.vertices[i - 2].u;
                            a.v = sub.vertices[i - 2].v;
                            b.u = sub.vertices[i - 0].u;
                            b.v = sub.vertices[i - 0].v;
                            c.u = sub.vertices[i - 1].u;
                            c.v = sub.vertices[i - 1].v;
                        }
                        else
                        {
                            a.u = sub.vertices[i - 2].u;
                            a.v = sub.vertices[i - 2].v;
                            b.u = sub.vertices[i - 1].u;
                            b.v = sub.vertices[i - 1].v;
                            c.u = sub.vertices[i - 0].u;
                            c.v = sub.vertices[i - 0].v;
                        }
                        faces.Add(new TSOFace(a, b, c, sub.spec));
                    }
                }
            }
            return(faces);
        }
示例#3
0
        /// <summary>
        /// 等値関数
        /// </summary>
        /// <param name="obj">object</param>
        /// <returns></returns>
        public override bool Equals(object obj)
        {
            if (obj == null)
            {
                return(false);
            }
            UnifiedPositionVertex v = obj as UnifiedPositionVertex;

            if ((object)v == null)
            {
                return(false);
            }
            return(this.position == v.position);
        }
 public UnifiedPositionTexcoordVertex(UnifiedPositionVertex v, float x, float y, Dictionary <int, ushort> bone_idmap)
 {
     this.position     = v.position;
     this.normal       = v.normal;
     this.u            = x;
     this.v            = y;
     this.skin_weights = new SkinWeight[4];
     for (int i = 0; i < 4; i++)
     {
         if (v.skin_weights[i].weight < WeightEpsilon)
         {
             this.skin_weights[i] = new SkinWeight(0, 0.0f);
         }
         else
         {
             this.skin_weights[i] = new SkinWeight(bone_idmap[v.skin_weights[i].bone_index], v.skin_weights[i].weight);
         }
     }
     GenerateBoneIndices();
 }
示例#5
0
        /// <summary>
        /// 比較関数
        /// </summary>
        /// <param name="obj">object</param>
        /// <returns></returns>
        public int CompareTo(object obj)
        {
            UnifiedPositionVertex v = obj as UnifiedPositionVertex;

            if ((object)v == null)
            {
                throw new ArgumentException("not a UnifiedPositionVertex");
            }
            int cmp = this.position.X.CompareTo(v.position.X);

            if (cmp == 0)
            {
                cmp = this.position.Y.CompareTo(v.position.Y);
            }
            if (cmp == 0)
            {
                cmp = this.position.Z.CompareTo(v.position.Z);
            }
            return(cmp);
        }
示例#6
0
        public static TSOSubMesh[] CreateSubMeshes(List <TSOFace> faces, int max_palettes)
        {
            List <TSOFace> faces_1 = faces;
            List <TSOFace> faces_2 = new List <TSOFace>();

            Heap <int> bh = new Heap <int>();
            Heap <UnifiedPositionTexcoordVertex> vh = new Heap <UnifiedPositionTexcoordVertex>();

            List <ushort>          vert_indices        = new List <ushort>();
            Dictionary <int, bool> adding_bone_indices = new Dictionary <int, bool>();
            List <TSOSubMesh>      sub_meshes          = new List <TSOSubMesh>();

            Console.WriteLine("  vertices bone_indices");
            Console.WriteLine("  -------- ------------");

            while (faces_1.Count != 0)
            {
                int spec = faces_1[0].spec;
                bh.Clear();
                vh.Clear();
                vert_indices.Clear();

                foreach (TSOFace f in faces_1)
                {
                    if (f.spec != spec)
                    {
                        faces_2.Add(f);
                        continue;
                    }
                    adding_bone_indices.Clear();

                    foreach (ushort i in f.vert_indices)
                    {
                        UnifiedPositionVertex v = unified_position_vert_heap.ary[i];
                        foreach (SkinWeight sw in v.skin_weights)
                        {
                            if (sw.weight < WeightEpsilon)
                            {
                                continue;
                            }
                            if (bh.ContainsKey(sw.bone_index))
                            {
                                continue;
                            }
                            adding_bone_indices[sw.bone_index] = true;
                        }
                    }

                    if (bh.Count + adding_bone_indices.Count > max_palettes)
                    {
                        faces_2.Add(f);
                        continue;
                    }
                    foreach (int bone_index in adding_bone_indices.Keys)
                    {
                        bh.Add(bone_index);
                    }

                    foreach (FaceVertex fv in f.vertices)
                    {
                        UnifiedPositionVertex         v = unified_position_vert_heap.ary[fv.i];
                        UnifiedPositionTexcoordVertex a = new UnifiedPositionTexcoordVertex(v, fv.u, fv.v, bh.map);
                        if (!vh.ContainsKey(a))
                        {
                            vh.Add(a);
                        }
                        vert_indices.Add(vh[a]);
                    }
                }
                //Console.WriteLine("#vert_indices:{0}", vert_indices.Count);
                ushort[] optimized_indices = NvTriStrip.Optimize(vert_indices.ToArray());
                //Console.WriteLine("#optimized_indices:{0}", optimized_indices.Length);

                TSOSubMesh sub = new TSOSubMesh();
                sub.spec = spec;
                //Console.WriteLine("#bone_indices:{0}", bh.Count);
                sub.bone_indices = bh.ary.ToArray();

                UnifiedPositionTexcoordVertex[] vertices = new UnifiedPositionTexcoordVertex[optimized_indices.Length];
                for (int i = 0; i < optimized_indices.Length; i++)
                {
                    vertices[i] = vh.ary[optimized_indices[i]];
                }
                sub.vertices = vertices;

                Console.WriteLine("  {0,8} {1,12}", sub.vertices.Length, sub.bone_indices.Length);

                sub_meshes.Add(sub);

                List <TSOFace> faces_tmp = faces_1;
                faces_1 = faces_2;
                faces_2 = faces_tmp;
                faces_tmp.Clear();
            }
            return(sub_meshes.ToArray());
        }