mirror of
https://github.com/Gericom/EveryFileExplorer.git
synced 2025-06-18 17:05:33 -04:00
241 lines
7.4 KiB
C#
241 lines
7.4 KiB
C#
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.LYT;
|
|
using Tao.OpenGl;
|
|
using LibEveryFileExplorer.Files;
|
|
using System.Drawing.Imaging;
|
|
using NintendoWare.LYT;
|
|
using System.Runtime.InteropServices;
|
|
using LibEveryFileExplorer;
|
|
|
|
namespace _3DS.UI
|
|
{
|
|
public partial class CLYTViewer : Form
|
|
{
|
|
bool init = false;
|
|
CLYT NWLayout;
|
|
CLIM[] Textures;
|
|
BasicShader BShader = new BasicShader();
|
|
ImageList ImageL;
|
|
|
|
public CLYTViewer(CLYT Layout)
|
|
{
|
|
this.NWLayout = Layout;
|
|
InitializeComponent();
|
|
Win32Util.SetWindowTheme(treeView1.Handle, "explorer", null);
|
|
Win32Util.SetWindowTheme(treeView2.Handle, "explorer", null);
|
|
}
|
|
|
|
private void CLYTViewer_Load(object sender, EventArgs e)
|
|
{
|
|
simpleOpenGlControl1.InitializeContexts();
|
|
simpleOpenGlControl1.Width = (int)NWLayout.Layout.LayoutSize.X;
|
|
simpleOpenGlControl1.Height = (int)NWLayout.Layout.LayoutSize.Y;
|
|
Gl.ReloadFunctions();
|
|
Gl.glEnable(Gl.GL_COLOR_MATERIAL);
|
|
Gl.glDisable(Gl.GL_DEPTH_TEST);
|
|
//Gl.glDepthFunc(Gl.GL_ALWAYS);
|
|
Gl.glEnable(Gl.GL_LOGIC_OP);
|
|
Gl.glDisable(Gl.GL_CULL_FACE);
|
|
Gl.glEnable(Gl.GL_TEXTURE_2D);
|
|
|
|
//Gl.glEnable(Gl.GL_LINE_SMOOTH);
|
|
Gl.glEnable(Gl.GL_BLEND);
|
|
|
|
Gl.glBlendFunc(Gl.GL_SRC_ALPHA, Gl.GL_ONE_MINUS_SRC_ALPHA);
|
|
|
|
if (NWLayout.TextureList != null)
|
|
{
|
|
int i = 0;
|
|
Textures = new CLIM[NWLayout.TextureList.NrTextures];
|
|
foreach (String s in NWLayout.TextureList.TextureNames)
|
|
{
|
|
byte[] data = data = ((ViewableFile)Tag).File.FindFileRelative("../timg/" + s);
|
|
if (data == null) data = ((ViewableFile)Tag).File.FindFileRelative(s);
|
|
if (data != null) Textures[i] = new CLIM(data);
|
|
i++;
|
|
}
|
|
}
|
|
if (NWLayout.Materials != null)
|
|
{
|
|
int i = 0;
|
|
foreach (var v in NWLayout.Materials.Materials)
|
|
{
|
|
int j = 0;
|
|
foreach (var t in v.TexMaps)
|
|
{
|
|
if (Textures[t.TexIndex] != null) UploadTex(t, Textures[t.TexIndex], i * 4 + j + 1);
|
|
j++;
|
|
}
|
|
v.SetupShader();
|
|
i++;
|
|
}
|
|
}
|
|
BShader.Compile(false);
|
|
|
|
ImageL = new ImageList();
|
|
ImageL.ColorDepth = ColorDepth.Depth32Bit;
|
|
ImageL.ImageSize = new System.Drawing.Size(16, 16);
|
|
ImageL.Images.Add("pan1", Resource.zone16);
|
|
ImageL.Images.Add("pic1", Resource.image16);
|
|
ImageL.Images.Add("wnd1", Resource.slide);
|
|
ImageL.Images.Add("txt1", Resource.edit);
|
|
ImageL.Images.Add("grp1", Resource.zones_stack);
|
|
treeView1.ImageList = ImageL;
|
|
treeView2.ImageList = ImageL;
|
|
|
|
treeView1.BeginUpdate();
|
|
treeView1.Nodes.Clear();
|
|
treeView1.Nodes.Add(NWLayout.RootPane.GetTreeNodes());
|
|
treeView1.EndUpdate();
|
|
|
|
treeView2.BeginUpdate();
|
|
treeView2.Nodes.Clear();
|
|
treeView2.Nodes.Add(NWLayout.RootGroup.GetTreeNodes());
|
|
treeView2.EndUpdate();
|
|
|
|
init = true;
|
|
Render();
|
|
}
|
|
|
|
private void UploadTex(mat1.MaterialEntry.TexMap TexMap, CLIM Texture, int Id)
|
|
{
|
|
Gl.glBindTexture(Gl.GL_TEXTURE_2D, Id);
|
|
Gl.glColor3f(1, 1, 1);
|
|
Bitmap b = Texture.ToBitmap();
|
|
//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);
|
|
|
|
Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, (TexMap.MagFilter == mat1.MaterialEntry.TexMap.FilterMode.Linear) ? Gl.GL_LINEAR : Gl.GL_NEAREST);
|
|
Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MIN_FILTER, (TexMap.MinFilter == mat1.MaterialEntry.TexMap.FilterMode.Linear) ? Gl.GL_LINEAR : Gl.GL_NEAREST);
|
|
|
|
switch (TexMap.WrapS)
|
|
{
|
|
case mat1.MaterialEntry.TexMap.WrapMode.Clamp:
|
|
Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_S, Gl.GL_CLAMP_TO_EDGE);
|
|
break;
|
|
case mat1.MaterialEntry.TexMap.WrapMode.Repeat:
|
|
Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_S, Gl.GL_REPEAT);
|
|
break;
|
|
case mat1.MaterialEntry.TexMap.WrapMode.Mirror:
|
|
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 (TexMap.WrapT)
|
|
{
|
|
case mat1.MaterialEntry.TexMap.WrapMode.Clamp:
|
|
Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_T, Gl.GL_CLAMP_TO_EDGE);
|
|
break;
|
|
case mat1.MaterialEntry.TexMap.WrapMode.Repeat:
|
|
Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_T, Gl.GL_REPEAT);
|
|
break;
|
|
case mat1.MaterialEntry.TexMap.WrapMode.Mirror:
|
|
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;
|
|
}
|
|
}
|
|
|
|
public void Render()
|
|
{
|
|
if (!init) return;
|
|
Gl.glMatrixMode(Gl.GL_PROJECTION);
|
|
Gl.glLoadIdentity();
|
|
Gl.glViewport(0, 0, simpleOpenGlControl1.Width, simpleOpenGlControl1.Height);
|
|
|
|
Gl.glOrtho(-NWLayout.Layout.LayoutSize.X / 2.0f, NWLayout.Layout.LayoutSize.X / 2.0f, -NWLayout.Layout.LayoutSize.Y / 2.0f, NWLayout.Layout.LayoutSize.Y / 2.0f, -1000, 1000);
|
|
//Glu.gluPerspective(90, aspect, 0.02f, 1000.0f);//0.02f, 32.0f);
|
|
//Gl.glTranslatef(0, 0, -100);
|
|
|
|
|
|
Gl.glMatrixMode(Gl.GL_MODELVIEW);
|
|
Gl.glLoadIdentity();
|
|
|
|
/*if (!picking)*/
|
|
Gl.glClearColor(1, 1, 1, 1);//BGColor.R / 255f, BGColor.G / 255f, BGColor.B / 255f, 1f);
|
|
//else Gl.glClearColor(0, 0, 0, 1);
|
|
Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
|
|
|
|
Gl.glColor4f(1, 1, 1, 1);
|
|
Gl.glEnable(Gl.GL_TEXTURE_2D);
|
|
Gl.glBindTexture(Gl.GL_TEXTURE_2D, 0);
|
|
Gl.glColor4f(1, 1, 1, 1);
|
|
Gl.glDisable(Gl.GL_CULL_FACE);
|
|
Gl.glEnable(Gl.GL_ALPHA_TEST);
|
|
Gl.glEnable(Gl.GL_BLEND);
|
|
Gl.glBlendFunc(Gl.GL_SRC_ALPHA, Gl.GL_ONE_MINUS_SRC_ALPHA);
|
|
|
|
Gl.glAlphaFunc(Gl.GL_ALWAYS, 0f);
|
|
|
|
Gl.glLoadIdentity();
|
|
|
|
|
|
//if (!picking)
|
|
{
|
|
Gl.glBindTexture(Gl.GL_TEXTURE_2D, 0);
|
|
BShader.Enable();
|
|
Gl.glBindTexture(Gl.GL_TEXTURE_2D, 0);
|
|
Gl.glColor4f(204 / 255f, 204 / 255f, 204 / 255f, 1);
|
|
int xbase = 0;
|
|
for (int y = 0; y < simpleOpenGlControl1.Height; y += 8)
|
|
{
|
|
for (int x = xbase; x < simpleOpenGlControl1.Width; x += 16)
|
|
{
|
|
Gl.glRectf(x - simpleOpenGlControl1.Width / 2f, y - simpleOpenGlControl1.Height / 2f, x - simpleOpenGlControl1.Width / 2f + 8, y - simpleOpenGlControl1.Height / 2f + 8);
|
|
}
|
|
if (xbase == 0) xbase = 8;
|
|
else xbase = 0;
|
|
}
|
|
}
|
|
/*if (picking)
|
|
{
|
|
BasicShaderb.Enable();
|
|
int idx = 0;
|
|
Layout.PAN1.Render(Layout, ref idx, 255, picking);
|
|
pic = new byte[4];
|
|
Bitmap b = IO.Util.ScreenShot(simpleOpenGlControl1);
|
|
Gl.glReadPixels(MousePoint.X, (int)simpleOpenGlControl1.Height - MousePoint.Y, 1, 1, Gl.GL_BGRA, Gl.GL_UNSIGNED_BYTE, pic);
|
|
Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
|
|
Render();
|
|
//simpleOpenGlControl1.Refresh();
|
|
//Render();
|
|
}
|
|
else
|
|
{*/
|
|
NWLayout.RootPane.Render(NWLayout, Textures, 255);
|
|
simpleOpenGlControl1.Refresh();
|
|
//}
|
|
}
|
|
|
|
private void CLYTViewer_Layout(object sender, LayoutEventArgs e)
|
|
{
|
|
Render();
|
|
}
|
|
|
|
private void CLYTViewer_Resize(object sender, EventArgs e)
|
|
{
|
|
Render();
|
|
Render();
|
|
}
|
|
|
|
private void CLYTViewer_Activated(object sender, EventArgs e)
|
|
{
|
|
for (int i = 0; i < 8; i++) Render();
|
|
}
|
|
}
|
|
}
|