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
@ -816,18 +816,6 @@ namespace Bfres.Structs
|
|||||||
ImportedMaterials = seModel.materials;
|
ImportedMaterials = seModel.materials;
|
||||||
ImportedSkeleton = seModel.skeleton;
|
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
|
else
|
||||||
{
|
{
|
||||||
AssimpData assimp = new AssimpData();
|
AssimpData assimp = new AssimpData();
|
||||||
|
@ -738,6 +738,8 @@ namespace Bfres.Structs
|
|||||||
public float MaxLod;
|
public float MaxLod;
|
||||||
public float BiasLod;
|
public float BiasLod;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public override STGenericTexture GetTexture()
|
public override STGenericTexture GetTexture()
|
||||||
{
|
{
|
||||||
foreach (var bntx in PluginRuntime.bntxContainers)
|
foreach (var bntx in PluginRuntime.bntxContainers)
|
||||||
|
@ -695,10 +695,21 @@ namespace FirstPlugin
|
|||||||
int VertexCount = (int)Slice.Size / StrideSize;
|
int VertexCount = (int)Slice.Size / StrideSize;
|
||||||
|
|
||||||
VertexAttribute.VertexData = new Syroot.Maths.Vector4F[VertexCount];
|
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)
|
private static Syroot.Maths.Vector4F ReadVertexBufferData(FileReader reader, SepdVertexAttribute VertexAttribute, int elementCount)
|
||||||
|
@ -821,6 +821,11 @@ namespace LayoutBXLYT
|
|||||||
return (int[])data;
|
return (int[])data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public byte[] GetBytes()
|
||||||
|
{
|
||||||
|
return (byte[])data;
|
||||||
|
}
|
||||||
|
|
||||||
public void SetValue(string value)
|
public void SetValue(string value)
|
||||||
{
|
{
|
||||||
data = value;
|
data = value;
|
||||||
@ -839,14 +844,123 @@ namespace LayoutBXLYT
|
|||||||
Type = UserDataType.Int;
|
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;
|
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
|
public enum UserDataType : byte
|
||||||
{
|
{
|
||||||
String,
|
String,
|
||||||
Int,
|
Int,
|
||||||
Float,
|
Float,
|
||||||
|
StructData,
|
||||||
}
|
}
|
||||||
|
|
||||||
public enum AnimationTarget : byte
|
public enum AnimationTarget : byte
|
||||||
@ -1379,6 +1493,53 @@ namespace LayoutBXLYT
|
|||||||
public BxlanPAT1 AnimationTag;
|
public BxlanPAT1 AnimationTag;
|
||||||
public BxlanPAI1 AnimationInfo;
|
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)
|
public BxlanPaiEntry TryGetTag(string name)
|
||||||
{
|
{
|
||||||
for (int i = 0; i < AnimationInfo.Entries?.Count; i++)
|
for (int i = 0; i < AnimationInfo.Entries?.Count; i++)
|
||||||
@ -1389,6 +1550,15 @@ namespace LayoutBXLYT
|
|||||||
return null;
|
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)
|
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.IO.FlatBuffer;
|
||||||
using Toolbox.Library.Animations;
|
using Toolbox.Library.Animations;
|
||||||
using FirstPlugin.Forms;
|
using FirstPlugin.Forms;
|
||||||
|
using Toolbox.Library.Forms;
|
||||||
|
|
||||||
namespace FirstPlugin
|
namespace FirstPlugin
|
||||||
{
|
{
|
||||||
public class GFBANM : TreeNodeFile, IFileFormat, IAnimationContainer
|
public class GFBANM : TreeNodeFile, IFileFormat, IAnimationContainer, IConvertableTextFormat
|
||||||
{
|
{
|
||||||
public STAnimation AnimationController => AnimationData;
|
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
|
public Type[] Types
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
@ -90,8 +115,31 @@ namespace FirstPlugin
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class MeshAnimationController
|
||||||
|
{
|
||||||
|
public bool IsVisible = true;
|
||||||
|
}
|
||||||
|
|
||||||
public class Animation : STSkeletonAnimation
|
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()
|
public override void NextFrame()
|
||||||
{
|
{
|
||||||
if (Frame > FrameCount) return;
|
if (Frame > FrameCount) return;
|
||||||
@ -105,6 +153,26 @@ namespace FirstPlugin
|
|||||||
bool Updated = false; // no need to update skeleton of animations that didn't change
|
bool Updated = false; // no need to update skeleton of animations that didn't change
|
||||||
foreach (var animGroup in AnimGroups)
|
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)
|
if (animGroup is BoneGroup)
|
||||||
{
|
{
|
||||||
var node = animGroup as BoneGroup;
|
var node = animGroup as BoneGroup;
|
||||||
@ -134,17 +202,22 @@ namespace FirstPlugin
|
|||||||
|
|
||||||
if (node.RotationX.HasKeys || node.RotationY.HasKeys || node.RotationZ.HasKeys)
|
if (node.RotationX.HasKeys || node.RotationY.HasKeys || node.RotationZ.HasKeys)
|
||||||
{
|
{
|
||||||
float x = node.RotationX.HasKeys ? node.RotationX.GetFrameValue(Frame) : b.rotation[0];
|
ushort value1 = (ushort)node.RotationX.GetFrameValue(Frame);
|
||||||
float y = node.RotationY.HasKeys ? node.RotationY.GetFrameValue(Frame) : b.rotation[1];
|
ushort value2 = (ushort)node.RotationY.GetFrameValue(Frame);
|
||||||
float z = node.RotationZ.HasKeys ? node.RotationZ.GetFrameValue(Frame) : b.rotation[2];
|
ushort value3 = (ushort)node.RotationZ.GetFrameValue(Frame);
|
||||||
|
|
||||||
var Rotation = new Vector3(x / 0xffff, y/ 0xffff, z / 0xffff).Normalized();
|
int x = value1 >> 5;
|
||||||
b.rot = EulerToQuat(Rotation.Z, Rotation.Y, Rotation.X);
|
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);
|
// b.rot = EulerToQuat(Rotation.Z, Rotation.Y, Rotation.X);
|
||||||
|
|
||||||
float Angle = Rotation.Length;
|
float Angle = Rotation.Length;
|
||||||
Console.WriteLine($"{node.Name} Angle {Angle}");
|
|
||||||
|
|
||||||
// b.rot = Angle > 0
|
// b.rot = Angle > 0
|
||||||
// ? Quaternion.FromAxisAngle(Vector3.Normalize(Rotation), Angle)
|
// ? Quaternion.FromAxisAngle(Vector3.Normalize(Rotation), Angle)
|
||||||
@ -168,7 +241,7 @@ namespace FirstPlugin
|
|||||||
Quaternion xRotation = Quaternion.FromAxisAngle(Vector3.UnitX, x);
|
Quaternion xRotation = Quaternion.FromAxisAngle(Vector3.UnitX, x);
|
||||||
Quaternion yRotation = Quaternion.FromAxisAngle(Vector3.UnitY, y);
|
Quaternion yRotation = Quaternion.FromAxisAngle(Vector3.UnitY, y);
|
||||||
Quaternion zRotation = Quaternion.FromAxisAngle(Vector3.UnitZ, z);
|
Quaternion zRotation = Quaternion.FromAxisAngle(Vector3.UnitZ, z);
|
||||||
return (zRotation * yRotation * xRotation);
|
return (zRotation * yRotation * xRotation);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void LoadBoneGroup(Gfbanim.Bone boneAnim)
|
public void LoadBoneGroup(Gfbanim.Bone boneAnim)
|
||||||
@ -193,7 +266,7 @@ namespace FirstPlugin
|
|||||||
var rotate = boneAnim.Rotate<Gfbanim.DynamicQuatTrack>();
|
var rotate = boneAnim.Rotate<Gfbanim.DynamicQuatTrack>();
|
||||||
if (rotate.HasValue)
|
if (rotate.HasValue)
|
||||||
{
|
{
|
||||||
var values = LoadRotationTrack(rotate.Value);
|
var values = GfbanimKeyFrameLoader.LoadRotationTrack(rotate.Value);
|
||||||
groupAnim.RotationX = values[0];
|
groupAnim.RotationX = values[0];
|
||||||
groupAnim.RotationY = values[1];
|
groupAnim.RotationY = values[1];
|
||||||
groupAnim.RotationZ = values[2];
|
groupAnim.RotationZ = values[2];
|
||||||
@ -206,9 +279,9 @@ namespace FirstPlugin
|
|||||||
if (rotate.HasValue)
|
if (rotate.HasValue)
|
||||||
{
|
{
|
||||||
var vec = rotate.Value.Value.Value;
|
var vec = rotate.Value.Value.Value;
|
||||||
groupAnim.RotationX.KeyFrames.Add(new STKeyFrame(0, ConvertRotation(vec.X)));
|
groupAnim.RotationX.KeyFrames.Add(new STKeyFrame(0, GfbanimKeyFrameLoader.ConvertRotation(vec.X)));
|
||||||
groupAnim.RotationY.KeyFrames.Add(new STKeyFrame(0, ConvertRotation(vec.Y)));
|
groupAnim.RotationY.KeyFrames.Add(new STKeyFrame(0, GfbanimKeyFrameLoader.ConvertRotation(vec.Y)));
|
||||||
groupAnim.RotationZ.KeyFrames.Add(new STKeyFrame(0, ConvertRotation(vec.Z)));
|
groupAnim.RotationZ.KeyFrames.Add(new STKeyFrame(0, GfbanimKeyFrameLoader.ConvertRotation(vec.Z)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -217,7 +290,7 @@ namespace FirstPlugin
|
|||||||
var rotate = boneAnim.Rotate<Gfbanim.FramedQuatTrack>();
|
var rotate = boneAnim.Rotate<Gfbanim.FramedQuatTrack>();
|
||||||
if (rotate.HasValue)
|
if (rotate.HasValue)
|
||||||
{
|
{
|
||||||
var values = LoadRotationTrack(rotate.Value);
|
var values = GfbanimKeyFrameLoader.LoadRotationTrack(rotate.Value);
|
||||||
groupAnim.RotationX = values[0];
|
groupAnim.RotationX = values[0];
|
||||||
groupAnim.RotationY = values[1];
|
groupAnim.RotationY = values[1];
|
||||||
groupAnim.RotationZ = values[2];
|
groupAnim.RotationZ = values[2];
|
||||||
@ -247,7 +320,7 @@ namespace FirstPlugin
|
|||||||
var scale = boneAnim.Scale<Gfbanim.DynamicVectorTrack>();
|
var scale = boneAnim.Scale<Gfbanim.DynamicVectorTrack>();
|
||||||
if (scale.HasValue)
|
if (scale.HasValue)
|
||||||
{
|
{
|
||||||
var values = LoadVectorTrack(scale.Value);
|
var values = GfbanimKeyFrameLoader.LoadVectorTrack(scale.Value);
|
||||||
groupAnim.ScaleX = values[0];
|
groupAnim.ScaleX = values[0];
|
||||||
groupAnim.ScaleY = values[1];
|
groupAnim.ScaleY = values[1];
|
||||||
groupAnim.ScaleZ = values[2];
|
groupAnim.ScaleZ = values[2];
|
||||||
@ -259,7 +332,7 @@ namespace FirstPlugin
|
|||||||
var scale = boneAnim.Scale<Gfbanim.FramedVectorTrack>();
|
var scale = boneAnim.Scale<Gfbanim.FramedVectorTrack>();
|
||||||
if (scale.HasValue)
|
if (scale.HasValue)
|
||||||
{
|
{
|
||||||
var values = LoadVectorTrack(scale.Value);
|
var values = GfbanimKeyFrameLoader.LoadVectorTrack(scale.Value);
|
||||||
groupAnim.ScaleX = values[0];
|
groupAnim.ScaleX = values[0];
|
||||||
groupAnim.ScaleY = values[1];
|
groupAnim.ScaleY = values[1];
|
||||||
groupAnim.ScaleZ = values[2];
|
groupAnim.ScaleZ = values[2];
|
||||||
@ -286,7 +359,7 @@ namespace FirstPlugin
|
|||||||
var trans = boneAnim.Translate<Gfbanim.DynamicVectorTrack>();
|
var trans = boneAnim.Translate<Gfbanim.DynamicVectorTrack>();
|
||||||
if (trans.HasValue)
|
if (trans.HasValue)
|
||||||
{
|
{
|
||||||
var values = LoadVectorTrack(trans.Value);
|
var values = GfbanimKeyFrameLoader.LoadVectorTrack(trans.Value);
|
||||||
groupAnim.TranslateX = values[0];
|
groupAnim.TranslateX = values[0];
|
||||||
groupAnim.TranslateY = values[1];
|
groupAnim.TranslateY = values[1];
|
||||||
groupAnim.TranslateZ = values[2];
|
groupAnim.TranslateZ = values[2];
|
||||||
@ -298,7 +371,7 @@ namespace FirstPlugin
|
|||||||
var trans = boneAnim.Translate<Gfbanim.FramedVectorTrack>();
|
var trans = boneAnim.Translate<Gfbanim.FramedVectorTrack>();
|
||||||
if (trans.HasValue)
|
if (trans.HasValue)
|
||||||
{
|
{
|
||||||
var values = LoadVectorTrack(trans.Value);
|
var values = GfbanimKeyFrameLoader.LoadVectorTrack(trans.Value);
|
||||||
groupAnim.TranslateX = values[0];
|
groupAnim.TranslateX = values[0];
|
||||||
groupAnim.TranslateY = values[1];
|
groupAnim.TranslateY = values[1];
|
||||||
groupAnim.TranslateZ = values[2];
|
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)
|
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)
|
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)
|
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
|
namespace FlatBuffers.Gfbmdl
|
||||||
{
|
{
|
||||||
|
|
||||||
using global::System;
|
using global::System;
|
||||||
using global::FlatBuffers;
|
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 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 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 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 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 RenderDataLength { get { int o = __p.__offset(24); return o != 0 ? __p.__vector_len(o) : 0; } }
|
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 StartModel(FlatBufferBuilder builder) { builder.StartObject(11); }
|
||||||
public static void AddVersion(FlatBufferBuilder builder, uint Version) { builder.AddUint(0, Version, 0); }
|
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 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 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 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 void AddCollisionGroups(FlatBufferBuilder builder, VectorOffset CollisionGroupsOffset) { builder.AddOffset(10, CollisionGroupsOffset.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 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 CreateRenderDataVectorBlock(FlatBufferBuilder builder, Offset<RenderInfo>[] data) { builder.StartVector(4, data.Length, 4); builder.Add(data); 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 StartRenderDataVector(FlatBufferBuilder builder, int numElems) { builder.StartVector(4, numElems, 4); }
|
public static void StartCollisionGroupsVector(FlatBufferBuilder builder, int numElems) { builder.StartVector(4, numElems, 4); }
|
||||||
public static Offset<Model> EndModel(FlatBufferBuilder builder)
|
public static Offset<Model> EndModel(FlatBufferBuilder builder)
|
||||||
{
|
{
|
||||||
int o = builder.EndObject();
|
int o = builder.EndObject();
|
||||||
@ -169,50 +170,50 @@ namespace FlatBuffers.Gfbmdl
|
|||||||
#endif
|
#endif
|
||||||
public byte[] GetShaderGroupArray() { return __p.__vector_as_array<byte>(6); }
|
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 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 byte Unknown1 { get { int o = __p.__offset(10); return o != 0 ? __p.bb.Get(o + __p.bb_pos) : (byte)0; } }
|
||||||
public sbyte Unknown2 { get { int o = __p.__offset(12); return o != 0 ? __p.bb.GetSbyte(o + __p.bb_pos) : (sbyte)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 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 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 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 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 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 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 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 TexturesLength { get { int o = __p.__offset(26); return o != 0 ? __p.__vector_len(o) : 0; } }
|
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 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 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 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 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 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 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 byte Unknown3 { get { int o = __p.__offset(34); return o != 0 ? __p.bb.Get(o + __p.bb_pos) : (byte)0; } }
|
||||||
public sbyte Unknown4 { get { int o = __p.__offset(36); return o != 0 ? __p.bb.GetSbyte(o + __p.bb_pos) : (sbyte)0; } }
|
public byte Unknown4 { get { int o = __p.__offset(36); return o != 0 ? __p.bb.Get(o + __p.bb_pos) : (byte)0; } }
|
||||||
public sbyte Unknown5 { get { int o = __p.__offset(38); return o != 0 ? __p.bb.GetSbyte(o + __p.bb_pos) : (sbyte)0; } }
|
public byte Unknown5 { get { int o = __p.__offset(38); return o != 0 ? __p.bb.Get(o + __p.bb_pos) : (byte)0; } }
|
||||||
public sbyte Unknown6 { get { int o = __p.__offset(40); return o != 0 ? __p.bb.GetSbyte(o + __p.bb_pos) : (sbyte)0; } }
|
public byte Unknown6 { get { int o = __p.__offset(40); return o != 0 ? __p.bb.Get(o + __p.bb_pos) : (byte)0; } }
|
||||||
public sbyte Unknown7 { get { int o = __p.__offset(42); return o != 0 ? __p.bb.GetSbyte(o + __p.bb_pos) : (sbyte)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 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,
|
public static Offset<Material> CreateMaterial(FlatBufferBuilder builder,
|
||||||
StringOffset NameOffset = default(StringOffset),
|
StringOffset NameOffset = default(StringOffset),
|
||||||
StringOffset ShaderGroupOffset = default(StringOffset),
|
StringOffset ShaderGroupOffset = default(StringOffset),
|
||||||
int RenderLayer = 0,
|
int RenderLayer = 0,
|
||||||
sbyte Unknown1 = 0,
|
byte Unknown1 = 0,
|
||||||
sbyte Unknown2 = 0,
|
byte Unknown2 = 0,
|
||||||
int Parameter1 = 0,
|
int Parameter1 = 0,
|
||||||
int Parameter2 = 0,
|
int Parameter2 = 0,
|
||||||
int Parameter3 = 0,
|
int Parameter3 = 0,
|
||||||
int Parameter4 = 0,
|
int Parameter4 = 0,
|
||||||
int Parameter5 = 0,
|
int Parameter5 = 0,
|
||||||
int Parameter6 = 0,
|
int Parameter6 = 0,
|
||||||
VectorOffset TexturesOffset = default(VectorOffset),
|
VectorOffset TextureMapsOffset = default(VectorOffset),
|
||||||
VectorOffset SwitchesOffset = default(VectorOffset),
|
VectorOffset SwitchesOffset = default(VectorOffset),
|
||||||
VectorOffset ValuesOffset = default(VectorOffset),
|
VectorOffset ValuesOffset = default(VectorOffset),
|
||||||
VectorOffset ColorsOffset = default(VectorOffset),
|
VectorOffset ColorsOffset = default(VectorOffset),
|
||||||
sbyte Unknown3 = 0,
|
byte Unknown3 = 0,
|
||||||
sbyte Unknown4 = 0,
|
byte Unknown4 = 0,
|
||||||
sbyte Unknown5 = 0,
|
byte Unknown5 = 0,
|
||||||
sbyte Unknown6 = 0,
|
byte Unknown6 = 0,
|
||||||
sbyte Unknown7 = 0,
|
byte Unknown7 = 0,
|
||||||
Offset<MaterialCommon> CommonOffset = default(Offset<MaterialCommon>))
|
Offset<MaterialCommon> CommonOffset = default(Offset<MaterialCommon>))
|
||||||
{
|
{
|
||||||
builder.StartObject(21);
|
builder.StartObject(21);
|
||||||
@ -220,7 +221,7 @@ namespace FlatBuffers.Gfbmdl
|
|||||||
Material.AddColors(builder, ColorsOffset);
|
Material.AddColors(builder, ColorsOffset);
|
||||||
Material.AddValues(builder, ValuesOffset);
|
Material.AddValues(builder, ValuesOffset);
|
||||||
Material.AddSwitches(builder, SwitchesOffset);
|
Material.AddSwitches(builder, SwitchesOffset);
|
||||||
Material.AddTextures(builder, TexturesOffset);
|
Material.AddTextureMaps(builder, TextureMapsOffset);
|
||||||
Material.AddParameter6(builder, Parameter6);
|
Material.AddParameter6(builder, Parameter6);
|
||||||
Material.AddParameter5(builder, Parameter5);
|
Material.AddParameter5(builder, Parameter5);
|
||||||
Material.AddParameter4(builder, Parameter4);
|
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 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 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 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 AddUnknown1(FlatBufferBuilder builder, byte Unknown1) { builder.AddByte(3, Unknown1, 0); }
|
||||||
public static void AddUnknown2(FlatBufferBuilder builder, sbyte Unknown2) { builder.AddSbyte(4, Unknown2, 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 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 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 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 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 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 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 void AddTextureMaps(FlatBufferBuilder builder, VectorOffset TextureMapsOffset) { builder.AddOffset(11, TextureMapsOffset.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 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 CreateTexturesVectorBlock(FlatBufferBuilder builder, Offset<TextureMap>[] data) { builder.StartVector(4, data.Length, 4); builder.Add(data); 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 StartTexturesVector(FlatBufferBuilder builder, int numElems) { builder.StartVector(4, numElems, 4); }
|
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 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 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(); }
|
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 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 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 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 AddUnknown3(FlatBufferBuilder builder, byte Unknown3) { builder.AddByte(15, Unknown3, 0); }
|
||||||
public static void AddUnknown4(FlatBufferBuilder builder, sbyte Unknown4) { builder.AddSbyte(16, Unknown4, 0); }
|
public static void AddUnknown4(FlatBufferBuilder builder, byte Unknown4) { builder.AddByte(16, Unknown4, 0); }
|
||||||
public static void AddUnknown5(FlatBufferBuilder builder, sbyte Unknown5) { builder.AddSbyte(17, Unknown5, 0); }
|
public static void AddUnknown5(FlatBufferBuilder builder, byte Unknown5) { builder.AddByte(17, Unknown5, 0); }
|
||||||
public static void AddUnknown6(FlatBufferBuilder builder, sbyte Unknown6) { builder.AddSbyte(18, Unknown6, 0); }
|
public static void AddUnknown6(FlatBufferBuilder builder, byte Unknown6) { builder.AddByte(18, Unknown6, 0); }
|
||||||
public static void AddUnknown7(FlatBufferBuilder builder, sbyte Unknown7) { builder.AddSbyte(19, Unknown7, 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 void AddCommon(FlatBufferBuilder builder, Offset<MaterialCommon> CommonOffset) { builder.AddOffset(20, CommonOffset.Value, 0); }
|
||||||
public static Offset<Material> EndMaterial(FlatBufferBuilder builder)
|
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 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 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
|
#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
|
#else
|
||||||
public ArraySegment<byte>? GetNameBytes() { return __p.__vector_as_arraysegment(4); }
|
public ArraySegment<byte>? GetSamplerBytes() { return __p.__vector_as_arraysegment(4); }
|
||||||
#endif
|
#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 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,
|
public static Offset<TextureMap> CreateTextureMap(FlatBufferBuilder builder,
|
||||||
StringOffset NameOffset = default(StringOffset),
|
StringOffset SamplerOffset = default(StringOffset),
|
||||||
int Index = 0,
|
int Index = 0,
|
||||||
Offset<TextureMapping> MappingOffset = default(Offset<TextureMapping>))
|
Offset<TextureMapping> ParamsOffset = default(Offset<TextureMapping>))
|
||||||
{
|
{
|
||||||
builder.StartObject(3);
|
builder.StartObject(3);
|
||||||
TextureMap.AddMapping(builder, MappingOffset);
|
TextureMap.AddParams(builder, ParamsOffset);
|
||||||
TextureMap.AddIndex(builder, Index);
|
TextureMap.AddIndex(builder, Index);
|
||||||
TextureMap.AddName(builder, NameOffset);
|
TextureMap.AddSampler(builder, SamplerOffset);
|
||||||
return TextureMap.EndTextureMap(builder);
|
return TextureMap.EndTextureMap(builder);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void StartTextureMap(FlatBufferBuilder builder) { builder.StartObject(3); }
|
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 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)
|
public static Offset<TextureMap> EndTextureMap(FlatBufferBuilder builder)
|
||||||
{
|
{
|
||||||
int o = builder.EndObject();
|
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 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 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 Unknown1 { 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 Unknown2 { 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 Unknown3 { 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 Unknown4 { 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 Unknown5 { 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 Unknown6 { 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 Unknown7 { 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 uint Unknown8 { 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 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,
|
public static Offset<TextureMapping> CreateTextureMapping(FlatBufferBuilder builder,
|
||||||
uint Type = 0,
|
uint Unknown1 = 0,
|
||||||
uint Scale = 0,
|
uint Unknown2 = 0,
|
||||||
uint Translation = 0,
|
uint Unknown3 = 0,
|
||||||
uint Rotation = 0,
|
uint Unknown4 = 0,
|
||||||
uint WrapS = 0,
|
uint Unknown5 = 0,
|
||||||
uint WrapT = 0,
|
uint Unknown6 = 0,
|
||||||
uint magFilter = 0,
|
uint Unknown7 = 0,
|
||||||
uint minFilter = 0,
|
uint Unknown8 = 0,
|
||||||
float minLOD = 0.0f)
|
float lodBias = 0.0f)
|
||||||
{
|
{
|
||||||
builder.StartObject(9);
|
builder.StartObject(9);
|
||||||
TextureMapping.AddMinLOD(builder, minLOD);
|
TextureMapping.AddLodBias(builder, lodBias);
|
||||||
TextureMapping.AddMinFilter(builder, minFilter);
|
TextureMapping.AddUnknown8(builder, Unknown8);
|
||||||
TextureMapping.AddMagFilter(builder, magFilter);
|
TextureMapping.AddUnknown7(builder, Unknown7);
|
||||||
TextureMapping.AddWrapT(builder, WrapT);
|
TextureMapping.AddUnknown6(builder, Unknown6);
|
||||||
TextureMapping.AddWrapS(builder, WrapS);
|
TextureMapping.AddUnknown5(builder, Unknown5);
|
||||||
TextureMapping.AddRotation(builder, Rotation);
|
TextureMapping.AddUnknown4(builder, Unknown4);
|
||||||
TextureMapping.AddTranslation(builder, Translation);
|
TextureMapping.AddUnknown3(builder, Unknown3);
|
||||||
TextureMapping.AddScale(builder, Scale);
|
TextureMapping.AddUnknown2(builder, Unknown2);
|
||||||
TextureMapping.AddType(builder, Type);
|
TextureMapping.AddUnknown1(builder, Unknown1);
|
||||||
return TextureMapping.EndTextureMapping(builder);
|
return TextureMapping.EndTextureMapping(builder);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void StartTextureMapping(FlatBufferBuilder builder) { builder.StartObject(9); }
|
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 AddUnknown1(FlatBufferBuilder builder, uint Unknown1) { builder.AddUint(0, Unknown1, 0); }
|
||||||
public static void AddScale(FlatBufferBuilder builder, uint Scale) { builder.AddUint(1, Scale, 0); }
|
public static void AddUnknown2(FlatBufferBuilder builder, uint Unknown2) { builder.AddUint(1, Unknown2, 0); }
|
||||||
public static void AddTranslation(FlatBufferBuilder builder, uint Translation) { builder.AddUint(2, Translation, 0); }
|
public static void AddUnknown3(FlatBufferBuilder builder, uint Unknown3) { builder.AddUint(2, Unknown3, 0); }
|
||||||
public static void AddRotation(FlatBufferBuilder builder, uint Rotation) { builder.AddUint(3, Rotation, 0); }
|
public static void AddUnknown4(FlatBufferBuilder builder, uint Unknown4) { builder.AddUint(3, Unknown4, 0); }
|
||||||
public static void AddWrapS(FlatBufferBuilder builder, uint WrapS) { builder.AddUint(4, WrapS, 0); }
|
public static void AddUnknown5(FlatBufferBuilder builder, uint Unknown5) { builder.AddUint(4, Unknown5, 0); }
|
||||||
public static void AddWrapT(FlatBufferBuilder builder, uint WrapT) { builder.AddUint(5, WrapT, 0); }
|
public static void AddUnknown6(FlatBufferBuilder builder, uint Unknown6) { builder.AddUint(5, Unknown6, 0); }
|
||||||
public static void AddMagFilter(FlatBufferBuilder builder, uint magFilter) { builder.AddUint(6, magFilter, 0); }
|
public static void AddUnknown7(FlatBufferBuilder builder, uint Unknown7) { builder.AddUint(6, Unknown7, 0); }
|
||||||
public static void AddMinFilter(FlatBufferBuilder builder, uint minFilter) { builder.AddUint(7, minFilter, 0); }
|
public static void AddUnknown8(FlatBufferBuilder builder, uint Unknown8) { builder.AddUint(7, Unknown8, 0); }
|
||||||
public static void AddMinLOD(FlatBufferBuilder builder, float minLOD) { builder.AddFloat(8, minLOD, 0.0f); }
|
public static void AddLodBias(FlatBufferBuilder builder, float lodBias) { builder.AddFloat(8, lodBias, 0.0f); }
|
||||||
public static Offset<TextureMapping> EndTextureMapping(FlatBufferBuilder builder)
|
public static Offset<TextureMapping> EndTextureMapping(FlatBufferBuilder builder)
|
||||||
{
|
{
|
||||||
int o = builder.EndObject();
|
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 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 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 BoneIndex { 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 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 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 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 StartGroup(FlatBufferBuilder builder) { builder.StartObject(4); }
|
||||||
public static void AddBoneID(FlatBufferBuilder builder, uint boneID) { builder.AddUint(0, boneID, 0); }
|
public static void AddBoneIndex(FlatBufferBuilder builder, uint BoneIndex) { builder.AddUint(0, BoneIndex, 0); }
|
||||||
public static void AddMeshID(FlatBufferBuilder builder, uint meshID) { builder.AddUint(1, meshID, 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 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)
|
public static Offset<Group> EndGroup(FlatBufferBuilder builder)
|
||||||
{
|
{
|
||||||
int o = builder.EndObject();
|
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 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 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 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 AlignmentsLength { get { int o = __p.__offset(6); return o != 0 ? __p.__vector_len(o) : 0; } }
|
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 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; } }
|
public int DataLength { get { int o = __p.__offset(8); return o != 0 ? __p.__vector_len(o) : 0; } }
|
||||||
#if ENABLE_SPAN_T
|
#if ENABLE_SPAN_T
|
||||||
@ -623,12 +624,12 @@ namespace FlatBuffers.Gfbmdl
|
|||||||
|
|
||||||
public static Offset<Mesh> CreateMesh(FlatBufferBuilder builder,
|
public static Offset<Mesh> CreateMesh(FlatBufferBuilder builder,
|
||||||
VectorOffset PolygonsOffset = default(VectorOffset),
|
VectorOffset PolygonsOffset = default(VectorOffset),
|
||||||
VectorOffset AlignmentsOffset = default(VectorOffset),
|
VectorOffset AttributesOffset = default(VectorOffset),
|
||||||
VectorOffset DataOffset = default(VectorOffset))
|
VectorOffset DataOffset = default(VectorOffset))
|
||||||
{
|
{
|
||||||
builder.StartObject(3);
|
builder.StartObject(3);
|
||||||
Mesh.AddData(builder, DataOffset);
|
Mesh.AddData(builder, DataOffset);
|
||||||
Mesh.AddAlignments(builder, AlignmentsOffset);
|
Mesh.AddAttributes(builder, AttributesOffset);
|
||||||
Mesh.AddPolygons(builder, PolygonsOffset);
|
Mesh.AddPolygons(builder, PolygonsOffset);
|
||||||
return Mesh.EndMesh(builder);
|
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 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 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 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 void AddAttributes(FlatBufferBuilder builder, VectorOffset AttributesOffset) { builder.AddOffset(1, AttributesOffset.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 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 CreateAlignmentsVectorBlock(FlatBufferBuilder builder, Offset<MeshAlignment>[] data) { builder.StartVector(4, data.Length, 4); builder.Add(data); 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 StartAlignmentsVector(FlatBufferBuilder builder, int numElems) { builder.StartVector(4, numElems, 4); }
|
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 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 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(); }
|
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 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 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 uint MaterialIndex { 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 ushort Faces(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 int FacesLength { get { int o = __p.__offset(6); return o != 0 ? __p.__vector_len(o) : 0; } }
|
||||||
#if ENABLE_SPAN_T
|
#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
|
#else
|
||||||
public ArraySegment<byte>? GetDataBytes() { return __p.__vector_as_arraysegment(6); }
|
public ArraySegment<byte>? GetFacesBytes() { return __p.__vector_as_arraysegment(6); }
|
||||||
#endif
|
#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,
|
public static Offset<MeshPolygon> CreateMeshPolygon(FlatBufferBuilder builder,
|
||||||
uint materialID = 0,
|
uint MaterialIndex = 0,
|
||||||
VectorOffset dataOffset = default(VectorOffset))
|
VectorOffset FacesOffset = default(VectorOffset))
|
||||||
{
|
{
|
||||||
builder.StartObject(2);
|
builder.StartObject(2);
|
||||||
MeshPolygon.AddData(builder, dataOffset);
|
MeshPolygon.AddFaces(builder, FacesOffset);
|
||||||
MeshPolygon.AddMaterialID(builder, materialID);
|
MeshPolygon.AddMaterialIndex(builder, MaterialIndex);
|
||||||
return MeshPolygon.EndMeshPolygon(builder);
|
return MeshPolygon.EndMeshPolygon(builder);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void StartMeshPolygon(FlatBufferBuilder builder) { builder.StartObject(2); }
|
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 AddMaterialIndex(FlatBufferBuilder builder, uint MaterialIndex) { builder.AddUint(0, MaterialIndex, 0); }
|
||||||
public static void AddData(FlatBufferBuilder builder, VectorOffset dataOffset) { builder.AddOffset(1, dataOffset.Value, 0); }
|
public static void AddFaces(FlatBufferBuilder builder, VectorOffset FacesOffset) { builder.AddOffset(1, FacesOffset.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 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 CreateDataVectorBlock(FlatBufferBuilder builder, ushort[] data) { builder.StartVector(2, data.Length, 2); builder.Add(data); 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 StartDataVector(FlatBufferBuilder builder, int numElems) { builder.StartVector(2, numElems, 2); }
|
public static void StartFacesVector(FlatBufferBuilder builder, int numElems) { builder.StartVector(2, numElems, 2); }
|
||||||
public static Offset<MeshPolygon> EndMeshPolygon(FlatBufferBuilder builder)
|
public static Offset<MeshPolygon> EndMeshPolygon(FlatBufferBuilder builder)
|
||||||
{
|
{
|
||||||
int o = builder.EndObject();
|
int o = builder.EndObject();
|
||||||
@ -695,39 +696,39 @@ namespace FlatBuffers.Gfbmdl
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
public struct MeshAlignment : IFlatbufferObject
|
public struct MeshAttribute : IFlatbufferObject
|
||||||
{
|
{
|
||||||
private Table __p;
|
private Table __p;
|
||||||
public ByteBuffer ByteBuffer { get { return __p.bb; } }
|
public ByteBuffer ByteBuffer { get { return __p.bb; } }
|
||||||
public static MeshAlignment GetRootAsMeshAlignment(ByteBuffer _bb) { return GetRootAsMeshAlignment(_bb, new MeshAlignment()); }
|
public static MeshAttribute GetRootAsMeshAttribute(ByteBuffer _bb) { return GetRootAsMeshAttribute(_bb, new MeshAttribute()); }
|
||||||
public static MeshAlignment GetRootAsMeshAlignment(ByteBuffer _bb, MeshAlignment obj) { return (obj.__assign(_bb.GetInt(_bb.Position) + _bb.Position, _bb)); }
|
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 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 uint VertexType { get { int o = __p.__offset(4); return o != 0 ? __p.bb.GetUint(o + __p.bb_pos) : (uint)0; } }
|
||||||
public BufferFormat FormatID { get { int o = __p.__offset(6); return o != 0 ? (BufferFormat)__p.bb.GetUint(o + __p.bb_pos) : BufferFormat.Float; } }
|
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 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,
|
public static Offset<MeshAttribute> CreateMeshAttribute(FlatBufferBuilder builder,
|
||||||
VertexType TypeID = VertexType.Position,
|
uint VertexType = 0,
|
||||||
BufferFormat FormatID = BufferFormat.Float,
|
uint BufferFormat = 0,
|
||||||
uint ElementCount = 0)
|
uint ElementCount = 0)
|
||||||
{
|
{
|
||||||
builder.StartObject(3);
|
builder.StartObject(3);
|
||||||
MeshAlignment.AddElementCount(builder, ElementCount);
|
MeshAttribute.AddElementCount(builder, ElementCount);
|
||||||
MeshAlignment.AddFormatID(builder, FormatID);
|
MeshAttribute.AddBufferFormat(builder, BufferFormat);
|
||||||
MeshAlignment.AddTypeID(builder, TypeID);
|
MeshAttribute.AddVertexType(builder, VertexType);
|
||||||
return MeshAlignment.EndMeshAlignment(builder);
|
return MeshAttribute.EndMeshAttribute(builder);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void StartMeshAlignment(FlatBufferBuilder builder) { builder.StartObject(3); }
|
public static void StartMeshAttribute(FlatBufferBuilder builder) { builder.StartObject(3); }
|
||||||
public static void AddTypeID(FlatBufferBuilder builder, VertexType TypeID) { builder.AddUint(0, (uint)TypeID, 0); }
|
public static void AddVertexType(FlatBufferBuilder builder, uint VertexType) { builder.AddUint(0, VertexType, 0); }
|
||||||
public static void AddFormatID(FlatBufferBuilder builder, BufferFormat FormatID) { builder.AddUint(1, (uint)FormatID, 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 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();
|
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); }
|
public ArraySegment<byte>? GetNameBytes() { return __p.__vector_as_arraysegment(4); }
|
||||||
#endif
|
#endif
|
||||||
public byte[] GetNameArray() { return __p.__vector_as_array<byte>(4); }
|
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 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 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; } }
|
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? 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? 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 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 StartBone(FlatBufferBuilder builder) { builder.StartObject(11); }
|
||||||
public static void AddName(FlatBufferBuilder builder, StringOffset NameOffset) { builder.AddOffset(0, NameOffset.Value, 0); }
|
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 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 AddZero(FlatBufferBuilder builder, uint Zero) { builder.AddUint(3, Zero, 0); }
|
||||||
public static void AddVisible(FlatBufferBuilder builder, bool Visible) { builder.AddBool(4, Visible, false); }
|
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 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 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 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)
|
public static Offset<Bone> EndBone(FlatBufferBuilder builder)
|
||||||
{
|
{
|
||||||
int o = builder.EndObject();
|
int o = builder.EndObject();
|
||||||
@ -777,136 +778,56 @@ namespace FlatBuffers.Gfbmdl
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
public struct UnknownData : IFlatbufferObject
|
public struct BoneRigidData : IFlatbufferObject
|
||||||
{
|
{
|
||||||
private Struct __p;
|
private Struct __p;
|
||||||
public ByteBuffer ByteBuffer { get { return __p.bb; } }
|
public ByteBuffer ByteBuffer { get { return __p.bb; } }
|
||||||
public void __init(int _i, ByteBuffer _bb) { __p.bb_pos = _i; __p.bb = _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.Prep(1, 1);
|
||||||
builder.PutSbyte(NoSkin);
|
builder.PutSbyte(Unknown1);
|
||||||
return new Offset<UnknownData>(builder.Offset);
|
return new Offset<BoneRigidData>(builder.Offset);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
public struct RenderInfo : IFlatbufferObject
|
public struct CollisionGroup : IFlatbufferObject
|
||||||
{
|
{
|
||||||
private Table __p;
|
private Table __p;
|
||||||
public ByteBuffer ByteBuffer { get { return __p.bb; } }
|
public ByteBuffer ByteBuffer { get { return __p.bb; } }
|
||||||
public static RenderInfo GetRootAsRenderInfo(ByteBuffer _bb) { return GetRootAsRenderInfo(_bb, new RenderInfo()); }
|
public static CollisionGroup GetRootAsCollisionGroup(ByteBuffer _bb) { return GetRootAsCollisionGroup(_bb, new CollisionGroup()); }
|
||||||
public static RenderInfo GetRootAsRenderInfo(ByteBuffer _bb, RenderInfo obj) { return (obj.__assign(_bb.GetInt(_bb.Position) + _bb.Position, _bb)); }
|
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 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 BoneIndex { 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 Unknown1 { 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 uint BoneChildren(int j) { int o = __p.__offset(8); return o != 0 ? __p.bb.GetUint(__p.__vector(o) + j * 4) : (uint)0; }
|
||||||
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 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,
|
public static void StartCollisionGroup(FlatBufferBuilder builder) { builder.StartObject(4); }
|
||||||
uint Unknown1 = 0,
|
public static void AddBoneIndex(FlatBufferBuilder builder, uint BoneIndex) { builder.AddUint(0, BoneIndex, 0); }
|
||||||
uint Unknown2 = 0,
|
public static void AddUnknown1(FlatBufferBuilder builder, uint Unknown1) { builder.AddUint(1, Unknown1, 0); }
|
||||||
Offset<RenderUnknown> Unknown3Offset = default(Offset<RenderUnknown>),
|
public static void AddBoneChildren(FlatBufferBuilder builder, VectorOffset BoneChildrenOffset) { builder.AddOffset(2, BoneChildrenOffset.Value, 0); }
|
||||||
Offset<RenderUnknown2> Unknown4Offset = default(Offset<RenderUnknown2>))
|
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(); }
|
||||||
builder.StartObject(4);
|
public static void StartBoneChildrenVector(FlatBufferBuilder builder, int numElems) { builder.StartVector(4, numElems, 4); }
|
||||||
RenderInfo.AddUnknown4(builder, Unknown4Offset);
|
public static void AddBounding(FlatBufferBuilder builder, Offset<BoundingBox> BoundingOffset) { builder.AddStruct(3, BoundingOffset.Value, 0); }
|
||||||
RenderInfo.AddUnknown3(builder, Unknown3Offset);
|
public static Offset<CollisionGroup> EndCollisionGroup(FlatBufferBuilder builder)
|
||||||
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)
|
|
||||||
{
|
{
|
||||||
int o = builder.EndObject();
|
int o = builder.EndObject();
|
||||||
return new Offset<RenderInfo>(o);
|
return new Offset<CollisionGroup>(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);
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
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 OpenTK;
|
||||||
using Toolbox.Library.Forms;
|
using Toolbox.Library.Forms;
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
|
using FirstPlugin.Forms;
|
||||||
|
|
||||||
namespace FirstPlugin
|
namespace FirstPlugin
|
||||||
{
|
{
|
||||||
@ -18,8 +19,17 @@ namespace FirstPlugin
|
|||||||
|
|
||||||
public GFLXModel ParentModel { get; set; }
|
public GFLXModel ParentModel { get; set; }
|
||||||
|
|
||||||
public FlatBuffers.Gfbmdl.Mesh MeshData { get; set; }
|
public GFBANM.MeshAnimationController AnimationController = new GFBANM.MeshAnimationController();
|
||||||
public FlatBuffers.Gfbmdl.Group GroupData { get; set; }
|
|
||||||
|
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)
|
public GFLXMaterialData GetMaterial(STGenericPolygonGroup polygroup)
|
||||||
{
|
{
|
||||||
@ -31,11 +41,35 @@ namespace FirstPlugin
|
|||||||
List<ToolStripItem> Items = new List<ToolStripItem>();
|
List<ToolStripItem> Items = new List<ToolStripItem>();
|
||||||
var uvMenu = new ToolStripMenuItem("UVs");
|
var uvMenu = new ToolStripMenuItem("UVs");
|
||||||
Items.Add(uvMenu);
|
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 Vertical", null, FlipVerticalAction, Keys.Control | Keys.V));
|
||||||
uvMenu.DropDownItems.Add(new ToolStripMenuItem("Flip Horizontal", null, FlipHorizontalAction, Keys.Control | Keys.H));
|
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();
|
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) {
|
private void FlipVerticalAction(object sender, EventArgs args) {
|
||||||
this.FlipUvsVertical();
|
this.FlipUvsVertical();
|
||||||
UpdateMesh();
|
UpdateMesh();
|
||||||
@ -46,9 +80,16 @@ namespace FirstPlugin
|
|||||||
UpdateMesh();
|
UpdateMesh();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void CalculateTangentBitangenAction(object sender, EventArgs args)
|
||||||
|
{
|
||||||
|
this.CalculateTangentBitangent(false);
|
||||||
|
UpdateMesh();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
private void UpdateMesh() {
|
private void UpdateMesh() {
|
||||||
|
MeshData.SetData(GFLXMeshBufferHelper.CreateVertexDataBuffer(this));
|
||||||
ParentModel.UpdateVertexData(true);
|
ParentModel.UpdateVertexData(true);
|
||||||
GFLXMeshBufferHelper.ReloadVertexData(this);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public struct DisplayVertex
|
public struct DisplayVertex
|
||||||
@ -69,8 +110,8 @@ namespace FirstPlugin
|
|||||||
}
|
}
|
||||||
|
|
||||||
public GFLXMesh(GFLXModel model,
|
public GFLXMesh(GFLXModel model,
|
||||||
FlatBuffers.Gfbmdl.Group group,
|
GFMDLStructs.Group group,
|
||||||
FlatBuffers.Gfbmdl.Mesh mesh)
|
GFMDLStructs.Mesh mesh)
|
||||||
{
|
{
|
||||||
ParentModel = model;
|
ParentModel = model;
|
||||||
GroupData = group;
|
GroupData = group;
|
@ -1,102 +1,205 @@
|
|||||||
using System;
|
using FirstPlugin.GFMDLStructs;
|
||||||
|
using FlatBuffers;
|
||||||
|
using System;
|
||||||
using System.Collections.Generic;
|
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;
|
||||||
|
using Toolbox.Library.IO;
|
||||||
|
using Toolbox.Library.Rendering;
|
||||||
|
using System.Linq;
|
||||||
|
|
||||||
namespace FirstPlugin
|
namespace FirstPlugin
|
||||||
{
|
{
|
||||||
public class GFLXMeshBufferHelper
|
public class GFLXMeshBufferHelper
|
||||||
{
|
{
|
||||||
public static void ReloadVertexData(GFLXMesh mesh)
|
public static byte[] CreateVertexDataBuffer(GFLXMesh mesh)
|
||||||
{
|
{
|
||||||
var flatMesh = mesh.MeshData;
|
var meshData = mesh.MeshData;
|
||||||
var buf = flatMesh.ByteBuffer;
|
|
||||||
for (int v = 0; v < mesh.vertices.Count; v++)
|
//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();
|
if (bone.HasSkinning)
|
||||||
// flatMesh.Data(v);
|
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)
|
public static uint GetTotalBufferStride(Mesh mesh)
|
||||||
{
|
{
|
||||||
uint VertBufferStride = 0;
|
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;
|
var attribute = mesh.Attributes[i];
|
||||||
switch (attribute.TypeID)
|
switch ((VertexType)attribute.VertexType)
|
||||||
{
|
{
|
||||||
case VertexType.Position:
|
case VertexType.Position:
|
||||||
if (attribute.FormatID == BufferFormat.HalfFloat)
|
if (attribute.BufferFormat == (uint)BufferFormat.HalfFloat)
|
||||||
VertBufferStride += 0x08;
|
VertBufferStride += 0x08;
|
||||||
else if (attribute.FormatID == BufferFormat.Float)
|
else if (attribute.BufferFormat == (uint)BufferFormat.Float)
|
||||||
VertBufferStride += 0x0C;
|
VertBufferStride += 0x0C;
|
||||||
else
|
else
|
||||||
throw new Exception($"Unknown Combination! {attribute.TypeID} {attribute.FormatID}");
|
throw new Exception($"Unknown Combination! {attribute.VertexType} {attribute.BufferFormat}");
|
||||||
break;
|
break;
|
||||||
case VertexType.Normal:
|
case VertexType.Normal:
|
||||||
if (attribute.FormatID == BufferFormat.HalfFloat)
|
if (attribute.BufferFormat == (uint)BufferFormat.HalfFloat)
|
||||||
VertBufferStride += 0x08;
|
VertBufferStride += 0x08;
|
||||||
else if (attribute.FormatID == BufferFormat.Float)
|
else if (attribute.BufferFormat == (uint)BufferFormat.Float)
|
||||||
VertBufferStride += 0x0C;
|
VertBufferStride += 0x0C;
|
||||||
else
|
else
|
||||||
throw new Exception($"Unknown Combination! {attribute.TypeID} {attribute.FormatID}");
|
throw new Exception($"Unknown Combination! {attribute.VertexType} {attribute.BufferFormat}");
|
||||||
break;
|
break;
|
||||||
case VertexType.Binormal:
|
case VertexType.Binormal:
|
||||||
if (attribute.FormatID == BufferFormat.HalfFloat)
|
if (attribute.BufferFormat == (uint)BufferFormat.HalfFloat)
|
||||||
VertBufferStride += 0x08;
|
VertBufferStride += 0x08;
|
||||||
else if (attribute.FormatID == BufferFormat.Float)
|
else if (attribute.BufferFormat == (uint)BufferFormat.Float)
|
||||||
VertBufferStride += 0x0C;
|
VertBufferStride += 0x0C;
|
||||||
else
|
else
|
||||||
throw new Exception($"Unknown Combination! {attribute.TypeID} {attribute.FormatID}");
|
throw new Exception($"Unknown Combination! {attribute.VertexType} {attribute.BufferFormat}");
|
||||||
break;
|
break;
|
||||||
case VertexType.UV1:
|
case VertexType.UV1:
|
||||||
case VertexType.UV2:
|
case VertexType.UV2:
|
||||||
case VertexType.UV3:
|
case VertexType.UV3:
|
||||||
case VertexType.UV4:
|
case VertexType.UV4:
|
||||||
if (attribute.FormatID == BufferFormat.HalfFloat)
|
if (attribute.BufferFormat == (uint)BufferFormat.HalfFloat)
|
||||||
VertBufferStride += 0x04;
|
VertBufferStride += 0x04;
|
||||||
else if (attribute.FormatID == BufferFormat.Float)
|
else if (attribute.BufferFormat == (uint)BufferFormat.Float)
|
||||||
VertBufferStride += 0x08;
|
VertBufferStride += 0x08;
|
||||||
else
|
else
|
||||||
throw new Exception($"Unknown Combination! {attribute.TypeID} {attribute.FormatID}");
|
throw new Exception($"Unknown Combination! {attribute.VertexType} {attribute.BufferFormat}");
|
||||||
break;
|
break;
|
||||||
case VertexType.Color1:
|
case VertexType.Color1:
|
||||||
case VertexType.Color2:
|
case VertexType.Color2:
|
||||||
if (attribute.FormatID == BufferFormat.Byte)
|
if (attribute.BufferFormat == (uint)BufferFormat.Byte)
|
||||||
VertBufferStride += 0x04;
|
VertBufferStride += 0x04;
|
||||||
else
|
else
|
||||||
throw new Exception($"Unknown Combination! {attribute.TypeID} {attribute.FormatID}");
|
throw new Exception($"Unknown Combination! {attribute.VertexType} {attribute.BufferFormat}");
|
||||||
break;
|
break;
|
||||||
case VertexType.BoneID:
|
case VertexType.BoneID:
|
||||||
if (attribute.FormatID == BufferFormat.Short)
|
if (attribute.BufferFormat == (uint)BufferFormat.Short)
|
||||||
VertBufferStride += 0x08;
|
VertBufferStride += 0x08;
|
||||||
else if (attribute.FormatID == BufferFormat.Byte)
|
else if (attribute.BufferFormat == (uint)BufferFormat.Byte)
|
||||||
VertBufferStride += 0x04;
|
VertBufferStride += 0x04;
|
||||||
else
|
else
|
||||||
throw new Exception($"Unknown Combination! {attribute.TypeID} {attribute.FormatID}");
|
throw new Exception($"Unknown Combination! {attribute.VertexType} {attribute.BufferFormat}");
|
||||||
break;
|
break;
|
||||||
case VertexType.BoneWeight:
|
case VertexType.BoneWeight:
|
||||||
if (attribute.FormatID == BufferFormat.BytesAsFloat)
|
if (attribute.BufferFormat == (uint)BufferFormat.BytesAsFloat)
|
||||||
VertBufferStride += 0x04;
|
VertBufferStride += 0x04;
|
||||||
else
|
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;
|
break;
|
||||||
default:
|
default:
|
||||||
Console.WriteLine($"attribute.FormatID {attribute.FormatID}");
|
throw new Exception($"Unknown Combination! {attribute.VertexType} {attribute.BufferFormat}");
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -109,7 +212,7 @@ namespace FirstPlugin
|
|||||||
|
|
||||||
uint VertBufferStride = GetTotalBufferStride(mesh);
|
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;
|
uint numVertex = (uint)reader.BaseStream.Length / VertBufferStride;
|
||||||
for (int v = 0; v < numVertex; v++)
|
for (int v = 0; v < numVertex; v++)
|
||||||
@ -117,39 +220,41 @@ namespace FirstPlugin
|
|||||||
Vertex vertex = new Vertex();
|
Vertex vertex = new Vertex();
|
||||||
Vertices.Add(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:
|
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 = new OpenTK.Vector3(pos.X, pos.Y, pos.Z);
|
||||||
vertex.pos = OpenTK.Vector3.TransformPosition(vertex.pos, transform);
|
vertex.pos = OpenTK.Vector3.TransformPosition(vertex.pos, transform);
|
||||||
break;
|
break;
|
||||||
case VertexType.Normal:
|
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.nrm = new OpenTK.Vector3(normal.X, normal.Y, normal.Z);
|
||||||
|
vertex.normalW = normal.W;
|
||||||
vertex.nrm = OpenTK.Vector3.TransformNormal(vertex.nrm, transform);
|
vertex.nrm = OpenTK.Vector3.TransformNormal(vertex.nrm, transform);
|
||||||
break;
|
break;
|
||||||
case VertexType.UV1:
|
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);
|
vertex.uv0 = new OpenTK.Vector2(texcoord1.X, texcoord1.Y);
|
||||||
break;
|
break;
|
||||||
case VertexType.UV2:
|
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);
|
vertex.uv1 = new OpenTK.Vector2(texcoord2.X, texcoord2.Y);
|
||||||
break;
|
break;
|
||||||
case VertexType.UV3:
|
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);
|
vertex.uv2 = new OpenTK.Vector2(texcoord3.X, texcoord3.Y);
|
||||||
break;
|
break;
|
||||||
case VertexType.UV4:
|
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;
|
break;
|
||||||
case VertexType.BoneWeight:
|
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[]
|
vertex.boneWeights.AddRange(new float[]
|
||||||
{
|
{
|
||||||
weights.X,
|
weights.X,
|
||||||
@ -159,7 +264,7 @@ namespace FirstPlugin
|
|||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
case VertexType.BoneID:
|
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[]
|
vertex.boneIds.AddRange(new int[]
|
||||||
{
|
{
|
||||||
boneSkinningIds[(int)boneIndices.X],
|
boneSkinningIds[(int)boneIndices.X],
|
||||||
@ -170,24 +275,29 @@ namespace FirstPlugin
|
|||||||
break;
|
break;
|
||||||
case VertexType.Color1:
|
case VertexType.Color1:
|
||||||
OpenTK.Vector4 colors1 = new OpenTK.Vector4(1, 1, 1, 1);
|
OpenTK.Vector4 colors1 = new OpenTK.Vector4(1, 1, 1, 1);
|
||||||
if (attribute.FormatID == BufferFormat.Byte)
|
if (attribute.BufferFormat == (uint)BufferFormat.Byte)
|
||||||
colors1 = ParseBuffer(reader, attribute.FormatID, attribute.TypeID);
|
colors1 = ParseBuffer(reader, attribute.BufferFormat, attribute.VertexType, attribute.ElementCount);
|
||||||
|
|
||||||
vertex.col = colors1 / 255f;
|
vertex.col = colors1 / 255f;
|
||||||
break;
|
break;
|
||||||
case VertexType.Color2:
|
case VertexType.Color2:
|
||||||
OpenTK.Vector4 colors2 = new OpenTK.Vector4(1, 1, 1, 1);
|
OpenTK.Vector4 colors2 = new OpenTK.Vector4(1, 1, 1, 1);
|
||||||
if (attribute.FormatID == BufferFormat.Byte)
|
if (attribute.BufferFormat == (uint)BufferFormat.Byte)
|
||||||
colors2 = ParseBuffer(reader, attribute.FormatID, attribute.TypeID);
|
colors2 = ParseBuffer(reader, attribute.BufferFormat, attribute.VertexType, attribute.ElementCount);
|
||||||
|
|
||||||
|
vertex.col2 = colors2 / 255f;
|
||||||
break;
|
break;
|
||||||
case VertexType.Binormal:
|
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);
|
vertex.bitan = new OpenTK.Vector4(binormals.X, binormals.Y, binormals.Z, binormals.W);
|
||||||
break;
|
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:
|
default:
|
||||||
ParseBuffer(reader, attribute.FormatID, attribute.TypeID);
|
var values = ParseBuffer(reader, attribute.BufferFormat, attribute.VertexType, attribute.ElementCount);
|
||||||
|
vertex.Unknowns.Add(values);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -197,8 +307,11 @@ namespace FirstPlugin
|
|||||||
return Vertices;
|
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)
|
if (AttributeType == VertexType.Position)
|
||||||
{
|
{
|
||||||
switch (Format)
|
switch (Format)
|
||||||
@ -292,8 +405,34 @@ namespace FirstPlugin
|
|||||||
switch (Format)
|
switch (Format)
|
||||||
{
|
{
|
||||||
case BufferFormat.HalfFloat:
|
case BufferFormat.HalfFloat:
|
||||||
return new OpenTK.Vector4(reader.ReadHalfSingle(), reader.ReadHalfSingle(),
|
float[] values = new float[4];
|
||||||
reader.ReadHalfSingle(), reader.ReadHalfSingle());
|
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:
|
default:
|
||||||
throw new Exception($"Unknown Combination! {AttributeType} {Format}");
|
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_Common.cs" />
|
||||||
<Compile Include="FileFormats\NLG\NLG_NLOC.cs" />
|
<Compile Include="FileFormats\NLG\NLG_NLOC.cs" />
|
||||||
<Compile Include="FileFormats\NLG\NLOC_Wrapper.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\NLG\PunchOutWii\PO_DICT.cs" />
|
||||||
<Compile Include="FileFormats\Archives\VIBS.cs" />
|
<Compile Include="FileFormats\Archives\VIBS.cs" />
|
||||||
<Compile Include="FileFormats\Audio\Archives\AudioCommon.cs" />
|
<Compile Include="FileFormats\Audio\Archives\AudioCommon.cs" />
|
||||||
@ -358,16 +358,21 @@
|
|||||||
<Compile Include="FileFormats\NLG\PunchOutWii\PO_VertexAttribute.cs" />
|
<Compile Include="FileFormats\NLG\PunchOutWii\PO_VertexAttribute.cs" />
|
||||||
<Compile Include="FileFormats\Pikmin1\MOD.cs" />
|
<Compile Include="FileFormats\Pikmin1\MOD.cs" />
|
||||||
<Compile Include="FileFormats\Pikmin1\TXE.cs" />
|
<Compile Include="FileFormats\Pikmin1\TXE.cs" />
|
||||||
<Compile Include="FileFormats\Pokemon\GFBANIM\FlatBuffers\gfbanim.cs" />
|
<Compile Include="FileFormats\Pokemon\GFLX\FlatBufferHelper.cs" />
|
||||||
<Compile Include="FileFormats\Pokemon\GFBANIM\GFBANM.cs" />
|
<Compile Include="FileFormats\Pokemon\GFLX\GFBANIM\FlatBuffers\gfbanim.cs" />
|
||||||
<Compile Include="FileFormats\Pokemon\GFBANMCFG\GFBANMCFG.cs" />
|
<Compile Include="FileFormats\Pokemon\GFLX\GFBANIM\GfbanimKeyFrameLoader.cs" />
|
||||||
<Compile Include="FileFormats\Pokemon\GFBANMCFG\FlatBuffers\gfbanmcfg.cs" />
|
<Compile Include="FileFormats\Pokemon\GFLX\GFBANIM\GFBANM.cs" />
|
||||||
<Compile Include="FileFormats\Pokemon\GFBMDL\FlatBuffers\gfbmdl.cs" />
|
<Compile Include="FileFormats\Pokemon\GFLX\GFBANMCFG\GFBANMCFG.cs" />
|
||||||
<Compile Include="FileFormats\Pokemon\GFBMDL\GFBMDL.cs" />
|
<Compile Include="FileFormats\Pokemon\GFLX\GFBANMCFG\FlatBuffers\gfbanmcfg.cs" />
|
||||||
<Compile Include="FileFormats\Pokemon\GFBMDL\GFLXModel.cs" />
|
<Compile Include="FileFormats\Pokemon\GFLX\GFBMDL\FlatBuffers\BufferToStruct.cs" />
|
||||||
<Compile Include="FileFormats\Pokemon\GFBMDL\GFLXMeshBufferHelper.cs" />
|
<Compile Include="FileFormats\Pokemon\GFLX\GFBMDL\FlatBuffers\gfbmdl.cs" />
|
||||||
<Compile Include="FileFormats\Pokemon\GFBPMCATALOG\FlatBuffers\gfbpmcatalog.cs" />
|
<Compile Include="FileFormats\Pokemon\GFLX\GFBMDL\GFBMDL.cs" />
|
||||||
<Compile Include="FileFormats\Pokemon\PokemonTable.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\NCSDStructs.cs" />
|
||||||
<Compile Include="FileFormats\Rom\3DS\NCSD.cs" />
|
<Compile Include="FileFormats\Rom\3DS\NCSD.cs" />
|
||||||
<Compile Include="FileFormats\Rom\3DS\RomFS.cs" />
|
<Compile Include="FileFormats\Rom\3DS\RomFS.cs" />
|
||||||
@ -392,6 +397,12 @@
|
|||||||
<Compile Include="GL\LM3_Renderer.cs" />
|
<Compile Include="GL\LM3_Renderer.cs" />
|
||||||
<Compile Include="GL\PunchOutWii_Renderer.cs" />
|
<Compile Include="GL\PunchOutWii_Renderer.cs" />
|
||||||
<Compile Include="GL\Strikers_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">
|
<Compile Include="GUI\GFBMDL\GFLXMaterialEditor.cs">
|
||||||
<SubType>UserControl</SubType>
|
<SubType>UserControl</SubType>
|
||||||
</Compile>
|
</Compile>
|
||||||
@ -404,6 +415,18 @@
|
|||||||
<Compile Include="GUI\GFBMDL\GFLXMaterialParamEditor.Designer.cs">
|
<Compile Include="GUI\GFBMDL\GFLXMaterialParamEditor.Designer.cs">
|
||||||
<DependentUpon>GFLXMaterialParamEditor.cs</DependentUpon>
|
<DependentUpon>GFLXMaterialParamEditor.cs</DependentUpon>
|
||||||
</Compile>
|
</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">
|
<Compile Include="GUI\Pokemon\PokemonLoaderSwSh.cs">
|
||||||
<SubType>Form</SubType>
|
<SubType>Form</SubType>
|
||||||
</Compile>
|
</Compile>
|
||||||
@ -441,7 +464,7 @@
|
|||||||
<DependentUpon>LayoutAnimEditor.cs</DependentUpon>
|
<DependentUpon>LayoutAnimEditor.cs</DependentUpon>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="GUI\BFLYT\Animations\Basic\LayoutAnimEditorBasic.cs">
|
<Compile Include="GUI\BFLYT\Animations\Basic\LayoutAnimEditorBasic.cs">
|
||||||
<SubType>Form</SubType>
|
<SubType>UserControl</SubType>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="GUI\BFLYT\Animations\Basic\LayoutAnimEditorBasic.Designer.cs">
|
<Compile Include="GUI\BFLYT\Animations\Basic\LayoutAnimEditorBasic.Designer.cs">
|
||||||
<DependentUpon>LayoutAnimEditorBasic.cs</DependentUpon>
|
<DependentUpon>LayoutAnimEditorBasic.cs</DependentUpon>
|
||||||
@ -670,7 +693,7 @@
|
|||||||
<Compile Include="GUI\BMD\BMDModelImportSettings.Designer.cs">
|
<Compile Include="GUI\BMD\BMDModelImportSettings.Designer.cs">
|
||||||
<DependentUpon>BMDModelImportSettings.cs</DependentUpon>
|
<DependentUpon>BMDModelImportSettings.cs</DependentUpon>
|
||||||
</Compile>
|
</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\GMX\GMX.cs" />
|
||||||
<Compile Include="FileFormats\Hashes\SAHT.cs" />
|
<Compile Include="FileFormats\Hashes\SAHT.cs" />
|
||||||
<Compile Include="FileFormats\MKAGPDX\MKAGPDX_Model.cs" />
|
<Compile Include="FileFormats\MKAGPDX\MKAGPDX_Model.cs" />
|
||||||
@ -1441,12 +1464,21 @@
|
|||||||
<EmbeddedResource Include="GUI\AttributeEditor.resx">
|
<EmbeddedResource Include="GUI\AttributeEditor.resx">
|
||||||
<DependentUpon>AttributeEditor.cs</DependentUpon>
|
<DependentUpon>AttributeEditor.cs</DependentUpon>
|
||||||
</EmbeddedResource>
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="GUI\BFLYT\Editor\PaneAnimationController.resx">
|
||||||
|
<DependentUpon>PaneAnimationController.cs</DependentUpon>
|
||||||
|
</EmbeddedResource>
|
||||||
<EmbeddedResource Include="GUI\GFBMDL\GFLXMaterialEditor.resx">
|
<EmbeddedResource Include="GUI\GFBMDL\GFLXMaterialEditor.resx">
|
||||||
<DependentUpon>GFLXMaterialEditor.cs</DependentUpon>
|
<DependentUpon>GFLXMaterialEditor.cs</DependentUpon>
|
||||||
</EmbeddedResource>
|
</EmbeddedResource>
|
||||||
<EmbeddedResource Include="GUI\GFBMDL\GFLXMaterialParamEditor.resx">
|
<EmbeddedResource Include="GUI\GFBMDL\GFLXMaterialParamEditor.resx">
|
||||||
<DependentUpon>GFLXMaterialParamEditor.cs</DependentUpon>
|
<DependentUpon>GFLXMaterialParamEditor.cs</DependentUpon>
|
||||||
</EmbeddedResource>
|
</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">
|
<EmbeddedResource Include="GUI\Pokemon\PokemonLoaderSwSh.resx">
|
||||||
<DependentUpon>PokemonLoaderSwSh.cs</DependentUpon>
|
<DependentUpon>PokemonLoaderSwSh.cs</DependentUpon>
|
||||||
</EmbeddedResource>
|
</EmbeddedResource>
|
||||||
@ -1940,6 +1972,7 @@
|
|||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Folder Include="FileFormats\EvemtFlow\" />
|
<Folder Include="FileFormats\EvemtFlow\" />
|
||||||
<Folder Include="FileFormats\NLG\Common\" />
|
<Folder Include="FileFormats\NLG\Common\" />
|
||||||
|
<Folder Include="FileFormats\Pokemon\GFL2\" />
|
||||||
<Folder Include="GUI\Byaml\MuuntEditor\Renderables\" />
|
<Folder Include="GUI\Byaml\MuuntEditor\Renderables\" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
@ -15,6 +15,8 @@ namespace FirstPlugin
|
|||||||
{
|
{
|
||||||
public class GFBMDL_Render : AbstractGlDrawable, IMeshContainer
|
public class GFBMDL_Render : AbstractGlDrawable, IMeshContainer
|
||||||
{
|
{
|
||||||
|
public GFBMDL GfbmdlFile;
|
||||||
|
|
||||||
public List<STGenericObject> Meshes { get; set; } = new List<STGenericObject>();
|
public List<STGenericObject> Meshes { get; set; } = new List<STGenericObject>();
|
||||||
|
|
||||||
public Matrix4 ModelTransform = Matrix4.Identity;
|
public Matrix4 ModelTransform = Matrix4.Identity;
|
||||||
@ -399,7 +401,7 @@ namespace FirstPlugin
|
|||||||
shader.EnableVertexAttributes();
|
shader.EnableVertexAttributes();
|
||||||
foreach (GFLXMesh shp in Meshes)
|
foreach (GFLXMesh shp in Meshes)
|
||||||
{
|
{
|
||||||
if (shp.Checked)
|
if (shp.Checked && shp.AnimationController.IsVisible)
|
||||||
DrawModel(control, shp, shader);
|
DrawModel(control, shp, shader);
|
||||||
}
|
}
|
||||||
shader.DisableVertexAttributes();
|
shader.DisableVertexAttributes();
|
||||||
|
@ -80,10 +80,9 @@
|
|||||||
//
|
//
|
||||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||||
this.ClientSize = new System.Drawing.Size(800, 450);
|
|
||||||
this.Controls.Add(this.splitContainer1);
|
this.Controls.Add(this.splitContainer1);
|
||||||
this.Name = "LayoutAnimEditorBasic";
|
this.Name = "LayoutAnimEditorBasic";
|
||||||
this.Text = "LayoutAnimEditorBasic";
|
this.Size = new System.Drawing.Size(800, 450);
|
||||||
this.splitContainer1.Panel1.ResumeLayout(false);
|
this.splitContainer1.Panel1.ResumeLayout(false);
|
||||||
this.splitContainer1.Panel2.ResumeLayout(false);
|
this.splitContainer1.Panel2.ResumeLayout(false);
|
||||||
((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit();
|
((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit();
|
||||||
|
@ -12,7 +12,7 @@ using Toolbox.Library;
|
|||||||
|
|
||||||
namespace LayoutBXLYT
|
namespace LayoutBXLYT
|
||||||
{
|
{
|
||||||
public partial class LayoutAnimEditorBasic : LayoutDocked
|
public partial class LayoutAnimEditorBasic : UserControl
|
||||||
{
|
{
|
||||||
private BxlytHeader ParentLayout;
|
private BxlytHeader ParentLayout;
|
||||||
private BxlanHeader ActiveAnim;
|
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)
|
private void LoadAnimationEntry(BxlanPaiEntry entry, TreeNode root)
|
||||||
{
|
{
|
||||||
var nodeEntry = new GroupAnimWrapper(entry.Name) { Tag = entry };
|
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++)
|
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>
|
/// </summary>
|
||||||
private void InitializeComponent()
|
private void InitializeComponent()
|
||||||
{
|
{
|
||||||
this.stPanel3 = new Toolbox.Library.Forms.STPanel();
|
this.stPanel4 = new Toolbox.Library.Forms.STPanel();
|
||||||
this.stPanel2 = new Toolbox.Library.Forms.STPanel();
|
this.miniToolStrip = new Toolbox.Library.Forms.STToolStrip();
|
||||||
this.stToolStrip1 = new Toolbox.Library.Forms.STToolStrip();
|
this.stToolStrip1 = new Toolbox.Library.Forms.STToolStrip();
|
||||||
this.stPanel1 = new Toolbox.Library.Forms.STPanel();
|
this.stPanel1 = new Toolbox.Library.Forms.STPanel();
|
||||||
this.stPanel3.SuspendLayout();
|
this.stPanel4.SuspendLayout();
|
||||||
this.stPanel2.SuspendLayout();
|
|
||||||
this.SuspendLayout();
|
this.SuspendLayout();
|
||||||
//
|
//
|
||||||
// stPanel3
|
// stPanel4
|
||||||
//
|
//
|
||||||
this.stPanel3.Controls.Add(this.stPanel2);
|
this.stPanel4.Controls.Add(this.stToolStrip1);
|
||||||
this.stPanel3.Controls.Add(this.stPanel1);
|
this.stPanel4.Dock = System.Windows.Forms.DockStyle.Top;
|
||||||
this.stPanel3.Dock = System.Windows.Forms.DockStyle.Fill;
|
this.stPanel4.Location = new System.Drawing.Point(0, 0);
|
||||||
this.stPanel3.Location = new System.Drawing.Point(0, 0);
|
this.stPanel4.Name = "stPanel4";
|
||||||
this.stPanel3.Name = "stPanel3";
|
this.stPanel4.Size = new System.Drawing.Size(462, 31);
|
||||||
this.stPanel3.Size = new System.Drawing.Size(411, 288);
|
this.stPanel4.TabIndex = 2;
|
||||||
this.stPanel3.TabIndex = 2;
|
|
||||||
//
|
//
|
||||||
// stPanel2
|
// miniToolStrip
|
||||||
//
|
//
|
||||||
this.stPanel2.Controls.Add(this.stToolStrip1);
|
this.miniToolStrip.AccessibleName = "New item selection";
|
||||||
this.stPanel2.Dock = System.Windows.Forms.DockStyle.Top;
|
this.miniToolStrip.AccessibleRole = System.Windows.Forms.AccessibleRole.ButtonDropDown;
|
||||||
this.stPanel2.Location = new System.Drawing.Point(0, 0);
|
this.miniToolStrip.AutoSize = false;
|
||||||
this.stPanel2.Name = "stPanel2";
|
this.miniToolStrip.CanOverflow = false;
|
||||||
this.stPanel2.Size = new System.Drawing.Size(411, 27);
|
this.miniToolStrip.Dock = System.Windows.Forms.DockStyle.None;
|
||||||
this.stPanel2.TabIndex = 0;
|
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
|
// stToolStrip1
|
||||||
//
|
//
|
||||||
|
this.stToolStrip1.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||||
this.stToolStrip1.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden;
|
this.stToolStrip1.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden;
|
||||||
this.stToolStrip1.HighlightSelectedTab = false;
|
this.stToolStrip1.HighlightSelectedTab = false;
|
||||||
this.stToolStrip1.Location = new System.Drawing.Point(0, 0);
|
this.stToolStrip1.Location = new System.Drawing.Point(0, 0);
|
||||||
this.stToolStrip1.Name = "stToolStrip1";
|
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.TabIndex = 0;
|
||||||
this.stToolStrip1.Text = "stToolStrip1";
|
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)
|
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.Left)
|
||||||
| System.Windows.Forms.AnchorStyles.Right)));
|
| 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.Name = "stPanel1";
|
||||||
this.stPanel1.Size = new System.Drawing.Size(411, 262);
|
this.stPanel1.Size = new System.Drawing.Size(462, 298);
|
||||||
this.stPanel1.TabIndex = 1;
|
this.stPanel1.TabIndex = 1;
|
||||||
//
|
//
|
||||||
// PaneEditor
|
// PaneEditor
|
||||||
//
|
//
|
||||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||||
this.ClientSize = new System.Drawing.Size(411, 288);
|
this.ClientSize = new System.Drawing.Size(462, 324);
|
||||||
this.Controls.Add(this.stPanel3);
|
this.Controls.Add(this.stPanel4);
|
||||||
|
this.Controls.Add(this.stPanel1);
|
||||||
this.Name = "PaneEditor";
|
this.Name = "PaneEditor";
|
||||||
this.stPanel3.ResumeLayout(false);
|
this.stPanel4.ResumeLayout(false);
|
||||||
this.stPanel2.ResumeLayout(false);
|
this.stPanel4.PerformLayout();
|
||||||
this.stPanel2.PerformLayout();
|
|
||||||
this.ResumeLayout(false);
|
this.ResumeLayout(false);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
private Toolbox.Library.Forms.STPanel stPanel1;
|
private Toolbox.Library.Forms.STPanel stPanel4;
|
||||||
private Toolbox.Library.Forms.STPanel stPanel2;
|
private Toolbox.Library.Forms.STToolStrip miniToolStrip;
|
||||||
private Toolbox.Library.Forms.STPanel stPanel3;
|
|
||||||
private Toolbox.Library.Forms.STToolStrip stToolStrip1;
|
private Toolbox.Library.Forms.STToolStrip stToolStrip1;
|
||||||
|
private Toolbox.Library.Forms.STPanel stPanel1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -21,6 +21,8 @@ namespace LayoutBXLYT
|
|||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
stToolStrip1.HighlightSelectedTab = true;
|
stToolStrip1.HighlightSelectedTab = true;
|
||||||
stToolStrip1.ItemClicked += tabMenu_SelectedIndexChanged;
|
stToolStrip1.ItemClicked += tabMenu_SelectedIndexChanged;
|
||||||
|
|
||||||
|
stToolStrip1.CanOverflow = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Dictionary<string, STGenericTexture> GetTextures()
|
public Dictionary<string, STGenericTexture> GetTextures()
|
||||||
@ -95,6 +97,11 @@ namespace LayoutBXLYT
|
|||||||
((BasePaneEditor)editor).RefreshEditor();
|
((BasePaneEditor)editor).RefreshEditor();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public List<BxlanHeader> GetAnimations()
|
||||||
|
{
|
||||||
|
return ParentEditor.AnimationFiles;
|
||||||
|
}
|
||||||
|
|
||||||
public void LoadMaterial(BxlytMaterial material, LayoutEditor parentEditor)
|
public void LoadMaterial(BxlytMaterial material, LayoutEditor parentEditor)
|
||||||
{
|
{
|
||||||
ActiveMaterial = material;
|
ActiveMaterial = material;
|
||||||
@ -159,6 +166,7 @@ namespace LayoutBXLYT
|
|||||||
}
|
}
|
||||||
|
|
||||||
AddTab("User Data", LoadUserData);
|
AddTab("User Data", LoadUserData);
|
||||||
|
AddTab("Anims", LoadAnimationData);
|
||||||
|
|
||||||
int tabIndex;
|
int tabIndex;
|
||||||
if (pane is IPicturePane)
|
if (pane is IPicturePane)
|
||||||
@ -206,6 +214,13 @@ namespace LayoutBXLYT
|
|||||||
Runtime.LayoutEditor.NullPaneTabIndex = tabIndex;
|
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)
|
private void LoadUserData(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
UpdateTabIndex();
|
UpdateTabIndex();
|
||||||
@ -340,5 +355,10 @@ namespace LayoutBXLYT
|
|||||||
|
|
||||||
private void tabMenu_SelectedIndexChanged(object sender, EventArgs e) {
|
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">
|
<metadata name="stToolStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||||
<value>17, 17</value>
|
<value>17, 17</value>
|
||||||
</metadata>
|
</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>
|
<value>17, 17</value>
|
||||||
</metadata>
|
</metadata>
|
||||||
</root>
|
</root>
|
@ -431,10 +431,14 @@ namespace LayoutBXLYT
|
|||||||
|
|
||||||
public void ShowBxlanEditor(BxlanHeader bxlan)
|
public void ShowBxlanEditor(BxlanHeader bxlan)
|
||||||
{
|
{
|
||||||
|
LayoutDocked dock = new LayoutDocked();
|
||||||
LayoutAnimEditorBasic editor = new LayoutAnimEditorBasic();
|
LayoutAnimEditorBasic editor = new LayoutAnimEditorBasic();
|
||||||
editor.LoadAnim(bxlan, ActiveLayout);
|
editor.LoadAnim(bxlan, ActiveLayout);
|
||||||
editor.OnPropertyChanged += AnimPropertyChanged;
|
editor.OnPropertyChanged += AnimPropertyChanged;
|
||||||
editor.Show(this);
|
editor.Dock = DockStyle.Fill;
|
||||||
|
dock.Controls.Add(editor);
|
||||||
|
|
||||||
|
dock.Show(this);
|
||||||
|
|
||||||
/* if (LayoutAnimEditor != null) {
|
/* if (LayoutAnimEditor != null) {
|
||||||
LayoutAnimEditor.LoadFile(bxlan.GetGenericAnimation());
|
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 ImageList TextureIconList;
|
||||||
|
|
||||||
|
private TextEditor JsonTextEditor;
|
||||||
|
|
||||||
public GFLXMaterialEditor()
|
public GFLXMaterialEditor()
|
||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
|
||||||
|
JsonTextEditor = new TextEditor();
|
||||||
|
JsonTextEditor.Dock = DockStyle.Fill;
|
||||||
|
JsonTextEditor.IsJson = true;
|
||||||
|
stPanel7.Controls.Add(JsonTextEditor);
|
||||||
|
|
||||||
stTabControl1.myBackColor = FormThemes.BaseTheme.FormBackColor;
|
stTabControl1.myBackColor = FormThemes.BaseTheme.FormBackColor;
|
||||||
|
stTabControl2.myBackColor = FormThemes.BaseTheme.FormBackColor;
|
||||||
|
|
||||||
|
stPanel6.BackColor = FormThemes.BaseTheme.ListViewBackColor;
|
||||||
|
|
||||||
TextureIconList = new ImageList()
|
TextureIconList = new ImageList()
|
||||||
{
|
{
|
||||||
ColorDepth = ColorDepth.Depth32Bit,
|
ColorDepth = ColorDepth.Depth32Bit,
|
||||||
@ -35,20 +46,27 @@ namespace FirstPlugin.Forms
|
|||||||
stDropDownPanel1.ResetColors();
|
stDropDownPanel1.ResetColors();
|
||||||
stDropDownPanel2.ResetColors();
|
stDropDownPanel2.ResetColors();
|
||||||
|
|
||||||
|
uvViewport1.UseGrid = false;
|
||||||
|
|
||||||
ResetSliders();
|
ResetSliders();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ResetSliders()
|
private void ResetSliders()
|
||||||
{
|
{
|
||||||
barSlider1.SetTheme();
|
param1CB.SetTheme();
|
||||||
barSlider2.SetTheme();
|
param2CB.SetTheme();
|
||||||
barSlider3.SetTheme();
|
param4CB.SetTheme();
|
||||||
barSlider4.SetTheme();
|
param3CB.SetTheme();
|
||||||
|
|
||||||
barSlider1.Value = 0;
|
param1CB.Value = 0;
|
||||||
barSlider2.Value = 0;
|
param2CB.Value = 0;
|
||||||
barSlider3.Value = 0;
|
param4CB.Value = 0;
|
||||||
barSlider4.Value = 0;
|
param3CB.Value = 0;
|
||||||
|
|
||||||
|
translateXUD.Value = 0;
|
||||||
|
translateYUD.Value = 0;
|
||||||
|
scaleXUD.Value = 1;
|
||||||
|
scaleYUD.Value = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void LoadMaterial(GFLXMaterialData materialData)
|
public void LoadMaterial(GFLXMaterialData materialData)
|
||||||
@ -107,40 +125,69 @@ namespace FirstPlugin.Forms
|
|||||||
if (listViewCustom1.SelectedIndices.Count > 0) {
|
if (listViewCustom1.SelectedIndices.Count > 0) {
|
||||||
int index = listViewCustom1.SelectedIndices[0];
|
int index = listViewCustom1.SelectedIndices[0];
|
||||||
var tex = MaterialData.TextureMaps[index];
|
var tex = MaterialData.TextureMaps[index];
|
||||||
|
var gflxTex = ((GFLXTextureMap)tex).gflxTextureMap;
|
||||||
stTextBox1.Text = tex.Name;
|
stTextBox1.Text = tex.Name;
|
||||||
stTextBox2.Text = tex.SamplerName;
|
stTextBox2.Text = tex.SamplerName;
|
||||||
|
uvViewport1.ActiveTextureMap = tex;
|
||||||
|
|
||||||
foreach (var bntx in PluginRuntime.bntxContainers) {
|
translateXUD.Value = tex.Transform.Translate.X;
|
||||||
if (bntx.Textures.ContainsKey(tex.Name))
|
translateYUD.Value = tex.Transform.Translate.Y;
|
||||||
UpdateTexturePreview(bntx.Textures[tex.Name]);
|
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
|
else
|
||||||
{
|
{
|
||||||
ResetSliders();
|
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;
|
var text = MaterialData.ConvertToJson();
|
||||||
|
JsonTextEditor.FillEditor(text);
|
||||||
try {
|
}
|
||||||
image = texture.GetBitmap();
|
|
||||||
}
|
|
||||||
catch {
|
|
||||||
image = Properties.Resources.TextureError;
|
|
||||||
}
|
|
||||||
|
|
||||||
pictureBoxCustom1.Invoke((MethodInvoker)delegate {
|
|
||||||
// Running on the UI thread
|
|
||||||
pictureBoxCustom1.Image = image;
|
|
||||||
});
|
|
||||||
}));
|
|
||||||
Thread.Start();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -117,212 +117,4 @@
|
|||||||
<resheader name="writer">
|
<resheader name="writer">
|
||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
</resheader>
|
</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
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACDTbOhAAAACXBIWXMAAA7DAAAOwwHHb6hkAAAAGXRF
|
|
||||||
WHRTb2Z0d2FyZQBwYWludC5uZXQgNC4wLjIx8SBplQAAK8tJREFUeF7t3Qlz21iSBGDZOnifAEiABHif
|
|
||||||
Ou2e///ftu3OrBILitBMrzzjtvOLaHcHkqsCHnMghfdRuIqyp39d+JIgoM4eCXzdIjCrr4jg3EZAySMS
|
|
||||||
eMoR0HV4wb9WN0hoGWYc+wioi4D+yBDQzRkJLRtI4DpHQI8dJNT9goTSz0igtUFAu3Adn+KMf4WTuBqF
|
|
||||||
0/xaIKBGmPHHGYGZvyCChwEC6t8jgS8VAnP8AxHsmggoD0txj+Pu/WIdkMDXHQLz+xQrvGM/R7Fq7+kH
|
|
||||||
FOukYpGKZVQso2IZFcv9M4p1+wHF+il/xlKxjO5YTsUiFcupWKRiORWLVCz3vymWfsYiFcuoWEbFcvpW
|
|
||||||
SCqWU7FIxXIqllGxjIpl9BekRsVyumORiuVULPqFi5UFeVldKHMENJ0jgXKGwMyQ0HyCgN6dkYUXVPUZ
|
|
||||||
4RXzKQKaIqD6jHAd1ax2mgiodh3TeJpxxiQuRe06CgSmNiMud4GAajPmCEwRl7u2Vu/NqK1VbSnijPnV
|
|
||||||
U1C2bi80KgS0HSCBuyECk9whgu4OAVVhRqtAQPdtJJSckVAaZvTWCOBxi8DMkdC5i4DSAxK4LxBQa4uE
|
|
||||||
NuEkbqt7JLAfI6BBuI6HGQJzfEQEyw4CuMsR0HGEhDoIzKSBBNorBLQOMxoZAtNDQsOwVk9FmNG5wq3L
|
|
||||||
VLe4ucHnBQI6dJHApz4CM0JCrSMCWoQZNwUCer5DQqNnJDT+hAQ6WwTwxx6BKZHQUwsBJeEbwvMMAd2G
|
|
||||||
HwL+tQ/f+a4W4ZvOOX7T6YXr+BJnXN2Hbzrr8E2n9s2z9o2ticBMrpHAXfwGvQ0zPqcITPxhJn7z/FcR
|
|
||||||
lqKhYhkVi1Qsp2IZFcuoWE7FIhXLqVikYjkVi1Qsp2IZFcuoWE7FIhXLqVikYjkVi1Qsp2IZFcuoWE7F
|
|
||||||
IhXLqVikYjkViz6kWF+CsvH5wm2FgPY9JHAz+H745fuf342vEUFnj4CqJhJoFAjoMbzg8/gBCSU3SKC7
|
|
||||||
QQAvOwSmREIPbQSUnJDAY4GAmvE6duEkPldPSOA4RED9cB3PMwTm9Gohv1mF07zJXy/1n05xRhuBmdwi
|
|
||||||
geYaAW3CjNsMgemEt3QQ1upLEZaidZUEebW4UE0R0GSOhOYIzAwBlRkCmsYZBQJKwwsWsxQJ1WbUThOB
|
|
||||||
yRFQWiKgWTjNNEdA1QQJTeJpTsNpZvE043XUZixqaxVPM15HFt+PEoEpwmmWtesIM2rvR1J7z+NpxtqU
|
|
||||||
uHM5bU0mfZjCac+70Z53o2IZFcuoWE7FIhXL/TbF0gdWjYrldMciFcupWKRiORXLqFhGxTIfUSz9jEUq
|
|
||||||
ltEdy6hYTsUiFcupWKRiuV+lWPp7LKNiORWLVCynb4X0CxerE0y3hwv7CQIaLZHQAoGpENB6hIAmYcYu
|
|
||||||
R0C98IJD1UNCJQJaJQhohMBMEVB/jYDKARLo5QhoG69jvEdCky4SGMalWIbr6MYZh3ASnXSDAPYFAhos
|
|
||||||
kNAGgZntkMAmrlUSZ8wRmLhWyyECKsJSbK7i2swH3Qu9OQJajpFAL/l++NXXyXqIYLRCQHFGv0BA2yES
|
|
||||||
ymLT4oxxWN79EoGZIaHajElYvW2BgAbxOpbhJLrz8BauUwSUxP9JxRnddXhDqnCaf9b98hW1GUMEZtpH
|
|
||||||
ArW6L+KMKQIzQkJJbFoRlmKoPe9Ge95JH6ZwKpZRsYyK5VQsUrGcikUqllOxSMVyKpZRsYyK5VQsUrGc
|
|
||||||
ikUqllOxSMVyKpZRsYyK5VQsUrGcikUqlvttihU32qhYr6hY9LPesb4G5d2nCzcLBHToIYHPfQRm9BkR
|
|
||||||
tA8IaBFm3BYI6KmBhEaPSCgJMzpbBPBlj8CUSOixjYCSMxJ4miGgRryO3TUSqp6RwGmIgPpPSOAlzvgU
|
|
||||||
TuLrqoUArnMEdI4zmgjM5AYJNNYIaNtEAtcpAhPXqh9PswhL0bza7i7Nhv0LgzkCWiRIKP1++NXXmSCg
|
|
||||||
8RIBzcOMYYGANiMklG2QUJyRVAhgu0BgZkhoPUZAkxUS2BQIaLhAQvUZ4TSXKQJKwwtqM/qr8IaUcSny
|
|
||||||
10v9p1WcMUJg8gESGIW12lVhxmCKwMS1SsNa7Yo4A3cup63JpK3JTnvezX+lWPowBalYRncso2I5FYtU
|
|
||||||
LKdi0W9crJdasfZI4OsWgflnFOsDPrDa+yl/xjojMB9QrKPuWKQ7ltG3QqNiGRXLqVikYjkVi/6NYv2U
|
|
||||||
P2OpWEZ3LKdikYrlVCxSsZyKRSqW+8+LpV+8ZlQspzsWqVhOxaJfuFirYJaMLoxnCKjKkNAEgZkgoLRC
|
|
||||||
QHFGUiCgZXjBaLJEQlMElJYIqERg4nUsUwQ0WSCBZYGAkngd5RgJzcJpVnEpsvCC2oxRnDGPS5EjoEVt
|
|
||||||
uRGYPJxmMkdAZXzP44xVXKssrNWqiDNqW5OrsN38ur41GQm8sTU57Edv1bcmI4E3tiYjoVHY0vs1CfeG
|
|
||||||
uDX5a9zzXt+aXNvzHrcmx3vDXbyOfdhMflXfmoyAaluT44yr+tZkBPA5bk2+DzM+tRCYSbhNvrE1GQlc
|
|
||||||
ZwhMO7ylb2xNRgJNfZjC6MMUpE/pOBXLqFhGxXIqFqlYTsUiFcupWKRiORXLqFhGxXIqFqlYTsUiFcup
|
|
||||||
WKRiORXLqFhGxXIqFqlYTsUiFcupWKRiORXL/CTFOgfzbutCp0RA6xESaI8RmBQJ9TcIqAwzugUCOvSQ
|
|
||||||
UHpAQlkbCQyXCGiNwMwR0GGAgLIdEjgUCKi7RkLrcBKt8ogEtgkCGoXrOMUZrXAS50UfAbRzBLSLM/oI
|
|
||||||
zLSDBHoLBLSMMyYITFyr8RYBFWEp+lftYLI7XthnCGi0QgKHJQJTHRDBZoiA4oxdjoC6WyRU9ZBQGWas
|
|
||||||
EgTQGSEwUyTU2yCgcoAEujkC2o6Q0DicxHHSRQLDBQJahuvoxBnHQQcRpOE0DwUC6scZGwRmtkcC27BW
|
|
||||||
7XGYsZ8jMGsktAxr1S7ie447l9PWZNKHKZz2vBvteTcqllGxjIrlVCxSsZyKRSqWU7HMu8XSJ6GNiuV0
|
|
||||||
xyIVy6lYpGI5FcuoWEbFMh9RLP2MRSqW0R3LqFhOxSIVy6lYpGK5X6VY+nsso2I53bHoZy1WEuTV4kI1
|
|
||||||
RUCTORKaIzAzBFROENA0zsgRUFoioVmKhN6dMUFg3p+RIYE0R0BVbUa4jsU0nGYWT3MeXlCbsQgnkUzj
|
|
||||||
aRYIKIvvR4nAFOE0y9pbGmZUcUYST2IeTzPWprx6DMrW7YVmhYC2AyRwN0RgkjtE0N0hoKqNBFoFAjqH
|
|
||||||
F9wmZySUhhn9NQLaIDBzBHTqIqD0gATOBQJqb5HQpoGEynsksB8joGG4jocZAhNO4nEZTrORI6DDCAnc
|
|
||||||
dRGYaRMRdFYIaB1nZAhMLyz3MJ5mEZaioz3vRnveSR+mcCqWUbGMiuVULFKxnIpFKpZTsUjFciqWUbGM
|
|
||||||
iuVULFKxnIpFKpZTsUjFciqWUbGMiuVULFKxnIpFKpZTsUjFciqW+UmK9RSUrZsLjQoB7fpI4HaIwCS3
|
|
||||||
iKC7Q0BVmNEsENB9GwklZySU3iGB3hoBbRHQbYmAzl0klB6RwH2BgFrxOrbhJG7KBySwHyGgwT0SeIgz
|
|
||||||
bsJJPC07COAuR0DHMOO2g8BMG4igvUJA6zCjkSEwvfCWDg8IqAhL0bnKoyLCcYPDDscNDjscdzjucNzg
|
|
||||||
sMNxg8MOxx2O0+wDThOHHY4bHH4FgcFhg8MOxx2OGxx2OO5w3OCww3GH4w7HDQ47HHc4bnDnctqaTNqa
|
|
||||||
7LTn3fxXiqUPU5CKZXTHMiqWU7FIxXIqFqlY7lcplj6walQsp2KRiuX0rZBULKdiGRXLqFhGxTIqlvs5
|
|
||||||
iqWfsUjFMrpjGRXLqVikYjkVi1Qs96sUS3+PZX5Isa6D7P75wmOKgHpbJPC0QWCWT4jg0EVA6RkJ3OcI
|
|
||||||
6O6EhJYNJFSFGfshArjpITATJNQ4IqBFGwnc5Qjo3ENC/UcklN4igc4KAW3CddzGGc8tJDQOp/lUIKDW
|
|
||||||
GgkdEZj5AxI4jRDQMMx4LBGYPRLahLW6zsNSnOq/eK19d6H+i9eGSKAxQmCSBiLoxV9YFme04y9eO3WQ
|
|
||||||
UHJCQmmYEX/x2sMGgan94rUeAqr/4jUE1Kn94rUmEirD71XbjRHQMFzH/QyB2T8ggkUXATRrv3gtznjj
|
|
||||||
F68hgc4SAa3ijNovXusjodEeARVhRld73o32vJM+TOFULKNiGRXLqVikYjkVi1Qsp2KRiuVULKNiGRXL
|
|
||||||
qVikYjkVi1Qsp2KRiuVULKNiGRXLqVikYjkVi1Qsp2KRiuVULKNiGRXL/TLFWgWzZHRhPENAVYaEMgRm
|
|
||||||
goDSCgHFGUmBgJbhBaPJEgnVZpQIqERg4nUsUwQ0XSCBZYGAkngd1RgJ1dYqnmYWryPOGIWTWM3DaY7j
|
|
||||||
Wi3ijASBycNpJnMEVMYZUwQmrlUWT7M24wq/2s9kYXfnQ4qA4g7Sxw0CU9tB2kNAcQfpOUdAjfoOUiRU
|
|
||||||
hR2LuyEC6iOgpwkCah6QUBV+P2Uj7u48xesYhK2Zz1n4hYnd+g5SJFDfQRp/SeY4nOZj/OWS7bCD9OmA
|
|
||||||
wNR3kCKguIP0oURg9uEtjb9c8ibuID3izuX0YQrShymcPkxh/ivF0ocpSMUyumMZFcupWKRiORWLVCz3
|
|
||||||
qxRLH1g1KpbTHYtULKdikYrlVCyjYhkVy3xEsfQzFqlYRsUyKpbTt0JSsZyKRSqWU7GMimVULKO/IDU/
|
|
||||||
pFjLYJaOLyQzBFRmSCCZIDDTBBFkJQKKM9ICAVXhBeNJhYTyOGOOABZzBFS7jipcx3gaZixyBJTG6yjD
|
|
||||||
SYyLBRIoJwgoXkdtxjheaO39yBFQFWYkGQIT1yoNa7WcvzdjmYUv8e77kV59Dcq7TxduFgjo0EMCn/sI
|
|
||||||
zOgzImgfENAizLgrENBTAwmNHpFQEmZ0tgjgyx6BKZHQYxsBJWck8DRDQI14HftrJFQ9I4HTEAH1n5DA
|
|
||||||
S5zxKZzE11ULAVznCOgcZ7QQmMkNEmisEdA2zkgRmA4SGsTTLMJSNLXn3WjPO+nDFE7FMiqWUbGcikUq
|
|
||||||
llOxSMVyKhapWE7FMu8WK/7Nl4r1iopFumM5FYtULKdiGRXLqFhGxTIqllOxSMVyKhapWE7FMiqWUbGM
|
|
||||||
imV+SLGOwbzXudAtEdBqjIQSBCZFQMMVAir7SKBXIKB9eEEn3SGhDAGNlghohcDMEdBugICyDRLYFwio
|
|
||||||
H69j1UVC8z0SWCcIaByu4xBndMJJHKtwmt0cAW3jjAECMw2n2V8goGWcMUFghkgoiadZhBmDq34wXW8v
|
|
||||||
bKYIKFkgoQqBKRHQMkFAkzBjnSOgYXjBthwioTkCWqYIYJAgMPE6hksENB8hgWGOgFbxOtINEpoMkMA4
|
|
||||||
LkUVrmMQZ2zDSfSzcJqbAgGNKiS0RGBm4TRXGQJKV0hgM0Ng4lpVYwRUxBm4cznteSfteXfa825ULKNi
|
|
||||||
mX9KsfRhClKxjO5YRsVyKhapWE7FIhXL/SrF0gdWjYrldMciFcupWKRiORXLqFhGxTIfUSz9jEUqltEd
|
|
||||||
y6hYTsUiFcupWPQ7FevxjwsvtWLtkcCXLQKz+ooIzvENScKMWrFuHpBQrViLL0jgGBbrUxcBfY3Fuj0h
|
|
||||||
oWVYrJscAT2ELY5XvRcklIYtda0NAorF+hxn/FEvFgL4Ui8WEjojMPNnJPAwRED9eyTwUivWMbylcWvg
|
|
||||||
VR6W4v6qG0y3+wu7CQIaLZHQAoEpEdB6hIAmGySwzRFQL7xgX/aR0BwBrRIENEZgpgiov0JA5RAJ9HME
|
|
||||||
tBkjofEOCU17SGBYIaBFuI5enLEPJ9HN1ghgVyCg2ow1AjMLp7lJEVASZ8wRmLhWi3iaeZix1tZko63J
|
|
||||||
pD3vTsUyKpZRsZyKRSqWU7FIxXIqFqlYTsUyKpZRsZyKRSqWU7FIxXIqFqlYTsUyKpZRsZyKRSqWU7FI
|
|
||||||
xXIqFqlYTsUyKpZRsdwvUyxszDJlrVgIqF4sBGYU3vTWEQHFYt3OEFC9WE9IKKkVCwF8rRcLCb1RLCTw
|
|
||||||
HLfU3R2QUK1YVdjudopvej/suatt27u6D1vqVrViIaD7WrEQmHqxENA27C78nCIwtWKF7Yd/1IuVBfm8
|
|
||||||
vJQjoOkMAc0QmPiC+RQB1WYUCGgSXzCbIKF3Z0wRmHgdtRlFmDHJEdDfmFFbq3gdcUYZXzB9d61qS4HA
|
|
||||||
FAiofh3vzcjefT9qa4WCOe15J+15d/owhVGxjIplVCyjYrnfp1hhNVUso2I53bFIxXIqFqlYTsVyKhb9
|
|
||||||
U4ul3+hnVCynOxapWE7FIhXLqVhGxTIqlvmIYulnLFKxjO5YRsVyKhapWE7Fol+4WDd/uv32xzd//kd2
|
|
||||||
frrwkCL47vb2pr9FAo/rv5Lvf37/9/IRERx6TPDv9IQEzvlfgb2iEV7wtGz+FXz/80+3VZixGyL46183
|
|
||||||
t30EZsIE/27tEdCigwSvaOYI6NT/K7BXDB6QUNb4K+ALuisEtGnaCX7/8y7OeGr7Knz/c3xAAI8Fvzhe
|
|
||||||
0V4joYONx3/Mw2meRv6K7/8eHpHAQ8mE/45rtfm2Vq9fkYcZx6tzMO+2LrRLBLQeIoH2GIFJkdBgg4DK
|
|
||||||
MKNbIKBjDwmlBySUtZHAYIkATisEZo6E9n0ElO2QwKFAQL01ElqFk2iVRySwGSOgUbiOY5zR2p4QQRVO
|
|
||||||
sz1FQLsECfURmGkHCfQWCGgZZ0wQmAESGm8RUBGWoq8970Z73kkfpnAqllGxjIrlVCxSsZyKRSqWU7FI
|
|
||||||
xXIqllGxjIrlVCxSsZyKRSqWU7FIxXIqllGxjIrlVCxSsZyKRSqWU7FIxXIqllGxjIrlfpliLYNZmlya
|
|
||||||
IaBygoAmCEx8QVYioDgjLRDQIp7EtEJCUwSUzRFQicDUZmQIKM5YFAgojddRmzFbIIH6WoUX1GYk8UJn
|
|
||||||
8TRzBFTVlhuByRFQGtdq/t6MZXzBJJ5mnJFdNYLJ4f7CKUNAgzUSOK8QmMUZEewGCCgLM445AmqHF9wv
|
|
||||||
2kioCjM2IwTQHCIwEyTU2SGgqocE2jkCOsTrGJ6QUNZCAv0lAlqH62jFGffdJiJIwmmeCwTUjTN2CMws
|
|
||||||
nOZ+jIBGeyRwKhGYLRJahbVq5OH9qH3D0J53oz3vTh+mMCqWUbHMP6VYYTVVLKNiORWLVCynb4WkYjkV
|
|
||||||
y6lYpGI5FYt+42LpN/oZFcvpjkUqllOxSMVyKpZRsYyKZT6iWPoZi1QsozuWUbGcikU/a7Gug+z++cJj
|
|
||||||
ioB6WyTwtEFglk+I4NBFQOkZCdznCOguvOB52UBCizBjP0QAN30EZoKEmgcEtGgjgUaOgM49JNR/RELp
|
|
||||||
HRLorBDQJlzHbZzx3L5BBOMjAngqEFB7jYSOCMz8AQmcRghoGGY8lgjMHgltwlpd52EpTld5VMwuFDjs
|
|
||||||
wgvqryj+0y/xN2bkCOhvvOADZry/FAjo3RfMcNyFVxTvfYn6C2qvwGHzb7xh778CCRTammy0NZm0592p
|
|
||||||
WEbFMiqWU7FIxXIqFqlYTsUiFcupWEbFMiqWU7FIxXIqFqlYTsUiFcupWEbFMiqWU7FIxXIqFqlYTsUi
|
|
||||||
FcupWEbFMiqW+2WK9RjMW7cXmhUC2g6QQGOIwCR3iKC7RUBVGwm0CgR07iCh5ISE0gYS6K8QwMMGAd3N
|
|
||||||
kdCph4TSAxI4FwioHa9jE07itrxHArsRAhqG67iPM24PD4hg0UUAjRwBHcKMuy4CM2kigs4SAa3CjGaG
|
|
||||||
wPTCWzrcI6AiLEXnqhNMtocL+wkCGq2Q0AKBqRDQeoSA4oxdjoB64QWHqoeESgS0ShBAd4zATJFQf42A
|
|
||||||
ygES6OUIaBuvY7xHQpNwmsMFAlr2kUA3zjiEk+ikGwSwLxDQIM7YIDCzcJqbFAElccYcgYlrtRwioCLO
|
|
||||||
wJ3Lac87ac+704cpjIplVCyjYhkVy/0+xQqrqWIZFcvpjkUqllOxSMVyKpZTsUjFcioW/cbF0m/0MyqW
|
|
||||||
0x2LVCynYpGK5VQso2IZFct8RLH0MxapWEZ3LKNiORWLftZidYPpZn9hN0FA4yUS2C2+H+59//O7Egmt
|
|
||||||
xwhoEmZscwTUDy/YVwMkFGesUgTQGyMwUyQ0WCGgcogE+jkC2sTrSHZIaNJHAqMKAS3CdfTijP3w1UJ+
|
|
||||||
k60RwK54vdR/GsYZawRmtkUCm7BW3STOmCMwca0WYa26RViK9dWXl5eX7//gP8q7zxduKnvFX6/a95DA
|
|
||||||
dd/Tv/4ZXyOC9uFb8OoVVQMJ3BV/BfaKxyYSGj/4//n3P5Iwo7tBin9edghM+Sr99s9DGwElpz+DV694
|
|
||||||
LBBQY4+Qr9iFk/hcPXn47Y/jEAENHpn+9c9znPH5/Cr99s8qnOZ1/j3wV5zijJaHf/3H5BYJNNf+iu+v
|
|
||||||
2rSQwE32Kv3+TwcJDf5cq4tXFDdIoKU970Z73kkfpnAqllGxjIrlVCxSsZyKRSqWU7FIxXIqllGxjIrl
|
|
||||||
VCxSsZyKRSqWU7FIxXIqllGxjIrlVCxSsZyKRSqWU7FIxXIqllGxjIrlfplipUFeLS5UUwQ0mSOBaobA
|
|
||||||
zMKXKCcIaFoigTJHYMILFrMMARVhxrw2AwFVcUb2/gwEVLuOSTiJRW3GDAHV1irOWMSTiGtVFQgozqhK
|
|
||||||
BCauVVl7S9+bkZZxueNpxtqUV9iYZbL7lwtPKQLq7pDA8waBWT4jgmMXAaVhxkOOgG7PSGgVth9+XoQZ
|
|
||||||
+wECuO4hMBkSahwR0CJsd7vLEdB92OL4uf9tX99radhS11kjoG3cRhlnvLTC5sHxty11r9S2BrbijBMC
|
|
||||||
M39EAufa9sMw46lCYA5IaBN3SeZhKU64cznteSfteXf6MIVRsYyKZVQso2K536dYYTVVLKNiOd2xSMVy
|
|
||||||
KhapWE7FcioW/VOLpV+8ZlQspzsWqVhOxSIVy6lYRsUyKpZRsYyK5X6OYoXVVLGMiuV0x6IPKVYrmOzP
|
|
||||||
F44ZAhqukcBpicBUJ0SwHSKgLMzY5wios0NCVRcJlWHGeoyAhgjoNEFA3Q0SKvtIoJMjoF28jtERCWUd
|
|
||||||
JDBYIKBVuI52nHEOJ9FKtwjgWCCgXphx2iIwswMi2CUIaBxnzBGYTVjuZTzNIizF7moTzMaDC8MZAqpS
|
|
||||||
JDBMEZjJEBEkCwQUZ4xyBLQKLxhMVkioNqNEQBUCE6+jPmOJBFYFAhrF66jCSQxmaySwyBBQFq5jHWcM
|
|
||||||
wklsygQBDONaLeOMMQIzDac5jmtVxvd8isAk4Uuk8TSLOENbk422JpP2vDsVy6hYRsVyKhapWE7FIhXL
|
|
||||||
qVikYjkVy6hYRsVyKhapWE7FIhXLqVikYjkVy6hYRsVyKhapWE7FIhXLqVikYjkVy6hYRsVyv0yxdsFs
|
|
||||||
0LvQnyGgZYIE+ikCk/URwWiJgOZDJDAoENAmvKCXbZDQJMwYVwhogYBq17EZIaHJGglsCgQ0jNexCGvV
|
|
||||||
m22RwCpDQEm4jm2c0VshoTKcZj9HQOsUCY0QmDyc5jCuVRVnTBGYMRJK42nm4f0YXt0E2fn5wkOKgHpb
|
|
||||||
JPC0QWCWT4jg0ENAaZhxnyOgxgkJLRtIqAozdkME1EdgJgioeUBAizYSaOQI6NRHQoNHJJTeIYHuCgFt
|
|
||||||
mkjgNs54DidxMw6n+VggoPYaCR0QmPkDEjiNENDwiAQeSwRmH5Z700FAeViKI+5c7rfZ865PQpv4jU0f
|
|
||||||
pnD6MAWpWE7FcioWqVhOxSIVy+lnLFKxnO5YpGI5FcupWKRiORWLfuNi6e+xjIrldMciFcupWKRiORXL
|
|
||||||
qFhGxTIfUSz9jEUqltEdy/yQYn0KsocvF55TBNTdIYGXDQKzfEEEpw4CSsOMhxwB3d4jodUtElqEGYcB
|
|
||||||
AvjcQ2AyJHR3RECLFhK4zRHQfRcJ9Z6RUHqDBNprBLQN13EdZ3xpfUYEoxMCeC4QUDPOOCEw8yckcD9E
|
|
||||||
QIMzEngqEZgDEtqGtfqUh6U4X+VBMQtw3MVXFDhuivCK2gtyBFTUXoHAvP8lcNghoPoL3r8OBPQjvkR8
|
|
||||||
wd9ZbgT0/7+Od1/wxisQUKGtyUZbk0l73p2KZVQso2I5FYtULKdikYrlVCxSsZyKZVQso2I5FYtULKdi
|
|
||||||
kYrlVCxSsZyKZVQso2I5FYtULKdikYrlVCxSsZyKZVQso2I5FYtULKdiUeOqEUyO9xdOGQIarJHAeYXA
|
|
||||||
VGdEsBsgoOyABI45AmrtkdCijYTijM0IAQ0RmAkCam8RUNVFAu0cAR3idQzDSdxnLSTQXyKgVbiOVpxx
|
|
||||||
30NCyQ4BnAsE1I0zdgjM7IQE9mMENA7LfZojMHGtVvE08zgDBXPZ4x8XXmp73vdI4OsWgVl9RQTnuFc8
|
|
||||||
CTPqe94fkNAbe96RQH3POwL6Gve8356Q0DL87/YmR0AP8Tp6L0goDfeG1gYBxT3vn+OMP+p73hHAl/qe
|
|
||||||
dyR0RmDm4TQfhgiof48EXmp73o9I6I0970jgN/4whT4JbeI3Nn1Kx+lTOqRiORXLqVikYjkVi1Qsp5+x
|
|
||||||
SMVyumORiuVULKdikYrlVCz6jYulv8cyKpbTHYtULKdikYrlVCyjYhkVy3xEsfQzFqlYRncs80OKNQqm
|
|
||||||
y/WF1RQBpRUSWJUIzHyFCBYpAoozljkCGi+Q0HyMhGZhRpUhoAwB1a5jHK5jPUuQwDhHQLXryMJJrKfh
|
|
||||||
NNMSAZXxOuKMdTiJ0SQsxapAQEmcsUBginCaywkCyuKMGQJThS9RxtPM43t+dQ7mneaFdomANkMk0Boh
|
|
||||||
MEkLEfQ3CKjsIoFOgYCO4QXN9ICE0jBjsERAawRmjoAOfQSU7ZDAsUBA3Xgd6zYSKk9IYJsgoFG4jlOc
|
|
||||||
0QwncV6E02zlCGg3RkI9BGYaTrMX12rZQwLtDIGJazWOp5nHGdqabLQ1mbTn3alYRsUyKpZTsUjFcioW
|
|
||||||
qVhOxSIVy6lYRsUyKpZTsUjFcioWqVhOxSIVy6lYRsUyKpZTsUjFcioWqVhOxSIVy6lY5icp1tegvMMz
|
|
||||||
M+FmgYD2PSRw3UdgRuEhoe0DAlo0kMBdgYCemkho/IiEkmsk0N0ggC87BKZEQo9tBJSckcBTfJZpY4+E
|
|
||||||
duEkPlXPSOAYn2XaD9fxPENgzl8QwSo8y/Q6R0DnOKOFwEzCc1+bawS0CTNuUgSmE97SwQkBFXHGVRHh
|
|
||||||
iZkOxw0OOxw3OOxw3OG4w3GDwwaHHY47HHc4bnDYTREYHHc4bnDY4bjBYYfjDscdjhscdjhucNjhuMNx
|
|
||||||
g8OvICAcfQWBwWGH4w7HDe5cTluTSVuT3Q/Y8/7Gb/RDAm/9Rj9E8HMW6wM+sNr7KT9M8cZv9EMEf6NY
|
|
||||||
x48vlu5YRncso2IZFcuoWE7FIhXLqVhGxTIqlqkXK6ymimVULKc7FqlYTsUiFcupWE7Fon9qsfQb/YyK
|
|
||||||
5XTHIhXLqVikYjkVy6hYRsUyH1Es/YxF9WLhQYZmcny48MaDMJFA/UGYi3tEsOsjoOyABOoPwgwveHjj
|
|
||||||
QZhIYFt7ECYCqj8Ic4eE6g/CRED1B2GekFB8EGZviYDW4TqaccZDOIlGEk7zjQdhIoG3HoSJCA7xQZij
|
|
||||||
PRJ460GYiKD+IMzwfuyvNsFsNLgwnCOgRYoEhikCMxkigmSBgOZhxqhAQOsxEpqskVBtRoWAKgRmhoDW
|
|
||||||
CQKaLJHAukBAo3gdVTiJwSyc5iJDQGl4QW3GIJzEpgxLMcwR0DLOGCMweTjNcYmAqjhjisDEtcriaRZx
|
|
||||||
hva8G+15J32YwqlYRsUyKpZTsUjFcioWqVhOxSIVy6lYRsUyKpZTsUjFcioWqVhOxSIVy6lYRsUyKpZT
|
|
||||||
sUjFcioWqVhOxSIVy6lY5icp1h9BvVgIqF4sBGYU3vTWEQEtQm9uCwRUL9YTEkpqxUJA9WIhoDeKhQSe
|
|
||||||
45a6uwMSqhWrekECp3qxkMBbxbpULxYCuq8VC4GJxWpsEFC9WAhMrVhnBFQv1vn+Uv1BmAgoPgizOfp+
|
|
||||||
+NXXiQ+p7G8QUP1BmAio9iDM5ICEstqDMBHAGw/CREJvPAgTCbzxIEwktA4n0SxPSGAbH1I5Ctfx1oMw
|
|
||||||
EcEiPKSylb9e6j/VH4SJwMQHYXbDWt2v4owJAlN/ECYCKsJS9FAwp63JpD3vTnvejYplVCzz3yiWPrBq
|
|
||||||
VCynOxapWE7FIhXLqVhGxTIqlvmIYulnLFKxjO5YRsVyKhapWE7FIhXLqVhGxTIqltFfkBoVy+mORSqW
|
|
||||||
U7FIxXIqllGxjIplPqJY+hmL6sWaB8UkKBDQbIqAcgQmR0DTGQIqwpeYxhnz//+MGQLz/oz4JeKMyX88
|
|
||||||
4/21qi33e2tV+xKz2lIgMLUXxNN8d8b7axWvY3r1EpSN6wu3FQLa9ZHAzQCBGd8ggs4eAVVNJNAoENBD
|
|
||||||
eMH1+AEJJWFGd4MAnncITImEHjoIKDkhgYcCATXjdWxvkVD1iAQOQwQ0CNfxNENgwkm8rNoI4CZHQKc4
|
|
||||||
o43ATMJpttYIaBNm3GYITBcJDY4IqIgz9GEKow9TkD6l41Qso2IZFcupWKRiORWLVCynYpGK5VQso2IZ
|
|
||||||
FcupWKRiORWLVCynYpGK5VQso2IZFcupWKRiORWLVCynYpGK5VQs85MUC0/ENGX77kKzRECbIZLvGneN
|
|
||||||
EQKTNBBCb4uAyg4SaBcI6BRecJfEZ5mmf82wSf0VAtogMHMEdOohoDQ+Z7RAQJ0NEto0kVAZnjO6GyOg
|
|
||||||
+EzW+zjjLpzEwzKcZu2ZrIcwo9FFYKYtRNCJz31ddZFAM0Ng+q/e0m//GZ/J+lCEpehe4YmYZrrCMzNh
|
|
||||||
PUFA8Vmm69qzTOfxOaPx+ZxxxipHQKP4AM/4TNb6jPCc0fpzX6dIqPa81Hl4zuio9izT8GzZ2vNSN9P4
|
|
||||||
3Nfas0zj82vjjM04fInac1/jWtWel7pEYIpwmrVnssbnpa5nCEzt2bLxLc3jDNy5nLYmk/a8O+15NyqW
|
|
||||||
UbHMf6NY+sCqUbGc7likYjkVi1Qsp2IZFcuoWOYjiqWfsUjFMrpjGRXLqVikYjkVi1Qs96sUS3+PZVQs
|
|
||||||
pzsWqVhOxSIVy6lYRsUyKpZRscwPKVY/mK63FzYTBJQskFCFwJQIaDlGQJMwY50joOEKCZVDJDRHQMsU
|
|
||||||
ASUIzBQBDZcIaD5CAsMCAa0SJJRskNBkgATGcSmqcB2DHIGJa5WF09zEtRpVSGiFwBThNFcZAkrDcm9m
|
|
||||||
CEztPQ9r1c/jjCs8etX83Uf3vpIgoA94dG96RELx8cCDFQKKj+5txEf3HmuP7t0jgR/y6N5wHefao3vD
|
|
||||||
Sbz16N5L+//Fo3tH8dG9ee3Rvbh1Ge15J+15d/GHmfjNUx+mcCqWUbGcikUqllOxSMVyKpZRsYyKZVQs
|
|
||||||
o2I5FYtULKdikYrlVCyjYhkVy6hYRsVyKhapWE7FIhXLqVhGxTIqllGxzA8p1pegbHy+cFshoH0PCVwP
|
|
||||||
EJjxNSJo7xFQFWY0CgT02ERC4wcklIQZ3Q0CeNkhMCUSemgjoOSEBB4LBNSM17G7QULVExI4DhFQ/xEJ
|
|
||||||
PMUZn08viGAVTvMmR0CnOKOFwExukUBzjYA2LSRwmyEwnbDcg7BWX4qwFK2rKiiy9EJWIKD5FAlNEZg8
|
|
||||||
fInJHAG9O6MML0inJRLKEdBkhoDmCExtxgQB5WFGGWdk8Trm8TTfX6v3ZqRxxizOyBFQbcYEgYnvRxbX
|
|
||||||
ahaWIoszqrhWtfcjvqUT3LmctiaTtiY77Xk3KpZRsYyKZVQs988olj4JbVQspzsWqVhOxSIVy6lYRsUy
|
|
||||||
Kpb5iGLpZyxSsYzuWEbFcioWqVhOxSIVy/0qxdLfYxkVy+mORSqWU7FIxXIqllGxjIplPqJY+hmL6sU6
|
|
||||||
ni7Ne+0LnTkCWo+Q0Pj74VdfJ0VAgzUCKsOMXoGA9n0klO6RUNZBAsMlAjiuEJh4HfsBAsq2SGBfIKBe
|
|
||||||
vI5VOIl2eUACmwQBjcN1HOKM9ja8IVVYik7+eqn/tI0z+gjMtIsE+gsEtIgzJgjMEAmNw1qdirAU/as/
|
|
||||||
grjn/XqBgOp73hGYUdiP3joioEXY0n5bIKD6nvcnJJTU9rwjgK/1Pe9I6I0970jgOd4b7g5IqLbnvXpB
|
|
||||||
AqchAuqF63hrz/ulVbg3fM4R0H28/zQRmLjnvbFBQHHP+3WKwMTvOf0zAtKHKYw+TGH0KR2nYpGK5VQs
|
|
||||||
UrGcimVULKNiGRXLqFhOxSIVy6lYpGI5FcuoWEbFMiqWUbGcikUqllOx6H9SrPj/tlaxXlGxSHcsp2KR
|
|
||||||
iuVULKNimXqxdsE8PgN0joCW8TmjKQITH+A5XiKgOGNYIKBNfIBntkZC8VmmSYUAtgsEZoaENrXnvq6Q
|
|
||||||
wKZAQMN4HYtwEv35BgnUnvuahhds44x+OIldGU5zkCOgVW25EZg8nOYorNUuPi91MEVg4lql8TSLOOMK
|
|
||||||
T8Q0kwOemQmnDAEN10jgvEJgFmdEsB0goCzMOOQIqF17zmh47muzCjM28TmjQwR0niCgzhYJVeE5o+3a
|
|
||||||
s0zjs2WH4YGq91l4lmm/9izTcB2156Xeh5NoJuFZpqf4TNZemHHeITCz8FjXfXwEbnxe6qlEYLZhueMz
|
|
||||||
WZtFWIratmJtTTba8+60592oWEbFMiqWUbHcP6NY+iS0UbGc7likYjkVi1Qsp2IZFcuoWOYjiqWfsUjF
|
|
||||||
MrpjGRXLqVikYjkVi1Qs96sUS3+PZVQspzsWqVhOxSIVy6lYRsUy9WLlQRHhuMHhVxAYHH4FgcFhg8MO
|
|
||||||
xw0Ov4LA4bjBYYPDDscNDr+CwOE44ajDcYPDDsdfQWBw+BUEBocNDjscNzjscPwVBAaHDQ6/goBw1OTv
|
|
||||||
PhP65gOeCX1AQPGZ0HfvPxM6PEv5hzwT+owEas+Ebnz8M6GfZwhMfNjyu8+EPn/8M6Fv6s+ERkL/xjOh
|
|
||||||
cesy2vNO2vPu4g8z8ZunPkzhVCyjYjkVi1Qsp2KRiuVULKNiGRXLqFhGxXIqFqlYTsUiFcupWEbFMiqW
|
|
||||||
UbGMiuVULFKxnIpFKpZTsYyKZVQso2KZH1Is/D4jM+80LrRKBLQZIoHmCIFJmoigv0FAZZjRKRDQqYuE
|
|
||||||
kvArnu7TMGOwQkBrBGaOgI59BJSFX8p1KhBQJ17HuoWEyvhbosYIaBiu4xxnNGq/GayHAJq139oVZ/QQ
|
|
||||||
mGk4zW7tt3aFGa0JAhPXKv5Grfv8ckaj93+veSuXxEAIUwAAAABJRU5ErkJggg==
|
|
||||||
</value>
|
|
||||||
</data>
|
|
||||||
</root>
|
</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;
|
tileModeCB.SelectedItem = GX2.GX2TileMode.MODE_DEFAULT;
|
||||||
formatComboBox.SelectedItem = GX2.GX2SurfaceFormat.T_BC1_SRGB;
|
formatComboBox.SelectedItem = GX2.GX2SurfaceFormat.T_BC1_SRGB;
|
||||||
|
|
||||||
|
MipmapNum.Maximum = 13;
|
||||||
|
|
||||||
IsLoaded = true;
|
IsLoaded = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -280,8 +282,8 @@ namespace FirstPlugin
|
|||||||
|
|
||||||
SetupSettings(SelectedTexSettings);
|
SetupSettings(SelectedTexSettings);
|
||||||
|
|
||||||
MipmapNum.Maximum = STGenericTexture.GenerateTotalMipCount(
|
// MipmapNum.Maximum = STGenericTexture.GenerateTotalMipCount(
|
||||||
SelectedTexSettings.TexWidth, SelectedTexSettings.TexHeight) + 1;
|
// SelectedTexSettings.TexWidth, SelectedTexSettings.TexHeight) + 1;
|
||||||
|
|
||||||
//Force the mip counter to be the selected mip counter
|
//Force the mip counter to be the selected mip counter
|
||||||
//Some textures like bflim (used for UI) only have 1
|
//Some textures like bflim (used for UI) only have 1
|
||||||
|
@ -392,7 +392,7 @@ namespace FirstPlugin
|
|||||||
Formats.Add(typeof(IGA_PAK));
|
Formats.Add(typeof(IGA_PAK));
|
||||||
Formats.Add(typeof(MKAGPDX_Model));
|
Formats.Add(typeof(MKAGPDX_Model));
|
||||||
Formats.Add(typeof(GFBMDL));
|
Formats.Add(typeof(GFBMDL));
|
||||||
// Formats.Add(typeof(GFBANM));
|
// Formats.Add(typeof(GFBANM));
|
||||||
Formats.Add(typeof(GFBANMCFG));
|
Formats.Add(typeof(GFBANMCFG));
|
||||||
Formats.Add(typeof(Turbo.Course_MapCamera_bin));
|
Formats.Add(typeof(Turbo.Course_MapCamera_bin));
|
||||||
Formats.Add(typeof(SDF));
|
Formats.Add(typeof(SDF));
|
||||||
@ -443,7 +443,7 @@ namespace FirstPlugin
|
|||||||
Formats.Add(typeof(PunchOutWii.PO_DICT));
|
Formats.Add(typeof(PunchOutWii.PO_DICT));
|
||||||
Formats.Add(typeof(LM2_ARCADE_Model));
|
Formats.Add(typeof(LM2_ARCADE_Model));
|
||||||
Formats.Add(typeof(NLG_NLOC));
|
Formats.Add(typeof(NLG_NLOC));
|
||||||
Formats.Add(typeof(NLG_PCK));
|
Formats.Add(typeof(PCK));
|
||||||
Formats.Add(typeof(NLG.StrikersSAnim));
|
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.
|
- exelix for BYAML, SARC and KCL library.
|
||||||
- Syroot for helpful IO extensions and libraries.
|
- Syroot for helpful IO extensions and libraries.
|
||||||
- GDKChan for PICA shaders stuff used with BCRES, structs for BCRES, and some DDS decode methods.
|
- 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.
|
- MelonSpeedruns for Switch Toolbox logo.
|
||||||
- BrawlBox team for brawl libraries used for BRRES parsing.
|
- BrawlBox team for brawl libraries used for BRRES parsing.
|
||||||
- Sage of Mirrors for SuperBMDLib.
|
- Sage of Mirrors for SuperBMDLib.
|
||||||
|
@ -5,6 +5,7 @@ using System.IO;
|
|||||||
using System.IO.Compression;
|
using System.IO.Compression;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Toolbox.Library.IO;
|
using Toolbox.Library.IO;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
namespace Toolbox.Library
|
namespace Toolbox.Library
|
||||||
{
|
{
|
||||||
@ -13,7 +14,7 @@ namespace Toolbox.Library
|
|||||||
public int Alignment = 0;
|
public int Alignment = 0;
|
||||||
|
|
||||||
public string[] Description { get; set; } = new string[] { "Yaz0" };
|
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"; }
|
public override string ToString() { return "Yaz0"; }
|
||||||
|
|
||||||
@ -29,12 +30,250 @@ namespace Toolbox.Library
|
|||||||
|
|
||||||
public Stream Decompress(Stream stream)
|
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)
|
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.CalculateTangentSpace;
|
||||||
Flags |= PostProcessSteps.GenerateNormals;*/
|
Flags |= PostProcessSteps.GenerateNormals;*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
scene = Importer.ImportFile(FileName, settings.GetFlags());
|
scene = Importer.ImportFile(FileName, settings.GetFlags());
|
||||||
|
|
||||||
if (Utils.GetExtension(FileName) == ".dae")
|
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("nw4f_root") ||
|
||||||
Name.Contains("skl_root") || Name.Contains("all_root") || Name.Contains("_root") || Name.Contains("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
|
//Root set saved by this tool
|
||||||
//Get our root manually as it's a child to this
|
//Get our root manually as it's a child to this
|
||||||
bool IsRootSkeleton = Name == "skeleton_root";
|
bool IsRootSkeleton = Name == "skeleton_root";
|
||||||
|
@ -26,6 +26,8 @@ namespace Toolbox.Library
|
|||||||
public bool FlipTexCoordsVertical = true;
|
public bool FlipTexCoordsVertical = true;
|
||||||
public bool OnlyExportRiggedBones = false;
|
public bool OnlyExportRiggedBones = false;
|
||||||
|
|
||||||
|
public bool AddLeafBones = false;
|
||||||
|
|
||||||
public Version FileVersion = new Version();
|
public Version FileVersion = new Version();
|
||||||
|
|
||||||
public ProgramPreset Preset = ProgramPreset.NONE;
|
public ProgramPreset Preset = ProgramPreset.NONE;
|
||||||
|
@ -34,24 +34,28 @@
|
|||||||
this.chkFlipUvsVertical = new Toolbox.Library.Forms.STCheckBox();
|
this.chkFlipUvsVertical = new Toolbox.Library.Forms.STCheckBox();
|
||||||
this.chkOldExporter = new Toolbox.Library.Forms.STCheckBox();
|
this.chkOldExporter = new Toolbox.Library.Forms.STCheckBox();
|
||||||
this.chkVertexColors = new Toolbox.Library.Forms.STCheckBox();
|
this.chkVertexColors = new Toolbox.Library.Forms.STCheckBox();
|
||||||
|
this.chkExportRiggedBonesOnly = new Toolbox.Library.Forms.STCheckBox();
|
||||||
this.contentContainer.SuspendLayout();
|
this.contentContainer.SuspendLayout();
|
||||||
this.SuspendLayout();
|
this.SuspendLayout();
|
||||||
//
|
//
|
||||||
// contentContainer
|
// contentContainer
|
||||||
//
|
//
|
||||||
|
this.contentContainer.Controls.Add(this.chkExportRiggedBonesOnly);
|
||||||
this.contentContainer.Controls.Add(this.chkVertexColors);
|
this.contentContainer.Controls.Add(this.chkVertexColors);
|
||||||
this.contentContainer.Controls.Add(this.chkOldExporter);
|
this.contentContainer.Controls.Add(this.chkOldExporter);
|
||||||
this.contentContainer.Controls.Add(this.chkFlipUvsVertical);
|
this.contentContainer.Controls.Add(this.chkFlipUvsVertical);
|
||||||
this.contentContainer.Controls.Add(this.stButton2);
|
this.contentContainer.Controls.Add(this.stButton2);
|
||||||
this.contentContainer.Controls.Add(this.stButton1);
|
this.contentContainer.Controls.Add(this.stButton1);
|
||||||
this.contentContainer.Controls.Add(this.exportTexturesChkBox);
|
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.exportTexturesChkBox, 0);
|
||||||
this.contentContainer.Controls.SetChildIndex(this.stButton1, 0);
|
this.contentContainer.Controls.SetChildIndex(this.stButton1, 0);
|
||||||
this.contentContainer.Controls.SetChildIndex(this.stButton2, 0);
|
this.contentContainer.Controls.SetChildIndex(this.stButton2, 0);
|
||||||
this.contentContainer.Controls.SetChildIndex(this.chkFlipUvsVertical, 0);
|
this.contentContainer.Controls.SetChildIndex(this.chkFlipUvsVertical, 0);
|
||||||
this.contentContainer.Controls.SetChildIndex(this.chkOldExporter, 0);
|
this.contentContainer.Controls.SetChildIndex(this.chkOldExporter, 0);
|
||||||
this.contentContainer.Controls.SetChildIndex(this.chkVertexColors, 0);
|
this.contentContainer.Controls.SetChildIndex(this.chkVertexColors, 0);
|
||||||
|
this.contentContainer.Controls.SetChildIndex(this.chkExportRiggedBonesOnly, 0);
|
||||||
//
|
//
|
||||||
// exportTexturesChkBox
|
// exportTexturesChkBox
|
||||||
//
|
//
|
||||||
@ -70,7 +74,7 @@
|
|||||||
//
|
//
|
||||||
this.stButton1.DialogResult = System.Windows.Forms.DialogResult.Cancel;
|
this.stButton1.DialogResult = System.Windows.Forms.DialogResult.Cancel;
|
||||||
this.stButton1.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
|
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.Name = "stButton1";
|
||||||
this.stButton1.Size = new System.Drawing.Size(75, 23);
|
this.stButton1.Size = new System.Drawing.Size(75, 23);
|
||||||
this.stButton1.TabIndex = 12;
|
this.stButton1.TabIndex = 12;
|
||||||
@ -81,7 +85,7 @@
|
|||||||
//
|
//
|
||||||
this.stButton2.DialogResult = System.Windows.Forms.DialogResult.OK;
|
this.stButton2.DialogResult = System.Windows.Forms.DialogResult.OK;
|
||||||
this.stButton2.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
|
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.Name = "stButton2";
|
||||||
this.stButton2.Size = new System.Drawing.Size(75, 23);
|
this.stButton2.Size = new System.Drawing.Size(75, 23);
|
||||||
this.stButton2.TabIndex = 13;
|
this.stButton2.TabIndex = 13;
|
||||||
@ -91,7 +95,7 @@
|
|||||||
// chkFlipUvsVertical
|
// chkFlipUvsVertical
|
||||||
//
|
//
|
||||||
this.chkFlipUvsVertical.AutoSize = true;
|
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.Name = "chkFlipUvsVertical";
|
||||||
this.chkFlipUvsVertical.Size = new System.Drawing.Size(101, 17);
|
this.chkFlipUvsVertical.Size = new System.Drawing.Size(101, 17);
|
||||||
this.chkFlipUvsVertical.TabIndex = 14;
|
this.chkFlipUvsVertical.TabIndex = 14;
|
||||||
@ -102,7 +106,7 @@
|
|||||||
// chkOldExporter
|
// chkOldExporter
|
||||||
//
|
//
|
||||||
this.chkOldExporter.AutoSize = true;
|
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.Name = "chkOldExporter";
|
||||||
this.chkOldExporter.Size = new System.Drawing.Size(200, 17);
|
this.chkOldExporter.Size = new System.Drawing.Size(200, 17);
|
||||||
this.chkOldExporter.TabIndex = 15;
|
this.chkOldExporter.TabIndex = 15;
|
||||||
@ -115,7 +119,7 @@
|
|||||||
this.chkVertexColors.AutoSize = true;
|
this.chkVertexColors.AutoSize = true;
|
||||||
this.chkVertexColors.Checked = true;
|
this.chkVertexColors.Checked = true;
|
||||||
this.chkVertexColors.CheckState = System.Windows.Forms.CheckState.Checked;
|
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.Name = "chkVertexColors";
|
||||||
this.chkVertexColors.Size = new System.Drawing.Size(121, 17);
|
this.chkVertexColors.Size = new System.Drawing.Size(121, 17);
|
||||||
this.chkVertexColors.TabIndex = 16;
|
this.chkVertexColors.TabIndex = 16;
|
||||||
@ -123,11 +127,23 @@
|
|||||||
this.chkVertexColors.UseVisualStyleBackColor = true;
|
this.chkVertexColors.UseVisualStyleBackColor = true;
|
||||||
this.chkVertexColors.CheckedChanged += new System.EventHandler(this.chkVertexColors_CheckedChanged);
|
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
|
// ExportModelSettings
|
||||||
//
|
//
|
||||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
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.Name = "ExportModelSettings";
|
||||||
this.Text = "Export Settings";
|
this.Text = "Export Settings";
|
||||||
this.contentContainer.ResumeLayout(false);
|
this.contentContainer.ResumeLayout(false);
|
||||||
@ -144,5 +160,6 @@
|
|||||||
private STCheckBox chkFlipUvsVertical;
|
private STCheckBox chkFlipUvsVertical;
|
||||||
protected STCheckBox chkOldExporter;
|
protected STCheckBox chkOldExporter;
|
||||||
private STCheckBox chkVertexColors;
|
private STCheckBox chkVertexColors;
|
||||||
|
private STCheckBox chkExportRiggedBonesOnly;
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -37,5 +37,14 @@ namespace Toolbox.Library.Forms
|
|||||||
private void chkVertexColors_CheckedChanged(object sender, EventArgs e) {
|
private void chkVertexColors_CheckedChanged(object sender, EventArgs e) {
|
||||||
Settings.UseVertexColors = chkVertexColors.Checked;
|
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;
|
private bool isYAML;
|
||||||
public 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>
|
/// </summary>
|
||||||
private void InitializeComponent()
|
private void InitializeComponent()
|
||||||
{
|
{
|
||||||
this.gL_ControlLegacy2D1 = new OpenTK.GLControl();
|
|
||||||
this.scaleYUD = new Toolbox.Library.Forms.NumericUpDownFloat();
|
this.scaleYUD = new Toolbox.Library.Forms.NumericUpDownFloat();
|
||||||
this.transYUD = new Toolbox.Library.Forms.NumericUpDownFloat();
|
this.transYUD = new Toolbox.Library.Forms.NumericUpDownFloat();
|
||||||
this.transXUD = new Toolbox.Library.Forms.NumericUpDownFloat();
|
this.transXUD = new Toolbox.Library.Forms.NumericUpDownFloat();
|
||||||
@ -48,6 +47,7 @@
|
|||||||
this.stButton1 = new Toolbox.Library.Forms.STButton();
|
this.stButton1 = new Toolbox.Library.Forms.STButton();
|
||||||
this.splitter1 = new System.Windows.Forms.Splitter();
|
this.splitter1 = new System.Windows.Forms.Splitter();
|
||||||
this.stPanel3 = new Toolbox.Library.Forms.STPanel();
|
this.stPanel3 = new Toolbox.Library.Forms.STPanel();
|
||||||
|
this.uvViewport1 = new Toolbox.Library.Forms.UVViewport();
|
||||||
((System.ComponentModel.ISupportInitialize)(this.scaleYUD)).BeginInit();
|
((System.ComponentModel.ISupportInitialize)(this.scaleYUD)).BeginInit();
|
||||||
((System.ComponentModel.ISupportInitialize)(this.transYUD)).BeginInit();
|
((System.ComponentModel.ISupportInitialize)(this.transYUD)).BeginInit();
|
||||||
((System.ComponentModel.ISupportInitialize)(this.transXUD)).BeginInit();
|
((System.ComponentModel.ISupportInitialize)(this.transXUD)).BeginInit();
|
||||||
@ -57,21 +57,6 @@
|
|||||||
this.stPanel3.SuspendLayout();
|
this.stPanel3.SuspendLayout();
|
||||||
this.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
|
// scaleYUD
|
||||||
//
|
//
|
||||||
this.scaleYUD.DecimalPlaces = 5;
|
this.scaleYUD.DecimalPlaces = 5;
|
||||||
@ -209,6 +194,7 @@
|
|||||||
this.drawableContainerCB.BorderStyle = System.Windows.Forms.ButtonBorderStyle.Solid;
|
this.drawableContainerCB.BorderStyle = System.Windows.Forms.ButtonBorderStyle.Solid;
|
||||||
this.drawableContainerCB.ButtonColor = System.Drawing.Color.Empty;
|
this.drawableContainerCB.ButtonColor = System.Drawing.Color.Empty;
|
||||||
this.drawableContainerCB.FormattingEnabled = true;
|
this.drawableContainerCB.FormattingEnabled = true;
|
||||||
|
this.drawableContainerCB.IsReadOnly = false;
|
||||||
this.drawableContainerCB.Location = new System.Drawing.Point(294, 7);
|
this.drawableContainerCB.Location = new System.Drawing.Point(294, 7);
|
||||||
this.drawableContainerCB.Name = "drawableContainerCB";
|
this.drawableContainerCB.Name = "drawableContainerCB";
|
||||||
this.drawableContainerCB.Size = new System.Drawing.Size(146, 21);
|
this.drawableContainerCB.Size = new System.Drawing.Size(146, 21);
|
||||||
@ -223,6 +209,7 @@
|
|||||||
this.meshesCB.BorderStyle = System.Windows.Forms.ButtonBorderStyle.Solid;
|
this.meshesCB.BorderStyle = System.Windows.Forms.ButtonBorderStyle.Solid;
|
||||||
this.meshesCB.ButtonColor = System.Drawing.Color.Empty;
|
this.meshesCB.ButtonColor = System.Drawing.Color.Empty;
|
||||||
this.meshesCB.FormattingEnabled = true;
|
this.meshesCB.FormattingEnabled = true;
|
||||||
|
this.meshesCB.IsReadOnly = false;
|
||||||
this.meshesCB.Location = new System.Drawing.Point(294, 34);
|
this.meshesCB.Location = new System.Drawing.Point(294, 34);
|
||||||
this.meshesCB.Name = "meshesCB";
|
this.meshesCB.Name = "meshesCB";
|
||||||
this.meshesCB.Size = new System.Drawing.Size(146, 21);
|
this.meshesCB.Size = new System.Drawing.Size(146, 21);
|
||||||
@ -280,6 +267,7 @@
|
|||||||
this.textureCB.BorderStyle = System.Windows.Forms.ButtonBorderStyle.Solid;
|
this.textureCB.BorderStyle = System.Windows.Forms.ButtonBorderStyle.Solid;
|
||||||
this.textureCB.ButtonColor = System.Drawing.Color.Empty;
|
this.textureCB.ButtonColor = System.Drawing.Color.Empty;
|
||||||
this.textureCB.FormattingEnabled = true;
|
this.textureCB.FormattingEnabled = true;
|
||||||
|
this.textureCB.IsReadOnly = false;
|
||||||
this.textureCB.Location = new System.Drawing.Point(446, 34);
|
this.textureCB.Location = new System.Drawing.Point(446, 34);
|
||||||
this.textureCB.Name = "textureCB";
|
this.textureCB.Name = "textureCB";
|
||||||
this.textureCB.Size = new System.Drawing.Size(156, 21);
|
this.textureCB.Size = new System.Drawing.Size(156, 21);
|
||||||
@ -293,6 +281,7 @@
|
|||||||
this.comboBox1.BorderStyle = System.Windows.Forms.ButtonBorderStyle.Solid;
|
this.comboBox1.BorderStyle = System.Windows.Forms.ButtonBorderStyle.Solid;
|
||||||
this.comboBox1.ButtonColor = System.Drawing.Color.Empty;
|
this.comboBox1.ButtonColor = System.Drawing.Color.Empty;
|
||||||
this.comboBox1.FormattingEnabled = true;
|
this.comboBox1.FormattingEnabled = true;
|
||||||
|
this.comboBox1.IsReadOnly = false;
|
||||||
this.comboBox1.Location = new System.Drawing.Point(550, 7);
|
this.comboBox1.Location = new System.Drawing.Point(550, 7);
|
||||||
this.comboBox1.Name = "comboBox1";
|
this.comboBox1.Name = "comboBox1";
|
||||||
this.comboBox1.Size = new System.Drawing.Size(52, 21);
|
this.comboBox1.Size = new System.Drawing.Size(52, 21);
|
||||||
@ -312,7 +301,7 @@
|
|||||||
// btnApplyTransform
|
// btnApplyTransform
|
||||||
//
|
//
|
||||||
this.btnApplyTransform.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
|
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.Name = "btnApplyTransform";
|
||||||
this.btnApplyTransform.Size = new System.Drawing.Size(119, 23);
|
this.btnApplyTransform.Size = new System.Drawing.Size(119, 23);
|
||||||
this.btnApplyTransform.TabIndex = 9;
|
this.btnApplyTransform.TabIndex = 9;
|
||||||
@ -357,13 +346,24 @@
|
|||||||
//
|
//
|
||||||
// stPanel3
|
// stPanel3
|
||||||
//
|
//
|
||||||
this.stPanel3.Controls.Add(this.gL_ControlLegacy2D1);
|
this.stPanel3.Controls.Add(this.uvViewport1);
|
||||||
this.stPanel3.Dock = System.Windows.Forms.DockStyle.Fill;
|
this.stPanel3.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||||
this.stPanel3.Location = new System.Drawing.Point(162, 70);
|
this.stPanel3.Location = new System.Drawing.Point(162, 70);
|
||||||
this.stPanel3.Name = "stPanel3";
|
this.stPanel3.Name = "stPanel3";
|
||||||
this.stPanel3.Size = new System.Drawing.Size(443, 454);
|
this.stPanel3.Size = new System.Drawing.Size(443, 454);
|
||||||
this.stPanel3.TabIndex = 5;
|
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
|
// UVEditor
|
||||||
//
|
//
|
||||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||||
@ -391,7 +391,6 @@
|
|||||||
private STPanel stPanel1;
|
private STPanel stPanel1;
|
||||||
private STLabel stLabel1;
|
private STLabel stLabel1;
|
||||||
private Toolbox.Library.Forms.STComboBox comboBox1;
|
private Toolbox.Library.Forms.STComboBox comboBox1;
|
||||||
private OpenTK.GLControl gL_ControlLegacy2D1;
|
|
||||||
private Toolbox.Library.Forms.STComboBox textureCB;
|
private Toolbox.Library.Forms.STComboBox textureCB;
|
||||||
private STLabel stLabel2;
|
private STLabel stLabel2;
|
||||||
private NumericUpDownFloat scaleXUD;
|
private NumericUpDownFloat scaleXUD;
|
||||||
@ -408,5 +407,6 @@
|
|||||||
private STPanel stPanel3;
|
private STPanel stPanel3;
|
||||||
private STButton stButton1;
|
private STButton stButton1;
|
||||||
private STComboBox drawableContainerCB;
|
private STComboBox drawableContainerCB;
|
||||||
|
private UVViewport uvViewport1;
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -23,11 +23,13 @@ namespace Toolbox.Library.Forms
|
|||||||
comboBox1.Items.Add(2);
|
comboBox1.Items.Add(2);
|
||||||
|
|
||||||
comboBox1.SelectedIndex = 0;
|
comboBox1.SelectedIndex = 0;
|
||||||
barSlider1.Value = 0;
|
barSlider1.Value = barSlider1.Maximum;
|
||||||
}
|
}
|
||||||
|
|
||||||
public class ActiveTexture
|
public class ActiveTexture
|
||||||
{
|
{
|
||||||
|
public STGenericMatTexture MatTexture;
|
||||||
|
|
||||||
public Vector2 UVScale = new Vector2(1);
|
public Vector2 UVScale = new Vector2(1);
|
||||||
public Vector2 UVTranslate = new Vector2(0);
|
public Vector2 UVTranslate = new Vector2(0);
|
||||||
public float UVRotate = 0;
|
public float UVRotate = 0;
|
||||||
@ -46,7 +48,7 @@ namespace Toolbox.Library.Forms
|
|||||||
}
|
}
|
||||||
public ActiveTexture activeTexture = new ActiveTexture();
|
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 int UvChannelIndex = 0;
|
||||||
|
|
||||||
public List<STGenericObject> Objects = new List<STGenericObject>();
|
public List<STGenericObject> Objects = new List<STGenericObject>();
|
||||||
@ -58,10 +60,7 @@ namespace Toolbox.Library.Forms
|
|||||||
{
|
{
|
||||||
List<STGenericObject> objects = new List<STGenericObject>();
|
List<STGenericObject> objects = new List<STGenericObject>();
|
||||||
for (int i = 0; i < Objects.Count; i++)
|
for (int i = 0; i < Objects.Count; i++)
|
||||||
{
|
objects.Add(Objects[i]);
|
||||||
if (Objects[i].GetMaterial() == ActiveMaterial)
|
|
||||||
objects.Add(Objects[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
return objects;
|
return objects;
|
||||||
}
|
}
|
||||||
@ -84,11 +83,11 @@ namespace Toolbox.Library.Forms
|
|||||||
drawableContainerCB.SelectedIndex = 0;
|
drawableContainerCB.SelectedIndex = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int texid;
|
||||||
|
|
||||||
bool IsSRTLoaded = false;
|
bool IsSRTLoaded = false;
|
||||||
public void Reset()
|
public void Reset()
|
||||||
{
|
{
|
||||||
barSlider1.Value = (int)(brightness * 100);
|
|
||||||
|
|
||||||
scaleXUD.Value = 1;
|
scaleXUD.Value = 1;
|
||||||
scaleYUD.Value = 1;
|
scaleYUD.Value = 1;
|
||||||
transXUD.Value = 0;
|
transXUD.Value = 0;
|
||||||
@ -110,212 +109,8 @@ namespace Toolbox.Library.Forms
|
|||||||
meshesCB.SelectedIndex = 0;
|
meshesCB.SelectedIndex = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int texid;
|
private void BindTexture()
|
||||||
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 = 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)
|
if (activeTexture.TextureIndex != -1)
|
||||||
{
|
{
|
||||||
//Draws a textured plan for our uvs to show on
|
//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.TextureWrapT, (int)STGenericMatTexture.wrapmode[activeTexture.wrapModeT]);
|
||||||
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)STGenericMatTexture.minfilter[activeTexture.MinFilter]);
|
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)STGenericMatTexture.minfilter[activeTexture.MinFilter]);
|
||||||
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)STGenericMatTexture.magfilter[activeTexture.MagFilter]);
|
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)
|
private void comboBox2_SelectedIndexChanged(object sender, EventArgs e)
|
||||||
@ -439,6 +137,8 @@ namespace Toolbox.Library.Forms
|
|||||||
transXUD.Value = (decimal)activeTexture.UVTranslate.X;
|
transXUD.Value = (decimal)activeTexture.UVTranslate.X;
|
||||||
transYUD.Value = (decimal)activeTexture.UVTranslate.Y;
|
transYUD.Value = (decimal)activeTexture.UVTranslate.Y;
|
||||||
|
|
||||||
|
uvViewport1.ActiveTextureMap = activeTexture.MatTexture;
|
||||||
|
|
||||||
var texture = Textures[activeTexture.TextureIndex];
|
var texture = Textures[activeTexture.TextureIndex];
|
||||||
|
|
||||||
if (texture.RenderableTex == null)
|
if (texture.RenderableTex == null)
|
||||||
@ -448,7 +148,7 @@ namespace Toolbox.Library.Forms
|
|||||||
activeTexture.Width = texture.Width;
|
activeTexture.Width = texture.Width;
|
||||||
activeTexture.Height = texture.Height;
|
activeTexture.Height = texture.Height;
|
||||||
|
|
||||||
gL_ControlLegacy2D1.Invalidate();
|
uvViewport1.UpdateViewport();
|
||||||
|
|
||||||
IsSRTLoaded = true;
|
IsSRTLoaded = true;
|
||||||
}
|
}
|
||||||
@ -458,8 +158,8 @@ namespace Toolbox.Library.Forms
|
|||||||
{
|
{
|
||||||
if (comboBox1.SelectedIndex >= 0)
|
if (comboBox1.SelectedIndex >= 0)
|
||||||
{
|
{
|
||||||
UvChannelIndex = comboBox1.SelectedIndex;
|
uvViewport1.UvChannelIndex = comboBox1.SelectedIndex;
|
||||||
gL_ControlLegacy2D1.Invalidate();
|
uvViewport1.UpdateViewport();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -470,7 +170,8 @@ namespace Toolbox.Library.Forms
|
|||||||
private void barSlider1_ValueChanged(object sender, EventArgs e)
|
private void barSlider1_ValueChanged(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
brightness = (float)barSlider1.Value / 100;
|
brightness = (float)barSlider1.Value / 100;
|
||||||
gL_ControlLegacy2D1.Invalidate();
|
uvViewport1.Brightness = brightness;
|
||||||
|
uvViewport1.UpdateViewport();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnNumbicValueSRT_ValueChanged(object sender, EventArgs e)
|
private void OnNumbicValueSRT_ValueChanged(object sender, EventArgs e)
|
||||||
@ -494,18 +195,16 @@ namespace Toolbox.Library.Forms
|
|||||||
transXUD.Value = 0;
|
transXUD.Value = 0;
|
||||||
transYUD.Value = 0;
|
transYUD.Value = 0;
|
||||||
|
|
||||||
gL_ControlLegacy2D1.Invalidate();
|
uvViewport1.UpdateViewport();
|
||||||
}
|
|
||||||
|
|
||||||
private void gL_ControlLegacy2D1_Resize(object sender, EventArgs e)
|
|
||||||
{
|
|
||||||
gL_ControlLegacy2D1.Invalidate();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void meshesCB_SelectedIndexChanged(object sender, EventArgs e)
|
private void meshesCB_SelectedIndexChanged(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
if (meshesCB.SelectedIndex >= 0)
|
if (meshesCB.SelectedIndex >= 0)
|
||||||
{
|
{
|
||||||
|
uvViewport1.ActiveObjects.Clear();
|
||||||
|
uvViewport1.ActiveObjects.Add(Objects[meshesCB.SelectedIndex]);
|
||||||
|
|
||||||
ActiveMaterial = Materials[meshesCB.SelectedIndex];
|
ActiveMaterial = Materials[meshesCB.SelectedIndex];
|
||||||
|
|
||||||
ChannelTextures.Clear();
|
ChannelTextures.Clear();
|
||||||
@ -521,6 +220,7 @@ namespace Toolbox.Library.Forms
|
|||||||
|
|
||||||
Textures.Add(texture);
|
Textures.Add(texture);
|
||||||
ActiveTexture tex = new ActiveTexture();
|
ActiveTexture tex = new ActiveTexture();
|
||||||
|
tex.MatTexture = texMap;
|
||||||
tex.TextureIndex = Textures.IndexOf(texture);
|
tex.TextureIndex = Textures.IndexOf(texture);
|
||||||
tex.Width = texture.Width;
|
tex.Width = texture.Width;
|
||||||
tex.Height = texture.Height;
|
tex.Height = texture.Height;
|
||||||
@ -564,9 +264,18 @@ namespace Toolbox.Library.Forms
|
|||||||
for (int m = 0; m < ((IMeshContainer)container.Drawables[i]).Meshes.Count; m++)
|
for (int m = 0; m < ((IMeshContainer)container.Drawables[i]).Meshes.Count; m++)
|
||||||
{
|
{
|
||||||
var mesh = ((IMeshContainer)container.Drawables[i]).Meshes[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();
|
var mat = mesh.GetMaterial();
|
||||||
if (!Materials.Contains(mat))
|
if (!Materials.Contains(mat))
|
||||||
{
|
{
|
||||||
@ -595,7 +304,7 @@ namespace Toolbox.Library.Forms
|
|||||||
|
|
||||||
Reset();
|
Reset();
|
||||||
Refresh();
|
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
|
// uvEditor1
|
||||||
//
|
//
|
||||||
this.uvEditor1.Dock = System.Windows.Forms.DockStyle.Fill;
|
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.Name = "uvEditor1";
|
||||||
this.uvEditor1.Size = new System.Drawing.Size(595, 443);
|
this.uvEditor1.Size = new System.Drawing.Size(595, 468);
|
||||||
this.uvEditor1.TabIndex = 11;
|
this.uvEditor1.TabIndex = 11;
|
||||||
//
|
//
|
||||||
// UVEditorForm
|
// UVEditorForm
|
||||||
|
@ -6,33 +6,125 @@ using System.Threading.Tasks;
|
|||||||
using OpenTK;
|
using OpenTK;
|
||||||
using OpenTK.Graphics.OpenGL;
|
using OpenTK.Graphics.OpenGL;
|
||||||
using System.Drawing;
|
using System.Drawing;
|
||||||
|
using Toolbox.Library.IO;
|
||||||
|
|
||||||
namespace Toolbox.Library.Forms
|
namespace Toolbox.Library.Forms
|
||||||
{
|
{
|
||||||
public class UVViewport : Viewport2D
|
public class UVViewport : Viewport2D
|
||||||
{
|
{
|
||||||
|
public STGenericMatTexture ActiveTextureMap { get; set; }
|
||||||
|
|
||||||
|
public UVViewport()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
public List<STGenericObject> ActiveObjects = new List<STGenericObject>();
|
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 int UvChannelIndex = 0;
|
||||||
|
|
||||||
|
public bool Repeat = true;
|
||||||
|
|
||||||
public float Brightness = 1.0f;
|
public float Brightness = 1.0f;
|
||||||
|
|
||||||
|
public PickableUVMap PickableUVMap = new PickableUVMap();
|
||||||
|
|
||||||
|
public override List<IPickable2DObject> GetPickableObjects()
|
||||||
|
{
|
||||||
|
return new List<IPickable2DObject>() { PickableUVMap };
|
||||||
|
}
|
||||||
|
|
||||||
public override void RenderSceme()
|
public override void RenderSceme()
|
||||||
{
|
{
|
||||||
DrawTexturedPlane(1);
|
GL.PushMatrix();
|
||||||
DrawUVs(ActiveObjects);
|
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);
|
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[] {
|
Vector2[] TexCoords = new Vector2[] {
|
||||||
new Vector2(1,1),
|
new Vector2(1,1),
|
||||||
new Vector2(0,1),
|
new Vector2(0,1),
|
||||||
new Vector2(0,0),
|
new Vector2(0,0),
|
||||||
new Vector2(1,0),
|
new Vector2(1,0),
|
||||||
};
|
};
|
||||||
|
|
||||||
Vector2[] Positions = new Vector2[] {
|
Vector2[] Positions = new Vector2[] {
|
||||||
new Vector2(1,-1),
|
new Vector2(1,-1),
|
||||||
new Vector2(-1,-1),
|
new Vector2(-1,-1),
|
||||||
@ -49,149 +141,44 @@ namespace Toolbox.Library.Forms
|
|||||||
Positions[2] = Positions[2] * scale;
|
Positions[2] = Positions[2] * scale;
|
||||||
Positions[3] = Positions[3] * scale;
|
Positions[3] = Positions[3] * scale;
|
||||||
|
|
||||||
GL.Begin(PrimitiveType.Quads);
|
if (Outlines)
|
||||||
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)
|
|
||||||
{
|
{
|
||||||
int divisions = 4;
|
GL.LineWidth(1);
|
||||||
int lineWidth = 1;
|
GL.Begin(PrimitiveType.LineLoop);
|
||||||
|
GL.Color3(color);
|
||||||
Color uvColor = Color.LightGreen;
|
GL.Vertex2(Positions[0]);
|
||||||
Color gridColor = Color.Black;
|
GL.Vertex2(Positions[1]);
|
||||||
|
GL.Vertex2(Positions[2]);
|
||||||
List<int> f = new List<int>();
|
GL.Vertex2(Positions[3]);
|
||||||
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.End();
|
GL.End();
|
||||||
}
|
}
|
||||||
}
|
else
|
||||||
|
|
||||||
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.Begin(PrimitiveType.Quads);
|
||||||
GL.Vertex2(new Vector2(-bounds, (1.0f / horizontalCount) * i) * scaleUv);
|
GL.Color3(color);
|
||||||
GL.Vertex2(new Vector2(bounds, (1.0f / horizontalCount) * i) * scaleUv);
|
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();
|
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)
|
if (vertices.Count < 3)
|
||||||
return;
|
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[] tanArray = new Vector3[vertices.Count];
|
||||||
Vector3[] bitanArray = new Vector3[vertices.Count];
|
Vector3[] bitanArray = new Vector3[vertices.Count];
|
||||||
|
|
||||||
|
@ -18,6 +18,8 @@ namespace Toolbox.Library
|
|||||||
|
|
||||||
public class STGenericPolygonGroup
|
public class STGenericPolygonGroup
|
||||||
{
|
{
|
||||||
|
public virtual STGenericMaterial Material { get; set; }
|
||||||
|
|
||||||
public int Offset { get; set; }
|
public int Offset { get; set; }
|
||||||
public int MaterialIndex { get; set; }
|
public int MaterialIndex { get; set; }
|
||||||
public int Index { get; set; }
|
public int Index { get; set; }
|
||||||
|
@ -4,6 +4,7 @@ using System.Linq;
|
|||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using OpenTK.Graphics.OpenGL;
|
using OpenTK.Graphics.OpenGL;
|
||||||
|
using OpenTK;
|
||||||
|
|
||||||
namespace Toolbox.Library
|
namespace Toolbox.Library
|
||||||
{
|
{
|
||||||
@ -29,6 +30,13 @@ namespace Toolbox.Library
|
|||||||
NearestMipmapNearest,
|
NearestMipmapNearest,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class STTextureTransform
|
||||||
|
{
|
||||||
|
public Vector2 Scale { get; set; }
|
||||||
|
public float Rotate { get; set; }
|
||||||
|
public Vector2 Translate { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
public class STGenericMatTexture
|
public class STGenericMatTexture
|
||||||
{
|
{
|
||||||
public int mapMode = 0;
|
public int mapMode = 0;
|
||||||
@ -65,6 +73,8 @@ namespace Toolbox.Library
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public virtual STTextureTransform Transform { get; set; }
|
||||||
|
|
||||||
public TextureType Type;
|
public TextureType Type;
|
||||||
|
|
||||||
//An enum for the assumed texture type by sampler
|
//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)
|
public void Write(Syroot.Maths.Vector2F v)
|
||||||
{
|
{
|
||||||
Write(v.X);
|
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;
|
Cursor.Current = Cursors.WaitCursor;
|
||||||
FileFormat.FilePath = FileName;
|
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
|
//Todo find more optmial way to handle memory with files in archives
|
||||||
//Also make compression require streams
|
//Also make compression require streams
|
||||||
@ -45,16 +47,19 @@ namespace Toolbox.Library.IO
|
|||||||
FileName,
|
FileName,
|
||||||
EnableDialog);
|
EnableDialog);
|
||||||
|
|
||||||
FileFormat.IFileInfo.CompressedSize = (uint)finalStream.Length;
|
compressionLog = finalStream.Item2;
|
||||||
finalStream.ExportToFile(FileName);
|
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.DecompressedSize,
|
||||||
FileFormat.IFileInfo.CompressedSize,
|
FileFormat.IFileInfo.CompressedSize,
|
||||||
FileFormat.IFileInfo.FileIsCompressed);
|
FileFormat.IFileInfo.FileIsCompressed);
|
||||||
|
|
||||||
finalStream.Flush();
|
compressionStream.Flush();
|
||||||
finalStream.Close();
|
compressionStream.Close();
|
||||||
}
|
}
|
||||||
else
|
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);
|
// STSaveLogDialog.Show($"File has been saved to {FileName}", "Save Notification", DetailsLog);
|
||||||
Cursor.Current = Cursors.Default;
|
Cursor.Current = Cursors.Default;
|
||||||
@ -219,7 +227,10 @@ namespace Toolbox.Library.IO
|
|||||||
uint DecompressedSize = (uint)data.Length;
|
uint DecompressedSize = (uint)data.Length;
|
||||||
|
|
||||||
Cursor.Current = Cursors.WaitCursor;
|
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);
|
FinalData.ExportToFile(FileName);
|
||||||
|
|
||||||
uint CompressedSize = (uint)FinalData.Length;
|
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 FileName, bool EnableDialog = true)
|
||||||
{
|
{
|
||||||
string extension = Path.GetExtension(FileName);
|
string extension = Path.GetExtension(FileName);
|
||||||
@ -280,7 +291,7 @@ namespace Toolbox.Library.IO
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (compressionFormat == null)
|
if (compressionFormat == null)
|
||||||
return data;
|
return Tuple.Create(data, "");
|
||||||
|
|
||||||
bool CompressFile = false;
|
bool CompressFile = false;
|
||||||
if (EnableDialog && FileIsCompressed)
|
if (EnableDialog && FileIsCompressed)
|
||||||
@ -303,10 +314,18 @@ namespace Toolbox.Library.IO
|
|||||||
if (compressionFormat is Yaz0)
|
if (compressionFormat is Yaz0)
|
||||||
((Yaz0)compressionFormat).Alignment = Alignment;
|
((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.
|
/// Gets the internally stored value to represent the instance.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <remarks>Signed to get arithmetic rather than logical shifts.</remarks>
|
/// <remarks>Signed to get arithmetic rather than logical shifts.</remarks>
|
||||||
internal ushort Raw { get; private set; }
|
public ushort Raw { get; private set; }
|
||||||
|
|
||||||
// ---- OPERATORS ----------------------------------------------------------------------------------------------
|
// ---- OPERATORS ----------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
@ -41,7 +41,7 @@ namespace Toolbox.Library.Forms
|
|||||||
}
|
}
|
||||||
|
|
||||||
private GLControl glControl1;
|
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>();
|
private List<IPickable2DObject> SelectedObjects = new List<IPickable2DObject>();
|
||||||
|
|
||||||
@ -64,6 +64,9 @@ namespace Toolbox.Library.Forms
|
|||||||
|
|
||||||
|
|
||||||
public void UpdateViewport() {
|
public void UpdateViewport() {
|
||||||
|
if (!Runtime.OpenTKInitialized)
|
||||||
|
return;
|
||||||
|
|
||||||
glControl1.Invalidate();
|
glControl1.Invalidate();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -157,6 +160,8 @@ namespace Toolbox.Library.Forms
|
|||||||
|
|
||||||
if (showSelectionBox)
|
if (showSelectionBox)
|
||||||
{
|
{
|
||||||
|
GL.PushAttrib(AttribMask.DepthBufferBit);
|
||||||
|
|
||||||
GL.Disable(EnableCap.DepthTest);
|
GL.Disable(EnableCap.DepthTest);
|
||||||
GL.Begin(PrimitiveType.LineLoop);
|
GL.Begin(PrimitiveType.LineLoop);
|
||||||
GL.Color4(Color.Red);
|
GL.Color4(Color.Red);
|
||||||
@ -166,6 +171,8 @@ namespace Toolbox.Library.Forms
|
|||||||
GL.Vertex2(SelectionBox.LeftPoint, SelectionBox.TopPoint);
|
GL.Vertex2(SelectionBox.LeftPoint, SelectionBox.TopPoint);
|
||||||
GL.End();
|
GL.End();
|
||||||
GL.Enable(EnableCap.DepthTest);
|
GL.Enable(EnableCap.DepthTest);
|
||||||
|
|
||||||
|
GL.PopAttrib();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (UseOrtho)
|
if (UseOrtho)
|
||||||
@ -202,7 +209,7 @@ namespace Toolbox.Library.Forms
|
|||||||
showSelectionBox = true;
|
showSelectionBox = true;
|
||||||
SelectionBox = new STRectangle(left, right, top, bottom);
|
SelectionBox = new STRectangle(left, right, top, bottom);
|
||||||
|
|
||||||
SetupScene();
|
UpdateViewport();
|
||||||
}
|
}
|
||||||
|
|
||||||
public virtual void RenderSceme()
|
public virtual void RenderSceme()
|
||||||
@ -389,10 +396,13 @@ namespace Toolbox.Library.Forms
|
|||||||
if (mouseDown && !isPicked)
|
if (mouseDown && !isPicked)
|
||||||
{
|
{
|
||||||
RenderEditor();
|
RenderEditor();
|
||||||
|
|
||||||
var temp = e.Location;
|
var temp = e.Location;
|
||||||
var curPos = OpenGLHelper.convertScreenToWorldCoords(temp.X, temp.Y);
|
var curPos = OpenGLHelper.convertScreenToWorldCoords(temp.X, temp.Y);
|
||||||
var prevPos = OpenGLHelper.convertScreenToWorldCoords(pickOriginMouse.X, pickOriginMouse.Y);
|
var prevPos = OpenGLHelper.convertScreenToWorldCoords(pickOriginMouse.X, pickOriginMouse.Y);
|
||||||
|
|
||||||
|
GL.PopMatrix();
|
||||||
|
|
||||||
DrawSelectionBox(prevPos, curPos);
|
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>
|
/// <summary>
|
||||||
/// Looks up a localized resource of type System.Drawing.Bitmap.
|
/// Looks up a localized resource of type System.Drawing.Bitmap.
|
||||||
/// </summary>
|
/// </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>
|
/// <summary>
|
||||||
/// Looks up a localized resource of type System.Drawing.Bitmap.
|
/// Looks up a localized resource of type System.Drawing.Bitmap.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -418,4 +418,13 @@
|
|||||||
<data name="MissingTexture" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
<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>
|
<value>..\Resources\MissingTexture.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
</data>
|
</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>
|
</root>
|
@ -23,15 +23,21 @@ namespace Toolbox.Library.Rendering
|
|||||||
public Vector3 pos = new Vector3(0);
|
public Vector3 pos = new Vector3(0);
|
||||||
public Vector3 nrm = new Vector3(0);
|
public Vector3 nrm = new Vector3(0);
|
||||||
public Vector4 col = new Vector4(1);
|
public Vector4 col = new Vector4(1);
|
||||||
|
public Vector4 col2 = new Vector4(1);
|
||||||
|
|
||||||
public Vector2 uv0 = new Vector2(0);
|
public Vector2 uv0 = new Vector2(0);
|
||||||
public Vector2 uv1 = new Vector2(0);
|
public Vector2 uv1 = new Vector2(0);
|
||||||
public Vector2 uv2 = new Vector2(0);
|
public Vector2 uv2 = new Vector2(0);
|
||||||
|
public Vector2 uv3 = new Vector2(0);
|
||||||
|
|
||||||
public Vector4 tan = new Vector4(0);
|
public Vector4 tan = new Vector4(0);
|
||||||
public Vector4 bitan = new Vector4(0);
|
public Vector4 bitan = new Vector4(0);
|
||||||
|
|
||||||
public List<int> boneIds = new List<int>();
|
public List<int> boneIds = new List<int>();
|
||||||
public List<float> boneWeights = new List<float>();
|
public List<float> boneWeights = new List<float>();
|
||||||
|
|
||||||
|
public float normalW;
|
||||||
|
|
||||||
public List<string> boneNames = new List<string>();
|
public List<string> boneNames = new List<string>();
|
||||||
|
|
||||||
public List<Bone> boneList = new List<Bone>();
|
public List<Bone> boneList = new List<Bone>();
|
||||||
@ -49,5 +55,7 @@ namespace Toolbox.Library.Rendering
|
|||||||
//For vertex morphing
|
//For vertex morphing
|
||||||
public Vector3 pos1 = new Vector3();
|
public Vector3 pos1 = new Vector3();
|
||||||
public Vector3 pos2 = 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 EnableDragDrop = true;
|
||||||
|
|
||||||
public static bool UseSingleInstance = true;
|
public static bool UseSingleInstance = false;
|
||||||
public static bool UseDirectXTexDecoder = true;
|
public static bool UseDirectXTexDecoder = true;
|
||||||
public static bool DEVELOPER_DEBUG_MODE = false;
|
public static bool DEVELOPER_DEBUG_MODE = false;
|
||||||
public static bool AlwaysCompressOnSave = false;
|
public static bool AlwaysCompressOnSave = false;
|
||||||
@ -38,6 +38,11 @@ namespace Toolbox.Library
|
|||||||
public static string TpGamePath = "";
|
public static string TpGamePath = "";
|
||||||
public static string BotwGamePath = "";
|
public static string BotwGamePath = "";
|
||||||
|
|
||||||
|
public class UVEditor
|
||||||
|
{
|
||||||
|
public static Color UVColor = Color.FromArgb(255, 128, 0);
|
||||||
|
}
|
||||||
|
|
||||||
public class SwitchKeys
|
public class SwitchKeys
|
||||||
{
|
{
|
||||||
public static string SwitchFolder = System.IO.Path.Combine(Environment.GetFolderPath(
|
public static string SwitchFolder = System.IO.Path.Combine(Environment.GetFolderPath(
|
||||||
|
@ -99,6 +99,10 @@
|
|||||||
<Private>False</Private>
|
<Private>False</Private>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51" />
|
<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">
|
<Reference Include="ObjectListView">
|
||||||
<HintPath>..\Toolbox\Lib\ObjectListView.dll</HintPath>
|
<HintPath>..\Toolbox\Lib\ObjectListView.dll</HintPath>
|
||||||
<Private>False</Private>
|
<Private>False</Private>
|
||||||
@ -345,12 +349,7 @@
|
|||||||
<DependentUpon>GenericTextureImporterList.cs</DependentUpon>
|
<DependentUpon>GenericTextureImporterList.cs</DependentUpon>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="Forms\Editors\TextureImport\GenericTextureImporterSettings.cs" />
|
<Compile Include="Forms\Editors\TextureImport\GenericTextureImporterSettings.cs" />
|
||||||
<Compile Include="Forms\Editors\UV\UVEditorAdvanced.cs">
|
<Compile Include="Forms\Editors\UV\PickableUVMap.cs" />
|
||||||
<SubType>UserControl</SubType>
|
|
||||||
</Compile>
|
|
||||||
<Compile Include="Forms\Editors\UV\UVEditorAdvanced.Designer.cs">
|
|
||||||
<DependentUpon>UVEditorAdvanced.cs</DependentUpon>
|
|
||||||
</Compile>
|
|
||||||
<Compile Include="Forms\Editors\UV\UVEditorForm.cs">
|
<Compile Include="Forms\Editors\UV\UVEditorForm.cs">
|
||||||
<SubType>Form</SubType>
|
<SubType>Form</SubType>
|
||||||
</Compile>
|
</Compile>
|
||||||
@ -403,6 +402,7 @@
|
|||||||
<Compile Include="IO\Extensions\StreamExport.cs" />
|
<Compile Include="IO\Extensions\StreamExport.cs" />
|
||||||
<Compile Include="IO\Extensions\UintExtension.cs" />
|
<Compile Include="IO\Extensions\UintExtension.cs" />
|
||||||
<Compile Include="IO\FileStreamStorage.cs" />
|
<Compile Include="IO\FileStreamStorage.cs" />
|
||||||
|
<Compile Include="IO\FlatBuffer\FlatBufferConverter.cs" />
|
||||||
<Compile Include="IO\FlatBuffer\FlatBufferParse.cs" />
|
<Compile Include="IO\FlatBuffer\FlatBufferParse.cs" />
|
||||||
<Compile Include="IO\HSVPixel.cs" />
|
<Compile Include="IO\HSVPixel.cs" />
|
||||||
<Compile Include="IO\IOComoon.cs" />
|
<Compile Include="IO\IOComoon.cs" />
|
||||||
@ -684,12 +684,6 @@
|
|||||||
<Compile Include="Forms\Animation\TimeLine.Designer.cs">
|
<Compile Include="Forms\Animation\TimeLine.Designer.cs">
|
||||||
<DependentUpon>TimeLine.cs</DependentUpon>
|
<DependentUpon>TimeLine.cs</DependentUpon>
|
||||||
</Compile>
|
</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\Extensions\MDICustom.cs" />
|
||||||
<Compile Include="Forms\Editors\Object Editor\ObjectEditor.cs">
|
<Compile Include="Forms\Editors\Object Editor\ObjectEditor.cs">
|
||||||
<SubType>Form</SubType>
|
<SubType>Form</SubType>
|
||||||
@ -1137,15 +1131,12 @@
|
|||||||
<EmbeddedResource Include="Forms\Editors\UV\UVEditor.resx">
|
<EmbeddedResource Include="Forms\Editors\UV\UVEditor.resx">
|
||||||
<DependentUpon>UVEditor.cs</DependentUpon>
|
<DependentUpon>UVEditor.cs</DependentUpon>
|
||||||
</EmbeddedResource>
|
</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">
|
<EmbeddedResource Include="Forms\Editors\UV\UVEditorForm.resx">
|
||||||
<DependentUpon>UVEditorForm.cs</DependentUpon>
|
<DependentUpon>UVEditorForm.cs</DependentUpon>
|
||||||
</EmbeddedResource>
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="Forms\Editors\UV\UVViewport.resx">
|
||||||
|
<DependentUpon>UVViewport.cs</DependentUpon>
|
||||||
|
</EmbeddedResource>
|
||||||
<EmbeddedResource Include="Forms\SizeTables\FileTableViewTPHD.resx">
|
<EmbeddedResource Include="Forms\SizeTables\FileTableViewTPHD.resx">
|
||||||
<DependentUpon>FileTableViewTPHD.cs</DependentUpon>
|
<DependentUpon>FileTableViewTPHD.cs</DependentUpon>
|
||||||
</EmbeddedResource>
|
</EmbeddedResource>
|
||||||
@ -1216,6 +1207,8 @@
|
|||||||
<None Include="Resources\FileBank.png" />
|
<None Include="Resources\FileBank.png" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<None Include="Resources\FlatBuffers\gfbanm.fbs" />
|
||||||
|
<None Include="Resources\FlatBuffers\gfbmdl.fbs" />
|
||||||
<None Include="Resources\Folder.png" />
|
<None Include="Resources\Folder.png" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
@ -1519,6 +1512,9 @@
|
|||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None Include="Resources\MissingTexture.png" />
|
<None Include="Resources\MissingTexture.png" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<None Include="Resources\flatc.exe" />
|
||||||
|
</ItemGroup>
|
||||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||||
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
|
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
|
||||||
<PropertyGroup>
|
<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 mat4 mtxMdl;
|
||||||
|
|
||||||
uniform vec3 specLightDirection;
|
uniform vec3 specLightDirection;
|
||||||
uniform vec3 difLightDirection;
|
|
||||||
uniform mat4 projMatrix;
|
uniform mat4 projMatrix;
|
||||||
uniform mat4 normalMatrix;
|
uniform mat4 normalMatrix;
|
||||||
uniform mat4 modelViewMatrix;
|
uniform mat4 modelViewMatrix;
|
||||||
|
@ -124,6 +124,7 @@ void main()
|
|||||||
f_texcoord1 = vUV1;
|
f_texcoord1 = vUV1;
|
||||||
f_texcoord2 = vUV2;
|
f_texcoord2 = vUV2;
|
||||||
tangent = vTangent;
|
tangent = vTangent;
|
||||||
|
binormal = vBinormal;
|
||||||
|
|
||||||
gl_Position = position;
|
gl_Position = position;
|
||||||
|
|
||||||
|
@ -115,22 +115,21 @@ void main()
|
|||||||
|
|
||||||
vec4 objPos = vec4(vPosition.xyz, 1.0);
|
vec4 objPos = vec4(vPosition.xyz, 1.0);
|
||||||
if (vBone.x != -1.0)
|
if (vBone.x != -1.0)
|
||||||
objPos = skin(vPosition, index);
|
objPos = skin(objPos.xyz, index);
|
||||||
if(vBone.x != -1.0)
|
if(vBone.x != -1.0)
|
||||||
normal = normalize((skinNRM(vNormal.xyz, index)).xyz);
|
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;
|
normal = vNormal;
|
||||||
vertexColor = vColor;
|
vertexColor = vColor;
|
||||||
position = objPos;
|
|
||||||
f_texcoord0 = vUV0;
|
f_texcoord0 = vUV0;
|
||||||
f_texcoord1 = vUV1;
|
f_texcoord1 = vUV1;
|
||||||
f_texcoord2 = vUV2;
|
f_texcoord2 = vUV2;
|
||||||
tangent = vTangent;
|
tangent = vTangent;
|
||||||
|
|
||||||
position = mtxCam * mtxMdl * vec4(vPosition.xyz, 1.0);
|
|
||||||
|
|
||||||
f_texcoord0.x *= ColorUVScaleU + ColorUVTranslateU;
|
f_texcoord0.x *= ColorUVScaleU + ColorUVTranslateU;
|
||||||
f_texcoord0.y *= ColorUVScaleV + ColorUVTranslateV;
|
f_texcoord0.y *= ColorUVScaleV + ColorUVTranslateV;
|
||||||
|
|
||||||
|
@ -539,6 +539,9 @@
|
|||||||
<Content Include="Lib\WeifenLuo.WinFormsUI.Docking.ThemeVS2015.dll">
|
<Content Include="Lib\WeifenLuo.WinFormsUI.Docking.ThemeVS2015.dll">
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
</Content>
|
</Content>
|
||||||
|
<Content Include="Lib\Yaz0.dll">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</Content>
|
||||||
<Content Include="LZ4.dll">
|
<Content Include="LZ4.dll">
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
</Content>
|
</Content>
|
||||||
|
Loading…
Reference in New Issue
Block a user