source: OniSplit/Motoko/TextureDaeWriter.cs

Last change on this file was 1114, checked in by iritscen, 5 years ago

Adding OniSplit source code (v0.9.99.0). Many thanks to Neo for all his work over the years.

File size: 3.1 KB
RevLine 
[1114]1using System;
2using System.Collections.Generic;
3using System.IO;
4using Oni.Imaging;
5
6namespace Oni.Motoko
7{
8 internal class TextureDaeWriter
9 {
10 private readonly string outputDirPath;
11 private readonly Dictionary<InstanceDescriptor, Dae.Material> materials = new Dictionary<InstanceDescriptor, Dae.Material>();
12
13 public TextureDaeWriter(string outputDirPath)
14 {
15 this.outputDirPath = outputDirPath;
16 }
17
18 public Dae.Material WriteMaterial(InstanceDescriptor txmp)
19 {
20 Dae.Material material;
21
22 if (!materials.TryGetValue(txmp, out material))
23 {
24 material = CreateMaterial(txmp);
25 materials.Add(txmp, material);
26 }
27
28 return material;
29 }
30
31 private Dae.Material CreateMaterial(InstanceDescriptor txmp)
32 {
33 var texture = TextureDatReader.Read(txmp);
34
35 var imageFilePath = Utils.CleanupTextureName(txmp.Name) + ".tga";
36 imageFilePath = Path.Combine("images", imageFilePath);
37 TgaWriter.Write(texture.Surfaces[0], Path.Combine(outputDirPath, imageFilePath));
38
39 string name = TextureNameToId(txmp);
40
41 var image = new Dae.Image
42 {
43 FilePath = "./" + imageFilePath.Replace('\\', '/'),
44 Name = name
45 };
46
47 var effectSurface = new Dae.EffectSurface(image);
48
49 var effectSampler = new Dae.EffectSampler(effectSurface)
50 {
51 WrapS = texture.WrapU ? Dae.EffectSamplerWrap.Wrap : Dae.EffectSamplerWrap.None,
52 WrapT = texture.WrapV ? Dae.EffectSamplerWrap.Wrap : Dae.EffectSamplerWrap.None
53 };
54
55 var effectTexture = new Dae.EffectTexture(effectSampler, "diffuse_TEXCOORD");
56
57 var effect = new Dae.Effect
58 {
59 Name = name,
60 DiffuseValue = effectTexture,
61 TransparentValue = texture.HasAlpha ? effectTexture : null,
62 Parameters = {
63 new Dae.EffectParameter("surface", effectSurface),
64 new Dae.EffectParameter("sampler", effectSampler)
65 }
66 };
67
68 var material = new Dae.Material
69 {
70 Name = name,
71 Effect = effect
72 };
73
74 return material;
75 }
76
77 private static string TextureNameToId(InstanceDescriptor txmp)
78 {
79 string name = Utils.CleanupTextureName(txmp.Name);
80
81 if (name.StartsWith("Iteration", StringComparison.Ordinal))
82 {
83 //
84 // HACK: discard Iteration_NNN_ prefixes to avoid truncation of material
85 // names in Blender.
86 //
87
88 name = name.Substring(9);
89
90 if (char.IsDigit(name[0]) && char.IsDigit(name[1]) && char.IsDigit(name[2]) && name[3] == '_')
91 name = name.Substring(4);
92 }
93
94 return name;
95 }
96 }
97}
Note: See TracBrowser for help on using the repository browser.