OSDN Git Service

improve error messages in FormMaterial
[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)\r
30             {\r
31                 try\r
32                 {\r
33                     effectmap.Add(i.Name, i);\r
34                 }\r
35                 catch (ArgumentException)\r
36                 {\r
37                     throw new ArgumentException(string.Format(".xmlの記述に誤りがあります。Effect Name:{0} は既に追加されています。", i.Name));\r
38                 }\r
39             }\r
40             foreach (ImportTextureInfo i in textures)\r
41             {\r
42                 try\r
43                 {\r
44                     texturemap.Add(i.Name, i);\r
45                 }\r
46                 catch (ArgumentException)\r
47                 {\r
48                     throw new ArgumentException(string.Format(".xmlの記述に誤りがあります。Textures Name:{0} は既に追加されています。", i.Name));\r
49                 }\r
50             }\r
51             foreach (ImportMaterialInfo i in materials)\r
52             {\r
53                 try\r
54                 {\r
55                     materialmap.Add(i.Name, i);\r
56                 }\r
57                 catch (ArgumentException)\r
58                 {\r
59                     throw new ArgumentException(string.Format(".xmlの記述に誤りがあります。Materials Name:{0} は既に追加されています。", i.Name));\r
60                 }\r
61             }\r
62 \r
63             foreach(ImportEffectInfo   i in effects)   i.PostLoad(this);\r
64             foreach(ImportTextureInfo  i in textures)  i.PostLoad(this);\r
65             foreach(ImportMaterialInfo i in materials) i.PostLoad(this);\r
66         }\r
67 \r
68         public ImportEffectInfo GetEffect(string name)\r
69         {\r
70             ImportEffectInfo    info= null;\r
71             effectmap.TryGetValue(name, out info);\r
72             return info;\r
73         }\r
74 \r
75         public ImportTextureInfo GetTexture(string name)\r
76         {\r
77             ImportTextureInfo   info= null;\r
78             texturemap.TryGetValue(name, out info);\r
79             return info;\r
80         }\r
81 \r
82         public ImportMaterialInfo GetMaterial(string name)\r
83         {\r
84             ImportMaterialInfo  info= null;\r
85             materialmap.TryGetValue(name, out info);\r
86             return info;\r
87         }\r
88 \r
89         public static ImportInfo Load(string file)\r
90         {\r
91             using(FileStream fs= File.OpenRead(file))\r
92             {\r
93                 ImportInfo  ii  = new XmlSerializer(Type).Deserialize(fs) as ImportInfo;\r
94                 ii.filename     = file;\r
95                 ii.PostLoad();\r
96                 return ii;\r
97             }\r
98         }\r
99 \r
100         public static void Save(string file, ImportInfo ii)\r
101         {\r
102             using(FileStream fs= File.OpenWrite(file))\r
103             {\r
104                 fs.SetLength(0);\r
105                 new XmlSerializer(Type).Serialize(fs, ii);\r
106             }\r
107         }\r
108     }\r
109 \r
110     public class ImportInfoItem\r
111     {\r
112         [XmlIgnore] protected ImportInfo    Owner;\r
113 \r
114         public virtual void PostLoad(ImportInfo owner)\r
115         {\r
116             this.Owner  = owner;\r
117         }\r
118     }\r
119 \r
120     public class ImportEffectInfo : ImportInfoItem\r
121     {\r
122         [XmlAttribute] public string   Name;\r
123 \r
124         public ImportEffectInfo()\r
125         {\r
126         }\r
127 \r
128         public ImportEffectInfo(TSOEffect eff)\r
129         {\r
130             Name            = eff.Name;\r
131         }\r
132 \r
133         public override string ToString()\r
134         {\r
135             return "Name:" + Name;\r
136         }\r
137     }\r
138 \r
139     public class ImportTextureInfo : ImportInfoItem\r
140     {\r
141         [XmlAttribute] public string   Name;\r
142         [XmlAttribute] public string   File;\r
143         [XmlAttribute] public int      BytesPerPixel;\r
144         [XmlAttribute] public int      Width;\r
145         [XmlAttribute] public int      Height;\r
146 \r
147         public ImportTextureInfo()\r
148         {\r
149         }\r
150 \r
151         public ImportTextureInfo(TSOTex tex)\r
152         {\r
153             Name            = tex.Name;\r
154             File            = tex.File.Trim('"');\r
155             BytesPerPixel   = tex.Depth;\r
156             Width           = tex.Width;\r
157             Height          = tex.Height;\r
158         }\r
159 \r
160         public override string ToString()\r
161         {\r
162             return "Name:"          + Name\r
163                 +", File:"          + File\r
164                 +", BytesPerPixel:" + BytesPerPixel\r
165                 +", Width:"         + Width\r
166                 +", Height:"        + Height\r
167                 ;\r
168         }\r
169     }\r
170 \r
171     public class ImportMaterialInfo : ImportInfoItem\r
172     {\r
173         [XmlAttribute] public string   Name;\r
174         [XmlAttribute] public string   File;\r
175         [XmlIgnore]    public Dictionary<string, string>    parameters;\r
176         [XmlIgnore]    public ImportTextureInfo             color;\r
177         [XmlIgnore]    public ImportTextureInfo             shadow;\r
178 \r
179         public ImportMaterialInfo()\r
180         {\r
181         }\r
182 \r
183         public ImportMaterialInfo(TSOMaterial mtl)\r
184         {\r
185             Name            = mtl.Name;\r
186             File            = mtl.File.Trim('"');\r
187         }\r
188 \r
189         public override void PostLoad(ImportInfo owner)\r
190         {\r
191             base.PostLoad(owner);\r
192 \r
193             string  dir     = Path.GetDirectoryName(owner.filename);\r
194             string  codefile= Path.Combine(dir, Name);\r
195 \r
196             if(System.IO.File.Exists(codefile))\r
197             {\r
198                 TSOMaterialCode code= TSOMaterialCode.GenerateFromFile(codefile);\r
199                 TSOParameter    p;\r
200 \r
201                 if(code.TryGetValue("ColorTex", out p))\r
202                     color   = owner.GetTexture(p.Value);\r
203 \r
204                 if(code.TryGetValue("ShadeTex", out p))\r
205                     shadow  = owner.GetTexture(p.Value);\r
206             }\r
207         }\r
208 \r
209         public override string ToString()\r
210         {\r
211             return "Name:"          + Name\r
212                 +", File:"          + File\r
213                 ;\r
214         }\r
215     }\r
216 }\r