private TessellatedSolid CreateSolid(AMF_Object amfObject, AMF_Instance amfInstance = null) { List <Color> colors = null; if (amfObject.color != null) { colors = new List <Color>(); var solidColor = new Color(amfObject.color); foreach (var amfTriangle in amfObject.mesh.volume.Triangles) { colors.Add(amfTriangle.color != null ? new Color(amfTriangle.color) : solidColor); } } else if (amfObject.mesh.volume.color != null) { colors = new List <Color>(); var solidColor = new Color(amfObject.mesh.volume.color); foreach (var amfTriangle in amfObject.mesh.volume.Triangles) { colors.Add(amfTriangle.color != null ? new Color(amfTriangle.color) : solidColor); } } else if (amfObject.mesh.volume.Triangles.Any(t => t.color != null)) { colors = new List <Color>(); var solidColor = new Color(Constants.DefaultColor); foreach (var amfTriangle in amfObject.mesh.volume.Triangles) { colors.Add(amfTriangle.color != null ? new Color(amfTriangle.color) : solidColor); } } var name = this.Name; var nameIndex = amfObject.metadata.FindIndex(md => md != null && md.type.Equals("name", StringComparison.CurrentCultureIgnoreCase)); if (nameIndex != -1) { name = amfObject.metadata[nameIndex].Value; amfObject.metadata.RemoveAt(nameIndex); } var vertices = amfObject.mesh.vertices.Vertices.Select(v => v.coordinates.AsArray).ToList(); if (amfInstance != null && (amfInstance.deltaxSpecified || amfInstance.deltaySpecified || amfInstance.deltazSpecified || amfInstance.rxSpecified || amfInstance.rySpecified || amfInstance.rzSpecified)) { var tMatrix = StarMath.RotationX(amfInstance.rx) .multiply(StarMath.RotationY(amfInstance.ry)) .multiply(StarMath.RotationZ(amfInstance.rz)); tMatrix = StarMath.Translate(amfInstance.deltax, amfInstance.deltay, amfInstance.deltaz).multiply(tMatrix); foreach (var coord in vertices) { var coordWith1 = new[] { coord[0], coord[1], coord[2], 1.0 }; coordWith1 = tMatrix.multiply(coordWith1); coord[0] = coordWith1[0]; coord[1] = coordWith1[1]; coord[2] = coordWith1[2]; } } return(new TessellatedSolid(vertices, amfObject.mesh.volume.Triangles.Select(t => t.VertexIndices).ToList(), colors, this.Units, name + "_" + amfObject.id, this.FileName, amfObject.metadata.Select(md => md.ToString()).ToList(), this.Language)); }
private TessellatedSolid CreateSolid(AMF_Object amfObject, AMF_Instance amfInstance = null) { List <Color> colors = null; if (amfObject.color != null) { colors = new List <Color>(); var solidColor = new Color(amfObject.color); foreach (var amfTriangle in amfObject.mesh.volume.Triangles) { colors.Add(amfTriangle.color != null ? new Color(amfTriangle.color) : solidColor); } } else if (amfObject.mesh.volume.color != null) { colors = new List <Color>(); var solidColor = new Color(amfObject.mesh.volume.color); foreach (var amfTriangle in amfObject.mesh.volume.Triangles) { colors.Add(amfTriangle.color != null ? new Color(amfTriangle.color) : solidColor); } } else if (amfObject.mesh.volume.Triangles.Any(t => t.color != null)) { colors = new List <Color>(); var solidColor = new Color(Constants.DefaultColor); foreach (var amfTriangle in amfObject.mesh.volume.Triangles) { colors.Add(amfTriangle.color != null ? new Color(amfTriangle.color) : solidColor); } } var name = this.Name; var nameIndex = amfObject.metadata.FindIndex(md => md != null && md.type.Equals("name", StringComparison.CurrentCultureIgnoreCase)); if (nameIndex != -1) { name = amfObject.metadata[nameIndex].Value; amfObject.metadata.RemoveAt(nameIndex); } var vertices = amfObject.mesh.vertices.Vertices.Select(v => v.coordinates.AsVector3).ToList(); if (amfInstance != null && (amfInstance.deltaxSpecified || amfInstance.deltaySpecified || amfInstance.deltazSpecified || amfInstance.rxSpecified || amfInstance.rySpecified || amfInstance.rzSpecified)) { var tMatrix = Matrix4x4.CreateRotationX(Constants.DegreesToRadiansFactor * amfInstance.rx) * Matrix4x4.CreateRotationY(Constants.DegreesToRadiansFactor * amfInstance.ry) * Matrix4x4.CreateRotationZ(Constants.DegreesToRadiansFactor * amfInstance.rz); //do matrix multiplication go the other way? tMatrix = tMatrix * Matrix4x4.CreateTranslation(amfInstance.deltax, amfInstance.deltay, amfInstance.deltaz); for (int i = 0; i < vertices.Count; i++) { vertices[i] = vertices[i].Transform(tMatrix); } } return(new TessellatedSolid(vertices, amfObject.mesh.volume.Triangles.Select(t => t.VertexIndices).ToList(), true, colors, this.Units, name + "_" + amfObject.id, this.FileName, amfObject.metadata.Select(md => md.ToString()).ToList(), this.Language)); }