mirror of
https://github.com/KillzXGaming/Switch-Toolbox
synced 2024-11-22 04:23:09 +00:00
Alot of additions.
General - Always allow multiple instances of the tool by default. (UseSingleInstance in config.XML) - Yaz0 now uses a new library using c code. This improves compression times and is comparable to wzst's yaz0 compressor. Thanks to AboodXD for helping port the code. - Add flat buffer templates for gfbmdl and gfbanm. - Redid UV editor. Now using new 2D engine with some improvements. Should work better with mutliple file formats than just bfres. - Auto compress bfres with .sbfres extension. BFLYT: -Add animation reference list to panes if they have any animations. - Note the animation editor in it is not functional yet. GFBMDL - Progress on model importing. Currently crashes on many tests so saving is currently disabled till i figure out why. - Add new texture map display with UV coordinates shown. Displays how transforms are handled. - Add option to export materials and models entirely as .json files. DAE - improve bone/joint check.
This commit is contained in:
parent
f979f73162
commit
e4722ed1af
82 changed files with 6775 additions and 3005 deletions
|
@ -816,18 +816,6 @@ namespace Bfres.Structs
|
|||
ImportedMaterials = seModel.materials;
|
||||
ImportedSkeleton = seModel.skeleton;
|
||||
}
|
||||
else if (Runtime.DEVELOPER_DEBUG_MODE)
|
||||
{
|
||||
DAE daeFile = new DAE();
|
||||
bool IsLoaded = daeFile.LoadFile(FileName);
|
||||
|
||||
if (!IsLoaded)
|
||||
return;
|
||||
|
||||
ImportedObjects = daeFile.objects;
|
||||
ImportedMaterials = daeFile.materials;
|
||||
ImportedSkeleton = daeFile.skeleton;
|
||||
}
|
||||
else
|
||||
{
|
||||
AssimpData assimp = new AssimpData();
|
||||
|
|
|
@ -738,6 +738,8 @@ namespace Bfres.Structs
|
|||
public float MaxLod;
|
||||
public float BiasLod;
|
||||
|
||||
|
||||
|
||||
public override STGenericTexture GetTexture()
|
||||
{
|
||||
foreach (var bntx in PluginRuntime.bntxContainers)
|
||||
|
|
|
@ -695,10 +695,21 @@ namespace FirstPlugin
|
|||
int VertexCount = (int)Slice.Size / StrideSize;
|
||||
|
||||
VertexAttribute.VertexData = new Syroot.Maths.Vector4F[VertexCount];
|
||||
for (int v = 0; v < VertexCount; v++)
|
||||
if (VertexAttribute.Mode == SepdVertexAttribMode.ARRAY)
|
||||
{
|
||||
VertexAttribute.VertexData[v] = ReadVertexBufferData(reader, VertexAttribute, elementCount);
|
||||
for (int v = 0; v < VertexCount; v++) {
|
||||
VertexAttribute.VertexData[v] = ReadVertexBufferData(reader, VertexAttribute, elementCount);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
VertexAttribute.VertexData[0] = new Syroot.Maths.Vector4F(
|
||||
VertexAttribute.Constants[0],
|
||||
VertexAttribute.Constants[1],
|
||||
VertexAttribute.Constants[2],
|
||||
VertexAttribute.Constants[3]);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private static Syroot.Maths.Vector4F ReadVertexBufferData(FileReader reader, SepdVertexAttribute VertexAttribute, int elementCount)
|
||||
|
|
|
@ -821,6 +821,11 @@ namespace LayoutBXLYT
|
|||
return (int[])data;
|
||||
}
|
||||
|
||||
public byte[] GetBytes()
|
||||
{
|
||||
return (byte[])data;
|
||||
}
|
||||
|
||||
public void SetValue(string value)
|
||||
{
|
||||
data = value;
|
||||
|
@ -839,14 +844,123 @@ namespace LayoutBXLYT
|
|||
Type = UserDataType.Int;
|
||||
}
|
||||
|
||||
public void SetValue(List<UserDataStruct> value)
|
||||
{
|
||||
data = value;
|
||||
Type = UserDataType.StructData;
|
||||
}
|
||||
|
||||
public List<UserDataStruct> GetStructs()
|
||||
{
|
||||
return (List<UserDataStruct>)data;
|
||||
}
|
||||
|
||||
internal long _pos;
|
||||
}
|
||||
|
||||
public class UserDataStruct
|
||||
{
|
||||
public ushort Unknown { get; set; } // 0
|
||||
|
||||
public List<UserDataStructEntry> Entries = new List<UserDataStructEntry>();
|
||||
|
||||
public UserDataStruct(FileReader reader, BxlytHeader header)
|
||||
{
|
||||
long pos = reader.Position;
|
||||
|
||||
ushort unknown = reader.ReadUInt16();
|
||||
ushort numEntries = reader.ReadUInt16();
|
||||
uint[] offsets = reader.ReadUInt32s(numEntries);
|
||||
|
||||
|
||||
for (int i = 0; i < numEntries; i++)
|
||||
{
|
||||
reader.SeekBegin(pos + offsets[i]);
|
||||
Entries.Add(new UserDataStructEntry(reader, header));
|
||||
}
|
||||
}
|
||||
|
||||
public void Write(FileWriter writer, LayoutHeader header)
|
||||
{
|
||||
long pos = writer.Position;
|
||||
|
||||
writer.Write(Unknown);
|
||||
writer.Write((ushort)Entries.Count);
|
||||
|
||||
long _ofsPos = writer.Position;
|
||||
//Fill empty spaces for offsets later
|
||||
writer.Write(new uint[Entries.Count]);
|
||||
|
||||
for (int i = 0; i < Entries.Count; i++)
|
||||
{
|
||||
writer.WriteUint32Offset(_ofsPos + (i * 4), pos);
|
||||
Entries[i].Write(writer, header);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public class UserDataStructEntry
|
||||
{
|
||||
public uint DataType { get; set; }
|
||||
|
||||
public List<object> Data { get; set; }
|
||||
|
||||
public UserDataStructEntry(FileReader reader, BxlytHeader header)
|
||||
{
|
||||
long pos = reader.Position;
|
||||
|
||||
DataType = reader.ReadUInt32();
|
||||
uint numEntries = reader.ReadUInt32();
|
||||
uint[] offsets = reader.ReadUInt32s((int)numEntries);
|
||||
|
||||
Console.WriteLine($"USD1 Struct DataType " + DataType);
|
||||
|
||||
Data = new List<object>();
|
||||
for (int i = 0; i < numEntries; i++)
|
||||
{
|
||||
reader.SeekBegin(pos + offsets[i]);
|
||||
switch (DataType)
|
||||
{
|
||||
case 0:
|
||||
Data.Add(reader.ReadZeroTerminatedString());
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void Write(FileWriter writer, LayoutHeader header)
|
||||
{
|
||||
long pos = writer.Position;
|
||||
|
||||
writer.Write(DataType);
|
||||
writer.Write(Data.Count);
|
||||
|
||||
long _ofsPos = writer.Position;
|
||||
//Fill empty spaces for offsets later
|
||||
writer.Write(new uint[Data.Count]);
|
||||
|
||||
for (int i = 0; i < Data.Count; i++)
|
||||
{
|
||||
writer.WriteUint32Offset(_ofsPos + (i * 4), pos);
|
||||
switch (DataType)
|
||||
{
|
||||
case 0:
|
||||
writer.WriteString((string)Data[i]);
|
||||
break;
|
||||
}
|
||||
|
||||
if (i == Data.Count - 1)
|
||||
writer.Align(64);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public enum UserDataType : byte
|
||||
{
|
||||
String,
|
||||
Int,
|
||||
Float,
|
||||
StructData,
|
||||
}
|
||||
|
||||
public enum AnimationTarget : byte
|
||||
|
@ -1379,6 +1493,53 @@ namespace LayoutBXLYT
|
|||
public BxlanPAT1 AnimationTag;
|
||||
public BxlanPAI1 AnimationInfo;
|
||||
|
||||
public static bool ContainsEntry(byte[] bxlanFile, string[] EntryNames)
|
||||
{
|
||||
using (var reader = new FileReader(new System.IO.MemoryStream(bxlanFile)))
|
||||
{
|
||||
reader.SetByteOrder(true);
|
||||
|
||||
reader.ReadUInt32(); //magic
|
||||
ushort byteOrderMark = reader.ReadUInt16();
|
||||
reader.CheckByteOrderMark(byteOrderMark);
|
||||
ushort HeaderSize = reader.ReadUInt16();
|
||||
uint Version = reader.ReadUInt32();
|
||||
uint FileSize = reader.ReadUInt32();
|
||||
ushort sectionCount = reader.ReadUInt16();
|
||||
reader.ReadUInt16(); //Padding
|
||||
|
||||
reader.SeekBegin(HeaderSize);
|
||||
for (int i = 0; i < sectionCount; i++)
|
||||
{
|
||||
long pos = reader.Position;
|
||||
string Signature = reader.ReadString(4, Encoding.ASCII);
|
||||
uint SectionSize = reader.ReadUInt32();
|
||||
if (Signature == "pai1")
|
||||
{
|
||||
reader.ReadUInt16(); //FrameSize
|
||||
reader.ReadBoolean(); //Loop
|
||||
reader.ReadByte(); //padding
|
||||
var numTextures = reader.ReadUInt16();
|
||||
var numEntries = reader.ReadUInt16();
|
||||
var entryOffsetTbl = reader.ReadUInt32();
|
||||
|
||||
reader.SeekBegin(pos + entryOffsetTbl);
|
||||
var entryOffsets = reader.ReadUInt32s(numEntries);
|
||||
for (int e = 0; e < numEntries; e++)
|
||||
{
|
||||
reader.SeekBegin(pos + entryOffsets[e]);
|
||||
string name = reader.ReadString(28, true);
|
||||
if (EntryNames.Contains(name))
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
reader.SeekBegin(pos + SectionSize);
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public BxlanPaiEntry TryGetTag(string name)
|
||||
{
|
||||
for (int i = 0; i < AnimationInfo.Entries?.Count; i++)
|
||||
|
@ -1389,6 +1550,15 @@ namespace LayoutBXLYT
|
|||
return null;
|
||||
}
|
||||
|
||||
public bool ContainsEntry(string name)
|
||||
{
|
||||
for (int i = 0; i < AnimationInfo.Entries?.Count; i++) {
|
||||
if (AnimationInfo.Entries[i].Name == name)
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public virtual void Read(FileReader reader, BXLAN header)
|
||||
{
|
||||
|
||||
|
|
|
@ -1,195 +0,0 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using Toolbox;
|
||||
using System.Windows.Forms;
|
||||
using Toolbox.Library;
|
||||
using Toolbox.Library.IO;
|
||||
using Toolbox.Library.Forms;
|
||||
using Toolbox.Library.Rendering;
|
||||
using OpenTK;
|
||||
using FirstPlugin.Forms;
|
||||
|
||||
namespace FirstPlugin
|
||||
{
|
||||
public class GFBMDL : TreeNodeFile, IContextMenuNode, IFileFormat
|
||||
{
|
||||
public FileType FileType { get; set; } = FileType.Model;
|
||||
|
||||
public bool CanSave { get; set; }
|
||||
public string[] Description { get; set; } = new string[] { "Graphic Model" };
|
||||
public string[] Extension { get; set; } = new string[] { "*.gfbmdl" };
|
||||
public string FileName { get; set; }
|
||||
public string FilePath { get; set; }
|
||||
public IFileInfo IFileInfo { get; set; }
|
||||
|
||||
public bool Identify(System.IO.Stream stream)
|
||||
{
|
||||
using (var reader = new Toolbox.Library.IO.FileReader(stream, true))
|
||||
{
|
||||
reader.ByteOrder = Syroot.BinaryData.ByteOrder.BigEndian;
|
||||
|
||||
bool IsMatch = reader.ReadUInt32() == 0x20000000;
|
||||
reader.Position = 0;
|
||||
|
||||
return IsMatch;
|
||||
}
|
||||
}
|
||||
|
||||
public Type[] Types
|
||||
{
|
||||
get
|
||||
{
|
||||
List<Type> types = new List<Type>();
|
||||
return types.ToArray();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
bool DrawablesLoaded = false;
|
||||
public override void OnClick(TreeView treeView) {
|
||||
LoadEditor<STPropertyGrid>();
|
||||
}
|
||||
|
||||
public T LoadEditor<T>() where T : UserControl, new()
|
||||
{
|
||||
T control = new T();
|
||||
control.Dock = DockStyle.Fill;
|
||||
|
||||
ViewportEditor editor = (ViewportEditor)LibraryGUI.GetActiveContent(typeof(ViewportEditor));
|
||||
if (editor == null)
|
||||
{
|
||||
editor = new ViewportEditor(true);
|
||||
editor.Dock = DockStyle.Fill;
|
||||
LibraryGUI.LoadEditor(editor);
|
||||
}
|
||||
if (!DrawablesLoaded)
|
||||
{
|
||||
ObjectEditor.AddContainer(DrawableContainer);
|
||||
DrawablesLoaded = true;
|
||||
}
|
||||
if (Runtime.UseOpenGL)
|
||||
editor.LoadViewport(DrawableContainer);
|
||||
|
||||
editor.LoadEditor(control);
|
||||
|
||||
return control;
|
||||
}
|
||||
|
||||
public GFBMDL_Render Renderer;
|
||||
|
||||
public DrawableContainer DrawableContainer = new DrawableContainer();
|
||||
|
||||
public GFLXModel Model;
|
||||
|
||||
public void Load(System.IO.Stream stream)
|
||||
{
|
||||
CanSave = false;
|
||||
|
||||
Text = FileName;
|
||||
DrawableContainer.Name = FileName;
|
||||
Renderer = new GFBMDL_Render();
|
||||
DrawableContainer.Drawables.Add(Renderer);
|
||||
|
||||
Model = new GFLXModel();
|
||||
Model.LoadFile(FlatBuffers.Gfbmdl.Model.GetRootAsModel(
|
||||
new FlatBuffers.ByteBuffer(stream.ToBytes())),this, Renderer);
|
||||
|
||||
TreeNode SkeletonWrapper = new TreeNode("Skeleton");
|
||||
TreeNode MaterialFolderWrapper = new TreeNode("Materials");
|
||||
TreeNode VisualGroupWrapper = new TreeNode("Visual Groups");
|
||||
TreeNode Textures = new TreeNode("Textures");
|
||||
|
||||
if (Model.Skeleton.bones.Count > 0)
|
||||
{
|
||||
Nodes.Add(SkeletonWrapper);
|
||||
DrawableContainer.Drawables.Add(Model.Skeleton);
|
||||
|
||||
foreach (var bone in Model.Skeleton.bones) {
|
||||
if (bone.Parent == null)
|
||||
SkeletonWrapper.Nodes.Add(bone);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
List<string> loadedTextures = new List<string>();
|
||||
for (int i = 0; i < Model.Textures.Count; i++)
|
||||
{
|
||||
foreach (var bntx in PluginRuntime.bntxContainers)
|
||||
{
|
||||
if (bntx.Textures.ContainsKey(Model.Textures[i]) &&
|
||||
!loadedTextures.Contains(Model.Textures[i]))
|
||||
{
|
||||
TreeNode tex = new TreeNode(Model.Textures[i]);
|
||||
tex.ImageKey = "texture";
|
||||
tex.SelectedImageKey = "texture";
|
||||
|
||||
tex.Tag = bntx.Textures[Model.Textures[i]];
|
||||
Textures.Nodes.Add(tex);
|
||||
loadedTextures.Add(Model.Textures[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
loadedTextures.Clear();
|
||||
|
||||
Nodes.Add(MaterialFolderWrapper);
|
||||
Nodes.Add(VisualGroupWrapper);
|
||||
if (Textures.Nodes.Count > 0)
|
||||
Nodes.Add(Textures);
|
||||
|
||||
for (int i = 0; i < Model.GenericMaterials.Count; i++)
|
||||
MaterialFolderWrapper.Nodes.Add(Model.GenericMaterials[i]);
|
||||
|
||||
for (int i = 0; i < Model.GenericMeshes.Count; i++)
|
||||
VisualGroupWrapper.Nodes.Add(Model.GenericMeshes[i]);
|
||||
}
|
||||
|
||||
public void Save(System.IO.Stream stream)
|
||||
{
|
||||
Model.SaveFile(stream);
|
||||
}
|
||||
|
||||
public ToolStripItem[] GetContextMenuItems()
|
||||
{
|
||||
List<ToolStripItem> Items = new List<ToolStripItem>();
|
||||
Items.Add(new ToolStripMenuItem("Export Model", null, ExportAction, Keys.Control | Keys.E));
|
||||
return Items.ToArray();
|
||||
}
|
||||
|
||||
private void ExportAction(object sender, EventArgs args)
|
||||
{
|
||||
SaveFileDialog sfd = new SaveFileDialog();
|
||||
sfd.Filter = "Supported Formats|*.dae;";
|
||||
if (sfd.ShowDialog() == DialogResult.OK)
|
||||
{
|
||||
ExportModelSettings exportDlg = new ExportModelSettings();
|
||||
if (exportDlg.ShowDialog() == DialogResult.OK)
|
||||
ExportModel(sfd.FileName, exportDlg.Settings);
|
||||
}
|
||||
}
|
||||
|
||||
public void ExportModel(string fileName, DAE.ExportSettings settings)
|
||||
{
|
||||
var model = new STGenericModel();
|
||||
model.Materials = Model.GenericMaterials;
|
||||
model.Objects = Model.GenericMeshes;
|
||||
var textures = new List<STGenericTexture>();
|
||||
foreach (var bntx in PluginRuntime.bntxContainers)
|
||||
foreach (var tex in bntx.Textures.Values)
|
||||
{
|
||||
if (Model.Textures.Contains(tex.Text))
|
||||
textures.Add(tex);
|
||||
}
|
||||
|
||||
DAE.Export(fileName, settings, model, textures, Model.Skeleton);
|
||||
}
|
||||
|
||||
public void Unload()
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,333 +0,0 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Forms;
|
||||
using FlatBuffers.Gfbmdl;
|
||||
using Toolbox.Library;
|
||||
using Toolbox.Library.IO;
|
||||
using Toolbox.Library.Rendering;
|
||||
using FirstPlugin.Forms;
|
||||
|
||||
namespace FirstPlugin
|
||||
{
|
||||
public class GFLXModel
|
||||
{
|
||||
public GFBMDL ParentFile;
|
||||
|
||||
public List<GFLXMaterialData> GenericMaterials = new List<GFLXMaterialData>();
|
||||
public List<GFLXMesh> GenericMeshes = new List<GFLXMesh>();
|
||||
|
||||
public STSkeleton Skeleton = new STSkeleton();
|
||||
|
||||
public Model Model;
|
||||
|
||||
public List<string> Textures = new List<string>();
|
||||
public List<string> Shaders = new List<string>();
|
||||
|
||||
public T LoadEditor<T>() where T :
|
||||
System.Windows.Forms.UserControl, new()
|
||||
{
|
||||
return ParentFile.LoadEditor<T>();
|
||||
}
|
||||
|
||||
public void UpdateVertexData(bool updateViewport) {
|
||||
ParentFile.Renderer.UpdateVertexData();
|
||||
|
||||
if (updateViewport)
|
||||
LibraryGUI.UpdateViewport();
|
||||
}
|
||||
|
||||
public void LoadFile(Model model, GFBMDL file, GFBMDL_Render Renderer) {
|
||||
Model = model;
|
||||
ParentFile = file;
|
||||
|
||||
for (int t = 0; t < Model.TextureNamesLength; t++)
|
||||
Textures.Add(Model.TextureNames(t));
|
||||
|
||||
for (int s = 0; s < Model.ShaderNamesLength; s++)
|
||||
Shaders.Add(Model.ShaderNames(s));
|
||||
|
||||
for (int m = 0; m < Model.MaterialsLength; m++) {
|
||||
var mat = Model.Materials(m).Value;
|
||||
GenericMaterials.Add(new GFLXMaterialData(this, mat));
|
||||
}
|
||||
|
||||
List<int> SkinningIndices = new List<int>();
|
||||
|
||||
for (int b = 0; b < Model.BonesLength; b++) {
|
||||
var bone = Model.Bones(b).Value;
|
||||
Skeleton.bones.Add(new GFLXBone(this, bone));
|
||||
|
||||
if (bone.SkinCheck == null)
|
||||
SkinningIndices.Add(b);
|
||||
}
|
||||
|
||||
Skeleton.reset();
|
||||
Skeleton.update();
|
||||
|
||||
for (int g = 0; g < Model.GroupsLength; g++) {
|
||||
var group = Model.Groups(g).Value;
|
||||
var mesh = Model.Meshes(g).Value;
|
||||
|
||||
OpenTK.Matrix4 transform = OpenTK.Matrix4.Identity;
|
||||
|
||||
GFLXMesh genericMesh = new GFLXMesh(this, group, mesh);
|
||||
genericMesh.Checked = true;
|
||||
genericMesh.ImageKey = "model";
|
||||
genericMesh.SelectedImageKey = "model";
|
||||
|
||||
int boneIndex = (int)group.BoneID;
|
||||
if (boneIndex < Skeleton.bones.Count && boneIndex > 0)
|
||||
{
|
||||
genericMesh.BoneIndex = boneIndex;
|
||||
transform = Skeleton.bones[boneIndex].Transform;
|
||||
|
||||
genericMesh.Text = Skeleton.bones[boneIndex].Text;
|
||||
}
|
||||
|
||||
// if (group.MeshID < Skeleton.bones.Count && group.MeshID > 0)
|
||||
// genericMesh.Text = Skeleton.bones[(int)group.MeshID].Text;
|
||||
|
||||
Renderer.Meshes.Add(genericMesh);
|
||||
GenericMeshes.Add(genericMesh);
|
||||
|
||||
//Load the vertex data
|
||||
genericMesh.vertices = GFLXMeshBufferHelper.LoadVertexData(mesh, transform, SkinningIndices);
|
||||
genericMesh.FlipUvsVertical();
|
||||
|
||||
//Load faces
|
||||
for (int p = 0; p < mesh.PolygonsLength; p++)
|
||||
{
|
||||
var poly = mesh.Polygons(p).Value;
|
||||
|
||||
var polygonGroup = new STGenericPolygonGroup();
|
||||
polygonGroup.MaterialIndex = (int)poly.MaterialID;
|
||||
genericMesh.PolygonGroups.Add(polygonGroup);
|
||||
|
||||
for (int f = 0; f < poly.DataLength; f++)
|
||||
polygonGroup.faces.Add((int)poly.Data(f));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public void SaveFile(System.IO.Stream stream)
|
||||
{
|
||||
using (var writer = new FileWriter(stream)) {
|
||||
writer.Write(Model.ByteBuffer.ToFullArray());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public class GFLXMaterialData : STGenericMaterial
|
||||
{
|
||||
private Material Material;
|
||||
private GFLXModel ParentModel;
|
||||
|
||||
public Dictionary<string, GFLXSwitchParam> SwitchParams = new Dictionary<string, GFLXSwitchParam>();
|
||||
public Dictionary<string, GFLXValueParam> ValueParams = new Dictionary<string, GFLXValueParam>();
|
||||
public Dictionary<string, GFLXColorParam> ColorParams = new Dictionary<string, GFLXColorParam>();
|
||||
|
||||
public override void OnClick(TreeView treeView) {
|
||||
var editor = ParentModel.LoadEditor<GFLXMaterialEditor>();
|
||||
editor.LoadMaterial(this);
|
||||
}
|
||||
|
||||
public GFLXMaterialData(GFLXModel parent, Material mat)
|
||||
{
|
||||
ParentModel = parent;
|
||||
Material = mat;
|
||||
|
||||
Text = mat.Name;
|
||||
|
||||
for (int i = 0; i < Material.SwitchesLength; i++) {
|
||||
var val = Material.Switches(i).Value;
|
||||
SwitchParams.Add(val.Name, new GFLXSwitchParam(val));
|
||||
}
|
||||
|
||||
for (int i = 0; i < Material.ValuesLength; i++) {
|
||||
var val = Material.Values(i).Value;
|
||||
ValueParams.Add(val.Name, new GFLXValueParam(val));
|
||||
}
|
||||
|
||||
for (int i = 0; i < Material.ColorsLength; i++) {
|
||||
var val = Material.Colors(i).Value;
|
||||
ColorParams.Add(val.Name, new GFLXColorParam(val));
|
||||
}
|
||||
|
||||
int textureUnit = 1;
|
||||
for (int t = 0; t < Material.TexturesLength; t++)
|
||||
{
|
||||
var tex = Material.Textures(t).Value;
|
||||
string name = ParentModel.Textures[tex.Index];
|
||||
|
||||
STGenericMatTexture matTexture = new STGenericMatTexture();
|
||||
matTexture.Name = name;
|
||||
matTexture.SamplerName = tex.Name;
|
||||
matTexture.textureUnit = textureUnit++;
|
||||
matTexture.WrapModeS = STTextureWrapMode.Mirror;
|
||||
matTexture.WrapModeT = STTextureWrapMode.Repeat;
|
||||
TextureMaps.Add(matTexture);
|
||||
|
||||
switch (tex.Name)
|
||||
{
|
||||
case "Col0Tex":
|
||||
matTexture.Type = STGenericMatTexture.TextureType.Diffuse;
|
||||
break;
|
||||
case "EmissionMaskTex":
|
||||
// matTexture.Type = STGenericMatTexture.TextureType.Emission;
|
||||
break;
|
||||
case "LyCol0Tex":
|
||||
break;
|
||||
case "NormalMapTex":
|
||||
matTexture.WrapModeT = STTextureWrapMode.Repeat;
|
||||
matTexture.WrapModeT = STTextureWrapMode.Repeat;
|
||||
matTexture.Type = STGenericMatTexture.TextureType.Normal;
|
||||
break;
|
||||
case "AmbientTex":
|
||||
break;
|
||||
case "LightTblTex":
|
||||
break;
|
||||
case "SphereMapTex":
|
||||
break;
|
||||
case "EffectTex":
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public class GFLXBone : STBone
|
||||
{
|
||||
private Bone Bone;
|
||||
private GFLXModel ParentModel;
|
||||
|
||||
public GFLXBone(GFLXModel parent, Bone bone) : base(parent.Skeleton)
|
||||
{
|
||||
ParentModel = parent;
|
||||
Bone = bone;
|
||||
|
||||
Text = bone.Name;
|
||||
parentIndex = bone.Parent;
|
||||
|
||||
if (bone.Translation != null)
|
||||
{
|
||||
position = new float[3]
|
||||
{ bone.Translation.Value.X,
|
||||
bone.Translation.Value.Y,
|
||||
bone.Translation.Value.Z
|
||||
};
|
||||
}
|
||||
|
||||
if (bone.Rotation != null)
|
||||
{
|
||||
rotation = new float[4]
|
||||
{ bone.Rotation.Value.X,
|
||||
bone.Rotation.Value.Y,
|
||||
bone.Rotation.Value.Z,
|
||||
1.0f,
|
||||
};
|
||||
}
|
||||
|
||||
if (bone.Scale != null)
|
||||
{
|
||||
scale = new float[3]
|
||||
{ bone.Scale.Value.X,
|
||||
bone.Scale.Value.Y,
|
||||
bone.Scale.Value.Z
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public class GFLXColorParam
|
||||
{
|
||||
private MatColor Param;
|
||||
|
||||
public GFLXColorParam(MatColor param)
|
||||
{
|
||||
Param = param;
|
||||
}
|
||||
|
||||
public string Name
|
||||
{
|
||||
get { return Param.Name; }
|
||||
set
|
||||
{
|
||||
Param.ByteBuffer.PutStringUTF8(0, value);
|
||||
}
|
||||
}
|
||||
|
||||
public OpenTK.Vector3 Value
|
||||
{
|
||||
get { return new OpenTK.Vector3(
|
||||
Param.Color.Value.R,
|
||||
Param.Color.Value.G,
|
||||
Param.Color.Value.B);
|
||||
}
|
||||
set
|
||||
{
|
||||
var vec3 = value;
|
||||
|
||||
Param.Color.Value.ByteBuffer.PutFloat(0, vec3.X);
|
||||
Param.Color.Value.ByteBuffer.PutFloat(1, vec3.Y);
|
||||
Param.Color.Value.ByteBuffer.PutFloat(2, vec3.Z);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public class GFLXValueParam
|
||||
{
|
||||
private MatFloat Param;
|
||||
|
||||
public GFLXValueParam(MatFloat param) {
|
||||
Param = param;
|
||||
}
|
||||
|
||||
public string Name
|
||||
{
|
||||
get { return Param.Name; }
|
||||
set {
|
||||
Param.ByteBuffer.PutStringUTF8(0, value);
|
||||
}
|
||||
}
|
||||
|
||||
public float Value
|
||||
{
|
||||
get { return Param.Value; }
|
||||
set {
|
||||
Param.ByteBuffer.PutFloat(1, value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public class GFLXSwitchParam
|
||||
{
|
||||
private MatSwitch Param;
|
||||
|
||||
public GFLXSwitchParam(MatSwitch param)
|
||||
{
|
||||
Param = param;
|
||||
}
|
||||
|
||||
public string Name
|
||||
{
|
||||
get { return Param.Name; }
|
||||
set
|
||||
{
|
||||
Param.ByteBuffer.PutStringUTF8(0, value);
|
||||
}
|
||||
}
|
||||
|
||||
public bool Value
|
||||
{
|
||||
get { return Param.Value; }
|
||||
set
|
||||
{
|
||||
Param.ByteBuffer.PutByte(1, value ? (byte)1 : (byte)0);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,39 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using FlatBuffers.Gfbmdl;
|
||||
using FlatBuffers;
|
||||
|
||||
namespace FirstPlugin
|
||||
{
|
||||
public class FlatBufferHelper
|
||||
{
|
||||
public static StringOffset[] CreateStringList(FlatBufferBuilder builder, List<string> strings)
|
||||
{
|
||||
StringOffset[] offsets = new StringOffset[strings.Count];
|
||||
for (int i = 0; i < strings.Count; i++)
|
||||
offsets[i] = builder.CreateString(strings[i]);
|
||||
return offsets;
|
||||
}
|
||||
|
||||
public static Offset<Vector3> CreateVector(
|
||||
FlatBufferBuilder builder, Vector3? vector)
|
||||
{
|
||||
return Vector3.CreateVector3(builder,
|
||||
vector.Value.X,
|
||||
vector.Value.Y,
|
||||
vector.Value.Z);
|
||||
}
|
||||
|
||||
public static Offset<Vector3> CreateVector(
|
||||
FlatBufferBuilder builder, Vector3 vector)
|
||||
{
|
||||
return Vector3.CreateVector3(builder,
|
||||
vector.X,
|
||||
vector.Y,
|
||||
vector.Z);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -12,10 +12,11 @@ using System.Reflection;
|
|||
using Toolbox.Library.IO.FlatBuffer;
|
||||
using Toolbox.Library.Animations;
|
||||
using FirstPlugin.Forms;
|
||||
using Toolbox.Library.Forms;
|
||||
|
||||
namespace FirstPlugin
|
||||
{
|
||||
public class GFBANM : TreeNodeFile, IFileFormat, IAnimationContainer
|
||||
public class GFBANM : TreeNodeFile, IFileFormat, IAnimationContainer, IConvertableTextFormat
|
||||
{
|
||||
public STAnimation AnimationController => AnimationData;
|
||||
|
||||
|
@ -44,6 +45,30 @@ namespace FirstPlugin
|
|||
}
|
||||
}
|
||||
|
||||
#region Text Converter Interface
|
||||
public TextFileType TextFileType => TextFileType.Json;
|
||||
public bool CanConvertBack => false;
|
||||
|
||||
public string ConvertToString()
|
||||
{
|
||||
if (IFileInfo.ArchiveParent != null)
|
||||
{
|
||||
foreach (var file in IFileInfo.ArchiveParent.Files)
|
||||
if (file.FileName == FileName)
|
||||
return FlatBufferConverter.DeserializeToJson(new System.IO.MemoryStream(file.FileData), "gfbanm");
|
||||
}
|
||||
else
|
||||
return FlatBufferConverter.DeserializeToJson(FilePath, "gfbanm");
|
||||
|
||||
return "";
|
||||
}
|
||||
|
||||
public void ConvertFromString(string text)
|
||||
{
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
public Type[] Types
|
||||
{
|
||||
get
|
||||
|
@ -90,8 +115,31 @@ namespace FirstPlugin
|
|||
{
|
||||
}
|
||||
|
||||
public class MeshAnimationController
|
||||
{
|
||||
public bool IsVisible = true;
|
||||
}
|
||||
|
||||
public class Animation : STSkeletonAnimation
|
||||
{
|
||||
private GFBMDL ActiveModel
|
||||
{
|
||||
get
|
||||
{
|
||||
GFBMDL model = null;
|
||||
foreach (var container in ObjectEditor.GetDrawableContainers()) {
|
||||
if (container.ContainerState == ContainerState.Active) {
|
||||
foreach (var drawable in container.Drawables)
|
||||
{
|
||||
if (drawable is GFBMDL_Render)
|
||||
model = ((GFBMDL_Render)drawable).GfbmdlFile;
|
||||
}
|
||||
}
|
||||
}
|
||||
return model;
|
||||
}
|
||||
}
|
||||
|
||||
public override void NextFrame()
|
||||
{
|
||||
if (Frame > FrameCount) return;
|
||||
|
@ -105,6 +153,26 @@ namespace FirstPlugin
|
|||
bool Updated = false; // no need to update skeleton of animations that didn't change
|
||||
foreach (var animGroup in AnimGroups)
|
||||
{
|
||||
if (animGroup is VisibiltyGroup && ActiveModel != null)
|
||||
{
|
||||
var node = animGroup as VisibiltyGroup;
|
||||
foreach (var mesh in ActiveModel.Model.GenericMeshes) {
|
||||
if (animGroup.Name == mesh.Text)
|
||||
{
|
||||
var value = node.BooleanTrack.GetFrameValue(Frame);
|
||||
mesh.AnimationController.IsVisible = value == 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (animGroup is MaterialGroup && ActiveModel != null)
|
||||
{
|
||||
foreach (var mat in ActiveModel.Model.GenericMaterials) {
|
||||
if (animGroup.Name == mat.Text)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
if (animGroup is BoneGroup)
|
||||
{
|
||||
var node = animGroup as BoneGroup;
|
||||
|
@ -134,17 +202,22 @@ namespace FirstPlugin
|
|||
|
||||
if (node.RotationX.HasKeys || node.RotationY.HasKeys || node.RotationZ.HasKeys)
|
||||
{
|
||||
float x = node.RotationX.HasKeys ? node.RotationX.GetFrameValue(Frame) : b.rotation[0];
|
||||
float y = node.RotationY.HasKeys ? node.RotationY.GetFrameValue(Frame) : b.rotation[1];
|
||||
float z = node.RotationZ.HasKeys ? node.RotationZ.GetFrameValue(Frame) : b.rotation[2];
|
||||
ushort value1 = (ushort)node.RotationX.GetFrameValue(Frame);
|
||||
ushort value2 = (ushort)node.RotationY.GetFrameValue(Frame);
|
||||
ushort value3 = (ushort)node.RotationZ.GetFrameValue(Frame);
|
||||
|
||||
var Rotation = new Vector3(x / 0xffff, y/ 0xffff, z / 0xffff).Normalized();
|
||||
b.rot = EulerToQuat(Rotation.Z, Rotation.Y, Rotation.X);
|
||||
int x = value1 >> 5;
|
||||
int y = value2 >> 5;
|
||||
int z = value3 >> 5;
|
||||
|
||||
var Rotation = new Vector3(x / (float)0xff, y/ (float)0xff, z / (float)0xff);
|
||||
// b.rot = EulerToQuat(Rotation.Z, Rotation.Y, Rotation.X);
|
||||
|
||||
// Console.WriteLine($"{animGroup.Name} {Frame} {Rotation}");
|
||||
|
||||
// b.rot = EulerToQuat(Rotation.Z, Rotation.Y, Rotation.X);
|
||||
|
||||
float Angle = Rotation.Length;
|
||||
Console.WriteLine($"{node.Name} Angle {Angle}");
|
||||
|
||||
// b.rot = Angle > 0
|
||||
// ? Quaternion.FromAxisAngle(Vector3.Normalize(Rotation), Angle)
|
||||
|
@ -168,7 +241,7 @@ namespace FirstPlugin
|
|||
Quaternion xRotation = Quaternion.FromAxisAngle(Vector3.UnitX, x);
|
||||
Quaternion yRotation = Quaternion.FromAxisAngle(Vector3.UnitY, y);
|
||||
Quaternion zRotation = Quaternion.FromAxisAngle(Vector3.UnitZ, z);
|
||||
return (zRotation * yRotation * xRotation);
|
||||
return (zRotation * yRotation * xRotation);
|
||||
}
|
||||
|
||||
public void LoadBoneGroup(Gfbanim.Bone boneAnim)
|
||||
|
@ -193,7 +266,7 @@ namespace FirstPlugin
|
|||
var rotate = boneAnim.Rotate<Gfbanim.DynamicQuatTrack>();
|
||||
if (rotate.HasValue)
|
||||
{
|
||||
var values = LoadRotationTrack(rotate.Value);
|
||||
var values = GfbanimKeyFrameLoader.LoadRotationTrack(rotate.Value);
|
||||
groupAnim.RotationX = values[0];
|
||||
groupAnim.RotationY = values[1];
|
||||
groupAnim.RotationZ = values[2];
|
||||
|
@ -206,9 +279,9 @@ namespace FirstPlugin
|
|||
if (rotate.HasValue)
|
||||
{
|
||||
var vec = rotate.Value.Value.Value;
|
||||
groupAnim.RotationX.KeyFrames.Add(new STKeyFrame(0, ConvertRotation(vec.X)));
|
||||
groupAnim.RotationY.KeyFrames.Add(new STKeyFrame(0, ConvertRotation(vec.Y)));
|
||||
groupAnim.RotationZ.KeyFrames.Add(new STKeyFrame(0, ConvertRotation(vec.Z)));
|
||||
groupAnim.RotationX.KeyFrames.Add(new STKeyFrame(0, GfbanimKeyFrameLoader.ConvertRotation(vec.X)));
|
||||
groupAnim.RotationY.KeyFrames.Add(new STKeyFrame(0, GfbanimKeyFrameLoader.ConvertRotation(vec.Y)));
|
||||
groupAnim.RotationZ.KeyFrames.Add(new STKeyFrame(0, GfbanimKeyFrameLoader.ConvertRotation(vec.Z)));
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
@ -217,7 +290,7 @@ namespace FirstPlugin
|
|||
var rotate = boneAnim.Rotate<Gfbanim.FramedQuatTrack>();
|
||||
if (rotate.HasValue)
|
||||
{
|
||||
var values = LoadRotationTrack(rotate.Value);
|
||||
var values = GfbanimKeyFrameLoader.LoadRotationTrack(rotate.Value);
|
||||
groupAnim.RotationX = values[0];
|
||||
groupAnim.RotationY = values[1];
|
||||
groupAnim.RotationZ = values[2];
|
||||
|
@ -247,7 +320,7 @@ namespace FirstPlugin
|
|||
var scale = boneAnim.Scale<Gfbanim.DynamicVectorTrack>();
|
||||
if (scale.HasValue)
|
||||
{
|
||||
var values = LoadVectorTrack(scale.Value);
|
||||
var values = GfbanimKeyFrameLoader.LoadVectorTrack(scale.Value);
|
||||
groupAnim.ScaleX = values[0];
|
||||
groupAnim.ScaleY = values[1];
|
||||
groupAnim.ScaleZ = values[2];
|
||||
|
@ -259,7 +332,7 @@ namespace FirstPlugin
|
|||
var scale = boneAnim.Scale<Gfbanim.FramedVectorTrack>();
|
||||
if (scale.HasValue)
|
||||
{
|
||||
var values = LoadVectorTrack(scale.Value);
|
||||
var values = GfbanimKeyFrameLoader.LoadVectorTrack(scale.Value);
|
||||
groupAnim.ScaleX = values[0];
|
||||
groupAnim.ScaleY = values[1];
|
||||
groupAnim.ScaleZ = values[2];
|
||||
|
@ -286,7 +359,7 @@ namespace FirstPlugin
|
|||
var trans = boneAnim.Translate<Gfbanim.DynamicVectorTrack>();
|
||||
if (trans.HasValue)
|
||||
{
|
||||
var values = LoadVectorTrack(trans.Value);
|
||||
var values = GfbanimKeyFrameLoader.LoadVectorTrack(trans.Value);
|
||||
groupAnim.TranslateX = values[0];
|
||||
groupAnim.TranslateY = values[1];
|
||||
groupAnim.TranslateZ = values[2];
|
||||
|
@ -298,7 +371,7 @@ namespace FirstPlugin
|
|||
var trans = boneAnim.Translate<Gfbanim.FramedVectorTrack>();
|
||||
if (trans.HasValue)
|
||||
{
|
||||
var values = LoadVectorTrack(trans.Value);
|
||||
var values = GfbanimKeyFrameLoader.LoadVectorTrack(trans.Value);
|
||||
groupAnim.TranslateX = values[0];
|
||||
groupAnim.TranslateY = values[1];
|
||||
groupAnim.TranslateZ = values[2];
|
||||
|
@ -320,101 +393,53 @@ namespace FirstPlugin
|
|||
}
|
||||
}
|
||||
|
||||
public float ConvertRotation(ushort val)
|
||||
{
|
||||
return val;
|
||||
}
|
||||
|
||||
public STAnimationTrack[] LoadRotationTrack(Gfbanim.DynamicQuatTrack dynamicTrack)
|
||||
{
|
||||
STAnimationTrack[] tracks = new STAnimationTrack[3];
|
||||
tracks[0] = new STAnimationTrack(STInterpoaltionType.Linear);
|
||||
tracks[1] = new STAnimationTrack(STInterpoaltionType.Linear);
|
||||
tracks[2] = new STAnimationTrack(STInterpoaltionType.Linear);
|
||||
|
||||
for (int i = 0; i < dynamicTrack.ValuesLength; i++)
|
||||
{
|
||||
var quat = dynamicTrack.Values(i).Value;
|
||||
tracks[0].KeyFrames.Add(new STKeyFrame(i, ConvertRotation(quat.X)));
|
||||
tracks[1].KeyFrames.Add(new STKeyFrame(i, ConvertRotation(quat.Y)));
|
||||
tracks[2].KeyFrames.Add(new STKeyFrame(i, ConvertRotation(quat.Z)));
|
||||
|
||||
Console.WriteLine($"{i} { ConvertRotation(quat.X)} { ConvertRotation(quat.Y)} {ConvertRotation(quat.Z)}");
|
||||
}
|
||||
return tracks;
|
||||
}
|
||||
|
||||
public STAnimationTrack[] LoadVectorTrack(Gfbanim.DynamicVectorTrack dynamicTrack)
|
||||
{
|
||||
STAnimationTrack[] tracks = new STAnimationTrack[3];
|
||||
tracks[0] = new STAnimationTrack(STInterpoaltionType.Linear);
|
||||
tracks[1] = new STAnimationTrack(STInterpoaltionType.Linear);
|
||||
tracks[2] = new STAnimationTrack(STInterpoaltionType.Linear);
|
||||
|
||||
for (int i = 0; i < dynamicTrack.ValuesLength; i++)
|
||||
{
|
||||
var vec = dynamicTrack.Values(i).Value;
|
||||
tracks[0].KeyFrames.Add(new STKeyFrame(i, vec.X));
|
||||
tracks[1].KeyFrames.Add(new STKeyFrame(i, vec.Y));
|
||||
tracks[2].KeyFrames.Add(new STKeyFrame(i, vec.Z));
|
||||
}
|
||||
return tracks;
|
||||
}
|
||||
|
||||
public STAnimationTrack[] LoadVectorTrack(Gfbanim.FramedVectorTrack framedTrack)
|
||||
{
|
||||
ushort[] frames = framedTrack.GetFramesArray();
|
||||
|
||||
STAnimationTrack[] tracks = new STAnimationTrack[3];
|
||||
tracks[0] = new STAnimationTrack(STInterpoaltionType.Linear);
|
||||
tracks[1] = new STAnimationTrack(STInterpoaltionType.Linear);
|
||||
tracks[2] = new STAnimationTrack(STInterpoaltionType.Linear);
|
||||
|
||||
for (int i = 0; i < framedTrack.ValuesLength; i++)
|
||||
{
|
||||
var vec = framedTrack.Values(i).Value;
|
||||
int frame = i;
|
||||
|
||||
if (i < frames?.Length) frame = frames[i];
|
||||
|
||||
tracks[0].KeyFrames.Add(new STKeyFrame(frame, vec.X));
|
||||
tracks[1].KeyFrames.Add(new STKeyFrame(frame, vec.Y));
|
||||
tracks[2].KeyFrames.Add(new STKeyFrame(frame, vec.Z));
|
||||
}
|
||||
return tracks;
|
||||
}
|
||||
|
||||
public STAnimationTrack[] LoadRotationTrack(Gfbanim.FramedQuatTrack framedTrack)
|
||||
{
|
||||
ushort[] frames = framedTrack.GetFramesArray();
|
||||
|
||||
STAnimationTrack[] tracks = new STAnimationTrack[3];
|
||||
tracks[0] = new STAnimationTrack(STInterpoaltionType.Linear);
|
||||
tracks[1] = new STAnimationTrack(STInterpoaltionType.Linear);
|
||||
tracks[2] = new STAnimationTrack(STInterpoaltionType.Linear);
|
||||
|
||||
for (int i = 0; i < framedTrack.ValuesLength; i++)
|
||||
{
|
||||
var quat = framedTrack.Values(i).Value;
|
||||
int frame = i;
|
||||
|
||||
if (i < frames?.Length) frame = frames[i];
|
||||
|
||||
tracks[0].KeyFrames.Add(new STKeyFrame(frame, ConvertRotation(quat.X)));
|
||||
tracks[1].KeyFrames.Add(new STKeyFrame(frame, ConvertRotation(quat.Y)));
|
||||
tracks[2].KeyFrames.Add(new STKeyFrame(frame, ConvertRotation(quat.Z)));
|
||||
}
|
||||
return tracks;
|
||||
}
|
||||
|
||||
public void LoadMaterialGroup(Gfbanim.Material matAnim)
|
||||
{
|
||||
for (int i = 0; i < matAnim.SwitchesLength; i++)
|
||||
{
|
||||
var switchTrack = matAnim.Switches(i).Value;
|
||||
|
||||
}
|
||||
for (int i = 0; i < matAnim.ValuesLength; i++)
|
||||
{
|
||||
var valueTrack = matAnim.Values(i).Value;
|
||||
|
||||
}
|
||||
for (int i = 0; i < matAnim.VectorsLength; i++)
|
||||
{
|
||||
var vectorTrack = matAnim.Vectors(i).Value;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
public void LoadVisibilyGroup(Gfbanim.Group visAnim)
|
||||
{
|
||||
VisibiltyGroup groupAnim = new VisibiltyGroup();
|
||||
groupAnim.Name = visAnim.Name;
|
||||
AnimGroups.Add(groupAnim);
|
||||
|
||||
if (visAnim.ValueType == Gfbanim.BooleanTrack.FixedBooleanTrack) {
|
||||
var track = visAnim.Value<Gfbanim.FixedBooleanTrack>();
|
||||
if (track.HasValue)
|
||||
{
|
||||
var animTrack = new STAnimationTrack();
|
||||
animTrack.KeyFrames.Add(new STKeyFrame(0, track.Value.Value));
|
||||
groupAnim.BooleanTrack = animTrack;
|
||||
}
|
||||
}
|
||||
else if (visAnim.ValueType == Gfbanim.BooleanTrack.DynamicBooleanTrack) {
|
||||
var track = visAnim.Value<Gfbanim.DynamicBooleanTrack>();
|
||||
if (track.HasValue) {
|
||||
groupAnim.BooleanTrack = GfbanimKeyFrameLoader.LoadBooleanTrack(track.Value);
|
||||
}
|
||||
}
|
||||
else if(visAnim.ValueType == Gfbanim.BooleanTrack.FramedBooleanTrack) {
|
||||
var track = visAnim.Value<Gfbanim.FramedBooleanTrack>();
|
||||
if (track.HasValue)
|
||||
{
|
||||
groupAnim.BooleanTrack = GfbanimKeyFrameLoader.LoadBooleanTrack(track.Value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void LoadTriggerGroup(Gfbanim.Trigger triggerAnim)
|
|
@ -0,0 +1,129 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using Toolbox.Library.Animations;
|
||||
|
||||
namespace FirstPlugin
|
||||
{
|
||||
public class GfbanimKeyFrameLoader
|
||||
{
|
||||
public static STAnimationTrack[] LoadRotationTrack(Gfbanim.DynamicQuatTrack dynamicTrack)
|
||||
{
|
||||
STAnimationTrack[] tracks = new STAnimationTrack[3];
|
||||
tracks[0] = new STAnimationTrack(STInterpoaltionType.Linear);
|
||||
tracks[1] = new STAnimationTrack(STInterpoaltionType.Linear);
|
||||
tracks[2] = new STAnimationTrack(STInterpoaltionType.Linear);
|
||||
|
||||
for (int i = 0; i < dynamicTrack.ValuesLength; i++)
|
||||
{
|
||||
var quat = dynamicTrack.Values(i).Value;
|
||||
tracks[0].KeyFrames.Add(new STKeyFrame(i, ConvertRotation(quat.X)));
|
||||
tracks[1].KeyFrames.Add(new STKeyFrame(i, ConvertRotation(quat.Y)));
|
||||
tracks[2].KeyFrames.Add(new STKeyFrame(i, ConvertRotation(quat.Z)));
|
||||
}
|
||||
return tracks;
|
||||
}
|
||||
|
||||
public static float ConvertRotation(ushort val)
|
||||
{
|
||||
return val;
|
||||
}
|
||||
|
||||
public static STAnimationTrack[] LoadVectorTrack(Gfbanim.DynamicVectorTrack dynamicTrack)
|
||||
{
|
||||
STAnimationTrack[] tracks = new STAnimationTrack[3];
|
||||
tracks[0] = new STAnimationTrack(STInterpoaltionType.Linear);
|
||||
tracks[1] = new STAnimationTrack(STInterpoaltionType.Linear);
|
||||
tracks[2] = new STAnimationTrack(STInterpoaltionType.Linear);
|
||||
|
||||
for (int i = 0; i < dynamicTrack.ValuesLength; i++)
|
||||
{
|
||||
var vec = dynamicTrack.Values(i).Value;
|
||||
tracks[0].KeyFrames.Add(new STKeyFrame(i, vec.X));
|
||||
tracks[1].KeyFrames.Add(new STKeyFrame(i, vec.Y));
|
||||
tracks[2].KeyFrames.Add(new STKeyFrame(i, vec.Z));
|
||||
}
|
||||
return tracks;
|
||||
}
|
||||
|
||||
public static STAnimationTrack[] LoadVectorTrack(Gfbanim.FramedVectorTrack framedTrack)
|
||||
{
|
||||
ushort[] frames = framedTrack.GetFramesArray();
|
||||
|
||||
STAnimationTrack[] tracks = new STAnimationTrack[3];
|
||||
tracks[0] = new STAnimationTrack(STInterpoaltionType.Linear);
|
||||
tracks[1] = new STAnimationTrack(STInterpoaltionType.Linear);
|
||||
tracks[2] = new STAnimationTrack(STInterpoaltionType.Linear);
|
||||
|
||||
for (int i = 0; i < framedTrack.ValuesLength; i++)
|
||||
{
|
||||
var vec = framedTrack.Values(i).Value;
|
||||
int frame = i;
|
||||
|
||||
if (i < frames?.Length) frame = frames[i];
|
||||
|
||||
tracks[0].KeyFrames.Add(new STKeyFrame(frame, vec.X));
|
||||
tracks[1].KeyFrames.Add(new STKeyFrame(frame, vec.Y));
|
||||
tracks[2].KeyFrames.Add(new STKeyFrame(frame, vec.Z));
|
||||
}
|
||||
return tracks;
|
||||
}
|
||||
|
||||
public static STAnimationTrack LoadBooleanTrack(Gfbanim.DynamicBooleanTrack framedTrack)
|
||||
{
|
||||
STAnimationTrack track = new STAnimationTrack(STInterpoaltionType.Step);
|
||||
for (int i = 0; i < framedTrack.ValuesLength; i++)
|
||||
{
|
||||
ushort val = framedTrack.Values(i);
|
||||
int frame = i;
|
||||
|
||||
//Visibily is handled by bits from a ushort
|
||||
track.KeyFrames.Add(new STKeyFrame(frame, val));
|
||||
}
|
||||
return track;
|
||||
}
|
||||
|
||||
public static STAnimationTrack LoadBooleanTrack(Gfbanim.FramedBooleanTrack framedTrack)
|
||||
{
|
||||
ushort[] frames = framedTrack.GetFramesArray();
|
||||
|
||||
STAnimationTrack track = new STAnimationTrack(STInterpoaltionType.Step);
|
||||
for (int i = 0; i < framedTrack.ValuesLength; i++)
|
||||
{
|
||||
ushort val = framedTrack.Values(i);
|
||||
int frame = i;
|
||||
|
||||
if (i < frames?.Length) frame = frames[i];
|
||||
|
||||
//Visibily is handled by bits from a ushort
|
||||
track.KeyFrames.Add(new STKeyFrame(frame, val));
|
||||
}
|
||||
return track;
|
||||
}
|
||||
|
||||
public static STAnimationTrack[] LoadRotationTrack(Gfbanim.FramedQuatTrack framedTrack)
|
||||
{
|
||||
ushort[] frames = framedTrack.GetFramesArray();
|
||||
|
||||
STAnimationTrack[] tracks = new STAnimationTrack[3];
|
||||
tracks[0] = new STAnimationTrack(STInterpoaltionType.Linear);
|
||||
tracks[1] = new STAnimationTrack(STInterpoaltionType.Linear);
|
||||
tracks[2] = new STAnimationTrack(STInterpoaltionType.Linear);
|
||||
|
||||
for (int i = 0; i < framedTrack.ValuesLength; i++)
|
||||
{
|
||||
var quat = framedTrack.Values(i).Value;
|
||||
int frame = i;
|
||||
|
||||
if (i < frames?.Length) frame = frames[i];
|
||||
|
||||
tracks[0].KeyFrames.Add(new STKeyFrame(frame, ConvertRotation(quat.X)));
|
||||
tracks[1].KeyFrames.Add(new STKeyFrame(frame, ConvertRotation(quat.Y)));
|
||||
tracks[2].KeyFrames.Add(new STKeyFrame(frame, ConvertRotation(quat.Z)));
|
||||
}
|
||||
return tracks;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,312 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using FirstPlugin.GFMDLStructs;
|
||||
using Toolbox.Library.IO;
|
||||
|
||||
namespace FirstPlugin
|
||||
{
|
||||
public class BufferToStruct
|
||||
{
|
||||
public static Model LoadFile(System.IO.Stream stream)
|
||||
{
|
||||
var buffer = FlatBuffers.Gfbmdl.Model.GetRootAsModel(
|
||||
new FlatBuffers.ByteBuffer(stream.ToBytes()));
|
||||
|
||||
Model model = new Model();
|
||||
model.Version = buffer.Version;
|
||||
model.Bounding = ConvertBounding(buffer.Bounding);
|
||||
|
||||
model.TextureNames = new List<string>();
|
||||
model.ShaderNames = new List<string>();
|
||||
model.MaterialNames = new List<string>();
|
||||
|
||||
for (int i = 0; i < buffer.TextureNamesLength; i++)
|
||||
model.TextureNames.Add(buffer.TextureNames(i));
|
||||
|
||||
for (int i = 0; i < buffer.ShaderNamesLength; i++)
|
||||
model.ShaderNames.Add(buffer.ShaderNames(i));
|
||||
|
||||
for (int i = 0; i < buffer.MaterialNamesLength; i++)
|
||||
model.MaterialNames.Add(buffer.MaterialNames(i));
|
||||
|
||||
model.Materials = new List<Material>();
|
||||
for (int i = 0; i < buffer.MaterialsLength; i++)
|
||||
{
|
||||
var mat = buffer.Materials(i).Value;
|
||||
List<MatColor> colors = new List<MatColor>();
|
||||
List<MatSwitch> switches = new List<MatSwitch>();
|
||||
List<MatFloat> values = new List<MatFloat>();
|
||||
List<TextureMap> textures = new List<TextureMap>();
|
||||
|
||||
MaterialCommon common = null;
|
||||
if (mat.Common != null)
|
||||
{
|
||||
var com = mat.Common.Value;
|
||||
|
||||
List<MatColor> sharedColors = new List<MatColor>();
|
||||
List<MatSwitch> sharedSwitches = new List<MatSwitch>();
|
||||
List<MatInt> sharedValues = new List<MatInt>();
|
||||
|
||||
for (int j = 0; j < com.ColorsLength; j++)
|
||||
{
|
||||
var col = com.Colors(j).Value;
|
||||
sharedColors.Add(new MatColor()
|
||||
{
|
||||
Color = ConvertColor(col.Color),
|
||||
Name = col.Name,
|
||||
});
|
||||
}
|
||||
|
||||
for (int j = 0; j < com.ValuesLength; j++)
|
||||
{
|
||||
var val = com.Values(j).Value;
|
||||
sharedValues.Add(new MatInt()
|
||||
{
|
||||
Value = val.Value,
|
||||
Name = val.Name,
|
||||
});
|
||||
}
|
||||
|
||||
for (int j = 0; j < com.SwitchesLength; j++)
|
||||
{
|
||||
var val = com.Switches(j).Value;
|
||||
sharedSwitches.Add(new MatSwitch()
|
||||
{
|
||||
Value = val.Value,
|
||||
Name = val.Name,
|
||||
});
|
||||
}
|
||||
|
||||
common = new MaterialCommon()
|
||||
{
|
||||
Switches = sharedSwitches,
|
||||
Values = sharedValues,
|
||||
Colors = sharedColors,
|
||||
};
|
||||
}
|
||||
|
||||
for (int j = 0; j < mat.TextureMapsLength; j++)
|
||||
{
|
||||
var tex = mat.TextureMaps(j).Value;
|
||||
TextureParams parameters = null;
|
||||
if (tex.Params != null)
|
||||
{
|
||||
var param = tex.Params.Value;
|
||||
parameters = new TextureParams()
|
||||
{
|
||||
Unknown1 = param.Unknown1,
|
||||
Unknown2 = param.Unknown2,
|
||||
Unknown3 = param.Unknown3,
|
||||
Unknown4 = param.Unknown4,
|
||||
Unknown5 = param.Unknown5,
|
||||
Unknown6 = param.Unknown6,
|
||||
Unknown7 = param.Unknown7,
|
||||
Unknown8 = param.Unknown8,
|
||||
lodBias = param.LodBias,
|
||||
};
|
||||
}
|
||||
textures.Add(new TextureMap()
|
||||
{
|
||||
Index = (uint)tex.Index,
|
||||
Sampler = tex.Sampler,
|
||||
Params = parameters,
|
||||
});
|
||||
}
|
||||
|
||||
for (int j = 0; j < mat.ColorsLength; j++)
|
||||
{
|
||||
var col = mat.Colors(j).Value;
|
||||
colors.Add(new MatColor()
|
||||
{
|
||||
Color = ConvertColor(col.Color),
|
||||
Name = col.Name,
|
||||
});
|
||||
}
|
||||
|
||||
for (int j = 0; j < mat.ValuesLength; j++)
|
||||
{
|
||||
var val = mat.Values(j).Value;
|
||||
values.Add(new MatFloat()
|
||||
{
|
||||
Value = val.Value,
|
||||
Name = val.Name,
|
||||
});
|
||||
}
|
||||
|
||||
for (int j = 0; j < mat.SwitchesLength; j++)
|
||||
{
|
||||
var val = mat.Switches(j).Value;
|
||||
switches.Add(new MatSwitch()
|
||||
{
|
||||
Value = val.Value,
|
||||
Name = val.Name,
|
||||
});
|
||||
}
|
||||
|
||||
model.Materials.Add(new Material()
|
||||
{
|
||||
Name = mat.Name,
|
||||
Switches = switches,
|
||||
Colors = colors,
|
||||
Values = values,
|
||||
Parameter1 = mat.Parameter1,
|
||||
Parameter2 = mat.Parameter2,
|
||||
Parameter3 = mat.Parameter3,
|
||||
Parameter4 = mat.Parameter4,
|
||||
Parameter5 = mat.Parameter5,
|
||||
Parameter6 = mat.Parameter6,
|
||||
RenderLayer = mat.RenderLayer,
|
||||
ShaderGroup = mat.ShaderGroup,
|
||||
Unknown1 = mat.Unknown1,
|
||||
Unknown2 = mat.Unknown2,
|
||||
Unknown3 = mat.Unknown3,
|
||||
Unknown4 = mat.Unknown4,
|
||||
Unknown5 = mat.Unknown5,
|
||||
Unknown6 = mat.Unknown6,
|
||||
Unknown7 = mat.Unknown7,
|
||||
Common = common,
|
||||
TextureMaps = textures,
|
||||
});
|
||||
}
|
||||
|
||||
model.Groups = new List<Group>();
|
||||
for (int i = 0; i < buffer.GroupsLength; i++)
|
||||
{
|
||||
var group = buffer.Groups(i).Value;
|
||||
model.Groups.Add(new Group()
|
||||
{
|
||||
BoneIndex = group.BoneIndex,
|
||||
Layer = group.Layer,
|
||||
MeshIndex= group.MeshIndex,
|
||||
Bounding = ConvertBounding(group.Bounding),
|
||||
});
|
||||
}
|
||||
|
||||
model.Meshes = new List<Mesh>();
|
||||
for (int i = 0; i < buffer.MeshesLength; i++)
|
||||
{
|
||||
var mesh = buffer.Meshes(i).Value;
|
||||
|
||||
List<MeshAttribute> attributes = new List<MeshAttribute>();
|
||||
for (int j = 0; j < mesh.AttributesLength; j++)
|
||||
{
|
||||
var att = mesh.Attributes(j).Value;
|
||||
attributes.Add(new MeshAttribute()
|
||||
{
|
||||
BufferFormat = att.BufferFormat,
|
||||
ElementCount = att.ElementCount,
|
||||
VertexType = att.VertexType,
|
||||
});
|
||||
}
|
||||
|
||||
List<MeshPolygon> polygons = new List<MeshPolygon>();
|
||||
for (int j = 0; j < mesh.PolygonsLength; j++)
|
||||
{
|
||||
var poly = mesh.Polygons(j).Value;
|
||||
polygons.Add(new MeshPolygon()
|
||||
{
|
||||
MaterialIndex = poly.MaterialIndex,
|
||||
Faces = poly.GetFacesArray().ToList(),
|
||||
});
|
||||
}
|
||||
|
||||
model.Meshes.Add(new Mesh()
|
||||
{
|
||||
Attributes = attributes,
|
||||
Polygons = polygons,
|
||||
Data = mesh.GetDataArray().ToList(),
|
||||
});
|
||||
}
|
||||
|
||||
model.Bones = new List<Bone>();
|
||||
for (int i = 0; i < buffer.BonesLength; i++)
|
||||
{
|
||||
var bone = buffer.Bones(i).Value;
|
||||
BoneRigidData rigidData = null;
|
||||
if (bone.RigidCheck != null)
|
||||
{
|
||||
rigidData = new BoneRigidData();
|
||||
rigidData.Unknown1 = (uint)bone.RigidCheck.Value.Unknown1;
|
||||
}
|
||||
|
||||
model.Bones.Add(new Bone()
|
||||
{
|
||||
Name = bone.Name,
|
||||
BoneType = bone.BoneType,
|
||||
Parent = bone.Parent,
|
||||
Scale = ConvertVec3(bone.Scale),
|
||||
Rotation = ConvertVec3(bone.Rotation),
|
||||
Translation = ConvertVec3(bone.Translation),
|
||||
RadiusEnd = ConvertVec3(bone.RadiusEnd),
|
||||
RadiusStart = ConvertVec3(bone.RadiusStart),
|
||||
Visible = bone.Visible,
|
||||
Zero = bone.Zero,
|
||||
RigidCheck = rigidData,
|
||||
});
|
||||
}
|
||||
|
||||
model.CollisionGroups = new List<CollisionGroup>();
|
||||
for (int i = 0; i < buffer.CollisionGroupsLength; i++)
|
||||
{
|
||||
var colGroup = buffer.CollisionGroups(i).Value;
|
||||
List<uint> children = colGroup.GetBoneChildrenArray().ToList();
|
||||
|
||||
model.CollisionGroups.Add(new CollisionGroup()
|
||||
{
|
||||
BoneIndex = colGroup.BoneIndex,
|
||||
Unknown1 = colGroup.Unknown1,
|
||||
Bounding = ConvertBounding(colGroup.Bounding),
|
||||
BoneChildren = children,
|
||||
});
|
||||
}
|
||||
|
||||
model.Unknown = new List<UnknownEmpty>();
|
||||
|
||||
return model;
|
||||
}
|
||||
|
||||
public static BoundingBox ConvertBounding(FlatBuffers.Gfbmdl.BoundingBox? buffer)
|
||||
{
|
||||
if (buffer != null && buffer.HasValue)
|
||||
{
|
||||
BoundingBox bounding = new BoundingBox();
|
||||
bounding.MinX = buffer.Value.MinX;
|
||||
bounding.MinY = buffer.Value.MinY;
|
||||
bounding.MinZ = buffer.Value.MinZ;
|
||||
bounding.MaxX = buffer.Value.MaxX;
|
||||
bounding.MaxY = buffer.Value.MaxY;
|
||||
bounding.MaxZ = buffer.Value.MaxZ;
|
||||
return bounding;
|
||||
}
|
||||
else
|
||||
return null;
|
||||
}
|
||||
|
||||
public static Vector3 ConvertVec3(FlatBuffers.Gfbmdl.Vector3? vec3)
|
||||
{
|
||||
if (vec3 != null && vec3.HasValue)
|
||||
return new Vector3(vec3.Value.X, vec3.Value.Y, vec3.Value.Z);
|
||||
else
|
||||
return null;
|
||||
}
|
||||
|
||||
public static Vector4 ConvertVec4(FlatBuffers.Gfbmdl.Vector4? vec3)
|
||||
{
|
||||
if (vec3 != null && vec3.HasValue)
|
||||
return new Vector4(vec3.Value.X, vec3.Value.Y, vec3.Value.Z, vec3.Value.W);
|
||||
else
|
||||
return null;
|
||||
}
|
||||
|
||||
public static ColorRGB32 ConvertColor(FlatBuffers.Gfbmdl.ColorRGB32? col)
|
||||
{
|
||||
if (col != null && col.HasValue)
|
||||
return new ColorRGB32(col.Value.R, col.Value.G, col.Value.B);
|
||||
else
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -4,6 +4,7 @@
|
|||
|
||||
namespace FlatBuffers.Gfbmdl
|
||||
{
|
||||
|
||||
using global::System;
|
||||
using global::FlatBuffers;
|
||||
|
||||
|
@ -66,8 +67,8 @@ namespace FlatBuffers.Gfbmdl
|
|||
public int MeshesLength { get { int o = __p.__offset(20); return o != 0 ? __p.__vector_len(o) : 0; } }
|
||||
public Bone? Bones(int j) { int o = __p.__offset(22); return o != 0 ? (Bone?)(new Bone()).__assign(__p.__indirect(__p.__vector(o) + j * 4), __p.bb) : null; }
|
||||
public int BonesLength { get { int o = __p.__offset(22); return o != 0 ? __p.__vector_len(o) : 0; } }
|
||||
public RenderInfo? RenderData(int j) { int o = __p.__offset(24); return o != 0 ? (RenderInfo?)(new RenderInfo()).__assign(__p.__indirect(__p.__vector(o) + j * 4), __p.bb) : null; }
|
||||
public int RenderDataLength { get { int o = __p.__offset(24); return o != 0 ? __p.__vector_len(o) : 0; } }
|
||||
public CollisionGroup? CollisionGroups(int j) { int o = __p.__offset(24); return o != 0 ? (CollisionGroup?)(new CollisionGroup()).__assign(__p.__indirect(__p.__vector(o) + j * 4), __p.bb) : null; }
|
||||
public int CollisionGroupsLength { get { int o = __p.__offset(24); return o != 0 ? __p.__vector_len(o) : 0; } }
|
||||
|
||||
public static void StartModel(FlatBufferBuilder builder) { builder.StartObject(11); }
|
||||
public static void AddVersion(FlatBufferBuilder builder, uint Version) { builder.AddUint(0, Version, 0); }
|
||||
|
@ -104,10 +105,10 @@ namespace FlatBuffers.Gfbmdl
|
|||
public static VectorOffset CreateBonesVector(FlatBufferBuilder builder, Offset<Bone>[] data) { builder.StartVector(4, data.Length, 4); for (int i = data.Length - 1; i >= 0; i--) builder.AddOffset(data[i].Value); return builder.EndVector(); }
|
||||
public static VectorOffset CreateBonesVectorBlock(FlatBufferBuilder builder, Offset<Bone>[] data) { builder.StartVector(4, data.Length, 4); builder.Add(data); return builder.EndVector(); }
|
||||
public static void StartBonesVector(FlatBufferBuilder builder, int numElems) { builder.StartVector(4, numElems, 4); }
|
||||
public static void AddRenderData(FlatBufferBuilder builder, VectorOffset RenderDataOffset) { builder.AddOffset(10, RenderDataOffset.Value, 0); }
|
||||
public static VectorOffset CreateRenderDataVector(FlatBufferBuilder builder, Offset<RenderInfo>[] data) { builder.StartVector(4, data.Length, 4); for (int i = data.Length - 1; i >= 0; i--) builder.AddOffset(data[i].Value); return builder.EndVector(); }
|
||||
public static VectorOffset CreateRenderDataVectorBlock(FlatBufferBuilder builder, Offset<RenderInfo>[] data) { builder.StartVector(4, data.Length, 4); builder.Add(data); return builder.EndVector(); }
|
||||
public static void StartRenderDataVector(FlatBufferBuilder builder, int numElems) { builder.StartVector(4, numElems, 4); }
|
||||
public static void AddCollisionGroups(FlatBufferBuilder builder, VectorOffset CollisionGroupsOffset) { builder.AddOffset(10, CollisionGroupsOffset.Value, 0); }
|
||||
public static VectorOffset CreateCollisionGroupsVector(FlatBufferBuilder builder, Offset<CollisionGroup>[] data) { builder.StartVector(4, data.Length, 4); for (int i = data.Length - 1; i >= 0; i--) builder.AddOffset(data[i].Value); return builder.EndVector(); }
|
||||
public static VectorOffset CreateCollisionGroupsVectorBlock(FlatBufferBuilder builder, Offset<CollisionGroup>[] data) { builder.StartVector(4, data.Length, 4); builder.Add(data); return builder.EndVector(); }
|
||||
public static void StartCollisionGroupsVector(FlatBufferBuilder builder, int numElems) { builder.StartVector(4, numElems, 4); }
|
||||
public static Offset<Model> EndModel(FlatBufferBuilder builder)
|
||||
{
|
||||
int o = builder.EndObject();
|
||||
|
@ -169,50 +170,50 @@ namespace FlatBuffers.Gfbmdl
|
|||
#endif
|
||||
public byte[] GetShaderGroupArray() { return __p.__vector_as_array<byte>(6); }
|
||||
public int RenderLayer { get { int o = __p.__offset(8); return o != 0 ? __p.bb.GetInt(o + __p.bb_pos) : (int)0; } }
|
||||
public sbyte Unknown1 { get { int o = __p.__offset(10); return o != 0 ? __p.bb.GetSbyte(o + __p.bb_pos) : (sbyte)0; } }
|
||||
public sbyte Unknown2 { get { int o = __p.__offset(12); return o != 0 ? __p.bb.GetSbyte(o + __p.bb_pos) : (sbyte)0; } }
|
||||
public byte Unknown1 { get { int o = __p.__offset(10); return o != 0 ? __p.bb.Get(o + __p.bb_pos) : (byte)0; } }
|
||||
public byte Unknown2 { get { int o = __p.__offset(12); return o != 0 ? __p.bb.Get(o + __p.bb_pos) : (byte)0; } }
|
||||
public int Parameter1 { get { int o = __p.__offset(14); return o != 0 ? __p.bb.GetInt(o + __p.bb_pos) : (int)0; } }
|
||||
public int Parameter2 { get { int o = __p.__offset(16); return o != 0 ? __p.bb.GetInt(o + __p.bb_pos) : (int)0; } }
|
||||
public int Parameter3 { get { int o = __p.__offset(18); return o != 0 ? __p.bb.GetInt(o + __p.bb_pos) : (int)0; } }
|
||||
public int Parameter4 { get { int o = __p.__offset(20); return o != 0 ? __p.bb.GetInt(o + __p.bb_pos) : (int)0; } }
|
||||
public int Parameter5 { get { int o = __p.__offset(22); return o != 0 ? __p.bb.GetInt(o + __p.bb_pos) : (int)0; } }
|
||||
public int Parameter6 { get { int o = __p.__offset(24); return o != 0 ? __p.bb.GetInt(o + __p.bb_pos) : (int)0; } }
|
||||
public TextureMap? Textures(int j) { int o = __p.__offset(26); return o != 0 ? (TextureMap?)(new TextureMap()).__assign(__p.__indirect(__p.__vector(o) + j * 4), __p.bb) : null; }
|
||||
public int TexturesLength { get { int o = __p.__offset(26); return o != 0 ? __p.__vector_len(o) : 0; } }
|
||||
public TextureMap? TextureMaps(int j) { int o = __p.__offset(26); return o != 0 ? (TextureMap?)(new TextureMap()).__assign(__p.__indirect(__p.__vector(o) + j * 4), __p.bb) : null; }
|
||||
public int TextureMapsLength { get { int o = __p.__offset(26); return o != 0 ? __p.__vector_len(o) : 0; } }
|
||||
public MatSwitch? Switches(int j) { int o = __p.__offset(28); return o != 0 ? (MatSwitch?)(new MatSwitch()).__assign(__p.__indirect(__p.__vector(o) + j * 4), __p.bb) : null; }
|
||||
public int SwitchesLength { get { int o = __p.__offset(28); return o != 0 ? __p.__vector_len(o) : 0; } }
|
||||
public MatFloat? Values(int j) { int o = __p.__offset(30); return o != 0 ? (MatFloat?)(new MatFloat()).__assign(__p.__indirect(__p.__vector(o) + j * 4), __p.bb) : null; }
|
||||
public int ValuesLength { get { int o = __p.__offset(30); return o != 0 ? __p.__vector_len(o) : 0; } }
|
||||
public MatColor? Colors(int j) { int o = __p.__offset(32); return o != 0 ? (MatColor?)(new MatColor()).__assign(__p.__indirect(__p.__vector(o) + j * 4), __p.bb) : null; }
|
||||
public int ColorsLength { get { int o = __p.__offset(32); return o != 0 ? __p.__vector_len(o) : 0; } }
|
||||
public sbyte Unknown3 { get { int o = __p.__offset(34); return o != 0 ? __p.bb.GetSbyte(o + __p.bb_pos) : (sbyte)0; } }
|
||||
public sbyte Unknown4 { get { int o = __p.__offset(36); return o != 0 ? __p.bb.GetSbyte(o + __p.bb_pos) : (sbyte)0; } }
|
||||
public sbyte Unknown5 { get { int o = __p.__offset(38); return o != 0 ? __p.bb.GetSbyte(o + __p.bb_pos) : (sbyte)0; } }
|
||||
public sbyte Unknown6 { get { int o = __p.__offset(40); return o != 0 ? __p.bb.GetSbyte(o + __p.bb_pos) : (sbyte)0; } }
|
||||
public sbyte Unknown7 { get { int o = __p.__offset(42); return o != 0 ? __p.bb.GetSbyte(o + __p.bb_pos) : (sbyte)0; } }
|
||||
public byte Unknown3 { get { int o = __p.__offset(34); return o != 0 ? __p.bb.Get(o + __p.bb_pos) : (byte)0; } }
|
||||
public byte Unknown4 { get { int o = __p.__offset(36); return o != 0 ? __p.bb.Get(o + __p.bb_pos) : (byte)0; } }
|
||||
public byte Unknown5 { get { int o = __p.__offset(38); return o != 0 ? __p.bb.Get(o + __p.bb_pos) : (byte)0; } }
|
||||
public byte Unknown6 { get { int o = __p.__offset(40); return o != 0 ? __p.bb.Get(o + __p.bb_pos) : (byte)0; } }
|
||||
public byte Unknown7 { get { int o = __p.__offset(42); return o != 0 ? __p.bb.Get(o + __p.bb_pos) : (byte)0; } }
|
||||
public MaterialCommon? Common { get { int o = __p.__offset(44); return o != 0 ? (MaterialCommon?)(new MaterialCommon()).__assign(__p.__indirect(o + __p.bb_pos), __p.bb) : null; } }
|
||||
|
||||
public static Offset<Material> CreateMaterial(FlatBufferBuilder builder,
|
||||
StringOffset NameOffset = default(StringOffset),
|
||||
StringOffset ShaderGroupOffset = default(StringOffset),
|
||||
int RenderLayer = 0,
|
||||
sbyte Unknown1 = 0,
|
||||
sbyte Unknown2 = 0,
|
||||
byte Unknown1 = 0,
|
||||
byte Unknown2 = 0,
|
||||
int Parameter1 = 0,
|
||||
int Parameter2 = 0,
|
||||
int Parameter3 = 0,
|
||||
int Parameter4 = 0,
|
||||
int Parameter5 = 0,
|
||||
int Parameter6 = 0,
|
||||
VectorOffset TexturesOffset = default(VectorOffset),
|
||||
VectorOffset TextureMapsOffset = default(VectorOffset),
|
||||
VectorOffset SwitchesOffset = default(VectorOffset),
|
||||
VectorOffset ValuesOffset = default(VectorOffset),
|
||||
VectorOffset ColorsOffset = default(VectorOffset),
|
||||
sbyte Unknown3 = 0,
|
||||
sbyte Unknown4 = 0,
|
||||
sbyte Unknown5 = 0,
|
||||
sbyte Unknown6 = 0,
|
||||
sbyte Unknown7 = 0,
|
||||
byte Unknown3 = 0,
|
||||
byte Unknown4 = 0,
|
||||
byte Unknown5 = 0,
|
||||
byte Unknown6 = 0,
|
||||
byte Unknown7 = 0,
|
||||
Offset<MaterialCommon> CommonOffset = default(Offset<MaterialCommon>))
|
||||
{
|
||||
builder.StartObject(21);
|
||||
|
@ -220,7 +221,7 @@ namespace FlatBuffers.Gfbmdl
|
|||
Material.AddColors(builder, ColorsOffset);
|
||||
Material.AddValues(builder, ValuesOffset);
|
||||
Material.AddSwitches(builder, SwitchesOffset);
|
||||
Material.AddTextures(builder, TexturesOffset);
|
||||
Material.AddTextureMaps(builder, TextureMapsOffset);
|
||||
Material.AddParameter6(builder, Parameter6);
|
||||
Material.AddParameter5(builder, Parameter5);
|
||||
Material.AddParameter4(builder, Parameter4);
|
||||
|
@ -244,18 +245,18 @@ namespace FlatBuffers.Gfbmdl
|
|||
public static void AddName(FlatBufferBuilder builder, StringOffset NameOffset) { builder.AddOffset(0, NameOffset.Value, 0); }
|
||||
public static void AddShaderGroup(FlatBufferBuilder builder, StringOffset ShaderGroupOffset) { builder.AddOffset(1, ShaderGroupOffset.Value, 0); }
|
||||
public static void AddRenderLayer(FlatBufferBuilder builder, int RenderLayer) { builder.AddInt(2, RenderLayer, 0); }
|
||||
public static void AddUnknown1(FlatBufferBuilder builder, sbyte Unknown1) { builder.AddSbyte(3, Unknown1, 0); }
|
||||
public static void AddUnknown2(FlatBufferBuilder builder, sbyte Unknown2) { builder.AddSbyte(4, Unknown2, 0); }
|
||||
public static void AddUnknown1(FlatBufferBuilder builder, byte Unknown1) { builder.AddByte(3, Unknown1, 0); }
|
||||
public static void AddUnknown2(FlatBufferBuilder builder, byte Unknown2) { builder.AddByte(4, Unknown2, 0); }
|
||||
public static void AddParameter1(FlatBufferBuilder builder, int Parameter1) { builder.AddInt(5, Parameter1, 0); }
|
||||
public static void AddParameter2(FlatBufferBuilder builder, int Parameter2) { builder.AddInt(6, Parameter2, 0); }
|
||||
public static void AddParameter3(FlatBufferBuilder builder, int Parameter3) { builder.AddInt(7, Parameter3, 0); }
|
||||
public static void AddParameter4(FlatBufferBuilder builder, int Parameter4) { builder.AddInt(8, Parameter4, 0); }
|
||||
public static void AddParameter5(FlatBufferBuilder builder, int Parameter5) { builder.AddInt(9, Parameter5, 0); }
|
||||
public static void AddParameter6(FlatBufferBuilder builder, int Parameter6) { builder.AddInt(10, Parameter6, 0); }
|
||||
public static void AddTextures(FlatBufferBuilder builder, VectorOffset TexturesOffset) { builder.AddOffset(11, TexturesOffset.Value, 0); }
|
||||
public static VectorOffset CreateTexturesVector(FlatBufferBuilder builder, Offset<TextureMap>[] data) { builder.StartVector(4, data.Length, 4); for (int i = data.Length - 1; i >= 0; i--) builder.AddOffset(data[i].Value); return builder.EndVector(); }
|
||||
public static VectorOffset CreateTexturesVectorBlock(FlatBufferBuilder builder, Offset<TextureMap>[] data) { builder.StartVector(4, data.Length, 4); builder.Add(data); return builder.EndVector(); }
|
||||
public static void StartTexturesVector(FlatBufferBuilder builder, int numElems) { builder.StartVector(4, numElems, 4); }
|
||||
public static void AddTextureMaps(FlatBufferBuilder builder, VectorOffset TextureMapsOffset) { builder.AddOffset(11, TextureMapsOffset.Value, 0); }
|
||||
public static VectorOffset CreateTextureMapsVector(FlatBufferBuilder builder, Offset<TextureMap>[] data) { builder.StartVector(4, data.Length, 4); for (int i = data.Length - 1; i >= 0; i--) builder.AddOffset(data[i].Value); return builder.EndVector(); }
|
||||
public static VectorOffset CreateTextureMapsVectorBlock(FlatBufferBuilder builder, Offset<TextureMap>[] data) { builder.StartVector(4, data.Length, 4); builder.Add(data); return builder.EndVector(); }
|
||||
public static void StartTextureMapsVector(FlatBufferBuilder builder, int numElems) { builder.StartVector(4, numElems, 4); }
|
||||
public static void AddSwitches(FlatBufferBuilder builder, VectorOffset SwitchesOffset) { builder.AddOffset(12, SwitchesOffset.Value, 0); }
|
||||
public static VectorOffset CreateSwitchesVector(FlatBufferBuilder builder, Offset<MatSwitch>[] data) { builder.StartVector(4, data.Length, 4); for (int i = data.Length - 1; i >= 0; i--) builder.AddOffset(data[i].Value); return builder.EndVector(); }
|
||||
public static VectorOffset CreateSwitchesVectorBlock(FlatBufferBuilder builder, Offset<MatSwitch>[] data) { builder.StartVector(4, data.Length, 4); builder.Add(data); return builder.EndVector(); }
|
||||
|
@ -268,11 +269,11 @@ namespace FlatBuffers.Gfbmdl
|
|||
public static VectorOffset CreateColorsVector(FlatBufferBuilder builder, Offset<MatColor>[] data) { builder.StartVector(4, data.Length, 4); for (int i = data.Length - 1; i >= 0; i--) builder.AddOffset(data[i].Value); return builder.EndVector(); }
|
||||
public static VectorOffset CreateColorsVectorBlock(FlatBufferBuilder builder, Offset<MatColor>[] data) { builder.StartVector(4, data.Length, 4); builder.Add(data); return builder.EndVector(); }
|
||||
public static void StartColorsVector(FlatBufferBuilder builder, int numElems) { builder.StartVector(4, numElems, 4); }
|
||||
public static void AddUnknown3(FlatBufferBuilder builder, sbyte Unknown3) { builder.AddSbyte(15, Unknown3, 0); }
|
||||
public static void AddUnknown4(FlatBufferBuilder builder, sbyte Unknown4) { builder.AddSbyte(16, Unknown4, 0); }
|
||||
public static void AddUnknown5(FlatBufferBuilder builder, sbyte Unknown5) { builder.AddSbyte(17, Unknown5, 0); }
|
||||
public static void AddUnknown6(FlatBufferBuilder builder, sbyte Unknown6) { builder.AddSbyte(18, Unknown6, 0); }
|
||||
public static void AddUnknown7(FlatBufferBuilder builder, sbyte Unknown7) { builder.AddSbyte(19, Unknown7, 0); }
|
||||
public static void AddUnknown3(FlatBufferBuilder builder, byte Unknown3) { builder.AddByte(15, Unknown3, 0); }
|
||||
public static void AddUnknown4(FlatBufferBuilder builder, byte Unknown4) { builder.AddByte(16, Unknown4, 0); }
|
||||
public static void AddUnknown5(FlatBufferBuilder builder, byte Unknown5) { builder.AddByte(17, Unknown5, 0); }
|
||||
public static void AddUnknown6(FlatBufferBuilder builder, byte Unknown6) { builder.AddByte(18, Unknown6, 0); }
|
||||
public static void AddUnknown7(FlatBufferBuilder builder, byte Unknown7) { builder.AddByte(19, Unknown7, 0); }
|
||||
public static void AddCommon(FlatBufferBuilder builder, Offset<MaterialCommon> CommonOffset) { builder.AddOffset(20, CommonOffset.Value, 0); }
|
||||
public static Offset<Material> EndMaterial(FlatBufferBuilder builder)
|
||||
{
|
||||
|
@ -480,32 +481,32 @@ namespace FlatBuffers.Gfbmdl
|
|||
public void __init(int _i, ByteBuffer _bb) { __p.bb_pos = _i; __p.bb = _bb; }
|
||||
public TextureMap __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }
|
||||
|
||||
public string Name { get { int o = __p.__offset(4); return o != 0 ? __p.__string(o + __p.bb_pos) : null; } }
|
||||
public string Sampler { get { int o = __p.__offset(4); return o != 0 ? __p.__string(o + __p.bb_pos) : null; } }
|
||||
#if ENABLE_SPAN_T
|
||||
public Span<byte> GetNameBytes() { return __p.__vector_as_span(4); }
|
||||
public Span<byte> GetSamplerBytes() { return __p.__vector_as_span(4); }
|
||||
#else
|
||||
public ArraySegment<byte>? GetNameBytes() { return __p.__vector_as_arraysegment(4); }
|
||||
public ArraySegment<byte>? GetSamplerBytes() { return __p.__vector_as_arraysegment(4); }
|
||||
#endif
|
||||
public byte[] GetNameArray() { return __p.__vector_as_array<byte>(4); }
|
||||
public byte[] GetSamplerArray() { return __p.__vector_as_array<byte>(4); }
|
||||
public int Index { get { int o = __p.__offset(6); return o != 0 ? __p.bb.GetInt(o + __p.bb_pos) : (int)0; } }
|
||||
public TextureMapping? Mapping { get { int o = __p.__offset(8); return o != 0 ? (TextureMapping?)(new TextureMapping()).__assign(__p.__indirect(o + __p.bb_pos), __p.bb) : null; } }
|
||||
public TextureMapping? Params { get { int o = __p.__offset(8); return o != 0 ? (TextureMapping?)(new TextureMapping()).__assign(__p.__indirect(o + __p.bb_pos), __p.bb) : null; } }
|
||||
|
||||
public static Offset<TextureMap> CreateTextureMap(FlatBufferBuilder builder,
|
||||
StringOffset NameOffset = default(StringOffset),
|
||||
StringOffset SamplerOffset = default(StringOffset),
|
||||
int Index = 0,
|
||||
Offset<TextureMapping> MappingOffset = default(Offset<TextureMapping>))
|
||||
Offset<TextureMapping> ParamsOffset = default(Offset<TextureMapping>))
|
||||
{
|
||||
builder.StartObject(3);
|
||||
TextureMap.AddMapping(builder, MappingOffset);
|
||||
TextureMap.AddParams(builder, ParamsOffset);
|
||||
TextureMap.AddIndex(builder, Index);
|
||||
TextureMap.AddName(builder, NameOffset);
|
||||
TextureMap.AddSampler(builder, SamplerOffset);
|
||||
return TextureMap.EndTextureMap(builder);
|
||||
}
|
||||
|
||||
public static void StartTextureMap(FlatBufferBuilder builder) { builder.StartObject(3); }
|
||||
public static void AddName(FlatBufferBuilder builder, StringOffset NameOffset) { builder.AddOffset(0, NameOffset.Value, 0); }
|
||||
public static void AddSampler(FlatBufferBuilder builder, StringOffset SamplerOffset) { builder.AddOffset(0, SamplerOffset.Value, 0); }
|
||||
public static void AddIndex(FlatBufferBuilder builder, int Index) { builder.AddInt(1, Index, 0); }
|
||||
public static void AddMapping(FlatBufferBuilder builder, Offset<TextureMapping> MappingOffset) { builder.AddOffset(2, MappingOffset.Value, 0); }
|
||||
public static void AddParams(FlatBufferBuilder builder, Offset<TextureMapping> ParamsOffset) { builder.AddOffset(2, ParamsOffset.Value, 0); }
|
||||
public static Offset<TextureMap> EndTextureMap(FlatBufferBuilder builder)
|
||||
{
|
||||
int o = builder.EndObject();
|
||||
|
@ -522,50 +523,50 @@ namespace FlatBuffers.Gfbmdl
|
|||
public void __init(int _i, ByteBuffer _bb) { __p.bb_pos = _i; __p.bb = _bb; }
|
||||
public TextureMapping __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }
|
||||
|
||||
public uint Type { get { int o = __p.__offset(4); return o != 0 ? __p.bb.GetUint(o + __p.bb_pos) : (uint)0; } }
|
||||
public uint Scale { get { int o = __p.__offset(6); return o != 0 ? __p.bb.GetUint(o + __p.bb_pos) : (uint)0; } }
|
||||
public uint Translation { get { int o = __p.__offset(8); return o != 0 ? __p.bb.GetUint(o + __p.bb_pos) : (uint)0; } }
|
||||
public uint Rotation { get { int o = __p.__offset(10); return o != 0 ? __p.bb.GetUint(o + __p.bb_pos) : (uint)0; } }
|
||||
public uint WrapS { get { int o = __p.__offset(12); return o != 0 ? __p.bb.GetUint(o + __p.bb_pos) : (uint)0; } }
|
||||
public uint WrapT { get { int o = __p.__offset(14); return o != 0 ? __p.bb.GetUint(o + __p.bb_pos) : (uint)0; } }
|
||||
public uint MagFilter { get { int o = __p.__offset(16); return o != 0 ? __p.bb.GetUint(o + __p.bb_pos) : (uint)0; } }
|
||||
public uint MinFilter { get { int o = __p.__offset(18); return o != 0 ? __p.bb.GetUint(o + __p.bb_pos) : (uint)0; } }
|
||||
public float MinLOD { get { int o = __p.__offset(20); return o != 0 ? __p.bb.GetFloat(o + __p.bb_pos) : (float)0.0f; } }
|
||||
public uint Unknown1 { get { int o = __p.__offset(4); return o != 0 ? __p.bb.GetUint(o + __p.bb_pos) : (uint)0; } }
|
||||
public uint Unknown2 { get { int o = __p.__offset(6); return o != 0 ? __p.bb.GetUint(o + __p.bb_pos) : (uint)0; } }
|
||||
public uint Unknown3 { get { int o = __p.__offset(8); return o != 0 ? __p.bb.GetUint(o + __p.bb_pos) : (uint)0; } }
|
||||
public uint Unknown4 { get { int o = __p.__offset(10); return o != 0 ? __p.bb.GetUint(o + __p.bb_pos) : (uint)0; } }
|
||||
public uint Unknown5 { get { int o = __p.__offset(12); return o != 0 ? __p.bb.GetUint(o + __p.bb_pos) : (uint)0; } }
|
||||
public uint Unknown6 { get { int o = __p.__offset(14); return o != 0 ? __p.bb.GetUint(o + __p.bb_pos) : (uint)0; } }
|
||||
public uint Unknown7 { get { int o = __p.__offset(16); return o != 0 ? __p.bb.GetUint(o + __p.bb_pos) : (uint)0; } }
|
||||
public uint Unknown8 { get { int o = __p.__offset(18); return o != 0 ? __p.bb.GetUint(o + __p.bb_pos) : (uint)0; } }
|
||||
public float LodBias { get { int o = __p.__offset(20); return o != 0 ? __p.bb.GetFloat(o + __p.bb_pos) : (float)0.0f; } }
|
||||
|
||||
public static Offset<TextureMapping> CreateTextureMapping(FlatBufferBuilder builder,
|
||||
uint Type = 0,
|
||||
uint Scale = 0,
|
||||
uint Translation = 0,
|
||||
uint Rotation = 0,
|
||||
uint WrapS = 0,
|
||||
uint WrapT = 0,
|
||||
uint magFilter = 0,
|
||||
uint minFilter = 0,
|
||||
float minLOD = 0.0f)
|
||||
uint Unknown1 = 0,
|
||||
uint Unknown2 = 0,
|
||||
uint Unknown3 = 0,
|
||||
uint Unknown4 = 0,
|
||||
uint Unknown5 = 0,
|
||||
uint Unknown6 = 0,
|
||||
uint Unknown7 = 0,
|
||||
uint Unknown8 = 0,
|
||||
float lodBias = 0.0f)
|
||||
{
|
||||
builder.StartObject(9);
|
||||
TextureMapping.AddMinLOD(builder, minLOD);
|
||||
TextureMapping.AddMinFilter(builder, minFilter);
|
||||
TextureMapping.AddMagFilter(builder, magFilter);
|
||||
TextureMapping.AddWrapT(builder, WrapT);
|
||||
TextureMapping.AddWrapS(builder, WrapS);
|
||||
TextureMapping.AddRotation(builder, Rotation);
|
||||
TextureMapping.AddTranslation(builder, Translation);
|
||||
TextureMapping.AddScale(builder, Scale);
|
||||
TextureMapping.AddType(builder, Type);
|
||||
TextureMapping.AddLodBias(builder, lodBias);
|
||||
TextureMapping.AddUnknown8(builder, Unknown8);
|
||||
TextureMapping.AddUnknown7(builder, Unknown7);
|
||||
TextureMapping.AddUnknown6(builder, Unknown6);
|
||||
TextureMapping.AddUnknown5(builder, Unknown5);
|
||||
TextureMapping.AddUnknown4(builder, Unknown4);
|
||||
TextureMapping.AddUnknown3(builder, Unknown3);
|
||||
TextureMapping.AddUnknown2(builder, Unknown2);
|
||||
TextureMapping.AddUnknown1(builder, Unknown1);
|
||||
return TextureMapping.EndTextureMapping(builder);
|
||||
}
|
||||
|
||||
public static void StartTextureMapping(FlatBufferBuilder builder) { builder.StartObject(9); }
|
||||
public static void AddType(FlatBufferBuilder builder, uint Type) { builder.AddUint(0, Type, 0); }
|
||||
public static void AddScale(FlatBufferBuilder builder, uint Scale) { builder.AddUint(1, Scale, 0); }
|
||||
public static void AddTranslation(FlatBufferBuilder builder, uint Translation) { builder.AddUint(2, Translation, 0); }
|
||||
public static void AddRotation(FlatBufferBuilder builder, uint Rotation) { builder.AddUint(3, Rotation, 0); }
|
||||
public static void AddWrapS(FlatBufferBuilder builder, uint WrapS) { builder.AddUint(4, WrapS, 0); }
|
||||
public static void AddWrapT(FlatBufferBuilder builder, uint WrapT) { builder.AddUint(5, WrapT, 0); }
|
||||
public static void AddMagFilter(FlatBufferBuilder builder, uint magFilter) { builder.AddUint(6, magFilter, 0); }
|
||||
public static void AddMinFilter(FlatBufferBuilder builder, uint minFilter) { builder.AddUint(7, minFilter, 0); }
|
||||
public static void AddMinLOD(FlatBufferBuilder builder, float minLOD) { builder.AddFloat(8, minLOD, 0.0f); }
|
||||
public static void AddUnknown1(FlatBufferBuilder builder, uint Unknown1) { builder.AddUint(0, Unknown1, 0); }
|
||||
public static void AddUnknown2(FlatBufferBuilder builder, uint Unknown2) { builder.AddUint(1, Unknown2, 0); }
|
||||
public static void AddUnknown3(FlatBufferBuilder builder, uint Unknown3) { builder.AddUint(2, Unknown3, 0); }
|
||||
public static void AddUnknown4(FlatBufferBuilder builder, uint Unknown4) { builder.AddUint(3, Unknown4, 0); }
|
||||
public static void AddUnknown5(FlatBufferBuilder builder, uint Unknown5) { builder.AddUint(4, Unknown5, 0); }
|
||||
public static void AddUnknown6(FlatBufferBuilder builder, uint Unknown6) { builder.AddUint(5, Unknown6, 0); }
|
||||
public static void AddUnknown7(FlatBufferBuilder builder, uint Unknown7) { builder.AddUint(6, Unknown7, 0); }
|
||||
public static void AddUnknown8(FlatBufferBuilder builder, uint Unknown8) { builder.AddUint(7, Unknown8, 0); }
|
||||
public static void AddLodBias(FlatBufferBuilder builder, float lodBias) { builder.AddFloat(8, lodBias, 0.0f); }
|
||||
public static Offset<TextureMapping> EndTextureMapping(FlatBufferBuilder builder)
|
||||
{
|
||||
int o = builder.EndObject();
|
||||
|
@ -582,16 +583,16 @@ namespace FlatBuffers.Gfbmdl
|
|||
public void __init(int _i, ByteBuffer _bb) { __p.bb_pos = _i; __p.bb = _bb; }
|
||||
public Group __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }
|
||||
|
||||
public uint BoneID { get { int o = __p.__offset(4); return o != 0 ? __p.bb.GetUint(o + __p.bb_pos) : (uint)0; } }
|
||||
public uint MeshID { get { int o = __p.__offset(6); return o != 0 ? __p.bb.GetUint(o + __p.bb_pos) : (uint)0; } }
|
||||
public uint BoneIndex { get { int o = __p.__offset(4); return o != 0 ? __p.bb.GetUint(o + __p.bb_pos) : (uint)0; } }
|
||||
public uint MeshIndex { get { int o = __p.__offset(6); return o != 0 ? __p.bb.GetUint(o + __p.bb_pos) : (uint)0; } }
|
||||
public BoundingBox? Bounding { get { int o = __p.__offset(8); return o != 0 ? (BoundingBox?)(new BoundingBox()).__assign(o + __p.bb_pos, __p.bb) : null; } }
|
||||
public uint Layer { get { int o = __p.__offset(10); return o != 0 ? __p.bb.GetUint(o + __p.bb_pos) : (uint)0; } }
|
||||
|
||||
public static void StartGroup(FlatBufferBuilder builder) { builder.StartObject(4); }
|
||||
public static void AddBoneID(FlatBufferBuilder builder, uint boneID) { builder.AddUint(0, boneID, 0); }
|
||||
public static void AddMeshID(FlatBufferBuilder builder, uint meshID) { builder.AddUint(1, meshID, 0); }
|
||||
public static void AddBoneIndex(FlatBufferBuilder builder, uint BoneIndex) { builder.AddUint(0, BoneIndex, 0); }
|
||||
public static void AddMeshIndex(FlatBufferBuilder builder, uint MeshIndex) { builder.AddUint(1, MeshIndex, 0); }
|
||||
public static void AddBounding(FlatBufferBuilder builder, Offset<BoundingBox> BoundingOffset) { builder.AddStruct(2, BoundingOffset.Value, 0); }
|
||||
public static void AddLayer(FlatBufferBuilder builder, uint layer) { builder.AddUint(3, layer, 0); }
|
||||
public static void AddLayer(FlatBufferBuilder builder, uint Layer) { builder.AddUint(3, Layer, 0); }
|
||||
public static Offset<Group> EndGroup(FlatBufferBuilder builder)
|
||||
{
|
||||
int o = builder.EndObject();
|
||||
|
@ -610,8 +611,8 @@ namespace FlatBuffers.Gfbmdl
|
|||
|
||||
public MeshPolygon? Polygons(int j) { int o = __p.__offset(4); return o != 0 ? (MeshPolygon?)(new MeshPolygon()).__assign(__p.__indirect(__p.__vector(o) + j * 4), __p.bb) : null; }
|
||||
public int PolygonsLength { get { int o = __p.__offset(4); return o != 0 ? __p.__vector_len(o) : 0; } }
|
||||
public MeshAlignment? Alignments(int j) { int o = __p.__offset(6); return o != 0 ? (MeshAlignment?)(new MeshAlignment()).__assign(__p.__indirect(__p.__vector(o) + j * 4), __p.bb) : null; }
|
||||
public int AlignmentsLength { get { int o = __p.__offset(6); return o != 0 ? __p.__vector_len(o) : 0; } }
|
||||
public MeshAttribute? Attributes(int j) { int o = __p.__offset(6); return o != 0 ? (MeshAttribute?)(new MeshAttribute()).__assign(__p.__indirect(__p.__vector(o) + j * 4), __p.bb) : null; }
|
||||
public int AttributesLength { get { int o = __p.__offset(6); return o != 0 ? __p.__vector_len(o) : 0; } }
|
||||
public byte Data(int j) { int o = __p.__offset(8); return o != 0 ? __p.bb.Get(__p.__vector(o) + j * 1) : (byte)0; }
|
||||
public int DataLength { get { int o = __p.__offset(8); return o != 0 ? __p.__vector_len(o) : 0; } }
|
||||
#if ENABLE_SPAN_T
|
||||
|
@ -623,12 +624,12 @@ namespace FlatBuffers.Gfbmdl
|
|||
|
||||
public static Offset<Mesh> CreateMesh(FlatBufferBuilder builder,
|
||||
VectorOffset PolygonsOffset = default(VectorOffset),
|
||||
VectorOffset AlignmentsOffset = default(VectorOffset),
|
||||
VectorOffset AttributesOffset = default(VectorOffset),
|
||||
VectorOffset DataOffset = default(VectorOffset))
|
||||
{
|
||||
builder.StartObject(3);
|
||||
Mesh.AddData(builder, DataOffset);
|
||||
Mesh.AddAlignments(builder, AlignmentsOffset);
|
||||
Mesh.AddAttributes(builder, AttributesOffset);
|
||||
Mesh.AddPolygons(builder, PolygonsOffset);
|
||||
return Mesh.EndMesh(builder);
|
||||
}
|
||||
|
@ -638,10 +639,10 @@ namespace FlatBuffers.Gfbmdl
|
|||
public static VectorOffset CreatePolygonsVector(FlatBufferBuilder builder, Offset<MeshPolygon>[] data) { builder.StartVector(4, data.Length, 4); for (int i = data.Length - 1; i >= 0; i--) builder.AddOffset(data[i].Value); return builder.EndVector(); }
|
||||
public static VectorOffset CreatePolygonsVectorBlock(FlatBufferBuilder builder, Offset<MeshPolygon>[] data) { builder.StartVector(4, data.Length, 4); builder.Add(data); return builder.EndVector(); }
|
||||
public static void StartPolygonsVector(FlatBufferBuilder builder, int numElems) { builder.StartVector(4, numElems, 4); }
|
||||
public static void AddAlignments(FlatBufferBuilder builder, VectorOffset AlignmentsOffset) { builder.AddOffset(1, AlignmentsOffset.Value, 0); }
|
||||
public static VectorOffset CreateAlignmentsVector(FlatBufferBuilder builder, Offset<MeshAlignment>[] data) { builder.StartVector(4, data.Length, 4); for (int i = data.Length - 1; i >= 0; i--) builder.AddOffset(data[i].Value); return builder.EndVector(); }
|
||||
public static VectorOffset CreateAlignmentsVectorBlock(FlatBufferBuilder builder, Offset<MeshAlignment>[] data) { builder.StartVector(4, data.Length, 4); builder.Add(data); return builder.EndVector(); }
|
||||
public static void StartAlignmentsVector(FlatBufferBuilder builder, int numElems) { builder.StartVector(4, numElems, 4); }
|
||||
public static void AddAttributes(FlatBufferBuilder builder, VectorOffset AttributesOffset) { builder.AddOffset(1, AttributesOffset.Value, 0); }
|
||||
public static VectorOffset CreateAttributesVector(FlatBufferBuilder builder, Offset<MeshAttribute>[] data) { builder.StartVector(4, data.Length, 4); for (int i = data.Length - 1; i >= 0; i--) builder.AddOffset(data[i].Value); return builder.EndVector(); }
|
||||
public static VectorOffset CreateAttributesVectorBlock(FlatBufferBuilder builder, Offset<MeshAttribute>[] data) { builder.StartVector(4, data.Length, 4); builder.Add(data); return builder.EndVector(); }
|
||||
public static void StartAttributesVector(FlatBufferBuilder builder, int numElems) { builder.StartVector(4, numElems, 4); }
|
||||
public static void AddData(FlatBufferBuilder builder, VectorOffset DataOffset) { builder.AddOffset(2, DataOffset.Value, 0); }
|
||||
public static VectorOffset CreateDataVector(FlatBufferBuilder builder, byte[] data) { builder.StartVector(1, data.Length, 1); for (int i = data.Length - 1; i >= 0; i--) builder.AddByte(data[i]); return builder.EndVector(); }
|
||||
public static VectorOffset CreateDataVectorBlock(FlatBufferBuilder builder, byte[] data) { builder.StartVector(1, data.Length, 1); builder.Add(data); return builder.EndVector(); }
|
||||
|
@ -662,32 +663,32 @@ namespace FlatBuffers.Gfbmdl
|
|||
public void __init(int _i, ByteBuffer _bb) { __p.bb_pos = _i; __p.bb = _bb; }
|
||||
public MeshPolygon __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }
|
||||
|
||||
public uint MaterialID { get { int o = __p.__offset(4); return o != 0 ? __p.bb.GetUint(o + __p.bb_pos) : (uint)0; } }
|
||||
public ushort Data(int j) { int o = __p.__offset(6); return o != 0 ? __p.bb.GetUshort(__p.__vector(o) + j * 2) : (ushort)0; }
|
||||
public int DataLength { get { int o = __p.__offset(6); return o != 0 ? __p.__vector_len(o) : 0; } }
|
||||
public uint MaterialIndex { get { int o = __p.__offset(4); return o != 0 ? __p.bb.GetUint(o + __p.bb_pos) : (uint)0; } }
|
||||
public ushort Faces(int j) { int o = __p.__offset(6); return o != 0 ? __p.bb.GetUshort(__p.__vector(o) + j * 2) : (ushort)0; }
|
||||
public int FacesLength { get { int o = __p.__offset(6); return o != 0 ? __p.__vector_len(o) : 0; } }
|
||||
#if ENABLE_SPAN_T
|
||||
public Span<byte> GetDataBytes() { return __p.__vector_as_span(6); }
|
||||
public Span<byte> GetFacesBytes() { return __p.__vector_as_span(6); }
|
||||
#else
|
||||
public ArraySegment<byte>? GetDataBytes() { return __p.__vector_as_arraysegment(6); }
|
||||
public ArraySegment<byte>? GetFacesBytes() { return __p.__vector_as_arraysegment(6); }
|
||||
#endif
|
||||
public ushort[] GetDataArray() { return __p.__vector_as_array<ushort>(6); }
|
||||
public ushort[] GetFacesArray() { return __p.__vector_as_array<ushort>(6); }
|
||||
|
||||
public static Offset<MeshPolygon> CreateMeshPolygon(FlatBufferBuilder builder,
|
||||
uint materialID = 0,
|
||||
VectorOffset dataOffset = default(VectorOffset))
|
||||
uint MaterialIndex = 0,
|
||||
VectorOffset FacesOffset = default(VectorOffset))
|
||||
{
|
||||
builder.StartObject(2);
|
||||
MeshPolygon.AddData(builder, dataOffset);
|
||||
MeshPolygon.AddMaterialID(builder, materialID);
|
||||
MeshPolygon.AddFaces(builder, FacesOffset);
|
||||
MeshPolygon.AddMaterialIndex(builder, MaterialIndex);
|
||||
return MeshPolygon.EndMeshPolygon(builder);
|
||||
}
|
||||
|
||||
public static void StartMeshPolygon(FlatBufferBuilder builder) { builder.StartObject(2); }
|
||||
public static void AddMaterialID(FlatBufferBuilder builder, uint materialID) { builder.AddUint(0, materialID, 0); }
|
||||
public static void AddData(FlatBufferBuilder builder, VectorOffset dataOffset) { builder.AddOffset(1, dataOffset.Value, 0); }
|
||||
public static VectorOffset CreateDataVector(FlatBufferBuilder builder, ushort[] data) { builder.StartVector(2, data.Length, 2); for (int i = data.Length - 1; i >= 0; i--) builder.AddUshort(data[i]); return builder.EndVector(); }
|
||||
public static VectorOffset CreateDataVectorBlock(FlatBufferBuilder builder, ushort[] data) { builder.StartVector(2, data.Length, 2); builder.Add(data); return builder.EndVector(); }
|
||||
public static void StartDataVector(FlatBufferBuilder builder, int numElems) { builder.StartVector(2, numElems, 2); }
|
||||
public static void AddMaterialIndex(FlatBufferBuilder builder, uint MaterialIndex) { builder.AddUint(0, MaterialIndex, 0); }
|
||||
public static void AddFaces(FlatBufferBuilder builder, VectorOffset FacesOffset) { builder.AddOffset(1, FacesOffset.Value, 0); }
|
||||
public static VectorOffset CreateFacesVector(FlatBufferBuilder builder, ushort[] data) { builder.StartVector(2, data.Length, 2); for (int i = data.Length - 1; i >= 0; i--) builder.AddUshort(data[i]); return builder.EndVector(); }
|
||||
public static VectorOffset CreateFacesVectorBlock(FlatBufferBuilder builder, ushort[] data) { builder.StartVector(2, data.Length, 2); builder.Add(data); return builder.EndVector(); }
|
||||
public static void StartFacesVector(FlatBufferBuilder builder, int numElems) { builder.StartVector(2, numElems, 2); }
|
||||
public static Offset<MeshPolygon> EndMeshPolygon(FlatBufferBuilder builder)
|
||||
{
|
||||
int o = builder.EndObject();
|
||||
|
@ -695,39 +696,39 @@ namespace FlatBuffers.Gfbmdl
|
|||
}
|
||||
};
|
||||
|
||||
public struct MeshAlignment : IFlatbufferObject
|
||||
public struct MeshAttribute : IFlatbufferObject
|
||||
{
|
||||
private Table __p;
|
||||
public ByteBuffer ByteBuffer { get { return __p.bb; } }
|
||||
public static MeshAlignment GetRootAsMeshAlignment(ByteBuffer _bb) { return GetRootAsMeshAlignment(_bb, new MeshAlignment()); }
|
||||
public static MeshAlignment GetRootAsMeshAlignment(ByteBuffer _bb, MeshAlignment obj) { return (obj.__assign(_bb.GetInt(_bb.Position) + _bb.Position, _bb)); }
|
||||
public static MeshAttribute GetRootAsMeshAttribute(ByteBuffer _bb) { return GetRootAsMeshAttribute(_bb, new MeshAttribute()); }
|
||||
public static MeshAttribute GetRootAsMeshAttribute(ByteBuffer _bb, MeshAttribute obj) { return (obj.__assign(_bb.GetInt(_bb.Position) + _bb.Position, _bb)); }
|
||||
public void __init(int _i, ByteBuffer _bb) { __p.bb_pos = _i; __p.bb = _bb; }
|
||||
public MeshAlignment __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }
|
||||
public MeshAttribute __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }
|
||||
|
||||
public VertexType TypeID { get { int o = __p.__offset(4); return o != 0 ? (VertexType)__p.bb.GetUint(o + __p.bb_pos) : VertexType.Position; } }
|
||||
public BufferFormat FormatID { get { int o = __p.__offset(6); return o != 0 ? (BufferFormat)__p.bb.GetUint(o + __p.bb_pos) : BufferFormat.Float; } }
|
||||
public uint VertexType { get { int o = __p.__offset(4); return o != 0 ? __p.bb.GetUint(o + __p.bb_pos) : (uint)0; } }
|
||||
public uint BufferFormat { get { int o = __p.__offset(6); return o != 0 ? __p.bb.GetUint(o + __p.bb_pos) : (uint)0; } }
|
||||
public uint ElementCount { get { int o = __p.__offset(8); return o != 0 ? __p.bb.GetUint(o + __p.bb_pos) : (uint)0; } }
|
||||
|
||||
public static Offset<MeshAlignment> CreateMeshAlignment(FlatBufferBuilder builder,
|
||||
VertexType TypeID = VertexType.Position,
|
||||
BufferFormat FormatID = BufferFormat.Float,
|
||||
public static Offset<MeshAttribute> CreateMeshAttribute(FlatBufferBuilder builder,
|
||||
uint VertexType = 0,
|
||||
uint BufferFormat = 0,
|
||||
uint ElementCount = 0)
|
||||
{
|
||||
builder.StartObject(3);
|
||||
MeshAlignment.AddElementCount(builder, ElementCount);
|
||||
MeshAlignment.AddFormatID(builder, FormatID);
|
||||
MeshAlignment.AddTypeID(builder, TypeID);
|
||||
return MeshAlignment.EndMeshAlignment(builder);
|
||||
MeshAttribute.AddElementCount(builder, ElementCount);
|
||||
MeshAttribute.AddBufferFormat(builder, BufferFormat);
|
||||
MeshAttribute.AddVertexType(builder, VertexType);
|
||||
return MeshAttribute.EndMeshAttribute(builder);
|
||||
}
|
||||
|
||||
public static void StartMeshAlignment(FlatBufferBuilder builder) { builder.StartObject(3); }
|
||||
public static void AddTypeID(FlatBufferBuilder builder, VertexType TypeID) { builder.AddUint(0, (uint)TypeID, 0); }
|
||||
public static void AddFormatID(FlatBufferBuilder builder, BufferFormat FormatID) { builder.AddUint(1, (uint)FormatID, 0); }
|
||||
public static void StartMeshAttribute(FlatBufferBuilder builder) { builder.StartObject(3); }
|
||||
public static void AddVertexType(FlatBufferBuilder builder, uint VertexType) { builder.AddUint(0, VertexType, 0); }
|
||||
public static void AddBufferFormat(FlatBufferBuilder builder, uint BufferFormat) { builder.AddUint(1, BufferFormat, 0); }
|
||||
public static void AddElementCount(FlatBufferBuilder builder, uint ElementCount) { builder.AddUint(2, ElementCount, 0); }
|
||||
public static Offset<MeshAlignment> EndMeshAlignment(FlatBufferBuilder builder)
|
||||
public static Offset<MeshAttribute> EndMeshAttribute(FlatBufferBuilder builder)
|
||||
{
|
||||
int o = builder.EndObject();
|
||||
return new Offset<MeshAlignment>(o);
|
||||
return new Offset<MeshAttribute>(o);
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -747,7 +748,7 @@ namespace FlatBuffers.Gfbmdl
|
|||
public ArraySegment<byte>? GetNameBytes() { return __p.__vector_as_arraysegment(4); }
|
||||
#endif
|
||||
public byte[] GetNameArray() { return __p.__vector_as_array<byte>(4); }
|
||||
public BoneType Type { get { int o = __p.__offset(6); return o != 0 ? (BoneType)__p.bb.GetUint(o + __p.bb_pos) : BoneType.NoSkinning; } }
|
||||
public uint BoneType { get { int o = __p.__offset(6); return o != 0 ? __p.bb.GetUint(o + __p.bb_pos) : (uint)0; } }
|
||||
public int Parent { get { int o = __p.__offset(8); return o != 0 ? __p.bb.GetInt(o + __p.bb_pos) : (int)0; } }
|
||||
public uint Zero { get { int o = __p.__offset(10); return o != 0 ? __p.bb.GetUint(o + __p.bb_pos) : (uint)0; } }
|
||||
public bool Visible { get { int o = __p.__offset(12); return o != 0 ? 0 != __p.bb.Get(o + __p.bb_pos) : (bool)false; } }
|
||||
|
@ -756,11 +757,11 @@ namespace FlatBuffers.Gfbmdl
|
|||
public Vector3? Translation { get { int o = __p.__offset(18); return o != 0 ? (Vector3?)(new Vector3()).__assign(o + __p.bb_pos, __p.bb) : null; } }
|
||||
public Vector3? RadiusStart { get { int o = __p.__offset(20); return o != 0 ? (Vector3?)(new Vector3()).__assign(o + __p.bb_pos, __p.bb) : null; } }
|
||||
public Vector3? RadiusEnd { get { int o = __p.__offset(22); return o != 0 ? (Vector3?)(new Vector3()).__assign(o + __p.bb_pos, __p.bb) : null; } }
|
||||
public UnknownData? SkinCheck { get { int o = __p.__offset(24); return o != 0 ? (UnknownData?)(new UnknownData()).__assign(o + __p.bb_pos, __p.bb) : null; } }
|
||||
public BoneRigidData? RigidCheck { get { int o = __p.__offset(24); return o != 0 ? (BoneRigidData?)(new BoneRigidData()).__assign(o + __p.bb_pos, __p.bb) : null; } }
|
||||
|
||||
public static void StartBone(FlatBufferBuilder builder) { builder.StartObject(11); }
|
||||
public static void AddName(FlatBufferBuilder builder, StringOffset NameOffset) { builder.AddOffset(0, NameOffset.Value, 0); }
|
||||
public static void AddType(FlatBufferBuilder builder, BoneType Type) { builder.AddUint(1, (uint)Type, 0); }
|
||||
public static void AddBoneType(FlatBufferBuilder builder, uint BoneType) { builder.AddUint(1, BoneType, 0); }
|
||||
public static void AddParent(FlatBufferBuilder builder, int Parent) { builder.AddInt(2, Parent, 0); }
|
||||
public static void AddZero(FlatBufferBuilder builder, uint Zero) { builder.AddUint(3, Zero, 0); }
|
||||
public static void AddVisible(FlatBufferBuilder builder, bool Visible) { builder.AddBool(4, Visible, false); }
|
||||
|
@ -769,7 +770,7 @@ namespace FlatBuffers.Gfbmdl
|
|||
public static void AddTranslation(FlatBufferBuilder builder, Offset<Vector3> TranslationOffset) { builder.AddStruct(7, TranslationOffset.Value, 0); }
|
||||
public static void AddRadiusStart(FlatBufferBuilder builder, Offset<Vector3> RadiusStartOffset) { builder.AddStruct(8, RadiusStartOffset.Value, 0); }
|
||||
public static void AddRadiusEnd(FlatBufferBuilder builder, Offset<Vector3> RadiusEndOffset) { builder.AddStruct(9, RadiusEndOffset.Value, 0); }
|
||||
public static void AddSkinCheck(FlatBufferBuilder builder, Offset<UnknownData> SkinCheckOffset) { builder.AddStruct(10, SkinCheckOffset.Value, 0); }
|
||||
public static void AddRigidCheck(FlatBufferBuilder builder, Offset<BoneRigidData> RigidCheckOffset) { builder.AddStruct(10, RigidCheckOffset.Value, 0); }
|
||||
public static Offset<Bone> EndBone(FlatBufferBuilder builder)
|
||||
{
|
||||
int o = builder.EndObject();
|
||||
|
@ -777,136 +778,56 @@ namespace FlatBuffers.Gfbmdl
|
|||
}
|
||||
};
|
||||
|
||||
public struct UnknownData : IFlatbufferObject
|
||||
public struct BoneRigidData : IFlatbufferObject
|
||||
{
|
||||
private Struct __p;
|
||||
public ByteBuffer ByteBuffer { get { return __p.bb; } }
|
||||
public void __init(int _i, ByteBuffer _bb) { __p.bb_pos = _i; __p.bb = _bb; }
|
||||
public UnknownData __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }
|
||||
public BoneRigidData __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }
|
||||
|
||||
public sbyte NoSkin { get { return __p.bb.GetSbyte(__p.bb_pos + 0); } }
|
||||
public sbyte Unknown1 { get { return __p.bb.GetSbyte(__p.bb_pos + 0); } }
|
||||
|
||||
public static Offset<UnknownData> CreateUnknownData(FlatBufferBuilder builder, sbyte NoSkin)
|
||||
public static Offset<BoneRigidData> CreateBoneRigidData(FlatBufferBuilder builder, sbyte Unknown1)
|
||||
{
|
||||
builder.Prep(1, 1);
|
||||
builder.PutSbyte(NoSkin);
|
||||
return new Offset<UnknownData>(builder.Offset);
|
||||
builder.PutSbyte(Unknown1);
|
||||
return new Offset<BoneRigidData>(builder.Offset);
|
||||
}
|
||||
};
|
||||
|
||||
public struct RenderInfo : IFlatbufferObject
|
||||
public struct CollisionGroup : IFlatbufferObject
|
||||
{
|
||||
private Table __p;
|
||||
public ByteBuffer ByteBuffer { get { return __p.bb; } }
|
||||
public static RenderInfo GetRootAsRenderInfo(ByteBuffer _bb) { return GetRootAsRenderInfo(_bb, new RenderInfo()); }
|
||||
public static RenderInfo GetRootAsRenderInfo(ByteBuffer _bb, RenderInfo obj) { return (obj.__assign(_bb.GetInt(_bb.Position) + _bb.Position, _bb)); }
|
||||
public static CollisionGroup GetRootAsCollisionGroup(ByteBuffer _bb) { return GetRootAsCollisionGroup(_bb, new CollisionGroup()); }
|
||||
public static CollisionGroup GetRootAsCollisionGroup(ByteBuffer _bb, CollisionGroup obj) { return (obj.__assign(_bb.GetInt(_bb.Position) + _bb.Position, _bb)); }
|
||||
public void __init(int _i, ByteBuffer _bb) { __p.bb_pos = _i; __p.bb = _bb; }
|
||||
public RenderInfo __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }
|
||||
public CollisionGroup __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }
|
||||
|
||||
public uint Unknown1 { get { int o = __p.__offset(4); return o != 0 ? __p.bb.GetUint(o + __p.bb_pos) : (uint)0; } }
|
||||
public uint Unknown2 { get { int o = __p.__offset(6); return o != 0 ? __p.bb.GetUint(o + __p.bb_pos) : (uint)0; } }
|
||||
public RenderUnknown? Unknown3 { get { int o = __p.__offset(8); return o != 0 ? (RenderUnknown?)(new RenderUnknown()).__assign(__p.__indirect(o + __p.bb_pos), __p.bb) : null; } }
|
||||
public RenderUnknown2? Unknown4 { get { int o = __p.__offset(10); return o != 0 ? (RenderUnknown2?)(new RenderUnknown2()).__assign(__p.__indirect(o + __p.bb_pos), __p.bb) : null; } }
|
||||
public uint BoneIndex { get { int o = __p.__offset(4); return o != 0 ? __p.bb.GetUint(o + __p.bb_pos) : (uint)0; } }
|
||||
public uint Unknown1 { get { int o = __p.__offset(6); return o != 0 ? __p.bb.GetUint(o + __p.bb_pos) : (uint)0; } }
|
||||
public uint BoneChildren(int j) { int o = __p.__offset(8); return o != 0 ? __p.bb.GetUint(__p.__vector(o) + j * 4) : (uint)0; }
|
||||
public int BoneChildrenLength { get { int o = __p.__offset(8); return o != 0 ? __p.__vector_len(o) : 0; } }
|
||||
#if ENABLE_SPAN_T
|
||||
public Span<byte> GetBoneChildrenBytes() { return __p.__vector_as_span(8); }
|
||||
#else
|
||||
public ArraySegment<byte>? GetBoneChildrenBytes() { return __p.__vector_as_arraysegment(8); }
|
||||
#endif
|
||||
public uint[] GetBoneChildrenArray() { return __p.__vector_as_array<uint>(8); }
|
||||
public BoundingBox? Bounding { get { int o = __p.__offset(10); return o != 0 ? (BoundingBox?)(new BoundingBox()).__assign(o + __p.bb_pos, __p.bb) : null; } }
|
||||
|
||||
public static Offset<RenderInfo> CreateRenderInfo(FlatBufferBuilder builder,
|
||||
uint Unknown1 = 0,
|
||||
uint Unknown2 = 0,
|
||||
Offset<RenderUnknown> Unknown3Offset = default(Offset<RenderUnknown>),
|
||||
Offset<RenderUnknown2> Unknown4Offset = default(Offset<RenderUnknown2>))
|
||||
{
|
||||
builder.StartObject(4);
|
||||
RenderInfo.AddUnknown4(builder, Unknown4Offset);
|
||||
RenderInfo.AddUnknown3(builder, Unknown3Offset);
|
||||
RenderInfo.AddUnknown2(builder, Unknown2);
|
||||
RenderInfo.AddUnknown1(builder, Unknown1);
|
||||
return RenderInfo.EndRenderInfo(builder);
|
||||
}
|
||||
|
||||
public static void StartRenderInfo(FlatBufferBuilder builder) { builder.StartObject(4); }
|
||||
public static void AddUnknown1(FlatBufferBuilder builder, uint Unknown1) { builder.AddUint(0, Unknown1, 0); }
|
||||
public static void AddUnknown2(FlatBufferBuilder builder, uint Unknown2) { builder.AddUint(1, Unknown2, 0); }
|
||||
public static void AddUnknown3(FlatBufferBuilder builder, Offset<RenderUnknown> Unknown3Offset) { builder.AddOffset(2, Unknown3Offset.Value, 0); }
|
||||
public static void AddUnknown4(FlatBufferBuilder builder, Offset<RenderUnknown2> Unknown4Offset) { builder.AddOffset(3, Unknown4Offset.Value, 0); }
|
||||
public static Offset<RenderInfo> EndRenderInfo(FlatBufferBuilder builder)
|
||||
public static void StartCollisionGroup(FlatBufferBuilder builder) { builder.StartObject(4); }
|
||||
public static void AddBoneIndex(FlatBufferBuilder builder, uint BoneIndex) { builder.AddUint(0, BoneIndex, 0); }
|
||||
public static void AddUnknown1(FlatBufferBuilder builder, uint Unknown1) { builder.AddUint(1, Unknown1, 0); }
|
||||
public static void AddBoneChildren(FlatBufferBuilder builder, VectorOffset BoneChildrenOffset) { builder.AddOffset(2, BoneChildrenOffset.Value, 0); }
|
||||
public static VectorOffset CreateBoneChildrenVector(FlatBufferBuilder builder, uint[] data) { builder.StartVector(4, data.Length, 4); for (int i = data.Length - 1; i >= 0; i--) builder.AddUint(data[i]); return builder.EndVector(); }
|
||||
public static VectorOffset CreateBoneChildrenVectorBlock(FlatBufferBuilder builder, uint[] data) { builder.StartVector(4, data.Length, 4); builder.Add(data); return builder.EndVector(); }
|
||||
public static void StartBoneChildrenVector(FlatBufferBuilder builder, int numElems) { builder.StartVector(4, numElems, 4); }
|
||||
public static void AddBounding(FlatBufferBuilder builder, Offset<BoundingBox> BoundingOffset) { builder.AddStruct(3, BoundingOffset.Value, 0); }
|
||||
public static Offset<CollisionGroup> EndCollisionGroup(FlatBufferBuilder builder)
|
||||
{
|
||||
int o = builder.EndObject();
|
||||
return new Offset<RenderInfo>(o);
|
||||
}
|
||||
};
|
||||
|
||||
public struct RenderUnknown : IFlatbufferObject
|
||||
{
|
||||
private Table __p;
|
||||
public ByteBuffer ByteBuffer { get { return __p.bb; } }
|
||||
public static RenderUnknown GetRootAsRenderUnknown(ByteBuffer _bb) { return GetRootAsRenderUnknown(_bb, new RenderUnknown()); }
|
||||
public static RenderUnknown GetRootAsRenderUnknown(ByteBuffer _bb, RenderUnknown obj) { return (obj.__assign(_bb.GetInt(_bb.Position) + _bb.Position, _bb)); }
|
||||
public void __init(int _i, ByteBuffer _bb) { __p.bb_pos = _i; __p.bb = _bb; }
|
||||
public RenderUnknown __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }
|
||||
|
||||
public uint Unknown { get { int o = __p.__offset(4); return o != 0 ? __p.bb.GetUint(o + __p.bb_pos) : (uint)0; } }
|
||||
|
||||
public static Offset<RenderUnknown> CreateRenderUnknown(FlatBufferBuilder builder,
|
||||
uint Unknown = 0)
|
||||
{
|
||||
builder.StartObject(1);
|
||||
RenderUnknown.AddUnknown(builder, Unknown);
|
||||
return RenderUnknown.EndRenderUnknown(builder);
|
||||
}
|
||||
|
||||
public static void StartRenderUnknown(FlatBufferBuilder builder) { builder.StartObject(1); }
|
||||
public static void AddUnknown(FlatBufferBuilder builder, uint Unknown) { builder.AddUint(0, Unknown, 0); }
|
||||
public static Offset<RenderUnknown> EndRenderUnknown(FlatBufferBuilder builder)
|
||||
{
|
||||
int o = builder.EndObject();
|
||||
return new Offset<RenderUnknown>(o);
|
||||
}
|
||||
};
|
||||
|
||||
public struct RenderUnknown2 : IFlatbufferObject
|
||||
{
|
||||
private Table __p;
|
||||
public ByteBuffer ByteBuffer { get { return __p.bb; } }
|
||||
public static RenderUnknown2 GetRootAsRenderUnknown2(ByteBuffer _bb) { return GetRootAsRenderUnknown2(_bb, new RenderUnknown2()); }
|
||||
public static RenderUnknown2 GetRootAsRenderUnknown2(ByteBuffer _bb, RenderUnknown2 obj) { return (obj.__assign(_bb.GetInt(_bb.Position) + _bb.Position, _bb)); }
|
||||
public void __init(int _i, ByteBuffer _bb) { __p.bb_pos = _i; __p.bb = _bb; }
|
||||
public RenderUnknown2 __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }
|
||||
|
||||
public float Unknown1 { get { int o = __p.__offset(4); return o != 0 ? __p.bb.GetFloat(o + __p.bb_pos) : (float)0.0f; } }
|
||||
public float Unknown2 { get { int o = __p.__offset(6); return o != 0 ? __p.bb.GetFloat(o + __p.bb_pos) : (float)0.0f; } }
|
||||
public float Unknown3 { get { int o = __p.__offset(8); return o != 0 ? __p.bb.GetFloat(o + __p.bb_pos) : (float)0.0f; } }
|
||||
public float Unknown4 { get { int o = __p.__offset(10); return o != 0 ? __p.bb.GetFloat(o + __p.bb_pos) : (float)0.0f; } }
|
||||
public float Unknown5 { get { int o = __p.__offset(12); return o != 0 ? __p.bb.GetFloat(o + __p.bb_pos) : (float)0.0f; } }
|
||||
public float Unknown6 { get { int o = __p.__offset(14); return o != 0 ? __p.bb.GetFloat(o + __p.bb_pos) : (float)0.0f; } }
|
||||
|
||||
public static Offset<RenderUnknown2> CreateRenderUnknown2(FlatBufferBuilder builder,
|
||||
float Unknown1 = 0.0f,
|
||||
float Unknown2 = 0.0f,
|
||||
float Unknown3 = 0.0f,
|
||||
float Unknown4 = 0.0f,
|
||||
float Unknown5 = 0.0f,
|
||||
float Unknown6 = 0.0f)
|
||||
{
|
||||
builder.StartObject(6);
|
||||
RenderUnknown2.AddUnknown6(builder, Unknown6);
|
||||
RenderUnknown2.AddUnknown5(builder, Unknown5);
|
||||
RenderUnknown2.AddUnknown4(builder, Unknown4);
|
||||
RenderUnknown2.AddUnknown3(builder, Unknown3);
|
||||
RenderUnknown2.AddUnknown2(builder, Unknown2);
|
||||
RenderUnknown2.AddUnknown1(builder, Unknown1);
|
||||
return RenderUnknown2.EndRenderUnknown2(builder);
|
||||
}
|
||||
|
||||
public static void StartRenderUnknown2(FlatBufferBuilder builder) { builder.StartObject(6); }
|
||||
public static void AddUnknown1(FlatBufferBuilder builder, float Unknown1) { builder.AddFloat(0, Unknown1, 0.0f); }
|
||||
public static void AddUnknown2(FlatBufferBuilder builder, float Unknown2) { builder.AddFloat(1, Unknown2, 0.0f); }
|
||||
public static void AddUnknown3(FlatBufferBuilder builder, float Unknown3) { builder.AddFloat(2, Unknown3, 0.0f); }
|
||||
public static void AddUnknown4(FlatBufferBuilder builder, float Unknown4) { builder.AddFloat(3, Unknown4, 0.0f); }
|
||||
public static void AddUnknown5(FlatBufferBuilder builder, float Unknown5) { builder.AddFloat(4, Unknown5, 0.0f); }
|
||||
public static void AddUnknown6(FlatBufferBuilder builder, float Unknown6) { builder.AddFloat(5, Unknown6, 0.0f); }
|
||||
public static Offset<RenderUnknown2> EndRenderUnknown2(FlatBufferBuilder builder)
|
||||
{
|
||||
int o = builder.EndObject();
|
||||
return new Offset<RenderUnknown2>(o);
|
||||
return new Offset<CollisionGroup>(o);
|
||||
}
|
||||
};
|
||||
|
655
File_Format_Library/FileFormats/Pokemon/GFLX/GFBMDL/GFBMDL.cs
Normal file
655
File_Format_Library/FileFormats/Pokemon/GFLX/GFBMDL/GFBMDL.cs
Normal file
|
@ -0,0 +1,655 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using Toolbox;
|
||||
using System.Windows.Forms;
|
||||
using Toolbox.Library;
|
||||
using Toolbox.Library.IO;
|
||||
using Toolbox.Library.Forms;
|
||||
using Toolbox.Library.Rendering;
|
||||
using OpenTK;
|
||||
using FirstPlugin.Forms;
|
||||
using FirstPlugin.GFMDLStructs;
|
||||
using Newtonsoft.Json;
|
||||
|
||||
namespace FirstPlugin
|
||||
{
|
||||
public class GFBMDL : TreeNodeFile, IContextMenuNode, IFileFormat
|
||||
{
|
||||
public FileType FileType { get; set; } = FileType.Model;
|
||||
|
||||
public bool CanSave { get; set; }
|
||||
public string[] Description { get; set; } = new string[] { "Graphic Model" };
|
||||
public string[] Extension { get; set; } = new string[] { "*.gfbmdl" };
|
||||
public string FileName { get; set; }
|
||||
public string FilePath { get; set; }
|
||||
public IFileInfo IFileInfo { get; set; }
|
||||
|
||||
public bool Identify(System.IO.Stream stream)
|
||||
{
|
||||
using (var reader = new Toolbox.Library.IO.FileReader(stream, true))
|
||||
{
|
||||
reader.ByteOrder = Syroot.BinaryData.ByteOrder.BigEndian;
|
||||
|
||||
bool IsMatch = reader.ReadUInt32() == 0x20000000;
|
||||
reader.Position = 0;
|
||||
|
||||
return IsMatch;
|
||||
}
|
||||
}
|
||||
|
||||
public Type[] Types
|
||||
{
|
||||
get
|
||||
{
|
||||
List<Type> types = new List<Type>();
|
||||
return types.ToArray();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
bool DrawablesLoaded = false;
|
||||
public override void OnClick(TreeView treeView) {
|
||||
LoadEditor<STPropertyGrid>();
|
||||
}
|
||||
|
||||
public T LoadEditor<T>() where T : UserControl, new()
|
||||
{
|
||||
T control = new T();
|
||||
control.Dock = DockStyle.Fill;
|
||||
|
||||
ViewportEditor editor = (ViewportEditor)LibraryGUI.GetActiveContent(typeof(ViewportEditor));
|
||||
if (editor == null)
|
||||
{
|
||||
editor = new ViewportEditor(true);
|
||||
editor.Dock = DockStyle.Fill;
|
||||
LibraryGUI.LoadEditor(editor);
|
||||
}
|
||||
if (!DrawablesLoaded)
|
||||
{
|
||||
ObjectEditor.AddContainer(DrawableContainer);
|
||||
DrawablesLoaded = true;
|
||||
}
|
||||
if (Runtime.UseOpenGL)
|
||||
editor.LoadViewport(DrawableContainer);
|
||||
|
||||
editor.LoadEditor(control);
|
||||
|
||||
return control;
|
||||
}
|
||||
|
||||
public GFBMDL_Render Renderer;
|
||||
|
||||
public DrawableContainer DrawableContainer = new DrawableContainer();
|
||||
|
||||
public GFLXModel Model;
|
||||
|
||||
public void Load(System.IO.Stream stream)
|
||||
{
|
||||
// CanSave = true;
|
||||
|
||||
Text = FileName;
|
||||
DrawableContainer.Name = FileName;
|
||||
Renderer = new GFBMDL_Render();
|
||||
Renderer.GfbmdlFile = this;
|
||||
DrawableContainer.Drawables.Add(Renderer);
|
||||
|
||||
//Here i convert buffer classes generated from flatc to c# classes that are much nicer to alter
|
||||
var model = BufferToStruct.LoadFile(stream);
|
||||
ReloadModel(model);
|
||||
}
|
||||
|
||||
private void ReloadModel(Model model)
|
||||
{
|
||||
Nodes.Clear();
|
||||
if (Renderer.Meshes == null)
|
||||
Renderer.Meshes = new List<STGenericObject>();
|
||||
Renderer.Meshes.Clear();
|
||||
|
||||
Model = new GFLXModel();
|
||||
Model.LoadFile(model, this, Renderer);
|
||||
|
||||
TreeNode SkeletonWrapper = new TreeNode("Skeleton");
|
||||
TreeNode MaterialFolderWrapper = new TreeNode("Materials");
|
||||
TreeNode VisualGroupWrapper = new TreeNode("Visual Groups");
|
||||
TreeNode Textures = new TreeNode("Textures");
|
||||
|
||||
if (Model.Skeleton.bones.Count > 0)
|
||||
{
|
||||
Nodes.Add(SkeletonWrapper);
|
||||
DrawableContainer.Drawables.Add(Model.Skeleton);
|
||||
|
||||
foreach (var bone in Model.Skeleton.bones)
|
||||
{
|
||||
if (bone.Parent == null)
|
||||
SkeletonWrapper.Nodes.Add(bone);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
List<string> loadedTextures = new List<string>();
|
||||
for (int i = 0; i < Model.Textures.Count; i++)
|
||||
{
|
||||
foreach (var bntx in PluginRuntime.bntxContainers)
|
||||
{
|
||||
if (bntx.Textures.ContainsKey(Model.Textures[i]) &&
|
||||
!loadedTextures.Contains(Model.Textures[i]))
|
||||
{
|
||||
TreeNode tex = new TreeNode(Model.Textures[i]);
|
||||
tex.ImageKey = "texture";
|
||||
tex.SelectedImageKey = "texture";
|
||||
|
||||
tex.Tag = bntx.Textures[Model.Textures[i]];
|
||||
Textures.Nodes.Add(tex);
|
||||
loadedTextures.Add(Model.Textures[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
loadedTextures.Clear();
|
||||
|
||||
Nodes.Add(MaterialFolderWrapper);
|
||||
Nodes.Add(VisualGroupWrapper);
|
||||
if (Textures.Nodes.Count > 0)
|
||||
Nodes.Add(Textures);
|
||||
|
||||
for (int i = 0; i < Model.GenericMaterials.Count; i++)
|
||||
MaterialFolderWrapper.Nodes.Add(Model.GenericMaterials[i]);
|
||||
|
||||
for (int i = 0; i < Model.GenericMeshes.Count; i++)
|
||||
VisualGroupWrapper.Nodes.Add(Model.GenericMeshes[i]);
|
||||
}
|
||||
|
||||
public void Save(System.IO.Stream stream)
|
||||
{
|
||||
Model.SaveFile(stream);
|
||||
}
|
||||
|
||||
public ToolStripItem[] GetContextMenuItems()
|
||||
{
|
||||
List<ToolStripItem> Items = new List<ToolStripItem>();
|
||||
Items.Add(new ToolStripMenuItem("Export Model", null, ExportAction, Keys.Control | Keys.E));
|
||||
Items.Add(new ToolStripMenuItem("Replace Model", null, ReplaceAction, Keys.Control | Keys.R));
|
||||
return Items.ToArray();
|
||||
}
|
||||
|
||||
private void ExportAction(object sender, EventArgs args)
|
||||
{
|
||||
SaveFileDialog sfd = new SaveFileDialog();
|
||||
sfd.Filter = "Supported Formats|*.dae;*.json;";
|
||||
sfd.FileName = Text;
|
||||
sfd.DefaultExt = "dae";
|
||||
if (sfd.ShowDialog() == DialogResult.OK)
|
||||
{
|
||||
string ext = Utils.GetExtension(sfd.FileName);
|
||||
if (ext == ".json")
|
||||
{
|
||||
string json = JsonConvert.SerializeObject(Model.Model, Formatting.Indented);
|
||||
System.IO.File.WriteAllText(sfd.FileName, json);
|
||||
}
|
||||
else
|
||||
{
|
||||
ExportModelSettings exportDlg = new ExportModelSettings();
|
||||
if (exportDlg.ShowDialog() == DialogResult.OK)
|
||||
ExportModel(sfd.FileName, exportDlg.Settings);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void ReplaceAction(object sender, EventArgs args)
|
||||
{
|
||||
OpenFileDialog ofd = new OpenFileDialog();
|
||||
ofd.Filter = "Supported Formats|*.dae;*.json;";
|
||||
if (ofd.ShowDialog() == DialogResult.OK)
|
||||
{
|
||||
string ext = Utils.GetExtension(ofd.FileName);
|
||||
if (ext == ".json")
|
||||
{
|
||||
var model = JsonConvert.DeserializeObject<Model>(
|
||||
System.IO.File.ReadAllText(ofd.FileName));
|
||||
|
||||
Model.LoadFile(model, this, Renderer);
|
||||
}
|
||||
else
|
||||
{
|
||||
AssimpData assimp = new AssimpData();
|
||||
bool IsLoaded = assimp.LoadFile(ofd.FileName);
|
||||
|
||||
if (!IsLoaded)
|
||||
return;
|
||||
|
||||
GFLXModelImporter dialog = new GFLXModelImporter();
|
||||
dialog.LoadMeshes(assimp.objects, assimp.materials, Model.GenericMaterials, Model.GenericMeshes);
|
||||
if (dialog.ShowDialog() == DialogResult.OK) {
|
||||
ImportModel(dialog, assimp.materials, assimp.objects, assimp.skeleton);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private List<STGenericObject> GeneratePolygonGroups(List<STGenericObject> importedMeshes,
|
||||
List<STGenericMaterial> importedMaterials, List<string> textures, GfbmdlImportSettings settings)
|
||||
{
|
||||
List<STGenericObject> meshes = new List<STGenericObject>();
|
||||
foreach (var mesh in importedMeshes)
|
||||
{
|
||||
var lod = mesh.lodMeshes[0];
|
||||
var setting = settings.MeshSettings[importedMeshes.IndexOf(mesh)];
|
||||
|
||||
//Create or map existing materials to the polygon group
|
||||
var currentMaterial = Model.Model.Materials.FirstOrDefault(x => x.Name == setting.Material);
|
||||
if (currentMaterial == null)
|
||||
{
|
||||
currentMaterial = Material.Replace(setting.MaterialFile);
|
||||
|
||||
//Get the imported material and set it's material data to the gfbmdl one
|
||||
if (mesh.MaterialIndex < importedMaterials.Count && mesh.MaterialIndex >= 0)
|
||||
SetupMaterial(importedMaterials[mesh.MaterialIndex], currentMaterial, textures);
|
||||
|
||||
Model.Model.Materials.Add(currentMaterial);
|
||||
}
|
||||
|
||||
mesh.MaterialIndex = Model.Model.Materials.IndexOf(currentMaterial);
|
||||
|
||||
//Merge dupes with the same name
|
||||
//Some are duped but use different material index
|
||||
//Which go into a polygon group
|
||||
var existingMesh = meshes.FirstOrDefault(x => x.ObjectName == mesh.ObjectName);
|
||||
|
||||
//Don't split atm since it's buggy
|
||||
//The faces seemed fine, but vertices are split by assimp giving issues
|
||||
bool splitPolygonGroups = false;
|
||||
if (existingMesh != null && splitPolygonGroups)
|
||||
{
|
||||
int offset = 0;
|
||||
foreach (var poly in existingMesh.PolygonGroups)
|
||||
{
|
||||
for (int f = 0; f < poly.faces.Count; f++)
|
||||
offset = Math.Max(offset, poly.faces[f]);
|
||||
}
|
||||
|
||||
List<int> faces = new List<int>();
|
||||
for (int f = 0; f < lod.faces.Count; f++) {
|
||||
faces.Add((int)(lod.faces[f] + offset + 1 ));
|
||||
}
|
||||
|
||||
foreach (var vertex in mesh.vertices)
|
||||
existingMesh.vertices.Add(vertex);
|
||||
|
||||
existingMesh.PolygonGroups.Add(new STGenericPolygonGroup()
|
||||
{
|
||||
MaterialIndex = mesh.MaterialIndex,
|
||||
faces = faces,
|
||||
});
|
||||
}
|
||||
else
|
||||
{
|
||||
mesh.PolygonGroups.Add(new STGenericPolygonGroup()
|
||||
{
|
||||
MaterialIndex = mesh.MaterialIndex,
|
||||
faces = lod.faces,
|
||||
});
|
||||
|
||||
meshes.Add(mesh);
|
||||
}
|
||||
}
|
||||
return meshes;
|
||||
}
|
||||
|
||||
private void SetupMaterial(STGenericMaterial importedMaterial, Material newMaterial, List<string> textures)
|
||||
{
|
||||
return;
|
||||
|
||||
//Here all we want is the diffuse texture and swap them
|
||||
foreach (var texMap in importedMaterial.TextureMaps)
|
||||
{
|
||||
var diffuseTex = newMaterial.TextureMaps.FirstOrDefault(x =>
|
||||
x.Sampler == "Col0Tex" || x.Sampler == "BaseColor0");
|
||||
if (diffuseTex != null) {
|
||||
diffuseTex.Index = (uint)textures.IndexOf(texMap.Name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void ImportModel(GFLXModelImporter importer,
|
||||
List<STGenericMaterial> importedMaterials, List<STGenericObject> importedMeshes,
|
||||
STSkeleton skeleton)
|
||||
{
|
||||
Model.Model.Groups.Clear();
|
||||
Model.Model.Meshes.Clear();
|
||||
|
||||
List<string> textures = Model.Textures.ToList();
|
||||
foreach (var mat in importedMaterials)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
var meshes = GeneratePolygonGroups(importedMeshes, importedMaterials, textures, importer.Settings);
|
||||
|
||||
//Once mesh groups are merged search for bone nodes
|
||||
//The bone section is basically a node tree
|
||||
//Which contains nodes for meshes
|
||||
//We need to remove the original and replace with new ones
|
||||
//Then index these in our mesh groups
|
||||
if (importer.ImportNewBones)
|
||||
{
|
||||
//Clear the original bones and nodes
|
||||
Model.Skeleton.bones.Clear();
|
||||
Model.Model.Bones.Clear();
|
||||
|
||||
List<int> SkinningIndices = new List<int>();
|
||||
foreach (var genericBone in skeleton.bones)
|
||||
{
|
||||
var scale = genericBone.scale;
|
||||
var trans = genericBone.position;
|
||||
var rot = genericBone.rotation;
|
||||
|
||||
Bone bone = new Bone();
|
||||
bone.Name = genericBone.Text;
|
||||
bone.BoneType = 0;
|
||||
bone.Parent = genericBone.parentIndex;
|
||||
bone.Zero = 0;
|
||||
bone.Visible = false;
|
||||
bone.Scale = new GFMDLStructs.Vector3(scale[0], scale[1], scale[2]);
|
||||
bone.Rotation = new GFMDLStructs.Vector3(rot[0], rot[1], rot[2]);
|
||||
bone.Translation = new GFMDLStructs.Vector3(trans[0], trans[1], trans[2]);
|
||||
bone.RadiusStart = new GFMDLStructs.Vector3(0, 0, 0);
|
||||
bone.RadiusEnd = new GFMDLStructs.Vector3(0, 0, 0);
|
||||
bone.RigidCheck = new BoneRigidData() { Unknown1 = 0 };
|
||||
|
||||
//Check if the bone is rigged
|
||||
for (int i = 0; i < meshes.Count; i++)
|
||||
{
|
||||
if (meshes[i].vertices.Any(x => x.boneNames.Contains(bone.Name))) {
|
||||
bone.BoneType = 1;
|
||||
bone.RigidCheck = null;
|
||||
}
|
||||
}
|
||||
|
||||
Model.Model.Bones.Add(bone);
|
||||
}
|
||||
}
|
||||
|
||||
Dictionary<string, int> NodeIndices = new Dictionary<string, int>();
|
||||
|
||||
//Go through each bone and remove the original mesh node
|
||||
for (int i = 0; i < Model.Skeleton.bones.Count; i++)
|
||||
{
|
||||
var node = (GFLXBone)Model.Skeleton.bones[i];
|
||||
if (Model.GenericMeshes.Any(x => x.Text == node.Text))
|
||||
{
|
||||
NodeIndices.Add(node.Text, i);
|
||||
Console.WriteLine($"match {node.Text}");
|
||||
Model.Model.Bones.Remove(node.Bone);
|
||||
Model.Skeleton.bones.Remove(node);
|
||||
}
|
||||
|
||||
/* if (Model.Model.CollisionGroups?.Count != 0)
|
||||
{
|
||||
var collisionGroups = Model.Model.CollisionGroups;
|
||||
for (int c = 0; c < collisionGroups.Count; c++)
|
||||
{
|
||||
if (collisionGroups[c].BoneIndex == i)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
}*/
|
||||
}
|
||||
|
||||
// Model.Model.CollisionGroups = new List<CollisionGroup>();
|
||||
|
||||
List<int> skinningIndices = Model.GenerateSkinningIndices();
|
||||
|
||||
List<string> unmappedBones = new List<string>();
|
||||
|
||||
foreach (var mesh in meshes)
|
||||
{
|
||||
for (int i = 0; i < mesh.vertices.Count; i++)
|
||||
{
|
||||
if (importer.RotationY != 0)
|
||||
{
|
||||
var transform = OpenTK.Matrix4.CreateRotationX(OpenTK.MathHelper.DegreesToRadians(importer.RotationY));
|
||||
mesh.vertices[i].pos = OpenTK.Vector3.TransformPosition(mesh.vertices[i].pos, transform);
|
||||
mesh.vertices[i].nrm = OpenTK.Vector3.TransformPosition(mesh.vertices[i].nrm, transform);
|
||||
}
|
||||
|
||||
for (int j = 0; j < mesh.vertices[i].boneNames?.Count; j++)
|
||||
{
|
||||
string boneName = mesh.vertices[i].boneNames[j];
|
||||
int boneIndex = Model.Model.Bones.IndexOf(Model.Model.Bones.Where(p => p.Name == boneName).FirstOrDefault());
|
||||
|
||||
if (boneIndex != -1)
|
||||
mesh.vertices[i].boneIds.Add(boneIndex);
|
||||
else
|
||||
{
|
||||
if (!unmappedBones.Contains(boneName))
|
||||
unmappedBones.Add(boneName);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//Now add brand new mesh nodes
|
||||
foreach (var mesh in meshes)
|
||||
{
|
||||
int index = meshes.IndexOf(mesh);
|
||||
|
||||
var setting = importer.Settings.MeshSettings[index];
|
||||
|
||||
Bone bone = new Bone();
|
||||
bone.Name = mesh.ObjectName;
|
||||
bone.BoneType = 0;
|
||||
bone.Parent = 0;
|
||||
bone.Zero = 0;
|
||||
bone.Visible = false;
|
||||
bone.Scale = new GFMDLStructs.Vector3(1, 1, 1);
|
||||
bone.Rotation = new GFMDLStructs.Vector3(0, 0, 0);
|
||||
bone.Translation = new GFMDLStructs.Vector3(0,0,0);
|
||||
bone.RadiusStart = new GFMDLStructs.Vector3(0, 0, 0);
|
||||
bone.RadiusEnd = new GFMDLStructs.Vector3(0, 0, 0);
|
||||
bone.RigidCheck = new BoneRigidData();
|
||||
|
||||
int NodeIndex = Model.Model.Bones.IndexOf(bone);
|
||||
Model.Model.Bones.Add(bone);
|
||||
|
||||
//Now create the associated group
|
||||
var group = new Group();
|
||||
group.Bounding = Model.GenerateBoundingBox(mesh);
|
||||
group.BoneIndex = (uint)NodeIndex;
|
||||
group.MeshIndex = (uint)index;
|
||||
group.Layer = 0;
|
||||
Model.Model.Groups.Add(group);
|
||||
|
||||
//Now create our mesh data
|
||||
var meshData = new Mesh();
|
||||
Model.Model.Meshes.Add(meshData);
|
||||
|
||||
if (setting.HasBitangents)
|
||||
{
|
||||
try {
|
||||
mesh.CalculateTangentBitangent(false);
|
||||
}
|
||||
catch { }
|
||||
}
|
||||
|
||||
//Add attributes based on settings
|
||||
IList<MeshAttribute> attributes = new List<MeshAttribute>();
|
||||
attributes.Add(new MeshAttribute()
|
||||
{
|
||||
VertexType = (uint)VertexType.Position,
|
||||
BufferFormat = (uint)setting.PositionFormat,
|
||||
ElementCount = 3,
|
||||
});
|
||||
|
||||
if (setting.HasNormals) {
|
||||
attributes.Add(new MeshAttribute()
|
||||
{
|
||||
VertexType = (uint)VertexType.Normal,
|
||||
BufferFormat = (uint)setting.NormalFormat,
|
||||
ElementCount = 4,
|
||||
});
|
||||
}
|
||||
|
||||
if (setting.HasTexCoord1) {
|
||||
attributes.Add(new MeshAttribute()
|
||||
{
|
||||
VertexType = (uint)VertexType.UV1,
|
||||
BufferFormat = (uint)setting.TexCoord1Format,
|
||||
ElementCount = 2,
|
||||
});
|
||||
}
|
||||
if (setting.HasTexCoord2) {
|
||||
attributes.Add(new MeshAttribute()
|
||||
{
|
||||
VertexType = (uint)VertexType.UV2,
|
||||
BufferFormat = (uint)setting.TexCoord2Format,
|
||||
ElementCount = 2,
|
||||
});
|
||||
}
|
||||
if (setting.HasTexCoord3) {
|
||||
attributes.Add(new MeshAttribute()
|
||||
{
|
||||
VertexType = (uint)VertexType.UV3,
|
||||
BufferFormat = (uint)setting.TexCoord3Format,
|
||||
ElementCount = 2,
|
||||
});
|
||||
}
|
||||
if (setting.HasTexCoord4) {
|
||||
attributes.Add(new MeshAttribute()
|
||||
{
|
||||
VertexType = (uint)VertexType.UV4,
|
||||
BufferFormat = (uint)setting.TexCoord4Format,
|
||||
ElementCount = 2,
|
||||
});
|
||||
}
|
||||
if (setting.HasColor1) {
|
||||
attributes.Add(new MeshAttribute()
|
||||
{
|
||||
VertexType = (uint)VertexType.Color1,
|
||||
BufferFormat = (uint)setting.Color1Format,
|
||||
ElementCount = 4,
|
||||
});
|
||||
}
|
||||
if (setting.HasColor2) {
|
||||
attributes.Add(new MeshAttribute()
|
||||
{
|
||||
VertexType = (uint)VertexType.Color2,
|
||||
BufferFormat = (uint)setting.Color2Format,
|
||||
ElementCount = 4,
|
||||
});
|
||||
}
|
||||
if (setting.HasBitangents) {
|
||||
attributes.Add(new MeshAttribute()
|
||||
{
|
||||
VertexType = (uint)VertexType.Binormal,
|
||||
BufferFormat = (uint)setting.BitangentnFormat,
|
||||
ElementCount = 4,
|
||||
});
|
||||
}
|
||||
if (setting.HasWeights) {
|
||||
attributes.Add(new MeshAttribute()
|
||||
{
|
||||
VertexType = (uint)VertexType.BoneWeight,
|
||||
BufferFormat = (uint)setting.BoneWeightFormat,
|
||||
ElementCount = 4,
|
||||
});
|
||||
}
|
||||
if (setting.HasBoneIndices) {
|
||||
attributes.Add(new MeshAttribute()
|
||||
{
|
||||
VertexType = (uint)VertexType.BoneID,
|
||||
BufferFormat = (uint)setting.BoneIndexFormat,
|
||||
ElementCount = 4,
|
||||
});
|
||||
}
|
||||
if (setting.HasTangents) {
|
||||
attributes.Add(new MeshAttribute()
|
||||
{
|
||||
VertexType = (uint)VertexType.Tangents,
|
||||
BufferFormat = (uint)setting.TangentsFormat,
|
||||
ElementCount = 4,
|
||||
});
|
||||
}
|
||||
|
||||
meshData.Attributes = attributes;
|
||||
meshData.SetData(GFLXMeshBufferHelper.CreateVertexDataBuffer(mesh, skinningIndices, attributes));
|
||||
|
||||
//Lastly add the polygon groups
|
||||
foreach (var poly in mesh.PolygonGroups)
|
||||
{
|
||||
List<ushort> faces = new List<ushort>();
|
||||
for (int f = 0; f < poly.faces.Count; f++)
|
||||
faces.Add((ushort)poly.faces[f]);
|
||||
|
||||
if (poly.MaterialIndex < 0)
|
||||
poly.MaterialIndex = 0;
|
||||
|
||||
meshData.Polygons = new List<MeshPolygon>();
|
||||
meshData.Polygons.Add(new MeshPolygon()
|
||||
{
|
||||
MaterialIndex = (uint)poly.MaterialIndex,
|
||||
Faces = faces,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
foreach (var bone in unmappedBones)
|
||||
Console.WriteLine($"unmapped bone! {bone}");
|
||||
|
||||
Console.WriteLine($"");
|
||||
|
||||
//Generate bounding box
|
||||
Model.GenerateBoundingBox();
|
||||
ReloadModel(Model.Model);
|
||||
|
||||
Model.UpdateVertexData(true);
|
||||
}
|
||||
|
||||
public void ExportModel(string fileName, DAE.ExportSettings settings)
|
||||
{
|
||||
var model = new STGenericModel();
|
||||
model.Materials = Model.GenericMaterials;
|
||||
model.Objects = Model.GenericMeshes;
|
||||
var textures = new List<STGenericTexture>();
|
||||
foreach (var bntx in PluginRuntime.bntxContainers)
|
||||
foreach (var tex in bntx.Textures.Values)
|
||||
{
|
||||
if (Model.Textures.Contains(tex.Text))
|
||||
textures.Add(tex);
|
||||
}
|
||||
|
||||
foreach (var mesh in model.Objects)
|
||||
{
|
||||
foreach (var poly in mesh.PolygonGroups)
|
||||
{
|
||||
GFLXMaterialData mat = (GFLXMaterialData)poly.Material;
|
||||
var faces = poly.GetDisplayFace();
|
||||
for (int v = 0; v < poly.displayFaceSize; v += 3)
|
||||
{
|
||||
if (faces.Count < v + 2)
|
||||
break;
|
||||
|
||||
var diffuse = mat.TextureMaps.FirstOrDefault(x => x.Type == STGenericMatTexture.TextureType.Diffuse);
|
||||
STTextureTransform transform = new STTextureTransform();
|
||||
if (diffuse != null)
|
||||
transform = diffuse.Transform;
|
||||
|
||||
mesh.vertices[faces[v]].uv0 += transform.Translate * transform.Scale;
|
||||
mesh.vertices[faces[v + 1]].uv0 += transform.Translate * transform.Scale;
|
||||
mesh.vertices[faces[v + 2]].uv0 += transform.Translate * transform.Scale;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
DAE.Export(fileName, settings, model, textures, Model.Skeleton);
|
||||
}
|
||||
|
||||
public void Unload()
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
}
|
|
@ -8,6 +8,7 @@ using Toolbox.Library.Rendering;
|
|||
using OpenTK;
|
||||
using Toolbox.Library.Forms;
|
||||
using System.Windows.Forms;
|
||||
using FirstPlugin.Forms;
|
||||
|
||||
namespace FirstPlugin
|
||||
{
|
||||
|
@ -18,8 +19,17 @@ namespace FirstPlugin
|
|||
|
||||
public GFLXModel ParentModel { get; set; }
|
||||
|
||||
public FlatBuffers.Gfbmdl.Mesh MeshData { get; set; }
|
||||
public FlatBuffers.Gfbmdl.Group GroupData { get; set; }
|
||||
public GFBANM.MeshAnimationController AnimationController = new GFBANM.MeshAnimationController();
|
||||
|
||||
public Matrix4 Transform { get; set; }
|
||||
|
||||
public GFMDLStructs.Mesh MeshData { get; set; }
|
||||
public GFMDLStructs.Group GroupData { get; set; }
|
||||
|
||||
public override void OnClick(TreeView treeView) {
|
||||
var editor = ParentModel.LoadEditor<GFLXMeshEditor>();
|
||||
editor.LoadMesh(this);
|
||||
}
|
||||
|
||||
public GFLXMaterialData GetMaterial(STGenericPolygonGroup polygroup)
|
||||
{
|
||||
|
@ -31,11 +41,35 @@ namespace FirstPlugin
|
|||
List<ToolStripItem> Items = new List<ToolStripItem>();
|
||||
var uvMenu = new ToolStripMenuItem("UVs");
|
||||
Items.Add(uvMenu);
|
||||
|
||||
Items.Add(new ToolStripMenuItem("Recalculate Bitangents", null, CalculateTangentBitangenAction, Keys.Control | Keys.T));
|
||||
uvMenu.DropDownItems.Add(new ToolStripMenuItem("Flip Vertical", null, FlipVerticalAction, Keys.Control | Keys.V));
|
||||
uvMenu.DropDownItems.Add(new ToolStripMenuItem("Flip Horizontal", null, FlipHorizontalAction, Keys.Control | Keys.H));
|
||||
var colorMenu = new ToolStripMenuItem("Vertex Colors");
|
||||
colorMenu.DropDownItems.Add(new ToolStripMenuItem("Set Color", null, SetVertexColorDialog, Keys.Control | Keys.C));
|
||||
Items.Add(colorMenu);
|
||||
|
||||
return Items.ToArray();
|
||||
}
|
||||
|
||||
private void SetVertexColorDialog(object sender, EventArgs args)
|
||||
{
|
||||
if (!MeshData.Attributes.Any(x => x.VertexType == (uint)GFMDLStructs.VertexType.Color1))
|
||||
return;
|
||||
|
||||
ColorDialog dlg = new ColorDialog();
|
||||
|
||||
if (dlg.ShowDialog() == DialogResult.OK) {
|
||||
SetVertexColor(new Vector4(
|
||||
dlg.Color.R / 255.0f,
|
||||
dlg.Color.G / 255.0f,
|
||||
dlg.Color.B / 255.0f,
|
||||
dlg.Color.A / 255.0f));
|
||||
|
||||
UpdateMesh();
|
||||
}
|
||||
}
|
||||
|
||||
private void FlipVerticalAction(object sender, EventArgs args) {
|
||||
this.FlipUvsVertical();
|
||||
UpdateMesh();
|
||||
|
@ -46,9 +80,16 @@ namespace FirstPlugin
|
|||
UpdateMesh();
|
||||
}
|
||||
|
||||
private void CalculateTangentBitangenAction(object sender, EventArgs args)
|
||||
{
|
||||
this.CalculateTangentBitangent(false);
|
||||
UpdateMesh();
|
||||
}
|
||||
|
||||
|
||||
private void UpdateMesh() {
|
||||
MeshData.SetData(GFLXMeshBufferHelper.CreateVertexDataBuffer(this));
|
||||
ParentModel.UpdateVertexData(true);
|
||||
GFLXMeshBufferHelper.ReloadVertexData(this);
|
||||
}
|
||||
|
||||
public struct DisplayVertex
|
||||
|
@ -69,8 +110,8 @@ namespace FirstPlugin
|
|||
}
|
||||
|
||||
public GFLXMesh(GFLXModel model,
|
||||
FlatBuffers.Gfbmdl.Group group,
|
||||
FlatBuffers.Gfbmdl.Mesh mesh)
|
||||
GFMDLStructs.Group group,
|
||||
GFMDLStructs.Mesh mesh)
|
||||
{
|
||||
ParentModel = model;
|
||||
GroupData = group;
|
|
@ -1,102 +1,205 @@
|
|||
using System;
|
||||
using FirstPlugin.GFMDLStructs;
|
||||
using FlatBuffers;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using Toolbox.Library.IO;
|
||||
using OpenTK;
|
||||
using FlatBuffers.Gfbmdl;
|
||||
using Toolbox.Library.Rendering;
|
||||
using Toolbox.Library;
|
||||
using Toolbox.Library.IO;
|
||||
using Toolbox.Library.Rendering;
|
||||
using System.Linq;
|
||||
|
||||
namespace FirstPlugin
|
||||
{
|
||||
public class GFLXMeshBufferHelper
|
||||
{
|
||||
public static void ReloadVertexData(GFLXMesh mesh)
|
||||
public static byte[] CreateVertexDataBuffer(GFLXMesh mesh)
|
||||
{
|
||||
var flatMesh = mesh.MeshData;
|
||||
var buf = flatMesh.ByteBuffer;
|
||||
for (int v = 0; v < mesh.vertices.Count; v++)
|
||||
var meshData = mesh.MeshData;
|
||||
|
||||
//Get all the bones from model and create skin index list
|
||||
List<int> SkinningIndices = new List<int>();
|
||||
foreach (GFLXBone bone in mesh.ParentModel.Skeleton.bones)
|
||||
{
|
||||
// flatMesh.ByteBuffer.PutByte();
|
||||
// flatMesh.Data(v);
|
||||
if (bone.HasSkinning)
|
||||
SkinningIndices.Add(mesh.ParentModel.Skeleton.bones.IndexOf(bone));
|
||||
}
|
||||
|
||||
return CreateVertexDataBuffer(mesh, SkinningIndices, mesh.MeshData.Attributes);
|
||||
}
|
||||
|
||||
public static byte[] CreateVertexDataBuffer(STGenericObject mesh, List<int> SkinningIndices, IList<MeshAttribute> attributes)
|
||||
{
|
||||
|
||||
var mem = new System.IO.MemoryStream();
|
||||
using (var writer = new FileWriter(mem))
|
||||
{
|
||||
//Generate a buffer based on the attributes used
|
||||
for (int v = 0; v < mesh.vertices.Count; v++)
|
||||
{
|
||||
for (int a = 0; a < attributes.Count; a++)
|
||||
{
|
||||
uint numAttributes = attributes[a].ElementCount;
|
||||
|
||||
List<float> values = new List<float>();
|
||||
switch ((VertexType)attributes[a].VertexType)
|
||||
{
|
||||
case VertexType.Position:
|
||||
values.Add(mesh.vertices[v].pos.X);
|
||||
values.Add(mesh.vertices[v].pos.Y);
|
||||
values.Add(mesh.vertices[v].pos.Z);
|
||||
break;
|
||||
case VertexType.Normal:
|
||||
values.Add(mesh.vertices[v].nrm.X);
|
||||
values.Add(mesh.vertices[v].nrm.Y);
|
||||
values.Add(mesh.vertices[v].nrm.Z);
|
||||
values.Add(0);
|
||||
// values.Add(((GFLXMesh.GFLXVertex)mesh.vertices[v]).NormalW);
|
||||
break;
|
||||
case VertexType.Color1:
|
||||
values.Add(mesh.vertices[v].col.X * 255);
|
||||
values.Add(mesh.vertices[v].col.Y * 255);
|
||||
values.Add(mesh.vertices[v].col.Z * 255);
|
||||
values.Add(mesh.vertices[v].col.W * 255);
|
||||
break;
|
||||
case VertexType.UV1:
|
||||
values.Add(mesh.vertices[v].uv0.X);
|
||||
values.Add(1 - mesh.vertices[v].uv0.Y);
|
||||
break;
|
||||
case VertexType.UV2:
|
||||
values.Add(mesh.vertices[v].uv1.X);
|
||||
values.Add(1 - mesh.vertices[v].uv1.Y);
|
||||
break;
|
||||
case VertexType.UV3:
|
||||
values.Add(mesh.vertices[v].uv2.X);
|
||||
values.Add(1 - mesh.vertices[v].uv2.Y);
|
||||
break;
|
||||
case VertexType.UV4:
|
||||
values.Add(mesh.vertices[v].uv3.X);
|
||||
values.Add(1 - mesh.vertices[v].uv3.Y);
|
||||
break;
|
||||
case VertexType.BoneWeight:
|
||||
var weights = mesh.vertices[v].boneWeights;
|
||||
for (int b = 0; b < numAttributes; b++)
|
||||
{
|
||||
if (weights.Count > b)
|
||||
values.Add(weights[b]);
|
||||
else
|
||||
values.Add(0);
|
||||
}
|
||||
break;
|
||||
case VertexType.BoneID:
|
||||
var boneIds = mesh.vertices[v].boneIds;
|
||||
for (int b = 0; b < numAttributes; b++)
|
||||
{
|
||||
if (boneIds.Count > b)
|
||||
values.Add(SkinningIndices.IndexOf(boneIds[b]));
|
||||
else
|
||||
values.Add(0);
|
||||
}
|
||||
break;
|
||||
case VertexType.Binormal:
|
||||
values.Add(mesh.vertices[v].bitan.X);
|
||||
values.Add(mesh.vertices[v].bitan.Y);
|
||||
values.Add(mesh.vertices[v].bitan.Z);
|
||||
values.Add(mesh.vertices[v].bitan.W);
|
||||
break;
|
||||
case VertexType.Color2:
|
||||
values.Add(mesh.vertices[v].col2.X * 255);
|
||||
values.Add(mesh.vertices[v].col2.Y * 255);
|
||||
values.Add(mesh.vertices[v].col2.Z * 255);
|
||||
values.Add(mesh.vertices[v].col2.W * 255);
|
||||
break;
|
||||
case VertexType.Tangents:
|
||||
values.Add(mesh.vertices[v].tan.X);
|
||||
values.Add(mesh.vertices[v].tan.Y);
|
||||
values.Add(mesh.vertices[v].tan.Z);
|
||||
values.Add(mesh.vertices[v].tan.W);
|
||||
break;
|
||||
default:
|
||||
throw new Exception("unsupported format!");
|
||||
}
|
||||
|
||||
|
||||
WriteBuffer(writer, numAttributes, values.ToArray(),
|
||||
(BufferFormat)attributes[a].BufferFormat, (VertexType)attributes[a].VertexType);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return mem.ToArray();
|
||||
}
|
||||
|
||||
public static uint GetTotalBufferStride(Mesh mesh)
|
||||
{
|
||||
uint VertBufferStride = 0;
|
||||
for (int i = 0; i < mesh.AlignmentsLength; i++)
|
||||
for (int i = 0; i < mesh.Attributes?.Count; i++)
|
||||
{
|
||||
var attribute = mesh.Alignments(i).Value;
|
||||
switch (attribute.TypeID)
|
||||
var attribute = mesh.Attributes[i];
|
||||
switch ((VertexType)attribute.VertexType)
|
||||
{
|
||||
case VertexType.Position:
|
||||
if (attribute.FormatID == BufferFormat.HalfFloat)
|
||||
if (attribute.BufferFormat == (uint)BufferFormat.HalfFloat)
|
||||
VertBufferStride += 0x08;
|
||||
else if (attribute.FormatID == BufferFormat.Float)
|
||||
else if (attribute.BufferFormat == (uint)BufferFormat.Float)
|
||||
VertBufferStride += 0x0C;
|
||||
else
|
||||
throw new Exception($"Unknown Combination! {attribute.TypeID} {attribute.FormatID}");
|
||||
throw new Exception($"Unknown Combination! {attribute.VertexType} {attribute.BufferFormat}");
|
||||
break;
|
||||
case VertexType.Normal:
|
||||
if (attribute.FormatID == BufferFormat.HalfFloat)
|
||||
if (attribute.BufferFormat == (uint)BufferFormat.HalfFloat)
|
||||
VertBufferStride += 0x08;
|
||||
else if (attribute.FormatID == BufferFormat.Float)
|
||||
else if (attribute.BufferFormat == (uint)BufferFormat.Float)
|
||||
VertBufferStride += 0x0C;
|
||||
else
|
||||
throw new Exception($"Unknown Combination! {attribute.TypeID} {attribute.FormatID}");
|
||||
throw new Exception($"Unknown Combination! {attribute.VertexType} {attribute.BufferFormat}");
|
||||
break;
|
||||
case VertexType.Binormal:
|
||||
if (attribute.FormatID == BufferFormat.HalfFloat)
|
||||
if (attribute.BufferFormat == (uint)BufferFormat.HalfFloat)
|
||||
VertBufferStride += 0x08;
|
||||
else if (attribute.FormatID == BufferFormat.Float)
|
||||
else if (attribute.BufferFormat == (uint)BufferFormat.Float)
|
||||
VertBufferStride += 0x0C;
|
||||
else
|
||||
throw new Exception($"Unknown Combination! {attribute.TypeID} {attribute.FormatID}");
|
||||
throw new Exception($"Unknown Combination! {attribute.VertexType} {attribute.BufferFormat}");
|
||||
break;
|
||||
case VertexType.UV1:
|
||||
case VertexType.UV2:
|
||||
case VertexType.UV3:
|
||||
case VertexType.UV4:
|
||||
if (attribute.FormatID == BufferFormat.HalfFloat)
|
||||
if (attribute.BufferFormat == (uint)BufferFormat.HalfFloat)
|
||||
VertBufferStride += 0x04;
|
||||
else if (attribute.FormatID == BufferFormat.Float)
|
||||
else if (attribute.BufferFormat == (uint)BufferFormat.Float)
|
||||
VertBufferStride += 0x08;
|
||||
else
|
||||
throw new Exception($"Unknown Combination! {attribute.TypeID} {attribute.FormatID}");
|
||||
throw new Exception($"Unknown Combination! {attribute.VertexType} {attribute.BufferFormat}");
|
||||
break;
|
||||
case VertexType.Color1:
|
||||
case VertexType.Color2:
|
||||
if (attribute.FormatID == BufferFormat.Byte)
|
||||
if (attribute.BufferFormat == (uint)BufferFormat.Byte)
|
||||
VertBufferStride += 0x04;
|
||||
else
|
||||
throw new Exception($"Unknown Combination! {attribute.TypeID} {attribute.FormatID}");
|
||||
throw new Exception($"Unknown Combination! {attribute.VertexType} {attribute.BufferFormat}");
|
||||
break;
|
||||
case VertexType.BoneID:
|
||||
if (attribute.FormatID == BufferFormat.Short)
|
||||
if (attribute.BufferFormat == (uint)BufferFormat.Short)
|
||||
VertBufferStride += 0x08;
|
||||
else if (attribute.FormatID == BufferFormat.Byte)
|
||||
else if (attribute.BufferFormat == (uint)BufferFormat.Byte)
|
||||
VertBufferStride += 0x04;
|
||||
else
|
||||
throw new Exception($"Unknown Combination! {attribute.TypeID} {attribute.FormatID}");
|
||||
throw new Exception($"Unknown Combination! {attribute.VertexType} {attribute.BufferFormat}");
|
||||
break;
|
||||
case VertexType.BoneWeight:
|
||||
if (attribute.FormatID == BufferFormat.BytesAsFloat)
|
||||
if (attribute.BufferFormat == (uint)BufferFormat.BytesAsFloat)
|
||||
VertBufferStride += 0x04;
|
||||
else
|
||||
throw new Exception($"Unknown Combination! {attribute.TypeID} {attribute.FormatID}");
|
||||
throw new Exception($"Unknown Combination! {attribute.VertexType} {attribute.BufferFormat}");
|
||||
break;
|
||||
case VertexType.Tangents:
|
||||
if (attribute.BufferFormat == (uint)BufferFormat.HalfFloat)
|
||||
VertBufferStride += 0x08;
|
||||
else
|
||||
throw new Exception($"Unknown Combination! {attribute.VertexType} {attribute.BufferFormat}");
|
||||
break;
|
||||
default:
|
||||
Console.WriteLine($"attribute.FormatID {attribute.FormatID}");
|
||||
if (attribute.FormatID == BufferFormat.HalfFloat)
|
||||
VertBufferStride += 0x08;
|
||||
else if (attribute.FormatID == BufferFormat.Float)
|
||||
VertBufferStride += 0x0C;
|
||||
else
|
||||
throw new Exception($"Unknown Combination! {attribute.TypeID} {attribute.FormatID}");
|
||||
break;
|
||||
throw new Exception($"Unknown Combination! {attribute.VertexType} {attribute.BufferFormat}");
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -109,7 +212,7 @@ namespace FirstPlugin
|
|||
|
||||
uint VertBufferStride = GetTotalBufferStride(mesh);
|
||||
|
||||
using (var reader = new FileReader(mesh.GetDataArray()))
|
||||
using (var reader = new FileReader(mesh.Data.ToArray()))
|
||||
{
|
||||
uint numVertex = (uint)reader.BaseStream.Length / VertBufferStride;
|
||||
for (int v = 0; v < numVertex; v++)
|
||||
|
@ -117,39 +220,41 @@ namespace FirstPlugin
|
|||
Vertex vertex = new Vertex();
|
||||
Vertices.Add(vertex);
|
||||
|
||||
for (int att = 0; att < mesh.AlignmentsLength; att++)
|
||||
for (int att = 0; att < mesh.Attributes?.Count; att++)
|
||||
{
|
||||
var attribute = mesh.Alignments(att).Value;
|
||||
var attribute = mesh.Attributes[att];
|
||||
|
||||
switch (attribute.TypeID)
|
||||
switch ((VertexType)attribute.VertexType)
|
||||
{
|
||||
case VertexType.Position:
|
||||
var pos = ParseBuffer(reader, attribute.FormatID, attribute.TypeID);
|
||||
var pos = ParseBuffer(reader, attribute.BufferFormat, attribute.VertexType, attribute.ElementCount);
|
||||
vertex.pos = new OpenTK.Vector3(pos.X, pos.Y, pos.Z);
|
||||
vertex.pos = OpenTK.Vector3.TransformPosition(vertex.pos, transform);
|
||||
break;
|
||||
case VertexType.Normal:
|
||||
var normal = ParseBuffer(reader, attribute.FormatID, attribute.TypeID);
|
||||
var normal = ParseBuffer(reader, attribute.BufferFormat, attribute.VertexType, attribute.ElementCount);
|
||||
vertex.nrm = new OpenTK.Vector3(normal.X, normal.Y, normal.Z);
|
||||
vertex.normalW = normal.W;
|
||||
vertex.nrm = OpenTK.Vector3.TransformNormal(vertex.nrm, transform);
|
||||
break;
|
||||
case VertexType.UV1:
|
||||
var texcoord1 = ParseBuffer(reader, attribute.FormatID, attribute.TypeID);
|
||||
var texcoord1 = ParseBuffer(reader, attribute.BufferFormat, attribute.VertexType, attribute.ElementCount);
|
||||
vertex.uv0 = new OpenTK.Vector2(texcoord1.X, texcoord1.Y);
|
||||
break;
|
||||
case VertexType.UV2:
|
||||
var texcoord2 = ParseBuffer(reader, attribute.FormatID, attribute.TypeID);
|
||||
var texcoord2 = ParseBuffer(reader, attribute.BufferFormat, attribute.VertexType, attribute.ElementCount);
|
||||
vertex.uv1 = new OpenTK.Vector2(texcoord2.X, texcoord2.Y);
|
||||
break;
|
||||
case VertexType.UV3:
|
||||
var texcoord3 = ParseBuffer(reader, attribute.FormatID, attribute.TypeID);
|
||||
var texcoord3 = ParseBuffer(reader, attribute.BufferFormat, attribute.VertexType, attribute.ElementCount);
|
||||
vertex.uv2 = new OpenTK.Vector2(texcoord3.X, texcoord3.Y);
|
||||
break;
|
||||
case VertexType.UV4:
|
||||
var texcoord4 = ParseBuffer(reader, attribute.FormatID, attribute.TypeID);
|
||||
var texcoord4 = ParseBuffer(reader, attribute.BufferFormat, attribute.VertexType, attribute.ElementCount);
|
||||
vertex.uv3 = new OpenTK.Vector2(texcoord4.X, texcoord4.Y);
|
||||
break;
|
||||
case VertexType.BoneWeight:
|
||||
var weights = ParseBuffer(reader, attribute.FormatID, attribute.TypeID);
|
||||
var weights = ParseBuffer(reader, attribute.BufferFormat, attribute.VertexType, attribute.ElementCount);
|
||||
vertex.boneWeights.AddRange(new float[]
|
||||
{
|
||||
weights.X,
|
||||
|
@ -159,7 +264,7 @@ namespace FirstPlugin
|
|||
});
|
||||
break;
|
||||
case VertexType.BoneID:
|
||||
var boneIndices = ParseBuffer(reader, attribute.FormatID, attribute.TypeID);
|
||||
var boneIndices = ParseBuffer(reader, attribute.BufferFormat, attribute.VertexType, attribute.ElementCount);
|
||||
vertex.boneIds.AddRange(new int[]
|
||||
{
|
||||
boneSkinningIds[(int)boneIndices.X],
|
||||
|
@ -170,24 +275,29 @@ namespace FirstPlugin
|
|||
break;
|
||||
case VertexType.Color1:
|
||||
OpenTK.Vector4 colors1 = new OpenTK.Vector4(1, 1, 1, 1);
|
||||
if (attribute.FormatID == BufferFormat.Byte)
|
||||
colors1 = ParseBuffer(reader, attribute.FormatID, attribute.TypeID);
|
||||
if (attribute.BufferFormat == (uint)BufferFormat.Byte)
|
||||
colors1 = ParseBuffer(reader, attribute.BufferFormat, attribute.VertexType, attribute.ElementCount);
|
||||
|
||||
vertex.col = colors1 / 255f;
|
||||
break;
|
||||
case VertexType.Color2:
|
||||
OpenTK.Vector4 colors2 = new OpenTK.Vector4(1, 1, 1, 1);
|
||||
if (attribute.FormatID == BufferFormat.Byte)
|
||||
colors2 = ParseBuffer(reader, attribute.FormatID, attribute.TypeID);
|
||||
if (attribute.BufferFormat == (uint)BufferFormat.Byte)
|
||||
colors2 = ParseBuffer(reader, attribute.BufferFormat, attribute.VertexType, attribute.ElementCount);
|
||||
|
||||
vertex.col2 = colors2 / 255f;
|
||||
break;
|
||||
case VertexType.Binormal:
|
||||
var binormals = ParseBuffer(reader, attribute.FormatID, attribute.TypeID);
|
||||
|
||||
var binormals = ParseBuffer(reader, attribute.BufferFormat, attribute.VertexType, attribute.ElementCount);
|
||||
vertex.bitan = new OpenTK.Vector4(binormals.X, binormals.Y, binormals.Z, binormals.W);
|
||||
break;
|
||||
case VertexType.Tangents:
|
||||
var tans = ParseBuffer(reader, attribute.BufferFormat, attribute.VertexType, attribute.ElementCount);
|
||||
vertex.tan = new OpenTK.Vector4(tans.X, tans.Y, tans.Z, tans.W);
|
||||
break;
|
||||
default:
|
||||
ParseBuffer(reader, attribute.FormatID, attribute.TypeID);
|
||||
var values = ParseBuffer(reader, attribute.BufferFormat, attribute.VertexType, attribute.ElementCount);
|
||||
vertex.Unknowns.Add(values);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -197,8 +307,11 @@ namespace FirstPlugin
|
|||
return Vertices;
|
||||
}
|
||||
|
||||
private static OpenTK.Vector4 ParseBuffer(FileReader reader, BufferFormat Format, VertexType AttributeType)
|
||||
private static OpenTK.Vector4 ParseBuffer(FileReader reader, uint format, uint attType, uint numElements)
|
||||
{
|
||||
VertexType AttributeType = (VertexType)attType;
|
||||
BufferFormat Format = (BufferFormat)format;
|
||||
|
||||
if (AttributeType == VertexType.Position)
|
||||
{
|
||||
switch (Format)
|
||||
|
@ -292,8 +405,34 @@ namespace FirstPlugin
|
|||
switch (Format)
|
||||
{
|
||||
case BufferFormat.HalfFloat:
|
||||
return new OpenTK.Vector4(reader.ReadHalfSingle(), reader.ReadHalfSingle(),
|
||||
reader.ReadHalfSingle(), reader.ReadHalfSingle());
|
||||
float[] values = new float[4];
|
||||
for (int i = 0; i < numElements; i++)
|
||||
values[i] = reader.ReadHalfSingle();
|
||||
|
||||
return new OpenTK.Vector4(values[0], values[1], values[2], values[3]);
|
||||
default:
|
||||
throw new Exception($"Unknown Combination! {AttributeType} {Format}");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private static void WriteBuffer(FileWriter writer, uint ElementCount, float[] value, BufferFormat Format, VertexType AttributeType)
|
||||
{
|
||||
for (int i = 0; i < ElementCount; i++)
|
||||
{
|
||||
switch (Format)
|
||||
{
|
||||
case BufferFormat.Float:
|
||||
writer.Write(value[i]); break;
|
||||
case BufferFormat.HalfFloat:
|
||||
writer.WriteHalfFloat(value[i]); break;
|
||||
case BufferFormat.Byte:
|
||||
writer.Write((byte)value[i]); break;
|
||||
case BufferFormat.Short:
|
||||
writer.Write((short)value[i]); break;
|
||||
case BufferFormat.BytesAsFloat:
|
||||
writer.Write((byte)(value[i] * 255)); break;
|
||||
default:
|
||||
throw new Exception($"Unknown Combination! {AttributeType} {Format}");
|
||||
}
|
508
File_Format_Library/FileFormats/Pokemon/GFLX/GFBMDL/GFLXModel.cs
Normal file
508
File_Format_Library/FileFormats/Pokemon/GFLX/GFBMDL/GFLXModel.cs
Normal file
|
@ -0,0 +1,508 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Forms;
|
||||
using Toolbox.Library;
|
||||
using Toolbox.Library.IO;
|
||||
using Toolbox.Library.Rendering;
|
||||
using FirstPlugin.Forms;
|
||||
using FirstPlugin.GFMDLStructs;
|
||||
using Newtonsoft.Json;
|
||||
|
||||
namespace FirstPlugin
|
||||
{
|
||||
public class GFLXModel
|
||||
{
|
||||
public GFBMDL ParentFile;
|
||||
|
||||
public List<GFLXMaterialData> GenericMaterials = new List<GFLXMaterialData>();
|
||||
public List<GFLXMesh> GenericMeshes = new List<GFLXMesh>();
|
||||
|
||||
public STSkeleton Skeleton = new STSkeleton();
|
||||
|
||||
public Model Model;
|
||||
|
||||
public IList<string> Textures
|
||||
{
|
||||
get { return Model.TextureNames; }
|
||||
set { Model.TextureNames = value; }
|
||||
}
|
||||
|
||||
public IList<string> Shaders
|
||||
{
|
||||
get { return Model.ShaderNames; }
|
||||
set { Model.ShaderNames = value; }
|
||||
}
|
||||
|
||||
public T LoadEditor<T>() where T :
|
||||
System.Windows.Forms.UserControl, new()
|
||||
{
|
||||
return ParentFile.LoadEditor<T>();
|
||||
}
|
||||
|
||||
public void UpdateVertexData(bool updateViewport) {
|
||||
ParentFile.Renderer.UpdateVertexData();
|
||||
|
||||
if (updateViewport)
|
||||
LibraryGUI.UpdateViewport();
|
||||
}
|
||||
|
||||
public void LoadFile(Model model, GFBMDL file, GFBMDL_Render Renderer) {
|
||||
Model = model;
|
||||
ParentFile = file;
|
||||
|
||||
for (int m = 0; m < Model.Materials?.Count; m++) {
|
||||
GenericMaterials.Add(new GFLXMaterialData(this, Model.Materials[m]));
|
||||
}
|
||||
|
||||
List<int> SkinningIndices = new List<int>();
|
||||
|
||||
for (int b = 0; b < Model.Bones?.Count; b++) {
|
||||
var bone = Model.Bones[b];
|
||||
Skeleton.bones.Add(new GFLXBone(this, bone));
|
||||
|
||||
if (bone.RigidCheck == null)
|
||||
SkinningIndices.Add(b);
|
||||
}
|
||||
|
||||
Skeleton.reset();
|
||||
Skeleton.update();
|
||||
|
||||
for (int g = 0; g < Model.Groups?.Count; g++) {
|
||||
var group = Model.Groups[g];
|
||||
var mesh = Model.Meshes[g];
|
||||
|
||||
OpenTK.Matrix4 transform = OpenTK.Matrix4.Identity;
|
||||
|
||||
GFLXMesh genericMesh = new GFLXMesh(this, group, mesh);
|
||||
genericMesh.Checked = true;
|
||||
genericMesh.ImageKey = "model";
|
||||
genericMesh.SelectedImageKey = "model";
|
||||
|
||||
int boneIndex = (int)group.BoneIndex;
|
||||
if (boneIndex < Skeleton.bones.Count && boneIndex > 0)
|
||||
{
|
||||
genericMesh.BoneIndex = boneIndex;
|
||||
transform = Skeleton.bones[boneIndex].Transform;
|
||||
|
||||
genericMesh.Text = Skeleton.bones[boneIndex].Text;
|
||||
}
|
||||
|
||||
// if (group.MeshID < Skeleton.bones.Count && group.MeshID > 0)
|
||||
// genericMesh.Text = Skeleton.bones[(int)group.MeshID].Text;
|
||||
|
||||
Renderer.Meshes.Add(genericMesh);
|
||||
GenericMeshes.Add(genericMesh);
|
||||
|
||||
//Load the vertex data
|
||||
genericMesh.Transform = transform;
|
||||
genericMesh.vertices = GFLXMeshBufferHelper.LoadVertexData(mesh, transform, SkinningIndices);
|
||||
genericMesh.FlipUvsVertical();
|
||||
|
||||
//Load faces
|
||||
for (int p = 0; p < mesh.Polygons?.Count; p++)
|
||||
{
|
||||
var poly = mesh.Polygons[p];
|
||||
|
||||
var polygonGroup = new STGenericPolygonGroup();
|
||||
polygonGroup.MaterialIndex = (int)poly.MaterialIndex;
|
||||
genericMesh.PolygonGroups.Add(polygonGroup);
|
||||
|
||||
if (GenericMaterials.Count > poly.MaterialIndex)
|
||||
polygonGroup.Material = GenericMaterials[(int)poly.MaterialIndex];
|
||||
|
||||
for (int f = 0; f < poly.Faces?.Count; f++)
|
||||
polygonGroup.faces.Add((int)poly.Faces[f]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public void SaveFile(System.IO.Stream stream)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public List<int> GenerateSkinningIndices()
|
||||
{
|
||||
List<int> indices = new List<int>();
|
||||
for (int i = 0; i < Model.Bones?.Count; i++)
|
||||
{
|
||||
if (Model.Bones[i].RigidCheck == null)
|
||||
indices.Add(Model.Bones.IndexOf(Model.Bones[i]));
|
||||
}
|
||||
return indices;
|
||||
}
|
||||
|
||||
public GFMDLStructs.BoundingBox GenerateBoundingBox(STGenericObject mesh)
|
||||
{
|
||||
float minX = 0;
|
||||
float minY = 0;
|
||||
float minZ = 0;
|
||||
float maxX = 0;
|
||||
float maxY = 0;
|
||||
float maxZ = 0;
|
||||
|
||||
for (int v = 0; v < mesh.vertices.Count; v++)
|
||||
{
|
||||
minX = Math.Min(minX, mesh.vertices[v].pos.X);
|
||||
minY = Math.Min(minY, mesh.vertices[v].pos.Y);
|
||||
minZ = Math.Min(minZ, mesh.vertices[v].pos.Z);
|
||||
maxX = Math.Max(maxX, mesh.vertices[v].pos.X);
|
||||
maxY = Math.Max(maxY, mesh.vertices[v].pos.Y);
|
||||
maxZ = Math.Max(maxZ, mesh.vertices[v].pos.Z);
|
||||
}
|
||||
|
||||
var bounding = new GFMDLStructs.BoundingBox();
|
||||
bounding.MinX = minX;
|
||||
bounding.MinY = minY;
|
||||
bounding.MinZ = minZ;
|
||||
bounding.MaxX = maxX;
|
||||
bounding.MaxY = maxY;
|
||||
bounding.MaxZ = maxZ;
|
||||
return bounding;
|
||||
}
|
||||
|
||||
public void GenerateBoundingBox()
|
||||
{
|
||||
float minX = 0;
|
||||
float minY = 0;
|
||||
float minZ = 0;
|
||||
float maxX = 0;
|
||||
float maxY = 0;
|
||||
float maxZ = 0;
|
||||
|
||||
foreach (var mesh in GenericMeshes)
|
||||
{
|
||||
for (int v = 0; v < mesh.vertices.Count; v++)
|
||||
{
|
||||
minX = Math.Min(minX, mesh.vertices[v].pos.X);
|
||||
minY = Math.Min(minY, mesh.vertices[v].pos.Y);
|
||||
minZ = Math.Min(minZ, mesh.vertices[v].pos.Z);
|
||||
maxX = Math.Max(maxX, mesh.vertices[v].pos.X);
|
||||
maxY = Math.Max(maxY, mesh.vertices[v].pos.Y);
|
||||
maxZ = Math.Max(maxZ, mesh.vertices[v].pos.Z);
|
||||
}
|
||||
}
|
||||
|
||||
Model.Bounding = new GFMDLStructs.BoundingBox();
|
||||
Model.Bounding.MinX = minX;
|
||||
Model.Bounding.MinY = minY;
|
||||
Model.Bounding.MinZ = minZ;
|
||||
Model.Bounding.MaxX = maxX;
|
||||
Model.Bounding.MaxY = maxY;
|
||||
Model.Bounding.MaxZ = maxZ;
|
||||
}
|
||||
}
|
||||
|
||||
public class GFLXMaterialData : STGenericMaterial, IContextMenuNode
|
||||
{
|
||||
private Material Material;
|
||||
public GFLXModel ParentModel;
|
||||
|
||||
public Dictionary<string, GFLXSwitchParam> SwitchParams = new Dictionary<string, GFLXSwitchParam>();
|
||||
public Dictionary<string, GFLXValueParam> ValueParams = new Dictionary<string, GFLXValueParam>();
|
||||
public Dictionary<string, GFLXColorParam> ColorParams = new Dictionary<string, GFLXColorParam>();
|
||||
|
||||
public override void OnClick(TreeView treeView) {
|
||||
var editor = ParentModel.LoadEditor<GFLXMaterialEditor>();
|
||||
editor.LoadMaterial(this);
|
||||
}
|
||||
|
||||
public string ConvertToJson() {
|
||||
return JsonConvert.SerializeObject(Material, Formatting.Indented);
|
||||
}
|
||||
|
||||
public void ConvertFromJson(string text)
|
||||
{
|
||||
Material = JsonConvert.DeserializeObject<Material>(text);
|
||||
ReloadMaterial();
|
||||
|
||||
var editor = ParentModel.LoadEditor<GFLXMaterialEditor>();
|
||||
editor.LoadMaterial(this);
|
||||
}
|
||||
|
||||
public ToolStripItem[] GetContextMenuItems()
|
||||
{
|
||||
List<ToolStripItem> Items = new List<ToolStripItem>();
|
||||
Items.Add(new ToolStripMenuItem("Export", null, ExportAction, Keys.Control | Keys.E));
|
||||
Items.Add(new ToolStripMenuItem("Replace", null, ReplaceAction, Keys.Control | Keys.R));
|
||||
return Items.ToArray();
|
||||
}
|
||||
|
||||
private void ExportAction(object sender, EventArgs args)
|
||||
{
|
||||
SaveFileDialog sfd = new SaveFileDialog();
|
||||
sfd.Filter = "Supported Formats|*.json;";
|
||||
sfd.FileName = Text;
|
||||
sfd.DefaultExt = "json";
|
||||
if (sfd.ShowDialog() == DialogResult.OK) {
|
||||
string json = JsonConvert.SerializeObject(Material, Formatting.Indented);
|
||||
System.IO.File.WriteAllText(sfd.FileName, json);
|
||||
}
|
||||
}
|
||||
|
||||
private void ReplaceAction(object sender, EventArgs args)
|
||||
{
|
||||
OpenFileDialog ofd = new OpenFileDialog();
|
||||
ofd.Filter = "Supported Formats|*.json;";
|
||||
if (ofd.ShowDialog() == DialogResult.OK)
|
||||
{
|
||||
Material = JsonConvert.DeserializeObject<Material>(
|
||||
System.IO.File.ReadAllText(ofd.FileName));
|
||||
|
||||
ReloadMaterial();
|
||||
|
||||
var editor = ParentModel.LoadEditor<GFLXMaterialEditor>();
|
||||
editor.LoadMaterial(this);
|
||||
}
|
||||
}
|
||||
|
||||
public GFLXMaterialData(GFLXModel parent, Material mat)
|
||||
{
|
||||
ParentModel = parent;
|
||||
Material = mat;
|
||||
Text = mat.Name;
|
||||
|
||||
ReloadMaterial();
|
||||
}
|
||||
|
||||
private void ReloadMaterial()
|
||||
{
|
||||
SwitchParams.Clear();
|
||||
ValueParams.Clear();
|
||||
ColorParams.Clear();
|
||||
TextureMaps.Clear();
|
||||
|
||||
for (int i = 0; i < Material.Switches?.Count; i++)
|
||||
{
|
||||
var val = Material.Switches[i];
|
||||
SwitchParams.Add(val.Name, new GFLXSwitchParam(val));
|
||||
}
|
||||
|
||||
for (int i = 0; i < Material.Values?.Count; i++)
|
||||
{
|
||||
var val = Material.Values[i];
|
||||
ValueParams.Add(val.Name, new GFLXValueParam(val));
|
||||
}
|
||||
|
||||
for (int i = 0; i < Material.Colors?.Count; i++)
|
||||
{
|
||||
var val = Material.Colors[i];
|
||||
ColorParams.Add(val.Name, new GFLXColorParam(val));
|
||||
}
|
||||
|
||||
int textureUnit = 1;
|
||||
for (int t = 0; t < Material.TextureMaps?.Count; t++)
|
||||
{
|
||||
var tex = Material.TextureMaps[t];
|
||||
string name = ParentModel.Textures[(int)tex.Index];
|
||||
|
||||
GFLXTextureMap matTexture = new GFLXTextureMap();
|
||||
matTexture.gflxTextureMap = tex;
|
||||
matTexture.Name = name;
|
||||
matTexture.Transform = new STTextureTransform();
|
||||
matTexture.SamplerName = tex.Sampler;
|
||||
matTexture.textureUnit = textureUnit++;
|
||||
matTexture.WrapModeS = STTextureWrapMode.Mirror;
|
||||
matTexture.WrapModeT = STTextureWrapMode.Repeat;
|
||||
TextureMaps.Add(matTexture);
|
||||
|
||||
switch (tex.Sampler)
|
||||
{
|
||||
case "BaseColor0":
|
||||
matTexture.Type = STGenericMatTexture.TextureType.Diffuse;
|
||||
break;
|
||||
case "Col0Tex":
|
||||
matTexture.Type = STGenericMatTexture.TextureType.Diffuse;
|
||||
break;
|
||||
case "EmissionMaskTex":
|
||||
// matTexture.Type = STGenericMatTexture.TextureType.Emission;
|
||||
break;
|
||||
case "LyCol0Tex":
|
||||
break;
|
||||
case "NormalMapTex":
|
||||
matTexture.WrapModeT = STTextureWrapMode.Repeat;
|
||||
matTexture.WrapModeT = STTextureWrapMode.Repeat;
|
||||
matTexture.Type = STGenericMatTexture.TextureType.Normal;
|
||||
break;
|
||||
case "AmbientTex":
|
||||
break;
|
||||
case "LightTblTex":
|
||||
break;
|
||||
case "SphereMapTex":
|
||||
break;
|
||||
case "EffectTex":
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
float ScaleX = 1;
|
||||
float ScaleY = 1;
|
||||
float TransX = 0;
|
||||
float TransY = 0;
|
||||
|
||||
//Lookup the uniforms and apply a transform to the texture map
|
||||
//Used for the UV viewer
|
||||
if (matTexture.Type == STGenericMatTexture.TextureType.Diffuse)
|
||||
{
|
||||
if (ValueParams.ContainsKey("ColorUVScaleU"))
|
||||
ScaleX = ValueParams["ColorUVScaleU"].Value;
|
||||
if (ValueParams.ContainsKey("ColorUVScaleV"))
|
||||
ScaleY = ValueParams["ColorUVScaleV"].Value;
|
||||
|
||||
if (ValueParams.ContainsKey("ColorUVTranslateU"))
|
||||
TransX = ValueParams["ColorUVTranslateU"].Value;
|
||||
if (ValueParams.ContainsKey("ColorUVTranslateV"))
|
||||
TransY = ValueParams["ColorUVTranslateV"].Value;
|
||||
}
|
||||
if (matTexture.Type == STGenericMatTexture.TextureType.Normal)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
matTexture.Transform.Scale = new OpenTK.Vector2(ScaleX, ScaleY);
|
||||
matTexture.Transform.Translate = new OpenTK.Vector2(TransX, TransY);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public class GFLXTextureMap : STGenericMatTexture
|
||||
{
|
||||
public TextureMap gflxTextureMap;
|
||||
|
||||
public override STGenericTexture GetTexture()
|
||||
{
|
||||
foreach (var bntx in PluginRuntime.bntxContainers)
|
||||
{
|
||||
if (bntx.Textures.ContainsKey(Name))
|
||||
return bntx.Textures[Name];
|
||||
}
|
||||
|
||||
return base.GetTexture();
|
||||
}
|
||||
}
|
||||
|
||||
public class GFLXBone : STBone
|
||||
{
|
||||
public Bone Bone;
|
||||
public GFLXModel ParentModel;
|
||||
|
||||
public bool HasSkinning => Bone.RigidCheck == null;
|
||||
|
||||
public GFLXBone(GFLXModel parent, Bone bone) : base(parent.Skeleton)
|
||||
{
|
||||
ParentModel = parent;
|
||||
Bone = bone;
|
||||
|
||||
Text = bone.Name;
|
||||
parentIndex = bone.Parent;
|
||||
|
||||
if (bone.Translation != null)
|
||||
{
|
||||
position = new float[3]
|
||||
{ bone.Translation.X,
|
||||
bone.Translation.Y,
|
||||
bone.Translation.Z
|
||||
};
|
||||
}
|
||||
|
||||
if (bone.Rotation != null)
|
||||
{
|
||||
rotation = new float[4]
|
||||
{ bone.Rotation.X,
|
||||
bone.Rotation.Y,
|
||||
bone.Rotation.Z,
|
||||
1.0f,
|
||||
};
|
||||
}
|
||||
|
||||
if (bone.Scale != null)
|
||||
{
|
||||
scale = new float[3]
|
||||
{ bone.Scale.X,
|
||||
bone.Scale.Y,
|
||||
bone.Scale.Z
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public class GFLXColorParam
|
||||
{
|
||||
private MatColor Param;
|
||||
|
||||
public GFLXColorParam(MatColor param)
|
||||
{
|
||||
Param = param;
|
||||
}
|
||||
|
||||
public string Name
|
||||
{
|
||||
get { return Param.Name; }
|
||||
set { Param.Name = value; }
|
||||
}
|
||||
|
||||
public OpenTK.Vector3 Value
|
||||
{
|
||||
get { return new OpenTK.Vector3(
|
||||
Param.Color.R,
|
||||
Param.Color.G,
|
||||
Param.Color.B);
|
||||
}
|
||||
set
|
||||
{
|
||||
var vec3 = value;
|
||||
|
||||
Param.Color.R = vec3.X;
|
||||
Param.Color.G = vec3.Y;
|
||||
Param.Color.B = vec3.Z;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public class GFLXValueParam
|
||||
{
|
||||
private MatFloat Param;
|
||||
|
||||
public GFLXValueParam(MatFloat param) {
|
||||
Param = param;
|
||||
}
|
||||
|
||||
public string Name
|
||||
{
|
||||
get { return Param.Name; }
|
||||
set { Param.Name = value; }
|
||||
}
|
||||
|
||||
public float Value
|
||||
{
|
||||
get { return Param.Value; }
|
||||
set { Param.Value = value; }
|
||||
}
|
||||
}
|
||||
|
||||
public class GFLXSwitchParam
|
||||
{
|
||||
private MatSwitch Param;
|
||||
|
||||
public GFLXSwitchParam(MatSwitch param)
|
||||
{
|
||||
Param = param;
|
||||
}
|
||||
|
||||
public string Name
|
||||
{
|
||||
get { return Param.Name; }
|
||||
set { Param.Name = value; }
|
||||
}
|
||||
|
||||
public bool Value
|
||||
{
|
||||
get { return Param.Value; }
|
||||
set { Param.Value = value; }
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,276 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using Newtonsoft.Json;
|
||||
|
||||
namespace FirstPlugin.GFMDLStructs
|
||||
{
|
||||
public enum VertexType
|
||||
{
|
||||
Position = 0,
|
||||
Normal = 1,
|
||||
Binormal = 2,
|
||||
UV1 = 3,
|
||||
UV2 = 4,
|
||||
UV3 = 5,
|
||||
UV4 = 6,
|
||||
Color1 = 7,
|
||||
Color2 = 8,
|
||||
Color3 = 9,
|
||||
Color4 = 10,
|
||||
BoneID = 11,
|
||||
BoneWeight = 12,
|
||||
Tangents = 13,
|
||||
Unknown2 = 14,
|
||||
}
|
||||
|
||||
public enum BufferFormat : uint
|
||||
{
|
||||
Float = 0,
|
||||
HalfFloat = 1,
|
||||
Byte = 3,
|
||||
Short = 5,
|
||||
BytesAsFloat = 8,
|
||||
}
|
||||
|
||||
public class Model
|
||||
{
|
||||
public uint Version { get; set; }
|
||||
|
||||
public BoundingBox Bounding { get; set; }
|
||||
|
||||
public IList<string> TextureNames { get; set; }
|
||||
public IList<string> ShaderNames { get; set; }
|
||||
public IList<UnknownEmpty> Unknown { get; set; }
|
||||
public IList<string> MaterialNames { get; set; }
|
||||
public IList<Material> Materials { get; set; }
|
||||
public IList<Group> Groups { get; set; }
|
||||
public IList<Mesh> Meshes { get; set; }
|
||||
public IList<Bone> Bones { get; set; }
|
||||
public IList<CollisionGroup> CollisionGroups { get; set; }
|
||||
}
|
||||
|
||||
public class Material
|
||||
{
|
||||
public string Name { get; set; }
|
||||
public string ShaderGroup { get; set; }
|
||||
|
||||
public int RenderLayer { get; set; }
|
||||
|
||||
public byte Unknown1 { get; set; }
|
||||
public byte Unknown2 { get; set; }
|
||||
|
||||
public int Parameter1 { get; set; }
|
||||
public int Parameter2 { get; set; }
|
||||
public int Parameter3 { get; set; }
|
||||
public int Parameter4 { get; set; }
|
||||
public int Parameter5 { get; set; }
|
||||
public int Parameter6 { get; set; }
|
||||
|
||||
public IList<TextureMap> TextureMaps { get; set; }
|
||||
|
||||
public IList<MatSwitch> Switches { get; set; }
|
||||
public IList<MatFloat> Values { get; set; }
|
||||
public IList<MatColor> Colors { get; set; }
|
||||
|
||||
public byte Unknown3 { get; set; }
|
||||
public byte Unknown4 { get; set; }
|
||||
public byte Unknown5 { get; set; }
|
||||
public byte Unknown6 { get; set; }
|
||||
public byte Unknown7 { get; set; }
|
||||
|
||||
public MaterialCommon Common { get; set; }
|
||||
|
||||
public void Export(string name)
|
||||
{
|
||||
string json = JsonConvert.SerializeObject(this, Formatting.Indented);
|
||||
System.IO.File.WriteAllText($"mat_{name}.json", json);
|
||||
}
|
||||
|
||||
public static Material Replace(string filePath)
|
||||
{
|
||||
string json = System.IO.File.ReadAllText(filePath);
|
||||
return JsonConvert.DeserializeObject<Material>(json);
|
||||
}
|
||||
}
|
||||
|
||||
public class TextureMap
|
||||
{
|
||||
public string Sampler { get; set; }
|
||||
public uint Index { get; set; }
|
||||
public TextureParams Params { get; set; }
|
||||
}
|
||||
|
||||
public class TextureParams
|
||||
{
|
||||
public uint Unknown1 { get; set; }
|
||||
public uint Unknown2 { get; set; }
|
||||
public uint Unknown3 { get; set; }
|
||||
public uint Unknown4 { get; set; }
|
||||
public uint Unknown5 { get; set; }
|
||||
public uint Unknown6 { get; set; }
|
||||
public uint Unknown7 { get; set; }
|
||||
public uint Unknown8 { get; set; }
|
||||
|
||||
public float lodBias { get; set; }
|
||||
}
|
||||
|
||||
public class MatInt
|
||||
{
|
||||
public string Name { get; set; }
|
||||
public int Value { get; set; }
|
||||
}
|
||||
|
||||
public class MatFloat
|
||||
{
|
||||
public string Name { get; set; }
|
||||
public float Value { get; set; }
|
||||
}
|
||||
|
||||
public class MatColor
|
||||
{
|
||||
public string Name { get; set; }
|
||||
public ColorRGB32 Color { get; set; }
|
||||
}
|
||||
|
||||
public class MatSwitch
|
||||
{
|
||||
public string Name { get; set; }
|
||||
public bool Value { get; set; }
|
||||
}
|
||||
|
||||
public class MaterialCommon
|
||||
{
|
||||
public IList<MatSwitch> Switches { get; set; }
|
||||
public IList<MatInt> Values { get; set; }
|
||||
public IList<MatColor> Colors { get; set; }
|
||||
}
|
||||
|
||||
public class UnknownEmpty
|
||||
{
|
||||
public uint Zero { get; set; }
|
||||
}
|
||||
|
||||
public class Group
|
||||
{
|
||||
public uint BoneIndex { get; set; }
|
||||
public uint MeshIndex { get; set; }
|
||||
|
||||
public BoundingBox Bounding { get; set; }
|
||||
|
||||
public uint Layer { get; set; }
|
||||
}
|
||||
|
||||
public class Mesh
|
||||
{
|
||||
public IList<MeshPolygon> Polygons { get; set; }
|
||||
public IList<MeshAttribute> Attributes { get; set; }
|
||||
public IList<byte> Data { get; set; }
|
||||
|
||||
public void SetData(byte[] data)
|
||||
{
|
||||
if (Data == null)
|
||||
Data = new List<byte>();
|
||||
|
||||
Data.Clear();
|
||||
for (int i = 0; i < data.Length; i++)
|
||||
Data.Add(data[i]);
|
||||
}
|
||||
}
|
||||
|
||||
public class MeshPolygon
|
||||
{
|
||||
public uint MaterialIndex { get; set; }
|
||||
|
||||
public IList<ushort> Faces { get; set; }
|
||||
}
|
||||
|
||||
public class MeshAttribute
|
||||
{
|
||||
public uint VertexType { get; set; }
|
||||
public uint BufferFormat { get; set; }
|
||||
public uint ElementCount { get; set; }
|
||||
}
|
||||
|
||||
public class Bone
|
||||
{
|
||||
public string Name { get; set; }
|
||||
|
||||
public uint BoneType { get; set; }
|
||||
public int Parent { get; set; }
|
||||
public uint Zero { get; set; }
|
||||
public bool Visible { get; set; }
|
||||
|
||||
public Vector3 Scale { get; set; }
|
||||
public Vector3 Rotation { get; set; }
|
||||
public Vector3 Translation { get; set; }
|
||||
public Vector3 RadiusStart { get; set; }
|
||||
public Vector3 RadiusEnd { get; set; }
|
||||
|
||||
public BoneRigidData RigidCheck { get; set; }
|
||||
}
|
||||
|
||||
public class BoneRigidData
|
||||
{
|
||||
public uint Unknown1 { get; set; }
|
||||
}
|
||||
|
||||
public class CollisionGroup
|
||||
{
|
||||
public uint BoneIndex { get; set; }
|
||||
public uint Unknown1 { get; set; }
|
||||
|
||||
public IList<uint> BoneChildren { get; set; }
|
||||
public BoundingBox Bounding { get; set; }
|
||||
}
|
||||
|
||||
public class BoundingBox
|
||||
{
|
||||
public float MinX { get; set; }
|
||||
public float MinY { get; set; }
|
||||
public float MinZ { get; set; }
|
||||
|
||||
public float MaxX { get; set; }
|
||||
public float MaxY { get; set; }
|
||||
public float MaxZ { get; set; }
|
||||
}
|
||||
|
||||
public class Vector3
|
||||
{
|
||||
public float X { get; set; }
|
||||
public float Y { get; set; }
|
||||
public float Z { get; set; }
|
||||
|
||||
public Vector3() { }
|
||||
public Vector3(float x, float y, float z) {
|
||||
X = x; Y = y; Z = z;
|
||||
}
|
||||
}
|
||||
|
||||
public class ColorRGB32
|
||||
{
|
||||
public float R { get; set; }
|
||||
public float G { get; set; }
|
||||
public float B { get; set; }
|
||||
|
||||
public ColorRGB32() { }
|
||||
public ColorRGB32(float r, float g, float b) {
|
||||
R = r; G = g; B = b;
|
||||
}
|
||||
}
|
||||
|
||||
public class Vector4
|
||||
{
|
||||
public float X { get; set; }
|
||||
public float Y { get; set; }
|
||||
public float Z { get; set; }
|
||||
public float W { get; set; }
|
||||
|
||||
public Vector4() { }
|
||||
public Vector4(float x, float y, float z, float w) {
|
||||
X = x; Y = y; Z = z; W = w;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,52 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using FirstPlugin.GFMDLStructs;
|
||||
|
||||
namespace FirstPlugin
|
||||
{
|
||||
public class GfbmdlImportSettings
|
||||
{
|
||||
public List<MeshSetting> MeshSettings = new List<MeshSetting>();
|
||||
|
||||
public class MeshSetting
|
||||
{
|
||||
public bool FlipUVsVertical { get; set; }
|
||||
|
||||
public bool HasNormals { get; set; }
|
||||
public bool HasBitangents { get; set; }
|
||||
public bool HasTangents { get; set; }
|
||||
public bool HasTexCoord1 { get; set; }
|
||||
public bool HasTexCoord2 { get; set; }
|
||||
public bool HasTexCoord3 { get; set; }
|
||||
public bool HasTexCoord4 { get; set; }
|
||||
public bool HasColor1 { get; set; }
|
||||
public bool HasColor2 { get; set; }
|
||||
public bool HasColor3 { get; set; }
|
||||
public bool HasColor4 { get; set; }
|
||||
public bool HasBoneIndices { get; set; }
|
||||
public bool HasWeights { get; set; }
|
||||
|
||||
public BufferFormat PositionFormat { get; set; } = BufferFormat.Float;
|
||||
public BufferFormat NormalFormat { get; set; } = BufferFormat.HalfFloat;
|
||||
public BufferFormat BitangentnFormat { get; set; } = BufferFormat.HalfFloat;
|
||||
public BufferFormat TexCoord1Format { get; set; } = BufferFormat.Float;
|
||||
public BufferFormat TexCoord2Format { get; set; } = BufferFormat.Float;
|
||||
public BufferFormat TexCoord3Format { get; set; } = BufferFormat.Float;
|
||||
public BufferFormat TexCoord4Format { get; set; } = BufferFormat.Float;
|
||||
public BufferFormat Color1Format { get; set; } = BufferFormat.Byte;
|
||||
public BufferFormat Color2Format { get; set; } = BufferFormat.Byte;
|
||||
public BufferFormat Color3Format { get; set; } = BufferFormat.Byte;
|
||||
public BufferFormat Color4Format { get; set; } = BufferFormat.Byte;
|
||||
public BufferFormat BoneIndexFormat { get; set; } = BufferFormat.Byte;
|
||||
public BufferFormat BoneWeightFormat { get; set; } = BufferFormat.BytesAsFloat;
|
||||
public BufferFormat TangentsFormat { get; set; } = BufferFormat.HalfFloat;
|
||||
|
||||
public string Material { get; set; }
|
||||
|
||||
public string MaterialFile { get; set; }
|
||||
}
|
||||
}
|
||||
}
|
|
@ -233,7 +233,7 @@
|
|||
<Compile Include="FileFormats\NLG\NLG_Common.cs" />
|
||||
<Compile Include="FileFormats\NLG\NLG_NLOC.cs" />
|
||||
<Compile Include="FileFormats\NLG\NLOC_Wrapper.cs" />
|
||||
<Compile Include="FileFormats\NLG\NLG_PCK.cs" />
|
||||
<Compile Include="FileFormats\Audio\Archives\PCK.cs" />
|
||||
<Compile Include="FileFormats\NLG\PunchOutWii\PO_DICT.cs" />
|
||||
<Compile Include="FileFormats\Archives\VIBS.cs" />
|
||||
<Compile Include="FileFormats\Audio\Archives\AudioCommon.cs" />
|
||||
|
@ -358,16 +358,21 @@
|
|||
<Compile Include="FileFormats\NLG\PunchOutWii\PO_VertexAttribute.cs" />
|
||||
<Compile Include="FileFormats\Pikmin1\MOD.cs" />
|
||||
<Compile Include="FileFormats\Pikmin1\TXE.cs" />
|
||||
<Compile Include="FileFormats\Pokemon\GFBANIM\FlatBuffers\gfbanim.cs" />
|
||||
<Compile Include="FileFormats\Pokemon\GFBANIM\GFBANM.cs" />
|
||||
<Compile Include="FileFormats\Pokemon\GFBANMCFG\GFBANMCFG.cs" />
|
||||
<Compile Include="FileFormats\Pokemon\GFBANMCFG\FlatBuffers\gfbanmcfg.cs" />
|
||||
<Compile Include="FileFormats\Pokemon\GFBMDL\FlatBuffers\gfbmdl.cs" />
|
||||
<Compile Include="FileFormats\Pokemon\GFBMDL\GFBMDL.cs" />
|
||||
<Compile Include="FileFormats\Pokemon\GFBMDL\GFLXModel.cs" />
|
||||
<Compile Include="FileFormats\Pokemon\GFBMDL\GFLXMeshBufferHelper.cs" />
|
||||
<Compile Include="FileFormats\Pokemon\GFBPMCATALOG\FlatBuffers\gfbpmcatalog.cs" />
|
||||
<Compile Include="FileFormats\Pokemon\PokemonTable.cs" />
|
||||
<Compile Include="FileFormats\Pokemon\GFLX\FlatBufferHelper.cs" />
|
||||
<Compile Include="FileFormats\Pokemon\GFLX\GFBANIM\FlatBuffers\gfbanim.cs" />
|
||||
<Compile Include="FileFormats\Pokemon\GFLX\GFBANIM\GfbanimKeyFrameLoader.cs" />
|
||||
<Compile Include="FileFormats\Pokemon\GFLX\GFBANIM\GFBANM.cs" />
|
||||
<Compile Include="FileFormats\Pokemon\GFLX\GFBANMCFG\GFBANMCFG.cs" />
|
||||
<Compile Include="FileFormats\Pokemon\GFLX\GFBANMCFG\FlatBuffers\gfbanmcfg.cs" />
|
||||
<Compile Include="FileFormats\Pokemon\GFLX\GFBMDL\FlatBuffers\BufferToStruct.cs" />
|
||||
<Compile Include="FileFormats\Pokemon\GFLX\GFBMDL\FlatBuffers\gfbmdl.cs" />
|
||||
<Compile Include="FileFormats\Pokemon\GFLX\GFBMDL\GFBMDL.cs" />
|
||||
<Compile Include="FileFormats\Pokemon\GFLX\GFBMDL\GFLXModel.cs" />
|
||||
<Compile Include="FileFormats\Pokemon\GFLX\GFBMDL\GFLXMeshBufferHelper.cs" />
|
||||
<Compile Include="FileFormats\Pokemon\GFLX\GFBMDL\GfbmdlImportSettings.cs" />
|
||||
<Compile Include="FileFormats\Pokemon\GFLX\GFBMDL\GFMDLStructs.cs" />
|
||||
<Compile Include="FileFormats\Pokemon\GFLX\GFBPMCATALOG\FlatBuffers\gfbpmcatalog.cs" />
|
||||
<Compile Include="FileFormats\Pokemon\GFLX\PokemonTable.cs" />
|
||||
<Compile Include="FileFormats\Rom\3DS\NCSDStructs.cs" />
|
||||
<Compile Include="FileFormats\Rom\3DS\NCSD.cs" />
|
||||
<Compile Include="FileFormats\Rom\3DS\RomFS.cs" />
|
||||
|
@ -392,6 +397,12 @@
|
|||
<Compile Include="GL\LM3_Renderer.cs" />
|
||||
<Compile Include="GL\PunchOutWii_Renderer.cs" />
|
||||
<Compile Include="GL\Strikers_Renderer.cs" />
|
||||
<Compile Include="GUI\BFLYT\Editor\PaneAnimationController.cs">
|
||||
<SubType>UserControl</SubType>
|
||||
</Compile>
|
||||
<Compile Include="GUI\BFLYT\Editor\PaneAnimationController.Designer.cs">
|
||||
<DependentUpon>PaneAnimationController.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="GUI\GFBMDL\GFLXMaterialEditor.cs">
|
||||
<SubType>UserControl</SubType>
|
||||
</Compile>
|
||||
|
@ -404,6 +415,18 @@
|
|||
<Compile Include="GUI\GFBMDL\GFLXMaterialParamEditor.Designer.cs">
|
||||
<DependentUpon>GFLXMaterialParamEditor.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="GUI\GFBMDL\GFLXMeshEditor.cs">
|
||||
<SubType>UserControl</SubType>
|
||||
</Compile>
|
||||
<Compile Include="GUI\GFBMDL\GFLXMeshEditor.Designer.cs">
|
||||
<DependentUpon>GFLXMeshEditor.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="GUI\GFBMDL\GFLXModelImporter.cs">
|
||||
<SubType>Form</SubType>
|
||||
</Compile>
|
||||
<Compile Include="GUI\GFBMDL\GFLXModelImporter.Designer.cs">
|
||||
<DependentUpon>GFLXModelImporter.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="GUI\Pokemon\PokemonLoaderSwSh.cs">
|
||||
<SubType>Form</SubType>
|
||||
</Compile>
|
||||
|
@ -441,7 +464,7 @@
|
|||
<DependentUpon>LayoutAnimEditor.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="GUI\BFLYT\Animations\Basic\LayoutAnimEditorBasic.cs">
|
||||
<SubType>Form</SubType>
|
||||
<SubType>UserControl</SubType>
|
||||
</Compile>
|
||||
<Compile Include="GUI\BFLYT\Animations\Basic\LayoutAnimEditorBasic.Designer.cs">
|
||||
<DependentUpon>LayoutAnimEditorBasic.cs</DependentUpon>
|
||||
|
@ -670,7 +693,7 @@
|
|||
<Compile Include="GUI\BMD\BMDModelImportSettings.Designer.cs">
|
||||
<DependentUpon>BMDModelImportSettings.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="FileFormats\Pokemon\GFBMDL\GFLXMesh.cs" />
|
||||
<Compile Include="FileFormats\Pokemon\GFLX\GFBMDL\GFLXMesh.cs" />
|
||||
<Compile Include="FileFormats\GMX\GMX.cs" />
|
||||
<Compile Include="FileFormats\Hashes\SAHT.cs" />
|
||||
<Compile Include="FileFormats\MKAGPDX\MKAGPDX_Model.cs" />
|
||||
|
@ -1441,12 +1464,21 @@
|
|||
<EmbeddedResource Include="GUI\AttributeEditor.resx">
|
||||
<DependentUpon>AttributeEditor.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="GUI\BFLYT\Editor\PaneAnimationController.resx">
|
||||
<DependentUpon>PaneAnimationController.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="GUI\GFBMDL\GFLXMaterialEditor.resx">
|
||||
<DependentUpon>GFLXMaterialEditor.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="GUI\GFBMDL\GFLXMaterialParamEditor.resx">
|
||||
<DependentUpon>GFLXMaterialParamEditor.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="GUI\GFBMDL\GFLXMeshEditor.resx">
|
||||
<DependentUpon>GFLXMeshEditor.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="GUI\GFBMDL\GFLXModelImporter.resx">
|
||||
<DependentUpon>GFLXModelImporter.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="GUI\Pokemon\PokemonLoaderSwSh.resx">
|
||||
<DependentUpon>PokemonLoaderSwSh.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
|
@ -1940,6 +1972,7 @@
|
|||
<ItemGroup>
|
||||
<Folder Include="FileFormats\EvemtFlow\" />
|
||||
<Folder Include="FileFormats\NLG\Common\" />
|
||||
<Folder Include="FileFormats\Pokemon\GFL2\" />
|
||||
<Folder Include="GUI\Byaml\MuuntEditor\Renderables\" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
|
|
|
@ -15,6 +15,8 @@ namespace FirstPlugin
|
|||
{
|
||||
public class GFBMDL_Render : AbstractGlDrawable, IMeshContainer
|
||||
{
|
||||
public GFBMDL GfbmdlFile;
|
||||
|
||||
public List<STGenericObject> Meshes { get; set; } = new List<STGenericObject>();
|
||||
|
||||
public Matrix4 ModelTransform = Matrix4.Identity;
|
||||
|
@ -399,7 +401,7 @@ namespace FirstPlugin
|
|||
shader.EnableVertexAttributes();
|
||||
foreach (GFLXMesh shp in Meshes)
|
||||
{
|
||||
if (shp.Checked)
|
||||
if (shp.Checked && shp.AnimationController.IsVisible)
|
||||
DrawModel(control, shp, shader);
|
||||
}
|
||||
shader.DisableVertexAttributes();
|
||||
|
|
|
@ -80,10 +80,9 @@
|
|||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.ClientSize = new System.Drawing.Size(800, 450);
|
||||
this.Controls.Add(this.splitContainer1);
|
||||
this.Name = "LayoutAnimEditorBasic";
|
||||
this.Text = "LayoutAnimEditorBasic";
|
||||
this.Size = new System.Drawing.Size(800, 450);
|
||||
this.splitContainer1.Panel1.ResumeLayout(false);
|
||||
this.splitContainer1.Panel2.ResumeLayout(false);
|
||||
((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit();
|
||||
|
|
|
@ -12,7 +12,7 @@ using Toolbox.Library;
|
|||
|
||||
namespace LayoutBXLYT
|
||||
{
|
||||
public partial class LayoutAnimEditorBasic : LayoutDocked
|
||||
public partial class LayoutAnimEditorBasic : UserControl
|
||||
{
|
||||
private BxlytHeader ParentLayout;
|
||||
private BxlanHeader ActiveAnim;
|
||||
|
@ -54,10 +54,19 @@ namespace LayoutBXLYT
|
|||
}
|
||||
}
|
||||
|
||||
public void LoadAnimationEntry(BxlanHeader bxlan, BxlanPaiEntry entry)
|
||||
{
|
||||
ActiveAnim = bxlan;
|
||||
LoadAnimationEntry(entry, null);
|
||||
}
|
||||
|
||||
private void LoadAnimationEntry(BxlanPaiEntry entry, TreeNode root)
|
||||
{
|
||||
var nodeEntry = new GroupAnimWrapper(entry.Name) { Tag = entry };
|
||||
root.Nodes.Add(nodeEntry);
|
||||
if (root != null)
|
||||
root.Nodes.Add(nodeEntry);
|
||||
else
|
||||
treeView1.Nodes.Add(nodeEntry);
|
||||
|
||||
for (int i = 0; i < entry.Tags.Count; i++)
|
||||
{
|
||||
|
|
147
File_Format_Library/GUI/BFLYT/Editor/PaneAnimationController.Designer.cs
generated
Normal file
147
File_Format_Library/GUI/BFLYT/Editor/PaneAnimationController.Designer.cs
generated
Normal file
|
@ -0,0 +1,147 @@
|
|||
namespace LayoutBXLYT
|
||||
{
|
||||
partial class PaneAnimationController
|
||||
{
|
||||
/// <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()
|
||||
{
|
||||
this.stFlowLayoutPanel1 = new Toolbox.Library.Forms.STFlowLayoutPanel();
|
||||
this.stDropDownPanel1 = new Toolbox.Library.Forms.STDropDownPanel();
|
||||
this.listViewCustom1 = new Toolbox.Library.Forms.ListViewCustom();
|
||||
this.columnHeader1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
|
||||
this.stDropDownPanel2 = new Toolbox.Library.Forms.STDropDownPanel();
|
||||
this.stPanel1 = new Toolbox.Library.Forms.STPanel();
|
||||
this.stFlowLayoutPanel1.SuspendLayout();
|
||||
this.stDropDownPanel1.SuspendLayout();
|
||||
this.stDropDownPanel2.SuspendLayout();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// stFlowLayoutPanel1
|
||||
//
|
||||
this.stFlowLayoutPanel1.Controls.Add(this.stDropDownPanel1);
|
||||
this.stFlowLayoutPanel1.Controls.Add(this.stDropDownPanel2);
|
||||
this.stFlowLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||
this.stFlowLayoutPanel1.FixedHeight = false;
|
||||
this.stFlowLayoutPanel1.FixedWidth = true;
|
||||
this.stFlowLayoutPanel1.Location = new System.Drawing.Point(0, 0);
|
||||
this.stFlowLayoutPanel1.Margin = new System.Windows.Forms.Padding(0);
|
||||
this.stFlowLayoutPanel1.Name = "stFlowLayoutPanel1";
|
||||
this.stFlowLayoutPanel1.Size = new System.Drawing.Size(348, 599);
|
||||
this.stFlowLayoutPanel1.TabIndex = 0;
|
||||
//
|
||||
// stDropDownPanel1
|
||||
//
|
||||
this.stDropDownPanel1.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
|
||||
this.stDropDownPanel1.Controls.Add(this.listViewCustom1);
|
||||
this.stDropDownPanel1.ExpandedHeight = 0;
|
||||
this.stDropDownPanel1.IsExpanded = true;
|
||||
this.stDropDownPanel1.Location = new System.Drawing.Point(0, 0);
|
||||
this.stDropDownPanel1.Margin = new System.Windows.Forms.Padding(0);
|
||||
this.stDropDownPanel1.Name = "stDropDownPanel1";
|
||||
this.stDropDownPanel1.PanelName = "Animation References";
|
||||
this.stDropDownPanel1.PanelValueName = "";
|
||||
this.stDropDownPanel1.SetIcon = null;
|
||||
this.stDropDownPanel1.SetIconAlphaColor = System.Drawing.SystemColors.Control;
|
||||
this.stDropDownPanel1.SetIconColor = System.Drawing.SystemColors.Control;
|
||||
this.stDropDownPanel1.Size = new System.Drawing.Size(348, 195);
|
||||
this.stDropDownPanel1.TabIndex = 0;
|
||||
//
|
||||
// listViewCustom1
|
||||
//
|
||||
this.listViewCustom1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
|
||||
| System.Windows.Forms.AnchorStyles.Left)
|
||||
| System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.listViewCustom1.BorderStyle = System.Windows.Forms.BorderStyle.None;
|
||||
this.listViewCustom1.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
|
||||
this.columnHeader1});
|
||||
this.listViewCustom1.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.None;
|
||||
this.listViewCustom1.HideSelection = false;
|
||||
this.listViewCustom1.Location = new System.Drawing.Point(3, 26);
|
||||
this.listViewCustom1.Name = "listViewCustom1";
|
||||
this.listViewCustom1.OwnerDraw = true;
|
||||
this.listViewCustom1.Size = new System.Drawing.Size(342, 158);
|
||||
this.listViewCustom1.TabIndex = 1;
|
||||
this.listViewCustom1.UseCompatibleStateImageBehavior = false;
|
||||
this.listViewCustom1.View = System.Windows.Forms.View.Details;
|
||||
this.listViewCustom1.SelectedIndexChanged += new System.EventHandler(this.listViewCustom1_SelectedIndexChanged);
|
||||
//
|
||||
// columnHeader1
|
||||
//
|
||||
this.columnHeader1.Width = 342;
|
||||
//
|
||||
// stDropDownPanel2
|
||||
//
|
||||
this.stDropDownPanel2.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
|
||||
this.stDropDownPanel2.Controls.Add(this.stPanel1);
|
||||
this.stDropDownPanel2.ExpandedHeight = 0;
|
||||
this.stDropDownPanel2.IsExpanded = true;
|
||||
this.stDropDownPanel2.Location = new System.Drawing.Point(0, 195);
|
||||
this.stDropDownPanel2.Margin = new System.Windows.Forms.Padding(0);
|
||||
this.stDropDownPanel2.Name = "stDropDownPanel2";
|
||||
this.stDropDownPanel2.PanelName = "Animation Data";
|
||||
this.stDropDownPanel2.PanelValueName = "";
|
||||
this.stDropDownPanel2.SetIcon = null;
|
||||
this.stDropDownPanel2.SetIconAlphaColor = System.Drawing.SystemColors.Control;
|
||||
this.stDropDownPanel2.SetIconColor = System.Drawing.SystemColors.Control;
|
||||
this.stDropDownPanel2.Size = new System.Drawing.Size(348, 404);
|
||||
this.stDropDownPanel2.TabIndex = 2;
|
||||
//
|
||||
// stPanel1
|
||||
//
|
||||
this.stPanel1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
|
||||
| System.Windows.Forms.AnchorStyles.Left)
|
||||
| System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.stPanel1.Location = new System.Drawing.Point(3, 25);
|
||||
this.stPanel1.Name = "stPanel1";
|
||||
this.stPanel1.Size = new System.Drawing.Size(345, 385);
|
||||
this.stPanel1.TabIndex = 1;
|
||||
//
|
||||
// PaneAnimationController
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.Controls.Add(this.stFlowLayoutPanel1);
|
||||
this.Name = "PaneAnimationController";
|
||||
this.Size = new System.Drawing.Size(348, 599);
|
||||
this.stFlowLayoutPanel1.ResumeLayout(false);
|
||||
this.stDropDownPanel1.ResumeLayout(false);
|
||||
this.stDropDownPanel1.PerformLayout();
|
||||
this.stDropDownPanel2.ResumeLayout(false);
|
||||
this.stDropDownPanel2.PerformLayout();
|
||||
this.ResumeLayout(false);
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private Toolbox.Library.Forms.STFlowLayoutPanel stFlowLayoutPanel1;
|
||||
private Toolbox.Library.Forms.STDropDownPanel stDropDownPanel1;
|
||||
private Toolbox.Library.Forms.ListViewCustom listViewCustom1;
|
||||
private System.Windows.Forms.ColumnHeader columnHeader1;
|
||||
private Toolbox.Library.Forms.STDropDownPanel stDropDownPanel2;
|
||||
private Toolbox.Library.Forms.STPanel stPanel1;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,87 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Drawing;
|
||||
using System.Data;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Forms;
|
||||
using Toolbox.Library;
|
||||
|
||||
namespace LayoutBXLYT
|
||||
{
|
||||
public partial class PaneAnimationController : UserControl
|
||||
{
|
||||
private PaneEditor ParentEditor;
|
||||
private LayoutAnimEditorBasic AnimEditor;
|
||||
|
||||
public PaneAnimationController()
|
||||
{
|
||||
InitializeComponent();
|
||||
|
||||
AnimEditor = new LayoutAnimEditorBasic();
|
||||
AnimEditor.Dock = DockStyle.Fill;
|
||||
stPanel1.Controls.Add(AnimEditor);
|
||||
|
||||
stDropDownPanel1.ResetColors();
|
||||
stDropDownPanel2.ResetColors();
|
||||
}
|
||||
|
||||
public void LoadPane(BasePane pane, PaneEditor paneEditor)
|
||||
{
|
||||
ParentEditor = paneEditor;
|
||||
|
||||
var animations = ParentEditor.GetAnimations();
|
||||
var material = pane.TryGetActiveMaterial();
|
||||
string matName = material != null ? material.Name : "";
|
||||
|
||||
listViewCustom1.Items.Clear();
|
||||
|
||||
var archive = pane.LayoutFile.FileInfo.IFileInfo.ArchiveParent;
|
||||
if (archive != null)
|
||||
{
|
||||
foreach (var file in archive.Files) {
|
||||
if (Utils.GetExtension(file.FileName) == ".bflan" &&
|
||||
!animations.Any(x => x.FileName == file.FileName))
|
||||
{
|
||||
if (BxlanHeader.ContainsEntry(file.FileData, new string[2] { pane.Name, matName }))
|
||||
listViewCustom1.Items.Add(new ListViewItem(file.FileName) { Tag = file });
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = 0; i < animations?.Count; i++) {
|
||||
if (animations[i].ContainsEntry(pane.Name) || animations[i].ContainsEntry(matName))
|
||||
{
|
||||
listViewCustom1.Items.Add(new ListViewItem(animations[i].FileName) { Tag = animations[i] });
|
||||
}
|
||||
}
|
||||
LayoutAnimEditorBasic editor = new LayoutAnimEditorBasic();
|
||||
stPanel1.Controls.Add(editor);
|
||||
}
|
||||
|
||||
private void listViewCustom1_SelectedIndexChanged(object sender, EventArgs e)
|
||||
{
|
||||
if (listViewCustom1.SelectedIndices.Count > 0)
|
||||
{
|
||||
var item = listViewCustom1.SelectedItems[0];
|
||||
BxlanHeader bxlan = null;
|
||||
|
||||
if (item.Tag is ArchiveFileInfo) {
|
||||
var fileFormat = ((ArchiveFileInfo)item.Tag).OpenFile();
|
||||
bxlan = ((BXLAN)fileFormat).BxlanHeader;
|
||||
}
|
||||
else {
|
||||
bxlan = (BxlanHeader)item.Tag;
|
||||
}
|
||||
|
||||
if (bxlan == null) return;
|
||||
|
||||
for (int i = 0; i < bxlan.AnimationInfo.Entries.Count; i++)
|
||||
if (bxlan.AnimationInfo.Entries[i].Name == item.Text)
|
||||
AnimEditor.LoadAnimationEntry(bxlan, bxlan.AnimationInfo.Entries[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -28,40 +28,45 @@
|
|||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
this.stPanel3 = new Toolbox.Library.Forms.STPanel();
|
||||
this.stPanel2 = new Toolbox.Library.Forms.STPanel();
|
||||
this.stPanel4 = new Toolbox.Library.Forms.STPanel();
|
||||
this.miniToolStrip = new Toolbox.Library.Forms.STToolStrip();
|
||||
this.stToolStrip1 = new Toolbox.Library.Forms.STToolStrip();
|
||||
this.stPanel1 = new Toolbox.Library.Forms.STPanel();
|
||||
this.stPanel3.SuspendLayout();
|
||||
this.stPanel2.SuspendLayout();
|
||||
this.stPanel4.SuspendLayout();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// stPanel3
|
||||
// stPanel4
|
||||
//
|
||||
this.stPanel3.Controls.Add(this.stPanel2);
|
||||
this.stPanel3.Controls.Add(this.stPanel1);
|
||||
this.stPanel3.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||
this.stPanel3.Location = new System.Drawing.Point(0, 0);
|
||||
this.stPanel3.Name = "stPanel3";
|
||||
this.stPanel3.Size = new System.Drawing.Size(411, 288);
|
||||
this.stPanel3.TabIndex = 2;
|
||||
this.stPanel4.Controls.Add(this.stToolStrip1);
|
||||
this.stPanel4.Dock = System.Windows.Forms.DockStyle.Top;
|
||||
this.stPanel4.Location = new System.Drawing.Point(0, 0);
|
||||
this.stPanel4.Name = "stPanel4";
|
||||
this.stPanel4.Size = new System.Drawing.Size(462, 31);
|
||||
this.stPanel4.TabIndex = 2;
|
||||
//
|
||||
// stPanel2
|
||||
// miniToolStrip
|
||||
//
|
||||
this.stPanel2.Controls.Add(this.stToolStrip1);
|
||||
this.stPanel2.Dock = System.Windows.Forms.DockStyle.Top;
|
||||
this.stPanel2.Location = new System.Drawing.Point(0, 0);
|
||||
this.stPanel2.Name = "stPanel2";
|
||||
this.stPanel2.Size = new System.Drawing.Size(411, 27);
|
||||
this.stPanel2.TabIndex = 0;
|
||||
this.miniToolStrip.AccessibleName = "New item selection";
|
||||
this.miniToolStrip.AccessibleRole = System.Windows.Forms.AccessibleRole.ButtonDropDown;
|
||||
this.miniToolStrip.AutoSize = false;
|
||||
this.miniToolStrip.CanOverflow = false;
|
||||
this.miniToolStrip.Dock = System.Windows.Forms.DockStyle.None;
|
||||
this.miniToolStrip.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden;
|
||||
this.miniToolStrip.HighlightSelectedTab = false;
|
||||
this.miniToolStrip.LayoutStyle = System.Windows.Forms.ToolStripLayoutStyle.Flow;
|
||||
this.miniToolStrip.Location = new System.Drawing.Point(0, 0);
|
||||
this.miniToolStrip.Name = "miniToolStrip";
|
||||
this.miniToolStrip.Size = new System.Drawing.Size(411, 0);
|
||||
this.miniToolStrip.TabIndex = 0;
|
||||
//
|
||||
// stToolStrip1
|
||||
//
|
||||
this.stToolStrip1.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||
this.stToolStrip1.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden;
|
||||
this.stToolStrip1.HighlightSelectedTab = false;
|
||||
this.stToolStrip1.Location = new System.Drawing.Point(0, 0);
|
||||
this.stToolStrip1.Name = "stToolStrip1";
|
||||
this.stToolStrip1.Size = new System.Drawing.Size(411, 25);
|
||||
this.stToolStrip1.Size = new System.Drawing.Size(462, 31);
|
||||
this.stToolStrip1.TabIndex = 0;
|
||||
this.stToolStrip1.Text = "stToolStrip1";
|
||||
//
|
||||
|
@ -70,29 +75,29 @@
|
|||
this.stPanel1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
|
||||
| System.Windows.Forms.AnchorStyles.Left)
|
||||
| System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.stPanel1.Location = new System.Drawing.Point(3, 26);
|
||||
this.stPanel1.Location = new System.Drawing.Point(0, 31);
|
||||
this.stPanel1.Name = "stPanel1";
|
||||
this.stPanel1.Size = new System.Drawing.Size(411, 262);
|
||||
this.stPanel1.Size = new System.Drawing.Size(462, 298);
|
||||
this.stPanel1.TabIndex = 1;
|
||||
//
|
||||
// PaneEditor
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.ClientSize = new System.Drawing.Size(411, 288);
|
||||
this.Controls.Add(this.stPanel3);
|
||||
this.ClientSize = new System.Drawing.Size(462, 324);
|
||||
this.Controls.Add(this.stPanel4);
|
||||
this.Controls.Add(this.stPanel1);
|
||||
this.Name = "PaneEditor";
|
||||
this.stPanel3.ResumeLayout(false);
|
||||
this.stPanel2.ResumeLayout(false);
|
||||
this.stPanel2.PerformLayout();
|
||||
this.stPanel4.ResumeLayout(false);
|
||||
this.stPanel4.PerformLayout();
|
||||
this.ResumeLayout(false);
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
private Toolbox.Library.Forms.STPanel stPanel1;
|
||||
private Toolbox.Library.Forms.STPanel stPanel2;
|
||||
private Toolbox.Library.Forms.STPanel stPanel3;
|
||||
private Toolbox.Library.Forms.STPanel stPanel4;
|
||||
private Toolbox.Library.Forms.STToolStrip miniToolStrip;
|
||||
private Toolbox.Library.Forms.STToolStrip stToolStrip1;
|
||||
private Toolbox.Library.Forms.STPanel stPanel1;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -21,6 +21,8 @@ namespace LayoutBXLYT
|
|||
InitializeComponent();
|
||||
stToolStrip1.HighlightSelectedTab = true;
|
||||
stToolStrip1.ItemClicked += tabMenu_SelectedIndexChanged;
|
||||
|
||||
stToolStrip1.CanOverflow = false;
|
||||
}
|
||||
|
||||
public Dictionary<string, STGenericTexture> GetTextures()
|
||||
|
@ -95,6 +97,11 @@ namespace LayoutBXLYT
|
|||
((BasePaneEditor)editor).RefreshEditor();
|
||||
}
|
||||
|
||||
public List<BxlanHeader> GetAnimations()
|
||||
{
|
||||
return ParentEditor.AnimationFiles;
|
||||
}
|
||||
|
||||
public void LoadMaterial(BxlytMaterial material, LayoutEditor parentEditor)
|
||||
{
|
||||
ActiveMaterial = material;
|
||||
|
@ -159,6 +166,7 @@ namespace LayoutBXLYT
|
|||
}
|
||||
|
||||
AddTab("User Data", LoadUserData);
|
||||
AddTab("Anims", LoadAnimationData);
|
||||
|
||||
int tabIndex;
|
||||
if (pane is IPicturePane)
|
||||
|
@ -206,6 +214,13 @@ namespace LayoutBXLYT
|
|||
Runtime.LayoutEditor.NullPaneTabIndex = tabIndex;
|
||||
}
|
||||
|
||||
public void LoadAnimationData(object sender, EventArgs e)
|
||||
{
|
||||
UpdateTabIndex();
|
||||
var animEditor = GetActiveEditor<PaneAnimationController>();
|
||||
animEditor.LoadPane(ActivePane, this);
|
||||
}
|
||||
|
||||
private void LoadUserData(object sender, EventArgs e)
|
||||
{
|
||||
UpdateTabIndex();
|
||||
|
@ -340,5 +355,10 @@ namespace LayoutBXLYT
|
|||
|
||||
private void tabMenu_SelectedIndexChanged(object sender, EventArgs e) {
|
||||
}
|
||||
|
||||
private void stToolStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -120,7 +120,7 @@
|
|||
<metadata name="stToolStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>17, 17</value>
|
||||
</metadata>
|
||||
<metadata name="stToolStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<metadata name="miniToolStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>17, 17</value>
|
||||
</metadata>
|
||||
</root>
|
|
@ -431,10 +431,14 @@ namespace LayoutBXLYT
|
|||
|
||||
public void ShowBxlanEditor(BxlanHeader bxlan)
|
||||
{
|
||||
LayoutDocked dock = new LayoutDocked();
|
||||
LayoutAnimEditorBasic editor = new LayoutAnimEditorBasic();
|
||||
editor.LoadAnim(bxlan, ActiveLayout);
|
||||
editor.OnPropertyChanged += AnimPropertyChanged;
|
||||
editor.Show(this);
|
||||
editor.Dock = DockStyle.Fill;
|
||||
dock.Controls.Add(editor);
|
||||
|
||||
dock.Show(this);
|
||||
|
||||
/* if (LayoutAnimEditor != null) {
|
||||
LayoutAnimEditor.LoadFile(bxlan.GetGenericAnimation());
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -18,11 +18,22 @@ namespace FirstPlugin.Forms
|
|||
|
||||
private ImageList TextureIconList;
|
||||
|
||||
private TextEditor JsonTextEditor;
|
||||
|
||||
public GFLXMaterialEditor()
|
||||
{
|
||||
InitializeComponent();
|
||||
|
||||
JsonTextEditor = new TextEditor();
|
||||
JsonTextEditor.Dock = DockStyle.Fill;
|
||||
JsonTextEditor.IsJson = true;
|
||||
stPanel7.Controls.Add(JsonTextEditor);
|
||||
|
||||
stTabControl1.myBackColor = FormThemes.BaseTheme.FormBackColor;
|
||||
stTabControl2.myBackColor = FormThemes.BaseTheme.FormBackColor;
|
||||
|
||||
stPanel6.BackColor = FormThemes.BaseTheme.ListViewBackColor;
|
||||
|
||||
TextureIconList = new ImageList()
|
||||
{
|
||||
ColorDepth = ColorDepth.Depth32Bit,
|
||||
|
@ -35,20 +46,27 @@ namespace FirstPlugin.Forms
|
|||
stDropDownPanel1.ResetColors();
|
||||
stDropDownPanel2.ResetColors();
|
||||
|
||||
uvViewport1.UseGrid = false;
|
||||
|
||||
ResetSliders();
|
||||
}
|
||||
|
||||
private void ResetSliders()
|
||||
{
|
||||
barSlider1.SetTheme();
|
||||
barSlider2.SetTheme();
|
||||
barSlider3.SetTheme();
|
||||
barSlider4.SetTheme();
|
||||
param1CB.SetTheme();
|
||||
param2CB.SetTheme();
|
||||
param4CB.SetTheme();
|
||||
param3CB.SetTheme();
|
||||
|
||||
barSlider1.Value = 0;
|
||||
barSlider2.Value = 0;
|
||||
barSlider3.Value = 0;
|
||||
barSlider4.Value = 0;
|
||||
param1CB.Value = 0;
|
||||
param2CB.Value = 0;
|
||||
param4CB.Value = 0;
|
||||
param3CB.Value = 0;
|
||||
|
||||
translateXUD.Value = 0;
|
||||
translateYUD.Value = 0;
|
||||
scaleXUD.Value = 1;
|
||||
scaleYUD.Value = 1;
|
||||
}
|
||||
|
||||
public void LoadMaterial(GFLXMaterialData materialData)
|
||||
|
@ -107,40 +125,69 @@ namespace FirstPlugin.Forms
|
|||
if (listViewCustom1.SelectedIndices.Count > 0) {
|
||||
int index = listViewCustom1.SelectedIndices[0];
|
||||
var tex = MaterialData.TextureMaps[index];
|
||||
var gflxTex = ((GFLXTextureMap)tex).gflxTextureMap;
|
||||
stTextBox1.Text = tex.Name;
|
||||
stTextBox2.Text = tex.SamplerName;
|
||||
uvViewport1.ActiveTextureMap = tex;
|
||||
|
||||
foreach (var bntx in PluginRuntime.bntxContainers) {
|
||||
if (bntx.Textures.ContainsKey(tex.Name))
|
||||
UpdateTexturePreview(bntx.Textures[tex.Name]);
|
||||
translateXUD.Value = tex.Transform.Translate.X;
|
||||
translateYUD.Value = tex.Transform.Translate.Y;
|
||||
scaleXUD.Value = tex.Transform.Scale.X;
|
||||
scaleYUD.Value = tex.Transform.Scale.Y;
|
||||
|
||||
if (gflxTex.Params != null)
|
||||
{
|
||||
param1CB.Value = gflxTex.Params.Unknown1;
|
||||
param2CB.Value = gflxTex.Params.Unknown2;
|
||||
param3CB.Value = gflxTex.Params.Unknown3;
|
||||
param4CB.Value = gflxTex.Params.Unknown4;
|
||||
param5CB.Value = gflxTex.Params.Unknown5;
|
||||
param6CB.Value = gflxTex.Params.Unknown6;
|
||||
param7CB.Value = gflxTex.Params.Unknown7;
|
||||
param8CB.Value = gflxTex.Params.Unknown8;
|
||||
param9CB.Value = gflxTex.Params.lodBias;
|
||||
}
|
||||
|
||||
if (tex.Type == STGenericMatTexture.TextureType.Diffuse) {
|
||||
transformParamTB.Text = "ColorUV";
|
||||
}
|
||||
else
|
||||
transformParamTB.Text = "";
|
||||
|
||||
//Load mapped meshes
|
||||
uvViewport1.ActiveObjects.Clear();
|
||||
foreach (var mesh in MaterialData.ParentModel.GenericMeshes)
|
||||
{
|
||||
foreach (var poly in mesh.PolygonGroups)
|
||||
{
|
||||
if (poly.Material == MaterialData)
|
||||
uvViewport1.ActiveObjects.Add(mesh);
|
||||
}
|
||||
}
|
||||
|
||||
uvViewport1.UpdateViewport();
|
||||
}
|
||||
else
|
||||
{
|
||||
ResetSliders();
|
||||
pictureBoxCustom1.Image = null;
|
||||
transformParamTB.Text = "";
|
||||
uvViewport1.ActiveTextureMap = null;
|
||||
uvViewport1.UpdateViewport();
|
||||
}
|
||||
}
|
||||
|
||||
private void UpdateTexturePreview(STGenericTexture texture)
|
||||
private void barSlider7_Scroll(object sender, ScrollEventArgs e)
|
||||
{
|
||||
Thread Thread = new Thread((ThreadStart)(() =>
|
||||
|
||||
}
|
||||
|
||||
private void stTabControl1_SelectedIndexChanged(object sender, EventArgs e)
|
||||
{
|
||||
if (stTabControl1.SelectedIndex == 2)
|
||||
{
|
||||
Bitmap image = null;
|
||||
|
||||
try {
|
||||
image = texture.GetBitmap();
|
||||
}
|
||||
catch {
|
||||
image = Properties.Resources.TextureError;
|
||||
}
|
||||
|
||||
pictureBoxCustom1.Invoke((MethodInvoker)delegate {
|
||||
// Running on the UI thread
|
||||
pictureBoxCustom1.Image = image;
|
||||
});
|
||||
}));
|
||||
Thread.Start();
|
||||
var text = MaterialData.ConvertToJson();
|
||||
JsonTextEditor.FillEditor(text);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -117,212 +117,4 @@
|
|||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
|
||||
<data name="pictureBoxCustom1.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>
|
||||
iVBORw0KGgoAAAANSUhEUgAAAlgAAAJYCAMAAACJuGjuAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6
|
||||
JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAADAFBMVEXMzMzNzc3Ozs7Pz8/Q0NDR0dHS
|
||||
0tLT09PU1NTV1dXW1tbX19fY2NjZ2dna2trb29vc3Nzd3d3e3t7f39/g4ODh4eHi4uLj4+Pk5OTl5eXm
|
||||
5ubn5+fo6Ojp6enq6urr6+vs7Ozt7e3u7u7v7+/w8PDx8fHy8vLz8/P09PT19fX29vb39/f4+Pj5+fn6
|
||||
+vr7+/v8/Pz9/f3+/v7///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
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
|
||||
</value>
|
||||
</data>
|
||||
</root>
|
140
File_Format_Library/GUI/GFBMDL/GFLXMeshEditor.Designer.cs
generated
Normal file
140
File_Format_Library/GUI/GFBMDL/GFLXMeshEditor.Designer.cs
generated
Normal file
|
@ -0,0 +1,140 @@
|
|||
namespace FirstPlugin.Forms
|
||||
{
|
||||
partial class GFLXMeshEditor
|
||||
{
|
||||
/// <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()
|
||||
{
|
||||
this.materialCB = new Toolbox.Library.Forms.STComboBox();
|
||||
this.stLabel1 = new Toolbox.Library.Forms.STLabel();
|
||||
this.stFlowLayoutPanel1 = new Toolbox.Library.Forms.STFlowLayoutPanel();
|
||||
this.stDropDownPanel1 = new Toolbox.Library.Forms.STDropDownPanel();
|
||||
this.polyGroupCB = new Toolbox.Library.Forms.STComboBox();
|
||||
this.stLabel2 = new Toolbox.Library.Forms.STLabel();
|
||||
this.stFlowLayoutPanel1.SuspendLayout();
|
||||
this.stDropDownPanel1.SuspendLayout();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// materialCB
|
||||
//
|
||||
this.materialCB.BorderColor = System.Drawing.Color.Empty;
|
||||
this.materialCB.BorderStyle = System.Windows.Forms.ButtonBorderStyle.Solid;
|
||||
this.materialCB.ButtonColor = System.Drawing.Color.Empty;
|
||||
this.materialCB.FormattingEnabled = true;
|
||||
this.materialCB.IsReadOnly = false;
|
||||
this.materialCB.Location = new System.Drawing.Point(96, 68);
|
||||
this.materialCB.Name = "materialCB";
|
||||
this.materialCB.Size = new System.Drawing.Size(139, 21);
|
||||
this.materialCB.TabIndex = 0;
|
||||
this.materialCB.SelectedIndexChanged += new System.EventHandler(this.materialCB_SelectedIndexChanged);
|
||||
//
|
||||
// stLabel1
|
||||
//
|
||||
this.stLabel1.AutoSize = true;
|
||||
this.stLabel1.Location = new System.Drawing.Point(16, 68);
|
||||
this.stLabel1.Name = "stLabel1";
|
||||
this.stLabel1.Size = new System.Drawing.Size(47, 13);
|
||||
this.stLabel1.TabIndex = 1;
|
||||
this.stLabel1.Text = "Material:";
|
||||
//
|
||||
// stFlowLayoutPanel1
|
||||
//
|
||||
this.stFlowLayoutPanel1.Controls.Add(this.stDropDownPanel1);
|
||||
this.stFlowLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||
this.stFlowLayoutPanel1.FixedHeight = false;
|
||||
this.stFlowLayoutPanel1.FixedWidth = true;
|
||||
this.stFlowLayoutPanel1.Location = new System.Drawing.Point(0, 0);
|
||||
this.stFlowLayoutPanel1.Margin = new System.Windows.Forms.Padding(0);
|
||||
this.stFlowLayoutPanel1.Name = "stFlowLayoutPanel1";
|
||||
this.stFlowLayoutPanel1.Size = new System.Drawing.Size(440, 404);
|
||||
this.stFlowLayoutPanel1.TabIndex = 2;
|
||||
//
|
||||
// stDropDownPanel1
|
||||
//
|
||||
this.stDropDownPanel1.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
|
||||
this.stDropDownPanel1.Controls.Add(this.stLabel2);
|
||||
this.stDropDownPanel1.Controls.Add(this.polyGroupCB);
|
||||
this.stDropDownPanel1.Controls.Add(this.stLabel1);
|
||||
this.stDropDownPanel1.Controls.Add(this.materialCB);
|
||||
this.stDropDownPanel1.ExpandedHeight = 0;
|
||||
this.stDropDownPanel1.IsExpanded = true;
|
||||
this.stDropDownPanel1.Location = new System.Drawing.Point(0, 0);
|
||||
this.stDropDownPanel1.Margin = new System.Windows.Forms.Padding(0);
|
||||
this.stDropDownPanel1.Name = "stDropDownPanel1";
|
||||
this.stDropDownPanel1.PanelName = "Polygon Group";
|
||||
this.stDropDownPanel1.PanelValueName = "";
|
||||
this.stDropDownPanel1.SetIcon = null;
|
||||
this.stDropDownPanel1.SetIconAlphaColor = System.Drawing.SystemColors.Control;
|
||||
this.stDropDownPanel1.SetIconColor = System.Drawing.SystemColors.Control;
|
||||
this.stDropDownPanel1.Size = new System.Drawing.Size(440, 164);
|
||||
this.stDropDownPanel1.TabIndex = 0;
|
||||
//
|
||||
// polyGroupCB
|
||||
//
|
||||
this.polyGroupCB.BorderColor = System.Drawing.Color.Empty;
|
||||
this.polyGroupCB.BorderStyle = System.Windows.Forms.ButtonBorderStyle.Solid;
|
||||
this.polyGroupCB.ButtonColor = System.Drawing.Color.Empty;
|
||||
this.polyGroupCB.FormattingEnabled = true;
|
||||
this.polyGroupCB.IsReadOnly = false;
|
||||
this.polyGroupCB.Location = new System.Drawing.Point(96, 38);
|
||||
this.polyGroupCB.Name = "polyGroupCB";
|
||||
this.polyGroupCB.Size = new System.Drawing.Size(139, 21);
|
||||
this.polyGroupCB.TabIndex = 2;
|
||||
this.polyGroupCB.SelectedIndexChanged += new System.EventHandler(this.polyGroupCB_SelectedIndexChanged);
|
||||
//
|
||||
// stLabel2
|
||||
//
|
||||
this.stLabel2.AutoSize = true;
|
||||
this.stLabel2.Location = new System.Drawing.Point(16, 38);
|
||||
this.stLabel2.Name = "stLabel2";
|
||||
this.stLabel2.Size = new System.Drawing.Size(39, 13);
|
||||
this.stLabel2.TabIndex = 3;
|
||||
this.stLabel2.Text = "Group:";
|
||||
//
|
||||
// GFLXMeshEditor
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.Controls.Add(this.stFlowLayoutPanel1);
|
||||
this.Name = "GFLXMeshEditor";
|
||||
this.Size = new System.Drawing.Size(440, 404);
|
||||
this.stFlowLayoutPanel1.ResumeLayout(false);
|
||||
this.stDropDownPanel1.ResumeLayout(false);
|
||||
this.stDropDownPanel1.PerformLayout();
|
||||
this.ResumeLayout(false);
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private Toolbox.Library.Forms.STComboBox materialCB;
|
||||
private Toolbox.Library.Forms.STLabel stLabel1;
|
||||
private Toolbox.Library.Forms.STFlowLayoutPanel stFlowLayoutPanel1;
|
||||
private Toolbox.Library.Forms.STDropDownPanel stDropDownPanel1;
|
||||
private Toolbox.Library.Forms.STLabel stLabel2;
|
||||
private Toolbox.Library.Forms.STComboBox polyGroupCB;
|
||||
}
|
||||
}
|
76
File_Format_Library/GUI/GFBMDL/GFLXMeshEditor.cs
Normal file
76
File_Format_Library/GUI/GFBMDL/GFLXMeshEditor.cs
Normal file
|
@ -0,0 +1,76 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Drawing;
|
||||
using System.Data;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace FirstPlugin.Forms
|
||||
{
|
||||
public partial class GFLXMeshEditor : UserControl
|
||||
{
|
||||
private bool Loaded = false;
|
||||
private GFLXMesh ActiveMesh;
|
||||
|
||||
public GFLXMeshEditor()
|
||||
{
|
||||
InitializeComponent();
|
||||
|
||||
stDropDownPanel1.ResetColors();
|
||||
}
|
||||
|
||||
public void LoadMesh(GFLXMesh mesh)
|
||||
{
|
||||
polyGroupCB.Items.Clear();
|
||||
materialCB.Items.Clear();
|
||||
|
||||
ActiveMesh = mesh;
|
||||
Loaded = false;
|
||||
|
||||
var materials = mesh.ParentModel.GenericMaterials;
|
||||
for (int i = 0; i < materials.Count; i++)
|
||||
materialCB.Items.Add(materials[i].Text);
|
||||
|
||||
for (int i = 0; i < mesh.PolygonGroups.Count; i++) {
|
||||
polyGroupCB.Items.Add($"{i}");
|
||||
}
|
||||
|
||||
polyGroupCB.SelectedIndex = 0;
|
||||
|
||||
Loaded = true;
|
||||
}
|
||||
|
||||
private void polyGroupCB_SelectedIndexChanged(object sender, EventArgs e)
|
||||
{
|
||||
int index = polyGroupCB.SelectedIndex;
|
||||
if (index >= 0)
|
||||
{
|
||||
var poly = ActiveMesh.PolygonGroups[index];
|
||||
var mat = ActiveMesh.ParentModel.GenericMaterials[poly.MaterialIndex];
|
||||
materialCB.SelectedItem = mat.Text;
|
||||
}
|
||||
}
|
||||
|
||||
private void materialCB_SelectedIndexChanged(object sender, EventArgs e) {
|
||||
if (!Loaded) return;
|
||||
|
||||
int index = polyGroupCB.SelectedIndex;
|
||||
if (index >= 0)
|
||||
{
|
||||
var poly = ActiveMesh.PolygonGroups[index];
|
||||
var materials = ActiveMesh.ParentModel.GenericMaterials;
|
||||
var mappedMat = materials.First(x => x.Text == materialCB.GetSelectedText());
|
||||
if (mappedMat != null) {
|
||||
var matIndex = materials.IndexOf(mappedMat);
|
||||
poly.MaterialIndex = matIndex;
|
||||
ActiveMesh.MeshData.Polygons[index].MaterialIndex = (uint)matIndex;
|
||||
|
||||
Toolbox.Library.LibraryGUI.UpdateViewport();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
600
File_Format_Library/GUI/GFBMDL/GFLXModelImporter.Designer.cs
generated
Normal file
600
File_Format_Library/GUI/GFBMDL/GFLXModelImporter.Designer.cs
generated
Normal file
|
@ -0,0 +1,600 @@
|
|||
namespace FirstPlugin.Forms
|
||||
{
|
||||
partial class GFLXModelImporter
|
||||
{
|
||||
/// <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()
|
||||
{
|
||||
this.presetCB = new Toolbox.Library.Forms.STComboBox();
|
||||
this.stLabel1 = new Toolbox.Library.Forms.STLabel();
|
||||
this.chkUseNormals = new Toolbox.Library.Forms.STCheckBox();
|
||||
this.chkHasUv1 = new Toolbox.Library.Forms.STCheckBox();
|
||||
this.chkUseBoneIndex = new Toolbox.Library.Forms.STCheckBox();
|
||||
this.chkUseColor1 = new Toolbox.Library.Forms.STCheckBox();
|
||||
this.normalFormatCB = new Toolbox.Library.Forms.STComboBox();
|
||||
this.uv0FormatCB = new Toolbox.Library.Forms.STComboBox();
|
||||
this.boneFormatCB = new Toolbox.Library.Forms.STComboBox();
|
||||
this.color0FormatCB = new Toolbox.Library.Forms.STComboBox();
|
||||
this.uv1FormatCB = new Toolbox.Library.Forms.STComboBox();
|
||||
this.chkHasUv2 = new Toolbox.Library.Forms.STCheckBox();
|
||||
this.color1FormatCB = new Toolbox.Library.Forms.STComboBox();
|
||||
this.chkUseColor2 = new Toolbox.Library.Forms.STCheckBox();
|
||||
this.bitangentFormatCB = new Toolbox.Library.Forms.STComboBox();
|
||||
this.chkBitangents = new Toolbox.Library.Forms.STCheckBox();
|
||||
this.positionFormatCB = new Toolbox.Library.Forms.STComboBox();
|
||||
this.stCheckBox8 = new Toolbox.Library.Forms.STCheckBox();
|
||||
this.stLabel2 = new Toolbox.Library.Forms.STLabel();
|
||||
this.materiialPresetCB = new Toolbox.Library.Forms.STComboBox();
|
||||
this.stButton1 = new Toolbox.Library.Forms.STButton();
|
||||
this.listViewCustom1 = new Toolbox.Library.Forms.ListViewCustom();
|
||||
this.columnHeader1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
|
||||
this.weightFormatCB = new Toolbox.Library.Forms.STComboBox();
|
||||
this.stPanel1 = new Toolbox.Library.Forms.STPanel();
|
||||
this.tangentFormatCB = new Toolbox.Library.Forms.STComboBox();
|
||||
this.chkTangents = new Toolbox.Library.Forms.STCheckBox();
|
||||
this.chkUseBoneWeights = new Toolbox.Library.Forms.STCheckBox();
|
||||
this.stLabel3 = new Toolbox.Library.Forms.STLabel();
|
||||
this.stLabel4 = new Toolbox.Library.Forms.STLabel();
|
||||
this.rotateModel90YUD = new Toolbox.Library.Forms.NumericUpDownFloat();
|
||||
this.stLabel5 = new Toolbox.Library.Forms.STLabel();
|
||||
this.stPanel2 = new Toolbox.Library.Forms.STPanel();
|
||||
this.chkMatchAttributes = new Toolbox.Library.Forms.STCheckBox();
|
||||
this.chkUseOriginalBones = new Toolbox.Library.Forms.STCheckBox();
|
||||
this.stCheckBox7 = new Toolbox.Library.Forms.STCheckBox();
|
||||
this.stButton2 = new Toolbox.Library.Forms.STButton();
|
||||
this.contentContainer.SuspendLayout();
|
||||
this.stPanel1.SuspendLayout();
|
||||
((System.ComponentModel.ISupportInitialize)(this.rotateModel90YUD)).BeginInit();
|
||||
this.stPanel2.SuspendLayout();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// contentContainer
|
||||
//
|
||||
this.contentContainer.Controls.Add(this.stButton2);
|
||||
this.contentContainer.Controls.Add(this.stPanel2);
|
||||
this.contentContainer.Controls.Add(this.stPanel1);
|
||||
this.contentContainer.Controls.Add(this.listViewCustom1);
|
||||
this.contentContainer.Size = new System.Drawing.Size(605, 601);
|
||||
this.contentContainer.Controls.SetChildIndex(this.listViewCustom1, 0);
|
||||
this.contentContainer.Controls.SetChildIndex(this.stPanel1, 0);
|
||||
this.contentContainer.Controls.SetChildIndex(this.stPanel2, 0);
|
||||
this.contentContainer.Controls.SetChildIndex(this.stButton2, 0);
|
||||
//
|
||||
// presetCB
|
||||
//
|
||||
this.presetCB.BorderColor = System.Drawing.Color.Empty;
|
||||
this.presetCB.BorderStyle = System.Windows.Forms.ButtonBorderStyle.Solid;
|
||||
this.presetCB.ButtonColor = System.Drawing.Color.Empty;
|
||||
this.presetCB.FormattingEnabled = true;
|
||||
this.presetCB.IsReadOnly = false;
|
||||
this.presetCB.Location = new System.Drawing.Point(153, 42);
|
||||
this.presetCB.Name = "presetCB";
|
||||
this.presetCB.Size = new System.Drawing.Size(120, 21);
|
||||
this.presetCB.TabIndex = 11;
|
||||
//
|
||||
// stLabel1
|
||||
//
|
||||
this.stLabel1.AutoSize = true;
|
||||
this.stLabel1.Location = new System.Drawing.Point(13, 45);
|
||||
this.stLabel1.Name = "stLabel1";
|
||||
this.stLabel1.Size = new System.Drawing.Size(40, 13);
|
||||
this.stLabel1.TabIndex = 12;
|
||||
this.stLabel1.Text = "Preset:";
|
||||
//
|
||||
// chkUseNormals
|
||||
//
|
||||
this.chkUseNormals.AutoSize = true;
|
||||
this.chkUseNormals.Location = new System.Drawing.Point(12, 104);
|
||||
this.chkUseNormals.Name = "chkUseNormals";
|
||||
this.chkUseNormals.Size = new System.Drawing.Size(86, 17);
|
||||
this.chkUseNormals.TabIndex = 14;
|
||||
this.chkUseNormals.Text = "Use Normals";
|
||||
this.chkUseNormals.UseVisualStyleBackColor = true;
|
||||
this.chkUseNormals.CheckedChanged += new System.EventHandler(this.ApplySettings);
|
||||
//
|
||||
// chkHasUv1
|
||||
//
|
||||
this.chkHasUv1.AutoSize = true;
|
||||
this.chkHasUv1.Location = new System.Drawing.Point(12, 187);
|
||||
this.chkHasUv1.Name = "chkHasUv1";
|
||||
this.chkHasUv1.Size = new System.Drawing.Size(114, 17);
|
||||
this.chkHasUv1.TabIndex = 15;
|
||||
this.chkHasUv1.Text = "Use UV Channel 1";
|
||||
this.chkHasUv1.UseVisualStyleBackColor = true;
|
||||
this.chkHasUv1.CheckedChanged += new System.EventHandler(this.ApplySettings);
|
||||
//
|
||||
// chkUseBoneIndex
|
||||
//
|
||||
this.chkUseBoneIndex.AutoSize = true;
|
||||
this.chkUseBoneIndex.Location = new System.Drawing.Point(12, 301);
|
||||
this.chkUseBoneIndex.Name = "chkUseBoneIndex";
|
||||
this.chkUseBoneIndex.Size = new System.Drawing.Size(110, 17);
|
||||
this.chkUseBoneIndex.TabIndex = 16;
|
||||
this.chkUseBoneIndex.Text = "Use Bone Indices";
|
||||
this.chkUseBoneIndex.UseVisualStyleBackColor = true;
|
||||
this.chkUseBoneIndex.CheckedChanged += new System.EventHandler(this.ApplySettings);
|
||||
//
|
||||
// chkUseColor1
|
||||
//
|
||||
this.chkUseColor1.AutoSize = true;
|
||||
this.chkUseColor1.Location = new System.Drawing.Point(12, 247);
|
||||
this.chkUseColor1.Name = "chkUseColor1";
|
||||
this.chkUseColor1.Size = new System.Drawing.Size(123, 17);
|
||||
this.chkUseColor1.TabIndex = 17;
|
||||
this.chkUseColor1.Text = "Use Color Channel 1";
|
||||
this.chkUseColor1.UseVisualStyleBackColor = true;
|
||||
this.chkUseColor1.CheckedChanged += new System.EventHandler(this.ApplySettings);
|
||||
//
|
||||
// normalFormatCB
|
||||
//
|
||||
this.normalFormatCB.BorderColor = System.Drawing.Color.Empty;
|
||||
this.normalFormatCB.BorderStyle = System.Windows.Forms.ButtonBorderStyle.Solid;
|
||||
this.normalFormatCB.ButtonColor = System.Drawing.Color.Empty;
|
||||
this.normalFormatCB.FormattingEnabled = true;
|
||||
this.normalFormatCB.IsReadOnly = false;
|
||||
this.normalFormatCB.Location = new System.Drawing.Point(147, 102);
|
||||
this.normalFormatCB.Name = "normalFormatCB";
|
||||
this.normalFormatCB.Size = new System.Drawing.Size(131, 21);
|
||||
this.normalFormatCB.TabIndex = 18;
|
||||
this.normalFormatCB.SelectedIndexChanged += new System.EventHandler(this.ApplySettings);
|
||||
//
|
||||
// uv0FormatCB
|
||||
//
|
||||
this.uv0FormatCB.BorderColor = System.Drawing.Color.Empty;
|
||||
this.uv0FormatCB.BorderStyle = System.Windows.Forms.ButtonBorderStyle.Solid;
|
||||
this.uv0FormatCB.ButtonColor = System.Drawing.Color.Empty;
|
||||
this.uv0FormatCB.FormattingEnabled = true;
|
||||
this.uv0FormatCB.IsReadOnly = false;
|
||||
this.uv0FormatCB.Location = new System.Drawing.Point(147, 183);
|
||||
this.uv0FormatCB.Name = "uv0FormatCB";
|
||||
this.uv0FormatCB.Size = new System.Drawing.Size(131, 21);
|
||||
this.uv0FormatCB.TabIndex = 19;
|
||||
this.uv0FormatCB.SelectedIndexChanged += new System.EventHandler(this.ApplySettings);
|
||||
//
|
||||
// boneFormatCB
|
||||
//
|
||||
this.boneFormatCB.BorderColor = System.Drawing.Color.Empty;
|
||||
this.boneFormatCB.BorderStyle = System.Windows.Forms.ButtonBorderStyle.Solid;
|
||||
this.boneFormatCB.ButtonColor = System.Drawing.Color.Empty;
|
||||
this.boneFormatCB.FormattingEnabled = true;
|
||||
this.boneFormatCB.IsReadOnly = false;
|
||||
this.boneFormatCB.Location = new System.Drawing.Point(143, 297);
|
||||
this.boneFormatCB.Name = "boneFormatCB";
|
||||
this.boneFormatCB.Size = new System.Drawing.Size(133, 21);
|
||||
this.boneFormatCB.TabIndex = 21;
|
||||
this.boneFormatCB.SelectedIndexChanged += new System.EventHandler(this.ApplySettings);
|
||||
//
|
||||
// color0FormatCB
|
||||
//
|
||||
this.color0FormatCB.BorderColor = System.Drawing.Color.Empty;
|
||||
this.color0FormatCB.BorderStyle = System.Windows.Forms.ButtonBorderStyle.Solid;
|
||||
this.color0FormatCB.ButtonColor = System.Drawing.Color.Empty;
|
||||
this.color0FormatCB.FormattingEnabled = true;
|
||||
this.color0FormatCB.IsReadOnly = false;
|
||||
this.color0FormatCB.Location = new System.Drawing.Point(145, 245);
|
||||
this.color0FormatCB.Name = "color0FormatCB";
|
||||
this.color0FormatCB.Size = new System.Drawing.Size(131, 21);
|
||||
this.color0FormatCB.TabIndex = 20;
|
||||
this.color0FormatCB.SelectedIndexChanged += new System.EventHandler(this.ApplySettings);
|
||||
//
|
||||
// uv1FormatCB
|
||||
//
|
||||
this.uv1FormatCB.BorderColor = System.Drawing.Color.Empty;
|
||||
this.uv1FormatCB.BorderStyle = System.Windows.Forms.ButtonBorderStyle.Solid;
|
||||
this.uv1FormatCB.ButtonColor = System.Drawing.Color.Empty;
|
||||
this.uv1FormatCB.FormattingEnabled = true;
|
||||
this.uv1FormatCB.IsReadOnly = false;
|
||||
this.uv1FormatCB.Location = new System.Drawing.Point(147, 210);
|
||||
this.uv1FormatCB.Name = "uv1FormatCB";
|
||||
this.uv1FormatCB.Size = new System.Drawing.Size(131, 21);
|
||||
this.uv1FormatCB.TabIndex = 23;
|
||||
this.uv1FormatCB.SelectedIndexChanged += new System.EventHandler(this.ApplySettings);
|
||||
//
|
||||
// chkHasUv2
|
||||
//
|
||||
this.chkHasUv2.AutoSize = true;
|
||||
this.chkHasUv2.Location = new System.Drawing.Point(12, 214);
|
||||
this.chkHasUv2.Name = "chkHasUv2";
|
||||
this.chkHasUv2.Size = new System.Drawing.Size(114, 17);
|
||||
this.chkHasUv2.TabIndex = 22;
|
||||
this.chkHasUv2.Text = "Use UV Channel 2";
|
||||
this.chkHasUv2.UseVisualStyleBackColor = true;
|
||||
this.chkHasUv2.CheckedChanged += new System.EventHandler(this.ApplySettings);
|
||||
//
|
||||
// color1FormatCB
|
||||
//
|
||||
this.color1FormatCB.BorderColor = System.Drawing.Color.Empty;
|
||||
this.color1FormatCB.BorderStyle = System.Windows.Forms.ButtonBorderStyle.Solid;
|
||||
this.color1FormatCB.ButtonColor = System.Drawing.Color.Empty;
|
||||
this.color1FormatCB.FormattingEnabled = true;
|
||||
this.color1FormatCB.IsReadOnly = false;
|
||||
this.color1FormatCB.Location = new System.Drawing.Point(145, 272);
|
||||
this.color1FormatCB.Name = "color1FormatCB";
|
||||
this.color1FormatCB.Size = new System.Drawing.Size(131, 21);
|
||||
this.color1FormatCB.TabIndex = 25;
|
||||
this.color1FormatCB.SelectedIndexChanged += new System.EventHandler(this.ApplySettings);
|
||||
//
|
||||
// chkUseColor2
|
||||
//
|
||||
this.chkUseColor2.AutoSize = true;
|
||||
this.chkUseColor2.Location = new System.Drawing.Point(12, 274);
|
||||
this.chkUseColor2.Name = "chkUseColor2";
|
||||
this.chkUseColor2.Size = new System.Drawing.Size(123, 17);
|
||||
this.chkUseColor2.TabIndex = 24;
|
||||
this.chkUseColor2.Text = "Use Color Channel 2";
|
||||
this.chkUseColor2.UseVisualStyleBackColor = true;
|
||||
this.chkUseColor2.CheckedChanged += new System.EventHandler(this.ApplySettings);
|
||||
//
|
||||
// bitangentFormatCB
|
||||
//
|
||||
this.bitangentFormatCB.BorderColor = System.Drawing.Color.Empty;
|
||||
this.bitangentFormatCB.BorderStyle = System.Windows.Forms.ButtonBorderStyle.Solid;
|
||||
this.bitangentFormatCB.ButtonColor = System.Drawing.Color.Empty;
|
||||
this.bitangentFormatCB.FormattingEnabled = true;
|
||||
this.bitangentFormatCB.IsReadOnly = false;
|
||||
this.bitangentFormatCB.Location = new System.Drawing.Point(147, 129);
|
||||
this.bitangentFormatCB.Name = "bitangentFormatCB";
|
||||
this.bitangentFormatCB.Size = new System.Drawing.Size(131, 21);
|
||||
this.bitangentFormatCB.TabIndex = 27;
|
||||
this.bitangentFormatCB.SelectedIndexChanged += new System.EventHandler(this.ApplySettings);
|
||||
//
|
||||
// chkBitangents
|
||||
//
|
||||
this.chkBitangents.AutoSize = true;
|
||||
this.chkBitangents.Location = new System.Drawing.Point(12, 131);
|
||||
this.chkBitangents.Name = "chkBitangents";
|
||||
this.chkBitangents.Size = new System.Drawing.Size(98, 17);
|
||||
this.chkBitangents.TabIndex = 26;
|
||||
this.chkBitangents.Text = "Use Bitangents";
|
||||
this.chkBitangents.UseVisualStyleBackColor = true;
|
||||
this.chkBitangents.CheckedChanged += new System.EventHandler(this.ApplySettings);
|
||||
//
|
||||
// positionFormatCB
|
||||
//
|
||||
this.positionFormatCB.BorderColor = System.Drawing.Color.Empty;
|
||||
this.positionFormatCB.BorderStyle = System.Windows.Forms.ButtonBorderStyle.Solid;
|
||||
this.positionFormatCB.ButtonColor = System.Drawing.Color.Empty;
|
||||
this.positionFormatCB.FormattingEnabled = true;
|
||||
this.positionFormatCB.IsReadOnly = false;
|
||||
this.positionFormatCB.Location = new System.Drawing.Point(147, 75);
|
||||
this.positionFormatCB.Name = "positionFormatCB";
|
||||
this.positionFormatCB.Size = new System.Drawing.Size(131, 21);
|
||||
this.positionFormatCB.TabIndex = 29;
|
||||
this.positionFormatCB.SelectedIndexChanged += new System.EventHandler(this.ApplySettings);
|
||||
//
|
||||
// stCheckBox8
|
||||
//
|
||||
this.stCheckBox8.AutoSize = true;
|
||||
this.stCheckBox8.Checked = true;
|
||||
this.stCheckBox8.CheckState = System.Windows.Forms.CheckState.Checked;
|
||||
this.stCheckBox8.Enabled = false;
|
||||
this.stCheckBox8.Location = new System.Drawing.Point(12, 77);
|
||||
this.stCheckBox8.Name = "stCheckBox8";
|
||||
this.stCheckBox8.Size = new System.Drawing.Size(63, 17);
|
||||
this.stCheckBox8.TabIndex = 28;
|
||||
this.stCheckBox8.Text = "Position";
|
||||
this.stCheckBox8.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// stLabel2
|
||||
//
|
||||
this.stLabel2.AutoSize = true;
|
||||
this.stLabel2.Location = new System.Drawing.Point(9, 39);
|
||||
this.stLabel2.Name = "stLabel2";
|
||||
this.stLabel2.Size = new System.Drawing.Size(47, 13);
|
||||
this.stLabel2.TabIndex = 31;
|
||||
this.stLabel2.Text = "Material:";
|
||||
//
|
||||
// materiialPresetCB
|
||||
//
|
||||
this.materiialPresetCB.BorderColor = System.Drawing.Color.Empty;
|
||||
this.materiialPresetCB.BorderStyle = System.Windows.Forms.ButtonBorderStyle.Solid;
|
||||
this.materiialPresetCB.ButtonColor = System.Drawing.Color.Empty;
|
||||
this.materiialPresetCB.FormattingEnabled = true;
|
||||
this.materiialPresetCB.IsReadOnly = false;
|
||||
this.materiialPresetCB.Location = new System.Drawing.Point(145, 36);
|
||||
this.materiialPresetCB.Name = "materiialPresetCB";
|
||||
this.materiialPresetCB.Size = new System.Drawing.Size(131, 21);
|
||||
this.materiialPresetCB.TabIndex = 32;
|
||||
this.materiialPresetCB.SelectedIndexChanged += new System.EventHandler(this.ApplySettings);
|
||||
//
|
||||
// stButton1
|
||||
//
|
||||
this.stButton1.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
|
||||
this.stButton1.Location = new System.Drawing.Point(282, 34);
|
||||
this.stButton1.Name = "stButton1";
|
||||
this.stButton1.Size = new System.Drawing.Size(31, 23);
|
||||
this.stButton1.TabIndex = 33;
|
||||
this.stButton1.Text = "+";
|
||||
this.stButton1.UseVisualStyleBackColor = false;
|
||||
this.stButton1.Click += new System.EventHandler(this.stButton1_Click);
|
||||
//
|
||||
// listViewCustom1
|
||||
//
|
||||
this.listViewCustom1.BorderStyle = System.Windows.Forms.BorderStyle.None;
|
||||
this.listViewCustom1.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
|
||||
this.columnHeader1});
|
||||
this.listViewCustom1.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.None;
|
||||
this.listViewCustom1.HideSelection = false;
|
||||
this.listViewCustom1.Location = new System.Drawing.Point(5, 31);
|
||||
this.listViewCustom1.Name = "listViewCustom1";
|
||||
this.listViewCustom1.OwnerDraw = true;
|
||||
this.listViewCustom1.Size = new System.Drawing.Size(208, 499);
|
||||
this.listViewCustom1.TabIndex = 34;
|
||||
this.listViewCustom1.UseCompatibleStateImageBehavior = false;
|
||||
this.listViewCustom1.View = System.Windows.Forms.View.Details;
|
||||
this.listViewCustom1.SelectedIndexChanged += new System.EventHandler(this.listViewCustom1_SelectedIndexChanged);
|
||||
//
|
||||
// columnHeader1
|
||||
//
|
||||
this.columnHeader1.Width = 202;
|
||||
//
|
||||
// weightFormatCB
|
||||
//
|
||||
this.weightFormatCB.BorderColor = System.Drawing.Color.Empty;
|
||||
this.weightFormatCB.BorderStyle = System.Windows.Forms.ButtonBorderStyle.Solid;
|
||||
this.weightFormatCB.ButtonColor = System.Drawing.Color.Empty;
|
||||
this.weightFormatCB.FormattingEnabled = true;
|
||||
this.weightFormatCB.IsReadOnly = false;
|
||||
this.weightFormatCB.Location = new System.Drawing.Point(143, 324);
|
||||
this.weightFormatCB.Name = "weightFormatCB";
|
||||
this.weightFormatCB.Size = new System.Drawing.Size(135, 21);
|
||||
this.weightFormatCB.TabIndex = 35;
|
||||
this.weightFormatCB.SelectedIndexChanged += new System.EventHandler(this.ApplySettings);
|
||||
//
|
||||
// stPanel1
|
||||
//
|
||||
this.stPanel1.Controls.Add(this.tangentFormatCB);
|
||||
this.stPanel1.Controls.Add(this.chkTangents);
|
||||
this.stPanel1.Controls.Add(this.chkUseBoneWeights);
|
||||
this.stPanel1.Controls.Add(this.stLabel2);
|
||||
this.stPanel1.Controls.Add(this.stLabel3);
|
||||
this.stPanel1.Controls.Add(this.weightFormatCB);
|
||||
this.stPanel1.Controls.Add(this.chkUseNormals);
|
||||
this.stPanel1.Controls.Add(this.chkHasUv1);
|
||||
this.stPanel1.Controls.Add(this.stButton1);
|
||||
this.stPanel1.Controls.Add(this.chkUseBoneIndex);
|
||||
this.stPanel1.Controls.Add(this.materiialPresetCB);
|
||||
this.stPanel1.Controls.Add(this.chkUseColor1);
|
||||
this.stPanel1.Controls.Add(this.normalFormatCB);
|
||||
this.stPanel1.Controls.Add(this.positionFormatCB);
|
||||
this.stPanel1.Controls.Add(this.uv0FormatCB);
|
||||
this.stPanel1.Controls.Add(this.stCheckBox8);
|
||||
this.stPanel1.Controls.Add(this.color0FormatCB);
|
||||
this.stPanel1.Controls.Add(this.bitangentFormatCB);
|
||||
this.stPanel1.Controls.Add(this.boneFormatCB);
|
||||
this.stPanel1.Controls.Add(this.chkBitangents);
|
||||
this.stPanel1.Controls.Add(this.chkHasUv2);
|
||||
this.stPanel1.Controls.Add(this.color1FormatCB);
|
||||
this.stPanel1.Controls.Add(this.uv1FormatCB);
|
||||
this.stPanel1.Controls.Add(this.chkUseColor2);
|
||||
this.stPanel1.Location = new System.Drawing.Point(219, 206);
|
||||
this.stPanel1.Name = "stPanel1";
|
||||
this.stPanel1.Size = new System.Drawing.Size(378, 356);
|
||||
this.stPanel1.TabIndex = 36;
|
||||
//
|
||||
// tangentFormatCB
|
||||
//
|
||||
this.tangentFormatCB.BorderColor = System.Drawing.Color.Empty;
|
||||
this.tangentFormatCB.BorderStyle = System.Windows.Forms.ButtonBorderStyle.Solid;
|
||||
this.tangentFormatCB.ButtonColor = System.Drawing.Color.Empty;
|
||||
this.tangentFormatCB.FormattingEnabled = true;
|
||||
this.tangentFormatCB.IsReadOnly = false;
|
||||
this.tangentFormatCB.Location = new System.Drawing.Point(147, 156);
|
||||
this.tangentFormatCB.Name = "tangentFormatCB";
|
||||
this.tangentFormatCB.Size = new System.Drawing.Size(131, 21);
|
||||
this.tangentFormatCB.TabIndex = 40;
|
||||
this.tangentFormatCB.SelectedIndexChanged += new System.EventHandler(this.ApplySettings);
|
||||
//
|
||||
// chkTangents
|
||||
//
|
||||
this.chkTangents.AutoSize = true;
|
||||
this.chkTangents.Location = new System.Drawing.Point(12, 158);
|
||||
this.chkTangents.Name = "chkTangents";
|
||||
this.chkTangents.Size = new System.Drawing.Size(93, 17);
|
||||
this.chkTangents.TabIndex = 39;
|
||||
this.chkTangents.Text = "Use Tangents";
|
||||
this.chkTangents.UseVisualStyleBackColor = true;
|
||||
this.chkTangents.CheckedChanged += new System.EventHandler(this.ApplySettings);
|
||||
//
|
||||
// chkUseBoneWeights
|
||||
//
|
||||
this.chkUseBoneWeights.AutoSize = true;
|
||||
this.chkUseBoneWeights.Location = new System.Drawing.Point(12, 328);
|
||||
this.chkUseBoneWeights.Name = "chkUseBoneWeights";
|
||||
this.chkUseBoneWeights.Size = new System.Drawing.Size(115, 17);
|
||||
this.chkUseBoneWeights.TabIndex = 38;
|
||||
this.chkUseBoneWeights.Text = "Use Bone Weights";
|
||||
this.chkUseBoneWeights.UseVisualStyleBackColor = true;
|
||||
this.chkUseBoneWeights.CheckedChanged += new System.EventHandler(this.ApplySettings);
|
||||
//
|
||||
// stLabel3
|
||||
//
|
||||
this.stLabel3.AutoSize = true;
|
||||
this.stLabel3.Location = new System.Drawing.Point(140, 10);
|
||||
this.stLabel3.Name = "stLabel3";
|
||||
this.stLabel3.Size = new System.Drawing.Size(77, 13);
|
||||
this.stLabel3.TabIndex = 37;
|
||||
this.stLabel3.Text = "Mesh Settings:";
|
||||
//
|
||||
// stLabel4
|
||||
//
|
||||
this.stLabel4.AutoSize = true;
|
||||
this.stLabel4.Location = new System.Drawing.Point(137, 11);
|
||||
this.stLabel4.Name = "stLabel4";
|
||||
this.stLabel4.Size = new System.Drawing.Size(81, 13);
|
||||
this.stLabel4.TabIndex = 38;
|
||||
this.stLabel4.Text = "Global Settings:";
|
||||
//
|
||||
// rotateModel90YUD
|
||||
//
|
||||
this.rotateModel90YUD.DecimalPlaces = 5;
|
||||
this.rotateModel90YUD.Increment = new decimal(new int[] {
|
||||
5,
|
||||
0,
|
||||
0,
|
||||
196608});
|
||||
this.rotateModel90YUD.Location = new System.Drawing.Point(153, 75);
|
||||
this.rotateModel90YUD.Maximum = new decimal(new int[] {
|
||||
1000000000,
|
||||
0,
|
||||
0,
|
||||
0});
|
||||
this.rotateModel90YUD.Minimum = new decimal(new int[] {
|
||||
100000000,
|
||||
0,
|
||||
0,
|
||||
-2147483648});
|
||||
this.rotateModel90YUD.Name = "rotateModel90YUD";
|
||||
this.rotateModel90YUD.Size = new System.Drawing.Size(120, 20);
|
||||
this.rotateModel90YUD.TabIndex = 39;
|
||||
this.rotateModel90YUD.ValueChanged += new System.EventHandler(this.numericUpDownFloat1_ValueChanged);
|
||||
//
|
||||
// stLabel5
|
||||
//
|
||||
this.stLabel5.AutoSize = true;
|
||||
this.stLabel5.Location = new System.Drawing.Point(13, 77);
|
||||
this.stLabel5.Name = "stLabel5";
|
||||
this.stLabel5.Size = new System.Drawing.Size(52, 13);
|
||||
this.stLabel5.TabIndex = 40;
|
||||
this.stLabel5.Text = "Rotate Y:";
|
||||
//
|
||||
// stPanel2
|
||||
//
|
||||
this.stPanel2.Controls.Add(this.chkMatchAttributes);
|
||||
this.stPanel2.Controls.Add(this.chkUseOriginalBones);
|
||||
this.stPanel2.Controls.Add(this.stCheckBox7);
|
||||
this.stPanel2.Controls.Add(this.stLabel1);
|
||||
this.stPanel2.Controls.Add(this.presetCB);
|
||||
this.stPanel2.Controls.Add(this.stLabel5);
|
||||
this.stPanel2.Controls.Add(this.stLabel4);
|
||||
this.stPanel2.Controls.Add(this.rotateModel90YUD);
|
||||
this.stPanel2.Location = new System.Drawing.Point(222, 31);
|
||||
this.stPanel2.Name = "stPanel2";
|
||||
this.stPanel2.Size = new System.Drawing.Size(375, 169);
|
||||
this.stPanel2.TabIndex = 41;
|
||||
//
|
||||
// chkMatchAttributes
|
||||
//
|
||||
this.chkMatchAttributes.AutoSize = true;
|
||||
this.chkMatchAttributes.Location = new System.Drawing.Point(9, 111);
|
||||
this.chkMatchAttributes.Name = "chkMatchAttributes";
|
||||
this.chkMatchAttributes.Size = new System.Drawing.Size(141, 17);
|
||||
this.chkMatchAttributes.TabIndex = 44;
|
||||
this.chkMatchAttributes.Text = "Match Original Attributes";
|
||||
this.chkMatchAttributes.UseVisualStyleBackColor = true;
|
||||
this.chkMatchAttributes.CheckedChanged += new System.EventHandler(this.chkMatchAttributes_CheckedChanged);
|
||||
//
|
||||
// chkUseOriginalBones
|
||||
//
|
||||
this.chkUseOriginalBones.AutoSize = true;
|
||||
this.chkUseOriginalBones.Checked = true;
|
||||
this.chkUseOriginalBones.CheckState = System.Windows.Forms.CheckState.Checked;
|
||||
this.chkUseOriginalBones.Location = new System.Drawing.Point(157, 134);
|
||||
this.chkUseOriginalBones.Name = "chkUseOriginalBones";
|
||||
this.chkUseOriginalBones.Size = new System.Drawing.Size(116, 17);
|
||||
this.chkUseOriginalBones.TabIndex = 43;
|
||||
this.chkUseOriginalBones.Text = "Use Original Bones";
|
||||
this.chkUseOriginalBones.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// stCheckBox7
|
||||
//
|
||||
this.stCheckBox7.AutoSize = true;
|
||||
this.stCheckBox7.Location = new System.Drawing.Point(157, 111);
|
||||
this.stCheckBox7.Name = "stCheckBox7";
|
||||
this.stCheckBox7.Size = new System.Drawing.Size(103, 17);
|
||||
this.stCheckBox7.TabIndex = 41;
|
||||
this.stCheckBox7.Text = "Flip UVs Vertical";
|
||||
this.stCheckBox7.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// stButton2
|
||||
//
|
||||
this.stButton2.DialogResult = System.Windows.Forms.DialogResult.OK;
|
||||
this.stButton2.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
|
||||
this.stButton2.Location = new System.Drawing.Point(522, 568);
|
||||
this.stButton2.Name = "stButton2";
|
||||
this.stButton2.Size = new System.Drawing.Size(75, 23);
|
||||
this.stButton2.TabIndex = 42;
|
||||
this.stButton2.Text = "Ok";
|
||||
this.stButton2.UseVisualStyleBackColor = false;
|
||||
//
|
||||
// GFLXModelImporter
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.ClientSize = new System.Drawing.Size(611, 605);
|
||||
this.Name = "GFLXModelImporter";
|
||||
this.Text = "GFBMDL Importer";
|
||||
this.contentContainer.ResumeLayout(false);
|
||||
this.stPanel1.ResumeLayout(false);
|
||||
this.stPanel1.PerformLayout();
|
||||
((System.ComponentModel.ISupportInitialize)(this.rotateModel90YUD)).EndInit();
|
||||
this.stPanel2.ResumeLayout(false);
|
||||
this.stPanel2.PerformLayout();
|
||||
this.ResumeLayout(false);
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private Toolbox.Library.Forms.STComboBox presetCB;
|
||||
private Toolbox.Library.Forms.STLabel stLabel1;
|
||||
private Toolbox.Library.Forms.STComboBox boneFormatCB;
|
||||
private Toolbox.Library.Forms.STComboBox color0FormatCB;
|
||||
private Toolbox.Library.Forms.STComboBox uv0FormatCB;
|
||||
private Toolbox.Library.Forms.STComboBox normalFormatCB;
|
||||
private Toolbox.Library.Forms.STCheckBox chkUseColor1;
|
||||
private Toolbox.Library.Forms.STCheckBox chkUseBoneIndex;
|
||||
private Toolbox.Library.Forms.STCheckBox chkHasUv1;
|
||||
private Toolbox.Library.Forms.STCheckBox chkUseNormals;
|
||||
private Toolbox.Library.Forms.STComboBox bitangentFormatCB;
|
||||
private Toolbox.Library.Forms.STCheckBox chkBitangents;
|
||||
private Toolbox.Library.Forms.STComboBox color1FormatCB;
|
||||
private Toolbox.Library.Forms.STCheckBox chkUseColor2;
|
||||
private Toolbox.Library.Forms.STComboBox uv1FormatCB;
|
||||
private Toolbox.Library.Forms.STCheckBox chkHasUv2;
|
||||
private Toolbox.Library.Forms.STComboBox positionFormatCB;
|
||||
private Toolbox.Library.Forms.STCheckBox stCheckBox8;
|
||||
private Toolbox.Library.Forms.STButton stButton1;
|
||||
private Toolbox.Library.Forms.STComboBox materiialPresetCB;
|
||||
private Toolbox.Library.Forms.STLabel stLabel2;
|
||||
private Toolbox.Library.Forms.ListViewCustom listViewCustom1;
|
||||
private System.Windows.Forms.ColumnHeader columnHeader1;
|
||||
private Toolbox.Library.Forms.STComboBox weightFormatCB;
|
||||
private Toolbox.Library.Forms.STLabel stLabel4;
|
||||
private Toolbox.Library.Forms.STPanel stPanel1;
|
||||
private Toolbox.Library.Forms.STLabel stLabel3;
|
||||
private Toolbox.Library.Forms.STLabel stLabel5;
|
||||
private Toolbox.Library.Forms.NumericUpDownFloat rotateModel90YUD;
|
||||
private Toolbox.Library.Forms.STCheckBox chkUseBoneWeights;
|
||||
private Toolbox.Library.Forms.STPanel stPanel2;
|
||||
private Toolbox.Library.Forms.STCheckBox stCheckBox7;
|
||||
private Toolbox.Library.Forms.STCheckBox chkUseOriginalBones;
|
||||
private Toolbox.Library.Forms.STButton stButton2;
|
||||
private Toolbox.Library.Forms.STComboBox tangentFormatCB;
|
||||
private Toolbox.Library.Forms.STCheckBox chkTangents;
|
||||
private Toolbox.Library.Forms.STCheckBox chkMatchAttributes;
|
||||
}
|
||||
}
|
345
File_Format_Library/GUI/GFBMDL/GFLXModelImporter.cs
Normal file
345
File_Format_Library/GUI/GFBMDL/GFLXModelImporter.cs
Normal file
|
@ -0,0 +1,345 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Data;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Forms;
|
||||
using Toolbox.Library.Forms;
|
||||
using Toolbox.Library;
|
||||
using FirstPlugin.GFMDLStructs;
|
||||
|
||||
namespace FirstPlugin.Forms
|
||||
{
|
||||
public partial class GFLXModelImporter : STForm
|
||||
{
|
||||
public bool ImportNewBones => !chkUseOriginalBones.Checked;
|
||||
|
||||
private List<STGenericObject> Meshes;
|
||||
private List<GFLXMesh> OriginalMeshes;
|
||||
|
||||
public GfbmdlImportSettings Settings = new GfbmdlImportSettings();
|
||||
|
||||
private bool Loaded = false;
|
||||
|
||||
public int RotationY => (int)rotateModel90YUD.Value;
|
||||
|
||||
public GFLXModelImporter()
|
||||
{
|
||||
InitializeComponent();
|
||||
|
||||
presetCB.Items.Add("Optimal");
|
||||
presetCB.SelectedIndex = 0;
|
||||
|
||||
stPanel1.BackColor = FormThemes.BaseTheme.TextEditorBackColor;
|
||||
stPanel2.BackColor = FormThemes.BaseTheme.TextEditorBackColor;
|
||||
|
||||
CanResize = false;
|
||||
}
|
||||
|
||||
public void LoadMeshes(List<STGenericObject> meshes, List<STGenericMaterial> importedMats,
|
||||
List<GFLXMaterialData> originalMaterials, List<GFLXMesh> originalMeshes)
|
||||
{
|
||||
Loaded = false;
|
||||
|
||||
Meshes = meshes;
|
||||
OriginalMeshes = originalMeshes;
|
||||
|
||||
foreach (var mat in originalMaterials)
|
||||
{
|
||||
materiialPresetCB.Items.Add(mat.Text);
|
||||
}
|
||||
|
||||
materiialPresetCB.SelectedIndex = 0;
|
||||
|
||||
listViewCustom1.Items.Clear();
|
||||
for (int i = 0; i < meshes.Count; i++)
|
||||
{
|
||||
string material = originalMaterials[0].Text;
|
||||
|
||||
//Check if a material name matches one in the preset list
|
||||
//Then auto match the preset
|
||||
if (meshes[i].MaterialIndex < importedMats.Count &&
|
||||
meshes[i].MaterialIndex > 0)
|
||||
{
|
||||
string importedMat = importedMats[meshes[i].MaterialIndex].Text;
|
||||
if (materiialPresetCB.Items.Contains(importedMat))
|
||||
material = importedMat;
|
||||
}
|
||||
|
||||
Settings.MeshSettings.Add(new GfbmdlImportSettings.MeshSetting()
|
||||
{
|
||||
HasColor1 = meshes[i].HasVertColors,
|
||||
HasColor2 = meshes[i].HasVertColors,
|
||||
HasTexCoord1 = meshes[i].HasUv0,
|
||||
HasTexCoord2 = meshes[i].HasUv1,
|
||||
HasTexCoord3 = meshes[i].HasUv2,
|
||||
HasNormals = meshes[i].HasNrm,
|
||||
HasBoneIndices = meshes[i].HasIndices,
|
||||
HasWeights = meshes[i].HasWeights,
|
||||
HasBitangents = meshes[i].HasUv0,
|
||||
Material = material,
|
||||
});
|
||||
listViewCustom1.Items.Add($"{meshes[i].ObjectName}");
|
||||
}
|
||||
|
||||
SetDefaultFormats();
|
||||
|
||||
Loaded = true;
|
||||
}
|
||||
|
||||
private void SetDefaultFormats()
|
||||
{
|
||||
positionFormatCB.LoadEnum(typeof(BufferFormat));
|
||||
positionFormatCB.SelectedItem = BufferFormat.Float;
|
||||
|
||||
normalFormatCB.LoadEnum(typeof(BufferFormat));
|
||||
normalFormatCB.SelectedItem = BufferFormat.HalfFloat;
|
||||
|
||||
bitangentFormatCB.LoadEnum(typeof(BufferFormat));
|
||||
bitangentFormatCB.SelectedItem = BufferFormat.HalfFloat;
|
||||
|
||||
uv0FormatCB.LoadEnum(typeof(BufferFormat));
|
||||
uv0FormatCB.SelectedItem = BufferFormat.Float;
|
||||
|
||||
uv1FormatCB.LoadEnum(typeof(BufferFormat));
|
||||
uv1FormatCB.SelectedItem = BufferFormat.Float;
|
||||
|
||||
color0FormatCB.LoadEnum(typeof(BufferFormat));
|
||||
color0FormatCB.SelectedItem = BufferFormat.Byte;
|
||||
|
||||
color1FormatCB.LoadEnum(typeof(BufferFormat));
|
||||
color1FormatCB.SelectedItem = BufferFormat.Byte;
|
||||
|
||||
boneFormatCB.LoadEnum(typeof(BufferFormat));
|
||||
boneFormatCB.SelectedItem = BufferFormat.Byte;
|
||||
|
||||
weightFormatCB.LoadEnum(typeof(BufferFormat));
|
||||
weightFormatCB.SelectedItem = BufferFormat.BytesAsFloat;
|
||||
|
||||
tangentFormatCB.LoadEnum(typeof(BufferFormat));
|
||||
tangentFormatCB.SelectedItem = BufferFormat.HalfFloat;
|
||||
}
|
||||
|
||||
private void TryMatchOriginal()
|
||||
{
|
||||
if (OriginalMeshes == null || OriginalMeshes?.Count == 0)
|
||||
return;
|
||||
|
||||
Loaded = false;
|
||||
foreach (var mesh in Meshes)
|
||||
{
|
||||
var matchedMesh = (GFLXMesh)OriginalMeshes.FirstOrDefault(x => x.Text == mesh.ObjectName);
|
||||
if (matchedMesh != null)
|
||||
{
|
||||
int index = Meshes.IndexOf(mesh);
|
||||
var setting = Settings.MeshSettings[index];
|
||||
|
||||
foreach (var attribute in matchedMesh.MeshData.Attributes)
|
||||
{
|
||||
switch ((VertexType)attribute.VertexType)
|
||||
{
|
||||
case VertexType.Position:
|
||||
setting.PositionFormat = (BufferFormat)attribute.BufferFormat;
|
||||
break;
|
||||
case VertexType.Normal:
|
||||
setting.NormalFormat = (BufferFormat)attribute.BufferFormat;
|
||||
setting.HasNormals = true;
|
||||
break;
|
||||
case VertexType.Color1:
|
||||
setting.Color1Format = (BufferFormat)attribute.BufferFormat;
|
||||
setting.HasColor1 = true;
|
||||
break;
|
||||
case VertexType.Color2:
|
||||
setting.Color2Format = (BufferFormat)attribute.BufferFormat;
|
||||
setting.HasColor2 = true;
|
||||
break;
|
||||
case VertexType.UV1:
|
||||
setting.TexCoord1Format = (BufferFormat)attribute.BufferFormat;
|
||||
setting.HasTexCoord1 = true;
|
||||
break;
|
||||
case VertexType.UV2:
|
||||
setting.TexCoord2Format = (BufferFormat)attribute.BufferFormat;
|
||||
setting.HasTexCoord2 = true;
|
||||
break;
|
||||
case VertexType.UV3:
|
||||
setting.TexCoord3Format = (BufferFormat)attribute.BufferFormat;
|
||||
setting.HasTexCoord3 = true;
|
||||
break;
|
||||
case VertexType.UV4:
|
||||
setting.TexCoord4Format = (BufferFormat)attribute.BufferFormat;
|
||||
setting.HasTexCoord4 = true;
|
||||
break;
|
||||
case VertexType.BoneWeight:
|
||||
setting.BoneWeightFormat = (BufferFormat)attribute.BufferFormat;
|
||||
if (mesh.vertices.FirstOrDefault().boneWeights.Count == 0)
|
||||
{
|
||||
//Fill weights with 1s
|
||||
for (int v = 0; v < mesh.vertices.Count; v++)
|
||||
{
|
||||
for (int j = 0; j < 1; j++)
|
||||
mesh.vertices[v].boneWeights.Add(1);
|
||||
}
|
||||
}
|
||||
setting.HasWeights = true;
|
||||
break;
|
||||
case VertexType.BoneID:
|
||||
setting.BoneIndexFormat = (BufferFormat)attribute.BufferFormat;
|
||||
if (mesh.vertices.FirstOrDefault().boneNames.Count == 0)
|
||||
{
|
||||
//Fill indices with 1s
|
||||
for (int v = 0; v < mesh.vertices.Count; v++)
|
||||
{
|
||||
for (int j = 0; j < 1; j++)
|
||||
mesh.vertices[v].boneIds.Add(1);
|
||||
}
|
||||
}
|
||||
setting.HasBoneIndices = true;
|
||||
break;
|
||||
case VertexType.Tangents:
|
||||
setting.TangentsFormat = (BufferFormat)attribute.BufferFormat;
|
||||
setting.HasTangents = true;
|
||||
break;
|
||||
case VertexType.Binormal:
|
||||
setting.BitangentnFormat = (BufferFormat)attribute.BufferFormat;
|
||||
setting.HasBitangents = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Loaded = true;
|
||||
}
|
||||
|
||||
private void listViewCustom1_SelectedIndexChanged(object sender, EventArgs e) {
|
||||
if (!Loaded) return;
|
||||
|
||||
if (listViewCustom1.SelectedIndices.Count > 0)
|
||||
{
|
||||
Loaded = false;
|
||||
|
||||
int index = listViewCustom1.SelectedIndices[0];
|
||||
var mesh = Meshes[index];
|
||||
|
||||
var settings = Settings.MeshSettings[index];
|
||||
materiialPresetCB.SelectedItem = settings.Material;
|
||||
|
||||
UpdateSelectedMesh(settings);
|
||||
|
||||
Loaded = true;
|
||||
}
|
||||
}
|
||||
|
||||
private void ApplySettings(object sender, EventArgs e)
|
||||
{
|
||||
if (!Loaded) return;
|
||||
|
||||
var indices = listViewCustom1.SelectedIndices;
|
||||
for (int i = 0; i < indices?.Count; i++)
|
||||
{
|
||||
int index = indices[i];
|
||||
var mesh = Meshes[index];
|
||||
var settings = Settings.MeshSettings[index];
|
||||
|
||||
settings.Material = materiialPresetCB.GetSelectedText();
|
||||
settings.HasNormals = chkUseNormals.Checked;
|
||||
settings.HasBitangents = chkBitangents.Checked;
|
||||
settings.HasTexCoord1 = chkHasUv1.Checked;
|
||||
settings.HasTexCoord2 = chkHasUv2.Checked;
|
||||
settings.HasColor1 = chkUseColor1.Checked;
|
||||
settings.HasColor2 = chkUseColor2.Checked;
|
||||
settings.HasBoneIndices = chkUseBoneIndex.Checked;
|
||||
settings.HasWeights = chkUseBoneWeights.Checked;
|
||||
settings.HasTangents = chkTangents.Checked;
|
||||
|
||||
settings.PositionFormat = (BufferFormat)positionFormatCB.SelectedItem;
|
||||
settings.NormalFormat = (BufferFormat)normalFormatCB.SelectedItem;
|
||||
settings.BitangentnFormat = (BufferFormat)bitangentFormatCB.SelectedItem;
|
||||
settings.TexCoord1Format = (BufferFormat)uv0FormatCB.SelectedItem;
|
||||
settings.TexCoord2Format = (BufferFormat)uv1FormatCB.SelectedItem;
|
||||
settings.Color1Format = (BufferFormat)color0FormatCB.SelectedItem;
|
||||
settings.Color2Format = (BufferFormat)color1FormatCB.SelectedItem;
|
||||
settings.BoneIndexFormat = (BufferFormat)boneFormatCB.SelectedItem;
|
||||
settings.BoneWeightFormat = (BufferFormat)weightFormatCB.SelectedItem;
|
||||
settings.TangentsFormat = (BufferFormat)tangentFormatCB.SelectedItem;
|
||||
}
|
||||
}
|
||||
|
||||
private void UpdateSelectedMesh(GfbmdlImportSettings.MeshSetting settings) {
|
||||
chkUseNormals.Checked = settings.HasNormals;
|
||||
chkBitangents.Checked = settings.HasBitangents;
|
||||
chkHasUv1.Checked = settings.HasTexCoord1;
|
||||
chkHasUv2.Checked = settings.HasTexCoord2;
|
||||
chkUseColor1.Checked = settings.HasColor1;
|
||||
chkUseColor2.Checked = settings.HasColor2;
|
||||
chkUseBoneIndex.Checked = settings.HasBoneIndices;
|
||||
chkUseBoneWeights.Checked = settings.HasWeights;
|
||||
chkTangents.Checked = settings.HasTangents;
|
||||
|
||||
positionFormatCB.SelectedItem = settings.PositionFormat;
|
||||
normalFormatCB.SelectedItem = settings.NormalFormat;
|
||||
bitangentFormatCB.SelectedItem = settings.BitangentnFormat;
|
||||
uv0FormatCB.SelectedItem = settings.TexCoord1Format;
|
||||
uv1FormatCB.SelectedItem = settings.TexCoord2Format;
|
||||
color0FormatCB.SelectedItem = settings.Color1Format;
|
||||
color1FormatCB.SelectedItem = settings.Color2Format;
|
||||
boneFormatCB.SelectedItem = settings.BoneIndexFormat;
|
||||
weightFormatCB.SelectedItem = settings.BoneWeightFormat;
|
||||
tangentFormatCB.SelectedItem = settings.TangentsFormat;
|
||||
}
|
||||
|
||||
private void stButton1_Click(object sender, EventArgs e) {
|
||||
if (!Loaded) return;
|
||||
|
||||
if (listViewCustom1.SelectedIndices.Count == 0) return;
|
||||
|
||||
OpenFileDialog ofd = new OpenFileDialog();
|
||||
ofd.Filter = "Supported Formats|*.json;";
|
||||
ofd.DefaultExt = "json";
|
||||
if (ofd.ShowDialog() == DialogResult.OK)
|
||||
{
|
||||
try {
|
||||
Newtonsoft.Json.JsonConvert.DeserializeObject<Material>(
|
||||
System.IO.File.ReadAllText(ofd.FileName));
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
STErrorDialog.Show("Failed to load material!", "GFBMDL Importer", ex.ToString());
|
||||
return;
|
||||
}
|
||||
|
||||
string name = System.IO.Path.GetFileNameWithoutExtension(ofd.FileName);
|
||||
materiialPresetCB.Items.Add(name);
|
||||
|
||||
var indices = listViewCustom1.SelectedIndices;
|
||||
for (int i = 0; i < indices?.Count; i++)
|
||||
{
|
||||
var settings = Settings.MeshSettings[indices[i]];
|
||||
settings.MaterialFile = ofd.FileName;
|
||||
settings.Material = name;
|
||||
}
|
||||
|
||||
materiialPresetCB.SelectedItem = name;
|
||||
}
|
||||
}
|
||||
|
||||
private void chkMatchAttributes_CheckedChanged(object sender, EventArgs e) {
|
||||
if (chkMatchAttributes.Checked)
|
||||
{
|
||||
TryMatchOriginal();
|
||||
if (listViewCustom1.SelectedIndices.Count > 0)
|
||||
{
|
||||
int index = listViewCustom1.SelectedIndices[0];
|
||||
UpdateSelectedMesh(Settings.MeshSettings[index]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void numericUpDownFloat1_ValueChanged(object sender, EventArgs e)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
}
|
120
File_Format_Library/GUI/GFBMDL/GFLXModelImporter.resx
Normal file
120
File_Format_Library/GUI/GFBMDL/GFLXModelImporter.resx
Normal file
|
@ -0,0 +1,120 @@
|
|||
<?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>
|
||||
</root>
|
|
@ -85,6 +85,8 @@ namespace FirstPlugin
|
|||
tileModeCB.SelectedItem = GX2.GX2TileMode.MODE_DEFAULT;
|
||||
formatComboBox.SelectedItem = GX2.GX2SurfaceFormat.T_BC1_SRGB;
|
||||
|
||||
MipmapNum.Maximum = 13;
|
||||
|
||||
IsLoaded = true;
|
||||
}
|
||||
|
||||
|
@ -280,8 +282,8 @@ namespace FirstPlugin
|
|||
|
||||
SetupSettings(SelectedTexSettings);
|
||||
|
||||
MipmapNum.Maximum = STGenericTexture.GenerateTotalMipCount(
|
||||
SelectedTexSettings.TexWidth, SelectedTexSettings.TexHeight) + 1;
|
||||
// MipmapNum.Maximum = STGenericTexture.GenerateTotalMipCount(
|
||||
// SelectedTexSettings.TexWidth, SelectedTexSettings.TexHeight) + 1;
|
||||
|
||||
//Force the mip counter to be the selected mip counter
|
||||
//Some textures like bflim (used for UI) only have 1
|
||||
|
|
|
@ -392,7 +392,7 @@ namespace FirstPlugin
|
|||
Formats.Add(typeof(IGA_PAK));
|
||||
Formats.Add(typeof(MKAGPDX_Model));
|
||||
Formats.Add(typeof(GFBMDL));
|
||||
// Formats.Add(typeof(GFBANM));
|
||||
// Formats.Add(typeof(GFBANM));
|
||||
Formats.Add(typeof(GFBANMCFG));
|
||||
Formats.Add(typeof(Turbo.Course_MapCamera_bin));
|
||||
Formats.Add(typeof(SDF));
|
||||
|
@ -443,7 +443,7 @@ namespace FirstPlugin
|
|||
Formats.Add(typeof(PunchOutWii.PO_DICT));
|
||||
Formats.Add(typeof(LM2_ARCADE_Model));
|
||||
Formats.Add(typeof(NLG_NLOC));
|
||||
Formats.Add(typeof(NLG_PCK));
|
||||
Formats.Add(typeof(PCK));
|
||||
Formats.Add(typeof(NLG.StrikersSAnim));
|
||||
|
||||
|
||||
|
|
|
@ -118,7 +118,7 @@ In the event that the tool cannot compile, check references. All the libraries u
|
|||
- exelix for BYAML, SARC and KCL library.
|
||||
- Syroot for helpful IO extensions and libraries.
|
||||
- GDKChan for PICA shaders stuff used with BCRES, structs for BCRES, and some DDS decode methods.
|
||||
- AboodXD for some foundation stuff with exelix's SARC library, Wii U (GPU7) and Switch (Tegra X1) textures swizzling, reading/converting uncompressed types for DDS, and documentation for GTX, XTX, and BNTX.
|
||||
- AboodXD for some foundation stuff with exelix's SARC library, Wii U (GPU7) and Switch (Tegra X1) textures swizzling, reading/converting uncompressed types for DDS, and documentation for GTX, XTX, and BNTX. Library for Yaz0 made by AboodXD and helped port it to the tool.
|
||||
- MelonSpeedruns for Switch Toolbox logo.
|
||||
- BrawlBox team for brawl libraries used for BRRES parsing.
|
||||
- Sage of Mirrors for SuperBMDLib.
|
||||
|
|
|
@ -5,6 +5,7 @@ using System.IO;
|
|||
using System.IO.Compression;
|
||||
using System.Threading.Tasks;
|
||||
using Toolbox.Library.IO;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace Toolbox.Library
|
||||
{
|
||||
|
@ -13,7 +14,7 @@ namespace Toolbox.Library
|
|||
public int Alignment = 0;
|
||||
|
||||
public string[] Description { get; set; } = new string[] { "Yaz0" };
|
||||
public string[] Extension { get; set; } = new string[] { "*.yaz0", "*.szs",};
|
||||
public string[] Extension { get; set; } = new string[] { "*.yaz0", "*.szs", };
|
||||
|
||||
public override string ToString() { return "Yaz0"; }
|
||||
|
||||
|
@ -29,12 +30,250 @@ namespace Toolbox.Library
|
|||
|
||||
public Stream Decompress(Stream stream)
|
||||
{
|
||||
return new MemoryStream(EveryFileExplorer.YAZ0.Decompress(stream.ToArray()));
|
||||
var comp = stream.ToBytes();
|
||||
UInt32 decompressedSize = (uint)(comp[4] << 24 | comp[5] << 16 | comp[6] << 8 | comp[7]);
|
||||
var data = Decompress(comp);
|
||||
// var data = EveryFileExplorer.YAZ0.Decompress(comp);
|
||||
// System.IO.File.WriteAllBytes("testYaz0.dec", data);
|
||||
return new MemoryStream(data);
|
||||
}
|
||||
|
||||
[DllImport("Lib/Yaz0.dll")]
|
||||
static unsafe extern byte* decompress(byte* src, uint src_len, uint* dest_len);
|
||||
|
||||
[DllImport("Lib/Yaz0.dll")]
|
||||
static unsafe extern byte* compress(byte* src, uint src_len, uint* dest_len, byte opt_compr);
|
||||
|
||||
[DllImport("Lib/Yaz0.dll")]
|
||||
static unsafe extern void freePtr(void* ptr);
|
||||
|
||||
private unsafe byte[] Decompress(byte[] data)
|
||||
{
|
||||
return EveryFileExplorer.YAZ0.Decompress(data);
|
||||
|
||||
uint src_len = (uint)data.Length;
|
||||
|
||||
uint dest_len;
|
||||
fixed (byte* inputPtr = data)
|
||||
{
|
||||
byte* outputPtr = decompress(inputPtr, src_len, &dest_len);
|
||||
byte[] decomp = new byte[dest_len];
|
||||
Marshal.Copy((IntPtr)outputPtr, decomp, 0, (int)dest_len);
|
||||
freePtr(outputPtr);
|
||||
return decomp;
|
||||
}
|
||||
}
|
||||
|
||||
public Stream Compress(Stream stream)
|
||||
{
|
||||
return new MemoryStream(EveryFileExplorer.YAZ0.Compress(stream.ToArray(),Runtime.Yaz0CompressionLevel, (uint)Alignment));
|
||||
// return new MemoryStream(EveryFileExplorer.YAZ0.Compress(
|
||||
// stream.ToArray(), Runtime.Yaz0CompressionLevel, (uint)Alignment));
|
||||
|
||||
var mem = new MemoryStream();
|
||||
using (var writer = new FileWriter(mem, true))
|
||||
{
|
||||
writer.SetByteOrder(true);
|
||||
writer.WriteSignature("Yaz0");
|
||||
writer.Write((uint)stream.Length);
|
||||
writer.Write((uint)Alignment);
|
||||
writer.Write(0);
|
||||
writer.Write(Compress(stream.ToArray(), (byte)Runtime.Yaz0CompressionLevel));
|
||||
}
|
||||
return mem;
|
||||
}
|
||||
|
||||
public static unsafe byte[] Compress(byte[] src, byte opt_compr)
|
||||
{
|
||||
uint src_len = (uint)src.Length;
|
||||
|
||||
uint dest_len;
|
||||
fixed (byte* inputPtr = src)
|
||||
{
|
||||
byte* outputPtr = compress(inputPtr, src_len, &dest_len, opt_compr);
|
||||
byte[] comp = new byte[dest_len];
|
||||
Marshal.Copy((IntPtr)outputPtr, comp, 0, (int)dest_len);
|
||||
freePtr(outputPtr);
|
||||
return comp;
|
||||
}
|
||||
|
||||
Console.WriteLine($"opt_compr {opt_compr}");
|
||||
|
||||
uint range;
|
||||
if (opt_compr == 0)
|
||||
range = 0;
|
||||
else if (opt_compr < 9)
|
||||
range = (uint)(0x10e0 * opt_compr / 9 - 0x0e0);
|
||||
else
|
||||
range = 0x1000;
|
||||
|
||||
uint pos = 0;
|
||||
uint src_end = (uint)src.Length;
|
||||
|
||||
byte[] dest = new byte[src_end + (src_end + 8) / 8];
|
||||
uint dest_pos = 0;
|
||||
uint code_byte_pos = 0;
|
||||
|
||||
ulong found = 0;
|
||||
ulong found_len = 0;
|
||||
uint delta;
|
||||
int max_len = 0x111;
|
||||
|
||||
while (pos < src_end)
|
||||
{
|
||||
code_byte_pos = dest_pos;
|
||||
dest[dest_pos] = 0; dest_pos++;
|
||||
|
||||
for (int i = 0; i < 8; i++)
|
||||
{
|
||||
if (pos >= src_end)
|
||||
break;
|
||||
|
||||
found_len = 1;
|
||||
|
||||
if (range != 0)
|
||||
{
|
||||
// Going after speed here.
|
||||
// Dunno if using a tuple is slower, so I don't want to risk it.
|
||||
ulong search = compressionSearch(src, pos, max_len, range, src_end);
|
||||
found = search >> 32;
|
||||
found_len = search & 0xFFFFFFFF;
|
||||
}
|
||||
|
||||
if (found_len > 2)
|
||||
{
|
||||
delta = (uint)(pos - found - 1);
|
||||
|
||||
if (found_len < 0x12)
|
||||
{
|
||||
dest[dest_pos] = (byte)(delta >> 8 | (found_len - 2) << 4); dest_pos++;
|
||||
dest[dest_pos] = (byte)(delta & 0xFF); dest_pos++;
|
||||
}
|
||||
else
|
||||
{
|
||||
dest[dest_pos] = (byte)(delta >> 8); dest_pos++;
|
||||
dest[dest_pos] = (byte)(delta & 0xFF); dest_pos++;
|
||||
dest[dest_pos] = (byte)((found_len - 0x12) & 0xFF); dest_pos++;
|
||||
}
|
||||
|
||||
pos += (uint)found_len;
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
dest[code_byte_pos] |= (byte)(1 << (7 - i));
|
||||
dest[dest_pos] = src[pos]; dest_pos++; pos++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
byte[] result = new byte[dest_pos];
|
||||
Array.Copy(dest, result, dest_pos);
|
||||
return result;
|
||||
}
|
||||
|
||||
public static ulong ReadULong(byte[] v, uint i)
|
||||
{
|
||||
int i1 = v[i] | (v[i + 1] << 8) | (v[i + 2] << 16) | (v[i + 3] << 24);
|
||||
int i2 = v[i + 4] | (v[i + 5] << 8) | (v[i + 6] << 16) | (v[i + 7] << 24);
|
||||
return (ulong)((uint)i1 | ((long)i2 << 32));
|
||||
}
|
||||
|
||||
public static long IndexOfByte(byte[] src, byte v, uint i, uint c)
|
||||
{
|
||||
// https://stackoverflow.com/a/46678141
|
||||
|
||||
ulong t;
|
||||
uint p, pEnd;
|
||||
|
||||
for (p = i; ((long)p & 7) != 0; c--, p++)
|
||||
if (c == 0)
|
||||
return -1;
|
||||
else if (src[p] == v)
|
||||
return p;
|
||||
|
||||
ulong r = v; r |= r << 8; r |= r << 16; r |= r << 32;
|
||||
|
||||
for (pEnd = (uint)(p + (c & ~7)); p < pEnd; p += 8)
|
||||
{
|
||||
t = ReadULong(src, p) ^ r;
|
||||
t = (t - 0x0101010101010101) & ~t & 0x8080808080808080;
|
||||
if (t != 0)
|
||||
{
|
||||
t &= (ulong)-(long)t;
|
||||
return p + dbj8[t * 0x07EDD5E59A4E28C2 >> 58];
|
||||
}
|
||||
}
|
||||
|
||||
for (pEnd += c & 7; p < pEnd; p++)
|
||||
if (src[p] == v)
|
||||
return p;
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
readonly static sbyte[] dbj8 =
|
||||
{
|
||||
7, -1, -1, -1, -1, 5, -1, -1, -1, 4, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, 6, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, 3, -1, -1, -1, -1, -1, -1, 1, -1, 2, 0, -1, -1,
|
||||
};
|
||||
|
||||
public static unsafe long find(byte[] byteArray, byte byteToFind, uint start, uint length)
|
||||
{
|
||||
return Array.IndexOf(byteArray, byteToFind, (int)start, (int)length);
|
||||
return IndexOfByte(byteArray, byteToFind, start, length);
|
||||
}
|
||||
|
||||
public static ulong compressionSearch(byte[] src, uint pos, int max_len, uint range, uint src_end)
|
||||
{
|
||||
ulong found_len = 1;
|
||||
ulong found = 0;
|
||||
|
||||
long search;
|
||||
uint cmp_end, cmp1, cmp2;
|
||||
byte c1;
|
||||
uint len;
|
||||
|
||||
if (pos + 2 < src_end)
|
||||
{
|
||||
search = ((long)pos - (long)range);
|
||||
if (search < 0)
|
||||
search = 0;
|
||||
|
||||
cmp_end = (uint)(pos + max_len);
|
||||
if (cmp_end > src_end)
|
||||
cmp_end = src_end;
|
||||
|
||||
c1 = src[pos];
|
||||
while (search < pos)
|
||||
{
|
||||
search = find(src, c1, (uint)search, (uint)(pos - search));
|
||||
if (search < 0)
|
||||
break;
|
||||
|
||||
cmp1 = (uint)(search + 1);
|
||||
cmp2 = pos + 1;
|
||||
|
||||
while (cmp2 < cmp_end && src[cmp1] == src[cmp2])
|
||||
{
|
||||
cmp1++; cmp2++;
|
||||
}
|
||||
|
||||
len = cmp2 - pos;
|
||||
if (found_len < len)
|
||||
{
|
||||
found_len = len;
|
||||
found = (uint)search;
|
||||
if ((long)found_len == max_len)
|
||||
break;
|
||||
}
|
||||
|
||||
search++;
|
||||
}
|
||||
}
|
||||
|
||||
return (ulong)((found << 32) | found_len);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -71,8 +71,7 @@ namespace Toolbox.Library
|
|||
Flags |= PostProcessSteps.CalculateTangentSpace;
|
||||
Flags |= PostProcessSteps.GenerateNormals;*/
|
||||
|
||||
|
||||
|
||||
|
||||
scene = Importer.ImportFile(FileName, settings.GetFlags());
|
||||
|
||||
if (Utils.GetExtension(FileName) == ".dae")
|
||||
|
@ -498,6 +497,11 @@ namespace Toolbox.Library
|
|||
Name.Contains("Skl_Root") || Name.Contains("nw4f_root") ||
|
||||
Name.Contains("skl_root") || Name.Contains("all_root") || Name.Contains("_root") || Name.Contains("Root");
|
||||
|
||||
if (DaeHelper.VisualSceneNodeTypes.ContainsKey(Name)) {
|
||||
if (DaeHelper.VisualSceneNodeTypes[Name] == "JOINT")
|
||||
IsBone = true;
|
||||
}
|
||||
|
||||
//Root set saved by this tool
|
||||
//Get our root manually as it's a child to this
|
||||
bool IsRootSkeleton = Name == "skeleton_root";
|
||||
|
|
|
@ -26,6 +26,8 @@ namespace Toolbox.Library
|
|||
public bool FlipTexCoordsVertical = true;
|
||||
public bool OnlyExportRiggedBones = false;
|
||||
|
||||
public bool AddLeafBones = false;
|
||||
|
||||
public Version FileVersion = new Version();
|
||||
|
||||
public ProgramPreset Preset = ProgramPreset.NONE;
|
||||
|
|
|
@ -34,24 +34,28 @@
|
|||
this.chkFlipUvsVertical = new Toolbox.Library.Forms.STCheckBox();
|
||||
this.chkOldExporter = new Toolbox.Library.Forms.STCheckBox();
|
||||
this.chkVertexColors = new Toolbox.Library.Forms.STCheckBox();
|
||||
this.chkExportRiggedBonesOnly = new Toolbox.Library.Forms.STCheckBox();
|
||||
this.contentContainer.SuspendLayout();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// contentContainer
|
||||
//
|
||||
this.contentContainer.Controls.Add(this.chkExportRiggedBonesOnly);
|
||||
this.contentContainer.Controls.Add(this.chkVertexColors);
|
||||
this.contentContainer.Controls.Add(this.chkOldExporter);
|
||||
this.contentContainer.Controls.Add(this.chkFlipUvsVertical);
|
||||
this.contentContainer.Controls.Add(this.stButton2);
|
||||
this.contentContainer.Controls.Add(this.stButton1);
|
||||
this.contentContainer.Controls.Add(this.exportTexturesChkBox);
|
||||
this.contentContainer.Size = new System.Drawing.Size(329, 173);
|
||||
this.contentContainer.Size = new System.Drawing.Size(338, 267);
|
||||
this.contentContainer.Paint += new System.Windows.Forms.PaintEventHandler(this.contentContainer_Paint);
|
||||
this.contentContainer.Controls.SetChildIndex(this.exportTexturesChkBox, 0);
|
||||
this.contentContainer.Controls.SetChildIndex(this.stButton1, 0);
|
||||
this.contentContainer.Controls.SetChildIndex(this.stButton2, 0);
|
||||
this.contentContainer.Controls.SetChildIndex(this.chkFlipUvsVertical, 0);
|
||||
this.contentContainer.Controls.SetChildIndex(this.chkOldExporter, 0);
|
||||
this.contentContainer.Controls.SetChildIndex(this.chkVertexColors, 0);
|
||||
this.contentContainer.Controls.SetChildIndex(this.chkExportRiggedBonesOnly, 0);
|
||||
//
|
||||
// exportTexturesChkBox
|
||||
//
|
||||
|
@ -70,7 +74,7 @@
|
|||
//
|
||||
this.stButton1.DialogResult = System.Windows.Forms.DialogResult.Cancel;
|
||||
this.stButton1.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
|
||||
this.stButton1.Location = new System.Drawing.Point(244, 141);
|
||||
this.stButton1.Location = new System.Drawing.Point(254, 235);
|
||||
this.stButton1.Name = "stButton1";
|
||||
this.stButton1.Size = new System.Drawing.Size(75, 23);
|
||||
this.stButton1.TabIndex = 12;
|
||||
|
@ -81,7 +85,7 @@
|
|||
//
|
||||
this.stButton2.DialogResult = System.Windows.Forms.DialogResult.OK;
|
||||
this.stButton2.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
|
||||
this.stButton2.Location = new System.Drawing.Point(163, 141);
|
||||
this.stButton2.Location = new System.Drawing.Point(173, 235);
|
||||
this.stButton2.Name = "stButton2";
|
||||
this.stButton2.Size = new System.Drawing.Size(75, 23);
|
||||
this.stButton2.TabIndex = 13;
|
||||
|
@ -91,7 +95,7 @@
|
|||
// chkFlipUvsVertical
|
||||
//
|
||||
this.chkFlipUvsVertical.AutoSize = true;
|
||||
this.chkFlipUvsVertical.Location = new System.Drawing.Point(23, 70);
|
||||
this.chkFlipUvsVertical.Location = new System.Drawing.Point(22, 126);
|
||||
this.chkFlipUvsVertical.Name = "chkFlipUvsVertical";
|
||||
this.chkFlipUvsVertical.Size = new System.Drawing.Size(101, 17);
|
||||
this.chkFlipUvsVertical.TabIndex = 14;
|
||||
|
@ -102,7 +106,7 @@
|
|||
// chkOldExporter
|
||||
//
|
||||
this.chkOldExporter.AutoSize = true;
|
||||
this.chkOldExporter.Location = new System.Drawing.Point(23, 104);
|
||||
this.chkOldExporter.Location = new System.Drawing.Point(22, 149);
|
||||
this.chkOldExporter.Name = "chkOldExporter";
|
||||
this.chkOldExporter.Size = new System.Drawing.Size(200, 17);
|
||||
this.chkOldExporter.TabIndex = 15;
|
||||
|
@ -115,7 +119,7 @@
|
|||
this.chkVertexColors.AutoSize = true;
|
||||
this.chkVertexColors.Checked = true;
|
||||
this.chkVertexColors.CheckState = System.Windows.Forms.CheckState.Checked;
|
||||
this.chkVertexColors.Location = new System.Drawing.Point(132, 47);
|
||||
this.chkVertexColors.Location = new System.Drawing.Point(23, 70);
|
||||
this.chkVertexColors.Name = "chkVertexColors";
|
||||
this.chkVertexColors.Size = new System.Drawing.Size(121, 17);
|
||||
this.chkVertexColors.TabIndex = 16;
|
||||
|
@ -123,11 +127,23 @@
|
|||
this.chkVertexColors.UseVisualStyleBackColor = true;
|
||||
this.chkVertexColors.CheckedChanged += new System.EventHandler(this.chkVertexColors_CheckedChanged);
|
||||
//
|
||||
// chkExportRiggedBonesOnly
|
||||
//
|
||||
this.chkExportRiggedBonesOnly.AutoSize = true;
|
||||
this.chkExportRiggedBonesOnly.Enabled = false;
|
||||
this.chkExportRiggedBonesOnly.Location = new System.Drawing.Point(23, 93);
|
||||
this.chkExportRiggedBonesOnly.Name = "chkExportRiggedBonesOnly";
|
||||
this.chkExportRiggedBonesOnly.Size = new System.Drawing.Size(150, 17);
|
||||
this.chkExportRiggedBonesOnly.TabIndex = 17;
|
||||
this.chkExportRiggedBonesOnly.Text = "Export Only Rigged Bones";
|
||||
this.chkExportRiggedBonesOnly.UseVisualStyleBackColor = true;
|
||||
this.chkExportRiggedBonesOnly.CheckedChanged += new System.EventHandler(this.chkExportRiggedBonesOnly_CheckedChanged);
|
||||
//
|
||||
// ExportModelSettings
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.ClientSize = new System.Drawing.Size(335, 178);
|
||||
this.ClientSize = new System.Drawing.Size(344, 272);
|
||||
this.Name = "ExportModelSettings";
|
||||
this.Text = "Export Settings";
|
||||
this.contentContainer.ResumeLayout(false);
|
||||
|
@ -144,5 +160,6 @@
|
|||
private STCheckBox chkFlipUvsVertical;
|
||||
protected STCheckBox chkOldExporter;
|
||||
private STCheckBox chkVertexColors;
|
||||
private STCheckBox chkExportRiggedBonesOnly;
|
||||
}
|
||||
}
|
|
@ -37,5 +37,14 @@ namespace Toolbox.Library.Forms
|
|||
private void chkVertexColors_CheckedChanged(object sender, EventArgs e) {
|
||||
Settings.UseVertexColors = chkVertexColors.Checked;
|
||||
}
|
||||
|
||||
private void chkExportRiggedBonesOnly_CheckedChanged(object sender, EventArgs e) {
|
||||
Settings.OnlyExportRiggedBones = chkExportRiggedBonesOnly.Checked;
|
||||
}
|
||||
|
||||
private void contentContainer_Paint(object sender, PaintEventArgs e)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -94,6 +94,32 @@ namespace Toolbox.Library.Forms
|
|||
}
|
||||
}
|
||||
|
||||
private bool isJson;
|
||||
public bool IsJson
|
||||
{
|
||||
get
|
||||
{
|
||||
return isJson;
|
||||
}
|
||||
set
|
||||
{
|
||||
isJson = true;
|
||||
|
||||
if (isJson)
|
||||
{
|
||||
scintilla1.Styles[Style.Json.Default].ForeColor = Color.Silver;
|
||||
scintilla1.Styles[Style.Json.BlockComment].ForeColor = Color.FromArgb(0, 128, 0); // Green
|
||||
scintilla1.Styles[Style.Json.LineComment].ForeColor = Color.FromArgb(0, 128, 0); // Green
|
||||
scintilla1.Styles[Style.Json.Number].ForeColor = Color.Olive;
|
||||
scintilla1.Styles[Style.Json.PropertyName].ForeColor = Color.Blue;
|
||||
scintilla1.Styles[Style.Json.String].ForeColor = Color.FromArgb(163, 21, 21); // Red
|
||||
scintilla1.Styles[Style.Json.StringEol].BackColor = Color.Pink;
|
||||
scintilla1.Styles[Style.Json.Operator].ForeColor = Color.Purple;
|
||||
scintilla1.Lexer = Lexer.Json;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private bool isYAML;
|
||||
public bool IsYAML
|
||||
{
|
||||
|
|
203
Switch_Toolbox_Library/Forms/Editors/UV/PickableUVMap.cs
Normal file
203
Switch_Toolbox_Library/Forms/Editors/UV/PickableUVMap.cs
Normal file
|
@ -0,0 +1,203 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using Toolbox.Library;
|
||||
using OpenTK;
|
||||
using OpenTK.Graphics.OpenGL;
|
||||
using System.Drawing;
|
||||
|
||||
namespace Toolbox.Library.Forms
|
||||
{
|
||||
public class PickableUVMap : IPickable2DObject
|
||||
{
|
||||
public bool IsSelected { get; set; }
|
||||
public bool IsHovered { get; set; }
|
||||
|
||||
public bool IsHit(float x, float y)
|
||||
{
|
||||
//Calcuate the total uv bounds
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public void PickTranslate(float x, float y, float z)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void PickScale(float x, float y, float z)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void PickRotate(float x, float y, float z)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void CalculateBoundry()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
#region Draw UVs
|
||||
|
||||
public void DrawUVs(int PolygonGroupIndex, int UvChannelIndex, List<STGenericObject> genericObjects, STGenericMatTexture textureMap)
|
||||
{
|
||||
if (genericObjects.Count == 0) return;
|
||||
|
||||
foreach (var genericObject in genericObjects)
|
||||
{
|
||||
int divisions = 4;
|
||||
int lineWidth = 1;
|
||||
|
||||
Color uvColor = Runtime.UVEditor.UVColor;
|
||||
Color gridColor = Color.Black;
|
||||
|
||||
List<int> f = new List<int>();
|
||||
int displayFaceSize = 0;
|
||||
if (genericObject.lodMeshes.Count > 0)
|
||||
{
|
||||
f = genericObject.lodMeshes[0].getDisplayFace();
|
||||
displayFaceSize = genericObject.lodMeshes[0].displayFaceSize;
|
||||
}
|
||||
if (genericObject.PolygonGroups.Count > 0)
|
||||
{
|
||||
if (PolygonGroupIndex == -1)
|
||||
{
|
||||
foreach (var group in genericObject.PolygonGroups)
|
||||
{
|
||||
f.AddRange(group.GetDisplayFace());
|
||||
displayFaceSize += group.displayFaceSize;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (genericObject.PolygonGroups.Count > PolygonGroupIndex)
|
||||
{
|
||||
f = genericObject.PolygonGroups[PolygonGroupIndex].GetDisplayFace();
|
||||
displayFaceSize = genericObject.PolygonGroups[PolygonGroupIndex].displayFaceSize;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Console.WriteLine($"displayFaceSize {f.Count} {displayFaceSize} {genericObject.vertices.Count }");
|
||||
|
||||
for (int v = 0; v < displayFaceSize; v += 3)
|
||||
{
|
||||
if (displayFaceSize < 3 || genericObject.vertices.Count < 3)
|
||||
return;
|
||||
|
||||
Vector2 v1 = new Vector2(0);
|
||||
Vector2 v2 = new Vector2(0);
|
||||
Vector2 v3 = new Vector2(0);
|
||||
|
||||
if (f.Count < v + 2)
|
||||
continue;
|
||||
|
||||
if (UvChannelIndex == 0)
|
||||
{
|
||||
v1 = genericObject.vertices[f[v]].uv0;
|
||||
v2 = genericObject.vertices[f[v + 1]].uv0;
|
||||
v3 = genericObject.vertices[f[v + 2]].uv0;
|
||||
}
|
||||
if (UvChannelIndex == 1)
|
||||
{
|
||||
v1 = genericObject.vertices[f[v]].uv1;
|
||||
v2 = genericObject.vertices[f[v + 1]].uv1;
|
||||
v3 = genericObject.vertices[f[v + 2]].uv1;
|
||||
}
|
||||
if (UvChannelIndex == 2)
|
||||
{
|
||||
v1 = genericObject.vertices[f[v]].uv2;
|
||||
v2 = genericObject.vertices[f[v + 1]].uv2;
|
||||
v3 = genericObject.vertices[f[v + 2]].uv2;
|
||||
}
|
||||
|
||||
v1 = new Vector2(v1.X, 1 - v1.Y);
|
||||
v2 = new Vector2(v2.X, 1 - v2.Y);
|
||||
v3 = new Vector2(v3.X, 1 - v3.Y);
|
||||
|
||||
DrawUVTriangleAndGrid(v1, v2, v3, divisions, uvColor, lineWidth, gridColor, textureMap);
|
||||
}
|
||||
}
|
||||
}
|
||||
private void DrawUVTriangleAndGrid(Vector2 v1, Vector2 v2, Vector2 v3, int divisions,
|
||||
Color uvColor, int lineWidth, Color gridColor, STGenericMatTexture textureMap)
|
||||
{
|
||||
GL.UseProgram(0);
|
||||
|
||||
float bounds = 1;
|
||||
Vector2 scaleUv = new Vector2(2);
|
||||
Vector2 transUv = new Vector2(-1f);
|
||||
|
||||
if (textureMap != null && textureMap.Transform != null)
|
||||
{
|
||||
scaleUv *= textureMap.Transform.Scale;
|
||||
transUv += textureMap.Transform.Translate;
|
||||
}
|
||||
|
||||
//Disable textures so they don't affect color
|
||||
GL.Disable(EnableCap.Texture2D);
|
||||
DrawUvTriangle(v1, v2, v3, uvColor, scaleUv, transUv);
|
||||
|
||||
// Draw Grid
|
||||
GL.Color3(gridColor);
|
||||
GL.LineWidth(1);
|
||||
|
||||
// DrawHorizontalGrid(divisions, bounds, scaleUv);
|
||||
// DrawVerticalGrid(divisions, bounds, scaleUv);
|
||||
}
|
||||
|
||||
private static void DrawUvTriangle(Vector2 v1, Vector2 v2, Vector2 v3, Color uvColor, Vector2 scaleUv, Vector2 transUv)
|
||||
{
|
||||
GL.Color3(uvColor);
|
||||
GL.Begin(PrimitiveType.Lines);
|
||||
GL.LineWidth(3);
|
||||
GL.Vertex2(v1 * scaleUv + transUv);
|
||||
GL.Vertex2(v2 * scaleUv + transUv);
|
||||
GL.End();
|
||||
|
||||
GL.Begin(PrimitiveType.Lines);
|
||||
GL.LineWidth(3);
|
||||
GL.Vertex2(v2 * scaleUv + transUv);
|
||||
GL.Vertex2(v3 * scaleUv + transUv);
|
||||
GL.End();
|
||||
|
||||
GL.Begin(PrimitiveType.Lines);
|
||||
GL.LineWidth(3);
|
||||
GL.Vertex2(v3 * scaleUv + transUv);
|
||||
GL.Vertex2(v1 * scaleUv + transUv);
|
||||
GL.End();
|
||||
}
|
||||
|
||||
private static void DrawVerticalGrid(int divisions, float bounds, Vector2 scaleUv)
|
||||
{
|
||||
int verticalCount = divisions;
|
||||
for (int i = 0; i < verticalCount * bounds; i++)
|
||||
{
|
||||
GL.Begin(PrimitiveType.Lines);
|
||||
GL.Vertex2(new Vector2((1.0f / verticalCount) * i, -bounds) * scaleUv);
|
||||
GL.Vertex2(new Vector2((1.0f / verticalCount) * i, bounds) * scaleUv);
|
||||
GL.End();
|
||||
}
|
||||
}
|
||||
|
||||
private static void DrawHorizontalGrid(int divisions, float bounds, Vector2 scaleUv)
|
||||
{
|
||||
int horizontalCount = divisions;
|
||||
for (int i = 0; i < horizontalCount * bounds; i++)
|
||||
{
|
||||
GL.Begin(PrimitiveType.Lines);
|
||||
GL.Vertex2(new Vector2(-bounds, (1.0f / horizontalCount) * i) * scaleUv);
|
||||
GL.Vertex2(new Vector2(bounds, (1.0f / horizontalCount) * i) * scaleUv);
|
||||
GL.End();
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
}
|
||||
}
|
|
@ -28,7 +28,6 @@
|
|||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
this.gL_ControlLegacy2D1 = new OpenTK.GLControl();
|
||||
this.scaleYUD = new Toolbox.Library.Forms.NumericUpDownFloat();
|
||||
this.transYUD = new Toolbox.Library.Forms.NumericUpDownFloat();
|
||||
this.transXUD = new Toolbox.Library.Forms.NumericUpDownFloat();
|
||||
|
@ -48,6 +47,7 @@
|
|||
this.stButton1 = new Toolbox.Library.Forms.STButton();
|
||||
this.splitter1 = new System.Windows.Forms.Splitter();
|
||||
this.stPanel3 = new Toolbox.Library.Forms.STPanel();
|
||||
this.uvViewport1 = new Toolbox.Library.Forms.UVViewport();
|
||||
((System.ComponentModel.ISupportInitialize)(this.scaleYUD)).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.transYUD)).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.transXUD)).BeginInit();
|
||||
|
@ -57,21 +57,6 @@
|
|||
this.stPanel3.SuspendLayout();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// gL_ControlLegacy2D1
|
||||
//
|
||||
this.gL_ControlLegacy2D1.BackColor = System.Drawing.Color.Black;
|
||||
this.gL_ControlLegacy2D1.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||
this.gL_ControlLegacy2D1.Location = new System.Drawing.Point(0, 0);
|
||||
this.gL_ControlLegacy2D1.Name = "gL_ControlLegacy2D1";
|
||||
this.gL_ControlLegacy2D1.Size = new System.Drawing.Size(443, 454);
|
||||
this.gL_ControlLegacy2D1.TabIndex = 2;
|
||||
this.gL_ControlLegacy2D1.VSync = false;
|
||||
this.gL_ControlLegacy2D1.Paint += new System.Windows.Forms.PaintEventHandler(this.gL_ControlLegacy2D1_Paint);
|
||||
this.gL_ControlLegacy2D1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.gL_ControlLegacy2D1_MouseDown);
|
||||
this.gL_ControlLegacy2D1.MouseMove += new System.Windows.Forms.MouseEventHandler(this.gL_ControlLegacy2D1_MouseMove);
|
||||
this.gL_ControlLegacy2D1.MouseWheel += new System.Windows.Forms.MouseEventHandler(this.OnMouseWheel);
|
||||
this.gL_ControlLegacy2D1.Resize += new System.EventHandler(this.gL_ControlLegacy2D1_Resize);
|
||||
//
|
||||
// scaleYUD
|
||||
//
|
||||
this.scaleYUD.DecimalPlaces = 5;
|
||||
|
@ -209,6 +194,7 @@
|
|||
this.drawableContainerCB.BorderStyle = System.Windows.Forms.ButtonBorderStyle.Solid;
|
||||
this.drawableContainerCB.ButtonColor = System.Drawing.Color.Empty;
|
||||
this.drawableContainerCB.FormattingEnabled = true;
|
||||
this.drawableContainerCB.IsReadOnly = false;
|
||||
this.drawableContainerCB.Location = new System.Drawing.Point(294, 7);
|
||||
this.drawableContainerCB.Name = "drawableContainerCB";
|
||||
this.drawableContainerCB.Size = new System.Drawing.Size(146, 21);
|
||||
|
@ -223,6 +209,7 @@
|
|||
this.meshesCB.BorderStyle = System.Windows.Forms.ButtonBorderStyle.Solid;
|
||||
this.meshesCB.ButtonColor = System.Drawing.Color.Empty;
|
||||
this.meshesCB.FormattingEnabled = true;
|
||||
this.meshesCB.IsReadOnly = false;
|
||||
this.meshesCB.Location = new System.Drawing.Point(294, 34);
|
||||
this.meshesCB.Name = "meshesCB";
|
||||
this.meshesCB.Size = new System.Drawing.Size(146, 21);
|
||||
|
@ -280,6 +267,7 @@
|
|||
this.textureCB.BorderStyle = System.Windows.Forms.ButtonBorderStyle.Solid;
|
||||
this.textureCB.ButtonColor = System.Drawing.Color.Empty;
|
||||
this.textureCB.FormattingEnabled = true;
|
||||
this.textureCB.IsReadOnly = false;
|
||||
this.textureCB.Location = new System.Drawing.Point(446, 34);
|
||||
this.textureCB.Name = "textureCB";
|
||||
this.textureCB.Size = new System.Drawing.Size(156, 21);
|
||||
|
@ -293,6 +281,7 @@
|
|||
this.comboBox1.BorderStyle = System.Windows.Forms.ButtonBorderStyle.Solid;
|
||||
this.comboBox1.ButtonColor = System.Drawing.Color.Empty;
|
||||
this.comboBox1.FormattingEnabled = true;
|
||||
this.comboBox1.IsReadOnly = false;
|
||||
this.comboBox1.Location = new System.Drawing.Point(550, 7);
|
||||
this.comboBox1.Name = "comboBox1";
|
||||
this.comboBox1.Size = new System.Drawing.Size(52, 21);
|
||||
|
@ -312,7 +301,7 @@
|
|||
// btnApplyTransform
|
||||
//
|
||||
this.btnApplyTransform.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
|
||||
this.btnApplyTransform.Location = new System.Drawing.Point(3, 138);
|
||||
this.btnApplyTransform.Location = new System.Drawing.Point(6, 279);
|
||||
this.btnApplyTransform.Name = "btnApplyTransform";
|
||||
this.btnApplyTransform.Size = new System.Drawing.Size(119, 23);
|
||||
this.btnApplyTransform.TabIndex = 9;
|
||||
|
@ -357,13 +346,24 @@
|
|||
//
|
||||
// stPanel3
|
||||
//
|
||||
this.stPanel3.Controls.Add(this.gL_ControlLegacy2D1);
|
||||
this.stPanel3.Controls.Add(this.uvViewport1);
|
||||
this.stPanel3.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||
this.stPanel3.Location = new System.Drawing.Point(162, 70);
|
||||
this.stPanel3.Name = "stPanel3";
|
||||
this.stPanel3.Size = new System.Drawing.Size(443, 454);
|
||||
this.stPanel3.TabIndex = 5;
|
||||
//
|
||||
// uvViewport1
|
||||
//
|
||||
this.uvViewport1.ActiveTextureMap = null;
|
||||
this.uvViewport1.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||
this.uvViewport1.Location = new System.Drawing.Point(0, 0);
|
||||
this.uvViewport1.Name = "uvViewport1";
|
||||
this.uvViewport1.Size = new System.Drawing.Size(443, 454);
|
||||
this.uvViewport1.TabIndex = 0;
|
||||
this.uvViewport1.UseGrid = false;
|
||||
this.uvViewport1.UseOrtho = true;
|
||||
//
|
||||
// UVEditor
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
|
@ -391,7 +391,6 @@
|
|||
private STPanel stPanel1;
|
||||
private STLabel stLabel1;
|
||||
private Toolbox.Library.Forms.STComboBox comboBox1;
|
||||
private OpenTK.GLControl gL_ControlLegacy2D1;
|
||||
private Toolbox.Library.Forms.STComboBox textureCB;
|
||||
private STLabel stLabel2;
|
||||
private NumericUpDownFloat scaleXUD;
|
||||
|
@ -408,5 +407,6 @@
|
|||
private STPanel stPanel3;
|
||||
private STButton stButton1;
|
||||
private STComboBox drawableContainerCB;
|
||||
private UVViewport uvViewport1;
|
||||
}
|
||||
}
|
|
@ -23,11 +23,13 @@ namespace Toolbox.Library.Forms
|
|||
comboBox1.Items.Add(2);
|
||||
|
||||
comboBox1.SelectedIndex = 0;
|
||||
barSlider1.Value = 0;
|
||||
barSlider1.Value = barSlider1.Maximum;
|
||||
}
|
||||
|
||||
public class ActiveTexture
|
||||
{
|
||||
public STGenericMatTexture MatTexture;
|
||||
|
||||
public Vector2 UVScale = new Vector2(1);
|
||||
public Vector2 UVTranslate = new Vector2(0);
|
||||
public float UVRotate = 0;
|
||||
|
@ -46,7 +48,7 @@ namespace Toolbox.Library.Forms
|
|||
}
|
||||
public ActiveTexture activeTexture = new ActiveTexture();
|
||||
|
||||
public float brightness = 0.5f; //To see uv maps easier
|
||||
public float brightness = 1.0f; //To see uv maps easier
|
||||
public int UvChannelIndex = 0;
|
||||
|
||||
public List<STGenericObject> Objects = new List<STGenericObject>();
|
||||
|
@ -58,10 +60,7 @@ namespace Toolbox.Library.Forms
|
|||
{
|
||||
List<STGenericObject> objects = new List<STGenericObject>();
|
||||
for (int i = 0; i < Objects.Count; i++)
|
||||
{
|
||||
if (Objects[i].GetMaterial() == ActiveMaterial)
|
||||
objects.Add(Objects[i]);
|
||||
}
|
||||
objects.Add(Objects[i]);
|
||||
|
||||
return objects;
|
||||
}
|
||||
|
@ -84,11 +83,11 @@ namespace Toolbox.Library.Forms
|
|||
drawableContainerCB.SelectedIndex = 0;
|
||||
}
|
||||
|
||||
public int texid;
|
||||
|
||||
bool IsSRTLoaded = false;
|
||||
public void Reset()
|
||||
{
|
||||
barSlider1.Value = (int)(brightness * 100);
|
||||
|
||||
scaleXUD.Value = 1;
|
||||
scaleYUD.Value = 1;
|
||||
transXUD.Value = 0;
|
||||
|
@ -110,212 +109,8 @@ namespace Toolbox.Library.Forms
|
|||
meshesCB.SelectedIndex = 0;
|
||||
}
|
||||
|
||||
public int texid;
|
||||
public void DrawUVs(List<STGenericObject> genericObjects)
|
||||
private void BindTexture()
|
||||
{
|
||||
foreach (var genericObject in genericObjects)
|
||||
{
|
||||
int divisions = 4;
|
||||
int lineWidth = 1;
|
||||
|
||||
Color uvColor = Color.LightGreen;
|
||||
Color gridColor = Color.Black;
|
||||
|
||||
List<int> f = new List<int>();
|
||||
int displayFaceSize = 0;
|
||||
if (genericObject.lodMeshes.Count > 0)
|
||||
{
|
||||
f = genericObject.lodMeshes[0].getDisplayFace();
|
||||
displayFaceSize = genericObject.lodMeshes[0].displayFaceSize;
|
||||
}
|
||||
if (genericObject.PolygonGroups.Count > 0)
|
||||
{
|
||||
f = genericObject.PolygonGroups[0].GetDisplayFace();
|
||||
displayFaceSize = genericObject.PolygonGroups[0].displayFaceSize;
|
||||
}
|
||||
|
||||
for (int v = 0; v < displayFaceSize; v += 3)
|
||||
{
|
||||
if (displayFaceSize < 3 ||
|
||||
genericObject.vertices.Count < 3)
|
||||
return;
|
||||
|
||||
Vector2 v1 = new Vector2(0);
|
||||
Vector2 v2 = new Vector2(0);
|
||||
Vector2 v3 = new Vector2(0);
|
||||
|
||||
if (f.Count < v + 2)
|
||||
continue;
|
||||
|
||||
if (UvChannelIndex == 0)
|
||||
{
|
||||
v1 = genericObject.vertices[f[v]].uv0;
|
||||
v2 = genericObject.vertices[f[v + 1]].uv0;
|
||||
v3 = genericObject.vertices[f[v + 2]].uv0;
|
||||
}
|
||||
if (UvChannelIndex == 1)
|
||||
{
|
||||
v1 = genericObject.vertices[f[v]].uv1;
|
||||
v2 = genericObject.vertices[f[v + 1]].uv1;
|
||||
v3 = genericObject.vertices[f[v + 2]].uv1;
|
||||
}
|
||||
if (UvChannelIndex == 2)
|
||||
{
|
||||
v1 = genericObject.vertices[f[v]].uv2;
|
||||
v2 = genericObject.vertices[f[v + 1]].uv2;
|
||||
v3 = genericObject.vertices[f[v + 2]].uv2;
|
||||
}
|
||||
|
||||
v1 = new Vector2(v1.X, 1 - v1.Y);
|
||||
v2 = new Vector2(v2.X, 1 - v2.Y);
|
||||
v3 = new Vector2(v3.X, 1 - v3.Y);
|
||||
|
||||
DrawUVTriangleAndGrid(v1, v2, v3, divisions, uvColor, lineWidth, gridColor);
|
||||
}
|
||||
}
|
||||
}
|
||||
private void DrawUVTriangleAndGrid(Vector2 v1, Vector2 v2, Vector2 v3, int divisions,
|
||||
Color uvColor, int lineWidth, Color gridColor)
|
||||
{
|
||||
GL.UseProgram(0);
|
||||
|
||||
float bounds = 1;
|
||||
Vector2 scaleUv = activeTexture.UVScale * new Vector2(2);
|
||||
Vector2 transUv = activeTexture.UVTranslate - new Vector2(1f);
|
||||
|
||||
//Disable textures so they don't affect color
|
||||
GL.Disable(EnableCap.Texture2D);
|
||||
DrawUvTriangle(v1, v2, v3, uvColor, scaleUv, transUv);
|
||||
|
||||
// Draw Grid
|
||||
GL.Color3(gridColor);
|
||||
// DrawHorizontalGrid(divisions, bounds, scaleUv);
|
||||
// DrawVerticalGrid(divisions, bounds, scaleUv);
|
||||
}
|
||||
|
||||
private static void DrawUvTriangle(Vector2 v1, Vector2 v2, Vector2 v3, Color uvColor, Vector2 scaleUv, Vector2 transUv)
|
||||
{
|
||||
GL.Color3(uvColor);
|
||||
GL.Begin(PrimitiveType.Lines);
|
||||
GL.LineWidth(3);
|
||||
GL.Vertex2(v1 * scaleUv + transUv);
|
||||
GL.Vertex2(v2 * scaleUv + transUv);
|
||||
GL.End();
|
||||
|
||||
GL.Begin(PrimitiveType.Lines);
|
||||
GL.LineWidth(3);
|
||||
GL.Vertex2(v2 * scaleUv + transUv);
|
||||
GL.Vertex2(v3 * scaleUv + transUv);
|
||||
GL.End();
|
||||
|
||||
GL.Begin(PrimitiveType.Lines);
|
||||
GL.LineWidth(3);
|
||||
GL.Vertex2(v3 * scaleUv + transUv);
|
||||
GL.Vertex2(v1 * scaleUv + transUv);
|
||||
GL.End();
|
||||
}
|
||||
|
||||
private void SetupRendering(float lineWidth)
|
||||
{
|
||||
// Go to 2D
|
||||
GL.Viewport(0, 0, gL_ControlLegacy2D1.Width, gL_ControlLegacy2D1.Height);
|
||||
GL.MatrixMode(MatrixMode.Projection);
|
||||
GL.PushMatrix();
|
||||
GL.LoadIdentity();
|
||||
float aspect = (float)gL_ControlLegacy2D1.Width / (float)gL_ControlLegacy2D1.Height;
|
||||
GL.Ortho(-aspect, aspect, -1, 1, -1, 1);
|
||||
GL.MatrixMode(MatrixMode.Modelview);
|
||||
GL.PushMatrix();
|
||||
GL.LoadIdentity();
|
||||
GL.LineWidth(lineWidth);
|
||||
|
||||
// Draw over everything
|
||||
GL.Disable(EnableCap.DepthTest);
|
||||
GL.Disable(EnableCap.CullFace);
|
||||
}
|
||||
|
||||
private static void DrawVerticalGrid(int divisions, float bounds, Vector2 scaleUv)
|
||||
{
|
||||
int verticalCount = divisions;
|
||||
for (int i = 0; i < verticalCount * bounds; i++)
|
||||
{
|
||||
GL.Begin(PrimitiveType.Lines);
|
||||
GL.Vertex2(new Vector2((1.0f / verticalCount) * i, -bounds) * scaleUv);
|
||||
GL.Vertex2(new Vector2((1.0f / verticalCount) * i, bounds) * scaleUv);
|
||||
GL.End();
|
||||
}
|
||||
}
|
||||
|
||||
private static void DrawHorizontalGrid(int divisions, float bounds, Vector2 scaleUv)
|
||||
{
|
||||
int horizontalCount = divisions;
|
||||
for (int i = 0; i < horizontalCount * bounds; i++)
|
||||
{
|
||||
GL.Begin(PrimitiveType.Lines);
|
||||
GL.Vertex2(new Vector2(-bounds, (1.0f / horizontalCount) * i) * scaleUv);
|
||||
GL.Vertex2(new Vector2(bounds, (1.0f / horizontalCount) * i) * scaleUv);
|
||||
GL.End();
|
||||
}
|
||||
}
|
||||
|
||||
int PlaneSize = 1;
|
||||
float PosX;
|
||||
float PosY;
|
||||
float ZoomValue = 1;
|
||||
|
||||
Point MouseDownPos;
|
||||
|
||||
private float FindHCF(float m, float n)
|
||||
{
|
||||
float temp, remainder;
|
||||
if (m < n)
|
||||
{
|
||||
temp = m;
|
||||
m = n;
|
||||
n = temp;
|
||||
}
|
||||
while (true)
|
||||
{
|
||||
remainder = m % n;
|
||||
if (remainder == 0)
|
||||
return n;
|
||||
else
|
||||
m = n;
|
||||
n = remainder;
|
||||
}
|
||||
}
|
||||
|
||||
private void gL_ControlLegacy2D1_Paint(object sender, PaintEventArgs e)
|
||||
{
|
||||
if (!Runtime.OpenTKInitialized)
|
||||
return;
|
||||
|
||||
gL_ControlLegacy2D1.MakeCurrent();
|
||||
|
||||
SetupRendering(1);
|
||||
|
||||
GL.ClearColor(System.Drawing.Color.FromArgb(40, 40, 40));
|
||||
GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);
|
||||
|
||||
GL.Disable(EnableCap.Texture2D);
|
||||
|
||||
//This usually won't be seen unless the textures aren't repeating much
|
||||
DrawBackdrop();
|
||||
|
||||
float PlaneScaleX = gL_ControlLegacy2D1.Width / 512;
|
||||
float PlaneScaleY = gL_ControlLegacy2D1.Height / 512;
|
||||
|
||||
if (activeTexture.Width != 0 && activeTexture.Height != 0)
|
||||
{
|
||||
PlaneScaleX = (float)gL_ControlLegacy2D1.Width / (float)activeTexture.Width;
|
||||
PlaneScaleY = (float)gL_ControlLegacy2D1.Height / (float)activeTexture.Height;
|
||||
}
|
||||
|
||||
//Now do the plane with uvs
|
||||
GL.PushMatrix();
|
||||
GL.Scale(PlaneScaleY * ZoomValue, -PlaneScaleX * ZoomValue, 1);
|
||||
GL.Translate(PosX, PosY, 0);
|
||||
|
||||
if (activeTexture.TextureIndex != -1)
|
||||
{
|
||||
//Draws a textured plan for our uvs to show on
|
||||
|
@ -327,104 +122,7 @@ namespace Toolbox.Library.Forms
|
|||
// GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, (int)STGenericMatTexture.wrapmode[activeTexture.wrapModeT]);
|
||||
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)STGenericMatTexture.minfilter[activeTexture.MinFilter]);
|
||||
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)STGenericMatTexture.magfilter[activeTexture.MagFilter]);
|
||||
|
||||
}
|
||||
|
||||
//Params include Amount to repeat
|
||||
DrawTexturedPlane(5);
|
||||
|
||||
if (ActiveObjects.Count > 0)
|
||||
DrawUVs(ActiveObjects);
|
||||
|
||||
GL.UseProgram(0);
|
||||
GL.PopMatrix();
|
||||
|
||||
gL_ControlLegacy2D1.SwapBuffers();
|
||||
}
|
||||
private void DrawTexturedPlane(float scale)
|
||||
{
|
||||
Vector2 scaleCenter = new Vector2(0.5f, 0.5f);
|
||||
|
||||
Vector2[] TexCoords = new Vector2[] {
|
||||
new Vector2(1,1),
|
||||
new Vector2(0,1),
|
||||
new Vector2(0,0),
|
||||
new Vector2(1,0),
|
||||
};
|
||||
Vector2[] Positions = new Vector2[] {
|
||||
new Vector2(1,-1),
|
||||
new Vector2(-1,-1),
|
||||
new Vector2(-1,1),
|
||||
new Vector2(1,1),
|
||||
};
|
||||
|
||||
TexCoords[0] = (TexCoords[0] - scaleCenter) * scale + scaleCenter;
|
||||
TexCoords[1] = (TexCoords[1] - scaleCenter) * scale + scaleCenter;
|
||||
TexCoords[2] = (TexCoords[2] - scaleCenter) * scale + scaleCenter;
|
||||
TexCoords[3] = (TexCoords[3] - scaleCenter) * scale + scaleCenter;
|
||||
Positions[0] = Positions[0] * scale;
|
||||
Positions[1] = Positions[1] * scale;
|
||||
Positions[2] = Positions[2] * scale;
|
||||
Positions[3] = Positions[3] * scale;
|
||||
|
||||
GL.Begin(PrimitiveType.Quads);
|
||||
GL.Color3(brightness, brightness, brightness);
|
||||
GL.TexCoord2(TexCoords[0]);
|
||||
GL.Vertex2(Positions[0]);
|
||||
GL.TexCoord2(TexCoords[1]);
|
||||
GL.Vertex2(Positions[1]);
|
||||
GL.TexCoord2(TexCoords[2]);
|
||||
GL.Vertex2(Positions[2]);
|
||||
GL.TexCoord2(TexCoords[3]);
|
||||
GL.Vertex2(Positions[3]);
|
||||
GL.End();
|
||||
}
|
||||
private void DrawBackdrop()
|
||||
{
|
||||
//Background
|
||||
GL.Begin(PrimitiveType.Quads);
|
||||
GL.Color3(Color.FromArgb(40, 40, 40));
|
||||
GL.TexCoord2(1, 1);
|
||||
GL.Vertex2(PlaneSize, -PlaneSize);
|
||||
GL.TexCoord2(0, 1);
|
||||
GL.Vertex2(-PlaneSize, -PlaneSize);
|
||||
GL.TexCoord2(0, 0);
|
||||
GL.Vertex2(-PlaneSize, PlaneSize);
|
||||
GL.TexCoord2(1, 0);
|
||||
GL.Vertex2(PlaneSize, PlaneSize);
|
||||
GL.End();
|
||||
}
|
||||
|
||||
private void OnMouseWheel(object sender, System.Windows.Forms.MouseEventArgs e)
|
||||
{
|
||||
if (e.Delta > 0 && ZoomValue > 0) ZoomValue += 0.1f;
|
||||
if (e.Delta < 0 && ZoomValue < 30 && ZoomValue > 0.1) ZoomValue -= 0.1f;
|
||||
|
||||
gL_ControlLegacy2D1.Invalidate();
|
||||
}
|
||||
|
||||
private void gL_ControlLegacy2D1_MouseDown(object sender, MouseEventArgs e)
|
||||
{
|
||||
if (e.Button == MouseButtons.Left)
|
||||
{
|
||||
MouseDownPos = MousePosition;
|
||||
}
|
||||
}
|
||||
|
||||
private void gL_ControlLegacy2D1_MouseMove(object sender, MouseEventArgs e)
|
||||
{
|
||||
if (e.Button != MouseButtons.Left)
|
||||
return;
|
||||
|
||||
Point temp = Control.MousePosition;
|
||||
Point res = new Point(MouseDownPos.X - temp.X, MouseDownPos.Y - temp.Y);
|
||||
|
||||
PosX -= res.X * 0.001f;
|
||||
PosY -= res.Y * 0.001f;
|
||||
|
||||
gL_ControlLegacy2D1.Invalidate();
|
||||
|
||||
MouseDownPos = temp;
|
||||
}
|
||||
|
||||
private void comboBox2_SelectedIndexChanged(object sender, EventArgs e)
|
||||
|
@ -439,6 +137,8 @@ namespace Toolbox.Library.Forms
|
|||
transXUD.Value = (decimal)activeTexture.UVTranslate.X;
|
||||
transYUD.Value = (decimal)activeTexture.UVTranslate.Y;
|
||||
|
||||
uvViewport1.ActiveTextureMap = activeTexture.MatTexture;
|
||||
|
||||
var texture = Textures[activeTexture.TextureIndex];
|
||||
|
||||
if (texture.RenderableTex == null)
|
||||
|
@ -448,7 +148,7 @@ namespace Toolbox.Library.Forms
|
|||
activeTexture.Width = texture.Width;
|
||||
activeTexture.Height = texture.Height;
|
||||
|
||||
gL_ControlLegacy2D1.Invalidate();
|
||||
uvViewport1.UpdateViewport();
|
||||
|
||||
IsSRTLoaded = true;
|
||||
}
|
||||
|
@ -458,8 +158,8 @@ namespace Toolbox.Library.Forms
|
|||
{
|
||||
if (comboBox1.SelectedIndex >= 0)
|
||||
{
|
||||
UvChannelIndex = comboBox1.SelectedIndex;
|
||||
gL_ControlLegacy2D1.Invalidate();
|
||||
uvViewport1.UvChannelIndex = comboBox1.SelectedIndex;
|
||||
uvViewport1.UpdateViewport();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -470,7 +170,8 @@ namespace Toolbox.Library.Forms
|
|||
private void barSlider1_ValueChanged(object sender, EventArgs e)
|
||||
{
|
||||
brightness = (float)barSlider1.Value / 100;
|
||||
gL_ControlLegacy2D1.Invalidate();
|
||||
uvViewport1.Brightness = brightness;
|
||||
uvViewport1.UpdateViewport();
|
||||
}
|
||||
|
||||
private void OnNumbicValueSRT_ValueChanged(object sender, EventArgs e)
|
||||
|
@ -494,18 +195,16 @@ namespace Toolbox.Library.Forms
|
|||
transXUD.Value = 0;
|
||||
transYUD.Value = 0;
|
||||
|
||||
gL_ControlLegacy2D1.Invalidate();
|
||||
}
|
||||
|
||||
private void gL_ControlLegacy2D1_Resize(object sender, EventArgs e)
|
||||
{
|
||||
gL_ControlLegacy2D1.Invalidate();
|
||||
uvViewport1.UpdateViewport();
|
||||
}
|
||||
|
||||
private void meshesCB_SelectedIndexChanged(object sender, EventArgs e)
|
||||
{
|
||||
if (meshesCB.SelectedIndex >= 0)
|
||||
{
|
||||
uvViewport1.ActiveObjects.Clear();
|
||||
uvViewport1.ActiveObjects.Add(Objects[meshesCB.SelectedIndex]);
|
||||
|
||||
ActiveMaterial = Materials[meshesCB.SelectedIndex];
|
||||
|
||||
ChannelTextures.Clear();
|
||||
|
@ -521,6 +220,7 @@ namespace Toolbox.Library.Forms
|
|||
|
||||
Textures.Add(texture);
|
||||
ActiveTexture tex = new ActiveTexture();
|
||||
tex.MatTexture = texMap;
|
||||
tex.TextureIndex = Textures.IndexOf(texture);
|
||||
tex.Width = texture.Width;
|
||||
tex.Height = texture.Height;
|
||||
|
@ -564,9 +264,18 @@ namespace Toolbox.Library.Forms
|
|||
for (int m = 0; m < ((IMeshContainer)container.Drawables[i]).Meshes.Count; m++)
|
||||
{
|
||||
var mesh = ((IMeshContainer)container.Drawables[i]).Meshes[m];
|
||||
if (mesh.GetMaterial() != null)
|
||||
Objects.Add(mesh);
|
||||
|
||||
if (mesh.PolygonGroups.Count > 0)
|
||||
{
|
||||
foreach (var group in mesh.PolygonGroups) {
|
||||
var mat = group.Material;
|
||||
if (mat != null && !Materials.Contains(mat))
|
||||
Materials.Add(mat);
|
||||
}
|
||||
}
|
||||
else if (mesh.GetMaterial() != null)
|
||||
{
|
||||
Objects.Add(mesh);
|
||||
var mat = mesh.GetMaterial();
|
||||
if (!Materials.Contains(mat))
|
||||
{
|
||||
|
@ -595,7 +304,7 @@ namespace Toolbox.Library.Forms
|
|||
|
||||
Reset();
|
||||
Refresh();
|
||||
gL_ControlLegacy2D1.Invalidate();
|
||||
uvViewport1.UpdateViewport();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,326 +0,0 @@
|
|||
namespace Toolbox.Library.Forms.test
|
||||
{
|
||||
partial class UVEditor
|
||||
{
|
||||
/// <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()
|
||||
{
|
||||
this.gL_ControlLegacy2D1 = new OpenTK.GLControl();
|
||||
this.scaleYUD = new Toolbox.Library.Forms.NumericUpDownFloat();
|
||||
this.transYUD = new Toolbox.Library.Forms.NumericUpDownFloat();
|
||||
this.transXUD = new Toolbox.Library.Forms.NumericUpDownFloat();
|
||||
this.stLabel4 = new Toolbox.Library.Forms.STLabel();
|
||||
this.stLabel3 = new Toolbox.Library.Forms.STLabel();
|
||||
this.scaleXUD = new Toolbox.Library.Forms.NumericUpDownFloat();
|
||||
this.stPanel1 = new Toolbox.Library.Forms.STPanel();
|
||||
this.barSlider1 = new ColorSlider.ColorSlider();
|
||||
this.btnApplyTransform = new Toolbox.Library.Forms.STButton();
|
||||
this.stLabel2 = new Toolbox.Library.Forms.STLabel();
|
||||
this.comboBox2 = new Toolbox.Library.Forms.STComboBox();
|
||||
this.comboBox1 = new Toolbox.Library.Forms.STComboBox();
|
||||
this.stLabel1 = new Toolbox.Library.Forms.STLabel();
|
||||
((System.ComponentModel.ISupportInitialize)(this.scaleYUD)).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.transYUD)).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.transXUD)).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.scaleXUD)).BeginInit();
|
||||
this.stPanel1.SuspendLayout();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// gL_ControlLegacy2D1
|
||||
//
|
||||
this.gL_ControlLegacy2D1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
|
||||
| System.Windows.Forms.AnchorStyles.Left)
|
||||
| System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.gL_ControlLegacy2D1.BackColor = System.Drawing.Color.Black;
|
||||
this.gL_ControlLegacy2D1.Location = new System.Drawing.Point(0, 70);
|
||||
this.gL_ControlLegacy2D1.Name = "gL_ControlLegacy2D1";
|
||||
this.gL_ControlLegacy2D1.Size = new System.Drawing.Size(605, 454);
|
||||
this.gL_ControlLegacy2D1.TabIndex = 2;
|
||||
this.gL_ControlLegacy2D1.VSync = false;
|
||||
this.gL_ControlLegacy2D1.Paint += new System.Windows.Forms.PaintEventHandler(this.gL_ControlLegacy2D1_Paint);
|
||||
this.gL_ControlLegacy2D1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.gL_ControlLegacy2D1_MouseDown);
|
||||
this.gL_ControlLegacy2D1.MouseMove += new System.Windows.Forms.MouseEventHandler(this.gL_ControlLegacy2D1_MouseMove);
|
||||
this.gL_ControlLegacy2D1.MouseWheel += new System.Windows.Forms.MouseEventHandler(this.OnMouseWheel);
|
||||
this.gL_ControlLegacy2D1.Resize += new System.EventHandler(this.gL_ControlLegacy2D1_Resize);
|
||||
//
|
||||
// scaleYUD
|
||||
//
|
||||
this.scaleYUD.DecimalPlaces = 5;
|
||||
this.scaleYUD.Increment = new decimal(new int[] {
|
||||
5,
|
||||
0,
|
||||
0,
|
||||
196608});
|
||||
this.scaleYUD.Location = new System.Drawing.Point(135, 43);
|
||||
this.scaleYUD.Maximum = new decimal(new int[] {
|
||||
1000000000,
|
||||
0,
|
||||
0,
|
||||
0});
|
||||
this.scaleYUD.Minimum = new decimal(new int[] {
|
||||
100000000,
|
||||
0,
|
||||
0,
|
||||
-2147483648});
|
||||
this.scaleYUD.Name = "scaleYUD";
|
||||
this.scaleYUD.Size = new System.Drawing.Size(64, 20);
|
||||
this.scaleYUD.TabIndex = 8;
|
||||
this.scaleYUD.ValueChanged += new System.EventHandler(this.OnNumbicValueSRT_ValueChanged);
|
||||
//
|
||||
// transYUD
|
||||
//
|
||||
this.transYUD.DecimalPlaces = 5;
|
||||
this.transYUD.Increment = new decimal(new int[] {
|
||||
5,
|
||||
0,
|
||||
0,
|
||||
196608});
|
||||
this.transYUD.Location = new System.Drawing.Point(360, 43);
|
||||
this.transYUD.Maximum = new decimal(new int[] {
|
||||
1000000000,
|
||||
0,
|
||||
0,
|
||||
0});
|
||||
this.transYUD.Minimum = new decimal(new int[] {
|
||||
100000000,
|
||||
0,
|
||||
0,
|
||||
-2147483648});
|
||||
this.transYUD.Name = "transYUD";
|
||||
this.transYUD.Size = new System.Drawing.Size(64, 20);
|
||||
this.transYUD.TabIndex = 7;
|
||||
this.transYUD.ValueChanged += new System.EventHandler(this.OnNumbicValueSRT_ValueChanged);
|
||||
//
|
||||
// transXUD
|
||||
//
|
||||
this.transXUD.DecimalPlaces = 5;
|
||||
this.transXUD.Increment = new decimal(new int[] {
|
||||
5,
|
||||
0,
|
||||
0,
|
||||
196608});
|
||||
this.transXUD.Location = new System.Drawing.Point(281, 43);
|
||||
this.transXUD.Maximum = new decimal(new int[] {
|
||||
1000000000,
|
||||
0,
|
||||
0,
|
||||
0});
|
||||
this.transXUD.Minimum = new decimal(new int[] {
|
||||
100000000,
|
||||
0,
|
||||
0,
|
||||
-2147483648});
|
||||
this.transXUD.Name = "transXUD";
|
||||
this.transXUD.Size = new System.Drawing.Size(64, 20);
|
||||
this.transXUD.TabIndex = 6;
|
||||
this.transXUD.ValueChanged += new System.EventHandler(this.OnNumbicValueSRT_ValueChanged);
|
||||
//
|
||||
// stLabel4
|
||||
//
|
||||
this.stLabel4.AutoSize = true;
|
||||
this.stLabel4.Location = new System.Drawing.Point(205, 45);
|
||||
this.stLabel4.Name = "stLabel4";
|
||||
this.stLabel4.Size = new System.Drawing.Size(51, 13);
|
||||
this.stLabel4.TabIndex = 5;
|
||||
this.stLabel4.Text = "Translate";
|
||||
//
|
||||
// stLabel3
|
||||
//
|
||||
this.stLabel3.AutoSize = true;
|
||||
this.stLabel3.Location = new System.Drawing.Point(25, 45);
|
||||
this.stLabel3.Name = "stLabel3";
|
||||
this.stLabel3.Size = new System.Drawing.Size(34, 13);
|
||||
this.stLabel3.TabIndex = 4;
|
||||
this.stLabel3.Text = "Scale";
|
||||
//
|
||||
// scaleXUD
|
||||
//
|
||||
this.scaleXUD.DecimalPlaces = 5;
|
||||
this.scaleXUD.Increment = new decimal(new int[] {
|
||||
5,
|
||||
0,
|
||||
0,
|
||||
196608});
|
||||
this.scaleXUD.Location = new System.Drawing.Point(65, 43);
|
||||
this.scaleXUD.Maximum = new decimal(new int[] {
|
||||
1000000000,
|
||||
0,
|
||||
0,
|
||||
0});
|
||||
this.scaleXUD.Minimum = new decimal(new int[] {
|
||||
100000000,
|
||||
0,
|
||||
0,
|
||||
-2147483648});
|
||||
this.scaleXUD.Name = "scaleXUD";
|
||||
this.scaleXUD.Size = new System.Drawing.Size(64, 20);
|
||||
this.scaleXUD.TabIndex = 3;
|
||||
this.scaleXUD.ValueChanged += new System.EventHandler(this.OnNumbicValueSRT_ValueChanged);
|
||||
//
|
||||
// stPanel1
|
||||
//
|
||||
this.stPanel1.Controls.Add(this.barSlider1);
|
||||
this.stPanel1.Controls.Add(this.btnApplyTransform);
|
||||
this.stPanel1.Controls.Add(this.scaleYUD);
|
||||
this.stPanel1.Controls.Add(this.transYUD);
|
||||
this.stPanel1.Controls.Add(this.stLabel2);
|
||||
this.stPanel1.Controls.Add(this.transXUD);
|
||||
this.stPanel1.Controls.Add(this.comboBox2);
|
||||
this.stPanel1.Controls.Add(this.stLabel4);
|
||||
this.stPanel1.Controls.Add(this.comboBox1);
|
||||
this.stPanel1.Controls.Add(this.stLabel3);
|
||||
this.stPanel1.Controls.Add(this.scaleXUD);
|
||||
this.stPanel1.Controls.Add(this.stLabel1);
|
||||
this.stPanel1.Dock = System.Windows.Forms.DockStyle.Top;
|
||||
this.stPanel1.Location = new System.Drawing.Point(0, 0);
|
||||
this.stPanel1.Name = "stPanel1";
|
||||
this.stPanel1.Size = new System.Drawing.Size(605, 70);
|
||||
this.stPanel1.TabIndex = 1;
|
||||
//
|
||||
// barSlider1
|
||||
//
|
||||
this.barSlider1.BarInnerColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64)))));
|
||||
this.barSlider1.BarPenColorBottom = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64)))));
|
||||
this.barSlider1.BarPenColorTop = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64)))));
|
||||
this.barSlider1.BorderRoundRectSize = new System.Drawing.Size(8, 8);
|
||||
this.barSlider1.ElapsedInnerColor = System.Drawing.Color.FromArgb(((int)(((byte)(224)))), ((int)(((byte)(224)))), ((int)(((byte)(224)))));
|
||||
this.barSlider1.ElapsedPenColorBottom = System.Drawing.Color.FromArgb(((int)(((byte)(224)))), ((int)(((byte)(224)))), ((int)(((byte)(224)))));
|
||||
this.barSlider1.ElapsedPenColorTop = System.Drawing.Color.FromArgb(((int)(((byte)(224)))), ((int)(((byte)(224)))), ((int)(((byte)(224)))));
|
||||
this.barSlider1.Font = new System.Drawing.Font("Microsoft Sans Serif", 6F);
|
||||
this.barSlider1.ForeColor = System.Drawing.Color.White;
|
||||
this.barSlider1.LargeChange = ((uint)(5u));
|
||||
this.barSlider1.Location = new System.Drawing.Point(56, 7);
|
||||
this.barSlider1.MouseEffects = false;
|
||||
this.barSlider1.Name = "barSlider1";
|
||||
this.barSlider1.ScaleDivisions = 10;
|
||||
this.barSlider1.ScaleSubDivisions = 5;
|
||||
this.barSlider1.ShowDivisionsText = true;
|
||||
this.barSlider1.ShowSmallScale = false;
|
||||
this.barSlider1.Size = new System.Drawing.Size(160, 25);
|
||||
this.barSlider1.SmallChange = ((uint)(1u));
|
||||
this.barSlider1.TabIndex = 17;
|
||||
this.barSlider1.Text = "colorSlider1";
|
||||
this.barSlider1.ThumbInnerColor = System.Drawing.Color.FromArgb(((int)(((byte)(224)))), ((int)(((byte)(224)))), ((int)(((byte)(224)))));
|
||||
this.barSlider1.ThumbPenColor = System.Drawing.Color.Silver;
|
||||
this.barSlider1.ThumbRoundRectSize = new System.Drawing.Size(8, 8);
|
||||
this.barSlider1.ThumbSize = new System.Drawing.Size(8, 8);
|
||||
this.barSlider1.TickAdd = 0F;
|
||||
this.barSlider1.TickColor = System.Drawing.Color.White;
|
||||
this.barSlider1.TickDivide = 0F;
|
||||
this.barSlider1.TickStyle = System.Windows.Forms.TickStyle.None;
|
||||
this.barSlider1.Scroll += new System.Windows.Forms.ScrollEventHandler(this.barSlider1_Scroll);
|
||||
//
|
||||
// btnApplyTransform
|
||||
//
|
||||
this.btnApplyTransform.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
|
||||
this.btnApplyTransform.Location = new System.Drawing.Point(430, 41);
|
||||
this.btnApplyTransform.Name = "btnApplyTransform";
|
||||
this.btnApplyTransform.Size = new System.Drawing.Size(119, 23);
|
||||
this.btnApplyTransform.TabIndex = 9;
|
||||
this.btnApplyTransform.Text = "Apply Transform";
|
||||
this.btnApplyTransform.UseVisualStyleBackColor = false;
|
||||
this.btnApplyTransform.Click += new System.EventHandler(this.btnApplyTransform_Click);
|
||||
//
|
||||
// stLabel2
|
||||
//
|
||||
this.stLabel2.AutoSize = true;
|
||||
this.stLabel2.Location = new System.Drawing.Point(3, 13);
|
||||
this.stLabel2.Name = "stLabel2";
|
||||
this.stLabel2.Size = new System.Drawing.Size(56, 13);
|
||||
this.stLabel2.TabIndex = 2;
|
||||
this.stLabel2.Text = "Brightness";
|
||||
//
|
||||
// comboBox2
|
||||
//
|
||||
this.comboBox2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.comboBox2.BorderColor = System.Drawing.Color.Empty;
|
||||
this.comboBox2.BorderStyle = System.Windows.Forms.ButtonBorderStyle.Solid;
|
||||
this.comboBox2.ButtonColor = System.Drawing.Color.Empty;
|
||||
this.comboBox2.FormattingEnabled = true;
|
||||
this.comboBox2.Location = new System.Drawing.Point(290, 7);
|
||||
this.comboBox2.Name = "comboBox2";
|
||||
this.comboBox2.Size = new System.Drawing.Size(166, 21);
|
||||
this.comboBox2.TabIndex = 5;
|
||||
this.comboBox2.SelectedIndexChanged += new System.EventHandler(this.comboBox2_SelectedIndexChanged);
|
||||
//
|
||||
// comboBox1
|
||||
//
|
||||
this.comboBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.comboBox1.BorderColor = System.Drawing.Color.Empty;
|
||||
this.comboBox1.BorderStyle = System.Windows.Forms.ButtonBorderStyle.Solid;
|
||||
this.comboBox1.ButtonColor = System.Drawing.Color.Empty;
|
||||
this.comboBox1.FormattingEnabled = true;
|
||||
this.comboBox1.Location = new System.Drawing.Point(550, 7);
|
||||
this.comboBox1.Name = "comboBox1";
|
||||
this.comboBox1.Size = new System.Drawing.Size(52, 21);
|
||||
this.comboBox1.TabIndex = 3;
|
||||
this.comboBox1.SelectedIndexChanged += new System.EventHandler(this.comboBox1_SelectedIndexChanged);
|
||||
//
|
||||
// stLabel1
|
||||
//
|
||||
this.stLabel1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.stLabel1.AutoSize = true;
|
||||
this.stLabel1.Location = new System.Drawing.Point(462, 10);
|
||||
this.stLabel1.Name = "stLabel1";
|
||||
this.stLabel1.Size = new System.Drawing.Size(82, 13);
|
||||
this.stLabel1.TabIndex = 4;
|
||||
this.stLabel1.Text = "Active Channel:";
|
||||
//
|
||||
// UVEditor
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.Controls.Add(this.gL_ControlLegacy2D1);
|
||||
this.Controls.Add(this.stPanel1);
|
||||
this.Name = "UVEditor";
|
||||
this.Size = new System.Drawing.Size(605, 524);
|
||||
((System.ComponentModel.ISupportInitialize)(this.scaleYUD)).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.transYUD)).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.transXUD)).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.scaleXUD)).EndInit();
|
||||
this.stPanel1.ResumeLayout(false);
|
||||
this.stPanel1.PerformLayout();
|
||||
this.ResumeLayout(false);
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
private STPanel stPanel1;
|
||||
private STLabel stLabel1;
|
||||
private Toolbox.Library.Forms.STComboBox comboBox1;
|
||||
private OpenTK.GLControl gL_ControlLegacy2D1;
|
||||
private Toolbox.Library.Forms.STComboBox comboBox2;
|
||||
private STLabel stLabel2;
|
||||
private NumericUpDownFloat scaleXUD;
|
||||
private STLabel stLabel3;
|
||||
private STLabel stLabel4;
|
||||
private NumericUpDownFloat transXUD;
|
||||
private NumericUpDownFloat transYUD;
|
||||
private NumericUpDownFloat scaleYUD;
|
||||
private STButton btnApplyTransform;
|
||||
private ColorSlider.ColorSlider barSlider1;
|
||||
}
|
||||
}
|
|
@ -1,532 +0,0 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Drawing;
|
||||
using System.Data;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Forms;
|
||||
using OpenTK;
|
||||
using OpenTK.Graphics.OpenGL;
|
||||
|
||||
namespace Toolbox.Library.Forms.test
|
||||
{
|
||||
public partial class UVEditor : UserControl
|
||||
{
|
||||
public UVEditor()
|
||||
{
|
||||
InitializeComponent();
|
||||
|
||||
comboBox1.Items.Add(0);
|
||||
comboBox1.Items.Add(1);
|
||||
comboBox1.Items.Add(2);
|
||||
|
||||
comboBox1.SelectedIndex = 0;
|
||||
barSlider1.Value = 0;
|
||||
}
|
||||
|
||||
public class ActiveTexture
|
||||
{
|
||||
public Vector2 UVScale = new Vector2(1);
|
||||
public Vector2 UVTranslate = new Vector2(0);
|
||||
public float UVRotate = 0;
|
||||
public STGenericTexture texture;
|
||||
public int UvChannelIndex;
|
||||
public int mapMode = 0;
|
||||
public int wrapModeS = 1;
|
||||
public int wrapModeT = 1;
|
||||
public int minFilter = 3;
|
||||
public int magFilter = 2;
|
||||
public int mipDetail = 6;
|
||||
public uint texWidth = 0;
|
||||
public uint texHeight = 0;
|
||||
}
|
||||
public ActiveTexture activeTexture = new ActiveTexture();
|
||||
|
||||
public int brightness = 50; //To see uv maps easier
|
||||
public int UvChannelIndex = 0;
|
||||
public STGenericMaterial ActiveMaterial;
|
||||
|
||||
public List<STGenericObject> ActiveObjects = new List<STGenericObject>();
|
||||
|
||||
public List<ActiveTexture> Textures = new List<ActiveTexture>();
|
||||
|
||||
bool IsSRTLoaded = false;
|
||||
public void Reset()
|
||||
{
|
||||
barSlider1.Value = brightness;
|
||||
|
||||
scaleXUD.Value = 1;
|
||||
scaleYUD.Value = 1;
|
||||
transXUD.Value = 0;
|
||||
transYUD.Value = 0;
|
||||
|
||||
IsSRTLoaded = false;
|
||||
|
||||
comboBox2.Items.Clear();
|
||||
|
||||
if (RenderTools.defaultTex != null)
|
||||
texid = RenderTools.defaultTex.RenderableTex.TexID;
|
||||
|
||||
foreach (var item in Textures)
|
||||
comboBox2.Items.Add(item.texture.Text);
|
||||
|
||||
if (comboBox2.Items.Count > 0)
|
||||
comboBox2.SelectedIndex = 0;
|
||||
}
|
||||
|
||||
public int texid;
|
||||
public void DrawUVs(List<STGenericObject> genericObjects)
|
||||
{
|
||||
foreach (var genericObject in genericObjects)
|
||||
{
|
||||
int divisions = 4;
|
||||
int lineWidth = 1;
|
||||
|
||||
Color uvColor = Color.LightGreen;
|
||||
Color gridColor = Color.Black;
|
||||
|
||||
|
||||
|
||||
List<int> f = genericObject.lodMeshes[0].getDisplayFace();
|
||||
|
||||
for (int v = 0; v < genericObject.lodMeshes[0].displayFaceSize; v += 3)
|
||||
{
|
||||
if (genericObject.lodMeshes[0].displayFaceSize < 3 ||
|
||||
genericObject.vertices.Count < 3)
|
||||
return;
|
||||
|
||||
Vector2 v1 = new Vector2(0);
|
||||
Vector2 v2 = new Vector2(0);
|
||||
Vector2 v3 = new Vector2(0);
|
||||
|
||||
if (UvChannelIndex == 0)
|
||||
{
|
||||
v1 = genericObject.vertices[f[v]].uv0;
|
||||
v2 = genericObject.vertices[f[v + 1]].uv0;
|
||||
v3 = genericObject.vertices[f[v + 2]].uv0;
|
||||
}
|
||||
if (UvChannelIndex == 1)
|
||||
{
|
||||
v1 = genericObject.vertices[f[v]].uv1;
|
||||
v2 = genericObject.vertices[f[v + 1]].uv1;
|
||||
v3 = genericObject.vertices[f[v + 2]].uv1;
|
||||
}
|
||||
if (UvChannelIndex == 2)
|
||||
{
|
||||
v1 = genericObject.vertices[f[v]].uv2;
|
||||
v2 = genericObject.vertices[f[v + 1]].uv2;
|
||||
v3 = genericObject.vertices[f[v + 2]].uv2;
|
||||
}
|
||||
|
||||
v1 = new Vector2(v1.X, 1 - v1.Y);
|
||||
v2 = new Vector2(v2.X, 1 - v2.Y);
|
||||
v3 = new Vector2(v3.X, 1 - v3.Y);
|
||||
|
||||
DrawUVTriangleAndGrid(v1, v2, v3, divisions, uvColor, lineWidth, gridColor);
|
||||
}
|
||||
}
|
||||
}
|
||||
private void DrawUVTriangleAndGrid(Vector2 v1, Vector2 v2, Vector2 v3, int divisions,
|
||||
Color uvColor, int lineWidth, Color gridColor)
|
||||
{
|
||||
GL.UseProgram(0);
|
||||
|
||||
float bounds = 1;
|
||||
Vector2 scaleUv = activeTexture.UVScale * new Vector2(2);
|
||||
Vector2 transUv = activeTexture.UVTranslate - new Vector2(1f);
|
||||
|
||||
//Disable textures so they don't affect color
|
||||
GL.Disable(EnableCap.Texture2D);
|
||||
DrawUvTriangle(v1, v2, v3, uvColor, scaleUv, transUv);
|
||||
|
||||
// Draw Grid
|
||||
GL.Color3(gridColor);
|
||||
// DrawHorizontalGrid(divisions, bounds, scaleUv);
|
||||
// DrawVerticalGrid(divisions, bounds, scaleUv);
|
||||
}
|
||||
|
||||
private static void DrawUvTriangle(Vector2 v1, Vector2 v2, Vector2 v3, Color uvColor, Vector2 scaleUv, Vector2 transUv)
|
||||
{
|
||||
GL.Color3(uvColor);
|
||||
GL.Begin(PrimitiveType.Lines);
|
||||
GL.LineWidth(3);
|
||||
GL.Vertex2(v1 * scaleUv + transUv);
|
||||
GL.Vertex2(v2 * scaleUv + transUv);
|
||||
GL.End();
|
||||
|
||||
GL.Begin(PrimitiveType.Lines);
|
||||
GL.LineWidth(3);
|
||||
GL.Vertex2(v2 * scaleUv + transUv);
|
||||
GL.Vertex2(v3 * scaleUv + transUv);
|
||||
GL.End();
|
||||
|
||||
GL.Begin(PrimitiveType.Lines);
|
||||
GL.LineWidth(3);
|
||||
GL.Vertex2(v3 * scaleUv + transUv);
|
||||
GL.Vertex2(v1 * scaleUv + transUv);
|
||||
GL.End();
|
||||
}
|
||||
|
||||
private void SetupRendering(float lineWidth)
|
||||
{
|
||||
// Go to 2D
|
||||
GL.Viewport(0, 0, gL_ControlLegacy2D1.Width, gL_ControlLegacy2D1.Height);
|
||||
GL.MatrixMode(MatrixMode.Projection);
|
||||
GL.PushMatrix();
|
||||
GL.LoadIdentity();
|
||||
float aspect = (float)gL_ControlLegacy2D1.Width / (float)gL_ControlLegacy2D1.Height;
|
||||
GL.Ortho(-aspect, aspect, -1, 1, -1, 1);
|
||||
GL.MatrixMode(MatrixMode.Modelview);
|
||||
GL.PushMatrix();
|
||||
GL.LoadIdentity();
|
||||
GL.LineWidth(lineWidth);
|
||||
|
||||
// Draw over everything
|
||||
GL.Disable(EnableCap.DepthTest);
|
||||
GL.Disable(EnableCap.CullFace);
|
||||
}
|
||||
|
||||
private static void DrawVerticalGrid(int divisions, float bounds, Vector2 scaleUv)
|
||||
{
|
||||
int verticalCount = divisions;
|
||||
for (int i = 0; i < verticalCount * bounds; i++)
|
||||
{
|
||||
GL.Begin(PrimitiveType.Lines);
|
||||
GL.Vertex2(new Vector2((1.0f / verticalCount) * i, -bounds) * scaleUv);
|
||||
GL.Vertex2(new Vector2((1.0f / verticalCount) * i, bounds) * scaleUv);
|
||||
GL.End();
|
||||
}
|
||||
}
|
||||
|
||||
private static void DrawHorizontalGrid(int divisions, float bounds, Vector2 scaleUv)
|
||||
{
|
||||
int horizontalCount = divisions;
|
||||
for (int i = 0; i < horizontalCount * bounds; i++)
|
||||
{
|
||||
GL.Begin(PrimitiveType.Lines);
|
||||
GL.Vertex2(new Vector2(-bounds, (1.0f / horizontalCount) * i) * scaleUv);
|
||||
GL.Vertex2(new Vector2(bounds, (1.0f / horizontalCount) * i) * scaleUv);
|
||||
GL.End();
|
||||
}
|
||||
}
|
||||
|
||||
int PlaneSize = 1;
|
||||
float PosX;
|
||||
float PosY;
|
||||
float ZoomValue = 1;
|
||||
|
||||
Point MouseDownPos;
|
||||
|
||||
private float FindHCF(float m, float n)
|
||||
{
|
||||
float temp, remainder;
|
||||
if (m < n)
|
||||
{
|
||||
temp = m;
|
||||
m = n;
|
||||
n = temp;
|
||||
}
|
||||
while (true)
|
||||
{
|
||||
remainder = m % n;
|
||||
if (remainder == 0)
|
||||
return n;
|
||||
else
|
||||
m = n;
|
||||
n = remainder;
|
||||
}
|
||||
}
|
||||
|
||||
private void gL_ControlLegacy2D1_Paint(object sender, PaintEventArgs e)
|
||||
{
|
||||
if (ActiveObjects.Count <= 0 || ActiveMaterial == null || Runtime.OpenTKInitialized == false)
|
||||
return;
|
||||
|
||||
gL_ControlLegacy2D1.MakeCurrent();
|
||||
|
||||
SetupRendering(1);
|
||||
|
||||
GL.ClearColor(System.Drawing.Color.FromArgb(40, 40, 40));
|
||||
GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);
|
||||
|
||||
GL.Disable(EnableCap.Texture2D);
|
||||
|
||||
//This usually won't be seen unless the textures aren't repeating much
|
||||
DrawBackdrop();
|
||||
|
||||
float PlaneScaleX = 0.5f;
|
||||
float PlaneScaleY = 0.5f;
|
||||
|
||||
float HalfWidth = (float)gL_ControlLegacy2D1.Width / 2.0f;
|
||||
float HalfHeight = (float)gL_ControlLegacy2D1.Height / 2.0f;
|
||||
|
||||
if (activeTexture.texWidth != 0 && activeTexture.texHeight != 0)
|
||||
{
|
||||
PlaneScaleX = (float)gL_ControlLegacy2D1.Width / (float)activeTexture.texWidth;
|
||||
PlaneScaleY = (float)gL_ControlLegacy2D1.Height / (float)activeTexture.texHeight;
|
||||
}
|
||||
|
||||
|
||||
|
||||
//Now do the plane with uvs
|
||||
GL.PushMatrix();
|
||||
GL.Scale(PlaneScaleY * ZoomValue, -PlaneScaleX * ZoomValue, 1);
|
||||
GL.Translate(PosX, PosY, 0);
|
||||
|
||||
GL.MatrixMode(MatrixMode.Modelview);
|
||||
GL.LoadIdentity();
|
||||
GL.MatrixMode(MatrixMode.Texture);
|
||||
GL.LoadIdentity();
|
||||
|
||||
bool UseBackground = true;
|
||||
|
||||
if (UseBackground)
|
||||
{
|
||||
float BrightnessAmount = (float)brightness / 100f;
|
||||
int brightnessScale = (int)(BrightnessAmount * 255);
|
||||
|
||||
GL.PushAttrib(AttribMask.TextureBit);
|
||||
|
||||
var background = new GenericBitmapTexture(Properties.Resources.CheckerBackground);
|
||||
background.LoadOpenGLTexture();
|
||||
|
||||
//Draws a textured plan for our uvs to show on
|
||||
GL.Enable(EnableCap.Texture2D);
|
||||
GL.BindTexture(TextureTarget.Texture2D, background.RenderableTex.TexID);
|
||||
|
||||
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, (int)TextureWrapMode.Repeat);
|
||||
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, (int)TextureWrapMode.Repeat);
|
||||
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Nearest);
|
||||
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Nearest);
|
||||
|
||||
GL.Begin(PrimitiveType.Quads);
|
||||
// GL.Color3(brightnessScale, brightnessScale, brightnessScale);
|
||||
GL.TexCoord2(0.0f, 0.0f);
|
||||
GL.Vertex2(-HalfWidth, -HalfHeight);
|
||||
GL.TexCoord2(PlaneScaleX, 0.0f);
|
||||
GL.Vertex2(HalfWidth, -HalfHeight);
|
||||
GL.TexCoord2(PlaneScaleX, PlaneScaleY);
|
||||
GL.Vertex2(HalfWidth, HalfHeight);
|
||||
GL.TexCoord2(0.0f, PlaneScaleY);
|
||||
GL.Vertex2(-HalfWidth, HalfHeight);
|
||||
GL.End();
|
||||
GL.PopAttrib();
|
||||
}
|
||||
|
||||
if (activeTexture.texture != null)
|
||||
{
|
||||
// DrawTexturedPlane(1, activeTexture.texWidth, activeTexture.texHeight);
|
||||
}
|
||||
|
||||
GL.MatrixMode(MatrixMode.Modelview);
|
||||
GL.LoadIdentity();
|
||||
|
||||
DrawUVs(ActiveObjects);
|
||||
|
||||
GL.PopMatrix();
|
||||
|
||||
gL_ControlLegacy2D1.SwapBuffers();
|
||||
}
|
||||
|
||||
|
||||
//Aspect ratio stuff from https://github.com/libertyernie/brawltools/blob/40d7431b1a01ef4a0411cd69e51411bd581e93e2/BrawlLib/System/Windows/Controls/TexCoordRenderer.cs
|
||||
private void DrawTexturedPlane(float scale, uint TextureWidth, uint TextureHeight)
|
||||
{
|
||||
//Draws a textured plan for our uvs to show on
|
||||
/* GL.Enable(EnableCap.Texture2D);
|
||||
GL.BindTexture(TextureTarget.Texture2D, texid);
|
||||
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, (float)STGenericMatTexture.wrapmode[activeTexture.wrapModeS]);
|
||||
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, (float)STGenericMatTexture.wrapmode[activeTexture.wrapModeT]);
|
||||
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)STGenericMatTexture.minfilter[activeTexture.minFilter]);
|
||||
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)STGenericMatTexture.magfilter[activeTexture.magFilter]);
|
||||
*/
|
||||
|
||||
float HalfWidth = (float)gL_ControlLegacy2D1.Width / 2.0f;
|
||||
float HalfHeight = (float)gL_ControlLegacy2D1.Height / 2.0f;
|
||||
|
||||
Vector2 scaleCenter = new Vector2(0.5f, 0.5f);
|
||||
|
||||
float[] texCoord = new float[8];
|
||||
|
||||
float tAspect = (float)TextureWidth / TextureHeight;
|
||||
float wAspect = (float)gL_ControlLegacy2D1.Width / gL_ControlLegacy2D1.Height;
|
||||
|
||||
Vector2 topLeft = new Vector2();
|
||||
Vector2 bottomRight = new Vector2();
|
||||
|
||||
float xCorrect = 1.0f, yCorrect = 1.0f;
|
||||
if (tAspect > wAspect)
|
||||
{
|
||||
//Texture is wider, use horizontal fit
|
||||
//X touches the edges of the window, Y has top and bottom padding
|
||||
|
||||
texCoord[0] = texCoord[6] = 0.0f;
|
||||
texCoord[2] = texCoord[4] = 1.0f;
|
||||
|
||||
texCoord[1] = texCoord[3] = (yCorrect = tAspect / wAspect) / 2.0f + 0.5f;
|
||||
texCoord[5] = texCoord[7] = 1.0f - texCoord[1];
|
||||
|
||||
bottomRight = new Vector2(HalfWidth, (((float)gL_ControlLegacy2D1.Height - ((float)gL_ControlLegacy2D1.Width /
|
||||
TextureWidth * TextureHeight)) / (float)gL_ControlLegacy2D1.Height / 2.0f - 0.5f) *
|
||||
(float)gL_ControlLegacy2D1.Height);
|
||||
|
||||
topLeft = new Vector2(-HalfHeight, -bottomRight.Y);
|
||||
}
|
||||
else
|
||||
{
|
||||
//Window is wider, use vertical fit
|
||||
//Y touches the edges of the window, X has left and right padding
|
||||
|
||||
texCoord[1] = texCoord[3] = 1.0f;
|
||||
texCoord[5] = texCoord[7] = 0.0f;
|
||||
|
||||
//X
|
||||
texCoord[2] = texCoord[4] = (xCorrect = wAspect / tAspect) / 2.0f + 0.5f;
|
||||
texCoord[0] = texCoord[6] = 1.0f - texCoord[2];
|
||||
|
||||
bottomRight = new Vector2(1.0f - (((float)gL_ControlLegacy2D1.Width -
|
||||
((float)gL_ControlLegacy2D1.Height / TextureHeight * TextureWidth)) / gL_ControlLegacy2D1.Width / 2.0f - 0.5f) *
|
||||
(float)gL_ControlLegacy2D1.Width, -HalfHeight);
|
||||
|
||||
topLeft = new Vector2(-bottomRight.X, HalfHeight);
|
||||
}
|
||||
|
||||
GL.Begin(PrimitiveType.Quads);
|
||||
GL.TexCoord2(texCoord[0], texCoord[1]);
|
||||
GL.Vertex2(-HalfWidth, -HalfHeight);
|
||||
GL.TexCoord2(texCoord[2], texCoord[3]);
|
||||
GL.Vertex2(HalfWidth, -HalfHeight);
|
||||
GL.TexCoord2(texCoord[4], texCoord[5]);
|
||||
GL.Vertex2(HalfWidth, HalfHeight);
|
||||
GL.TexCoord2(texCoord[6], texCoord[7]);
|
||||
GL.Vertex2(-HalfWidth, HalfHeight);
|
||||
GL.End();
|
||||
|
||||
|
||||
|
||||
}
|
||||
private void DrawBackdrop()
|
||||
{
|
||||
//Background
|
||||
GL.Begin(PrimitiveType.Quads);
|
||||
GL.Color3(Color.FromArgb(40, 40, 40));
|
||||
GL.TexCoord2(1, 1);
|
||||
GL.Vertex2(PlaneSize, -PlaneSize);
|
||||
GL.TexCoord2(0, 1);
|
||||
GL.Vertex2(-PlaneSize, -PlaneSize);
|
||||
GL.TexCoord2(0, 0);
|
||||
GL.Vertex2(-PlaneSize, PlaneSize);
|
||||
GL.TexCoord2(1, 0);
|
||||
GL.Vertex2(PlaneSize, PlaneSize);
|
||||
GL.End();
|
||||
}
|
||||
|
||||
private void OnMouseWheel(object sender, System.Windows.Forms.MouseEventArgs e)
|
||||
{
|
||||
if (e.Delta > 0 && ZoomValue > 0) ZoomValue += 0.1f;
|
||||
if (e.Delta < 0 && ZoomValue < 30 && ZoomValue > 0.1) ZoomValue -= 0.1f;
|
||||
|
||||
gL_ControlLegacy2D1.Invalidate();
|
||||
}
|
||||
|
||||
private void gL_ControlLegacy2D1_MouseDown(object sender, MouseEventArgs e)
|
||||
{
|
||||
if (e.Button == MouseButtons.Left)
|
||||
{
|
||||
MouseDownPos = MousePosition;
|
||||
}
|
||||
}
|
||||
|
||||
private void gL_ControlLegacy2D1_MouseMove(object sender, MouseEventArgs e)
|
||||
{
|
||||
if (e.Button != MouseButtons.Left)
|
||||
return;
|
||||
|
||||
Point temp = Control.MousePosition;
|
||||
Point res = new Point(MouseDownPos.X - temp.X, MouseDownPos.Y - temp.Y);
|
||||
|
||||
PosX -= res.X * 0.001f;
|
||||
PosY -= res.Y * 0.001f;
|
||||
|
||||
gL_ControlLegacy2D1.Invalidate();
|
||||
|
||||
MouseDownPos = temp;
|
||||
}
|
||||
|
||||
private void comboBox2_SelectedIndexChanged(object sender, EventArgs e)
|
||||
{
|
||||
if (comboBox2.SelectedIndex >= 0)
|
||||
{
|
||||
activeTexture = Textures[comboBox2.SelectedIndex];
|
||||
UvChannelIndex = activeTexture.UvChannelIndex;
|
||||
|
||||
scaleXUD.Value = (decimal)activeTexture.UVScale.X;
|
||||
scaleYUD.Value = (decimal)activeTexture.UVScale.Y;
|
||||
transXUD.Value = (decimal)activeTexture.UVTranslate.X;
|
||||
transYUD.Value = (decimal)activeTexture.UVTranslate.Y;
|
||||
|
||||
var texture = activeTexture.texture;
|
||||
|
||||
if (texture.RenderableTex == null)
|
||||
texture.LoadOpenGLTexture();
|
||||
|
||||
texid = texture.RenderableTex.TexID;
|
||||
activeTexture.texWidth = texture.Width;
|
||||
activeTexture.texHeight = texture.Height;
|
||||
|
||||
gL_ControlLegacy2D1.Invalidate();
|
||||
|
||||
IsSRTLoaded = true;
|
||||
}
|
||||
}
|
||||
|
||||
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
|
||||
{
|
||||
if (comboBox1.SelectedIndex >= 0)
|
||||
{
|
||||
UvChannelIndex = comboBox1.SelectedIndex;
|
||||
gL_ControlLegacy2D1.Invalidate();
|
||||
}
|
||||
}
|
||||
|
||||
private void OnNumbicValueSRT_ValueChanged(object sender, EventArgs e)
|
||||
{
|
||||
}
|
||||
|
||||
private void btnApplyTransform_Click(object sender, EventArgs e)
|
||||
{
|
||||
foreach (var shape in ActiveObjects)
|
||||
{
|
||||
Vector2 Scale = new Vector2((float)scaleXUD.Value, (float)scaleYUD.Value);
|
||||
Vector2 Translate = new Vector2((float)transXUD.Value, (float)transYUD.Value);
|
||||
|
||||
shape.TransformUVs(Translate, Scale, UvChannelIndex);
|
||||
}
|
||||
|
||||
scaleXUD.Value = 1;
|
||||
scaleYUD.Value = 1;
|
||||
transXUD.Value = 0;
|
||||
transYUD.Value = 0;
|
||||
|
||||
gL_ControlLegacy2D1.Invalidate();
|
||||
}
|
||||
|
||||
private void gL_ControlLegacy2D1_Resize(object sender, EventArgs e)
|
||||
{
|
||||
gL_ControlLegacy2D1.Invalidate();
|
||||
}
|
||||
|
||||
private void stTrackBar1_Scroll(object sender, ScrollEventArgs e)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
private void barSlider1_Scroll(object sender, ScrollEventArgs e)
|
||||
{
|
||||
brightness = barSlider1.Value;
|
||||
gL_ControlLegacy2D1.Invalidate();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,45 +0,0 @@
|
|||
namespace Toolbox.Library.Forms
|
||||
{
|
||||
partial class UVEditorAdvanced
|
||||
{
|
||||
/// <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()
|
||||
{
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// UVEditorAdvanced
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.Name = "UVEditorAdvanced";
|
||||
this.Size = new System.Drawing.Size(444, 351);
|
||||
this.ResumeLayout(false);
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
|
@ -1,26 +0,0 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Drawing;
|
||||
using System.Data;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace Toolbox.Library.Forms
|
||||
{
|
||||
public partial class UVEditorAdvanced : UserControl
|
||||
{
|
||||
public UVViewport Viewport;
|
||||
|
||||
public UVEditorAdvanced()
|
||||
{
|
||||
InitializeComponent();
|
||||
|
||||
Viewport = new UVViewport();
|
||||
Viewport.Dock = DockStyle.Fill;
|
||||
Controls.Add(Viewport);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -44,9 +44,9 @@
|
|||
// uvEditor1
|
||||
//
|
||||
this.uvEditor1.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||
this.uvEditor1.Location = new System.Drawing.Point(0, 25);
|
||||
this.uvEditor1.Location = new System.Drawing.Point(0, 0);
|
||||
this.uvEditor1.Name = "uvEditor1";
|
||||
this.uvEditor1.Size = new System.Drawing.Size(595, 443);
|
||||
this.uvEditor1.Size = new System.Drawing.Size(595, 468);
|
||||
this.uvEditor1.TabIndex = 11;
|
||||
//
|
||||
// UVEditorForm
|
||||
|
|
|
@ -6,33 +6,125 @@ using System.Threading.Tasks;
|
|||
using OpenTK;
|
||||
using OpenTK.Graphics.OpenGL;
|
||||
using System.Drawing;
|
||||
using Toolbox.Library.IO;
|
||||
|
||||
namespace Toolbox.Library.Forms
|
||||
{
|
||||
public class UVViewport : Viewport2D
|
||||
{
|
||||
public STGenericMatTexture ActiveTextureMap { get; set; }
|
||||
|
||||
public UVViewport()
|
||||
{
|
||||
}
|
||||
|
||||
public List<STGenericObject> ActiveObjects = new List<STGenericObject>();
|
||||
|
||||
/// <summary>
|
||||
/// Selectes the group of polygons to display UVs for. -1 set to use all of them.
|
||||
/// </summary>
|
||||
public int PolygonGroupIndex = -1;
|
||||
|
||||
public int UvChannelIndex = 0;
|
||||
|
||||
public bool Repeat = true;
|
||||
|
||||
public float Brightness = 1.0f;
|
||||
|
||||
public PickableUVMap PickableUVMap = new PickableUVMap();
|
||||
|
||||
public override List<IPickable2DObject> GetPickableObjects()
|
||||
{
|
||||
return new List<IPickable2DObject>() { PickableUVMap };
|
||||
}
|
||||
|
||||
public override void RenderSceme()
|
||||
{
|
||||
DrawTexturedPlane(1);
|
||||
DrawUVs(ActiveObjects);
|
||||
GL.PushMatrix();
|
||||
Vector3 Scale = new Vector3(30, 30, 30);
|
||||
|
||||
//Scale the plane by aspect ratio
|
||||
GL.PushMatrix();
|
||||
|
||||
bool useTextures = false;
|
||||
if (ActiveTextureMap != null) {
|
||||
var tex = ActiveTextureMap.GetTexture();
|
||||
|
||||
//Bind texture if not null
|
||||
if (tex != null)
|
||||
{
|
||||
//Adjust scale via aspect ratio
|
||||
if (Width > Height)
|
||||
{
|
||||
float aspect = (float)tex.Width / (float)tex.Height;
|
||||
Console.WriteLine($"aspect w {aspect}");
|
||||
Scale.X *= aspect;
|
||||
}
|
||||
else
|
||||
{
|
||||
float aspect = (float)tex.Height / (float)tex.Width;
|
||||
Console.WriteLine($"aspect h {aspect}");
|
||||
Scale.Y *= aspect;
|
||||
}
|
||||
|
||||
if (tex.RenderableTex == null || !tex.RenderableTex.GLInitialized)
|
||||
tex.LoadOpenGLTexture();
|
||||
|
||||
GL.Enable(EnableCap.Texture2D);
|
||||
GL.BindTexture(TextureTarget.Texture2D, tex.RenderableTex.TexID);
|
||||
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, (float)STGenericMatTexture.wrapmode[ActiveTextureMap.WrapModeS]);
|
||||
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, (float)STGenericMatTexture.wrapmode[ActiveTextureMap.WrapModeT]);
|
||||
// GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, (int)STGenericMatTexture.wrapmode[activeTexture.wrapModeS]);
|
||||
// GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, (int)STGenericMatTexture.wrapmode[activeTexture.wrapModeT]);
|
||||
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)STGenericMatTexture.minfilter[ActiveTextureMap.MinFilter]);
|
||||
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)STGenericMatTexture.magfilter[ActiveTextureMap.MagFilter]);
|
||||
|
||||
useTextures = true;
|
||||
}
|
||||
}
|
||||
|
||||
GL.Scale(Scale);
|
||||
|
||||
if (useTextures)
|
||||
{
|
||||
GL.Enable(EnableCap.Texture2D);
|
||||
if (Repeat)
|
||||
{
|
||||
DrawPlane(50, Color.FromArgb(128, 128,128));
|
||||
DrawPlane(1, Color.White);
|
||||
}
|
||||
else
|
||||
DrawPlane(1, Color.White);
|
||||
}
|
||||
else
|
||||
{
|
||||
DrawPlane(1, BackgroundColor.Lighten(40));
|
||||
}
|
||||
|
||||
GL.Disable(EnableCap.Texture2D);
|
||||
|
||||
PickableUVMap.DrawUVs(PolygonGroupIndex, UvChannelIndex, ActiveObjects, ActiveTextureMap);
|
||||
DrawPlane(1, Color.Black, true);
|
||||
|
||||
GL.PopMatrix();
|
||||
}
|
||||
|
||||
private void DrawTexturedPlane(float scale)
|
||||
private void DrawPlane(float scale, Color color, bool Outlines = false)
|
||||
{
|
||||
Vector2 scaleCenter = new Vector2(0.5f, 0.5f);
|
||||
|
||||
color = Color.FromArgb(
|
||||
(byte)(color.R * Brightness),
|
||||
(byte)(color.G * Brightness),
|
||||
(byte)(color.B * Brightness));
|
||||
|
||||
Vector2[] TexCoords = new Vector2[] {
|
||||
new Vector2(1,1),
|
||||
new Vector2(0,1),
|
||||
new Vector2(0,0),
|
||||
new Vector2(1,0),
|
||||
};
|
||||
|
||||
Vector2[] Positions = new Vector2[] {
|
||||
new Vector2(1,-1),
|
||||
new Vector2(-1,-1),
|
||||
|
@ -49,149 +141,44 @@ namespace Toolbox.Library.Forms
|
|||
Positions[2] = Positions[2] * scale;
|
||||
Positions[3] = Positions[3] * scale;
|
||||
|
||||
GL.Begin(PrimitiveType.Quads);
|
||||
GL.Color3(Brightness, Brightness, Brightness);
|
||||
GL.TexCoord2(TexCoords[0]);
|
||||
GL.Vertex2(Positions[0]);
|
||||
GL.TexCoord2(TexCoords[1]);
|
||||
GL.Vertex2(Positions[1]);
|
||||
GL.TexCoord2(TexCoords[2]);
|
||||
GL.Vertex2(Positions[2]);
|
||||
GL.TexCoord2(TexCoords[3]);
|
||||
GL.Vertex2(Positions[3]);
|
||||
GL.End();
|
||||
}
|
||||
|
||||
public void DrawUVs(List<STGenericObject> genericObjects)
|
||||
{
|
||||
if (genericObjects.Count == 0) return;
|
||||
|
||||
foreach (var genericObject in genericObjects)
|
||||
if (Outlines)
|
||||
{
|
||||
int divisions = 4;
|
||||
int lineWidth = 1;
|
||||
|
||||
Color uvColor = Color.LightGreen;
|
||||
Color gridColor = Color.Black;
|
||||
|
||||
List<int> f = new List<int>();
|
||||
int displayFaceSize = 0;
|
||||
if (genericObject.lodMeshes.Count > 0)
|
||||
{
|
||||
f = genericObject.lodMeshes[0].getDisplayFace();
|
||||
displayFaceSize = genericObject.lodMeshes[0].displayFaceSize;
|
||||
}
|
||||
if (genericObject.PolygonGroups.Count > 0)
|
||||
{
|
||||
foreach (var group in genericObject.PolygonGroups)
|
||||
{
|
||||
f.AddRange(genericObject.PolygonGroups[0].GetDisplayFace());
|
||||
displayFaceSize += genericObject.PolygonGroups[0].displayFaceSize;
|
||||
}
|
||||
}
|
||||
|
||||
for (int v = 0; v < displayFaceSize; v += 3)
|
||||
{
|
||||
if (displayFaceSize < 3 || genericObject.vertices.Count < 3)
|
||||
return;
|
||||
|
||||
Vector2 v1 = new Vector2(0);
|
||||
Vector2 v2 = new Vector2(0);
|
||||
Vector2 v3 = new Vector2(0);
|
||||
|
||||
if (f.Count < v + 2)
|
||||
continue;
|
||||
|
||||
if (UvChannelIndex == 0)
|
||||
{
|
||||
v1 = genericObject.vertices[f[v]].uv0;
|
||||
v2 = genericObject.vertices[f[v + 1]].uv0;
|
||||
v3 = genericObject.vertices[f[v + 2]].uv0;
|
||||
}
|
||||
if (UvChannelIndex == 1)
|
||||
{
|
||||
v1 = genericObject.vertices[f[v]].uv1;
|
||||
v2 = genericObject.vertices[f[v + 1]].uv1;
|
||||
v3 = genericObject.vertices[f[v + 2]].uv1;
|
||||
}
|
||||
if (UvChannelIndex == 2)
|
||||
{
|
||||
v1 = genericObject.vertices[f[v]].uv2;
|
||||
v2 = genericObject.vertices[f[v + 1]].uv2;
|
||||
v3 = genericObject.vertices[f[v + 2]].uv2;
|
||||
}
|
||||
|
||||
v1 = new Vector2(v1.X, 1 - v1.Y);
|
||||
v2 = new Vector2(v2.X, 1 - v2.Y);
|
||||
v3 = new Vector2(v3.X, 1 - v3.Y);
|
||||
|
||||
DrawUVTriangleAndGrid(v1, v2, v3, divisions, uvColor, lineWidth, gridColor);
|
||||
}
|
||||
}
|
||||
}
|
||||
private void DrawUVTriangleAndGrid(Vector2 v1, Vector2 v2, Vector2 v3, int divisions,
|
||||
Color uvColor, int lineWidth, Color gridColor)
|
||||
{
|
||||
GL.UseProgram(0);
|
||||
|
||||
float bounds = 1;
|
||||
Vector2 scaleUv = new Vector2(2);
|
||||
Vector2 transUv = new Vector2(1f);
|
||||
|
||||
//Disable textures so they don't affect color
|
||||
GL.Disable(EnableCap.Texture2D);
|
||||
DrawUvTriangle(v1, v2, v3, uvColor, scaleUv, transUv);
|
||||
|
||||
// Draw Grid
|
||||
GL.Color3(gridColor);
|
||||
// DrawHorizontalGrid(divisions, bounds, scaleUv);
|
||||
// DrawVerticalGrid(divisions, bounds, scaleUv);
|
||||
}
|
||||
|
||||
private static void DrawUvTriangle(Vector2 v1, Vector2 v2, Vector2 v3, Color uvColor, Vector2 scaleUv, Vector2 transUv)
|
||||
{
|
||||
GL.Color3(uvColor);
|
||||
GL.Begin(PrimitiveType.Lines);
|
||||
GL.LineWidth(3);
|
||||
GL.Vertex2(v1 * scaleUv + transUv);
|
||||
GL.Vertex2(v2 * scaleUv + transUv);
|
||||
GL.End();
|
||||
|
||||
GL.Begin(PrimitiveType.Lines);
|
||||
GL.LineWidth(3);
|
||||
GL.Vertex2(v2 * scaleUv + transUv);
|
||||
GL.Vertex2(v3 * scaleUv + transUv);
|
||||
GL.End();
|
||||
|
||||
GL.Begin(PrimitiveType.Lines);
|
||||
GL.LineWidth(3);
|
||||
GL.Vertex2(v3 * scaleUv + transUv);
|
||||
GL.Vertex2(v1 * scaleUv + transUv);
|
||||
GL.End();
|
||||
}
|
||||
|
||||
private static void DrawVerticalGrid(int divisions, float bounds, Vector2 scaleUv)
|
||||
{
|
||||
int verticalCount = divisions;
|
||||
for (int i = 0; i < verticalCount * bounds; i++)
|
||||
{
|
||||
GL.Begin(PrimitiveType.Lines);
|
||||
GL.Vertex2(new Vector2((1.0f / verticalCount) * i, -bounds) * scaleUv);
|
||||
GL.Vertex2(new Vector2((1.0f / verticalCount) * i, bounds) * scaleUv);
|
||||
GL.LineWidth(1);
|
||||
GL.Begin(PrimitiveType.LineLoop);
|
||||
GL.Color3(color);
|
||||
GL.Vertex2(Positions[0]);
|
||||
GL.Vertex2(Positions[1]);
|
||||
GL.Vertex2(Positions[2]);
|
||||
GL.Vertex2(Positions[3]);
|
||||
GL.End();
|
||||
}
|
||||
}
|
||||
|
||||
private static void DrawHorizontalGrid(int divisions, float bounds, Vector2 scaleUv)
|
||||
{
|
||||
int horizontalCount = divisions;
|
||||
for (int i = 0; i < horizontalCount * bounds; i++)
|
||||
else
|
||||
{
|
||||
GL.Begin(PrimitiveType.Lines);
|
||||
GL.Vertex2(new Vector2(-bounds, (1.0f / horizontalCount) * i) * scaleUv);
|
||||
GL.Vertex2(new Vector2(bounds, (1.0f / horizontalCount) * i) * scaleUv);
|
||||
GL.Begin(PrimitiveType.Quads);
|
||||
GL.Color3(color);
|
||||
GL.TexCoord2(TexCoords[0]);
|
||||
GL.Vertex2(Positions[0]);
|
||||
GL.TexCoord2(TexCoords[1]);
|
||||
GL.Vertex2(Positions[1]);
|
||||
GL.TexCoord2(TexCoords[2]);
|
||||
GL.Vertex2(Positions[2]);
|
||||
GL.TexCoord2(TexCoords[3]);
|
||||
GL.Vertex2(Positions[3]);
|
||||
GL.End();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
private void InitializeComponent()
|
||||
{
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// UVViewport
|
||||
//
|
||||
this.Name = "UVViewport";
|
||||
this.ResumeLayout(false);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
120
Switch_Toolbox_Library/Forms/Editors/UV/UVViewport.resx
Normal file
120
Switch_Toolbox_Library/Forms/Editors/UV/UVViewport.resx
Normal file
|
@ -0,0 +1,120 @@
|
|||
<?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>
|
||||
</root>
|
|
@ -278,7 +278,15 @@ namespace Toolbox.Library
|
|||
if (vertices.Count < 3)
|
||||
return;
|
||||
|
||||
List<int> f = lodMeshes[DisplayLODIndex].getDisplayFace();
|
||||
List<int> f = new List<int>();
|
||||
if (lodMeshes.Count > 0)
|
||||
f = lodMeshes[DisplayLODIndex].getDisplayFace();
|
||||
if (PolygonGroups.Count > 0)
|
||||
{
|
||||
foreach (var group in PolygonGroups)
|
||||
f.AddRange(group.GetDisplayFace());
|
||||
}
|
||||
|
||||
Vector3[] tanArray = new Vector3[vertices.Count];
|
||||
Vector3[] bitanArray = new Vector3[vertices.Count];
|
||||
|
||||
|
|
|
@ -18,6 +18,8 @@ namespace Toolbox.Library
|
|||
|
||||
public class STGenericPolygonGroup
|
||||
{
|
||||
public virtual STGenericMaterial Material { get; set; }
|
||||
|
||||
public int Offset { get; set; }
|
||||
public int MaterialIndex { get; set; }
|
||||
public int Index { get; set; }
|
||||
|
|
|
@ -4,6 +4,7 @@ using System.Linq;
|
|||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using OpenTK.Graphics.OpenGL;
|
||||
using OpenTK;
|
||||
|
||||
namespace Toolbox.Library
|
||||
{
|
||||
|
@ -29,6 +30,13 @@ namespace Toolbox.Library
|
|||
NearestMipmapNearest,
|
||||
}
|
||||
|
||||
public class STTextureTransform
|
||||
{
|
||||
public Vector2 Scale { get; set; }
|
||||
public float Rotate { get; set; }
|
||||
public Vector2 Translate { get; set; }
|
||||
}
|
||||
|
||||
public class STGenericMatTexture
|
||||
{
|
||||
public int mapMode = 0;
|
||||
|
@ -65,6 +73,8 @@ namespace Toolbox.Library
|
|||
return null;
|
||||
}
|
||||
|
||||
public virtual STTextureTransform Transform { get; set; }
|
||||
|
||||
public TextureType Type;
|
||||
|
||||
//An enum for the assumed texture type by sampler
|
||||
|
|
|
@ -29,6 +29,14 @@ namespace Toolbox.Library.IO
|
|||
{
|
||||
}
|
||||
|
||||
public void WriteHalfFloat(float v) {
|
||||
Write((Syroot.IOExtension.Half)v);
|
||||
}
|
||||
|
||||
public void Write(Syroot.IOExtension.Half v) {
|
||||
Write(v.Raw);
|
||||
}
|
||||
|
||||
public void Write(Syroot.Maths.Vector2F v)
|
||||
{
|
||||
Write(v.X);
|
||||
|
|
217
Switch_Toolbox_Library/IO/FlatBuffer/FlatBufferConverter.cs
Normal file
217
Switch_Toolbox_Library/IO/FlatBuffer/FlatBufferConverter.cs
Normal file
|
@ -0,0 +1,217 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Diagnostics;
|
||||
using System.Windows.Forms;
|
||||
using Newtonsoft.Json;
|
||||
|
||||
namespace Toolbox.Library.IO
|
||||
{
|
||||
//Ported from https://github.com/kwsch/pkNX/blob/58b0597feaf53b35f5c4424e5ec357f82d99c9fa/pkNX.WinForms/Dumping/FlatBufferConverter.cs
|
||||
//While i could use flat buffer c# generated code, it's a giant mess code wise
|
||||
public static class FlatBufferConverter
|
||||
{
|
||||
static FlatBufferConverter()
|
||||
{
|
||||
if (!Directory.Exists(FlatPath))
|
||||
return;
|
||||
var files = Directory.GetFiles(FlatPath);
|
||||
foreach (var f in files)
|
||||
File.Delete(f);
|
||||
}
|
||||
|
||||
public static string DeserializeToJson(Stream stream, string fbs)
|
||||
{
|
||||
var path = Path.GetTempFileName();
|
||||
stream.ExportToFile(path);
|
||||
return DeserializeToJson(path, fbs);
|
||||
}
|
||||
|
||||
public static string DeserializeToJson(string path, string fbs)
|
||||
{
|
||||
GenerateJsonFromFile(path, fbs);
|
||||
var text = ReadDeleteJsonFromFolder();
|
||||
File.Delete(path);
|
||||
return text;
|
||||
}
|
||||
|
||||
public static T[] DeserializeFrom<T>(string[] files, string fbs)
|
||||
{
|
||||
var result = new T[files.Length];
|
||||
for (int i = 0; i < result.Length; i++)
|
||||
{
|
||||
var file = files[i];
|
||||
result[i] = DeserializeFrom<T>(file, fbs);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
public static T DeserializeFrom<T>(Stream stream, string fbs)
|
||||
{
|
||||
var path = Path.GetTempFileName();
|
||||
stream.ExportToFile(path);
|
||||
var ret = DeserializeFrom<T>(path, fbs);
|
||||
File.Delete(path);
|
||||
return ret;
|
||||
}
|
||||
|
||||
public static T DeserializeFrom<T>(string file, string fbs)
|
||||
{
|
||||
GenerateJsonFromFile(file, fbs);
|
||||
var text = ReadDeleteJsonFromFolder();
|
||||
var obj = JsonConvert.DeserializeObject<T>(text);
|
||||
Debug.Assert(obj != null);
|
||||
Debug.WriteLine($"Deserialized {Path.GetFileName(file)}");
|
||||
return obj;
|
||||
}
|
||||
|
||||
public static byte[][] SerializeFrom<T>(T[] obj, string fbs)
|
||||
{
|
||||
var result = new byte[obj.Length][];
|
||||
for (int i = 0; i < result.Length; i++)
|
||||
{
|
||||
var file = obj[i];
|
||||
result[i] = SerializeFrom(file, fbs);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
public static byte[] SerializeFrom<T>(T obj, string fbs)
|
||||
{
|
||||
string log = GenerateBinFrom(obj, fbs);
|
||||
var fileName = fbs + ".bin";
|
||||
var data = ReadDelete(fileName);
|
||||
Debug.Assert(data.Length != 0);
|
||||
Debug.WriteLine($"Serialized to {fileName}");
|
||||
return data;
|
||||
}
|
||||
|
||||
|
||||
private static string ReadDeleteJsonFromFolder()
|
||||
{
|
||||
var jsonPath = Directory.GetFiles(FlatPath, "*.json")[0];
|
||||
var text = File.ReadAllText(jsonPath);
|
||||
File.Delete(jsonPath);
|
||||
return text;
|
||||
}
|
||||
|
||||
private static byte[] ReadDelete(string fileName)
|
||||
{
|
||||
var filePath = Path.Combine(FlatPath, fileName);
|
||||
|
||||
if (!System.IO.File.Exists(filePath))
|
||||
throw new Exception($"Failed to save binary. {log}");
|
||||
|
||||
var data = File.ReadAllBytes(filePath);
|
||||
File.Delete(filePath);
|
||||
return data;
|
||||
}
|
||||
|
||||
private static void GenerateJsonFromFile(string file, string fbs)
|
||||
{
|
||||
var fbsName = fbs + ".fbs";
|
||||
var fbsPath = Path.Combine(FlatPath, fbsName);
|
||||
Directory.CreateDirectory(FlatPath);
|
||||
if (!File.Exists(fbsPath))
|
||||
File.WriteAllBytes(fbsPath, GetSchema(fbs));
|
||||
|
||||
var fileName = Path.GetFileName(file);
|
||||
var filePath = Path.Combine(FlatPath, fileName);
|
||||
File.Copy(file, filePath, true);
|
||||
|
||||
var args = GetArgumentsDeserialize(fileName, fbsName);
|
||||
RunFlatC(args);
|
||||
File.Delete(filePath);
|
||||
}
|
||||
|
||||
private static string GenerateBinFrom<T>(T obj, string fbs)
|
||||
{
|
||||
var fbsName = fbs + ".fbs";
|
||||
var jsonName = fbs + ".json";
|
||||
var text = WriteJson(obj);
|
||||
|
||||
var jsonPath = Path.Combine(FlatPath, jsonName);
|
||||
File.WriteAllText(jsonPath, text);
|
||||
var args = GetArgumentsSerialize(jsonName, fbsName);
|
||||
return RunFlatC(args);
|
||||
}
|
||||
|
||||
public static string WriteJson<T>(T obj)
|
||||
{
|
||||
var serializer = new JsonSerializer();
|
||||
using (var stringWriter = new StringWriter())
|
||||
{
|
||||
using (var writer = new JsonTextWriter(stringWriter)
|
||||
{
|
||||
QuoteName = false,
|
||||
Formatting = Formatting.Indented,
|
||||
IndentChar = ' ',
|
||||
Indentation = 2
|
||||
})
|
||||
serializer.Serialize(writer, obj);
|
||||
return stringWriter.ToString();
|
||||
}
|
||||
}
|
||||
|
||||
private static string log = "";
|
||||
|
||||
private static string RunFlatC(string args)
|
||||
{
|
||||
var fcp = Path.Combine(FlatPath, "flatc.exe");
|
||||
if (!File.Exists(fcp))
|
||||
File.WriteAllBytes(fcp, Properties.Resources.flatc);
|
||||
|
||||
var process = new Process
|
||||
{
|
||||
StartInfo = new ProcessStartInfo
|
||||
{
|
||||
WorkingDirectory = FlatPath,
|
||||
WindowStyle = ProcessWindowStyle.Hidden,
|
||||
CreateNoWindow = true,
|
||||
FileName = "cmd.exe",
|
||||
Arguments = $"/C flatc {args} & exit",
|
||||
}
|
||||
};
|
||||
process.EnableRaisingEvents = true;
|
||||
process.StartInfo.RedirectStandardError = true;
|
||||
process.StartInfo.RedirectStandardOutput = true;
|
||||
process.OutputDataReceived += new System.Diagnostics.DataReceivedEventHandler(process_OutputDataReceived);
|
||||
process.ErrorDataReceived += new System.Diagnostics.DataReceivedEventHandler(process_ErrorDataReceived);
|
||||
process.StartInfo.UseShellExecute = false;
|
||||
|
||||
process.Start();
|
||||
process.BeginErrorReadLine();
|
||||
process.BeginOutputReadLine();
|
||||
process.WaitForExit();
|
||||
|
||||
return log;
|
||||
}
|
||||
|
||||
private static void process_ErrorDataReceived(object sender, DataReceivedEventArgs e) {
|
||||
if (e.Data != null) log = e.Data;
|
||||
}
|
||||
|
||||
private static void process_OutputDataReceived(object sender, DataReceivedEventArgs e) {
|
||||
if (e.Data != null) log = e.Data;
|
||||
}
|
||||
|
||||
public static byte[] GetSchema(string name)
|
||||
{
|
||||
var obj = Properties.Resources.ResourceManager.GetObject(name);
|
||||
if (!(obj is byte[] b))
|
||||
throw new FileNotFoundException(nameof(name));
|
||||
return b;
|
||||
}
|
||||
|
||||
public static readonly string WorkingDirectory = Application.StartupPath;
|
||||
public static readonly string FlatPath = Path.Combine(WorkingDirectory, "flatbuffers");
|
||||
|
||||
private static string GetArgumentsDeserialize(string file, string fbs) =>
|
||||
$"-t {fbs} -- {file} --defaults-json --raw-binary";
|
||||
|
||||
private static string GetArgumentsSerialize(string file, string fbs) =>
|
||||
$"-b {fbs} {file} --defaults-json";
|
||||
}
|
||||
}
|
|
@ -27,7 +27,9 @@ namespace Toolbox.Library.IO
|
|||
Cursor.Current = Cursors.WaitCursor;
|
||||
FileFormat.FilePath = FileName;
|
||||
|
||||
if (FileFormat.IFileInfo.FileIsCompressed || FileFormat.IFileInfo.InArchive || Path.GetExtension(FileName) == ".szs")
|
||||
string compressionLog = "";
|
||||
if (FileFormat.IFileInfo.FileIsCompressed || FileFormat.IFileInfo.InArchive
|
||||
|| Path.GetExtension(FileName) == ".szs" || Path.GetExtension(FileName) == ".sbfres")
|
||||
{
|
||||
//Todo find more optmial way to handle memory with files in archives
|
||||
//Also make compression require streams
|
||||
|
@ -45,16 +47,19 @@ namespace Toolbox.Library.IO
|
|||
FileName,
|
||||
EnableDialog);
|
||||
|
||||
FileFormat.IFileInfo.CompressedSize = (uint)finalStream.Length;
|
||||
finalStream.ExportToFile(FileName);
|
||||
compressionLog = finalStream.Item2;
|
||||
Stream compressionStream = finalStream.Item1;
|
||||
|
||||
DetailsLog += "\n" + SatisfyFileTables(FileFormat, FileName, finalStream,
|
||||
FileFormat.IFileInfo.CompressedSize = (uint)compressionStream.Length;
|
||||
compressionStream.ExportToFile(FileName);
|
||||
|
||||
DetailsLog += "\n" + SatisfyFileTables(FileFormat, FileName, compressionStream,
|
||||
FileFormat.IFileInfo.DecompressedSize,
|
||||
FileFormat.IFileInfo.CompressedSize,
|
||||
FileFormat.IFileInfo.FileIsCompressed);
|
||||
|
||||
finalStream.Flush();
|
||||
finalStream.Close();
|
||||
compressionStream.Flush();
|
||||
compressionStream.Close();
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -85,7 +90,10 @@ namespace Toolbox.Library.IO
|
|||
}
|
||||
}
|
||||
|
||||
MessageBox.Show($"File has been saved to {FileName}", "Save Notification");
|
||||
if (compressionLog != string.Empty)
|
||||
MessageBox.Show($"File has been saved to {FileName}. Compressed time: {compressionLog}", "Save Notification");
|
||||
else
|
||||
MessageBox.Show($"File has been saved to {FileName}", "Save Notification");
|
||||
|
||||
// STSaveLogDialog.Show($"File has been saved to {FileName}", "Save Notification", DetailsLog);
|
||||
Cursor.Current = Cursors.Default;
|
||||
|
@ -219,7 +227,10 @@ namespace Toolbox.Library.IO
|
|||
uint DecompressedSize = (uint)data.Length;
|
||||
|
||||
Cursor.Current = Cursors.WaitCursor;
|
||||
Stream FinalData = CompressFileFormat(CompressionFormat, new MemoryStream(data), FileIsCompressed, Alignment, FileName, EnableDialog);
|
||||
var compressedData = CompressFileFormat(CompressionFormat, new MemoryStream(data), FileIsCompressed, Alignment, FileName, EnableDialog);
|
||||
string compressionLog = compressedData.Item2;
|
||||
Stream FinalData = compressedData.Item1;
|
||||
|
||||
FinalData.ExportToFile(FileName);
|
||||
|
||||
uint CompressedSize = (uint)FinalData.Length;
|
||||
|
@ -268,7 +279,7 @@ namespace Toolbox.Library.IO
|
|||
}
|
||||
}
|
||||
|
||||
private static Stream CompressFileFormat(ICompressionFormat compressionFormat, Stream data, bool FileIsCompressed, int Alignment,
|
||||
private static Tuple<Stream, string> CompressFileFormat(ICompressionFormat compressionFormat, Stream data, bool FileIsCompressed, int Alignment,
|
||||
string FileName, bool EnableDialog = true)
|
||||
{
|
||||
string extension = Path.GetExtension(FileName);
|
||||
|
@ -280,7 +291,7 @@ namespace Toolbox.Library.IO
|
|||
}
|
||||
|
||||
if (compressionFormat == null)
|
||||
return data;
|
||||
return Tuple.Create(data, "");
|
||||
|
||||
bool CompressFile = false;
|
||||
if (EnableDialog && FileIsCompressed)
|
||||
|
@ -303,10 +314,18 @@ namespace Toolbox.Library.IO
|
|||
if (compressionFormat is Yaz0)
|
||||
((Yaz0)compressionFormat).Alignment = Alignment;
|
||||
|
||||
return compressionFormat.Compress(data);
|
||||
System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
|
||||
sw.Start();
|
||||
|
||||
var comp = compressionFormat.Compress(data);
|
||||
sw.Stop();
|
||||
TimeSpan ts = sw.Elapsed;
|
||||
string message = string.Format("{0:D2}:{1:D2}:{2:D2}", ts.Minutes, ts.Seconds, ts.Milliseconds);
|
||||
Console.WriteLine($"Compression Time : {message}");
|
||||
return Tuple.Create(comp, message);
|
||||
}
|
||||
|
||||
return data;
|
||||
return Tuple.Create(data, "");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -191,7 +191,7 @@ namespace Syroot.IOExtension
|
|||
/// Gets the internally stored value to represent the instance.
|
||||
/// </summary>
|
||||
/// <remarks>Signed to get arithmetic rather than logical shifts.</remarks>
|
||||
internal ushort Raw { get; private set; }
|
||||
public ushort Raw { get; private set; }
|
||||
|
||||
// ---- OPERATORS ----------------------------------------------------------------------------------------------
|
||||
|
||||
|
|
|
@ -41,7 +41,7 @@ namespace Toolbox.Library.Forms
|
|||
}
|
||||
|
||||
private GLControl glControl1;
|
||||
private Color BackgroundColor = Color.FromArgb(40, 40, 40);
|
||||
public Color BackgroundColor = Color.FromArgb(40, 40, 40);
|
||||
|
||||
private List<IPickable2DObject> SelectedObjects = new List<IPickable2DObject>();
|
||||
|
||||
|
@ -64,6 +64,9 @@ namespace Toolbox.Library.Forms
|
|||
|
||||
|
||||
public void UpdateViewport() {
|
||||
if (!Runtime.OpenTKInitialized)
|
||||
return;
|
||||
|
||||
glControl1.Invalidate();
|
||||
}
|
||||
|
||||
|
@ -157,6 +160,8 @@ namespace Toolbox.Library.Forms
|
|||
|
||||
if (showSelectionBox)
|
||||
{
|
||||
GL.PushAttrib(AttribMask.DepthBufferBit);
|
||||
|
||||
GL.Disable(EnableCap.DepthTest);
|
||||
GL.Begin(PrimitiveType.LineLoop);
|
||||
GL.Color4(Color.Red);
|
||||
|
@ -166,6 +171,8 @@ namespace Toolbox.Library.Forms
|
|||
GL.Vertex2(SelectionBox.LeftPoint, SelectionBox.TopPoint);
|
||||
GL.End();
|
||||
GL.Enable(EnableCap.DepthTest);
|
||||
|
||||
GL.PopAttrib();
|
||||
}
|
||||
|
||||
if (UseOrtho)
|
||||
|
@ -202,7 +209,7 @@ namespace Toolbox.Library.Forms
|
|||
showSelectionBox = true;
|
||||
SelectionBox = new STRectangle(left, right, top, bottom);
|
||||
|
||||
SetupScene();
|
||||
UpdateViewport();
|
||||
}
|
||||
|
||||
public virtual void RenderSceme()
|
||||
|
@ -389,10 +396,13 @@ namespace Toolbox.Library.Forms
|
|||
if (mouseDown && !isPicked)
|
||||
{
|
||||
RenderEditor();
|
||||
|
||||
var temp = e.Location;
|
||||
var curPos = OpenGLHelper.convertScreenToWorldCoords(temp.X, temp.Y);
|
||||
var prevPos = OpenGLHelper.convertScreenToWorldCoords(pickOriginMouse.X, pickOriginMouse.Y);
|
||||
|
||||
GL.PopMatrix();
|
||||
|
||||
DrawSelectionBox(prevPos, curPos);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -450,6 +450,16 @@ namespace Toolbox.Library.Properties {
|
|||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized resource of type System.Byte[].
|
||||
/// </summary>
|
||||
public static byte[] flatc {
|
||||
get {
|
||||
object obj = ResourceManager.GetObject("flatc", resourceCulture);
|
||||
return ((byte[])(obj));
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized resource of type System.Drawing.Bitmap.
|
||||
/// </summary>
|
||||
|
@ -470,6 +480,26 @@ namespace Toolbox.Library.Properties {
|
|||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized resource of type System.Byte[].
|
||||
/// </summary>
|
||||
public static byte[] gfbanm {
|
||||
get {
|
||||
object obj = ResourceManager.GetObject("gfbanm", resourceCulture);
|
||||
return ((byte[])(obj));
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized resource of type System.Byte[].
|
||||
/// </summary>
|
||||
public static byte[] gfbmdl {
|
||||
get {
|
||||
object obj = ResourceManager.GetObject("gfbmdl", resourceCulture);
|
||||
return ((byte[])(obj));
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized resource of type System.Drawing.Bitmap.
|
||||
/// </summary>
|
||||
|
|
|
@ -418,4 +418,13 @@
|
|||
<data name="MissingTexture" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\MissingTexture.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||
</data>
|
||||
<data name="flatc" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\flatc.exe;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</data>
|
||||
<data name="gfbmdl" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\FlatBuffers\gfbmdl.fbs;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</data>
|
||||
<data name="gfbanm" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\FlatBuffers\gfbanm.fbs;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</data>
|
||||
</root>
|
|
@ -23,15 +23,21 @@ namespace Toolbox.Library.Rendering
|
|||
public Vector3 pos = new Vector3(0);
|
||||
public Vector3 nrm = new Vector3(0);
|
||||
public Vector4 col = new Vector4(1);
|
||||
public Vector4 col2 = new Vector4(1);
|
||||
|
||||
public Vector2 uv0 = new Vector2(0);
|
||||
public Vector2 uv1 = new Vector2(0);
|
||||
public Vector2 uv2 = new Vector2(0);
|
||||
public Vector2 uv3 = new Vector2(0);
|
||||
|
||||
public Vector4 tan = new Vector4(0);
|
||||
public Vector4 bitan = new Vector4(0);
|
||||
|
||||
public List<int> boneIds = new List<int>();
|
||||
public List<float> boneWeights = new List<float>();
|
||||
|
||||
public float normalW;
|
||||
|
||||
public List<string> boneNames = new List<string>();
|
||||
|
||||
public List<Bone> boneList = new List<Bone>();
|
||||
|
@ -49,5 +55,7 @@ namespace Toolbox.Library.Rendering
|
|||
//For vertex morphing
|
||||
public Vector3 pos1 = new Vector3();
|
||||
public Vector3 pos2 = new Vector3();
|
||||
|
||||
public List<Vector4> Unknowns = new List<Vector4>();
|
||||
}
|
||||
}
|
||||
|
|
210
Switch_Toolbox_Library/Resources/FlatBuffers/gfbanm.fbs
Normal file
210
Switch_Toolbox_Library/Resources/FlatBuffers/gfbanm.fbs
Normal file
|
@ -0,0 +1,210 @@
|
|||
namespace Gfbanim;
|
||||
|
||||
union TriggerParams {
|
||||
TriggerParameterInt , TriggerParameterFloat,
|
||||
TriggerParameterByte, TriggerParameterString
|
||||
}
|
||||
|
||||
union VectorTrack { FixedVectorTrack, DynamicVectorTrack, FramedVectorTrack }
|
||||
union RotationTrack { FixedRotationTrack, DynamicRotationTrack, FramedRotationTrack }
|
||||
union BooleanTrack { FixedBooleanTrack, DynamicBooleanTrack, FramedBooleanTrack }
|
||||
union ValueTrack { FixedValueTrack, DynamicValueTrack, FramedValueTrack }
|
||||
|
||||
enum RotationFlags:ushort (bit_flags) {
|
||||
Orientation = 0,
|
||||
Data1,
|
||||
Data2 = 3,
|
||||
}
|
||||
|
||||
table Animation {
|
||||
AnimConfig:Config;
|
||||
Bones:BoneList;
|
||||
Materials:MaterialList;
|
||||
Groups:GroupList;
|
||||
Triggers:TriggerList;
|
||||
}
|
||||
|
||||
table TriggerList {
|
||||
Triggers:[Trigger];
|
||||
}
|
||||
|
||||
table Trigger {
|
||||
Name:string;
|
||||
FrameStart:int;
|
||||
FrameEnd:int;
|
||||
Parameter:TriggerParameter;
|
||||
}
|
||||
|
||||
|
||||
table TriggerParameter {
|
||||
Name:string;
|
||||
Params:TriggerParams;
|
||||
}
|
||||
|
||||
|
||||
|
||||
table TriggerParameterInt {
|
||||
Value:int;
|
||||
}
|
||||
table TriggerParameterFloat {
|
||||
Value:float;
|
||||
}
|
||||
table TriggerParameterByte {
|
||||
Value:byte;
|
||||
}
|
||||
table TriggerParameterString {
|
||||
Value:string;
|
||||
}
|
||||
|
||||
|
||||
table BoneList {
|
||||
Bones:[Bone];
|
||||
Defaults:BoneDefaults;
|
||||
}
|
||||
|
||||
table MaterialList {
|
||||
Materials:[Material];
|
||||
}
|
||||
|
||||
table GroupList {
|
||||
Groups:[Group];
|
||||
}
|
||||
|
||||
|
||||
table Bone {
|
||||
Name:string;
|
||||
Scale:VectorTrack;
|
||||
Rotate:RotationTrack;
|
||||
Translate:VectorTrack;
|
||||
ScaleFrames:FrameRanges;
|
||||
RotationFrames:FrameRanges;
|
||||
TranslationFrames:FrameRanges;
|
||||
}
|
||||
|
||||
table BoneDefaults {
|
||||
Unknown:uint;
|
||||
Transform:[SRT];
|
||||
}
|
||||
|
||||
table Material {
|
||||
Name:string;
|
||||
Switches:[MatSwitch];
|
||||
Values:[MatValue];
|
||||
Vectors:[MatVector];
|
||||
}
|
||||
|
||||
table MatSwitch {
|
||||
Name:string;
|
||||
Value:BooleanTrack;
|
||||
frameRanges:FrameRanges;
|
||||
}
|
||||
|
||||
table MatValue {
|
||||
Name:string;
|
||||
Value:ValueTrack;
|
||||
frameRanges:FrameRanges;
|
||||
}
|
||||
|
||||
table MatVector {
|
||||
Name:string;
|
||||
Value:VectorTrack;
|
||||
frameRanges:FrameRanges;
|
||||
}
|
||||
|
||||
table Group {
|
||||
Name:string;
|
||||
Value:BooleanTrack;
|
||||
}
|
||||
|
||||
table Config {
|
||||
Unknown:uint;
|
||||
KeyFrames:uint;
|
||||
FramesPerSecond:uint;
|
||||
}
|
||||
|
||||
table FixedVectorTrack {
|
||||
Value:Vector3;
|
||||
}
|
||||
table DynamicVectorTrack {
|
||||
Values:[Vector3];
|
||||
}
|
||||
table FramedVectorTrack {
|
||||
Frames:[ushort];
|
||||
Values:[Vector3];
|
||||
}
|
||||
|
||||
|
||||
table FixedRotationTrack {
|
||||
Value:Rotation;
|
||||
}
|
||||
table DynamicRotationTrack {
|
||||
Values:[Rotation];
|
||||
}
|
||||
table FramedRotationTrack {
|
||||
Frames:[ushort];
|
||||
Values:[Rotation];
|
||||
}
|
||||
|
||||
table FixedBooleanTrack {
|
||||
Value:byte;
|
||||
}
|
||||
table DynamicBooleanTrack {
|
||||
Values:[ushort];
|
||||
}
|
||||
table FramedBooleanTrack {
|
||||
Frames:[ushort];
|
||||
Values:[ushort];
|
||||
}
|
||||
|
||||
|
||||
table FixedValueTrack {
|
||||
Value:float;
|
||||
}
|
||||
table DynamicValueTrack {
|
||||
Values:[float];
|
||||
}
|
||||
table FramedValueTrack {
|
||||
Frames:[ushort];
|
||||
Values:[float];
|
||||
}
|
||||
|
||||
|
||||
table FrameRanges {
|
||||
StartFrames:[ushort];
|
||||
EndFrames:[ushort];
|
||||
}
|
||||
|
||||
|
||||
struct Vector3 {
|
||||
X:float;
|
||||
Y:float;
|
||||
Z:float;
|
||||
}
|
||||
|
||||
struct Vector4 {
|
||||
X:float;
|
||||
Y:float;
|
||||
Z:float;
|
||||
W:float;
|
||||
}
|
||||
|
||||
struct Rotation {
|
||||
X:ushort;
|
||||
Y:ushort;
|
||||
Z:ushort;
|
||||
}
|
||||
|
||||
struct SRT {
|
||||
ScaleX:float;
|
||||
ScaleY:float;
|
||||
ScaleZ:float;
|
||||
RotateX:float;
|
||||
RotateY:float;
|
||||
RotateZ:float;
|
||||
RotateW:float;
|
||||
TranslateX:float;
|
||||
TranslateY:float;
|
||||
TranslateZ:float;
|
||||
}
|
||||
|
||||
root_type Animation;
|
196
Switch_Toolbox_Library/Resources/FlatBuffers/gfbmdl.fbs
Normal file
196
Switch_Toolbox_Library/Resources/FlatBuffers/gfbmdl.fbs
Normal file
|
@ -0,0 +1,196 @@
|
|||
namespace Gfbmdl;
|
||||
|
||||
enum BoneType : uint {
|
||||
NoSkinning = 0,
|
||||
HasSkinning = 1,
|
||||
}
|
||||
|
||||
enum VertexType : uint {
|
||||
Position = 0,
|
||||
Normal = 1,
|
||||
Binormal = 2,
|
||||
UV1 = 3,
|
||||
UV2 = 4,
|
||||
UV3 = 5,
|
||||
UV4 = 6,
|
||||
Color1 = 7,
|
||||
Color2 = 8,
|
||||
Color3 = 9,
|
||||
Color4 = 10,
|
||||
BoneID = 11,
|
||||
BoneWeight = 12,
|
||||
}
|
||||
|
||||
enum BufferFormat : uint {
|
||||
Float = 0,
|
||||
HalfFloat = 1,
|
||||
Byte = 3,
|
||||
Short = 5,
|
||||
BytesAsFloat = 8,
|
||||
}
|
||||
|
||||
table Model {
|
||||
Version:uint;
|
||||
Bounding:BoundingBox;
|
||||
TextureNames:[string];
|
||||
ShaderNames:[string];
|
||||
Unknown:[UnknownEmpty];
|
||||
MaterialNames:[string];
|
||||
Materials:[Material];
|
||||
Groups:[Group];
|
||||
Meshes:[Mesh];
|
||||
Bones:[Bone];
|
||||
CollisionGroups:[CollisionGroup];
|
||||
}
|
||||
|
||||
table UnknownEmpty {
|
||||
unk:uint;
|
||||
}
|
||||
|
||||
table Material {
|
||||
Name:string;
|
||||
ShaderGroup:string;
|
||||
RenderLayer:int;
|
||||
Unknown1:ubyte;
|
||||
Unknown2:ubyte;
|
||||
Parameter1:int;
|
||||
Parameter2:int;
|
||||
Parameter3:int;
|
||||
Parameter4:int;
|
||||
Parameter5:int;
|
||||
Parameter6:int;
|
||||
TextureMaps:[TextureMap];
|
||||
Switches:[MatSwitch];
|
||||
Values:[MatFloat];
|
||||
Colors:[MatColor];
|
||||
Unknown3:ubyte;
|
||||
Unknown4:ubyte;
|
||||
Unknown5:ubyte;
|
||||
Unknown6:ubyte;
|
||||
Unknown7:ubyte;
|
||||
Common:MaterialCommon;
|
||||
}
|
||||
|
||||
table MaterialCommon {
|
||||
Switches:[MatSwitch];
|
||||
Values:[MatInt];
|
||||
Colors:[MatColor];
|
||||
}
|
||||
|
||||
table MatSwitch {
|
||||
Name:string;
|
||||
Value:bool;
|
||||
}
|
||||
|
||||
table MatColor {
|
||||
Name:string;
|
||||
Color:ColorRGB32;
|
||||
}
|
||||
|
||||
table MatInt {
|
||||
Name:string;
|
||||
Value:int;
|
||||
}
|
||||
|
||||
table MatFloat {
|
||||
Name:string;
|
||||
Value:float;
|
||||
}
|
||||
|
||||
table TextureMap {
|
||||
Sampler:string;
|
||||
Index:int;
|
||||
Params:TextureMapping;
|
||||
}
|
||||
|
||||
table TextureMapping {
|
||||
Unknown1:uint;
|
||||
Unknown2:uint;
|
||||
Unknown3:uint;
|
||||
Unknown4:uint;
|
||||
Unknown5:uint;
|
||||
Unknown6:uint;
|
||||
Unknown7:uint;
|
||||
Unknown8:uint;
|
||||
lodBias:float;
|
||||
}
|
||||
|
||||
table Group {
|
||||
BoneIndex:uint;
|
||||
MeshIndex:uint;
|
||||
Bounding:BoundingBox;
|
||||
Layer:uint;
|
||||
}
|
||||
|
||||
table Mesh {
|
||||
Polygons:[MeshPolygon];
|
||||
Attributes:[MeshAttribute];
|
||||
Data:[ubyte];
|
||||
}
|
||||
|
||||
table MeshPolygon {
|
||||
MaterialIndex:uint;
|
||||
Faces:[ushort];
|
||||
}
|
||||
|
||||
table MeshAttribute {
|
||||
VertexType:uint;
|
||||
BufferFormat:uint;
|
||||
ElementCount:uint;
|
||||
}
|
||||
|
||||
table Bone {
|
||||
Name:string;
|
||||
BoneType:uint;
|
||||
Parent:int;
|
||||
Zero:uint = 0;
|
||||
Visible:bool;
|
||||
Scale:Vector3;
|
||||
Rotation:Vector3;
|
||||
Translation:Vector3;
|
||||
RadiusStart:Vector3;
|
||||
RadiusEnd:Vector3;
|
||||
RigidCheck:BoneRigidData;
|
||||
}
|
||||
|
||||
struct BoneRigidData {
|
||||
Unknown1:byte;
|
||||
}
|
||||
|
||||
table CollisionGroup {
|
||||
BoneIndex:uint;
|
||||
Unknown1:uint;
|
||||
BoneChildren:[uint];
|
||||
Bounding:BoundingBox;
|
||||
}
|
||||
|
||||
|
||||
struct BoundingBox {
|
||||
MinX:float;
|
||||
MinY:float;
|
||||
MinZ:float;
|
||||
MaxX:float;
|
||||
MaxY:float;
|
||||
MaxZ:float;
|
||||
}
|
||||
|
||||
struct Vector3 {
|
||||
X:float;
|
||||
Y:float;
|
||||
Z:float;
|
||||
}
|
||||
|
||||
struct ColorRGB32 {
|
||||
R:float;
|
||||
G:float;
|
||||
B:float;
|
||||
}
|
||||
|
||||
struct Vector4 {
|
||||
X:float;
|
||||
Y:float;
|
||||
Z:float;
|
||||
W:float;
|
||||
}
|
||||
|
||||
root_type Model;
|
BIN
Switch_Toolbox_Library/Resources/flatc.exe
Normal file
BIN
Switch_Toolbox_Library/Resources/flatc.exe
Normal file
Binary file not shown.
|
@ -20,7 +20,7 @@ namespace Toolbox.Library
|
|||
|
||||
public static bool EnableDragDrop = true;
|
||||
|
||||
public static bool UseSingleInstance = true;
|
||||
public static bool UseSingleInstance = false;
|
||||
public static bool UseDirectXTexDecoder = true;
|
||||
public static bool DEVELOPER_DEBUG_MODE = false;
|
||||
public static bool AlwaysCompressOnSave = false;
|
||||
|
@ -38,6 +38,11 @@ namespace Toolbox.Library
|
|||
public static string TpGamePath = "";
|
||||
public static string BotwGamePath = "";
|
||||
|
||||
public class UVEditor
|
||||
{
|
||||
public static Color UVColor = Color.FromArgb(255, 128, 0);
|
||||
}
|
||||
|
||||
public class SwitchKeys
|
||||
{
|
||||
public static string SwitchFolder = System.IO.Path.Combine(Environment.GetFolderPath(
|
||||
|
|
|
@ -99,6 +99,10 @@
|
|||
<Private>False</Private>
|
||||
</Reference>
|
||||
<Reference Include="netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51" />
|
||||
<Reference Include="Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\Toolbox\Lib\Newtonsoft.Json.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="ObjectListView">
|
||||
<HintPath>..\Toolbox\Lib\ObjectListView.dll</HintPath>
|
||||
<Private>False</Private>
|
||||
|
@ -345,12 +349,7 @@
|
|||
<DependentUpon>GenericTextureImporterList.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Forms\Editors\TextureImport\GenericTextureImporterSettings.cs" />
|
||||
<Compile Include="Forms\Editors\UV\UVEditorAdvanced.cs">
|
||||
<SubType>UserControl</SubType>
|
||||
</Compile>
|
||||
<Compile Include="Forms\Editors\UV\UVEditorAdvanced.Designer.cs">
|
||||
<DependentUpon>UVEditorAdvanced.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Forms\Editors\UV\PickableUVMap.cs" />
|
||||
<Compile Include="Forms\Editors\UV\UVEditorForm.cs">
|
||||
<SubType>Form</SubType>
|
||||
</Compile>
|
||||
|
@ -403,6 +402,7 @@
|
|||
<Compile Include="IO\Extensions\StreamExport.cs" />
|
||||
<Compile Include="IO\Extensions\UintExtension.cs" />
|
||||
<Compile Include="IO\FileStreamStorage.cs" />
|
||||
<Compile Include="IO\FlatBuffer\FlatBufferConverter.cs" />
|
||||
<Compile Include="IO\FlatBuffer\FlatBufferParse.cs" />
|
||||
<Compile Include="IO\HSVPixel.cs" />
|
||||
<Compile Include="IO\IOComoon.cs" />
|
||||
|
@ -684,12 +684,6 @@
|
|||
<Compile Include="Forms\Animation\TimeLine.Designer.cs">
|
||||
<DependentUpon>TimeLine.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Forms\Editors\UV\UVEditor2.cs">
|
||||
<SubType>UserControl</SubType>
|
||||
</Compile>
|
||||
<Compile Include="Forms\Editors\UV\UVEditor2.Designer.cs">
|
||||
<DependentUpon>UVEditor2.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Forms\Extensions\MDICustom.cs" />
|
||||
<Compile Include="Forms\Editors\Object Editor\ObjectEditor.cs">
|
||||
<SubType>Form</SubType>
|
||||
|
@ -1137,15 +1131,12 @@
|
|||
<EmbeddedResource Include="Forms\Editors\UV\UVEditor.resx">
|
||||
<DependentUpon>UVEditor.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="Forms\Editors\UV\UVEditor2.resx">
|
||||
<DependentUpon>UVEditor2.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="Forms\Editors\UV\UVEditorAdvanced.resx">
|
||||
<DependentUpon>UVEditorAdvanced.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="Forms\Editors\UV\UVEditorForm.resx">
|
||||
<DependentUpon>UVEditorForm.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="Forms\Editors\UV\UVViewport.resx">
|
||||
<DependentUpon>UVViewport.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="Forms\SizeTables\FileTableViewTPHD.resx">
|
||||
<DependentUpon>FileTableViewTPHD.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
|
@ -1216,6 +1207,8 @@
|
|||
<None Include="Resources\FileBank.png" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="Resources\FlatBuffers\gfbanm.fbs" />
|
||||
<None Include="Resources\FlatBuffers\gfbmdl.fbs" />
|
||||
<None Include="Resources\Folder.png" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
|
@ -1519,6 +1512,9 @@
|
|||
<ItemGroup>
|
||||
<None Include="Resources\MissingTexture.png" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="Resources\flatc.exe" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
|
||||
<PropertyGroup>
|
||||
|
|
BIN
Toolbox/Lib/yaz0.dll
Normal file
BIN
Toolbox/Lib/yaz0.dll
Normal file
Binary file not shown.
|
@ -18,7 +18,6 @@ uniform mat4 mtxCam;
|
|||
uniform mat4 mtxMdl;
|
||||
|
||||
uniform vec3 specLightDirection;
|
||||
uniform vec3 difLightDirection;
|
||||
uniform mat4 projMatrix;
|
||||
uniform mat4 normalMatrix;
|
||||
uniform mat4 modelViewMatrix;
|
||||
|
|
|
@ -124,6 +124,7 @@ void main()
|
|||
f_texcoord1 = vUV1;
|
||||
f_texcoord2 = vUV2;
|
||||
tangent = vTangent;
|
||||
binormal = vBinormal;
|
||||
|
||||
gl_Position = position;
|
||||
|
||||
|
|
|
@ -115,22 +115,21 @@ void main()
|
|||
|
||||
vec4 objPos = vec4(vPosition.xyz, 1.0);
|
||||
if (vBone.x != -1.0)
|
||||
objPos = skin(vPosition, index);
|
||||
objPos = skin(objPos.xyz, index);
|
||||
if(vBone.x != -1.0)
|
||||
normal = normalize((skinNRM(vNormal.xyz, index)).xyz);
|
||||
|
||||
vec4 position = mtxCam * mtxMdl * vec4(objPos.xyz, 1.0);
|
||||
objPos = mtxMdl * vec4(objPos.xyz, 1.0);
|
||||
|
||||
vec4 position = mtxCam * objPos;
|
||||
|
||||
normal = vNormal;
|
||||
vertexColor = vColor;
|
||||
position = objPos;
|
||||
f_texcoord0 = vUV0;
|
||||
f_texcoord1 = vUV1;
|
||||
f_texcoord2 = vUV2;
|
||||
tangent = vTangent;
|
||||
|
||||
position = mtxCam * mtxMdl * vec4(vPosition.xyz, 1.0);
|
||||
|
||||
f_texcoord0.x *= ColorUVScaleU + ColorUVTranslateU;
|
||||
f_texcoord0.y *= ColorUVScaleV + ColorUVTranslateV;
|
||||
|
||||
|
|
|
@ -539,6 +539,9 @@
|
|||
<Content Include="Lib\WeifenLuo.WinFormsUI.Docking.ThemeVS2015.dll">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</Content>
|
||||
<Content Include="Lib\Yaz0.dll">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</Content>
|
||||
<Content Include="LZ4.dll">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</Content>
|
||||
|
|
Loading…
Reference in a new issue