2019-08-29 22:33:23 +02:00
|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.Linq;
|
|
|
|
|
using System.Text;
|
|
|
|
|
using System.Threading.Tasks;
|
|
|
|
|
using Syroot.Maths;
|
|
|
|
|
using Toolbox.Library.IO;
|
2019-08-29 23:17:24 +02:00
|
|
|
|
using Toolbox.Library;
|
2019-08-30 01:01:47 +02:00
|
|
|
|
using WeifenLuo.WinFormsUI.Docking;
|
2019-08-31 03:53:00 +02:00
|
|
|
|
using System.ComponentModel;
|
2019-08-29 22:33:23 +02:00
|
|
|
|
|
|
|
|
|
namespace LayoutBXLYT
|
|
|
|
|
{
|
|
|
|
|
public class BasePane : SectionCommon
|
|
|
|
|
{
|
2019-09-02 23:10:24 +02:00
|
|
|
|
[DisplayName("Alpha"), CategoryAttribute("Alpha")]
|
|
|
|
|
public byte Alpha { get; set; }
|
|
|
|
|
|
|
|
|
|
[DisplayName("Influence Alpha"), CategoryAttribute("Alpha")]
|
|
|
|
|
public virtual bool InfluenceAlpha { get; set; }
|
|
|
|
|
|
2019-08-31 03:53:00 +02:00
|
|
|
|
[Browsable(false)]
|
2019-09-05 22:24:03 +02:00
|
|
|
|
public virtual bool DisplayInEditor { get; set; } = true;
|
2019-08-29 22:33:23 +02:00
|
|
|
|
|
2019-08-31 03:53:00 +02:00
|
|
|
|
[DisplayName("Name"), CategoryAttribute("Pane")]
|
2019-08-29 22:33:23 +02:00
|
|
|
|
public string Name { get; set; }
|
|
|
|
|
|
2019-08-31 03:53:00 +02:00
|
|
|
|
[DisplayName("Translate"), CategoryAttribute("Pane")]
|
2019-08-29 22:33:23 +02:00
|
|
|
|
public Vector3F Translate { get; set; }
|
2019-08-31 03:53:00 +02:00
|
|
|
|
|
|
|
|
|
[DisplayName("Rotate"), CategoryAttribute("Pane")]
|
2019-08-29 22:33:23 +02:00
|
|
|
|
public Vector3F Rotate { get; set; }
|
2019-08-31 03:53:00 +02:00
|
|
|
|
|
|
|
|
|
[DisplayName("Scale"), CategoryAttribute("Pane")]
|
2019-08-29 22:33:23 +02:00
|
|
|
|
public Vector2F Scale { get; set; }
|
2019-08-31 03:53:00 +02:00
|
|
|
|
|
|
|
|
|
[DisplayName("Width"), CategoryAttribute("Pane")]
|
2019-08-29 22:33:23 +02:00
|
|
|
|
public float Width { get; set; }
|
2019-08-31 03:53:00 +02:00
|
|
|
|
|
|
|
|
|
[DisplayName("Width"), CategoryAttribute("Pane")]
|
2019-08-29 22:33:23 +02:00
|
|
|
|
public float Height { get; set; }
|
|
|
|
|
|
2019-08-31 03:53:00 +02:00
|
|
|
|
[DisplayName("Origin X"), CategoryAttribute("Origin")]
|
2019-08-29 22:33:23 +02:00
|
|
|
|
public virtual OriginX originX { get; set; }
|
2019-08-31 03:53:00 +02:00
|
|
|
|
|
|
|
|
|
[DisplayName("Origin X"), CategoryAttribute("Origin")]
|
2019-08-29 22:33:23 +02:00
|
|
|
|
public virtual OriginY originY { get; set; }
|
2019-08-31 03:53:00 +02:00
|
|
|
|
|
|
|
|
|
[Browsable(false)]
|
2019-08-29 22:33:23 +02:00
|
|
|
|
public virtual OriginX ParentOriginX { get; set; }
|
2019-08-31 03:53:00 +02:00
|
|
|
|
|
|
|
|
|
[Browsable(false)]
|
2019-08-29 22:33:23 +02:00
|
|
|
|
public virtual OriginY ParentOriginY { get; set; }
|
|
|
|
|
|
2019-08-31 03:53:00 +02:00
|
|
|
|
[Browsable(false)]
|
2019-08-29 22:33:23 +02:00
|
|
|
|
public BasePane Parent { get; set; }
|
|
|
|
|
|
2019-08-31 03:53:00 +02:00
|
|
|
|
[Browsable(false)]
|
2019-08-29 22:33:23 +02:00
|
|
|
|
public List<BasePane> Childern { get; set; } = new List<BasePane>();
|
|
|
|
|
|
2019-08-31 03:53:00 +02:00
|
|
|
|
[Browsable(false)]
|
2019-08-29 22:33:23 +02:00
|
|
|
|
public bool HasChildern
|
|
|
|
|
{
|
|
|
|
|
get { return Childern.Count > 0; }
|
|
|
|
|
}
|
|
|
|
|
|
2019-08-31 00:53:45 +02:00
|
|
|
|
public BasePane()
|
|
|
|
|
{
|
|
|
|
|
originX = OriginX.Center;
|
|
|
|
|
originY = OriginY.Center;
|
|
|
|
|
ParentOriginX = OriginX.Center;
|
|
|
|
|
ParentOriginY = OriginY.Center;
|
|
|
|
|
}
|
2019-08-29 22:33:23 +02:00
|
|
|
|
|
2019-09-03 01:48:47 +02:00
|
|
|
|
private CustomRectangle rectangle;
|
|
|
|
|
public CustomRectangle Rectangle
|
|
|
|
|
{
|
|
|
|
|
get
|
|
|
|
|
{
|
|
|
|
|
if (rectangle == null)
|
|
|
|
|
UpdateRectangle();
|
|
|
|
|
return rectangle;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void UpdateRectangle() {
|
|
|
|
|
rectangle = CreateRectangle();
|
|
|
|
|
}
|
|
|
|
|
|
2019-08-29 22:33:23 +02:00
|
|
|
|
public CustomRectangle CreateRectangle()
|
|
|
|
|
{
|
|
|
|
|
//Do origin transforms
|
|
|
|
|
var transformed = TransformOrientation((int)Width, (int)Height);
|
|
|
|
|
|
|
|
|
|
//Now do parent transforms
|
|
|
|
|
Vector2 ParentWH = new Vector2(0, 0);
|
|
|
|
|
if (Parent != null && Parent is BasePane)
|
|
|
|
|
ParentWH = new Vector2((int)Parent.Width, (int)Parent.Height);
|
|
|
|
|
|
|
|
|
|
var transformedParent = TransformOrientation(ParentWH.X, ParentWH.Y);
|
|
|
|
|
|
|
|
|
|
// if (Parent != null)
|
|
|
|
|
// transformed -= transformedParent;
|
|
|
|
|
|
|
|
|
|
return new CustomRectangle(
|
|
|
|
|
transformed.X,
|
|
|
|
|
transformed.Y,
|
|
|
|
|
transformed.Z,
|
|
|
|
|
transformed.W);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private Vector4 TransformOrientation(int Width, int Height)
|
|
|
|
|
{
|
|
|
|
|
int left = 0;
|
|
|
|
|
int right = 0;
|
|
|
|
|
int top = 0;
|
|
|
|
|
int bottom = 0;
|
|
|
|
|
|
|
|
|
|
if (originX == OriginX.Left)
|
|
|
|
|
right = Width;
|
|
|
|
|
else if (originX == OriginX.Right)
|
|
|
|
|
left = -Width;
|
|
|
|
|
else //To center
|
|
|
|
|
{
|
|
|
|
|
left = -Width / 2;
|
|
|
|
|
right = Width / 2;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (originY == OriginY.Top)
|
|
|
|
|
bottom = Height;
|
|
|
|
|
else if (originY == OriginY.Bottom)
|
|
|
|
|
top = -Height;
|
|
|
|
|
else //To center
|
|
|
|
|
{
|
|
|
|
|
top = -Height / 2;
|
|
|
|
|
bottom = Height / 2;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return new Vector4(left, right, top, bottom);
|
|
|
|
|
}
|
2019-09-03 01:48:47 +02:00
|
|
|
|
|
|
|
|
|
public bool IsHit(int X, int Y)
|
|
|
|
|
{
|
2019-09-04 00:58:58 +02:00
|
|
|
|
if ((X > Translate.X) && (X < Translate.X + Width) &&
|
|
|
|
|
(Y > Translate.Y) && (Y < Translate.Y + Height))
|
2019-09-03 01:48:47 +02:00
|
|
|
|
return true;
|
|
|
|
|
else
|
|
|
|
|
return false;
|
|
|
|
|
}
|
2019-08-29 22:33:23 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public enum OriginX : byte
|
|
|
|
|
{
|
|
|
|
|
Center = 0,
|
|
|
|
|
Left = 1,
|
|
|
|
|
Right = 2
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
public enum OriginY : byte
|
|
|
|
|
{
|
|
|
|
|
Center = 0,
|
|
|
|
|
Top = 1,
|
|
|
|
|
Bottom = 2
|
|
|
|
|
};
|
|
|
|
|
|
2019-09-04 00:58:58 +02:00
|
|
|
|
public interface IUserDataContainer
|
|
|
|
|
{
|
|
|
|
|
UserData UserData { get; set; }
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public class UserData : SectionCommon
|
|
|
|
|
{
|
|
|
|
|
public List<UserDataEntry> Entries { get; set; }
|
|
|
|
|
|
|
|
|
|
public UserData()
|
|
|
|
|
{
|
|
|
|
|
Entries = new List<UserDataEntry>();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public override void Write(FileWriter writer, BxlytHeader header)
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public class UserDataEntry
|
|
|
|
|
{
|
|
|
|
|
public string Name { get; set; }
|
|
|
|
|
public UserDataType Type { get; set; }
|
|
|
|
|
public byte Unknown { get; set; }
|
|
|
|
|
|
|
|
|
|
public object data;
|
|
|
|
|
|
|
|
|
|
public string GetString()
|
|
|
|
|
{
|
|
|
|
|
return (string)data;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public float[] GetFloats()
|
|
|
|
|
{
|
|
|
|
|
return (float[])data;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public int[] GetInts()
|
|
|
|
|
{
|
|
|
|
|
return (int[])data;
|
|
|
|
|
}
|
|
|
|
|
|
2019-09-04 01:23:04 +02:00
|
|
|
|
public void SetValue(string value)
|
2019-09-04 00:58:58 +02:00
|
|
|
|
{
|
|
|
|
|
data = value;
|
|
|
|
|
Type = UserDataType.String;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void SetValue(float[] value)
|
|
|
|
|
{
|
|
|
|
|
data = value;
|
|
|
|
|
Type = UserDataType.Float;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void SetValue(int[] value)
|
|
|
|
|
{
|
|
|
|
|
data = value;
|
|
|
|
|
Type = UserDataType.Int;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
internal long _pos;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public enum UserDataType : byte
|
|
|
|
|
{
|
|
|
|
|
String,
|
|
|
|
|
Int,
|
|
|
|
|
Float,
|
|
|
|
|
}
|
|
|
|
|
|
2019-08-30 01:01:47 +02:00
|
|
|
|
public class BxlytHeader : IDisposable
|
2019-08-29 22:33:23 +02:00
|
|
|
|
{
|
2019-09-04 20:10:17 +02:00
|
|
|
|
[Browsable(false)]
|
2019-08-31 00:53:45 +02:00
|
|
|
|
public string FileName
|
|
|
|
|
{
|
|
|
|
|
get { return FileInfo.FileName; }
|
|
|
|
|
}
|
|
|
|
|
|
2019-09-04 20:10:17 +02:00
|
|
|
|
[DisplayName("Use Big Endian"), CategoryAttribute("File Settings")]
|
2019-09-01 19:02:48 +02:00
|
|
|
|
public bool IsBigEndian { get; set; }
|
|
|
|
|
|
2019-09-04 20:10:17 +02:00
|
|
|
|
[Browsable(false)]
|
2019-08-30 01:01:47 +02:00
|
|
|
|
internal IFileFormat FileInfo;
|
|
|
|
|
|
2019-09-04 20:10:17 +02:00
|
|
|
|
[Browsable(false)]
|
2019-08-29 22:33:23 +02:00
|
|
|
|
public BasePane RootPane { get; set; }
|
|
|
|
|
|
2019-09-04 20:10:17 +02:00
|
|
|
|
[Browsable(false)]
|
2019-08-29 23:17:24 +02:00
|
|
|
|
public BasePane RootGroup { get; set; }
|
|
|
|
|
|
2019-09-04 20:10:17 +02:00
|
|
|
|
[Browsable(false)]
|
2019-08-29 23:17:24 +02:00
|
|
|
|
public virtual Dictionary<string, STGenericTexture> GetTextures { get; }
|
|
|
|
|
|
2019-09-04 20:10:17 +02:00
|
|
|
|
[Browsable(false)]
|
2019-08-29 23:17:24 +02:00
|
|
|
|
public virtual List<string> Textures { get; }
|
|
|
|
|
|
2019-09-05 22:24:03 +02:00
|
|
|
|
[Browsable(false)]
|
|
|
|
|
public virtual List<string> Fonts { get; }
|
|
|
|
|
|
2019-09-04 20:10:17 +02:00
|
|
|
|
[Browsable(false)]
|
2019-08-29 22:33:23 +02:00
|
|
|
|
internal uint Version;
|
|
|
|
|
|
2019-09-04 20:10:17 +02:00
|
|
|
|
[DisplayName("Version"), CategoryAttribute("File Settings")]
|
2019-08-29 22:33:23 +02:00
|
|
|
|
public string VersionFull
|
|
|
|
|
{
|
|
|
|
|
get
|
|
|
|
|
{
|
2019-09-04 20:10:17 +02:00
|
|
|
|
return $"{VersionMajor},{VersionMinor},{VersionMicro},{VersionMicro2}";
|
2019-08-29 22:33:23 +02:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2019-09-05 22:24:03 +02:00
|
|
|
|
[Browsable(false)]
|
|
|
|
|
public virtual List<BxlytMaterial> GetMaterials()
|
|
|
|
|
{
|
|
|
|
|
return new List<BxlytMaterial>();
|
|
|
|
|
}
|
2019-08-29 22:33:23 +02:00
|
|
|
|
|
2019-09-04 20:10:17 +02:00
|
|
|
|
[RefreshProperties(RefreshProperties.All)]
|
|
|
|
|
public uint VersionMajor { get; set; }
|
|
|
|
|
[RefreshProperties(RefreshProperties.All)]
|
|
|
|
|
public uint VersionMinor { get; set; }
|
|
|
|
|
[RefreshProperties(RefreshProperties.All)]
|
|
|
|
|
public uint VersionMicro { get; set; }
|
|
|
|
|
[RefreshProperties(RefreshProperties.All)]
|
|
|
|
|
public uint VersionMicro2 { get; set; }
|
2019-08-29 22:33:23 +02:00
|
|
|
|
|
2019-09-04 20:10:17 +02:00
|
|
|
|
internal void SetVersionInfo()
|
2019-08-29 22:33:23 +02:00
|
|
|
|
{
|
2019-09-04 20:10:17 +02:00
|
|
|
|
VersionMajor = Version >> 24;
|
|
|
|
|
VersionMinor = Version >> 16 & 0xFF;
|
|
|
|
|
VersionMicro = Version >> 8 & 0xFF;
|
|
|
|
|
VersionMicro2 = Version & 0xFF;
|
2019-08-29 22:33:23 +02:00
|
|
|
|
}
|
|
|
|
|
|
2019-09-04 20:10:17 +02:00
|
|
|
|
internal uint SaveVersion()
|
2019-08-29 22:33:23 +02:00
|
|
|
|
{
|
2019-09-04 20:10:17 +02:00
|
|
|
|
return VersionMajor << 24 | VersionMinor << 16 | VersionMicro << 8 | VersionMicro2;
|
2019-08-29 22:33:23 +02:00
|
|
|
|
}
|
2019-08-30 01:01:47 +02:00
|
|
|
|
|
|
|
|
|
public void Dispose()
|
|
|
|
|
{
|
|
|
|
|
FileInfo.Unload();
|
|
|
|
|
}
|
2019-08-29 22:33:23 +02:00
|
|
|
|
}
|
|
|
|
|
|
2019-09-05 22:24:03 +02:00
|
|
|
|
public class BxlytMaterial
|
|
|
|
|
{
|
|
|
|
|
[DisplayName("Name"), CategoryAttribute("General")]
|
|
|
|
|
public virtual string Name { get; set; }
|
|
|
|
|
}
|
|
|
|
|
|
2019-09-01 19:02:48 +02:00
|
|
|
|
public class SectionCommon
|
2019-08-29 22:33:23 +02:00
|
|
|
|
{
|
2019-09-01 19:02:48 +02:00
|
|
|
|
public virtual string Signature { get; }
|
|
|
|
|
public uint SectionSize { get; set; }
|
|
|
|
|
public long StartPosition { get; set; }
|
2019-08-29 22:33:23 +02:00
|
|
|
|
|
|
|
|
|
internal byte[] Data { get; set; }
|
|
|
|
|
|
2019-09-01 23:21:36 +02:00
|
|
|
|
public SectionCommon()
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public SectionCommon(string signature)
|
|
|
|
|
{
|
|
|
|
|
Signature = signature;
|
|
|
|
|
}
|
|
|
|
|
|
2019-08-29 22:33:23 +02:00
|
|
|
|
public virtual void Write(FileWriter writer, BxlytHeader header)
|
|
|
|
|
{
|
|
|
|
|
if (Data != null)
|
|
|
|
|
writer.Write(Data);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public class CustomRectangle
|
|
|
|
|
{
|
|
|
|
|
public int LeftPoint;
|
|
|
|
|
public int RightPoint;
|
|
|
|
|
public int TopPoint;
|
|
|
|
|
public int BottomPoint;
|
|
|
|
|
|
|
|
|
|
public CustomRectangle(int left, int right, int top, int bottom)
|
|
|
|
|
{
|
|
|
|
|
LeftPoint = left;
|
|
|
|
|
RightPoint = right;
|
|
|
|
|
TopPoint = top;
|
|
|
|
|
BottomPoint = bottom;
|
|
|
|
|
}
|
2019-09-03 01:48:47 +02:00
|
|
|
|
|
|
|
|
|
public float Width
|
|
|
|
|
{
|
|
|
|
|
get { return LeftPoint - RightPoint; }
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public float Height
|
|
|
|
|
{
|
|
|
|
|
get { return TopPoint - BottomPoint; }
|
|
|
|
|
}
|
2019-08-29 22:33:23 +02:00
|
|
|
|
}
|
2019-08-31 00:53:45 +02:00
|
|
|
|
|
|
|
|
|
public class LayoutDocked : DockContent
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
}
|
2019-08-29 22:33:23 +02:00
|
|
|
|
}
|