public static int GetIdByName(string name) { int ret; if (!BrgAttachpoint.TryGetIdByName(name, out ret)) { throw new Exception("Invalid Attachpoint Name " + name + "!"); } return(ret); }
public BrgAttachpoint(BrgAttachpoint prev) { Index = prev.Index; NameId = prev.NameId; XVector = prev.XVector; YVector = prev.YVector; ZVector = prev.ZVector; Position = prev.Position; BoundingBoxMin = prev.BoundingBoxMin; BoundingBoxMax = prev.BoundingBoxMax; }
public BrgMesh(BrgBinaryReader reader, BrgFile file) : base() { this.ParentFile = file; this.Header = new BrgMeshHeader(reader); this.VertexMaterials = new List<Int16>(); if (!this.Header.Flags.HasFlag(BrgMeshFlag.PARTICLEPOINTS)) { this.Vertices = new List<Vector3D>(this.Header.NumVertices); for (int i = 0; i < this.Header.NumVertices; i++) { this.Vertices.Add(reader.ReadVector3D(true, this.Header.Version == 22)); } this.Normals = new List<Vector3D>(this.Header.NumVertices); for (int i = 0; i < this.Header.NumVertices; i++) { if (this.Header.Version >= 13 && this.Header.Version <= 17) { reader.ReadInt16(); // No idea what this is } else // v == 18, 19 or 22 { this.Normals.Add(reader.ReadVector3D(true, this.Header.Version == 22)); } } if ((!this.Header.Flags.HasFlag(BrgMeshFlag.SECONDARYMESH) || this.Header.Flags.HasFlag(BrgMeshFlag.ANIMTEXCOORDS) || this.Header.Flags.HasFlag(BrgMeshFlag.PARTICLESYSTEM)) && this.Header.Flags.HasFlag(BrgMeshFlag.TEXCOORDSA)) { this.TextureCoordinates = new List<Vector3D>(this.Header.NumVertices); for (int i = 0; i < this.Header.NumVertices; i++) { this.TextureCoordinates.Add(new Vector3D(reader.ReadVector2D(this.Header.Version == 22), 0f)); } } if (!this.Header.Flags.HasFlag(BrgMeshFlag.SECONDARYMESH) || this.Header.Flags.HasFlag(BrgMeshFlag.PARTICLESYSTEM)) { this.Faces = new List<Face>(this.Header.NumFaces); for (int i = 0; i < this.Header.NumFaces; ++i) { this.Faces.Add(new Face()); } if (this.Header.Flags.HasFlag(BrgMeshFlag.MATERIAL)) { for (int i = 0; i < this.Header.NumFaces; i++) { this.Faces[i].MaterialIndex = reader.ReadInt16(); } } for (int i = 0; i < this.Header.NumFaces; i++) { this.Faces[i].Indices.Add(reader.ReadInt16()); this.Faces[i].Indices.Add(reader.ReadInt16()); this.Faces[i].Indices.Add(reader.ReadInt16()); } if (this.Header.Flags.HasFlag(BrgMeshFlag.MATERIAL)) { this.VertexMaterials = new List<Int16>(this.Header.NumVertices); for (int i = 0; i < this.Header.NumVertices; i++) { this.VertexMaterials.Add(reader.ReadInt16()); } } } } this.UserDataEntries = new BrgUserDataEntry[this.Header.UserDataEntryCount]; if (!this.Header.Flags.HasFlag(BrgMeshFlag.PARTICLEPOINTS)) { for (int i = 0; i < this.Header.UserDataEntryCount; i++) { this.UserDataEntries[i] = reader.ReadUserDataEntry(false); } } this.ExtendedHeader = new BrgMeshExtendedHeader(reader, this.Header.ExtendedHeaderSize); this.particleData = new float[0]; if (this.Header.Flags.HasFlag(BrgMeshFlag.PARTICLEPOINTS)) { this.particleData = new float[4 * this.Header.NumVertices]; for (int i = 0; i < this.particleData.Length; i++) { this.particleData[i] = reader.ReadSingle(); } for (int i = 0; i < this.Header.UserDataEntryCount; i++) { this.UserDataEntries[i] = reader.ReadUserDataEntry(true); } } if (this.Header.Version == 13) { reader.ReadBytes(this.ExtendedHeader.NameLength); } if (this.Header.Version >= 13 && this.Header.Version <= 18) { this.Header.Flags |= BrgMeshFlag.ATTACHPOINTS; } if (this.Header.Flags.HasFlag(BrgMeshFlag.ATTACHPOINTS)) { Int16 numMatrix = this.ExtendedHeader.NumDummies; Int16 numIndex = this.ExtendedHeader.NumNameIndexes; if (this.Header.Version == 19 || this.Header.Version == 22) { numMatrix = reader.ReadInt16(); numIndex = reader.ReadInt16(); reader.ReadInt16(); } BrgAttachpoint[] attpts = new BrgAttachpoint[numMatrix]; for (int i = 0; i < numMatrix; i++) { attpts[i] = new BrgAttachpoint(); } for (int i = 0; i < numMatrix; i++) { attpts[i].XVector = reader.ReadVector3D(true, this.Header.Version == 22); } for (int i = 0; i < numMatrix; i++) { attpts[i].YVector = reader.ReadVector3D(true, this.Header.Version == 22); } for (int i = 0; i < numMatrix; i++) { attpts[i].ZVector = reader.ReadVector3D(true, this.Header.Version == 22); } if (this.Header.Version == 19 || this.Header.Version == 22) { for (int i = 0; i < numMatrix; i++) { attpts[i].Position = reader.ReadVector3D(true, this.Header.Version == 22); } } for (int i = 0; i < numMatrix; i++) { attpts[i].BoundingBoxMin = reader.ReadVector3D(true, this.Header.Version == 22); } for (int i = 0; i < numMatrix; i++) { attpts[i].BoundingBoxMax = reader.ReadVector3D(true, this.Header.Version == 22); } List<int> nameId = new List<int>(); for (int i = 0; i < numIndex; i++) { int duplicate = reader.ReadInt32(); // have yet to find a model with duplicates reader.ReadInt32(); // Skip the id (at least I think its an ID) for (int j = 0; j < duplicate; j++) { nameId.Add(i); } } this.Attachpoints = new List<BrgAttachpoint>(); for (int i = 0; i < nameId.Count; i++) { this.Attachpoints.Add(new BrgAttachpoint(attpts[reader.ReadByte()])); this.Attachpoints[i].NameId = nameId[i]; //attpts[reader.ReadByte()].NameId = nameId[i]; } //attachpoints = new List<BrgAttachpoint>(attpts); } else { this.Attachpoints = new List<BrgAttachpoint>(); } if (((this.Header.Flags.HasFlag(BrgMeshFlag.COLORALPHACHANNEL) || this.Header.Flags.HasFlag(BrgMeshFlag.COLORCHANNEL)) && !this.Header.Flags.HasFlag(BrgMeshFlag.SECONDARYMESH)) || this.Header.Flags.HasFlag(BrgMeshFlag.ANIMVERTCOLORALPHA)) { this.Colors = new List<Color4D>(this.Header.NumVertices); for (int i = 0; i < this.Header.NumVertices; i++) { this.Colors.Add(reader.ReadTexel()); } } // Only seen on first mesh this.NonUniformKeys = new float[0]; if (this.Header.AnimationType.HasFlag(BrgMeshAnimType.NonUniform)) { this.NonUniformKeys = new float[this.ExtendedHeader.NumNonUniformKeys]; for (int i = 0; i < this.ExtendedHeader.NumNonUniformKeys; i++) { this.NonUniformKeys[i] = reader.ReadSingle(); } } if (this.Header.Version >= 14 && this.Header.Version <= 19) { // Face Normals?? Vector3D[] legacy = new Vector3D[this.Header.NumFaces]; for (int i = 0; i < this.Header.NumFaces; i++) { legacy[i] = reader.ReadVector3D(); } } if (!this.Header.Flags.HasFlag(BrgMeshFlag.SECONDARYMESH) && this.Header.Version != 22) { reader.ReadBytes(ExtendedHeader.ShadowNameLength0 + ExtendedHeader.ShadowNameLength1); } }
private void attachpointListBox_MouseDoubleClick(object sender, MouseEventArgs e) { int index = attachpointListBox.IndexFromPoint(e.Location); if (index != System.Windows.Forms.ListBox.NoMatches) { BrgAttachpoint att = new BrgAttachpoint(); att.NameId = BrgAttachpoint.GetIdByName((string)attachpointListBox.Items[index]); Maxscript.NewDummy("newDummy", att.GetMaxName(), att.GetMaxTransform(), att.GetMaxPosition(), att.GetMaxBoxSize(), att.GetMaxScale()); } }
public BrgMesh(BrgBinaryReader reader, BrgFile file) : this(file) { this.ParentFile = file; this.Header = new BrgMeshHeader(reader); if (!this.Header.Flags.HasFlag(BrgMeshFlag.PARTICLEPOINTS)) { this.Vertices = new List <Vector3>(this.Header.NumVertices); for (int i = 0; i < this.Header.NumVertices; i++) { this.Vertices.Add(reader.ReadVector3D(true, this.Header.Version == 22)); } this.Normals = new List <Vector3>(this.Header.NumVertices); for (int i = 0; i < this.Header.NumVertices; i++) { if (this.Header.Version >= 13 && this.Header.Version <= 17) { reader.ReadInt16(); // TODO figure this out } else // v == 18, 19 or 22 { this.Normals.Add(reader.ReadVector3D(true, this.Header.Version == 22)); } } if ((!this.Header.Flags.HasFlag(BrgMeshFlag.SECONDARYMESH) || this.Header.Flags.HasFlag(BrgMeshFlag.ANIMTEXCOORDS) || this.Header.Flags.HasFlag(BrgMeshFlag.PARTICLESYSTEM)) && this.Header.Flags.HasFlag(BrgMeshFlag.TEXCOORDSA)) { this.TextureCoordinates = new List <Vector3>(this.Header.NumVertices); for (int i = 0; i < this.Header.NumVertices; i++) { this.TextureCoordinates.Add(new Vector3(reader.ReadVector2D(this.Header.Version == 22), 0f)); } } if (!this.Header.Flags.HasFlag(BrgMeshFlag.SECONDARYMESH) || this.Header.Flags.HasFlag(BrgMeshFlag.PARTICLESYSTEM)) { this.Faces = new List <Face>(this.Header.NumFaces); for (int i = 0; i < this.Header.NumFaces; ++i) { this.Faces.Add(new Face()); } if (this.Header.Flags.HasFlag(BrgMeshFlag.MATERIAL)) { for (int i = 0; i < this.Header.NumFaces; i++) { this.Faces[i].MaterialIndex = reader.ReadInt16(); } } for (int i = 0; i < this.Header.NumFaces; i++) { this.Faces[i].Indices.Add(reader.ReadInt16()); this.Faces[i].Indices.Add(reader.ReadInt16()); this.Faces[i].Indices.Add(reader.ReadInt16()); } if (this.Header.Flags.HasFlag(BrgMeshFlag.MATERIAL)) { this.VertexMaterials = new List <Int16>(this.Header.NumVertices); for (int i = 0; i < this.Header.NumVertices; i++) { this.VertexMaterials.Add(reader.ReadInt16()); } } } } this.UserDataEntries = new BrgUserDataEntry[this.Header.UserDataEntryCount]; if (!this.Header.Flags.HasFlag(BrgMeshFlag.PARTICLEPOINTS)) { for (int i = 0; i < this.Header.UserDataEntryCount; i++) { this.UserDataEntries[i] = reader.ReadUserDataEntry(false); } } this.ExtendedHeader = new BrgMeshExtendedHeader(reader, this.Header.ExtendedHeaderSize); if (this.Header.Flags.HasFlag(BrgMeshFlag.PARTICLEPOINTS)) { this.particleData = new float[4 * this.Header.NumVertices]; for (int i = 0; i < this.particleData.Length; i++) { this.particleData[i] = reader.ReadSingle(); } for (int i = 0; i < this.Header.UserDataEntryCount; i++) { this.UserDataEntries[i] = reader.ReadUserDataEntry(true); } } if (this.Header.Version == 13) { reader.ReadBytes(this.ExtendedHeader.NameLength); } if (this.Header.Version >= 13 && this.Header.Version <= 18) { this.Header.Flags |= BrgMeshFlag.ATTACHPOINTS; } if (this.Header.Flags.HasFlag(BrgMeshFlag.ATTACHPOINTS)) { Int16 numMatrix = this.ExtendedHeader.NumDummies; Int16 numIndex = this.ExtendedHeader.NumNameIndexes; if (this.Header.Version == 19 || this.Header.Version == 22) { numMatrix = reader.ReadInt16(); numIndex = reader.ReadInt16(); reader.ReadInt16(); } BrgAttachpoint[] attpts = new BrgAttachpoint[numMatrix]; for (int i = 0; i < numMatrix; i++) { attpts[i] = new BrgAttachpoint(); } for (int i = 0; i < numMatrix; i++) { attpts[i].XVector = reader.ReadVector3D(true, this.Header.Version == 22); } for (int i = 0; i < numMatrix; i++) { attpts[i].YVector = reader.ReadVector3D(true, this.Header.Version == 22); } for (int i = 0; i < numMatrix; i++) { attpts[i].ZVector = reader.ReadVector3D(true, this.Header.Version == 22); } if (this.Header.Version == 19 || this.Header.Version == 22) { for (int i = 0; i < numMatrix; i++) { attpts[i].Position = reader.ReadVector3D(true, this.Header.Version == 22); } } for (int i = 0; i < numMatrix; i++) { attpts[i].BoundingBoxMin = reader.ReadVector3D(true, this.Header.Version == 22); } for (int i = 0; i < numMatrix; i++) { attpts[i].BoundingBoxMax = reader.ReadVector3D(true, this.Header.Version == 22); } List <int> nameId = new List <int>(); for (int i = 0; i < numIndex; i++) { int duplicate = reader.ReadInt32(); // have yet to find a model with duplicates reader.ReadInt32(); // TODO figure out what this means for (int j = 0; j < duplicate; j++) { nameId.Add(i); } } for (int i = 0; i < nameId.Count; i++) { this.Attachpoints.Add(new BrgAttachpoint(attpts[reader.ReadByte()])); this.Attachpoints[i].NameId = nameId[i]; //attpts[reader.ReadByte()].NameId = nameId[i]; } //attachpoints = new List<BrgAttachpoint>(attpts); } if (((this.Header.Flags.HasFlag(BrgMeshFlag.COLORALPHACHANNEL) || this.Header.Flags.HasFlag(BrgMeshFlag.COLORCHANNEL)) && !this.Header.Flags.HasFlag(BrgMeshFlag.SECONDARYMESH)) || this.Header.Flags.HasFlag(BrgMeshFlag.ANIMVERTCOLORALPHA)) { this.Colors = new List <Color4D>(this.Header.NumVertices); for (int i = 0; i < this.Header.NumVertices; i++) { this.Colors.Add(reader.ReadTexel()); } } // Only seen on first mesh if (this.Header.AnimationType.HasFlag(BrgMeshAnimType.NonUniform)) { this.NonUniformKeys = new List <float>(this.ExtendedHeader.NumNonUniformKeys); for (int i = 0; i < this.ExtendedHeader.NumNonUniformKeys; i++) { this.NonUniformKeys[i] = reader.ReadSingle(); } } if (this.Header.Version >= 14 && this.Header.Version <= 19) { // Face Normals?? Vector3[] legacy = new Vector3[this.Header.NumFaces]; for (int i = 0; i < this.Header.NumFaces; i++) { legacy[i] = reader.ReadVector3D(); } } if (!this.Header.Flags.HasFlag(BrgMeshFlag.SECONDARYMESH) && this.Header.Version != 22) { reader.ReadBytes(ExtendedHeader.ShadowNameLength0 + ExtendedHeader.ShadowNameLength1); } }
public void ReadJson(JsonReader reader) { int count = 0; while (reader.Read()) { if (reader.TokenType == JsonToken.EndObject) { break; } if (reader.TokenType == JsonToken.PropertyName) { switch ((string)reader.Value) { case nameof(Header): Header.ReadJson(reader); break; case nameof(ExtendedHeader): ExtendedHeader.ReadJson(reader); break; case nameof(UserDataEntries): while (reader.Read()) { if (reader.TokenType == JsonToken.StartArray) { continue; } if (reader.TokenType == JsonToken.EndArray) { break; } // TODO } break; case nameof(particleData): while (reader.Read()) { if (reader.TokenType == JsonToken.StartArray) { continue; } if (reader.TokenType == JsonToken.EndArray) { break; } // TODO } break; case nameof(NonUniformKeys): while (reader.Read()) { if (reader.TokenType == JsonToken.StartArray) { continue; } if (reader.TokenType == JsonToken.EndArray) { break; } NonUniformKeys.Add((float)(double)reader.Value); } break; case nameof(Attachpoints): while (reader.Read()) { if (reader.TokenType == JsonToken.StartArray) { continue; } if (reader.TokenType == JsonToken.EndArray) { break; } BrgAttachpoint a = new BrgAttachpoint(); a.ReadJson(reader); Attachpoints.Add(a); } break; case nameof(Vertices): reader.Read(); // StartArray while (reader.Read()) { if (reader.TokenType == JsonToken.EndArray) { break; } Vector3 v = reader.ReadAsVector3(); Vertices.Add(v); } break; case nameof(Normals): reader.Read(); // StartArray while (reader.Read()) { if (reader.TokenType == JsonToken.EndArray) { break; } Vector3 v = reader.ReadAsVector3(); Normals.Add(v); } break; case nameof(TextureCoordinates): reader.Read(); // StartArray while (reader.Read()) { if (reader.TokenType == JsonToken.EndArray) { break; } Vector3 v = reader.ReadAsVector3(); TextureCoordinates.Add(v); } break; case nameof(Colors): reader.Read(); // StartArray while (reader.Read()) { if (reader.TokenType == JsonToken.EndArray) { break; } Color4D c = new Color4D(); c.ReadJson(reader); Colors.Add(c); } break; case nameof(Faces): count = 0; reader.Read(); // StartArray while (reader.Read()) { if (reader.TokenType == JsonToken.EndArray) { break; } Face f; if (Faces.Count <= count) { f = new Face(); Faces.Add(f); } else { f = Faces[count]; } ++count; while (reader.Read()) { if (reader.TokenType == JsonToken.StartArray) { continue; } if (reader.TokenType == JsonToken.EndArray) { break; } f.Indices.Add((Int16)(Int64)reader.Value); } } break; case "FaceMaterials": count = 0; reader.Read(); // StartArray while (reader.Read()) { if (reader.TokenType == JsonToken.EndArray) { break; } Face f; if (Faces.Count <= count) { f = new Face(); Faces.Add(f); } else { f = Faces[count]; } ++count; f.MaterialIndex = (Int16)(Int64)reader.Value; } break; case nameof(MeshAnimations): reader.Read(); // StartArray while (reader.Read()) { if (reader.TokenType == JsonToken.EndArray) { break; } BrgMesh m = new BrgMesh(this.ParentFile); m.ReadJson(reader); MeshAnimations.Add(m); } break; default: throw new Exception("Unexpected property name!"); } } else if (reader.TokenType != JsonToken.StartObject) { throw new Exception("Unexpected token type! " + reader.TokenType); } } }
private void ExportAttachpoints(string attachDummy, BrgMesh mesh, float time) { time += Maxscript.QueryFloat("animationRange.start.ticks / 4800.0"); //System.Windows.Forms.MessageBox.Show("4"); int numAttachpoints = Maxscript.QueryInteger("{0}.count", attachDummy); //System.Windows.Forms.MessageBox.Show("5 " + numAttachpoints); if (mesh.Header.Flags.HasFlag(BrgMeshFlag.ATTACHPOINTS)) { mesh.Attachpoints = new List<BrgAttachpoint>(); for (int i = 0; i < numAttachpoints; i++) { string aName = Maxscript.QueryString("{0}[{1}].name", attachDummy, i + 1); int nameId; if (!BrgAttachpoint.TryGetIdByName(aName.Substring(6), out nameId)) continue; BrgAttachpoint att = new BrgAttachpoint(); //System.Windows.Forms.MessageBox.Show(aName); //System.Windows.Forms.MessageBox.Show("5.1"); //System.Windows.Forms.MessageBox.Show(mesh.Attachpoints.Count + " " + i); att.NameId = nameId; Maxscript.Command("{0}[{1}].name = \"{2}\"", attachDummy, i + 1, att.GetMaxName()); //System.Windows.Forms.MessageBox.Show("5.2"); Maxscript.SetVarAtTime(time, "{0}Transform", "{0}[{1}].rotation as matrix3", attachDummy, i + 1); Maxscript.SetVarAtTime(time, "{0}Position", "{0}[{1}].position", attachDummy, i + 1); Maxscript.SetVarAtTime(time, "{0}Scale", "{0}[{1}].scale * {0}[{1}].boxsize", attachDummy, i + 1); //System.Windows.Forms.MessageBox.Show("5.3"); Vector3D scale = new Vector3D(Maxscript.QueryFloat("{0}Scale.X", attachDummy), Maxscript.QueryFloat("{0}Scale.Y", attachDummy), Maxscript.QueryFloat("{0}Scale.Z", attachDummy)); Vector3D bBox = scale / 2; //System.Windows.Forms.MessageBox.Show("5.4"); att.XVector.X = -Maxscript.QueryFloat("{0}Transform[1].z", attachDummy); att.XVector.Y = Maxscript.QueryFloat("{0}Transform[3].z", attachDummy); att.XVector.Z = -Maxscript.QueryFloat("{0}Transform[2].z", attachDummy); att.YVector.X = -Maxscript.QueryFloat("{0}Transform[1].y", attachDummy); att.YVector.Y = Maxscript.QueryFloat("{0}Transform[3].y", attachDummy); att.YVector.Z = -Maxscript.QueryFloat("{0}Transform[2].y", attachDummy); att.ZVector.X = -Maxscript.QueryFloat("{0}Transform[1].x", attachDummy); att.ZVector.Y = Maxscript.QueryFloat("{0}Transform[3].x", attachDummy); att.ZVector.Z = -Maxscript.QueryFloat("{0}Transform[2].x", attachDummy); att.Position.X = -Maxscript.QueryFloat("{0}Position.x", attachDummy); att.Position.Z = -Maxscript.QueryFloat("{0}Position.y", attachDummy); att.Position.Y = Maxscript.QueryFloat("{0}Position.z", attachDummy); //System.Windows.Forms.MessageBox.Show("5.5"); att.BoundingBoxMin.X = -bBox.X; att.BoundingBoxMin.Z = -bBox.Y; att.BoundingBoxMin.Y = -bBox.Z; att.BoundingBoxMax.X = bBox.X; att.BoundingBoxMax.Z = bBox.Y; att.BoundingBoxMax.Y = bBox.Z; mesh.Attachpoints.Add(att); } //System.Windows.Forms.MessageBox.Show("# Atpts: " + Attachpoint.Count); } }