private void CreateTexture(TextureNode textureNode) { if (textureNode.Name == null) { textureNode.Name = string.Format(CultureInfo.InvariantCulture, "Tex{0}", textureNode.UniqueId); } Texture texture = new Texture(); texture.Name = textureNode.Name; if (textureNode.Width == 0 || textureNode.Height == 0) { Texture id = this.Textures.Values .FirstOrDefault(t => t.Id == textureNode.UniqueId); if (id == null && this.Textures.Count != 0) { id = this.Textures.ElementAt(this.Textures.Count - 1).Value; } if (id == null) { throw new InvalidDataException("invalid 0x0 texture"); } texture.Id = id.Id; texture.Width = id.Width; texture.Height = id.Height; texture.Palette = id.Palette; texture.ImageData = id.ImageData; texture.AlphaData = id.AlphaData; } else { texture.Id = textureNode.UniqueId; texture.Width = textureNode.Width; texture.Height = textureNode.Height; texture.Palette = textureNode.Palettes; texture.ImageData = textureNode.Bytes; TextureAlphaNode alphaNode = (TextureAlphaNode)textureNode.Nodes .FirstOrDefault(t => t.NodeType == NodeType.TextureAlpha); if (alphaNode != null) { texture.AlphaData = alphaNode.Bytes; } } this.Textures.Add(texture.Name, texture); }
public void Save(string path) { this.CompactBuffers(); OptFileNodes optNodes = new OptFileNodes(); Dictionary <string, bool> texturesWriten = this.Textures.Keys.ToDictionary(t => t, t => false); foreach (Mesh mesh in this.Meshes) { mesh.SortLods(); NodeGroupNode meshNode = new NodeGroupNode(); RotationScaleNode rotationScaleNode = new RotationScaleNode(); MeshDescriptorNode descriptorNode = new MeshDescriptorNode(); MeshVerticesNode verticesNode = new MeshVerticesNode(); TextureCoordinatesNode textureVerticesNode = new TextureCoordinatesNode(); VertexNormalsNode vertexNormalsNode = new VertexNormalsNode(); rotationScaleNode.Pivot = mesh.RotationScale.Pivot; rotationScaleNode.Look = mesh.RotationScale.Look; rotationScaleNode.Up = mesh.RotationScale.Up; rotationScaleNode.Right = mesh.RotationScale.Right; descriptorNode.MeshType = mesh.Descriptor.MeshType; descriptorNode.ExplosionType = mesh.Descriptor.ExplosionType; descriptorNode.Span = mesh.Descriptor.Span; descriptorNode.Center = mesh.Descriptor.Center; descriptorNode.Min = mesh.Descriptor.Min; descriptorNode.Max = mesh.Descriptor.Max; descriptorNode.TargetId = mesh.Descriptor.TargetId; descriptorNode.Target = mesh.Descriptor.Target; foreach (Vector vertex in mesh.Vertices) { verticesNode.Vertices.Add(vertex); } foreach (TextureCoordinates textureVertex in mesh.TextureCoordinates) { textureVerticesNode.TextureVertices.Add(textureVertex); } foreach (Vector vertexNormal in mesh.VertexNormals) { vertexNormalsNode.Normals.Add(vertexNormal); } meshNode.Nodes.Add(verticesNode); meshNode.Nodes.Add(textureVerticesNode); meshNode.Nodes.Add(vertexNormalsNode); meshNode.Nodes.Add(descriptorNode); meshNode.Nodes.Add(rotationScaleNode); FaceGroupingNode faceGroupingNode = new FaceGroupingNode(); foreach (var lod in mesh.Lods) { NodeGroupNode lodNode = new NodeGroupNode(); foreach (var faceGroup in lod.FaceGroups) { if (faceGroup.Textures.Count != 0) { List <Node> texturesNodes = new List <Node>(); foreach (var textureName in faceGroup.Textures) { if (!texturesWriten.ContainsKey(textureName) || texturesWriten[textureName]) { NodeReferenceNode textureNode = new NodeReferenceNode() { Reference = textureName }; texturesNodes.Add(textureNode); } else { var texture = this.Textures[textureName]; TextureNode textureNode = new TextureNode(); textureNode.Name = texture.Name; textureNode.UniqueId = 0; // texture.Id textureNode.Width = texture.Width; textureNode.Height = texture.Height; textureNode.Palettes = texture.Palette; textureNode.Bytes = texture.ImageData; if (texture.AlphaData != null) { TextureAlphaNode alphaNode = new TextureAlphaNode(); alphaNode.Bytes = texture.AlphaData; textureNode.Nodes.Add(alphaNode); } texturesNodes.Add(textureNode); texturesWriten[textureName] = true; } } if (texturesNodes.Count == 1) { lodNode.Nodes.Add(texturesNodes[0]); } else { NodeSwitchNode switchNode = new NodeSwitchNode(); foreach (var textureNode in texturesNodes) { switchNode.Nodes.Add(textureNode); } lodNode.Nodes.Add(switchNode); } } FaceDataNode faceDataNode = new FaceDataNode(); faceDataNode.EdgesCount = faceGroup.EdgesCount; foreach (var face in faceGroup.Faces) { FaceDataNodeData faceData = new FaceDataNodeData { VerticesIndex = face.VerticesIndex, EdgesIndex = face.EdgesIndex, TextureCoordinatesIndex = face.TextureCoordinatesIndex, VertexNormalsIndex = face.VertexNormalsIndex, Normal = face.Normal, TexturingDirection = face.TexturingDirection, TexturingMagniture = face.TexturingMagniture }; faceDataNode.Faces.Add(faceData); } lodNode.Nodes.Add(faceDataNode); } faceGroupingNode.Distances.Add(lod.Distance); faceGroupingNode.Nodes.Add(lodNode); } NodeGroupNode faceGroupingNodeGroup = new NodeGroupNode(); faceGroupingNodeGroup.Nodes.Add(Node.Null); faceGroupingNodeGroup.Nodes.Add(Node.Null); faceGroupingNodeGroup.Nodes.Add(Node.Null); faceGroupingNodeGroup.Nodes.Add(faceGroupingNode); meshNode.Nodes.Add(faceGroupingNodeGroup); foreach (var hardpoint in mesh.Hardpoints) { meshNode.Nodes.Add(new HardpointNode() { HardpointType = hardpoint.HardpointType, Position = hardpoint.Position }); } foreach (var engineGlow in mesh.EngineGlows) { meshNode.Nodes.Add(new EngineGlowNode() { IsDisabled = engineGlow.IsDisabled, CoreColor = engineGlow.CoreColor, OuterColor = engineGlow.OuterColor, Position = engineGlow.Position, Format = engineGlow.Format, Look = engineGlow.Look, Up = engineGlow.Up, Right = engineGlow.Right }); } optNodes.Nodes.Add(meshNode); } foreach (var texture in texturesWriten.Where(t => !t.Value)) { this.Textures.Remove(texture.Key); } optNodes.Save(path); this.FileName = path; }