Exemple #1
0
        /// <summary>
        /// Unserializes a BinaryStream into the Attributes of this Instance
        /// </summary>
        /// <param name="reader">The Stream that contains the FileData</param>
        public override void Unserialize(System.IO.BinaryReader reader)
        {
            tried   = false;
            version = reader.ReadUInt32();

            string name = reader.ReadString();
            uint   myid = reader.ReadUInt32();

            sgres.Unserialize(reader);
            sgres.BlockID = myid;

            if (Parent.Fast)
            {
                elements.Clear();
                links.Clear();
                groups.Clear();
                joints.Clear();
                return;
            }

            int count = reader.ReadInt32();

            elements.Clear();
            for (int i = 0; i < count; i++)
            {
                GmdcElement e = new GmdcElement(this);
                e.Unserialize(reader);
                elements.Add(e);
            }

            count = reader.ReadInt32();
            links.Clear();
            for (int i = 0; i < count; i++)
            {
                GmdcLink l = new GmdcLink(this);
                l.Unserialize(reader);
                links.Add(l);
            }

            count = reader.ReadInt32();
            groups.Clear();
            for (int i = 0; i < count; i++)
            {
                GmdcGroup g = new GmdcGroup(this);
                g.Unserialize(reader);
                groups.Add(g);
            }

            model.Unserialize(reader);

            count = reader.ReadInt32();
            joints.Clear();
            for (int i = 0; i < count; i++)
            {
                GmdcJoint s = new GmdcJoint(this);
                s.Unserialize(reader);
                joints.Add(s);
            }
        }
Exemple #2
0
        void AddEnvelopes(GmdcGroup g, Ambertation.Scenes.Mesh m, GmdcElement bonee, GmdcElement bonewighte, Hashtable jointmap)
        {
            if (bonee != null && true)
            {
                int pos = 0;
                foreach (SimPe.Plugin.Gmdc.GmdcElementValueOneInt vi in bonee.Values)
                {
                    byte[]       data = vi.Bytes;
                    IntArrayList used = new IntArrayList();

                    for (int datapos = 0; datapos < 3; datapos++)                 //we can only store 3 bone weights
                    {
                        byte b = data[datapos];
                        if (b != 0xff && b < g.UsedJoints.Count)
                        {
                            int bnr = g.UsedJoints[b];
                            if (used.Contains(bnr))
                            {
                                continue;
                            }


                            used.Add(bnr);
                            Ambertation.Scenes.Joint nj = jointmap[bnr] as Ambertation.Scenes.Joint;
                            if (nj != null)
                            {
                                double w = 1;
                                if (bonewighte != null)
                                {
                                    if (bonewighte.Values.Count > pos)
                                    {
                                        SimPe.Plugin.Gmdc.GmdcElementValueBase v = bonewighte.Values[pos];
                                        if (datapos < v.Data.Length)
                                        {
                                            w = v.Data[datapos];
                                        }
                                    }
                                }

                                //if there is no envelope for nj, make sure we get a new one
                                //with pos 0-Weights inserted
                                Ambertation.Scenes.Envelope e = m.GetJointEnvelope(nj, pos);
                                e.Weights.Add(w);
                                //added = true;
                            }
                        }
                    }

                    pos++;
                    m.SyncEnvelopeLenghts(pos); //fill all unset EnvelopeWeights with 0
                }                               // bonee.Values
            }
        }
Exemple #3
0
        /// <summary>
        /// Parses the complete Mesh Section
        /// </summary>
        /// <param name="grps"></param>
        /// <param name="ct"></param>
        void ParseMeshSection(ImportedGroups grps, int ct)
        {
            for (int i = 0; i < ct; i++)
            {
                ImportedGroup g = this.PrepareGroup();


                //BoneLinks-----
                GmdcElement e = new GmdcElement(Gmdc);
                g.Elements.Add(e);
                e.Identity    = ElementIdentity.BoneAssignment;
                e.BlockFormat = BlockFormat.OneDword;
                e.SetFormat   = SetFormat.Secondary;

                //BoneWeights-----
                e = new GmdcElement(Gmdc);
                g.Elements.Add(e);
                e.Identity    = ElementIdentity.BoneWeights;
                e.BlockFormat = BlockFormat.OneFloat;
                e.SetFormat   = SetFormat.Secondary;

                //Read the Mesh Data
                ReadMeshDescription(g);
                int vertcount = ReadCount();
                for (int k = 0; k < vertcount; k++)
                {
                    ReadVertexData(g);
                }

                int vertnormcount = ReadCount();
                for (int k = 0; k < vertnormcount; k++)
                {
                    ReadVertexNormalData(g);
                }

                int facecount = ReadCount();
                for (int k = 0; k < facecount; k++)
                {
                    ReadFaceData(g);
                }

                RemoveDuplicates(g);
                grps.Add(g);
            }
        }
Exemple #4
0
        /// <summary>
        /// This is called whenever a Group (=subSet) needs to processed
        /// </summary>
        /// <remarks>
        /// You can use the UVCoordinateElement, NormalElement,
        /// VertexElement, Group and Link Members in this Method.
        ///
        /// This Method is only called, when the Group, Link and
        /// Vertex Members are set (not null). The other still can
        /// be Null!
        ///
        /// Use the writer member to write to the File.
        /// </remarks>
        protected override void ProcessGroup()
        {
            //Find the BoneAssignment
            GmdcElement boneelement = this.Link.FindElementType(ElementIdentity.BoneAssignment);
            //List of ordered Joints
            IntArrayList js = Gmdc.SortJoints();


            writer.WriteLine("\"" + Group.Name + "\" 0 -1");


            //first, write the availabel Vertices
            int vertexcount = 0;
            int nr          = Link.GetElementNr(VertexElement);
            int nnr         = -1;

            if (this.UVCoordinateElement != null)
            {
                nnr = Link.GetElementNr(UVCoordinateElement);
            }
            writer.WriteLine(Link.ReferencedSize.ToString());

            for (int i = 0; i < Link.ReferencedSize; i++)
            {
                //Make sure we transform to the desired Coordinate-System
                Vector3f v = new Vector3f(Link.GetValue(nr, i).Data[0], Link.GetValue(nr, i).Data[1], Link.GetValue(nr, i).Data[2]);
                v = Component.TransformScaled(v);

                writer.Write("0 " +
                             v.X.ToString("N12", AbstractGmdcExporter.DefaultCulture) + " " +
                             v.Y.ToString("N12", AbstractGmdcExporter.DefaultCulture) + " " +
                             v.Z.ToString("N12", AbstractGmdcExporter.DefaultCulture) + " ");

                if (nnr != -1)
                {
                    writer.Write(
                        (Link.GetValue(nnr, i).Data[0]).ToString("N6", AbstractGmdcExporter.DefaultCulture) + " " +
                        (Link.GetValue(nnr, i).Data[1]).ToString("N6", AbstractGmdcExporter.DefaultCulture) + " ");
                }
                else
                {
                    writer.Write(" 0.000000 0.000000 ");
                }


                if (boneelement == null)
                {
                    writer.WriteLine("-1");
                }
                else
                {
                    int bnr = Link.GetRealIndex(nr, i);
                    if (bnr == -1)
                    {
                        writer.WriteLine("-1");
                    }
                    else
                    {
                        bnr = ((SimPe.Plugin.Gmdc.GmdcElementValueOneInt)boneelement.Values[bnr]).Value;
                        if (bnr == -1)
                        {
                            writer.WriteLine("-1");
                        }
                        else
                        {
                            bnr = bnr & 0xff;
                            bnr = Group.UsedJoints[bnr];
                            for (int ij = 0; ij < js.Count; ij++)
                            {
                                if (js[ij] == bnr)
                                {
                                    bnr = ij; break;
                                }
                            }
                            writer.WriteLine(bnr.ToString());
                        }
                    }
                }
            }

            //Add a MeshNormal Section if available
            if (this.NormalElement != null)
            {
                nr = Link.GetElementNr(NormalElement);
                writer.WriteLine(Link.ReferencedSize.ToString());
                for (int i = 0; i < Link.ReferencedSize; i++)
                {
                    Vector3f v = new Vector3f(Link.GetValue(nr, i).Data[0], Link.GetValue(nr, i).Data[1], Link.GetValue(nr, i).Data[2]);
                    v = Component.TransformNormal(v);

                    writer.WriteLine(
                        v.X.ToString("N12", AbstractGmdcExporter.DefaultCulture) + " " +
                        v.Y.ToString("N12", AbstractGmdcExporter.DefaultCulture) + " " +
                        v.Z.ToString("N12", AbstractGmdcExporter.DefaultCulture));
                }
            }
            else
            {
                writer.WriteLine("0");
            }


            //Export Faces
            writer.WriteLine(Group.FaceCount.ToString());
            for (int i = 0; i < Group.Faces.Count; i += 3)
            {
                writer.WriteLine("0 " +
                                 Group.Faces[i + 0].ToString() + " " +
                                 Group.Faces[i + 1].ToString() + " " +
                                 Group.Faces[i + 2].ToString() + " " +
                                 Group.Faces[i + 0].ToString() + " " +
                                 Group.Faces[i + 1].ToString() + " " +
                                 Group.Faces[i + 2].ToString() + " 1");
            }

            vertexoffset += vertexcount;
            modelnr++;
        }
Exemple #5
0
        public Ambertation.Scenes.Scene GetScene(GmdcGroups groups, string absimgpath, string imgfolder, ElementOrder component)
        {
            if (absimgpath != null)
            {
                if (imgfolder == null)
                {
                    imgfolder = absimgpath;
                }
                imgfolder = imgfolder.Trim();
                if (imgfolder.Length > 0 && !imgfolder.EndsWith(@"\"))
                {
                    imgfolder += @"\";
                }

                if (!System.IO.Directory.Exists(absimgpath))
                {
                    System.IO.Directory.CreateDirectory(absimgpath);
                }
            }

            Scene scn = new Scene();

            Hashtable jointmap = new Hashtable();

            try
            {
                jointmap = AddJointsToScene(scn, component);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message + "\n" + ex.StackTrace);
            }


            TextureLocator tl = new TextureLocator(gmdc.Parent.Package);

            System.Collections.Hashtable txmts = tl.FindMaterials(gmdc.Parent);
            foreach (string key in txmtmap.Keys)
            {
                object o = txmtmap[key];
                if (o != null)
                {
                    txmts[key] = txmtmap[key];
                }
            }


            Hashtable txtrs = tl.FindReferencedTXTR(txmts, null);

            foreach (string key in txtrmap.Keys)
            {
                object o = txtrmap[key];
                if (o != null)
                {
                    txtrs[key] = o;
                }
            }

            txtrs = tl.GetLargestImages(txtrs);
            txmts = tl.GetMaterials(txmts, scn);
            tl.Dispose();

            foreach (GmdcGroup g in groups)
            {
                Ambertation.Scenes.Material mat = txmts[g.Name] as Ambertation.Scenes.Material;
                if (mat == null)
                {
                    mat = scn.CreateMaterial("mat_" + g.Name);
                }
                else
                {
                    mat.Name = "mat_" + g.Name;
                }
                System.IO.MemoryStream s = txtrs[g.Name] as System.IO.MemoryStream;
                if (s != null)
                {
                    try
                    {
                        System.Drawing.Image img = System.Drawing.Image.FromStream(s);
                        if (absimgpath != null)
                        {
                            img.Save(System.IO.Path.Combine(absimgpath, g.Name + ".png"), System.Drawing.Imaging.ImageFormat.Png);
                        }
                        mat.Texture.FileName     = imgfolder + g.Name + ".png";
                        mat.Texture.Size         = img.Size;
                        mat.Texture.TextureImage = img;
                    }
                    catch {}
                }
                Ambertation.Scenes.Mesh m = scn.CreateMesh(g.Name, mat);

                GmdcElement vertexe = g.Link.FindElementType(ElementIdentity.Vertex);
                //	GmdcElement vertexme = g.Link.FindElementType(ElementIdentity.MorphVertexDelta);
                GmdcElement normale    = g.Link.FindElementType(ElementIdentity.Normal);
                GmdcElement texte      = g.Link.FindElementType(ElementIdentity.UVCoordinate);
                GmdcElement bonee      = g.Link.FindElementType(ElementIdentity.BoneAssignment);
                GmdcElement bonewighte = g.Link.FindElementType(ElementIdentity.BoneWeights);
                GmdcElement bumpnormal = g.Link.FindElementType(ElementIdentity.BumpMapNormal);

                int nr = g.Link.GetElementNr(vertexe);
                //	int mnr = g.Link.GetElementNr(vertexme);
                for (int i = 0; i < g.Link.ReferencedSize; i++)
                {
                    Vector3f v = new Vector3f(g.Link.GetValue(nr, i).Data[0], g.Link.GetValue(nr, i).Data[1], g.Link.GetValue(nr, i).Data[2]);

                    /*Vector3f vm = new Vector3f(g.Link.GetValue(mnr, i).Data[0], g.Link.GetValue(mnr, i).Data[1], g.Link.GetValue(mnr, i).Data[2]);
                     * v += vm;*/
                    v = component.TransformScaled(v);

                    m.Vertices.Add(v.X, v.Y, v.Z);
                }

                if (normale != null)
                {
                    nr = g.Link.GetElementNr(normale);
                    for (int i = 0; i < g.Link.ReferencedSize; i++)
                    {
                        Vector3f v = new Vector3f(g.Link.GetValue(nr, i).Data[0], g.Link.GetValue(nr, i).Data[1], g.Link.GetValue(nr, i).Data[2]);
                        v = component.TransformNormal(v);
                        m.Normals.Add(v.X, v.Y, v.Z);
                    }
                }

                if (bumpnormal != null)
                {
                    nr = g.Link.GetElementNr(bumpnormal);
                    for (int i = 0; i < g.Link.ReferencedSize; i++)
                    {
                        Vector3f v = new Vector3f(g.Link.GetValue(nr, i).Data[0], g.Link.GetValue(nr, i).Data[1], g.Link.GetValue(nr, i).Data[2]);
                        v = component.TransformNormal(v);
                        m.BumpMapNormalDelta.Add(v.X, v.Y, v.Z);
                    }
                }

                if (texte != null)
                {
                    nr = g.Link.GetElementNr(texte);
                    for (int i = 0; i < g.Link.ReferencedSize; i++)
                    {
                        Vector2f v = new Vector2f(g.Link.GetValue(nr, i).Data[0], g.Link.GetValue(nr, i).Data[1]);
                        m.TextureCoordinates.Add(v.X, 1 - v.Y);
                    }
                }

                for (int i = 0; i < g.Faces.Count - 2; i += 3)
                {
                    m.FaceIndices.Add(g.Faces[i], g.Faces[i + 1], g.Faces[i + 2]);
                }

                AddEnvelopes(g, m, bonee, bonewighte, jointmap);
            }

            return(scn);
        }