Support for multiple sections in CGFX

This commit is contained in:
Gericom 2015-01-08 17:24:43 +01:00
parent 486c6a29e4
commit 32aa0290dd
28 changed files with 1811 additions and 956 deletions

View File

@ -106,12 +106,6 @@
<Compile Include="UI\CFNTViewer.Designer.cs">
<DependentUpon>CFNTViewer.cs</DependentUpon>
</Compile>
<Compile Include="UI\CGFXViewer.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="UI\CGFXViewer.designer.cs">
<DependentUpon>CGFXViewer.cs</DependentUpon>
</Compile>
<Compile Include="UI\CLIMViewer.cs">
<SubType>Form</SubType>
</Compile>
@ -136,6 +130,18 @@
<Compile Include="UI\DARCViewer.Designer.cs">
<DependentUpon>DARCViewer.cs</DependentUpon>
</Compile>
<Compile Include="UI\CGFXViewer.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="UI\CGFXViewer.designer.cs">
<DependentUpon>CGFXViewer.cs</DependentUpon>
</Compile>
<Compile Include="UI\CMDLViewer.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="UI\CMDLViewer.Designer.cs">
<DependentUpon>CMDLViewer.cs</DependentUpon>
</Compile>
<Compile Include="UI\SAHTViewer.cs">
<SubType>Form</SubType>
</Compile>
@ -166,6 +172,12 @@
<Compile Include="UI\ThemeViewer.Designer.cs">
<DependentUpon>ThemeViewer.cs</DependentUpon>
</Compile>
<Compile Include="UI\TXOBViewer.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="UI\TXOBViewer.Designer.cs">
<DependentUpon>TXOBViewer.cs</DependentUpon>
</Compile>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\CommonFiles\CommonFiles.csproj">
@ -185,9 +197,6 @@
<EmbeddedResource Include="UI\CFNTViewer.resx">
<DependentUpon>CFNTViewer.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="UI\CGFXViewer.resx">
<DependentUpon>CGFXViewer.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="UI\CLIMViewer.resx">
<DependentUpon>CLIMViewer.cs</DependentUpon>
</EmbeddedResource>
@ -200,6 +209,12 @@
<EmbeddedResource Include="UI\DARCViewer.resx">
<DependentUpon>DARCViewer.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="UI\CGFXViewer.resx">
<DependentUpon>CGFXViewer.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="UI\CMDLViewer.resx">
<DependentUpon>CMDLViewer.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="UI\SAHTViewer.resx">
<DependentUpon>SAHTViewer.cs</DependentUpon>
</EmbeddedResource>
@ -215,9 +230,23 @@
<EmbeddedResource Include="UI\ThemeViewer.resx">
<DependentUpon>ThemeViewer.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="UI\TXOBViewer.resx">
<DependentUpon>TXOBViewer.cs</DependentUpon>
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
<Content Include="NintendoWare\GFX\Shaders\CGFXFrag.c" />
<None Include="Resources\lighthouse-shine.png" />
<None Include="Resources\light-bulb.png" />
<None Include="Resources\weather-cloud.png" />
<None Include="Resources\weather-clouds.png" />
<None Include="Resources\table.png" />
<None Include="Resources\tables-stacks.png" />
<None Include="Resources\film.png" />
<None Include="Resources\films.png" />
<None Include="Resources\images-stack.png" />
<None Include="Resources\point.png" />
<None Include="Resources\jar.png" />
<None Include="Resources\image-sunset.png" />
<None Include="Resources\edit-language.png" />
<None Include="Resources\t-shirt.png" />

View File

@ -14,7 +14,7 @@ using LibEveryFileExplorer.Collections;
namespace _3DS.NintendoWare.GFX
{
public class CGFX : FileFormat<CGFX.CGFXIdentifier>, IConvertable, IViewable, IWriteable
public class CGFX : FileFormat<CGFX.CGFXIdentifier>, IViewable, IWriteable
{
public CGFX(byte[] Data)
{
@ -35,56 +35,6 @@ namespace _3DS.NintendoWare.GFX
return new UI.CGFXViewer(this);
}
public string GetConversionFileFilters()
{
return "COLLADA DAE File (*.dae)|*.dae|Wavefront OBJ File (*.obj)|*.obj";
}
public bool Convert(int FilterIndex, String Path)
{
switch (FilterIndex)
{
case 0:
{
DAE o = ToDAE(0);
File.Create(Path).Close();
File.WriteAllBytes(Path, o.Write());
Directory.CreateDirectory(System.IO.Path.GetDirectoryName(Path) + "\\Tex");
foreach (var v in Data.Textures)
{
if (!(v is ImageTextureCtr)) continue;
((ImageTextureCtr)v).GetBitmap().Save(System.IO.Path.GetDirectoryName(Path) + "\\Tex\\" + v.Name + ".png");
}
return true;
}
case 1:
{
if (Data.Models.Length == 0) return false;
OBJ o = ToOBJ(0);
o.MTLPath = System.IO.Path.GetFileNameWithoutExtension(Path) + ".mtl";
MTL m = ToMTL(0);
byte[] d = o.Write();
byte[] d2 = m.Write();
File.Create(Path).Close();
File.WriteAllBytes(Path, d);
File.Create(System.IO.Path.ChangeExtension(Path, "mtl")).Close();
File.WriteAllBytes(System.IO.Path.ChangeExtension(Path, "mtl"), d2);
Directory.CreateDirectory(System.IO.Path.GetDirectoryName(Path) + "\\Tex");
foreach (var v in Data.Textures)
{
//if (v.NrLevels > 2) v.GetBitmap(2).Save(System.IO.Path.GetDirectoryName(Path) + "\\Tex\\" + v.Name + ".png");
//else if (v.NrLevels > 1) v.GetBitmap(1).Save(System.IO.Path.GetDirectoryName(Path) + "\\Tex\\" + v.Name + ".png");
//else v.GetBitmap(0).Save(System.IO.Path.GetDirectoryName(Path) + "\\Tex\\" + v.Name + ".png");
if (!(v is ImageTextureCtr)) continue;
((ImageTextureCtr)v).GetBitmap().Save(System.IO.Path.GetDirectoryName(Path) + "\\Tex\\" + v.Name + ".png");
}
return true;
}
default:
return false;
}
}
public string GetSaveDefaultFileFilter()
{
return "CTR Graphics Resource (*.bcres)|*.bcres";
@ -326,331 +276,6 @@ namespace _3DS.NintendoWare.GFX
public CANM[] VisibilityAnimations;
}
public OBJ ToOBJ(int Model)
{
if (Data.Models.Length == 0 || Data.Models.Length <= Model) return null;
var o = new OBJ();
int v = 0;
int vn = 0;
int vt = 0;
//int vc = 0;
int ff = 0;
var m = Data.Models[Model];
//foreach (CMDL m in Models)
{
foreach (var vv in m.Shapes)
{
Polygon p = vv.GetVertexData(m);
var mat = m.Materials[m.Meshes[ff].MaterialIndex];
int TexCoord = -1;
if (mat.NrActiveTextureCoordiators > 0 && mat.TextureCoordiators[0].MappingMethod == 0)// && mat.TextureCoordiators[0].SourceCoordinate == 0)
{
if (mat.TextureCoordiators[0].SourceCoordinate == 0) TexCoord = 0;
else if (mat.TextureCoordiators[0].SourceCoordinate == 1) TexCoord = 1;
else TexCoord = 2;
}
foreach (var q in vv.PrimitiveSets[0].Primitives[0].IndexStreams)
{
Vector3[] defs = q.GetFaceData();
foreach (Vector3 d in defs)
{
OBJ.OBJFace f = new OBJ.OBJFace();
f.Material = mat.Name;
o.Vertices.Add(p.Vertex[(int)d.X]);
o.Vertices.Add(p.Vertex[(int)d.Y]);
o.Vertices.Add(p.Vertex[(int)d.Z]);
f.VertexIndieces.Add(v);
f.VertexIndieces.Add(v + 1);
f.VertexIndieces.Add(v + 2);
v += 3;
if (p.Normals != null)
{
o.Normals.Add(p.Normals[(int)d.X]);
o.Normals.Add(p.Normals[(int)d.Y]);
o.Normals.Add(p.Normals[(int)d.Z]);
f.NormalIndieces.Add(vn);
f.NormalIndieces.Add(vn + 1);
f.NormalIndieces.Add(vn + 2);
vn += 3;
}
if (TexCoord == 0)
{
o.TexCoords.Add(p.TexCoords[(int)d.X] * new Matrix34(mat.TextureCoordiators[0].Matrix));
o.TexCoords.Add(p.TexCoords[(int)d.Y] * new Matrix34(mat.TextureCoordiators[0].Matrix));
o.TexCoords.Add(p.TexCoords[(int)d.Z] * new Matrix34(mat.TextureCoordiators[0].Matrix));
}
else if (TexCoord == 1)
{
o.TexCoords.Add(p.TexCoords2[(int)d.X] * new Matrix34(mat.TextureCoordiators[0].Matrix));
o.TexCoords.Add(p.TexCoords2[(int)d.Y] * new Matrix34(mat.TextureCoordiators[0].Matrix));
o.TexCoords.Add(p.TexCoords2[(int)d.Z] * new Matrix34(mat.TextureCoordiators[0].Matrix));
}
else if (TexCoord == 2)
{
o.TexCoords.Add(p.TexCoords3[(int)d.X] * new Matrix34(mat.TextureCoordiators[0].Matrix));
o.TexCoords.Add(p.TexCoords3[(int)d.Y] * new Matrix34(mat.TextureCoordiators[0].Matrix));
o.TexCoords.Add(p.TexCoords3[(int)d.Z] * new Matrix34(mat.TextureCoordiators[0].Matrix));
}
else goto cont;
f.TexCoordIndieces.Add(vt);
f.TexCoordIndieces.Add(vt + 1);
f.TexCoordIndieces.Add(vt + 2);
vt += 3;
cont:
/*if (p.Colors != null)
{
o.VertexColors.Add(p.Colors[(int)d.X]);
o.VertexColors.Add(p.Colors[(int)d.Y]);
o.VertexColors.Add(p.Colors[(int)d.Z]);
f.VertexColorIndieces.Add(vc);
f.VertexColorIndieces.Add(vc + 1);
f.VertexColorIndieces.Add(vc + 2);
vc += 3;
}*/
o.Faces.Add(f);
}
}
ff++;
}
}
return o;
}
public DAE ToDAE(int Model)
{
if (Data.Models.Length == 0 || Data.Models.Length <= Model) return null;
var m = Data.Models[Model];
var o = new DAE();
o.Content.scene = new DAE.COLLADA._scene();
o.Content.scene.instance_visual_scene = new DAE.InstanceWithExtra();
o.Content.scene.instance_visual_scene.url = "#ID1";
o.Content.library_visual_scenes = new DAE.library_visual_scenes();
var scene = new DAE.visual_scene("ID1");
var rootnode = new DAE.node(m.Name);
scene.node.Add(rootnode);
o.Content.library_visual_scenes.visual_scene.Add(scene);
o.Content.library_geometries = new DAE.library_geometries();
o.Content.library_materials = new DAE.library_materials();
o.Content.library_effects = new DAE.library_effects();
if (Data.Textures != null && Data.Textures.Length > 0) o.Content.library_images = new DAE.library_images();
int id = 2;
int i = 0;
foreach (var matt in m.Materials)
{
var mat2 = new DAE.material();
mat2.id = "ID" + id++;
mat2.name = matt.Name;
var eff = new DAE.effect();
eff.id = "ID" + id++;
mat2.instance_effect = new DAE.instance_effect();
mat2.instance_effect.url = "#" + eff.id;
eff.profile_COMMON = new DAE.profile_COMMON();
eff.profile_COMMON.technique = new DAE.profile_COMMON._technique();
eff.profile_COMMON.technique.sid = "COMMON";
eff.profile_COMMON.technique.lambert = new DAE.profile_COMMON._technique._lambert();
eff.profile_COMMON.technique.lambert.diffuse = new DAE.common_color_or_texture_type();
if (matt.Tex0 != null && matt.Tex0.TextureObject is ReferenceTexture)
{
string texid = "ID" + id++;
o.Content.library_images.image.Add(new DAE.image() { id = texid, init_from = "Tex/" + ((ReferenceTexture)matt.Tex0.TextureObject).LinkedTextureName + ".png" });
var param1 = new DAE.common_newparam_type() { sid = "ID" + id++, choice = new DAE.fx_surface_common() { type = DAE.fx_surface_type_enum._2D } };
((DAE.fx_surface_common)param1.choice).init_from.Add(new DAE.fx_surface_init_from_common() { content = texid });
eff.profile_COMMON.newparam = new List<DAE.common_newparam_type>();
eff.profile_COMMON.newparam.Add(param1);
eff.profile_COMMON.newparam.Add(new DAE.common_newparam_type() { sid = "ID" + id++, choice = new DAE.fx_sampler2D_common() { source = param1.sid } });
eff.profile_COMMON.technique.lambert.diffuse.texture = new DAE.common_color_or_texture_type._texture() { texture = eff.profile_COMMON.newparam[1].sid, texcoord = "UVSET0" };
}
else
{
eff.profile_COMMON.technique.lambert.diffuse.color = new DAE.common_color_or_texture_type._color();
eff.profile_COMMON.technique.lambert.diffuse.color.content = Color.White;
}
o.Content.library_materials.material.Add(mat2);
o.Content.library_effects.effect.Add(eff);
}
int ff = 0;
//foreach (CMDL m in Models)
{
foreach (var vv in m.Shapes)
{
var geometry = new DAE.geometry();
geometry.id = "ID" + id++;
Polygon p = vv.GetVertexData(m);
var mat = m.Materials[m.Meshes[ff].MaterialIndex];
geometry.mesh = new DAE.mesh();
geometry.mesh.vertices = new DAE.vertices() { id = "ID" + id++ };
if (p.Vertex != null)
{
var src = new DAE.source() { id = "ID" + id++ };
src.float_array = new DAE.source._float_array() { id = "ID" + id++, count = (uint)p.Vertex.Length * 3 };
foreach (var v in p.Vertex)
{
src.float_array.content.Add(v.X);
src.float_array.content.Add(v.Y);
src.float_array.content.Add(v.Z);
}
src.technique_common = new DAE.source._technique_common();
src.technique_common.accessor = new DAE.accessor();
src.technique_common.accessor.count = (uint)p.Vertex.Length;
src.technique_common.accessor.source = "#" + src.float_array.id;
src.technique_common.accessor.stride = 3;
src.technique_common.accessor.param.Add(new DAE.param() { name = "X", type = "float" });
src.technique_common.accessor.param.Add(new DAE.param() { name = "Y", type = "float" });
src.technique_common.accessor.param.Add(new DAE.param() { name = "Z", type = "float" });
geometry.mesh.source.Add(src);
geometry.mesh.vertices.input.Add(new DAE.InputLocal() { semantic = "POSITION", source = "#" + src.id });
}
if (p.Normals != null)
{
var src = new DAE.source() { id = "ID" + id++ };
src.float_array = new DAE.source._float_array() { id = "ID" + id++, count = (uint)p.Normals.Length * 3 };
foreach (var v in p.Normals)
{
src.float_array.content.Add(v.X);
src.float_array.content.Add(v.Y);
src.float_array.content.Add(v.Z);
}
src.technique_common = new DAE.source._technique_common();
src.technique_common.accessor = new DAE.accessor();
src.technique_common.accessor.count = (uint)p.Normals.Length;
src.technique_common.accessor.source = "#" + src.float_array.id;
src.technique_common.accessor.stride = 3;
src.technique_common.accessor.param.Add(new DAE.param() { name = "X", type = "float" });
src.technique_common.accessor.param.Add(new DAE.param() { name = "Y", type = "float" });
src.technique_common.accessor.param.Add(new DAE.param() { name = "Z", type = "float" });
geometry.mesh.source.Add(src);
geometry.mesh.vertices.input.Add(new DAE.InputLocal() { semantic = "NORMAL", source = "#" + src.id });
}
DAE.source texcoordsrc = null;
if (p.TexCoords != null)
{
if (mat.NrActiveTextureCoordiators > 0 && mat.TextureCoordiators[0].MappingMethod == 0)
{
Vector2[] texc;
if (mat.TextureCoordiators[0].SourceCoordinate == 0)
{
texc = p.TexCoords.ToArray();
}
else if (mat.TextureCoordiators[0].SourceCoordinate == 1)
{
texc = p.TexCoords2.ToArray();
}
else
{
texc = p.TexCoords3.ToArray();
}
var src = texcoordsrc = new DAE.source() { id = "ID" + id++ };
src.float_array = new DAE.source._float_array() { id = "ID" + id++, count = (uint)texc.Length * 2 };
foreach (var v in texc)
{
Vector2 result = v * new Matrix34(mat.TextureCoordiators[0].Matrix);
src.float_array.content.Add(result.X);
src.float_array.content.Add(result.Y);
}
src.technique_common = new DAE.source._technique_common();
src.technique_common.accessor = new DAE.accessor();
src.technique_common.accessor.count = (uint)p.TexCoords.Length;
src.technique_common.accessor.source = "#" + src.float_array.id;
src.technique_common.accessor.stride = 2;
src.technique_common.accessor.param.Add(new DAE.param() { name = "S", type = "float" });
src.technique_common.accessor.param.Add(new DAE.param() { name = "T", type = "float" });
geometry.mesh.source.Add(src);
}
}
DAE.source colorsrc = null;
if (p.Colors != null)
{
var src = colorsrc = new DAE.source() { id = "ID" + id++ };
src.float_array = new DAE.source._float_array() { id = "ID" + id++, count = (uint)p.Colors.Length * 4 };
foreach (var v in p.Colors)
{
src.float_array.content.Add(v.R / 255f);
src.float_array.content.Add(v.G / 255f);
src.float_array.content.Add(v.B / 255f);
src.float_array.content.Add(v.A / 255f);
}
src.technique_common = new DAE.source._technique_common();
src.technique_common.accessor = new DAE.accessor();
src.technique_common.accessor.count = (uint)p.Colors.Length;
src.technique_common.accessor.source = "#" + src.float_array.id;
src.technique_common.accessor.stride = 4;
src.technique_common.accessor.param.Add(new DAE.param() { name = "R", type = "float" });
src.technique_common.accessor.param.Add(new DAE.param() { name = "G", type = "float" });
src.technique_common.accessor.param.Add(new DAE.param() { name = "B", type = "float" });
src.technique_common.accessor.param.Add(new DAE.param() { name = "A", type = "float" });
geometry.mesh.source.Add(src);
}
foreach (var q in vv.PrimitiveSets[0].Primitives[0].IndexStreams)
{
Vector3[] defs = q.GetFaceData();
var tri = new DAE.triangles() { count = (uint)defs.Length, material = mat.Name };
uint offs = 0;
tri.input.Add(new DAE.InputLocalOffset() { offset = offs++, semantic = "VERTEX", source = "#" + geometry.mesh.vertices.id });
if (texcoordsrc != null) tri.input.Add(new DAE.InputLocalOffset() { offset = offs++, semantic = "TEXCOORD", source = "#" + texcoordsrc.id });
if (colorsrc != null) tri.input.Add(new DAE.InputLocalOffset() { offset = offs++, semantic = "COLOR", source = "#" + colorsrc.id, set = 0 });
tri.p.Add(new DAE.p());
foreach (Vector3 d in defs)
{
tri.p[0].content.Add((ulong)d.X);
if (texcoordsrc != null) tri.p[0].content.Add((ulong)d.X);
if (colorsrc != null) tri.p[0].content.Add((ulong)d.X);
tri.p[0].content.Add((ulong)d.Y);
if (texcoordsrc != null) tri.p[0].content.Add((ulong)d.Y);
if (colorsrc != null) tri.p[0].content.Add((ulong)d.Y);
tri.p[0].content.Add((ulong)d.Z);
if (texcoordsrc != null) tri.p[0].content.Add((ulong)d.Z);
if (colorsrc != null) tri.p[0].content.Add((ulong)d.Z);
}
geometry.mesh.triangles.Add(tri);
}
o.Content.library_geometries.geometry.Add(geometry);
var instgem = new DAE.instance_geometry() { url = "#" + geometry.id };
instgem.bind_material = new DAE.bind_material();
instgem.bind_material.technique_common = new DAE.bind_material._technique_common();
var instmat = new DAE.instance_material();
instmat.symbol = mat.Name;
instmat.target = "#" + o.Content.library_materials.material[(int)m.Meshes[ff].MaterialIndex].id;
instmat.bind_vertex_input.Add(new DAE.instance_material._bind_vertex_input() { semantic = "UVSET0", input_semantic = "TEXCOORD", input_set = 0 });
instgem.bind_material.technique_common.instance_material.Add(instmat);
rootnode.instance_geometry.Add(instgem);
ff++;
}
}
return o;
}
public MTL ToMTL(int Model)
{
if (Data.Models.Length == 0 || Data.Models.Length <= Model) return null;
var o = new MTL();
var m = Data.Models[Model];
//foreach (CMDL m in Models)
{
foreach (var vv in m.Materials)
{
MTL.MTLMaterial mm = new MTL.MTLMaterial(vv.Name);
mm.DiffuseColor = vv.MaterialColor.DiffuseU32;
mm.AmbientColor = vv.MaterialColor.AmbientU32;
mm.Alpha = vv.MaterialColor.Diffuse.W;
mm.SpecularColor = vv.MaterialColor.Specular0U32;
if (vv.Tex0 != null && vv.Tex0.TextureObject is ReferenceTexture/* && vv.TextureCoordiators[0].SourceCoordinate == 0*/) mm.DiffuseMapPath = "Tex/" + ((ReferenceTexture)vv.Tex0.TextureObject).LinkedTextureName + ".png";
//else if (vv.Tex1 != null && vv.Tex1.TextureObject is ReferenceTexture && vv.TextureCoordiators[1].SourceCoordinate == 0) mm.DiffuseMapPath = "Tex/" + ((ReferenceTexture)vv.Tex1.TextureObject).LinkedTextureName + ".png";
//else if (vv.Tex2 != null && vv.Tex2.TextureObject is ReferenceTexture && vv.TextureCoordiators[2].SourceCoordinate == 0) mm.DiffuseMapPath = "Tex/" + ((ReferenceTexture)vv.Tex2.TextureObject).LinkedTextureName + ".png";
o.Materials.Add(mm);
}
}
return o;
}
public class CGFXIdentifier : FileFormatIdentifier
{
public override string GetCategory()

View File

@ -9,6 +9,7 @@ using Tao.OpenGl;
using LibEveryFileExplorer.IO;
using LibEveryFileExplorer._3D;
using LibEveryFileExplorer.Collections;
using CommonFiles;
namespace _3DS.NintendoWare.GFX
{
@ -3332,6 +3333,328 @@ namespace _3DS.NintendoWare.GFX
}
}
public OBJ ToOBJ()
{
var o = new OBJ();
int v = 0;
int vn = 0;
int vt = 0;
//int vc = 0;
int ff = 0;
var m = this;
//foreach (CMDL m in Models)
{
foreach (var vv in m.Shapes)
{
Polygon p = vv.GetVertexData(m);
var mat = m.Materials[m.Meshes[ff].MaterialIndex];
int TexCoord = -1;
if (mat.NrActiveTextureCoordiators > 0 && mat.TextureCoordiators[0].MappingMethod == 0)// && mat.TextureCoordiators[0].SourceCoordinate == 0)
{
if (mat.TextureCoordiators[0].SourceCoordinate == 0) TexCoord = 0;
else if (mat.TextureCoordiators[0].SourceCoordinate == 1) TexCoord = 1;
else TexCoord = 2;
}
foreach (var q in vv.PrimitiveSets[0].Primitives[0].IndexStreams)
{
Vector3[] defs = q.GetFaceData();
foreach (Vector3 d in defs)
{
OBJ.OBJFace f = new OBJ.OBJFace();
f.Material = mat.Name;
o.Vertices.Add(p.Vertex[(int)d.X]);
o.Vertices.Add(p.Vertex[(int)d.Y]);
o.Vertices.Add(p.Vertex[(int)d.Z]);
f.VertexIndieces.Add(v);
f.VertexIndieces.Add(v + 1);
f.VertexIndieces.Add(v + 2);
v += 3;
if (p.Normals != null)
{
o.Normals.Add(p.Normals[(int)d.X]);
o.Normals.Add(p.Normals[(int)d.Y]);
o.Normals.Add(p.Normals[(int)d.Z]);
f.NormalIndieces.Add(vn);
f.NormalIndieces.Add(vn + 1);
f.NormalIndieces.Add(vn + 2);
vn += 3;
}
if (TexCoord == 0)
{
o.TexCoords.Add(p.TexCoords[(int)d.X] * new Matrix34(mat.TextureCoordiators[0].Matrix));
o.TexCoords.Add(p.TexCoords[(int)d.Y] * new Matrix34(mat.TextureCoordiators[0].Matrix));
o.TexCoords.Add(p.TexCoords[(int)d.Z] * new Matrix34(mat.TextureCoordiators[0].Matrix));
}
else if (TexCoord == 1)
{
o.TexCoords.Add(p.TexCoords2[(int)d.X] * new Matrix34(mat.TextureCoordiators[0].Matrix));
o.TexCoords.Add(p.TexCoords2[(int)d.Y] * new Matrix34(mat.TextureCoordiators[0].Matrix));
o.TexCoords.Add(p.TexCoords2[(int)d.Z] * new Matrix34(mat.TextureCoordiators[0].Matrix));
}
else if (TexCoord == 2)
{
o.TexCoords.Add(p.TexCoords3[(int)d.X] * new Matrix34(mat.TextureCoordiators[0].Matrix));
o.TexCoords.Add(p.TexCoords3[(int)d.Y] * new Matrix34(mat.TextureCoordiators[0].Matrix));
o.TexCoords.Add(p.TexCoords3[(int)d.Z] * new Matrix34(mat.TextureCoordiators[0].Matrix));
}
else goto cont;
f.TexCoordIndieces.Add(vt);
f.TexCoordIndieces.Add(vt + 1);
f.TexCoordIndieces.Add(vt + 2);
vt += 3;
cont:
/*if (p.Colors != null)
{
o.VertexColors.Add(p.Colors[(int)d.X]);
o.VertexColors.Add(p.Colors[(int)d.Y]);
o.VertexColors.Add(p.Colors[(int)d.Z]);
f.VertexColorIndieces.Add(vc);
f.VertexColorIndieces.Add(vc + 1);
f.VertexColorIndieces.Add(vc + 2);
vc += 3;
}*/
o.Faces.Add(f);
}
}
ff++;
}
}
return o;
}
public DAE ToDAE(CGFX Resource)
{
var m = this;
var o = new DAE();
o.Content.scene = new DAE.COLLADA._scene();
o.Content.scene.instance_visual_scene = new DAE.InstanceWithExtra();
o.Content.scene.instance_visual_scene.url = "#ID1";
o.Content.library_visual_scenes = new DAE.library_visual_scenes();
var scene = new DAE.visual_scene("ID1");
var rootnode = new DAE.node(m.Name);
scene.node.Add(rootnode);
o.Content.library_visual_scenes.visual_scene.Add(scene);
o.Content.library_geometries = new DAE.library_geometries();
o.Content.library_materials = new DAE.library_materials();
o.Content.library_effects = new DAE.library_effects();
if (Resource.Data.Textures != null && Resource.Data.Textures.Length > 0) o.Content.library_images = new DAE.library_images();
int id = 2;
int i = 0;
foreach (var matt in m.Materials)
{
var mat2 = new DAE.material();
mat2.id = "ID" + id++;
mat2.name = matt.Name;
var eff = new DAE.effect();
eff.id = "ID" + id++;
mat2.instance_effect = new DAE.instance_effect();
mat2.instance_effect.url = "#" + eff.id;
eff.profile_COMMON = new DAE.profile_COMMON();
eff.profile_COMMON.technique = new DAE.profile_COMMON._technique();
eff.profile_COMMON.technique.sid = "COMMON";
eff.profile_COMMON.technique.lambert = new DAE.profile_COMMON._technique._lambert();
eff.profile_COMMON.technique.lambert.diffuse = new DAE.common_color_or_texture_type();
if (matt.Tex0 != null && matt.Tex0.TextureObject is ReferenceTexture)
{
string texid = "ID" + id++;
o.Content.library_images.image.Add(new DAE.image() { id = texid, init_from = "Tex/" + ((ReferenceTexture)matt.Tex0.TextureObject).LinkedTextureName + ".png" });
var param1 = new DAE.common_newparam_type() { sid = "ID" + id++, choice = new DAE.fx_surface_common() { type = DAE.fx_surface_type_enum._2D } };
((DAE.fx_surface_common)param1.choice).init_from.Add(new DAE.fx_surface_init_from_common() { content = texid });
eff.profile_COMMON.newparam = new List<DAE.common_newparam_type>();
eff.profile_COMMON.newparam.Add(param1);
eff.profile_COMMON.newparam.Add(new DAE.common_newparam_type() { sid = "ID" + id++, choice = new DAE.fx_sampler2D_common() { source = param1.sid } });
eff.profile_COMMON.technique.lambert.diffuse.texture = new DAE.common_color_or_texture_type._texture() { texture = eff.profile_COMMON.newparam[1].sid, texcoord = "UVSET0" };
}
else
{
eff.profile_COMMON.technique.lambert.diffuse.color = new DAE.common_color_or_texture_type._color();
eff.profile_COMMON.technique.lambert.diffuse.color.content = Color.White;
}
o.Content.library_materials.material.Add(mat2);
o.Content.library_effects.effect.Add(eff);
}
int ff = 0;
//foreach (CMDL m in Models)
{
foreach (var vv in m.Shapes)
{
var geometry = new DAE.geometry();
geometry.id = "ID" + id++;
Polygon p = vv.GetVertexData(m);
var mat = m.Materials[m.Meshes[ff].MaterialIndex];
geometry.mesh = new DAE.mesh();
geometry.mesh.vertices = new DAE.vertices() { id = "ID" + id++ };
if (p.Vertex != null)
{
var src = new DAE.source() { id = "ID" + id++ };
src.float_array = new DAE.source._float_array() { id = "ID" + id++, count = (uint)p.Vertex.Length * 3 };
foreach (var v in p.Vertex)
{
src.float_array.content.Add(v.X);
src.float_array.content.Add(v.Y);
src.float_array.content.Add(v.Z);
}
src.technique_common = new DAE.source._technique_common();
src.technique_common.accessor = new DAE.accessor();
src.technique_common.accessor.count = (uint)p.Vertex.Length;
src.technique_common.accessor.source = "#" + src.float_array.id;
src.technique_common.accessor.stride = 3;
src.technique_common.accessor.param.Add(new DAE.param() { name = "X", type = "float" });
src.technique_common.accessor.param.Add(new DAE.param() { name = "Y", type = "float" });
src.technique_common.accessor.param.Add(new DAE.param() { name = "Z", type = "float" });
geometry.mesh.source.Add(src);
geometry.mesh.vertices.input.Add(new DAE.InputLocal() { semantic = "POSITION", source = "#" + src.id });
}
if (p.Normals != null)
{
var src = new DAE.source() { id = "ID" + id++ };
src.float_array = new DAE.source._float_array() { id = "ID" + id++, count = (uint)p.Normals.Length * 3 };
foreach (var v in p.Normals)
{
src.float_array.content.Add(v.X);
src.float_array.content.Add(v.Y);
src.float_array.content.Add(v.Z);
}
src.technique_common = new DAE.source._technique_common();
src.technique_common.accessor = new DAE.accessor();
src.technique_common.accessor.count = (uint)p.Normals.Length;
src.technique_common.accessor.source = "#" + src.float_array.id;
src.technique_common.accessor.stride = 3;
src.technique_common.accessor.param.Add(new DAE.param() { name = "X", type = "float" });
src.technique_common.accessor.param.Add(new DAE.param() { name = "Y", type = "float" });
src.technique_common.accessor.param.Add(new DAE.param() { name = "Z", type = "float" });
geometry.mesh.source.Add(src);
geometry.mesh.vertices.input.Add(new DAE.InputLocal() { semantic = "NORMAL", source = "#" + src.id });
}
DAE.source texcoordsrc = null;
if (p.TexCoords != null)
{
if (mat.NrActiveTextureCoordiators > 0 && mat.TextureCoordiators[0].MappingMethod == 0)
{
Vector2[] texc;
if (mat.TextureCoordiators[0].SourceCoordinate == 0)
{
texc = p.TexCoords.ToArray();
}
else if (mat.TextureCoordiators[0].SourceCoordinate == 1)
{
texc = p.TexCoords2.ToArray();
}
else
{
texc = p.TexCoords3.ToArray();
}
var src = texcoordsrc = new DAE.source() { id = "ID" + id++ };
src.float_array = new DAE.source._float_array() { id = "ID" + id++, count = (uint)texc.Length * 2 };
foreach (var v in texc)
{
Vector2 result = v * new Matrix34(mat.TextureCoordiators[0].Matrix);
src.float_array.content.Add(result.X);
src.float_array.content.Add(result.Y);
}
src.technique_common = new DAE.source._technique_common();
src.technique_common.accessor = new DAE.accessor();
src.technique_common.accessor.count = (uint)p.TexCoords.Length;
src.technique_common.accessor.source = "#" + src.float_array.id;
src.technique_common.accessor.stride = 2;
src.technique_common.accessor.param.Add(new DAE.param() { name = "S", type = "float" });
src.technique_common.accessor.param.Add(new DAE.param() { name = "T", type = "float" });
geometry.mesh.source.Add(src);
}
}
DAE.source colorsrc = null;
if (p.Colors != null)
{
var src = colorsrc = new DAE.source() { id = "ID" + id++ };
src.float_array = new DAE.source._float_array() { id = "ID" + id++, count = (uint)p.Colors.Length * 4 };
foreach (var v in p.Colors)
{
src.float_array.content.Add(v.R / 255f);
src.float_array.content.Add(v.G / 255f);
src.float_array.content.Add(v.B / 255f);
src.float_array.content.Add(v.A / 255f);
}
src.technique_common = new DAE.source._technique_common();
src.technique_common.accessor = new DAE.accessor();
src.technique_common.accessor.count = (uint)p.Colors.Length;
src.technique_common.accessor.source = "#" + src.float_array.id;
src.technique_common.accessor.stride = 4;
src.technique_common.accessor.param.Add(new DAE.param() { name = "R", type = "float" });
src.technique_common.accessor.param.Add(new DAE.param() { name = "G", type = "float" });
src.technique_common.accessor.param.Add(new DAE.param() { name = "B", type = "float" });
src.technique_common.accessor.param.Add(new DAE.param() { name = "A", type = "float" });
geometry.mesh.source.Add(src);
}
foreach (var q in vv.PrimitiveSets[0].Primitives[0].IndexStreams)
{
Vector3[] defs = q.GetFaceData();
var tri = new DAE.triangles() { count = (uint)defs.Length, material = mat.Name };
uint offs = 0;
tri.input.Add(new DAE.InputLocalOffset() { offset = offs++, semantic = "VERTEX", source = "#" + geometry.mesh.vertices.id });
if (texcoordsrc != null) tri.input.Add(new DAE.InputLocalOffset() { offset = offs++, semantic = "TEXCOORD", source = "#" + texcoordsrc.id });
if (colorsrc != null) tri.input.Add(new DAE.InputLocalOffset() { offset = offs++, semantic = "COLOR", source = "#" + colorsrc.id, set = 0 });
tri.p.Add(new DAE.p());
foreach (Vector3 d in defs)
{
tri.p[0].content.Add((ulong)d.X);
if (texcoordsrc != null) tri.p[0].content.Add((ulong)d.X);
if (colorsrc != null) tri.p[0].content.Add((ulong)d.X);
tri.p[0].content.Add((ulong)d.Y);
if (texcoordsrc != null) tri.p[0].content.Add((ulong)d.Y);
if (colorsrc != null) tri.p[0].content.Add((ulong)d.Y);
tri.p[0].content.Add((ulong)d.Z);
if (texcoordsrc != null) tri.p[0].content.Add((ulong)d.Z);
if (colorsrc != null) tri.p[0].content.Add((ulong)d.Z);
}
geometry.mesh.triangles.Add(tri);
}
o.Content.library_geometries.geometry.Add(geometry);
var instgem = new DAE.instance_geometry() { url = "#" + geometry.id };
instgem.bind_material = new DAE.bind_material();
instgem.bind_material.technique_common = new DAE.bind_material._technique_common();
var instmat = new DAE.instance_material();
instmat.symbol = mat.Name;
instmat.target = "#" + o.Content.library_materials.material[(int)m.Meshes[ff].MaterialIndex].id;
instmat.bind_vertex_input.Add(new DAE.instance_material._bind_vertex_input() { semantic = "UVSET0", input_semantic = "TEXCOORD", input_set = 0 });
instgem.bind_material.technique_common.instance_material.Add(instmat);
rootnode.instance_geometry.Add(instgem);
ff++;
}
}
return o;
}
public MTL ToMTL()
{
var o = new MTL();
var m = this;//Data.Models[Model];
//foreach (CMDL m in Models)
{
foreach (var vv in m.Materials)
{
MTL.MTLMaterial mm = new MTL.MTLMaterial(vv.Name);
mm.DiffuseColor = vv.MaterialColor.DiffuseU32;
mm.AmbientColor = vv.MaterialColor.AmbientU32;
mm.Alpha = vv.MaterialColor.Diffuse.W;
mm.SpecularColor = vv.MaterialColor.Specular0U32;
if (vv.Tex0 != null && vv.Tex0.TextureObject is ReferenceTexture/* && vv.TextureCoordiators[0].SourceCoordinate == 0*/) mm.DiffuseMapPath = "Tex/" + ((ReferenceTexture)vv.Tex0.TextureObject).LinkedTextureName + ".png";
//else if (vv.Tex1 != null && vv.Tex1.TextureObject is ReferenceTexture && vv.TextureCoordiators[1].SourceCoordinate == 0) mm.DiffuseMapPath = "Tex/" + ((ReferenceTexture)vv.Tex1.TextureObject).LinkedTextureName + ".png";
//else if (vv.Tex2 != null && vv.Tex2.TextureObject is ReferenceTexture && vv.TextureCoordiators[2].SourceCoordinate == 0) mm.DiffuseMapPath = "Tex/" + ((ReferenceTexture)vv.Tex2.TextureObject).LinkedTextureName + ".png";
o.Materials.Add(mm);
}
}
return o;
}
public override string ToString()
{
return Name;

View File

@ -9,98 +9,6 @@ using _3DS.GPU;
namespace _3DS.NintendoWare.GFX
{
/*public class TXOB
{
public TXOB() { }
public TXOB(EndianBinaryReader er)
{
Flags = er.ReadUInt32();
Signature = er.ReadString(Encoding.ASCII, 4);
if (Signature != "TXOB") throw new SignatureNotCorrectException(Signature, "TXOB", er.BaseStream.Position);
Unknown1 = er.ReadUInt32();
NameOffset = (UInt32)er.BaseStream.Position + er.ReadUInt32();
Unknown2 = er.ReadUInt32();
Unknown3 = er.ReadUInt32();
Height = er.ReadUInt32();
Width = er.ReadUInt32();
GlFormat = er.ReadUInt32();
Type = er.ReadUInt32();
NrLevels = er.ReadUInt32();
Unknown7 = er.ReadUInt32();
Unknown8 = er.ReadUInt32();
Format = (GPU.Textures.ImageFormat)er.ReadUInt32();
Unknown9 = er.ReadUInt32();
Height2 = er.ReadUInt32();
Width2 = er.ReadUInt32();
DataSize = er.ReadUInt32();
DataOffset = (UInt32)er.BaseStream.Position + er.ReadUInt32();
Unknown10 = er.ReadUInt32();
BitsPerPixel = er.ReadUInt32();
Unknown12 = er.ReadUInt32();
long curpos = er.BaseStream.Position;
er.BaseStream.Position = NameOffset;
Name = er.ReadStringNT(Encoding.ASCII);
er.BaseStream.Position = DataOffset;
Data = er.ReadBytes((int)DataSize);
er.BaseStream.Position = curpos;
}
public UInt32 Flags;//?
public String Signature;
public UInt32 Unknown1;
public UInt32 NameOffset;
public UInt32 Unknown2;
public UInt32 Unknown3;
public UInt32 Height;
public UInt32 Width;
public UInt32 GlFormat;
public UInt32 Type;
public UInt32 NrLevels;
public UInt32 Unknown7;
public UInt32 Unknown8;
public GPU.Textures.ImageFormat Format;
public UInt32 Unknown9;
public UInt32 Height2;
public UInt32 Width2;
public UInt32 DataSize;
public UInt32 DataOffset;
public UInt32 Unknown10;
public UInt32 BitsPerPixel;
public UInt32 Unknown12;
public String Name;
public byte[] Data;
//The flags are like this:
//Image Texture = 0x20000011 (this structure)
//Cube Texture = 0x20000009
//Reference Texture = 0x20000004
//Procedural Texture = 0x20000002
//Shadow Texture = 0x20000021
public Bitmap GetBitmap(int Level = 0)
{
int l = Level;
uint w = Width;
uint h = Height;
int bpp = GPU.Textures.GetBpp(Format);
int offset = 0;
while (l > 0)
{
offset += (int)(w * h * bpp / 8);
w /= 2;
h /= 2;
l--;
}
return GPU.Textures.ToBitmap(Data, offset, (int)w, (int)h, Format);
}
public override string ToString()
{
return Name;
}
}*/
public class TXOB
{
public TXOB(EndianBinaryReader er)

110
3DS/Resource.Designer.cs generated
View File

@ -116,6 +116,26 @@ namespace _3DS {
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap film {
get {
object obj = ResourceManager.GetObject("film", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap films {
get {
object obj = ResourceManager.GetObject("films", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
@ -146,6 +166,26 @@ namespace _3DS {
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap images_stack {
get {
object obj = ResourceManager.GetObject("images_stack", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap jar {
get {
object obj = ResourceManager.GetObject("jar", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
@ -156,6 +196,36 @@ namespace _3DS {
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap light_bulb {
get {
object obj = ResourceManager.GetObject("light_bulb", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap lighthouse_shine {
get {
object obj = ResourceManager.GetObject("lighthouse_shine", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap point {
get {
object obj = ResourceManager.GetObject("point", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
@ -186,6 +256,46 @@ namespace _3DS {
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap table {
get {
object obj = ResourceManager.GetObject("table", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap tables_stacks {
get {
object obj = ResourceManager.GetObject("tables_stacks", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap weather_cloud {
get {
object obj = ResourceManager.GetObject("weather_cloud", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap weather_clouds {
get {
object obj = ResourceManager.GetObject("weather_clouds", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>

View File

@ -133,12 +133,21 @@
<data name="image16" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>Resources\image16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="images_stack" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>Resources\images-stack.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="image_sunset" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>Resources\image-sunset.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="jar" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>Resources\jar.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="leaf" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>Resources\leaf.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="point" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>Resources\point.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="preview_background" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>Resources\preview_background.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
@ -157,4 +166,28 @@
<data name="zones_stack" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>Resources\zones-stack.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="films" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>Resources\films.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="film" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>Resources\film.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="table" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>Resources\table.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="tables_stacks" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>Resources\tables-stacks.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="weather_cloud" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>Resources\weather-cloud.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="weather_clouds" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>Resources\weather-clouds.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="light_bulb" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>Resources\light-bulb.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="lighthouse_shine" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>Resources\lighthouse-shine.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
</root>

BIN
3DS/Resources/film.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 654 B

BIN
3DS/Resources/films.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 664 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 602 B

BIN
3DS/Resources/jar.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 805 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 743 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

BIN
3DS/Resources/point.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 832 B

BIN
3DS/Resources/table.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 563 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 574 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 505 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 737 B

View File

@ -9,446 +9,250 @@ using System.Windows.Forms;
using Tao.OpenGl;
using LibEveryFileExplorer._3D;
using System.Drawing.Imaging;
using LibEveryFileExplorer.Files;
using LibEveryFileExplorer;
using System.Runtime.InteropServices;
using _3DS.NintendoWare.GFX;
using LibEveryFileExplorer.Collections;
namespace _3DS.UI
{
public partial class CGFXViewer : Form
{
bool init = false;
CGFX cgfx;
public CGFXViewer(CGFX cgfx)
ImageList ImageL;
CMDLViewer ModViewer = null;
CGFX mod;
public CGFXViewer(CGFX mod)
{
this.cgfx = cgfx;
this.mod = mod;
InitializeComponent();
simpleOpenGlControl1.MouseWheel += new MouseEventHandler(simpleOpenGlControl1_MouseWheel);
}
void simpleOpenGlControl1_MouseWheel(object sender, MouseEventArgs e)
{
if ((Control.ModifierKeys & Keys.Shift) == Keys.Shift) { dist += ((float)e.Delta / 10); }
else { dist += ((float)e.Delta / 100); }
Render();
Win32Util.SetWindowTheme(treeView1.Handle, "explorer", null);
ImageL = new ImageList();
ImageL.ColorDepth = ColorDepth.Depth32Bit;
ImageL.ImageSize = new Size(16, 16);
ImageL.Images.Add(Resource.jar);
ImageL.Images.Add(Resource.point);
ImageL.Images.Add(Resource.images_stack);
ImageL.Images.Add(Resource.image_sunset);
ImageL.Images.Add(Resource.films);
ImageL.Images.Add(Resource.film);
ImageL.Images.Add(Resource.tables_stacks);
ImageL.Images.Add(Resource.table);
ImageL.Images.Add(Resource.weather_clouds);
ImageL.Images.Add(Resource.weather_cloud);
ImageL.Images.Add(Resource.lighthouse_shine);
ImageL.Images.Add(Resource.light_bulb);
treeView1.ImageList = ImageL;
}
String glversion = null;
float X = 0.0f;
float Y = 0.0f;
float ang = 0.0f;
float dist = 0.0f;
float elev = 0.0f;
private void CGFX_Load(object sender, EventArgs e)
{
simpleOpenGlControl1.InitializeContexts();
Gl.ReloadFunctions();
//Gl.glEnable(Gl.GL_LIGHTING);
Gl.glEnable(Gl.GL_RESCALE_NORMAL);
Gl.glEnable(Gl.GL_COLOR_MATERIAL);
Gl.glEnable(Gl.GL_DEPTH_TEST);
Gl.glEnable(Gl.GL_NORMALIZE);
Gl.glDisable(Gl.GL_CULL_FACE);
Gl.glFrontFace(Gl.GL_CCW);
Gl.glEnable(Gl.GL_TEXTURE_2D);
Gl.glClearDepth(1);
Gl.glEnable(Gl.GL_ALPHA_TEST);
Gl.glAlphaFunc(Gl.GL_GREATER, 0f);
Gl.glEnable(Gl.GL_BLEND);
Gl.glBlendFunc(Gl.GL_SRC_ALPHA, Gl.GL_ONE_MINUS_SRC_ALPHA);
//Gl.glTexEnvf(Gl.GL_TEXTURE_ENV, Gl.GL_TEXTURE_ENV_MODE, Gl.GL_BLEND);
Gl.glShadeModel(Gl.GL_SMOOTH);
Gl.glDepthFunc(Gl.GL_LEQUAL);
Gl.glClearColor(51f / 255f, 51f / 255f, 51f / 255f, 0f);
if (cgfx.Data.Textures != null && cgfx.Data.Models != null)
bool sel = false;
treeView1.BeginUpdate();
treeView1.Nodes.Clear();
if (mod.Data.Models != null)
{
int i = 0;
foreach (var v in cgfx.Data.Models[0].Materials)
TreeNode section = new TreeNode("Models", 0, 0);
treeView1.Nodes.Add(section);
for (int i = 0; i < mod.Data.Models.Length; i++)
{
if (v.Tex0 != null) UploadTex(v.Tex0, i * 4 + 0 + 1);
if (v.Tex1 != null) UploadTex(v.Tex1, i * 4 + 1 + 1);
if (v.Tex2 != null) UploadTex(v.Tex2, i * 4 + 2 + 1);
//if (v.Tex3 != null) UploadTex(v.Tex3, i * 4 + 3 + 1);
i++;
}
}
if (cgfx.Data.Models != null) Shaders = new CGFXShader[cgfx.Data.Models[0].Materials.Length];
//GlNitro.glNitroBindTextures(file, 1);
glversion = Gl.glGetString(Gl.GL_VERSION);
init = true;
Render();
}
private void UploadTex(CMDL.MTOB.TexInfo TextureMapper, int Id)
{
if (!(TextureMapper.TextureObject is ReferenceTexture))
return;
var tex = cgfx.Data.Textures[cgfx.Data.Dictionaries[1].IndexOf(((ReferenceTexture)TextureMapper.TextureObject).LinkedTextureName)] as ImageTextureCtr;
if (tex == null)
return;
Gl.glBindTexture(Gl.GL_TEXTURE_2D, Id);
Gl.glColor3f(1, 1, 1);
Bitmap b = tex.GetBitmap();
b.RotateFlip(RotateFlipType.RotateNoneFlipY);
BitmapData d = b.LockBits(new Rectangle(0, 0, b.Width, b.Height), System.Drawing.Imaging.ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 0, Gl.GL_RGBA8, b.Width, b.Height, 0, Gl.GL_BGRA, Gl.GL_UNSIGNED_BYTE, d.Scan0);
b.UnlockBits(d);
if (((TextureMapper.Unknown12 >> 1) & 1) == 1) Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_LINEAR);
else Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_NEAREST);
//if (((TextureMapper.Unknown12 >> 2) & 1) == 1) Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_LINEAR);
//else Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_NEAREST);
//A bit confusing, so using this for now:
Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MIN_FILTER, Gl.GL_LINEAR);
switch ((TextureMapper.Unknown12 >> 12) & 0xF)
{
case 0:
Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_S, Gl.GL_CLAMP_TO_EDGE);
break;
case 1:
Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_S, Gl.GL_CLAMP_TO_BORDER);
break;
case 2:
Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_S, Gl.GL_REPEAT);
break;
case 3:
Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_S, Gl.GL_MIRRORED_REPEAT);
break;
default:
Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_S, Gl.GL_REPEAT);
break;
}
switch ((TextureMapper.Unknown12 >> 8) & 0xF)
{
case 0:
Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_T, Gl.GL_CLAMP_TO_EDGE);
break;
case 1:
Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_T, Gl.GL_CLAMP_TO_BORDER);
break;
case 2:
Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_T, Gl.GL_REPEAT);
break;
case 3:
Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_T, Gl.GL_MIRRORED_REPEAT);
break;
default:
Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_T, Gl.GL_REPEAT);
break;
}
}
CGFXShader[] Shaders;
public void Render()
{
if (!init) return;
if (cgfx.Data.Models == null) return;
//G3D_Binary_File_Format.Shaders.Shader s = new G3D_Binary_File_Format.Shaders.Shader();
//s.Compile();
//s.Enable();
//Gl.glViewport(0, 0, simpleOpenGlControl1.Width, simpleOpenGlControl1.Height);
float aspect = (float)simpleOpenGlControl1.Width / (float)simpleOpenGlControl1.Height;
//float fov = 60.0f; // in degrees
//float znear = 0.02f;
//float zfar = 1000.0f * file.modelSet.models[SelMdl].info.posScale;
//Gl.glMatrixMode(Gl.GL_PROJECTION);
//Gl.glLoadMatrixf(BuildPerspProjMat(fov, aspect, znear, zfar));
Gl.glMatrixMode(Gl.GL_PROJECTION);
Gl.glLoadIdentity();
Gl.glViewport(0, 0, simpleOpenGlControl1.Width, simpleOpenGlControl1.Height);
//Gl.glOrtho(-simpleOpenGlControl1.Width / 2.0f, simpleOpenGlControl1.Width / 2.0f, -simpleOpenGlControl1.Height / 2.0f, simpleOpenGlControl1.Height / 2.0f, 0.02f, 1000f * file.modelSet.models[SelMdl].info.posScale);
//Gl.glMatrixMode(Gl.GL_PROJECTION);
//Gl.glLoadIdentity();
//Gl.glFrustum(-simpleOpenGlControl1.Width / 2f, simpleOpenGlControl1.Width / 2f, -simpleOpenGlControl1.Height / 2f, simpleOpenGlControl1.Height / 2f, 1000, -1000);
Glu.gluPerspective(30, aspect, 0.1f, 20480000f);//0.02f, 32.0f);
Gl.glMatrixMode(Gl.GL_MODELVIEW);
Gl.glLoadIdentity();
Gl.glBindTexture(Gl.GL_TEXTURE_2D, 0);
Gl.glColor3f(1.0f, 1.0f, 1.0f);
//Gl.glEnable(Gl.GL_DEPTH_TEST);
Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
/*Gl.glRotatef(elev, 1, 0, 0);
Gl.glFogfv(Gl.GL_FOG_COLOR, new float[] { 0, 0, 0, 1 });
Gl.glFogf(Gl.GL_FOG_DENSITY, 1);
Gl.glRotatef(-elev, 1, 0, 0);*/
Gl.glTranslatef(X, Y, -dist);
Gl.glRotatef(elev, 1, 0, 0);
Gl.glRotatef(ang, 0, 1, 0);
Gl.glPushMatrix();
RenderModel();
Gl.glPopMatrix();
simpleOpenGlControl1.Refresh();
}
void RenderModel()
{
CMDL m = cgfx.Data.Models[0];
//foreach (_3DS.CGFX.DATA.CMDL m in cgfx.Data.Models)
//{
//int i = 0;
foreach (var mm in m.Meshes)
{
var vv = m.Shapes[mm.ShapeIndex];
Polygon p = vv.GetVertexData(m);
var mat = m.Materials[mm.MaterialIndex];
mat.FragShader.AlphaTest.GlApply();
mat.FragmentOperation.BlendOperation.GlApply();
Gl.glMatrixMode(Gl.GL_TEXTURE);
if (mat.Tex0 != null)
{
Gl.glActiveTexture(Gl.GL_TEXTURE0);
Gl.glBindTexture(Gl.GL_TEXTURE_2D, mm.MaterialIndex * 4 + 0 + 1);
Gl.glEnable(Gl.GL_TEXTURE_2D);
Gl.glLoadIdentity();
float[] mtx = new float[16];
Array.Copy(mat.TextureCoordiators[0].Matrix, mtx, 4 * 3);
mtx[15] = 1;
mtx[12] = mtx[3];
mtx[13] = mtx[7];
mtx[14] = mtx[11];
mtx[3] = 0;
mtx[7] = 0;
mtx[11] = 0;
Gl.glLoadMatrixf(mtx);
//if (mat.TextureCoordiators[0].MappingMethod == 2)
//{
// Gl.glTexGeni(Gl.GL_S, Gl.GL_TEXTURE_GEN_MODE, Gl.GL_SPHERE_MAP);
// Gl.glTexGeni(Gl.GL_T, Gl.GL_TEXTURE_GEN_MODE, Gl.GL_SPHERE_MAP);
//}
//Gl.glTranslatef(mat.TextureCoordiators[0].Scale.X / mat.TextureCoordiators[0].Translate.X, mat.TextureCoordiators[0].Translate.Y * mat.TextureCoordiators[0].Scale.Y, 0);
//Gl.glRotatef(mat.TextureCoordiators[0].Rotate, 0, 1, 0);
//Gl.glScalef(mat.TextureCoordiators[0].Scale.X, mat.TextureCoordiators[0].Scale.Y, 1);
}
if (mat.Tex1 != null)
{
Gl.glActiveTexture(Gl.GL_TEXTURE1);
Gl.glBindTexture(Gl.GL_TEXTURE_2D, mm.MaterialIndex * 4 + 1 + 1);
Gl.glEnable(Gl.GL_TEXTURE_2D);
Gl.glLoadIdentity();
float[] mtx = new float[16];
Array.Copy(mat.TextureCoordiators[1].Matrix, mtx, 4 * 3);
mtx[15] = 1;
mtx[12] = mtx[3];
mtx[13] = mtx[7];
mtx[14] = mtx[11];
mtx[3] = 0;
mtx[7] = 0;
mtx[11] = 0;
Gl.glLoadMatrixf(mtx);
//if (mat.TextureCoordiators[1].MappingMethod == 2)
//{
// Gl.glTexGeni(Gl.GL_S, Gl.GL_TEXTURE_GEN_MODE, Gl.GL_SPHERE_MAP);
// Gl.glTexGeni(Gl.GL_T, Gl.GL_TEXTURE_GEN_MODE, Gl.GL_SPHERE_MAP);
//}
}
if (mat.Tex2 != null)
{
Gl.glActiveTexture(Gl.GL_TEXTURE2);
Gl.glBindTexture(Gl.GL_TEXTURE_2D, mm.MaterialIndex * 4 + 2 + 1);
Gl.glEnable(Gl.GL_TEXTURE_2D);
Gl.glLoadIdentity();
float[] mtx = new float[16];
Array.Copy(mat.TextureCoordiators[2].Matrix, mtx, 4 * 3);
mtx[15] = 1;
mtx[12] = mtx[3];
mtx[13] = mtx[7];
mtx[14] = mtx[11];
mtx[3] = 0;
mtx[7] = 0;
mtx[11] = 0;
Gl.glLoadMatrixf(mtx);
//if (mat.TextureCoordiators[2].MappingMethod == 2)
//{
// Gl.glTexGeni(Gl.GL_S, Gl.GL_TEXTURE_GEN_MODE, Gl.GL_SPHERE_MAP);
// Gl.glTexGeni(Gl.GL_T, Gl.GL_TEXTURE_GEN_MODE, Gl.GL_SPHERE_MAP);
//}
}
/*if (mat.Tex3 != null)
{
MessageBox.Show("Tex3!!!!!!!!!!!");
Gl.glActiveTexture(Gl.GL_TEXTURE3);
Gl.glBindTexture(Gl.GL_TEXTURE_2D, mm.MaterialIndex * 4 + 3 + 1);
Gl.glEnable(Gl.GL_TEXTURE_2D);
Gl.glLoadIdentity();
}*/
Gl.glMatrixMode(Gl.GL_MODELVIEW);
Gl.glPushMatrix();
Gl.glTranslatef(vv.PositionOffset.X, vv.PositionOffset.Y, vv.PositionOffset.Z);
if (glversion.StartsWith("2.") && Shaders[mm.MaterialIndex] == null)
{
List<int> tex = new List<int>();
if (mat.Tex0 != null) tex.Add((int)mm.MaterialIndex * 4 + 0 + 1);
else tex.Add(0);
if (mat.Tex1 != null) tex.Add((int)mm.MaterialIndex * 4 + 1 + 1);
else tex.Add(0);
if (mat.Tex2 != null) tex.Add((int)mm.MaterialIndex * 4 + 2 + 1);
else tex.Add(0);
//if (mat.Tex3 != null) tex.Add((int)mm.MaterialIndex * 4 + 3 + 1);
/*else */
tex.Add(0);
Shaders[mm.MaterialIndex] = new CGFXShader(mat, tex.ToArray());
Shaders[mm.MaterialIndex].Compile();
}
if (glversion.StartsWith("2.")) Shaders[mm.MaterialIndex].Enable();
//Gl.glMaterialfv(Gl.GL_FRONT_AND_BACK, Gl.GL_EMISSION, new float[] { mat.Emission_2.R / 255f, mat.Emission_2.G / 255f, mat.Emission_2.B / 255f, mat.Emission_2.A / 255f });
//Gl.glMaterialfv(Gl.GL_FRONT_AND_BACK, Gl.GL_AMBIENT, new float[] { mat.Ambient_1.R / 255f, mat.Ambient_1.G / 255f, mat.Ambient_1.B / 255f, mat.Ambient_1.A / 255f });
//Gl.glMaterialfv(Gl.GL_FRONT_AND_BACK, Gl.GL_DIFFUSE, new float[] { mat.Diffuse_2.R / 255f, mat.Diffuse_2.G / 255f, mat.Diffuse_2.B / 255f, mat.Diffuse_2.A / 255f });
//Gl.glColorMaterial(Gl.GL_FRONT_AND_BACK, Gl.GL_DIFFUSE);
//Gl.glEnable(Gl.GL_COLOR_MATERIAL);
foreach (var q in vv.PrimitiveSets[0].Primitives[0].IndexStreams)
{
Vector3[] defs = q.GetFaceData();
Gl.glBegin(Gl.GL_TRIANGLES);
foreach (Vector3 d in defs)
TreeNode entry = new TreeNode(mod.Data.Models[i].Name, 1, 1) { Tag = mod.Data.Models[i] };
section.Nodes.Add(entry);
if (i == 0 && !sel)
{
if (p.Normals != null) Gl.glNormal3f(p.Normals[(int)d.X].X, p.Normals[(int)d.X].Y, p.Normals[(int)d.X].Z);
if (p.Colors != null) Gl.glColor4f(p.Colors[(int)d.X].R / 255f, p.Colors[(int)d.X].G / 255f, p.Colors[(int)d.X].B / 255f, p.Colors[(int)d.X].A / 255f);
else Gl.glColor4f(1, 1, 1, 1);
if (p.TexCoords != null) Gl.glMultiTexCoord2f(Gl.GL_TEXTURE0, p.TexCoords[(int)d.X].X, p.TexCoords[(int)d.X].Y);
if (p.TexCoords2 != null) Gl.glMultiTexCoord2f(Gl.GL_TEXTURE1, p.TexCoords2[(int)d.X].X, p.TexCoords2[(int)d.X].Y);
if (p.TexCoords3 != null) Gl.glMultiTexCoord2f(Gl.GL_TEXTURE2, p.TexCoords3[(int)d.X].X, p.TexCoords3[(int)d.X].Y);
Gl.glVertex3f(p.Vertex[(int)d.X].X, p.Vertex[(int)d.X].Y, p.Vertex[(int)d.X].Z);
if (p.Normals != null) Gl.glNormal3f(p.Normals[(int)d.Y].X, p.Normals[(int)d.Y].Y, p.Normals[(int)d.Y].Z);
if (p.Colors != null) Gl.glColor4f(p.Colors[(int)d.Y].R / 255f, p.Colors[(int)d.Y].G / 255f, p.Colors[(int)d.Y].B / 255f, p.Colors[(int)d.Y].A / 255f);
else Gl.glColor4f(1, 1, 1, 1);
if (p.TexCoords != null) Gl.glMultiTexCoord2f(Gl.GL_TEXTURE0, p.TexCoords[(int)d.Y].X, p.TexCoords[(int)d.Y].Y);
if (p.TexCoords2 != null) Gl.glMultiTexCoord2f(Gl.GL_TEXTURE1, p.TexCoords2[(int)d.Y].X, p.TexCoords2[(int)d.Y].Y);
if (p.TexCoords3 != null) Gl.glMultiTexCoord2f(Gl.GL_TEXTURE2, p.TexCoords3[(int)d.Y].X, p.TexCoords3[(int)d.Y].Y);
Gl.glVertex3f(p.Vertex[(int)d.Y].X, p.Vertex[(int)d.Y].Y, p.Vertex[(int)d.Y].Z);
if (p.Normals != null) Gl.glNormal3f(p.Normals[(int)d.Z].X, p.Normals[(int)d.Z].Y, p.Normals[(int)d.Z].Z);
if (p.Colors != null) Gl.glColor4f(p.Colors[(int)d.Z].R / 255f, p.Colors[(int)d.Z].G / 255f, p.Colors[(int)d.Z].B / 255f, p.Colors[(int)d.Z].A / 255f);
else Gl.glColor4f(1, 1, 1, 1);
if (p.TexCoords != null) Gl.glMultiTexCoord2f(Gl.GL_TEXTURE0, p.TexCoords[(int)d.Z].X, p.TexCoords[(int)d.Z].Y);
if (p.TexCoords2 != null) Gl.glMultiTexCoord2f(Gl.GL_TEXTURE1, p.TexCoords2[(int)d.Z].X, p.TexCoords2[(int)d.Z].Y);
if (p.TexCoords3 != null) Gl.glMultiTexCoord2f(Gl.GL_TEXTURE2, p.TexCoords3[(int)d.Z].X, p.TexCoords3[(int)d.Z].Y);
Gl.glVertex3f(p.Vertex[(int)d.Z].X, p.Vertex[(int)d.Z].Y, p.Vertex[(int)d.Z].Z);
section.Expand();
treeView1.SelectedNode = entry;
sel = true;
}
Gl.glEnd();
//TODO: Content of CMDL
}
Gl.glPopMatrix();
}
}
bool wire = false;
bool licht = true;
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
switch (keyData)
if (mod.Data.Textures != null)
{
case Keys.Right:
ang += 1;
Render();
return true;
case Keys.Left:
ang -= 1;
Render();
return true;
case Keys.Up:
elev += 1;
Render();
return true;
case Keys.Down:
elev -= 1;
Render();
return true;
case Keys.Z:
X -= 5f;
Render();
return true;
case Keys.X:
X += 5f;
Render();
return true;
case Keys.A:
Y -= 5f;
Render();
return true;
case Keys.S:
Y += 5f;
Render();
return true;
case Keys.W:
wire = !wire;
if (wire) { Gl.glPolygonMode(Gl.GL_FRONT_AND_BACK, Gl.GL_LINE); Render(); }
else { Gl.glPolygonMode(Gl.GL_FRONT_AND_BACK, Gl.GL_FILL); Render(); }
return true;
case Keys.Escape:
X = 0.0f;
Y = 0.0f;
ang = 0.0f;
dist = 0.0f;
elev = 0.0f;
Render();
return true;
case Keys.T:
elev = 90;
ang = 0;
Render();
return true;
case Keys.L:
licht = !licht;
Render();
return true;
case Keys.OemMinus:
case Keys.OemMinus | Keys.Shift:
if ((Control.ModifierKeys & Keys.Shift) == Keys.Shift) dist += 12f;
else dist += 1.2f;
Render();
return true;
case Keys.Oemplus:
case Keys.Oemplus | Keys.Shift:
if ((Control.ModifierKeys & Keys.Shift) == Keys.Shift) dist -= 12f;
else dist -= 1.2f;
Render();
return true;
default:
return base.ProcessCmdKey(ref msg, keyData);
TreeNode section = new TreeNode("Textures", 2, 2);
treeView1.Nodes.Add(section);
for (int i = 0; i < mod.Data.Textures.Length; i++)
{
TreeNode entry = new TreeNode(mod.Data.Textures[i].Name, 3, 3) { Tag = mod.Data.Textures[i] };
section.Nodes.Add(entry);
if (i == 0 && !sel)
{
section.Expand();
treeView1.SelectedNode = entry;
sel = true;
}
}
}
if (mod.Data.Dictionaries[2] != null)
{
TreeNode section = new TreeNode("Lookup Tables", 6, 6);
treeView1.Nodes.Add(section);
for (int i = 0; i < mod.Data.Dictionaries[2].Count; i++)
{
TreeNode entry = new TreeNode(mod.Data.Dictionaries[2][i].Name, 7, 7);// { Tag = mod.Data.Textures[i] };
section.Nodes.Add(entry);
}
}
if (mod.Data.Dictionaries[6] != null)
{
TreeNode section = new TreeNode("Lights", 10, 10);
treeView1.Nodes.Add(section);
for (int i = 0; i < mod.Data.Dictionaries[6].Count; i++)
{
TreeNode entry = new TreeNode(mod.Data.Dictionaries[6][i].Name, 11, 11);// { Tag = mod.Data.Textures[i] };
section.Nodes.Add(entry);
if (i == 0 && !sel)
{
section.Expand();
treeView1.SelectedNode = entry;
sel = true;
}
}
}
if (mod.Data.Dictionaries[7] != null)
{
TreeNode section = new TreeNode("Fog", 8, 8);
treeView1.Nodes.Add(section);
for (int i = 0; i < mod.Data.Dictionaries[7].Count; i++)
{
TreeNode entry = new TreeNode(mod.Data.Dictionaries[7][i].Name, 9, 9);// { Tag = mod.Data.Textures[i] };
section.Nodes.Add(entry);
if (i == 0 && !sel)
{
section.Expand();
treeView1.SelectedNode = entry;
sel = true;
}
}
}
if (mod.Data.SkeletonAnimations != null)
{
TreeNode section = new TreeNode("Skeleton Animations", 4, 4);
treeView1.Nodes.Add(section);
for (int i = 0; i < mod.Data.SkeletonAnimations.Length; i++)
{
TreeNode entry = new TreeNode(mod.Data.SkeletonAnimations[i].Name, 5, 5) { Tag = mod.Data.SkeletonAnimations[i] };
section.Nodes.Add(entry);
if (i == 0 && !sel)
{
section.Expand();
treeView1.SelectedNode = entry;
sel = true;
}
}
}
if (mod.Data.MaterialAnimations != null)
{
TreeNode section = new TreeNode("Material Animations", 4, 4);
treeView1.Nodes.Add(section);
for (int i = 0; i < mod.Data.MaterialAnimations.Length; i++)
{
TreeNode entry = new TreeNode(mod.Data.MaterialAnimations[i].Name, 5, 5) { Tag = mod.Data.MaterialAnimations[i] };
section.Nodes.Add(entry);
if (i == 0 && !sel)
{
section.Expand();
treeView1.SelectedNode = entry;
sel = true;
}
}
}
if (mod.Data.VisibilityAnimations != null)
{
TreeNode section = new TreeNode("Visibility Animations", 4, 4);
treeView1.Nodes.Add(section);
for (int i = 0; i < mod.Data.VisibilityAnimations.Length; i++)
{
TreeNode entry = new TreeNode(mod.Data.VisibilityAnimations[i].Name, 5, 5) { Tag = mod.Data.VisibilityAnimations[i] };
section.Nodes.Add(entry);
if (i == 0 && !sel)
{
section.Expand();
treeView1.SelectedNode = entry;
sel = true;
}
}
}
treeView1.EndUpdate();
}
private void CGFX_Resize(object sender, EventArgs e)
{
Render();
Render();
if (ModViewer != null)
{
ModViewer.Render();
ModViewer.Render();
}
}
private void CGFX_Layout(object sender, LayoutEventArgs e)
{
Render();
if (ModViewer != null)
{
ModViewer.Render();
}
}
private void tabControl1_Selecting(object sender, TabControlCancelEventArgs e)
{
Render();
if (ModViewer != null)
{
ModViewer.Render();
}
}
private void CGFXViewer_Activated(object sender, EventArgs e)
private void NSBMDViewer_Activated(object sender, EventArgs e)
{
for (int i = 0; i < 8; i++) Render();
//render it multiple times to avoid glitches!
if (ModViewer != null)
{
for (int i = 0; i < 8; i++) ModViewer.Render();
}
}
private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
{
switch (e.Node.ImageIndex)
{
case 1:
ModViewer = new CMDLViewer(mod, (CMDL)e.Node.Tag) { Dock = DockStyle.Fill };
ModViewer.Width = panel1.Width;
ModViewer.Height = panel1.Height;
panel1.SuspendLayout();
panel1.Controls.Add(ModViewer);
if (panel1.Controls.Count > 1) panel1.Controls.RemoveAt(0);
panel1.Invalidate();
panel1.ResumeLayout();
ModViewer.Invalidate();
ModViewer.Render();
ModViewer.Render();
break;
case 3:
ModViewer = null;
panel1.SuspendLayout();
panel1.Controls.Add(new TXOBViewer((ImageTextureCtr)e.Node.Tag) { Dock = DockStyle.Fill, Width = panel1.Width, Height = panel1.Height });
if (panel1.Controls.Count > 1) panel1.Controls.RemoveAt(0);
panel1.Invalidate();
panel1.ResumeLayout();
break;
default:
ModViewer = null;
panel1.SuspendLayout();
panel1.Controls.Clear();
panel1.Invalidate();
panel1.ResumeLayout();
break;
}
}
private void splitContainer1_SplitterMoved(object sender, SplitterEventArgs e)
{
if (ModViewer != null)
{
ModViewer.Render();
}
}
}
}

View File

@ -28,109 +28,70 @@
/// </summary>
private void InitializeComponent()
{
this.simpleOpenGlControl1 = new Tao.Platform.Windows.SimpleOpenGlControl();
this.tabControl1 = new System.Windows.Forms.TabControl();
this.tabPage1 = new System.Windows.Forms.TabPage();
this.tabPage2 = new System.Windows.Forms.TabPage();
this.components = new System.ComponentModel.Container();
this.mainMenu1 = new LibEveryFileExplorer.UI.MainMenu(this.components);
this.splitContainer1 = new System.Windows.Forms.SplitContainer();
this.treeView1 = new System.Windows.Forms.TreeView();
this.tabControl1.SuspendLayout();
this.tabPage1.SuspendLayout();
this.tabPage2.SuspendLayout();
this.panel1 = new System.Windows.Forms.Panel();
((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit();
this.splitContainer1.Panel1.SuspendLayout();
this.splitContainer1.Panel2.SuspendLayout();
this.splitContainer1.SuspendLayout();
this.SuspendLayout();
//
// simpleOpenGlControl1
//
this.simpleOpenGlControl1.AccumBits = ((byte)(0));
this.simpleOpenGlControl1.AutoCheckErrors = false;
this.simpleOpenGlControl1.AutoFinish = false;
this.simpleOpenGlControl1.AutoMakeCurrent = true;
this.simpleOpenGlControl1.AutoSwapBuffers = true;
this.simpleOpenGlControl1.BackColor = System.Drawing.Color.Black;
this.simpleOpenGlControl1.ColorBits = ((byte)(32));
this.simpleOpenGlControl1.DepthBits = ((byte)(32));
this.simpleOpenGlControl1.Dock = System.Windows.Forms.DockStyle.Fill;
this.simpleOpenGlControl1.Location = new System.Drawing.Point(3, 3);
this.simpleOpenGlControl1.Name = "simpleOpenGlControl1";
this.simpleOpenGlControl1.Size = new System.Drawing.Size(575, 353);
this.simpleOpenGlControl1.StencilBits = ((byte)(8));
this.simpleOpenGlControl1.TabIndex = 0;
//
// tabControl1
//
this.tabControl1.Controls.Add(this.tabPage1);
this.tabControl1.Controls.Add(this.tabPage2);
this.tabControl1.Dock = System.Windows.Forms.DockStyle.Fill;
this.tabControl1.Location = new System.Drawing.Point(0, 0);
this.tabControl1.Name = "tabControl1";
this.tabControl1.SelectedIndex = 0;
this.tabControl1.Size = new System.Drawing.Size(589, 385);
this.tabControl1.TabIndex = 1;
this.tabControl1.Selecting += new System.Windows.Forms.TabControlCancelEventHandler(this.tabControl1_Selecting);
//
// tabPage1
//
this.tabPage1.Controls.Add(this.simpleOpenGlControl1);
this.tabPage1.Location = new System.Drawing.Point(4, 22);
this.tabPage1.Name = "tabPage1";
this.tabPage1.Padding = new System.Windows.Forms.Padding(3);
this.tabPage1.Size = new System.Drawing.Size(581, 359);
this.tabPage1.TabIndex = 0;
this.tabPage1.Text = "Render";
this.tabPage1.UseVisualStyleBackColor = true;
this.tabPage1.Layout += new System.Windows.Forms.LayoutEventHandler(this.CGFX_Layout);
//
// tabPage2
//
this.tabPage2.Controls.Add(this.splitContainer1);
this.tabPage2.Location = new System.Drawing.Point(4, 22);
this.tabPage2.Name = "tabPage2";
this.tabPage2.Padding = new System.Windows.Forms.Padding(3);
this.tabPage2.Size = new System.Drawing.Size(581, 359);
this.tabPage2.TabIndex = 1;
this.tabPage2.Text = "Content";
this.tabPage2.UseVisualStyleBackColor = true;
//
// splitContainer1
//
this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill;
this.splitContainer1.Location = new System.Drawing.Point(3, 3);
this.splitContainer1.FixedPanel = System.Windows.Forms.FixedPanel.Panel1;
this.splitContainer1.Location = new System.Drawing.Point(0, 0);
this.splitContainer1.Name = "splitContainer1";
//
// splitContainer1.Panel1
//
this.splitContainer1.Panel1.Controls.Add(this.treeView1);
this.splitContainer1.Size = new System.Drawing.Size(575, 353);
this.splitContainer1.SplitterDistance = 191;
this.splitContainer1.TabIndex = 0;
//
// splitContainer1.Panel2
//
this.splitContainer1.Panel2.Controls.Add(this.panel1);
this.splitContainer1.Size = new System.Drawing.Size(589, 385);
this.splitContainer1.SplitterDistance = 176;
this.splitContainer1.TabIndex = 1;
this.splitContainer1.SplitterMoved += new System.Windows.Forms.SplitterEventHandler(this.splitContainer1_SplitterMoved);
//
// treeView1
//
this.treeView1.Dock = System.Windows.Forms.DockStyle.Fill;
this.treeView1.HideSelection = false;
this.treeView1.HotTracking = true;
this.treeView1.Location = new System.Drawing.Point(0, 0);
this.treeView1.Name = "treeView1";
this.treeView1.Size = new System.Drawing.Size(191, 353);
this.treeView1.Size = new System.Drawing.Size(176, 385);
this.treeView1.TabIndex = 0;
this.treeView1.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.treeView1_AfterSelect);
//
// CGFXViewer
// panel1
//
this.panel1.Dock = System.Windows.Forms.DockStyle.Fill;
this.panel1.Location = new System.Drawing.Point(0, 0);
this.panel1.Name = "panel1";
this.panel1.Size = new System.Drawing.Size(409, 385);
this.panel1.TabIndex = 0;
//
// CGFXViewer2
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(589, 385);
this.Controls.Add(this.tabControl1);
this.Name = "CGFXViewer";
this.Controls.Add(this.splitContainer1);
this.Menu = this.mainMenu1;
this.Name = "CGFXViewer2";
this.Text = "CGFX";
this.Activated += new System.EventHandler(this.CGFXViewer_Activated);
this.Activated += new System.EventHandler(this.NSBMDViewer_Activated);
this.Load += new System.EventHandler(this.CGFX_Load);
this.Layout += new System.Windows.Forms.LayoutEventHandler(this.CGFX_Layout);
this.Resize += new System.EventHandler(this.CGFX_Resize);
this.tabControl1.ResumeLayout(false);
this.tabPage1.ResumeLayout(false);
this.tabPage2.ResumeLayout(false);
this.splitContainer1.Panel1.ResumeLayout(false);
this.splitContainer1.Panel2.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit();
this.splitContainer1.ResumeLayout(false);
this.ResumeLayout(false);
@ -139,11 +100,9 @@
#endregion
private Tao.Platform.Windows.SimpleOpenGlControl simpleOpenGlControl1;
private System.Windows.Forms.TabControl tabControl1;
private System.Windows.Forms.TabPage tabPage1;
private System.Windows.Forms.TabPage tabPage2;
private LibEveryFileExplorer.UI.MainMenu mainMenu1;
private System.Windows.Forms.SplitContainer splitContainer1;
private System.Windows.Forms.TreeView treeView1;
private System.Windows.Forms.Panel panel1;
}
}

View File

@ -117,4 +117,7 @@
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="mainMenu1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
</root>

105
3DS/UI/CMDLViewer.Designer.cs generated Normal file
View File

@ -0,0 +1,105 @@
namespace _3DS.UI
{
partial class CMDLViewer
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Component Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(CMDLViewer));
this.simpleOpenGlControl1 = new Tao.Platform.Windows.SimpleOpenGlControl();
this.toolStrip1 = new System.Windows.Forms.ToolStrip();
this.toolStripButton1 = new System.Windows.Forms.ToolStripButton();
this.saveFileDialog1 = new System.Windows.Forms.SaveFileDialog();
this.toolStrip1.SuspendLayout();
this.SuspendLayout();
//
// simpleOpenGlControl1
//
this.simpleOpenGlControl1.AccumBits = ((byte)(0));
this.simpleOpenGlControl1.AutoCheckErrors = false;
this.simpleOpenGlControl1.AutoFinish = false;
this.simpleOpenGlControl1.AutoMakeCurrent = true;
this.simpleOpenGlControl1.AutoSwapBuffers = true;
this.simpleOpenGlControl1.BackColor = System.Drawing.Color.Black;
this.simpleOpenGlControl1.ColorBits = ((byte)(32));
this.simpleOpenGlControl1.DepthBits = ((byte)(32));
this.simpleOpenGlControl1.Dock = System.Windows.Forms.DockStyle.Fill;
this.simpleOpenGlControl1.Location = new System.Drawing.Point(0, 25);
this.simpleOpenGlControl1.Name = "simpleOpenGlControl1";
this.simpleOpenGlControl1.Size = new System.Drawing.Size(462, 332);
this.simpleOpenGlControl1.StencilBits = ((byte)(8));
this.simpleOpenGlControl1.TabIndex = 1;
//
// toolStrip1
//
this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.toolStripButton1});
this.toolStrip1.Location = new System.Drawing.Point(0, 0);
this.toolStrip1.Name = "toolStrip1";
this.toolStrip1.Size = new System.Drawing.Size(462, 25);
this.toolStrip1.TabIndex = 2;
this.toolStrip1.Text = "toolStrip1";
//
// toolStripButton1
//
this.toolStripButton1.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right;
this.toolStripButton1.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
this.toolStripButton1.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton1.Image")));
this.toolStripButton1.ImageTransparentColor = System.Drawing.Color.Magenta;
this.toolStripButton1.Name = "toolStripButton1";
this.toolStripButton1.Size = new System.Drawing.Size(23, 22);
this.toolStripButton1.Text = "Export";
this.toolStripButton1.Click += new System.EventHandler(this.toolStripButton1_Click);
//
// saveFileDialog1
//
this.saveFileDialog1.Filter = "COLLADA DAE File (*.dae)|*.dae|Wavefront OBJ File (*.obj)|*.obj";
//
// CMDLViewer
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.simpleOpenGlControl1);
this.Controls.Add(this.toolStrip1);
this.DoubleBuffered = true;
this.Name = "CMDLViewer";
this.Size = new System.Drawing.Size(462, 357);
this.Load += new System.EventHandler(this.MDL0Viewer_Load);
this.toolStrip1.ResumeLayout(false);
this.toolStrip1.PerformLayout();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private Tao.Platform.Windows.SimpleOpenGlControl simpleOpenGlControl1;
private System.Windows.Forms.ToolStrip toolStrip1;
private System.Windows.Forms.ToolStripButton toolStripButton1;
private System.Windows.Forms.SaveFileDialog saveFileDialog1;
}
}

464
3DS/UI/CMDLViewer.cs Normal file
View File

@ -0,0 +1,464 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Tao.OpenGl;
using _3DS.NintendoWare.GFX;
using System.Drawing.Imaging;
using LibEveryFileExplorer._3D;
using LibEveryFileExplorer.Collections;
using CommonFiles;
using System.IO;
namespace _3DS.UI
{
public partial class CMDLViewer : UserControl
{
CGFX Resource;
CMDL Model;
public CMDLViewer(CGFX Resource, CMDL Model)
{
this.Resource = Resource;
this.Model = Model;
InitializeComponent();
simpleOpenGlControl1.MouseWheel += new MouseEventHandler(simpleOpenGlControl1_MouseWheel);
}
void simpleOpenGlControl1_MouseWheel(object sender, MouseEventArgs e)
{
if ((Control.ModifierKeys & Keys.Shift) == Keys.Shift) { dist += ((float)e.Delta / 10); }
else { dist += ((float)e.Delta / 100); }
Render();
}
bool init = false;
String glversion = null;
float X = 0.0f;
float Y = 0.0f;
float ang = 0.0f;
float dist = 0.0f;
float elev = 0.0f;
private void MDL0Viewer_Load(object sender, EventArgs e)
{
simpleOpenGlControl1.InitializeContexts();
Gl.ReloadFunctions();
//Gl.glEnable(Gl.GL_LIGHTING);
Gl.glEnable(Gl.GL_RESCALE_NORMAL);
Gl.glEnable(Gl.GL_COLOR_MATERIAL);
Gl.glEnable(Gl.GL_DEPTH_TEST);
Gl.glEnable(Gl.GL_NORMALIZE);
Gl.glDisable(Gl.GL_CULL_FACE);
Gl.glFrontFace(Gl.GL_CCW);
Gl.glEnable(Gl.GL_TEXTURE_2D);
Gl.glClearDepth(1);
Gl.glEnable(Gl.GL_ALPHA_TEST);
Gl.glAlphaFunc(Gl.GL_GREATER, 0f);
Gl.glEnable(Gl.GL_BLEND);
Gl.glBlendFunc(Gl.GL_SRC_ALPHA, Gl.GL_ONE_MINUS_SRC_ALPHA);
//Gl.glTexEnvf(Gl.GL_TEXTURE_ENV, Gl.GL_TEXTURE_ENV_MODE, Gl.GL_BLEND);
Gl.glShadeModel(Gl.GL_SMOOTH);
Gl.glDepthFunc(Gl.GL_LEQUAL);
Gl.glClearColor(51f / 255f, 51f / 255f, 51f / 255f, 0f);
if (Resource.Data.Textures != null && Model != null)
{
int i = 0;
foreach (var v in Model.Materials)
{
if (v.Tex0 != null) UploadTex(v.Tex0, i * 4 + 0 + 1);
if (v.Tex1 != null) UploadTex(v.Tex1, i * 4 + 1 + 1);
if (v.Tex2 != null) UploadTex(v.Tex2, i * 4 + 2 + 1);
//if (v.Tex3 != null) UploadTex(v.Tex3, i * 4 + 3 + 1);
i++;
}
}
if (Model != null) Shaders = new CGFXShader[Model.Materials.Length];
//GlNitro.glNitroBindTextures(file, 1);
glversion = Gl.glGetString(Gl.GL_VERSION);
init = true;
Render();
}
private void UploadTex(CMDL.MTOB.TexInfo TextureMapper, int Id)
{
if (!(TextureMapper.TextureObject is ReferenceTexture))
return;
var tex = Resource.Data.Textures[Resource.Data.Dictionaries[1].IndexOf(((ReferenceTexture)TextureMapper.TextureObject).LinkedTextureName)] as ImageTextureCtr;
if (tex == null)
return;
Gl.glBindTexture(Gl.GL_TEXTURE_2D, Id);
Gl.glColor3f(1, 1, 1);
Bitmap b = tex.GetBitmap();
b.RotateFlip(RotateFlipType.RotateNoneFlipY);
BitmapData d = b.LockBits(new Rectangle(0, 0, b.Width, b.Height), System.Drawing.Imaging.ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 0, Gl.GL_RGBA8, b.Width, b.Height, 0, Gl.GL_BGRA, Gl.GL_UNSIGNED_BYTE, d.Scan0);
b.UnlockBits(d);
if (((TextureMapper.Unknown12 >> 1) & 1) == 1) Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_LINEAR);
else Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_NEAREST);
//if (((TextureMapper.Unknown12 >> 2) & 1) == 1) Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_LINEAR);
//else Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_NEAREST);
//A bit confusing, so using this for now:
Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MIN_FILTER, Gl.GL_LINEAR);
switch ((TextureMapper.Unknown12 >> 12) & 0xF)
{
case 0: Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_S, Gl.GL_CLAMP_TO_EDGE); break;
case 1: Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_S, Gl.GL_CLAMP_TO_BORDER); break;
case 2: Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_S, Gl.GL_REPEAT); break;
case 3: Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_S, Gl.GL_MIRRORED_REPEAT); break;
default: Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_S, Gl.GL_REPEAT); break;
}
switch ((TextureMapper.Unknown12 >> 8) & 0xF)
{
case 0: Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_T, Gl.GL_CLAMP_TO_EDGE); break;
case 1: Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_T, Gl.GL_CLAMP_TO_BORDER); break;
case 2: Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_T, Gl.GL_REPEAT); break;
case 3: Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_T, Gl.GL_MIRRORED_REPEAT); break;
default: Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_T, Gl.GL_REPEAT); break;
}
}
CGFXShader[] Shaders;
public void Render()
{
if (!init) return;
if (Model == null) return;
//G3D_Binary_File_Format.Shaders.Shader s = new G3D_Binary_File_Format.Shaders.Shader();
//s.Compile();
//s.Enable();
//Gl.glViewport(0, 0, simpleOpenGlControl1.Width, simpleOpenGlControl1.Height);
float aspect = (float)simpleOpenGlControl1.Width / (float)simpleOpenGlControl1.Height;
//float fov = 60.0f; // in degrees
//float znear = 0.02f;
//float zfar = 1000.0f * file.modelSet.models[SelMdl].info.posScale;
//Gl.glMatrixMode(Gl.GL_PROJECTION);
//Gl.glLoadMatrixf(BuildPerspProjMat(fov, aspect, znear, zfar));
Gl.glMatrixMode(Gl.GL_PROJECTION);
Gl.glLoadIdentity();
Gl.glViewport(0, 0, simpleOpenGlControl1.Width, simpleOpenGlControl1.Height);
//Gl.glOrtho(-simpleOpenGlControl1.Width / 2.0f, simpleOpenGlControl1.Width / 2.0f, -simpleOpenGlControl1.Height / 2.0f, simpleOpenGlControl1.Height / 2.0f, 0.02f, 1000f * file.modelSet.models[SelMdl].info.posScale);
//Gl.glMatrixMode(Gl.GL_PROJECTION);
//Gl.glLoadIdentity();
//Gl.glFrustum(-simpleOpenGlControl1.Width / 2f, simpleOpenGlControl1.Width / 2f, -simpleOpenGlControl1.Height / 2f, simpleOpenGlControl1.Height / 2f, 1000, -1000);
Glu.gluPerspective(30, aspect, 0.1f, 20480000f);//0.02f, 32.0f);
Gl.glMatrixMode(Gl.GL_MODELVIEW);
Gl.glLoadIdentity();
Gl.glBindTexture(Gl.GL_TEXTURE_2D, 0);
Gl.glColor3f(1.0f, 1.0f, 1.0f);
//Gl.glEnable(Gl.GL_DEPTH_TEST);
Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
/*Gl.glRotatef(elev, 1, 0, 0);
Gl.glFogfv(Gl.GL_FOG_COLOR, new float[] { 0, 0, 0, 1 });
Gl.glFogf(Gl.GL_FOG_DENSITY, 1);
Gl.glRotatef(-elev, 1, 0, 0);*/
Gl.glTranslatef(X, Y, -dist);
Gl.glRotatef(elev, 1, 0, 0);
Gl.glRotatef(ang, 0, 1, 0);
Gl.glPushMatrix();
RenderModel();
Gl.glPopMatrix();
simpleOpenGlControl1.Refresh();
}
void RenderModel()
{
CMDL m = Model;
//foreach (_3DS.CGFX.DATA.CMDL m in cgfx.Data.Models)
//{
//int i = 0;
foreach (var mm in m.Meshes)
{
var vv = m.Shapes[mm.ShapeIndex];
Polygon p = vv.GetVertexData(m);
var mat = m.Materials[mm.MaterialIndex];
mat.FragShader.AlphaTest.GlApply();
mat.FragmentOperation.BlendOperation.GlApply();
Gl.glMatrixMode(Gl.GL_TEXTURE);
if (mat.Tex0 != null)
{
Gl.glActiveTexture(Gl.GL_TEXTURE0);
Gl.glBindTexture(Gl.GL_TEXTURE_2D, mm.MaterialIndex * 4 + 0 + 1);
Gl.glEnable(Gl.GL_TEXTURE_2D);
Gl.glLoadIdentity();
float[] mtx = new float[16];
Array.Copy(mat.TextureCoordiators[0].Matrix, mtx, 4 * 3);
mtx[15] = 1;
mtx[12] = mtx[3];
mtx[13] = mtx[7];
mtx[14] = mtx[11];
mtx[3] = 0;
mtx[7] = 0;
mtx[11] = 0;
Gl.glLoadMatrixf(mtx);
//if (mat.TextureCoordiators[0].MappingMethod == 2)
//{
// Gl.glTexGeni(Gl.GL_S, Gl.GL_TEXTURE_GEN_MODE, Gl.GL_SPHERE_MAP);
// Gl.glTexGeni(Gl.GL_T, Gl.GL_TEXTURE_GEN_MODE, Gl.GL_SPHERE_MAP);
//}
//Gl.glTranslatef(mat.TextureCoordiators[0].Scale.X / mat.TextureCoordiators[0].Translate.X, mat.TextureCoordiators[0].Translate.Y * mat.TextureCoordiators[0].Scale.Y, 0);
//Gl.glRotatef(mat.TextureCoordiators[0].Rotate, 0, 1, 0);
//Gl.glScalef(mat.TextureCoordiators[0].Scale.X, mat.TextureCoordiators[0].Scale.Y, 1);
}
if (mat.Tex1 != null)
{
Gl.glActiveTexture(Gl.GL_TEXTURE1);
Gl.glBindTexture(Gl.GL_TEXTURE_2D, mm.MaterialIndex * 4 + 1 + 1);
Gl.glEnable(Gl.GL_TEXTURE_2D);
Gl.glLoadIdentity();
float[] mtx = new float[16];
Array.Copy(mat.TextureCoordiators[1].Matrix, mtx, 4 * 3);
mtx[15] = 1;
mtx[12] = mtx[3];
mtx[13] = mtx[7];
mtx[14] = mtx[11];
mtx[3] = 0;
mtx[7] = 0;
mtx[11] = 0;
Gl.glLoadMatrixf(mtx);
//if (mat.TextureCoordiators[1].MappingMethod == 2)
//{
// Gl.glTexGeni(Gl.GL_S, Gl.GL_TEXTURE_GEN_MODE, Gl.GL_SPHERE_MAP);
// Gl.glTexGeni(Gl.GL_T, Gl.GL_TEXTURE_GEN_MODE, Gl.GL_SPHERE_MAP);
//}
}
if (mat.Tex2 != null)
{
Gl.glActiveTexture(Gl.GL_TEXTURE2);
Gl.glBindTexture(Gl.GL_TEXTURE_2D, mm.MaterialIndex * 4 + 2 + 1);
Gl.glEnable(Gl.GL_TEXTURE_2D);
Gl.glLoadIdentity();
float[] mtx = new float[16];
Array.Copy(mat.TextureCoordiators[2].Matrix, mtx, 4 * 3);
mtx[15] = 1;
mtx[12] = mtx[3];
mtx[13] = mtx[7];
mtx[14] = mtx[11];
mtx[3] = 0;
mtx[7] = 0;
mtx[11] = 0;
Gl.glLoadMatrixf(mtx);
//if (mat.TextureCoordiators[2].MappingMethod == 2)
//{
// Gl.glTexGeni(Gl.GL_S, Gl.GL_TEXTURE_GEN_MODE, Gl.GL_SPHERE_MAP);
// Gl.glTexGeni(Gl.GL_T, Gl.GL_TEXTURE_GEN_MODE, Gl.GL_SPHERE_MAP);
//}
}
/*if (mat.Tex3 != null)
{
MessageBox.Show("Tex3!!!!!!!!!!!");
Gl.glActiveTexture(Gl.GL_TEXTURE3);
Gl.glBindTexture(Gl.GL_TEXTURE_2D, mm.MaterialIndex * 4 + 3 + 1);
Gl.glEnable(Gl.GL_TEXTURE_2D);
Gl.glLoadIdentity();
}*/
Gl.glMatrixMode(Gl.GL_MODELVIEW);
Gl.glPushMatrix();
Gl.glTranslatef(vv.PositionOffset.X, vv.PositionOffset.Y, vv.PositionOffset.Z);
if (glversion.StartsWith("2.") && Shaders[mm.MaterialIndex] == null)
{
List<int> tex = new List<int>();
if (mat.Tex0 != null) tex.Add((int)mm.MaterialIndex * 4 + 0 + 1);
else tex.Add(0);
if (mat.Tex1 != null) tex.Add((int)mm.MaterialIndex * 4 + 1 + 1);
else tex.Add(0);
if (mat.Tex2 != null) tex.Add((int)mm.MaterialIndex * 4 + 2 + 1);
else tex.Add(0);
//if (mat.Tex3 != null) tex.Add((int)mm.MaterialIndex * 4 + 3 + 1);
/*else */
tex.Add(0);
Shaders[mm.MaterialIndex] = new CGFXShader(mat, tex.ToArray());
Shaders[mm.MaterialIndex].Compile();
}
if (glversion.StartsWith("2.")) Shaders[mm.MaterialIndex].Enable();
//Gl.glMaterialfv(Gl.GL_FRONT_AND_BACK, Gl.GL_EMISSION, new float[] { mat.Emission_2.R / 255f, mat.Emission_2.G / 255f, mat.Emission_2.B / 255f, mat.Emission_2.A / 255f });
//Gl.glMaterialfv(Gl.GL_FRONT_AND_BACK, Gl.GL_AMBIENT, new float[] { mat.Ambient_1.R / 255f, mat.Ambient_1.G / 255f, mat.Ambient_1.B / 255f, mat.Ambient_1.A / 255f });
//Gl.glMaterialfv(Gl.GL_FRONT_AND_BACK, Gl.GL_DIFFUSE, new float[] { mat.Diffuse_2.R / 255f, mat.Diffuse_2.G / 255f, mat.Diffuse_2.B / 255f, mat.Diffuse_2.A / 255f });
//Gl.glColorMaterial(Gl.GL_FRONT_AND_BACK, Gl.GL_DIFFUSE);
//Gl.glEnable(Gl.GL_COLOR_MATERIAL);
foreach (var q in vv.PrimitiveSets[0].Primitives[0].IndexStreams)
{
Vector3[] defs = q.GetFaceData();
Gl.glBegin(Gl.GL_TRIANGLES);
foreach (Vector3 d in defs)
{
if (p.Normals != null) Gl.glNormal3f(p.Normals[(int)d.X].X, p.Normals[(int)d.X].Y, p.Normals[(int)d.X].Z);
if (p.Colors != null) Gl.glColor4f(p.Colors[(int)d.X].R / 255f, p.Colors[(int)d.X].G / 255f, p.Colors[(int)d.X].B / 255f, p.Colors[(int)d.X].A / 255f);
else Gl.glColor4f(1, 1, 1, 1);
if (p.TexCoords != null) Gl.glMultiTexCoord2f(Gl.GL_TEXTURE0, p.TexCoords[(int)d.X].X, p.TexCoords[(int)d.X].Y);
if (p.TexCoords2 != null) Gl.glMultiTexCoord2f(Gl.GL_TEXTURE1, p.TexCoords2[(int)d.X].X, p.TexCoords2[(int)d.X].Y);
if (p.TexCoords3 != null) Gl.glMultiTexCoord2f(Gl.GL_TEXTURE2, p.TexCoords3[(int)d.X].X, p.TexCoords3[(int)d.X].Y);
Gl.glVertex3f(p.Vertex[(int)d.X].X, p.Vertex[(int)d.X].Y, p.Vertex[(int)d.X].Z);
if (p.Normals != null) Gl.glNormal3f(p.Normals[(int)d.Y].X, p.Normals[(int)d.Y].Y, p.Normals[(int)d.Y].Z);
if (p.Colors != null) Gl.glColor4f(p.Colors[(int)d.Y].R / 255f, p.Colors[(int)d.Y].G / 255f, p.Colors[(int)d.Y].B / 255f, p.Colors[(int)d.Y].A / 255f);
else Gl.glColor4f(1, 1, 1, 1);
if (p.TexCoords != null) Gl.glMultiTexCoord2f(Gl.GL_TEXTURE0, p.TexCoords[(int)d.Y].X, p.TexCoords[(int)d.Y].Y);
if (p.TexCoords2 != null) Gl.glMultiTexCoord2f(Gl.GL_TEXTURE1, p.TexCoords2[(int)d.Y].X, p.TexCoords2[(int)d.Y].Y);
if (p.TexCoords3 != null) Gl.glMultiTexCoord2f(Gl.GL_TEXTURE2, p.TexCoords3[(int)d.Y].X, p.TexCoords3[(int)d.Y].Y);
Gl.glVertex3f(p.Vertex[(int)d.Y].X, p.Vertex[(int)d.Y].Y, p.Vertex[(int)d.Y].Z);
if (p.Normals != null) Gl.glNormal3f(p.Normals[(int)d.Z].X, p.Normals[(int)d.Z].Y, p.Normals[(int)d.Z].Z);
if (p.Colors != null) Gl.glColor4f(p.Colors[(int)d.Z].R / 255f, p.Colors[(int)d.Z].G / 255f, p.Colors[(int)d.Z].B / 255f, p.Colors[(int)d.Z].A / 255f);
else Gl.glColor4f(1, 1, 1, 1);
if (p.TexCoords != null) Gl.glMultiTexCoord2f(Gl.GL_TEXTURE0, p.TexCoords[(int)d.Z].X, p.TexCoords[(int)d.Z].Y);
if (p.TexCoords2 != null) Gl.glMultiTexCoord2f(Gl.GL_TEXTURE1, p.TexCoords2[(int)d.Z].X, p.TexCoords2[(int)d.Z].Y);
if (p.TexCoords3 != null) Gl.glMultiTexCoord2f(Gl.GL_TEXTURE2, p.TexCoords3[(int)d.Z].X, p.TexCoords3[(int)d.Z].Y);
Gl.glVertex3f(p.Vertex[(int)d.Z].X, p.Vertex[(int)d.Z].Y, p.Vertex[(int)d.Z].Z);
}
Gl.glEnd();
}
Gl.glPopMatrix();
}
}
bool wire = false;
bool licht = true;
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
switch (keyData)
{
case Keys.Right:
ang += 1;
Render();
return true;
case Keys.Left:
ang -= 1;
Render();
return true;
case Keys.Up:
elev += 1;
Render();
return true;
case Keys.Down:
elev -= 1;
Render();
return true;
case Keys.Z:
X -= 5f;
Render();
return true;
case Keys.X:
X += 5f;
Render();
return true;
case Keys.A:
Y -= 5f;
Render();
return true;
case Keys.S:
Y += 5f;
Render();
return true;
case Keys.W:
wire = !wire;
if (wire) { Gl.glPolygonMode(Gl.GL_FRONT_AND_BACK, Gl.GL_LINE); Render(); }
else { Gl.glPolygonMode(Gl.GL_FRONT_AND_BACK, Gl.GL_FILL); Render(); }
return true;
case Keys.Escape:
X = 0.0f;
Y = 0.0f;
ang = 0.0f;
dist = 0.0f;
elev = 0.0f;
Render();
return true;
case Keys.T:
elev = 90;
ang = 0;
Render();
return true;
case Keys.L:
licht = !licht;
Render();
return true;
case Keys.OemMinus:
case Keys.OemMinus | Keys.Shift:
if ((Control.ModifierKeys & Keys.Shift) == Keys.Shift) dist += 12f;
else dist += 1.2f;
Render();
return true;
case Keys.Oemplus:
case Keys.Oemplus | Keys.Shift:
if ((Control.ModifierKeys & Keys.Shift) == Keys.Shift) dist -= 12f;
else dist -= 1.2f;
Render();
return true;
default:
return base.ProcessCmdKey(ref msg, keyData);
}
}
private void toolStripButton1_Click(object sender, EventArgs e)
{
saveFileDialog1.FileName = Model.Name;
if (saveFileDialog1.ShowDialog() == DialogResult.OK
&& saveFileDialog1.FileName.Length > 0)
{
switch (saveFileDialog1.FilterIndex)
{
case 0:
{
DAE o = Model.ToDAE(Resource);
File.Create(saveFileDialog1.FileName).Close();
File.WriteAllBytes(saveFileDialog1.FileName, o.Write());
Directory.CreateDirectory(Path.GetDirectoryName(saveFileDialog1.FileName) + "\\Tex");
foreach (var v in Resource.Data.Textures)
{
if (!(v is ImageTextureCtr)) continue;
((ImageTextureCtr)v).GetBitmap().Save(Path.GetDirectoryName(saveFileDialog1.FileName) + "\\Tex\\" + v.Name + ".png");
}
break;
}
case 1:
{
OBJ o = Model.ToOBJ();
o.MTLPath = Path.GetFileNameWithoutExtension(saveFileDialog1.FileName) + ".mtl";
MTL m = Model.ToMTL();
byte[] d = o.Write();
byte[] d2 = m.Write();
File.Create(saveFileDialog1.FileName).Close();
File.WriteAllBytes(saveFileDialog1.FileName, d);
File.Create(Path.ChangeExtension(saveFileDialog1.FileName, "mtl")).Close();
File.WriteAllBytes(Path.ChangeExtension(saveFileDialog1.FileName, "mtl"), d2);
Directory.CreateDirectory(Path.GetDirectoryName(saveFileDialog1.FileName) + "\\Tex");
foreach (var v in Resource.Data.Textures)
{
//if (v.NrLevels > 2) v.GetBitmap(2).Save(System.IO.Path.GetDirectoryName(Path) + "\\Tex\\" + v.Name + ".png");
//else if (v.NrLevels > 1) v.GetBitmap(1).Save(System.IO.Path.GetDirectoryName(Path) + "\\Tex\\" + v.Name + ".png");
//else v.GetBitmap(0).Save(System.IO.Path.GetDirectoryName(Path) + "\\Tex\\" + v.Name + ".png");
if (!(v is ImageTextureCtr)) continue;
((ImageTextureCtr)v).GetBitmap().Save(Path.GetDirectoryName(saveFileDialog1.FileName) + "\\Tex\\" + v.Name + ".png");
}
break;
}
}
}
}
}
}

143
3DS/UI/CMDLViewer.resx Normal file
View File

@ -0,0 +1,143 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="toolStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="toolStripButton1.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAI3SURBVDhPYxi6gLmM2R3KxALqGTiYS5hdmEuZO5lKmFYD
8R6mUqa96BiqGg0UM8gzFzLPVOtROh+xNeh11uHkHyUnc/6Xnsr9X3U+/3/zjZL/HXfL/zMVMO2D6kAC
WQzyXCUc6z2Xuj7N2JvyP3FbIhgnbY//n3c49X/Nxbz/DVcL/zffLPnPlIfugnigszOZZznNt38atznm
f9T6qP+R6yKAdAhQc9L/irPZcFx6JuMnUybTOqhOCGBOZnaVrZG5GL4m9H/Q8qD/3gu8gLTX/+wDCUAD
kpFwyv/YrUFvGVMYe6BaIYAxnrHXborNW58FPv8dpjr895jr/D95R8z/lJ2oGGSIWqPyJeYEZleoVghg
jGbc4DTD8af1BOv/Vv3mYKej4/gtEf+9l67/LVuRvUemsJATqhUCmEKZDtlOsvmvXqP232+x9/+Apb5w
HLjMF2yA6yy75wY9Bz6YT7552XzS3RioVghgCmA6ql6j/t95hiPYAP8lPmCNVhNm/TPq3P5Hu2nzN/X6
rW90Ws5cnv70/3+99ktndFrPQw2xZ+BhdGY8joFdGI/JFiz9MOnx//9ZV///j72IwMU3/v9Xrjx8BmKA
OUMRowVjB4MsgxREAAGE/DtmimdtPYOMLY7+/w+iJXK2QV2gz7CbgZ/BEcjSAmJVIJYHYgkgFgJiHiBm
B2ImIGbgiVl+BoR541aihAHIZpAGUSAWBmIBIAZpBIU0GxCzADEjEDOwBc6ZyRowG6qZgQEAZbYdbqlW
taMAAAAASUVORK5CYII=
</value>
</data>
<metadata name="saveFileDialog1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>122, 17</value>
</metadata>
</root>

134
3DS/UI/TXOBViewer.Designer.cs generated Normal file
View File

@ -0,0 +1,134 @@
namespace _3DS.UI
{
partial class TXOBViewer
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(TXOBViewer));
this.toolStrip1 = new System.Windows.Forms.ToolStrip();
this.toolStripButton1 = new System.Windows.Forms.ToolStripButton();
this.toolStripButton2 = new System.Windows.Forms.ToolStripButton();
this.toolStripComboBox1 = new System.Windows.Forms.ToolStripComboBox();
this.toolStripLabel1 = new System.Windows.Forms.ToolStripLabel();
this.pictureBox1 = new System.Windows.Forms.PictureBox();
this.saveFileDialog1 = new System.Windows.Forms.SaveFileDialog();
this.toolStrip1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
this.SuspendLayout();
//
// toolStrip1
//
this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.toolStripButton1,
this.toolStripButton2,
this.toolStripComboBox1,
this.toolStripLabel1});
this.toolStrip1.Location = new System.Drawing.Point(0, 0);
this.toolStrip1.Name = "toolStrip1";
this.toolStrip1.Size = new System.Drawing.Size(464, 25);
this.toolStrip1.TabIndex = 0;
this.toolStrip1.Text = "toolStrip1";
//
// toolStripButton1
//
this.toolStripButton1.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
this.toolStripButton1.Enabled = false;
this.toolStripButton1.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton1.Image")));
this.toolStripButton1.ImageTransparentColor = System.Drawing.Color.Magenta;
this.toolStripButton1.Name = "toolStripButton1";
this.toolStripButton1.Size = new System.Drawing.Size(23, 22);
this.toolStripButton1.Text = "Import";
//
// toolStripButton2
//
this.toolStripButton2.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
this.toolStripButton2.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton2.Image")));
this.toolStripButton2.ImageTransparentColor = System.Drawing.Color.Magenta;
this.toolStripButton2.Name = "toolStripButton2";
this.toolStripButton2.Size = new System.Drawing.Size(23, 22);
this.toolStripButton2.Text = "Export";
this.toolStripButton2.Click += new System.EventHandler(this.toolStripButton2_Click);
//
// toolStripComboBox1
//
this.toolStripComboBox1.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right;
this.toolStripComboBox1.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.toolStripComboBox1.FlatStyle = System.Windows.Forms.FlatStyle.Standard;
this.toolStripComboBox1.Name = "toolStripComboBox1";
this.toolStripComboBox1.Size = new System.Drawing.Size(121, 25);
this.toolStripComboBox1.SelectedIndexChanged += new System.EventHandler(this.toolStripComboBox1_SelectedIndexChanged);
//
// toolStripLabel1
//
this.toolStripLabel1.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right;
this.toolStripLabel1.Name = "toolStripLabel1";
this.toolStripLabel1.Size = new System.Drawing.Size(40, 22);
this.toolStripLabel1.Text = "Level: ";
//
// pictureBox1
//
this.pictureBox1.BackgroundImage = global::_3DS.Resource.preview_background;
this.pictureBox1.Dock = System.Windows.Forms.DockStyle.Fill;
this.pictureBox1.Location = new System.Drawing.Point(0, 25);
this.pictureBox1.Name = "pictureBox1";
this.pictureBox1.Size = new System.Drawing.Size(464, 308);
this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;
this.pictureBox1.TabIndex = 1;
this.pictureBox1.TabStop = false;
//
// saveFileDialog1
//
this.saveFileDialog1.Filter = "PNG Images (*.png)|*.png";
//
// TXOBViewer
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.pictureBox1);
this.Controls.Add(this.toolStrip1);
this.Name = "TXOBViewer";
this.Size = new System.Drawing.Size(464, 333);
this.Load += new System.EventHandler(this.TXOBViewer_Load);
this.toolStrip1.ResumeLayout(false);
this.toolStrip1.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.ToolStrip toolStrip1;
private System.Windows.Forms.PictureBox pictureBox1;
private System.Windows.Forms.ToolStripButton toolStripButton1;
private System.Windows.Forms.ToolStripButton toolStripButton2;
private System.Windows.Forms.ToolStripComboBox toolStripComboBox1;
private System.Windows.Forms.ToolStripLabel toolStripLabel1;
private System.Windows.Forms.SaveFileDialog saveFileDialog1;
}
}

47
3DS/UI/TXOBViewer.cs Normal file
View File

@ -0,0 +1,47 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using _3DS.NintendoWare.GFX;
using System.Drawing.Imaging;
namespace _3DS.UI
{
public partial class TXOBViewer : UserControl
{
public ImageTextureCtr Texture;
public TXOBViewer(ImageTextureCtr Texture)
{
this.Texture = Texture;
InitializeComponent();
}
private void TXOBViewer_Load(object sender, EventArgs e)
{
for (int i = 0; i < Texture.NrLevels; i++)
{
toolStripComboBox1.Items.Add(i.ToString());
}
toolStripComboBox1.SelectedIndex = 0;
}
private void toolStripComboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
pictureBox1.Image = Texture.GetBitmap(toolStripComboBox1.SelectedIndex);
}
private void toolStripButton2_Click(object sender, EventArgs e)
{
saveFileDialog1.FileName = Texture.Name + ".png";
if (saveFileDialog1.ShowDialog() == DialogResult.OK
&& saveFileDialog1.FileName.Length > 0)
{
pictureBox1.Image.Save(saveFileDialog1.FileName, ImageFormat.Png);
}
}
}
}

156
3DS/UI/TXOBViewer.resx Normal file
View File

@ -0,0 +1,156 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="toolStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="toolStripButton1.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHFSURBVDhPzZBfKOthHMa/t26mbOqsmHKjxcXq7FAuWLkS
F/6cG8s57YoT0lIzdjEhfxpaHc5KJ7JThrFdkC0Zyp9FkuICpSUUWfw4HdqMPed95+fUuTM3PPWp9316
P8/FS+8nn83m6tcg6kQlJtO3aDSKFwOAO6JOVGww1Nw/PMDh9WJ8dhLeMQ0W7NJ/+Owy+EakmOfYP+CR
DXBH1IkK9fra23AYQ243IqFLOF2tWJxUY82ZCv+UAn53GvwuBVbYfXkiHRE2wB3KKCoyPfPD4QDnPiRA
OJuHx6XFxowKuytqHB2VYX+nAJuzSqxPZyLMBgrq6upJodG0sPN/uREEnB4u4Xi3DXurpQgEtDi5qImx
s6TGlkeFO/Yuv6pKT9Ls7PZnOmw2cG6EK+xtL6LdpEW3/hM8U5U4DQ7g4PA7fvaUYu5XDv6wgVydrkH8
ASJ1RYUhEAzCbLUidHcJS181Ri0SOHolcPYnwueWYXo4CePWxFj/mw1wR9SJssrLjQfn52i2WNDc1YrG
L7IYxq/J6GyQY3QwDSP9iljXpJPjmg1wR9SJUvLyWgRWxgN3RJ0oQansihemSZ7sp8gZH+Mgi/HmIfoL
mcCdW7XvzrgAAAAASUVORK5CYII=
</value>
</data>
<data name="toolStripButton2.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAINSURBVDhPYxh4EFZb6xtSV5dODgbpZQiorc34TyYA6WUI
KCvL/Pvv3/9za4RJwiA9IL0MniUl2b/+/v1/ZZMkFiz1/+pmqf/XtkrDMYgPEgfpAellcMvNzf3+58//
ZW2G/w8v0v5/d7cSHN/bo/z/wX7V/0+Oa/1/dlYPTIP4IHGQHpBeBqfMzPzPv379j7S0/B9rZ/d/SYvJ
/yeHNMG4KFHsv6+z4P/th1L/7zqdB6bXrQv8v3qF7/+AoKD/wnJyOxhsUlML3//8+d9aUvK/l4bG/0hz
0/9Ti43+r+s1/u9gJvi/paXl/z9ggIH8DMMgPkicg4/vEoNlfHzxm+/f/+f7coJxUQDP/7oYif8NcVL/
NeU5/9fU1PwHufDd169wDOKDxDn5+a8ymERGlr749u3/oQUCGNhcj/V/eXn5/zPXrv1/CVQDwyA+SBxo
wA0GvdDQimdfvvzvymDDwKqyzP/DwsL+Gxsbo2ATE5P/4eHh/zm4uO4wyDk51b0EhsHjz58xsIWNzf/g
4OD/x44d/3/o0GEwBrEtLCz+R0RE/Gfh4nrAwKmiksGrq9uGDTOzsDwJDAz8v3373v9KSkrAGNgCZtva
2v6Pior6z8TMfA+UHdiAWAyIpdAxIyPjOiC+snbtbrDTV67c9h/EdnJy+h8bG/sfKHcBqA4v4AbirczM
zF3IGCj2GIIZVgIAhmv0Ys3vGOAAAAAASUVORK5CYII=
</value>
</data>
<metadata name="saveFileDialog1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>122, 17</value>
</metadata>
</root>

View File

@ -276,7 +276,10 @@ namespace NDS.UI
mainMenu1.MenuItems.Clear();
mainMenu1.MenuItems.Add(menuItem1);
//render it multiple times to avoid glitches!
for (int i = 0; i < 8; i++) ModViewer.Render();
if (ModViewer != null)
{
for (int i = 0; i < 8; i++) ModViewer.Render();
}
}
private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
@ -322,5 +325,13 @@ namespace NDS.UI
break;
}
}
private void splitContainer1_SplitterMoved(object sender, SplitterEventArgs e)
{
if (ModViewer != null)
{
ModViewer.Render();
}
}
}
}

View File

@ -68,6 +68,7 @@
this.splitContainer1.Size = new System.Drawing.Size(589, 385);
this.splitContainer1.SplitterDistance = 176;
this.splitContainer1.TabIndex = 1;
this.splitContainer1.SplitterMoved += new System.Windows.Forms.SplitterEventHandler(this.splitContainer1_SplitterMoved);
//
// treeView1
//