/// <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); } }
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 } }
/// <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); } }
/// <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++; }
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); }