mirror of
https://github.com/Gericom/EveryFileExplorer.git
synced 2025-06-19 09:25:42 -04:00

- Commented out useless bone weight related stuff that causes exceptions with some models - Fixed the RGB/RGBA bug (fixed attributes) - Added support for fixed tex1 and tex2 coords
182 lines
4.8 KiB
C#
182 lines
4.8 KiB
C#
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 NDS.NitroSystem.G3D;
|
|
|
|
namespace NDS.UI
|
|
{
|
|
public partial class MDL0Viewer : UserControl
|
|
{
|
|
MDL0.Model Model;
|
|
public MDL0Viewer(MDL0.Model Model)
|
|
{
|
|
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) * Model.info.posScale / 8f; }
|
|
else { dist += ((float)e.Delta / 100) * Model.info.posScale / 8f; }
|
|
Render();
|
|
}
|
|
|
|
bool init = false;
|
|
|
|
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);
|
|
|
|
init = true;
|
|
Render();
|
|
}
|
|
|
|
public void Render()
|
|
{
|
|
if (!init) return;
|
|
float aspect = (float)simpleOpenGlControl1.Width / (float)simpleOpenGlControl1.Height;
|
|
Gl.glMatrixMode(Gl.GL_PROJECTION);
|
|
Gl.glLoadIdentity();
|
|
Gl.glViewport(0, 0, simpleOpenGlControl1.Width, simpleOpenGlControl1.Height);
|
|
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()
|
|
{
|
|
Model.ProcessSbc();
|
|
}
|
|
|
|
bool wire = false;
|
|
bool licht = true;
|
|
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
|
|
{
|
|
switch (keyData & Keys.KeyCode)
|
|
{
|
|
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 -= 0.05f * Model.info.posScale / 2;//(((Control.ModifierKeys & Keys.Shift) != 0) ? 100f : 1f);
|
|
Render();
|
|
return true;
|
|
case Keys.X:
|
|
X += 0.05f * Model.info.posScale / 2;//* (((Control.ModifierKeys & Keys.Shift) != 0) ? 100f : 1f);
|
|
Render();
|
|
return true;
|
|
case Keys.A:
|
|
Y -= 0.05f * Model.info.posScale / 2;//* (((Control.ModifierKeys & Keys.Shift) != 0) ? 100f : 1f);
|
|
Render();
|
|
return true;
|
|
case Keys.S:
|
|
Y += 0.05f * Model.info.posScale / 2;//* (((Control.ModifierKeys & Keys.Shift) != 0) ? 100f : 1f);
|
|
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 * Model.info.posScale / 8f;
|
|
else dist += 1.2f * Model.info.posScale / 8f;
|
|
Render();
|
|
return true;
|
|
case Keys.Oemplus:
|
|
case Keys.Oemplus | Keys.Shift:
|
|
if ((Control.ModifierKeys & Keys.Shift) == Keys.Shift) dist -= 12f * Model.info.posScale / 8f;
|
|
else dist -= 1.2f * Model.info.posScale / 8f;
|
|
Render();
|
|
return true;
|
|
default:
|
|
return base.ProcessCmdKey(ref msg, keyData);
|
|
}
|
|
}
|
|
}
|
|
}
|