OSDN Git Service

四角面に対応 from mqo2tso fixes #22390
[tdcgexplorer/tso2mqo.git] / ImportInfo.cs
1 using System;\r
2 using System.Collections.Generic;\r
3 using System.IO;\r
4 using System.Text;\r
5 using System.Xml.Serialization;\r
6 \r
7 namespace Tso2MqoGui\r
8 {\r
9     [XmlRoot("TsoImportInfo")]\r
10     public class ImportInfo\r
11     {\r
12         [XmlIgnore] public string filename;\r
13         [XmlElement("Effect")]    public List<ImportEffectInfo>     effects     = new List<ImportEffectInfo>();\r
14         [XmlElement("Textures")]  public List<ImportTextureInfo>    textures    = new List<ImportTextureInfo>();\r
15         [XmlElement("Materials")] public List<ImportMaterialInfo>   materials   = new List<ImportMaterialInfo>();\r
16         \r
17         private Dictionary<string, ImportEffectInfo>    effectmap;\r
18         private Dictionary<string, ImportTextureInfo>   texturemap;\r
19         private Dictionary<string, ImportMaterialInfo>  materialmap;\r
20 \r
21         public static Type      Type            { get { return typeof(ImportInfo); } }\r
22 \r
23         public void PostLoad()\r
24         {\r
25             effectmap   = new Dictionary<string, ImportEffectInfo>();\r
26             texturemap  = new Dictionary<string, ImportTextureInfo>();\r
27             materialmap = new Dictionary<string, ImportMaterialInfo>();\r
28 \r
29             foreach(ImportEffectInfo   i in effects)   effectmap  .Add(i.Name, i);\r
30             foreach(ImportTextureInfo  i in textures)  texturemap .Add(i.Name, i);\r
31             foreach(ImportMaterialInfo i in materials) materialmap.Add(i.Name, i);\r
32 \r
33             foreach(ImportEffectInfo   i in effects)   i.PostLoad(this);\r
34             foreach(ImportTextureInfo  i in textures)  i.PostLoad(this);\r
35             foreach(ImportMaterialInfo i in materials) i.PostLoad(this);\r
36         }\r
37 \r
38         public ImportEffectInfo GetEffect(string name)\r
39         {\r
40             ImportEffectInfo    info= null;\r
41             effectmap.TryGetValue(name, out info);\r
42             return info;\r
43         }\r
44 \r
45         public ImportTextureInfo GetTexture(string name)\r
46         {\r
47             ImportTextureInfo   info= null;\r
48             texturemap.TryGetValue(name, out info);\r
49             return info;\r
50         }\r
51 \r
52         public ImportMaterialInfo GetMaterial(string name)\r
53         {\r
54             ImportMaterialInfo  info= null;\r
55             materialmap.TryGetValue(name, out info);\r
56             return info;\r
57         }\r
58 \r
59         public static ImportInfo Load(string file)\r
60         {\r
61             using(FileStream fs= File.OpenRead(file))\r
62             {\r
63                 ImportInfo  ii  = new XmlSerializer(Type).Deserialize(fs) as ImportInfo;\r
64                 ii.filename     = file;\r
65                 ii.PostLoad();\r
66                 return ii;\r
67             }\r
68         }\r
69 \r
70         public static void Save(string file, ImportInfo ii)\r
71         {\r
72             using(FileStream fs= File.OpenWrite(file))\r
73             {\r
74                 fs.SetLength(0);\r
75                 new XmlSerializer(Type).Serialize(fs, ii);\r
76             }\r
77         }\r
78     }\r
79 \r
80     public class ImportInfoItem\r
81     {\r
82         [XmlIgnore] protected ImportInfo    Owner;\r
83 \r
84         public virtual void PostLoad(ImportInfo owner)\r
85         {\r
86             this.Owner  = owner;\r
87         }\r
88     }\r
89 \r
90     public class ImportEffectInfo : ImportInfoItem\r
91     {\r
92         [XmlAttribute] public string   Name;\r
93 \r
94         public ImportEffectInfo()\r
95         {\r
96         }\r
97 \r
98         public ImportEffectInfo(TSOEffect eff)\r
99         {\r
100             Name            = eff.Name;\r
101         }\r
102 \r
103         public override string ToString()\r
104         {\r
105             return "Name:" + Name;\r
106         }\r
107     }\r
108 \r
109     public class ImportTextureInfo : ImportInfoItem\r
110     {\r
111         [XmlAttribute] public string   Name;\r
112         [XmlAttribute] public string   File;\r
113         [XmlAttribute] public int      BytesPerPixel;\r
114         [XmlAttribute] public int      Width;\r
115         [XmlAttribute] public int      Height;\r
116 \r
117         public ImportTextureInfo()\r
118         {\r
119         }\r
120 \r
121         public ImportTextureInfo(TSOTex tex)\r
122         {\r
123             Name            = tex.Name;\r
124             File            = tex.File.Trim('"');\r
125             BytesPerPixel   = tex.Depth;\r
126             Width           = tex.Width;\r
127             Height          = tex.Height;\r
128         }\r
129 \r
130         public override string ToString()\r
131         {\r
132             return "Name:"          + Name\r
133                 +", File:"          + File\r
134                 +", BytesPerPixel:" + BytesPerPixel\r
135                 +", Width:"         + Width\r
136                 +", Height:"        + Height\r
137                 ;\r
138         }\r
139     }\r
140 \r
141     public class ImportMaterialInfo : ImportInfoItem\r
142     {\r
143         [XmlAttribute] public string   Name;\r
144         [XmlAttribute] public string   File;\r
145         [XmlIgnore]    public Dictionary<string, string>    parameters;\r
146         [XmlIgnore]    public ImportTextureInfo             color;\r
147         [XmlIgnore]    public ImportTextureInfo             shadow;\r
148 \r
149         public ImportMaterialInfo()\r
150         {\r
151         }\r
152 \r
153         public ImportMaterialInfo(TSOMaterial mtl)\r
154         {\r
155             Name            = mtl.Name;\r
156             File            = mtl.File.Trim('"');\r
157         }\r
158 \r
159         public override void PostLoad(ImportInfo owner)\r
160         {\r
161             base.PostLoad(owner);\r
162 \r
163             string  dir     = Path.GetDirectoryName(owner.filename);\r
164             string  codefile= Path.Combine(dir, Name);\r
165 \r
166             if(System.IO.File.Exists(codefile))\r
167             {\r
168                 TSOMaterialCode code= TSOMaterialCode.GenerateFromFile(codefile);\r
169                 TSOParameter    p;\r
170 \r
171                 if(code.TryGetValue("ColorTex", out p))\r
172                     color   = owner.GetTexture(p.Value);\r
173 \r
174                 if(code.TryGetValue("ShadeTex", out p))\r
175                     shadow  = owner.GetTexture(p.Value);\r
176             }\r
177         }\r
178 \r
179         public override string ToString()\r
180         {\r
181             return "Name:"          + Name\r
182                 +", File:"          + File\r
183                 ;\r
184         }\r
185     }\r
186 }\r