Example #1
0
        public override void Open(HSDReader Reader)
        {
            base.Open(Reader);

            ImageArray = new HSD_PointerArray <HSD_IOBJ>()
            {
                SetSize = _imagecount
            };
            Reader.Seek(ImageArrayOffset);
            ImageArray.Open(Reader);
            TlutArray = new HSD_PointerArray <HSD_Tlut>()
            {
                SetSize = _tlutcount
            };
            Reader.Seek(TlutArrayOffset);
            TlutArray.Open(Reader);
        }
Example #2
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="triList"></param>
        /// <param name="attrGroup"></param>
        /// <param name="weights"></param>
        public HSD_POBJ CreatePOBJ(List <GXVertex> triList, HSD_AttributeGroup attrGroup, List <HSD_JOBJWeight> weights)
        {
            TriangleConverter.TriangleConverter converter = new TriangleConverter.TriangleConverter(true, 100, 3, true);
            int pointCount, faceCount;

            var groups = converter.GroupPrimitives(triList.ToArray(), out pointCount, out faceCount);

            HSD_POBJ rootPOBJ = null;
            HSD_POBJ prevPOBJ = null;

            foreach (var g in groups)
            {
                var jobjweights = new List <HSD_JOBJWeight>();
                var pmidToNewID = new Dictionary <ushort, ushort>();

                foreach (var n in g._nodes)
                {
                    pmidToNewID.Add(n, (ushort)(jobjweights.Count * 3));
                    jobjweights.Add(weights[n / 3]);
                }

                GXDisplayList newdl = new GXDisplayList();

                foreach (var t in g._triangles)
                {
                    var newVert = new List <GXVertex>();
                    for (int p = 0; p < t.Points.Count; p++)
                    {
                        var point = t.Points[p];
                        point.PMXID = pmidToNewID[point.PMXID];
                        t.Points[p] = point;
                        newVert.Add(point);
                        //Console.WriteLine(t.points[p].PMID + " " + point.PMXID + " " + pmidToNewID[point.PMXID] + " " + jobjweights.Count);
                    }

                    newdl.Primitives.Add(Compress(GXPrimitiveType.Triangles, newVert.ToArray(), attrGroup));
                }
                foreach (var t in g._tristrips)
                {
                    var newVert = new List <GXVertex>();
                    for (int p = 0; p < t.Points.Count; p++)
                    {
                        //Console.WriteLine(t.Points[p].PMXID + " " + g._nodes.Count);
                        var point = t.Points[p];
                        point.PMXID = pmidToNewID[point.PMXID];
                        t.Points[p] = point;
                        newVert.Add(point);
                    }
                    newdl.Primitives.Add(Compress(GXPrimitiveType.TriangleStrip, newVert.ToArray(), attrGroup));
                }

                HSD_PointerArray <HSD_JOBJWeight> bindWeights = new HSD_PointerArray <HSD_JOBJWeight>();
                bindWeights.Elements = jobjweights.ToArray();

                var newpobj = new HSD_POBJ();

                newpobj.Flags             = POBJ_FLAG.ENVELOPE;
                newpobj.BindGroups        = bindWeights;
                newpobj.VertexAttributes  = attrGroup;
                newpobj.DisplayListBuffer = newdl.ToBuffer(attrGroup);

                if (prevPOBJ == null)
                {
                    rootPOBJ = newpobj;
                }
                else
                {
                    prevPOBJ.Next = newpobj;
                }
                prevPOBJ = newpobj;
            }

            return(rootPOBJ);
        }