アクセサリのスフィアとスクリーン以外のエフェクトをBasicEffectから変更
@@ -95,6 +95,7 @@ | ||
95 | 95 | //データのコピー |
96 | 96 | foreach (var i in basicMaterial.OpaqueData) |
97 | 97 | { |
98 | + if(i.Key!="ShaderIndex")//仮組み。後でAccessoryEffectに統合 | |
98 | 99 | effectMaterial.OpaqueData.Add(i.Key, i.Value); |
99 | 100 | } |
100 | 101 | effectMaterial.Name = "mmd-screen"; |
@@ -119,7 +120,8 @@ | ||
119 | 120 | //データのコピー |
120 | 121 | foreach (var i in basicMaterial.OpaqueData) |
121 | 122 | { |
122 | - effectMaterial.OpaqueData.Add(i.Key, i.Value); | |
123 | + if (i.Key != "ShaderIndex") | |
124 | + effectMaterial.OpaqueData.Add(i.Key, i.Value); | |
123 | 125 | } |
124 | 126 | effectMaterial.Name = basicMaterial.Name + "-sphere"; |
125 | 127 | effectMaterial.Identity = basicMaterial.Identity; |
@@ -176,7 +178,30 @@ | ||
176 | 178 | } |
177 | 179 | else |
178 | 180 | { |
179 | - return base.ConvertMaterial(basicMaterial, context); | |
181 | + EffectMaterialContent effectMaterial = new EffectMaterialContent(); | |
182 | + //extディレクトリ作成 | |
183 | + string IntDir = "ext"; | |
184 | + if (!Directory.Exists(IntDir)) | |
185 | + Directory.CreateDirectory(IntDir); | |
186 | + //エフェクトをリソースから作成 | |
187 | + FileStream fs = new FileStream(Path.Combine(IntDir, "AccessoryEffect.fx"), FileMode.Create); | |
188 | + BinaryWriter bw = new BinaryWriter(fs); | |
189 | + bw.Write(Resource1.AccessoryEffect); | |
190 | + bw.Close(); | |
191 | + effectMaterial.Effect = new ExternalReference<EffectContent>(Path.Combine(IntDir, "AccessoryEffect.fx")); | |
192 | + //データのコピー | |
193 | + foreach (var i in basicMaterial.OpaqueData) | |
194 | + { | |
195 | + effectMaterial.OpaqueData.Add(i.Key, i.Value); | |
196 | + } | |
197 | + effectMaterial.Name = basicMaterial.Name; | |
198 | + effectMaterial.Identity = basicMaterial.Identity; | |
199 | + foreach (var i in basicMaterial.Textures) | |
200 | + { | |
201 | + effectMaterial.Textures.Add(i.Key, i.Value); | |
202 | + } | |
203 | + return base.ConvertMaterial(effectMaterial, context); | |
204 | + | |
180 | 205 | } |
181 | 206 | } |
182 | 207 | else |
@@ -222,6 +247,32 @@ | ||
222 | 247 | } |
223 | 248 | } |
224 | 249 | } |
250 | + //どのエフェクトを使うのかの種別判定 | |
251 | + foreach (var i in geometryCollection) | |
252 | + { | |
253 | + bool Color = false; | |
254 | + bool UseTexture = false; | |
255 | + bool Normal = false; | |
256 | + foreach (var channel in i.Vertices.Channels) | |
257 | + { | |
258 | + if (channel.Name == VertexChannelNames.TextureCoordinate(0) | |
259 | + && i.Material.Textures.Count > 0) | |
260 | + UseTexture = true; | |
261 | + else if (channel.Name == VertexChannelNames.Color(0)) | |
262 | + Color = true; | |
263 | + else if (channel.Name == VertexChannelNames.Normal(0)) | |
264 | + Normal = true; | |
265 | + } | |
266 | + int ShaderIndex=0; | |
267 | + if (Normal) | |
268 | + ShaderIndex += 4; | |
269 | + if (Color) | |
270 | + ++ShaderIndex; | |
271 | + if (UseTexture) | |
272 | + ShaderIndex += 2; | |
273 | + i.Material.OpaqueData.Add("ShaderIndex", ShaderIndex); | |
274 | + } | |
275 | + | |
225 | 276 | base.ProcessGeometryUsingMaterial(material, geometryCollection, context); |
226 | 277 | } |
227 | 278 |
@@ -60,6 +60,13 @@ | ||
60 | 60 | } |
61 | 61 | } |
62 | 62 | |
63 | + internal static byte[] AccessoryEffect { | |
64 | + get { | |
65 | + object obj = ResourceManager.GetObject("AccessoryEffect", resourceCulture); | |
66 | + return ((byte[])(obj)); | |
67 | + } | |
68 | + } | |
69 | + | |
63 | 70 | internal static byte[] MMDModel { |
64 | 71 | get { |
65 | 72 | object obj = ResourceManager.GetObject("MMDModel", resourceCulture); |
@@ -171,6 +171,11 @@ | ||
171 | 171 | effect.Parameters["World"].SetValue(trueWorld); |
172 | 172 | effect.Parameters["View"].SetValue(View); |
173 | 173 | effect.Parameters["Projection"].SetValue(Projection); |
174 | + /*try | |
175 | + { | |
176 | + effect.Parameters["ShaderIndex"].SetValue(2); | |
177 | + } | |
178 | + catch (Exception) { }*/ | |
174 | 179 | } |
175 | 180 | mesh.Draw(); |
176 | 181 | } |