Support for multiple sections in CGFX
@ -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" />
|
||||
|
@ -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()
|
||||
|
@ -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;
|
||||
|
@ -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
@ -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>
|
||||
|
@ -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
After Width: | Height: | Size: 654 B |
BIN
3DS/Resources/films.png
Normal file
After Width: | Height: | Size: 664 B |
BIN
3DS/Resources/images-stack.png
Normal file
After Width: | Height: | Size: 602 B |
BIN
3DS/Resources/jar.png
Normal file
After Width: | Height: | Size: 805 B |
BIN
3DS/Resources/light-bulb.png
Normal file
After Width: | Height: | Size: 743 B |
BIN
3DS/Resources/lighthouse-shine.png
Normal file
After Width: | Height: | Size: 1.7 KiB |
BIN
3DS/Resources/point.png
Normal file
After Width: | Height: | Size: 832 B |
BIN
3DS/Resources/table.png
Normal file
After Width: | Height: | Size: 563 B |
BIN
3DS/Resources/tables-stacks.png
Normal file
After Width: | Height: | Size: 574 B |
BIN
3DS/Resources/weather-cloud.png
Normal file
After Width: | Height: | Size: 505 B |
BIN
3DS/Resources/weather-clouds.png
Normal file
After Width: | Height: | Size: 737 B |
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
109
3DS/UI/CGFXViewer.designer.cs
generated
@ -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;
|
||||
}
|
||||
}
|
@ -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
@ -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
@ -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
@ -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
@ -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
@ -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
@ -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>
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
1
NDS/UI/NSBMDViewer.designer.cs
generated
@ -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
|
||||
//
|
||||
|