Big BYAML and AAMP update!

- AAMP can now save back to YAML!
- Added text editor for AAMP editor
- AAMP library has been improved signifcantly, now using one library for all versions.
- BYAML now uses YAML by default. You can still right click in the editor and export as XML if needed.
- BYAML saving speed improved signifcantly.
- BYAML now supports reference nodes and works with 3DW byml files.
- BYAML can now load shift JIS encoding for japanese characters.
- YAML syntax for text editor improved with proper folding and highlighting for certain values.
This commit is contained in:
KillzXGaming 2020-02-06 18:20:42 -05:00
parent 63130cfad6
commit c922ff1e4f
38 changed files with 1510 additions and 1269 deletions

View file

@ -5,9 +5,8 @@ using Toolbox.Library;
using Toolbox.Library.IO;
using Toolbox.Library.Forms;
using System.Windows.Forms;
using aampv1 = AampV1Library;
using aampv2 = AampV2Library;
using FirstPlugin.Forms;
using AampLibraryCSharp;
namespace FirstPlugin
{
@ -54,20 +53,16 @@ namespace FirstPlugin
#region Text Converter Interface
public TextFileType TextFileType => TextFileType.Yaml;
public bool CanConvertBack => false;
public bool CanConvertBack => true;
public string ConvertToString()
{
if (aampFileV1 != null)
return AampYamlConverter.ToYaml(aampFileV1);
else
return AampYamlConverter.ToYaml(aampFileV2);
return YamlConverter.ToYaml(aampFile);
}
public void ConvertFromString(string text)
{
if (aampFileV1 != null)
AampYamlConverter.ToAamp(aampFileV1, text);
aampFile = YamlConverter.FromYaml(text);
}
#endregion
@ -98,54 +93,26 @@ namespace FirstPlugin
throw new Exception("File not a valid BFRES file!");
//Check version instance
if (((AAMP)File).aampFileV1 != null)
foreach (var val in ((AAMP)File).aampFile.RootNode.childParams)
{
foreach (var val in ((AAMP)File).aampFileV1.RootNode.childParams)
{
foreach (var param in val.paramObjects)
{
switch (param.HashString)
{
case "grid":
GenerateGridData((BFRES)Bfres, param.paramEntries);
break;
}
}
}
foreach (var param in ((AAMP)File).aampFileV1.RootNode.paramObjects)
foreach (var param in val.paramObjects)
{
switch (param.HashString)
{
case "root_grid":
case "grid":
GenerateGridData((BFRES)Bfres, param.paramEntries);
break;
}
}
}
else
{
foreach (var val in ((AAMP)File).aampFileV2.RootNode.childParams)
{
foreach (var param in val.paramObjects)
{
switch (param.HashString)
{
case "grid":
GenerateGridData((BFRES)Bfres, param.paramEntries);
break;
}
}
}
foreach (var param in ((AAMP)File).aampFileV2.RootNode.paramObjects)
foreach (var param in ((AAMP)File).aampFile.RootNode.paramObjects)
{
switch (param.HashString)
{
switch (param.HashString)
{
case "root_grid":
GenerateGridData((BFRES)Bfres, param.paramEntries);
break;
}
case "root_grid":
GenerateGridData((BFRES)Bfres, param.paramEntries);
break;
}
}
@ -162,7 +129,7 @@ namespace FirstPlugin
}
}
private static void GenerateGridData(BFRES bfres, aampv2.ParamEntry[] paramEntries)
private static void GenerateGridData(BFRES bfres, ParamEntry[] paramEntries)
{
//Load the grid min nad max and set them
var boundings = bfres.GetBoundingBox();
@ -176,35 +143,12 @@ namespace FirstPlugin
}
}
private static void GenerateGridData(BFRES bfres, aampv1.ParamEntry[] paramEntries)
{
var boundings = bfres.GetBoundingBox();
foreach (var entry in paramEntries)
{
if (entry.HashString == "aabb_min_pos")
entry.Value = new Syroot.Maths.Vector3F(boundings.Min.X, boundings.Min.Y, boundings.Min.Z);
if (entry.HashString == "aabb_max_pos")
entry.Value = new Syroot.Maths.Vector3F(boundings.Max.X, boundings.Max.Y, boundings.Max.Z);
}
}
public AampEditorBase OpenForm()
{
if (aampFileV1 != null)
{
AampV1Editor editor = new AampV1Editor(this, IsSaveDialog);
editor.Text = FileName;
editor.Dock = DockStyle.Fill;
return editor;
}
else
{
AampV2Editor editor = new AampV2Editor(this, IsSaveDialog);
editor.Text = FileName;
editor.Dock = DockStyle.Fill;
return editor;
}
AampEditor editor = new AampEditor(this, IsSaveDialog);
editor.Text = FileName;
editor.Dock = DockStyle.Fill;
return editor;
}
public void FillEditor(UserControl control)
@ -212,8 +156,7 @@ namespace FirstPlugin
}
public aampv1.AampFile aampFileV1;
public aampv2.AampFile aampFileV2;
public AampFile aampFile;
public void Load(Stream stream)
{
@ -221,22 +164,9 @@ namespace FirstPlugin
IsSaveDialog = IFileInfo != null && IFileInfo.InArchive;
uint Version = CheckVersion(stream);
if (Version == 1)
{
aampFileV1 = new aampv1.AampFile(stream);
}
else if (Version == 2)
{
aampFileV2 = new aampv2.AampFile(stream);
}
else
{
throw new Exception($"Unsupported AAMP version! {Version}");
}
aampFile = AampFile.LoadFile(stream);
}
public void Unload()
{
@ -244,10 +174,8 @@ namespace FirstPlugin
public void Save(System.IO.Stream stream)
{
if (aampFileV1 != null)
aampFileV1.Save(stream);
else
aampFileV2.Save(stream);
if (aampFile != null)
aampFile.Save(stream);
}
}
}

View file

@ -112,7 +112,9 @@ namespace FirstPlugin
files[i].FileName = $"File {i}";
files[i].DataOffset = reader.Position;
reader.Seek((int)files[i].CompressedSize);
reader.Align((int)files[i].Alignment);
if (files[i].Alignment != 0)
reader.Align((int)files[i].Alignment);
}
//Try to get file names from file formats inside

View file

@ -10,6 +10,9 @@ using Toolbox.Library.Forms;
using Toolbox.Library.IO;
using ByamlExt.Byaml;
using ByamlExt;
using SharpYaml.Serialization;
using SharpYaml;
using Syroot.BinaryData;
namespace FirstPlugin
{
@ -50,19 +53,23 @@ namespace FirstPlugin
}
#region Text Converter Interface
public TextFileType TextFileType => TextFileType.Xml;
public TextFileType TextFileType => TextFileType.Yaml;
public bool CanConvertBack => true;
public string ConvertToString()
{
return XmlConverter.ToXml(data);
if (TextFileType == TextFileType.Xml)
return XmlByamlConverter.ToXML(BymlData);
else
return YamlByamlConverter.ToYaml(BymlData);
}
public void ConvertFromString(string text)
{
byte[] TextData = Encoding.Unicode.GetBytes(text);
StreamReader t = new StreamReader(new MemoryStream(TextData), Encoding.GetEncoding(932));
data = XmlConverter.ToByml(t.ReadToEnd());
if (TextFileType == TextFileType.Xml)
BymlData = XmlByamlConverter.FromXML(text);
else
BymlData = YamlByamlConverter.FromYaml(text);
}
#endregion
@ -97,7 +104,7 @@ namespace FirstPlugin
if (ofd.ShowDialog() == DialogResult.OK)
{
byamlF.Load(new FileStream(ofd.FileName, FileMode.Open));
byamlF.data.byteOrder = Syroot.BinaryData.ByteOrder.BigEndian;
byamlF.BymlData.byteOrder = Syroot.BinaryData.ByteOrder.BigEndian;
SaveFileDialog sfd = new SaveFileDialog();
sfd.Filter = Utils.GetAllFilters(byamlF);
@ -119,7 +126,7 @@ namespace FirstPlugin
if (ofd.ShowDialog() == DialogResult.OK)
{
byamlF.Load(new FileStream(ofd.FileName, FileMode.Open));
byamlF.data.byteOrder = Syroot.BinaryData.ByteOrder.LittleEndian;
byamlF.BymlData.byteOrder = Syroot.BinaryData.ByteOrder.LittleEndian;
SaveFileDialog sfd = new SaveFileDialog();
sfd.Filter = Utils.GetAllFilters(byamlF);
@ -157,7 +164,7 @@ namespace FirstPlugin
}
bool IsDialog = false;
BymlFileData data;
public BymlFileData BymlData;
public ByamlEditor OpenForm()
{
@ -175,25 +182,48 @@ namespace FirstPlugin
return editor;
}
public void UpdateByamlRoot(dynamic root)
{
if (data != null)
data.RootNode = root;
}
public void FillEditor(UserControl control)
{
((ByamlEditor)control).UpdateByaml(data.RootNode, data.SupportPaths, data.Version, data.byteOrder, IsDialog, this);
((ByamlEditor)control).UpdateByaml(
BymlData.RootNode,
BymlData.SupportPaths,
BymlData.Version,
BymlData.byteOrder,
IsDialog, this);
}
public void Load(Stream stream)
{
CanSave = true;
//Keep the stream open.
//This is for the file to optionally be reloaded for different encoding types
IsDialog = IFileInfo != null && IFileInfo.InArchive;
data = ByamlFile.LoadN(stream);
BymlData = ByamlFile.LoadN(stream);
}
public void ReloadEncoding(Encoding encoding) {
BymlFileData.Encoding = encoding;
//Reopen and reload the byml data
if (IFileInfo.ArchiveParent != null)
{
foreach (var file in IFileInfo.ArchiveParent.Files)
{
var name = Path.GetFileName(file.FileName);
if (name == FileName)
BymlData = ByamlFile.LoadN(new MemoryStream(file.FileData));
}
}
else if (File.Exists(FilePath))
{
var file = File.OpenRead(FilePath);
BymlData = ByamlFile.LoadN(file);
file.Close();
}
}
public void Unload()
{
@ -203,10 +233,10 @@ namespace FirstPlugin
{
ByamlFile.SaveN(stream, new BymlFileData
{
Version = data.Version,
byteOrder = data.byteOrder,
SupportPaths = data.SupportPaths,
RootNode = data.RootNode
Version = BymlData.Version,
byteOrder = BymlData.byteOrder,
SupportPaths = BymlData.SupportPaths,
RootNode = BymlData.RootNode
});
}
}

View file

@ -0,0 +1,232 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.IO;
using System.Threading.Tasks;
using System.Xml;
using System.Xml.Linq;
using Syroot.BinaryData;
using Syroot.Maths;
using ByamlExt.Byaml;
using System.Globalization;
namespace FirstPlugin
{
//From https://gitlab.com/Syroot/NintenTools.Byaml/-/blob/master/src/Syroot.NintenTools.Byaml/XmlConverter.cs
//This allows xml to with with yamlconv and it looks better using attributes for properties
//Todo this needs to support reference nodes
public class XmlByamlConverter
{
private static readonly XNamespace _yamlconvNs = "yamlconv";
public static string ToXML(BymlFileData data)
{
XDocument doc = ToXDocument(data.RootNode, data);
using (StringWriter writer = new StringWriter())
{
doc.Save(writer);
return writer.ToString();
}
}
public static BymlFileData FromXML(string text) {
return FromXDocument(XDocument.Parse(text));
}
internal static BymlFileData FromXDocument(XDocument xDocument)
{
if (xDocument == null)
throw new ArgumentNullException(nameof(xDocument));
if (xDocument.Root?.Name != "yaml")
throw new ArgumentException("Incompatible XML data. A \"yaml\" root element is required.");
// Retrieve information from root node.
BymlFileData data = new BymlFileData();
switch (xDocument.Root.Attribute(_yamlconvNs + "endianness")?.Value)
{
case "big": data.byteOrder = ByteOrder.BigEndian; break;
case "little": data.byteOrder = ByteOrder.LittleEndian; break;
default: data.byteOrder = ByteOrder.LittleEndian; break;
}
data.Version = UInt16.TryParse(xDocument.Root.Attribute(_yamlconvNs + "version")?.Value,
out ushort version) ? version : (ushort)1;
// Generate the root node.
data.RootNode = ReadNode(xDocument.Root);
return data;
}
private static dynamic ReadNode(XElement node)
{
dynamic convertValue(string value)
{
if (value == "null")
return null;
if (value == string.Empty)
return "";
else if (value == "true")
return true;
else if (value == "false")
return false;
else if (value.EndsWith("f"))
return Single.Parse(value.Substring(0, value.Length - "f".Length), CultureInfo.InvariantCulture);
else if (value.EndsWith("u"))
return UInt32.Parse(value.Substring(0, value.Length - "u".Length), CultureInfo.InvariantCulture);
else if (value.EndsWith("i64"))
return Int64.Parse(value.Substring(0, value.Length - "i64".Length), CultureInfo.InvariantCulture);
else if (value.EndsWith("u64"))
return UInt64.Parse(value.Substring(0, value.Length - "u64".Length), CultureInfo.InvariantCulture);
else if (value.EndsWith("d"))
return Double.Parse(value.Substring(0, value.Length - "d".Length), CultureInfo.InvariantCulture);
else
return Int32.Parse(value, CultureInfo.InvariantCulture);
}
string convertString() => node.Value.ToString();
List<ByamlPathPoint> convertPath()
{
List<ByamlPathPoint> path = new List<ByamlPathPoint>();
foreach (XElement pathPoint in node.Elements("point"))
path.Add(convertPathPoint(pathPoint));
return path;
}
ByamlPathPoint convertPathPoint(XElement pathPoint)
{
return new ByamlPathPoint
{
Position = new Vector3F(
convertValue(pathPoint.Attribute("x")?.Value ?? "0f"),
convertValue(pathPoint.Attribute("y")?.Value ?? "0f"),
convertValue(pathPoint.Attribute("z")?.Value ?? "0f")),
Normal = new Vector3F(
convertValue(pathPoint.Attribute("nx")?.Value ?? "0f"),
convertValue(pathPoint.Attribute("ny")?.Value ?? "0f"),
convertValue(pathPoint.Attribute("nz")?.Value ?? "0f")),
Unknown = convertValue(pathPoint.Attribute("val")?.Value ?? "0")
};
}
Dictionary<string, dynamic> convertDictionary()
{
Dictionary<string, dynamic> dictionary = new Dictionary<string, dynamic>();
foreach (XElement element in node.Elements())
dictionary.Add(XmlConvert.DecodeName(element.Name.ToString()), ReadNode(element));
// Only keep non-namespaced attributes for now to filter out yamlconv and xml(ns) ones.
foreach (XAttribute attribute in node.Attributes().Where(x => x.Name.Namespace == XNamespace.None))
dictionary.Add(XmlConvert.DecodeName(attribute.Name.ToString()), convertValue(attribute.Value));
return dictionary;
}
List<dynamic> convertArray()
{
List<dynamic> array = new List<dynamic>();
foreach (XElement element in node.Elements("value"))
array.Add(ReadNode(element));
return array;
}
// Detecting the special "type" attribute like this is unsafe as it could also be a dictionary with a "type"
// key. Yamlconv should have namespaced its attribute to safely identify it.
switch (node.Attributes("type").SingleOrDefault()?.Value)
{
// TODO: Add null support. Can null be set for value types?
// TODO: Add reference support. Use Element with encoded XPath.
case null when node.HasAttributes || node.HasElements: return convertDictionary();
case null: return convertValue(node.Value);
case "array": return convertArray();
case "path": return convertPath();
case "string": return convertString();
default: throw new ByamlException("Unknown XML contents.");
}
}
internal static XDocument ToXDocument(dynamic root, BymlFileData data)
{
XElement rootNode = SaveNode("yaml", root, false);
List<XAttribute> attribs = rootNode.Attributes().ToList();
attribs.Insert(0, new XAttribute(XNamespace.Xmlns + "yamlconv", "yamlconv"));
attribs.Insert(1, new XAttribute(_yamlconvNs + "endianness",
data.byteOrder == ByteOrder.LittleEndian ? "little" : "big"));
attribs.Insert(2, new XAttribute(_yamlconvNs + "offsetCount", data.SupportPaths ? 4 : 3));
attribs.Insert(3, new XAttribute(_yamlconvNs + "byamlVersion", data.Version));
rootNode.Attributes().Remove();
rootNode.Add(attribs);
return new XDocument(new XDeclaration("1.0", "utf-8", null), rootNode);
}
private static XObject SaveNode(string name, dynamic node, bool isArrayElement)
{
XObject convertValue(object value)
=> isArrayElement ? new XElement(name, value) : (XObject)new XAttribute(name, value);
XElement convertString(string stringNode)
=> new XElement(name, new XAttribute("type", "string"), stringNode);
XElement convertPathPoint(ByamlPathPoint pathPointNode)
{
return new XElement("point",
new XAttribute("x", getSingleString(pathPointNode.Position.X)),
new XAttribute("y", getSingleString(pathPointNode.Position.Y)),
new XAttribute("z", getSingleString(pathPointNode.Position.Z)),
new XAttribute("nx", getSingleString(pathPointNode.Normal.X)),
new XAttribute("ny", getSingleString(pathPointNode.Normal.Y)),
new XAttribute("nz", getSingleString(pathPointNode.Normal.Z)),
new XAttribute("val", getUInt32String(pathPointNode.Unknown)));
}
XObject convertPath(List<ByamlPathPoint> pathNode)
{
XElement xElement = new XElement(name, new XAttribute("type", "path"));
foreach (dynamic element in pathNode)
xElement.Add(SaveNode("point", element, true));
return xElement;
}
XElement convertDictionary(IDictionary<string, dynamic> dictionaryNode)
{
XElement xElement = new XElement(name);
foreach (KeyValuePair<string, dynamic> element in dictionaryNode.OrderBy(x => x.Key, StringComparer.Ordinal))
xElement.Add(SaveNode(element.Key, element.Value, false));
return xElement;
}
XElement convertArray(IEnumerable<dynamic> arrayNode)
{
XElement xElement = new XElement(name, new XAttribute("type", "array"));
foreach (dynamic element in arrayNode)
xElement.Add(SaveNode("value", element, true));
return xElement;
}
string getBooleanString(Boolean value) => value ? "true" : "false";
string getInt32String(Int32 value) => value.ToString(CultureInfo.InvariantCulture);
string getSingleString(Single value) => value.ToString(CultureInfo.InvariantCulture) + "f";
string getUInt32String(UInt32 value) => value.ToString(CultureInfo.InvariantCulture) + "u";
string getInt64String(Int64 value) => value.ToString(CultureInfo.InvariantCulture) + "i64";
string getUInt64String(UInt64 value) => value.ToString(CultureInfo.InvariantCulture) + "u64";
string getDoubleString(Double value) => value.ToString(CultureInfo.InvariantCulture) + "d";
if (node == null) return convertString("null");
name = XmlConvert.EncodeName(name);
if (node is bool) return convertValue(getBooleanString((bool)node));
else if (node is int) return convertValue(getInt32String((int)node));
else if (node is uint) return convertValue(getUInt32String((uint)node));
else if (node is float) return convertValue(getSingleString((float)node));
else if (node is UInt64) return convertValue(getUInt64String((UInt64)node));
else if (node is Int64) return convertValue(getInt64String((Int64)node));
else if (node is Double) return convertValue(getDoubleString((Double)node));
else if (node is string) return convertString(node);
else if (node is ByamlPathPoint) return convertPathPoint((ByamlPathPoint)node);
else if (node is List<ByamlPathPoint>) return convertPath((List<ByamlPathPoint>)node);
else if (node is IDictionary<string, dynamic>) return convertDictionary(node);
else if (node is IEnumerable<dynamic>) return convertArray(node);
else throw new Exception("Unsupported node type! " + node.GetType());
}
}
}

View file

@ -0,0 +1,265 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using AampLibraryCSharp.IO;
using SharpYaml.Serialization;
using System.Globalization;
using Syroot.BinaryData;
using System.Collections.Generic;
namespace FirstPlugin
{
public class YamlByamlConverter
{
//Generate a list of all complex dynamic values that are used for reference nodes
//The tag will be an ID to set the dynamic value
private static Dictionary<dynamic, YamlNode> NodePaths = new Dictionary<dynamic, YamlNode>();
//Used for saving by mapping tags to dynamic values
private static Dictionary<string, dynamic> ReferenceNodes = new Dictionary<string, dynamic>();
//id to keep track of reference nodes
static int refNodeId = 0;
public static string ToYaml(ByamlExt.Byaml.BymlFileData data)
{
/* var settings = new SerializerSettings()
{
EmitTags = false,
EmitAlias = false,
DefaultStyle = SharpYaml.YamlStyle.Flow,
SortKeyForMapping = false,
EmitShortTypeName = true,
EmitCapacityForList = false,
LimitPrimitiveFlowSequence = 4,
};
settings.RegisterTagMapping("!u", typeof(uint));
settings.RegisterTagMapping("!l", typeof(int));
settings.RegisterTagMapping("!d", typeof(double));
settings.RegisterTagMapping("!ul", typeof(ulong));
settings.RegisterTagMapping("!ll", typeof(long));
var serializer = new Serializer(settings);*/
NodePaths.Clear();
refNodeId = 0;
YamlNode root = SaveNode("root", data.RootNode);
YamlMappingNode mapping = new YamlMappingNode();
mapping.Add("Version", data.Version.ToString());
mapping.Add("IsBigEndian", (data.byteOrder == ByteOrder.BigEndian).ToString());
mapping.Add("SupportPaths", data.SupportPaths.ToString());
mapping.Add("HasReferenceNodes", (refNodeId != 0).ToString());
mapping.Add("root", root);
NodePaths.Clear();
refNodeId = 0;
var doc = new YamlDocument(mapping);
YamlStream stream = new YamlStream(doc);
var buffer = new StringBuilder();
using (var writer = new StringWriter(buffer)) {
stream.Save(writer, true);
return writer.ToString();
}
}
public static ByamlExt.Byaml.BymlFileData FromYaml(string text)
{
NodePaths.Clear();
ReferenceNodes.Clear();
var data = new ByamlExt.Byaml.BymlFileData();
var yaml = new YamlStream();
yaml.Load(new StringReader(text));
var mapping = (YamlMappingNode)yaml.Documents[0].RootNode;
foreach (var child in mapping.Children)
{
var key = ((YamlScalarNode)child.Key).Value;
var value = child.Value.ToString();
if (key == "Version")
data.Version = ushort.Parse(value);
if (key == "IsBigEndian")
data.byteOrder = bool.Parse(value) ? ByteOrder.BigEndian : ByteOrder.LittleEndian;
if (key == "SupportPaths")
data.SupportPaths = bool.Parse(value);
if (child.Value is YamlMappingNode)
data.RootNode = ParseNode(child.Value);
if (child.Value is YamlSequenceNode)
data.RootNode = ParseNode(child.Value);
}
ReferenceNodes.Clear();
NodePaths.Clear();
return data;
}
static dynamic ParseNode(YamlNode node)
{
if (node is YamlMappingNode)
{
var values = new Dictionary<string, dynamic>();
if (IsValidReference(node))
ReferenceNodes.Add(node.Tag, values);
foreach (var child in ((YamlMappingNode)node).Children)
values.Add(((YamlScalarNode)child.Key).Value, ParseNode(child.Value));
return values;
}
else if (node is YamlSequenceNode) {
var values = new List<dynamic>();
if (IsValidReference(node))
ReferenceNodes.Add(node.Tag, values);
foreach (var child in ((YamlSequenceNode)node).Children)
values.Add(ParseNode(child));
return values;
} //Reference node
else if (node is YamlScalarNode && ((YamlScalarNode)node).Value.Contains("!refTag=")) {
string tag = ((YamlScalarNode)node).Value.Replace("!refTag=", string.Empty);
Console.WriteLine($"refNode {tag} {ReferenceNodes.ContainsKey(tag)}");
if (ReferenceNodes.ContainsKey(tag))
return ReferenceNodes[tag];
else {
Console.WriteLine("Failed to find reference node! " + tag);
return null;
}
}
else {
return ConvertValue(((YamlScalarNode)node).Value, ((YamlScalarNode)node).Tag);
}
}
static bool IsValidReference(YamlNode node) {
return node.Tag != null && node.Tag.Contains("!ref") && !ReferenceNodes.ContainsKey(node.Tag);
}
static dynamic ConvertValue(string value, string tag)
{
if (tag == null)
tag = "";
if (value == "null")
return null;
else if (value == "true")
return true;
else if (value == "false")
return false;
else if (tag == "!u")
return UInt32.Parse(value, CultureInfo.InvariantCulture);
else if (tag == "!l")
return Int32.Parse(value, CultureInfo.InvariantCulture);
else if (tag == "!d")
return Double.Parse(value, CultureInfo.InvariantCulture);
else if (tag == "!ul")
return UInt64.Parse(value, CultureInfo.InvariantCulture);
else if (tag == "!ll")
return Int64.Parse(value, CultureInfo.InvariantCulture);
else
{
float floatValue = 0;
bool isFloat = float.TryParse(value, out floatValue);
if (isFloat)
return floatValue;
else
return value;
}
}
static YamlNode SaveNode(string name, dynamic node)
{
if (node == null) {
return new YamlScalarNode("null");
}
else if (NodePaths.ContainsKey(node))
{
if (NodePaths[node].Tag == null)
NodePaths[node].Tag = $"!ref{refNodeId++}";
return new YamlScalarNode($"!refTag={NodePaths[node].Tag}");
}
else if ((node is IList<dynamic>))
{
var yamlNode = new YamlSequenceNode();
NodePaths.Add(node, yamlNode);
if (!HasEnumerables((IList<dynamic>)node) &&
((IList<dynamic>)node).Count < 6)
yamlNode.Style = SharpYaml.YamlStyle.Flow;
foreach (var item in (IList<dynamic>)node)
yamlNode.Add(SaveNode(null, item));
return yamlNode;
}
else if (node is IDictionary<string, dynamic>)
{
var yamlNode = new YamlMappingNode();
NodePaths.Add(node, yamlNode);
if (!HasEnumerables((IDictionary<string, dynamic>)node) &&
((IDictionary<string, dynamic>)node).Count < 6)
yamlNode.Style = SharpYaml.YamlStyle.Flow;
foreach (var item in (IDictionary<string, dynamic>)node)
yamlNode.Add(item.Key, SaveNode(item.Key, item.Value));
return yamlNode;
}
else
{
string tag = null;
if (node is int) tag = "!l";
else if (node is uint) tag = "!u";
else if (node is Int64) tag = "!ul";
else if (node is double) tag = "!d";
var yamlNode = new YamlScalarNode(ConvertValue(node));
if (tag != null) yamlNode.Tag = tag;
return yamlNode;
}
}
private static bool HasEnumerables(IDictionary<string, dynamic> node)
{
foreach (var item in node.Values)
{
if (item == null)
continue;
if (item is IList<dynamic>)
return true;
else if (item is IDictionary<string, dynamic>)
return true;
}
return false;
}
private static bool HasEnumerables(IList<dynamic> node)
{
foreach (var item in node)
{
if (node == null)
continue;
if (node is IList<dynamic>)
return true;
else if (node is IDictionary<string, dynamic>)
return true;
}
return false;
}
private static string ConvertValue(dynamic node)
{
string getBooleanString(Boolean value) => value ? "true" : "false";
if (node is bool) return getBooleanString((bool)node);
else return node.ToString();
}
}
}

View file

@ -39,17 +39,8 @@
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
</PropertyGroup>
<ItemGroup>
<Reference Include="AampCommon">
<HintPath>..\Toolbox\Lib\AampCommon.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="AampV1Library">
<HintPath>..\Toolbox\Lib\AampV1Library.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="AampV2Library">
<HintPath>..\Toolbox\Lib\AampV2Library.dll</HintPath>
<Private>False</Private>
<Reference Include="AampLibraryCSharp">
<HintPath>..\Toolbox\Lib\AampLibraryCSharp.dll</HintPath>
</Reference>
<Reference Include="BarsLibrary">
<HintPath>..\Toolbox\Lib\BarsLibrary.dll</HintPath>
@ -236,6 +227,8 @@
<Compile Include="FileFormats\BCH\Wrappers\Model\H3DModelWrapper.cs" />
<Compile Include="FileFormats\BCH\Wrappers\Model\H3DSkeletonWrapper.cs" />
<Compile Include="FileFormats\BCH\Wrappers\SkeletalAnimation\H3DSkeletalAnimWrapper.cs" />
<Compile Include="FileFormats\Byaml\XmlByamlConverter.cs" />
<Compile Include="FileFormats\Byaml\YamlByamlConverter.cs" />
<Compile Include="FileFormats\LM1\LM1_MDL.cs" />
<Compile Include="FileFormats\MarioParty\HSF.cs" />
<Compile Include="FileFormats\MKAGPDX\LM2_ARCADE_Model.cs" />
@ -325,10 +318,10 @@
<Compile Include="FileFormats\Effects\PTCL_3DS.cs" />
<Compile Include="FileFormats\Effects\PTCL_WiiU.cs" />
<Compile Include="FileFormats\Font\BFFNT.cs" />
<Compile Include="FileFormats\Font\BFOTF.cs" />
<Compile Include="FileFormats\Audio\Archives\BFGRP.cs" />
<Compile Include="FileFormats\Font\BffntCharSet2Xlor.cs" />
<Compile Include="FileFormats\Font\BFTTF.cs" />
<Compile Include="FileFormats\Font\BFOTF.cs" />
<Compile Include="FileFormats\HyruleWarriors\G1M\G1M.cs" />
<Compile Include="FileFormats\HyruleWarriors\LINKDATA.cs" />
<Compile Include="FileFormats\Layout\Animation\LytAnimGroup.cs" />
@ -404,6 +397,7 @@
<Compile Include="GL\BFRES\BFRESRenderBase.cs" />
<Compile Include="GL\BMD_Renderer.cs" />
<Compile Include="GL\CMB_Renderer.cs" />
<Compile Include="GL\G1M_Renderer.cs" />
<Compile Include="GL\GXToOpenGL.cs" />
<Compile Include="GL\KCL_Render.cs" />
<Compile Include="GL\LM2_Render.cs" />
@ -852,11 +846,11 @@
<Compile Include="FileFormats\Audio\BRSTM.cs" />
<Compile Include="GL\Helpers\AlphaGLControl.cs" />
<Compile Include="GL\Helpers\ColorGLControl.cs" />
<Compile Include="GUI\AAMP\AampEditor.cs">
<Compile Include="GUI\AAMP\AampEditorBase.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="GUI\AAMP\AampEditor.Designer.cs">
<DependentUpon>AampEditor.cs</DependentUpon>
<Compile Include="GUI\AAMP\AampEditorBase.Designer.cs">
<DependentUpon>AampEditorBase.cs</DependentUpon>
</Compile>
<Compile Include="GUI\BFRES\ParamAnim\ParamPatternMaterialEditor.cs">
<SubType>Form</SubType>
@ -969,7 +963,6 @@
<Compile Include="Scenes\SMO\LevelObj.cs" />
<Compile Include="Scenes\SMO_Scene.cs" />
<Compile Include="Scenes\ZTP_Scene.cs" />
<Compile Include="YAML\YamlAamp.cs" />
<Compile Include="GUI\BFRES\BoneVisualAnims\BoneVisualAnimEditor.cs">
<SubType>UserControl</SubType>
</Compile>
@ -1153,16 +1146,12 @@
<DependentUpon>OdysseyCostumeLoader.cs</DependentUpon>
</Compile>
<Compile Include="GUI\SMO\MarioCostumeEditor.cs" />
<Compile Include="GUI\AAMP\AampV1Editor.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="GUI\AAMP\AampV2Editor.cs">
<Compile Include="GUI\AAMP\AampEditor.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="GUI\AAMP\EditBox.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="GUI\AAMP\EditBox.Designer.cs" />
<Compile Include="GUI\BFRES\BfresEditor.cs">
<SubType>UserControl</SubType>
</Compile>
@ -1563,8 +1552,8 @@
<None Include="Resources\InjectTexErrored.dds" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="GUI\AAMP\AampEditor.resx">
<DependentUpon>AampEditor.cs</DependentUpon>
<EmbeddedResource Include="GUI\AAMP\AampEditorBase.resx">
<DependentUpon>AampEditorBase.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="GUI\AAMP\EditBox.resx" />
<EmbeddedResource Include="GUI\Advanced Editor\TextureViewer.resx">

View file

@ -1,202 +1,234 @@
using ByamlExt.Byaml;
using System;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Syroot.BinaryData;
using EditorCore;
using Toolbox.Library.Forms;
using AampLibraryCSharp;
using Syroot.Maths;
using Toolbox.Library;
using ByamlExt;
using Toolbox.Library.Forms;
namespace FirstPlugin.Forms
{
public partial class AampEditorBase : STUserControl, IFIleEditor
public partial class AampEditor : AampEditorBase
{
public AAMP AampFile;
public List<IFileFormat> GetFileFormats()
public AampEditor(AAMP aamp, bool IsSaveDialog) : base(aamp, IsSaveDialog)
{
return new List<IFileFormat>() { AampFile };
treeView1.Nodes.Add(aamp.FileName);
LoadFile(aamp.aampFile, treeView1.Nodes[0]);
}
public AampEditorBase(AAMP aamp, bool IsSaveDialog)
public void LoadFile(AampFile aampFile, TreeNode parentNode)
{
InitializeComponent();
treeView1.BackColor = FormThemes.BaseTheme.FormBackColor;
treeView1.ForeColor = FormThemes.BaseTheme.FormForeColor;
AampFile = aamp;
if (AampFile.aampFileV1 != null)
{
Text = $"{AampFile.FileName} Type [{AampFile.aampFileV1.EffectType}]";
}
else
{
Text = $"{AampFile.FileName} Type [{AampFile.aampFileV2.EffectType}]";
}
STContextMenuStrip contextMenuStrip1 = new STContextMenuStrip();
contextMenuStrip1.Items.Add(new ToolStripMenuItem("Save", null, saveAsToolStripMenuItem_Click, Keys.Control | Keys.I));
contextMenuStrip1.Items.Add(new ToolStripSeparator());
contextMenuStrip1.Items.Add(new ToolStripMenuItem("Export as Yaml", null, ToYamlAction, Keys.Control | Keys.A));
contextMenuStrip1.Items.Add(new ToolStripMenuItem("Open as Yaml", null, OpenYamlEditorAction, Keys.Control | Keys.A));
this.treeView1.ContextMenuStrip = contextMenuStrip1;
LoadChildNodes(aampFile.RootNode, parentNode);
}
private void OpenYamlEditorAction(object sender, EventArgs e)
public override void TreeView_AfterSelect()
{
string yaml = "";
var node = treeView1.SelectedNode;
if (AampFile.aampFileV1 != null)
yaml = AampYamlConverter.ToYaml(AampFile.aampFileV1);
else
yaml = AampYamlConverter.ToYaml(AampFile.aampFileV2);
STForm form = new STForm();
form.Text = "YAML Text Editor";
var panel = new STPanel() { Dock = DockStyle.Fill, };
form.AddControl(panel);
var editor = new TextEditor() { Dock = DockStyle.Fill, };
editor.FillEditor(yaml);
editor.IsYAML = true;
panel.Controls.Add(editor);
if (form.ShowDialog() == DialogResult.OK)
if (node.Tag != null)
{
if (node.Tag is ParamObject) {
LoadObjectDataList((ParamObject)node.Tag);
}
}
}
private void ToYamlAction(object sender, EventArgs e)
public override void AddParamEntry(TreeNode parentNode)
{
SaveFileDialog sfd = new SaveFileDialog();
sfd.Filter = "YAML|*.yaml;";
if (sfd.ShowDialog() == DialogResult.OK)
if (parentNode.Tag != null && parentNode.Tag is ParamObject)
{
string yaml = "";
ParamEntry entry = new ParamEntry();
entry.ParamType = ParamType.Float;
entry.HashString = "NewEntry";
entry.Value = 0;
if (AampFile.aampFileV1 != null)
yaml = AampYamlConverter.ToYaml(AampFile.aampFileV1);
else
yaml = AampYamlConverter.ToYaml(AampFile.aampFileV2);
ListViewItem item = new ListViewItem();
SetListItemParamObject(entry, item);
File.WriteAllText(sfd.FileName, yaml);
OpenNewParamEditor(entry,(ParamObject)parentNode.Tag, item);
}
}
private void CopyNode_Click(object sender, EventArgs e)
public override void RenameParamEntry(ListViewItem SelectedItem)
{
Clipboard.SetText(treeView1.SelectedNode.Text);
}
private void saveAsToolStripMenuItem_Click(object sender, EventArgs e)
{
SaveFileDialog sav = new SaveFileDialog() { FileName = AampFile.FileName, Filter = "Parameter Archive | *.aamp" };
if (sav.ShowDialog() == DialogResult.OK)
if (SelectedItem.Tag != null && SelectedItem.Tag is ParamEntry)
{
Toolbox.Library.IO.STFileSaver.SaveFileFormat(AampFile, sav.FileName);
RenameDialog dialog = new RenameDialog();
dialog.SetString(SelectedItem.Text);
if (dialog.ShowDialog() == DialogResult.OK)
{
string NewString = dialog.textBox1.Text;
((ParamEntry)SelectedItem.Tag).HashString = NewString;
}
}
}
private void editValueNodeMenuItem_Click(object sender, EventArgs e)
public override void OnEditorClick(ListViewItem SelectedItem)
{
if (listViewCustom1.SelectedItems.Count <= 0)
return;
OnEditorClick(listViewCustom1.SelectedItems[0]);
if (SelectedItem.Tag != null && SelectedItem.Tag is ParamEntry)
{
OpenEditor((ParamEntry)SelectedItem.Tag, SelectedItem);
}
}
private void ResetValues()
private void LoadObjectDataList(ParamObject paramObj)
{
if (treeView1.SelectedNode == null)
return;
listViewCustom1.Items.Clear();
var targetNodeCollection = treeView1.SelectedNode.Nodes;
dynamic target = treeView1.SelectedNode.Tag;
}
private void treeView1_AfterSelect(object sender, TreeViewEventArgs e) {
ResetValues();
TreeView_AfterSelect();
}
private void addNodeToolStripMenuItem_Click(object sender, EventArgs e) {
if (treeView1.SelectedNode == null)
return;
AddParamEntry(treeView1.SelectedNode);
}
public virtual void OnEditorClick(ListViewItem SelectedItem) { }
public virtual void TreeView_AfterSelect() { }
public virtual void AddParamEntry(TreeNode parent) { }
public virtual void RenameParamEntry(ListViewItem SelectedItem) { }
public virtual void OnEntryDeletion(object target, TreeNode parent) { }
private void deleteToolStripMenuItem_Click(object sender, EventArgs e)
{
if (listViewCustom1.SelectedItems.Count <= 0 && treeView1.SelectedNode != null)
return;
var result = MessageBox.Show("Are you sure you want to remove this entry? This cannot be undone!",
$"Entry {listViewCustom1.SelectedItems[0].Text}", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if (result == DialogResult.Yes)
foreach (var entry in paramObj.paramEntries)
{
OnEntryDeletion(listViewCustom1.SelectedItems[0].Tag, treeView1.SelectedNode);
int index = listViewCustom1.Items.IndexOf(listViewCustom1.SelectedItems[0]);
listViewCustom1.Items.RemoveAt(index);
ListViewItem item = new ListViewItem(entry.HashString);
SetListItemParamObject(entry, item);
listViewCustom1.Items.Add(item);
}
}
private void renameToolStripMenuItem_Click(object sender, EventArgs e) {
if (listViewCustom1.SelectedItems.Count <= 0)
return;
private void SetListItemParamObject(ParamEntry entry, ListViewItem item)
{
item.SubItems.Clear();
item.Text = entry.HashString;
item.Tag = entry;
item.UseItemStyleForSubItems = false;
item.SubItems.Add(entry.ParamType.ToString());
string ValueText = "";
RenameParamEntry(listViewCustom1.SelectedItems[0]);
System.Drawing.Color color = System.Drawing.Color.Empty;
switch (entry.ParamType)
{
case ParamType.Boolean:
case ParamType.Float:
case ParamType.Int:
case ParamType.Uint:
ValueText = $"{entry.Value}";
break;
case ParamType.String64:
case ParamType.String32:
case ParamType.String256:
case ParamType.StringRef:
ValueText = $"{((AampLibraryCSharp.StringEntry)entry.Value).ToString()}";
break;
case ParamType.Vector2F:
var vec2 = (Vector2F)entry.Value;
ValueText = $"{vec2.X} {vec2.Y}";
break;
case ParamType.Vector3F:
var vec3 = (Vector3F)entry.Value;
ValueText = $"{vec3.X} {vec3.Y} {vec3.Z}";
break;
case ParamType.Vector4F:
var vec4 = (Vector4F)entry.Value;
ValueText = $"{vec4.X} {vec4.Y} {vec4.Z} {vec4.W}";
break;
case ParamType.Color4F:
var col = (Vector4F)entry.Value;
ValueText = $"{col.X} {col.Y} {col.Z} {col.W}";
int ImageIndex = Images.Count;
color = System.Drawing.Color.FromArgb(
EditBox.FloatToIntClamp(col.W),
EditBox.FloatToIntClamp(col.X),
EditBox.FloatToIntClamp(col.Y),
EditBox.FloatToIntClamp(col.Z));
break;
default:
break;
}
item.SubItems.Add(ValueText);
if (color != System.Drawing.Color.Empty)
item.SubItems[2].BackColor = color;
}
private void deleteNodeToolStripMenuItem_Click(object sender, EventArgs e)
public override void OnEntryDeletion(object obj, TreeNode objNode)
{
if (treeView1.SelectedNode == null)
if (obj is ParamEntry)
{
return;
var paramObjectParent = (ParamObject)objNode.Tag;
var entryList = new List<ParamEntry>();
for (int i = 0; i < paramObjectParent.paramEntries.Length; i++)
entryList.Add(paramObjectParent.paramEntries[i]);
entryList.Remove((ParamEntry)obj);
paramObjectParent.paramEntries = entryList.ToArray();
}
}
private void contentContainer_Paint(object sender, PaintEventArgs e)
public void LoadChildNodes(ParamList paramList, TreeNode parentNode)
{
TreeNode newNode = new TreeNode(paramList.HashString);
newNode.Tag = paramList;
parentNode.Nodes.Add(newNode);
//Add lists and objects if exits
if (paramList.childParams.Length > 0)
newNode.Nodes.Add("list", "Lists {}");
if (paramList.paramObjects.Length > 0)
newNode.Nodes.Add("obj", "Objects {}");
//Add child nodes
foreach (var child in paramList.childParams)
LoadChildNodes(child, newNode.Nodes["list"]);
//Add object nodes
foreach (var obj in paramList.paramObjects)
SetObjNode(obj, newNode.Nodes["obj"]);
}
private void listViewCustom1_MouseClick(object sender, MouseEventArgs e)
List<Bitmap> Images = new List<Bitmap>();
void SetObjNode(ParamObject paramObj, TreeNode parentNode)
{
if (e.Button == MouseButtons.Right)
string name = paramObj.HashString;
var objNode = new TreeNode(name);
objNode.Tag = paramObj;
parentNode.Nodes.Add(objNode);
}
private void OpenNewParamEditor(ParamEntry entry, ParamObject paramObject, ListViewItem SelectedItem)
{
EditBox editor = new EditBox();
editor.LoadEntry(entry);
editor.ToggleNameEditing(true);
if (editor.ShowDialog() == DialogResult.OK)
{
Point pt = listViewCustom1.PointToScreen(e.Location);
stContextMenuStrip1.Show(pt);
editor.SaveEntry();
SetListItemParamObject(entry, SelectedItem);
listViewCustom1.Items.Add(SelectedItem);
var entryList = new List<ParamEntry>();
for (int i = 0; i < paramObject.paramEntries.Length; i++)
entryList.Add(paramObject.paramEntries[i]);
entryList.Add(entry);
paramObject.paramEntries = entryList.ToArray();
}
}
private void stContextMenuStrip1_Opening(object sender, CancelEventArgs e)
private void OpenEditor(ParamEntry entry, ListViewItem SelectedItem)
{
EditBox editor = new EditBox();
editor.LoadEntry(entry);
editor.ToggleNameEditing(true);
if (editor.ShowDialog() == DialogResult.OK)
{
editor.SaveEntry();
SetListItemParamObject(entry, SelectedItem);
}
}
}
}

View file

@ -39,6 +39,10 @@
this.columnHeader3 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.splitContainer1 = new System.Windows.Forms.SplitContainer();
this.stPanel1 = new Toolbox.Library.Forms.STPanel();
this.stTabControl1 = new Toolbox.Library.Forms.STTabControl();
this.tabPage1 = new System.Windows.Forms.TabPage();
this.tabPage2 = new System.Windows.Forms.TabPage();
this.stPanel2 = new Toolbox.Library.Forms.STPanel();
this.addItemToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.editToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.renameToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
@ -49,6 +53,9 @@
this.splitContainer1.Panel2.SuspendLayout();
this.splitContainer1.SuspendLayout();
this.stPanel1.SuspendLayout();
this.stTabControl1.SuspendLayout();
this.tabPage1.SuspendLayout();
this.tabPage2.SuspendLayout();
this.stContextMenuStrip1.SuspendLayout();
this.SuspendLayout();
//
@ -58,7 +65,7 @@
this.treeView1.Dock = System.Windows.Forms.DockStyle.Fill;
this.treeView1.Location = new System.Drawing.Point(0, 0);
this.treeView1.Name = "treeView1";
this.treeView1.Size = new System.Drawing.Size(183, 398);
this.treeView1.Size = new System.Drawing.Size(217, 462);
this.treeView1.TabIndex = 0;
this.treeView1.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.treeView1_AfterSelect);
//
@ -88,10 +95,11 @@
this.columnHeader3});
this.listViewCustom1.Dock = System.Windows.Forms.DockStyle.Fill;
this.listViewCustom1.FullRowSelect = true;
this.listViewCustom1.HideSelection = false;
this.listViewCustom1.Location = new System.Drawing.Point(0, 0);
this.listViewCustom1.Name = "listViewCustom1";
this.listViewCustom1.OwnerDraw = true;
this.listViewCustom1.Size = new System.Drawing.Size(362, 398);
this.listViewCustom1.Size = new System.Drawing.Size(432, 462);
this.listViewCustom1.TabIndex = 0;
this.listViewCustom1.UseCompatibleStateImageBehavior = false;
this.listViewCustom1.View = System.Windows.Forms.View.Details;
@ -110,12 +118,12 @@
// columnHeader3
//
this.columnHeader3.Text = "Data";
this.columnHeader3.Width = 155;
this.columnHeader3.Width = 225;
//
// splitContainer1
//
this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill;
this.splitContainer1.Location = new System.Drawing.Point(0, 0);
this.splitContainer1.Location = new System.Drawing.Point(3, 3);
this.splitContainer1.Name = "splitContainer1";
//
// splitContainer1.Panel1
@ -125,19 +133,61 @@
// splitContainer1.Panel2
//
this.splitContainer1.Panel2.Controls.Add(this.listViewCustom1);
this.splitContainer1.Size = new System.Drawing.Size(549, 398);
this.splitContainer1.SplitterDistance = 183;
this.splitContainer1.Size = new System.Drawing.Size(653, 462);
this.splitContainer1.SplitterDistance = 217;
this.splitContainer1.TabIndex = 14;
//
// stPanel1
//
this.stPanel1.Controls.Add(this.splitContainer1);
this.stPanel1.Controls.Add(this.stTabControl1);
this.stPanel1.Dock = System.Windows.Forms.DockStyle.Fill;
this.stPanel1.Location = new System.Drawing.Point(0, 0);
this.stPanel1.Name = "stPanel1";
this.stPanel1.Size = new System.Drawing.Size(549, 398);
this.stPanel1.Size = new System.Drawing.Size(667, 497);
this.stPanel1.TabIndex = 15;
//
// stTabControl1
//
this.stTabControl1.Controls.Add(this.tabPage1);
this.stTabControl1.Controls.Add(this.tabPage2);
this.stTabControl1.Dock = System.Windows.Forms.DockStyle.Fill;
this.stTabControl1.Location = new System.Drawing.Point(0, 0);
this.stTabControl1.myBackColor = System.Drawing.Color.Empty;
this.stTabControl1.Name = "stTabControl1";
this.stTabControl1.SelectedIndex = 0;
this.stTabControl1.Size = new System.Drawing.Size(667, 497);
this.stTabControl1.TabIndex = 15;
//
// tabPage1
//
this.tabPage1.Controls.Add(this.splitContainer1);
this.tabPage1.Location = new System.Drawing.Point(4, 25);
this.tabPage1.Name = "tabPage1";
this.tabPage1.Padding = new System.Windows.Forms.Padding(3);
this.tabPage1.Size = new System.Drawing.Size(659, 468);
this.tabPage1.TabIndex = 0;
this.tabPage1.Text = "Editor";
this.tabPage1.UseVisualStyleBackColor = true;
//
// tabPage2
//
this.tabPage2.Controls.Add(this.stPanel2);
this.tabPage2.Location = new System.Drawing.Point(4, 25);
this.tabPage2.Name = "tabPage2";
this.tabPage2.Padding = new System.Windows.Forms.Padding(3);
this.tabPage2.Size = new System.Drawing.Size(659, 468);
this.tabPage2.TabIndex = 1;
this.tabPage2.Text = "Text Editor";
this.tabPage2.UseVisualStyleBackColor = true;
//
// stPanel2
//
this.stPanel2.Dock = System.Windows.Forms.DockStyle.Fill;
this.stPanel2.Location = new System.Drawing.Point(3, 3);
this.stPanel2.Name = "stPanel2";
this.stPanel2.Size = new System.Drawing.Size(653, 462);
this.stPanel2.TabIndex = 0;
//
// addItemToolStripMenuItem
//
this.addItemToolStripMenuItem.Name = "addItemToolStripMenuItem";
@ -183,12 +233,15 @@
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.stPanel1);
this.Name = "AampEditorBase";
this.Size = new System.Drawing.Size(549, 398);
this.Size = new System.Drawing.Size(667, 497);
this.splitContainer1.Panel1.ResumeLayout(false);
this.splitContainer1.Panel2.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit();
this.splitContainer1.ResumeLayout(false);
this.stPanel1.ResumeLayout(false);
this.stTabControl1.ResumeLayout(false);
this.tabPage1.ResumeLayout(false);
this.tabPage2.ResumeLayout(false);
this.stContextMenuStrip1.ResumeLayout(false);
this.ResumeLayout(false);
@ -211,5 +264,9 @@
private System.Windows.Forms.ToolStripMenuItem renameToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem deleteToolStripMenuItem;
private Toolbox.Library.Forms.STContextMenuStrip stContextMenuStrip1;
private Toolbox.Library.Forms.STTabControl stTabControl1;
private System.Windows.Forms.TabPage tabPage1;
private System.Windows.Forms.TabPage tabPage2;
private Toolbox.Library.Forms.STPanel stPanel2;
}
}

View file

@ -0,0 +1,220 @@
using ByamlExt.Byaml;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Syroot.BinaryData;
using EditorCore;
using Toolbox.Library.Forms;
using Toolbox.Library;
using ByamlExt;
namespace FirstPlugin.Forms
{
public partial class AampEditorBase : STUserControl, IFIleEditor
{
public AAMP AampFile;
public List<IFileFormat> GetFileFormats()
{
return new List<IFileFormat>() { AampFile };
}
private TextEditor textEditor;
public AampEditorBase(AAMP aamp, bool IsSaveDialog)
{
InitializeComponent();
treeView1.BackColor = FormThemes.BaseTheme.FormBackColor;
treeView1.ForeColor = FormThemes.BaseTheme.FormForeColor;
stTabControl1.myBackColor = FormThemes.BaseTheme.FormBackColor;
AampFile = aamp;
Text = $"{AampFile.FileName} Type [{AampFile.aampFile.EffectType}]";
STContextMenuStrip contextMenuStrip1 = new STContextMenuStrip();
contextMenuStrip1.Items.Add(new ToolStripMenuItem("Save", null, saveAsToolStripMenuItem_Click, Keys.Control | Keys.I));
contextMenuStrip1.Items.Add(new ToolStripSeparator());
contextMenuStrip1.Items.Add(new ToolStripMenuItem("Export as Yaml", null, ToYamlAction, Keys.Control | Keys.A));
contextMenuStrip1.Items.Add(new ToolStripMenuItem("Open as Yaml", null, OpenYamlEditorAction, Keys.Control | Keys.A));
this.treeView1.ContextMenuStrip = contextMenuStrip1;
textEditor = new TextEditor();
textEditor.Dock = DockStyle.Fill;
textEditor.ClearContextMenus();
textEditor.AddContextMenu("Decompile", TextEditorToYaml);
textEditor.AddContextMenu("Compile", TextEditorFromYaml);
stPanel2.Controls.Add(textEditor);
}
private void TextEditorToYaml(object sender, EventArgs e)
{
if (AampFile == null) return;
textEditor.FillEditor(AampFile.ConvertToString());
textEditor.IsYAML = true;
}
private void TextEditorFromYaml(object sender, EventArgs e)
{
if (AampFile == null) return;
var text = textEditor.GetText();
if (text != string.Empty) {
try
{
AampFile.ConvertFromString(text);
}
catch (Exception ex)
{
MessageBox.Show("Aamp failed to convert! " + ex.ToString());
return;
}
MessageBox.Show("Aamp converted successfully!");
}
}
private void OpenYamlEditorAction(object sender, EventArgs e)
{
string yaml = AampLibraryCSharp.YamlConverter.ToYaml(AampFile.aampFile);
STForm form = new STForm();
form.Text = "YAML Text Editor";
var panel = new STPanel() { Dock = DockStyle.Fill, };
form.AddControl(panel);
var editor = new TextEditor() { Dock = DockStyle.Fill, };
editor.FillEditor(yaml);
editor.IsYAML = true;
panel.Controls.Add(editor);
if (form.ShowDialog() == DialogResult.OK)
{
}
}
private void ToYamlAction(object sender, EventArgs e)
{
SaveFileDialog sfd = new SaveFileDialog();
sfd.Filter = "YAML|*.yaml;";
if (sfd.ShowDialog() == DialogResult.OK)
{
string yaml = AampLibraryCSharp.YamlConverter.ToYaml(AampFile.aampFile);
File.WriteAllText(sfd.FileName, yaml);
}
}
private void CopyNode_Click(object sender, EventArgs e)
{
Clipboard.SetText(treeView1.SelectedNode.Text);
}
private void saveAsToolStripMenuItem_Click(object sender, EventArgs e)
{
SaveFileDialog sav = new SaveFileDialog() { FileName = AampFile.FileName, Filter = "Parameter Archive | *.aamp" };
if (sav.ShowDialog() == DialogResult.OK)
{
Toolbox.Library.IO.STFileSaver.SaveFileFormat(AampFile, sav.FileName);
}
}
private void editValueNodeMenuItem_Click(object sender, EventArgs e)
{
if (listViewCustom1.SelectedItems.Count <= 0)
return;
OnEditorClick(listViewCustom1.SelectedItems[0]);
}
private void ResetValues()
{
if (treeView1.SelectedNode == null)
return;
listViewCustom1.Items.Clear();
var targetNodeCollection = treeView1.SelectedNode.Nodes;
dynamic target = treeView1.SelectedNode.Tag;
}
private void treeView1_AfterSelect(object sender, TreeViewEventArgs e) {
ResetValues();
TreeView_AfterSelect();
}
private void addNodeToolStripMenuItem_Click(object sender, EventArgs e) {
if (treeView1.SelectedNode == null)
return;
AddParamEntry(treeView1.SelectedNode);
}
public virtual void OnEditorClick(ListViewItem SelectedItem) { }
public virtual void TreeView_AfterSelect() { }
public virtual void AddParamEntry(TreeNode parent) { }
public virtual void RenameParamEntry(ListViewItem SelectedItem) { }
public virtual void OnEntryDeletion(object target, TreeNode parent) { }
private void deleteToolStripMenuItem_Click(object sender, EventArgs e)
{
if (listViewCustom1.SelectedItems.Count <= 0 && treeView1.SelectedNode != null)
return;
var result = MessageBox.Show("Are you sure you want to remove this entry? This cannot be undone!",
$"Entry {listViewCustom1.SelectedItems[0].Text}", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if (result == DialogResult.Yes)
{
OnEntryDeletion(listViewCustom1.SelectedItems[0].Tag, treeView1.SelectedNode);
int index = listViewCustom1.Items.IndexOf(listViewCustom1.SelectedItems[0]);
listViewCustom1.Items.RemoveAt(index);
}
}
private void renameToolStripMenuItem_Click(object sender, EventArgs e) {
if (listViewCustom1.SelectedItems.Count <= 0)
return;
RenameParamEntry(listViewCustom1.SelectedItems[0]);
}
private void deleteNodeToolStripMenuItem_Click(object sender, EventArgs e)
{
if (treeView1.SelectedNode == null)
{
return;
}
}
private void contentContainer_Paint(object sender, PaintEventArgs e)
{
}
private void listViewCustom1_MouseClick(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
Point pt = listViewCustom1.PointToScreen(e.Location);
stContextMenuStrip1.Show(pt);
}
}
private void stContextMenuStrip1_Opening(object sender, CancelEventArgs e)
{
}
}
}

View file

@ -1,235 +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 AampV1Library;
using Syroot.Maths;
using Toolbox.Library;
using Toolbox.Library.Forms;
namespace FirstPlugin.Forms
{
public partial class AampV1Editor : AampEditorBase
{
public AampV1Editor(AAMP aamp, bool IsSaveDialog) : base(aamp, IsSaveDialog)
{
treeView1.Nodes.Add(aamp.FileName);
LoadFile(aamp.aampFileV1, treeView1.Nodes[0]);
}
public void LoadFile(AampFile aampFile, TreeNode parentNode)
{
LoadChildNodes(aampFile.RootNode, parentNode);
}
public override void TreeView_AfterSelect()
{
var node = treeView1.SelectedNode;
if (node.Tag != null)
{
if (node.Tag is ParamObject) {
LoadObjectDataList((ParamObject)node.Tag);
}
}
}
public override void AddParamEntry(TreeNode parentNode)
{
if (parentNode.Tag != null && parentNode.Tag is ParamObject)
{
ParamEntry entry = new ParamEntry();
entry.ParamType = ParamType.Float;
entry.HashString = "NewEntry";
entry.Value = 0;
ListViewItem item = new ListViewItem();
SetListItemParamObject(entry, item);
OpenNewParamEditor(entry,(ParamObject)parentNode.Tag, item);
}
}
public override void RenameParamEntry(ListViewItem SelectedItem)
{
if (SelectedItem.Tag != null && SelectedItem.Tag is ParamEntry)
{
RenameDialog dialog = new RenameDialog();
dialog.SetString(SelectedItem.Text);
if (dialog.ShowDialog() == DialogResult.OK)
{
string NewString = dialog.textBox1.Text;
((ParamEntry)SelectedItem.Tag).HashString = NewString;
}
}
}
public override void OnEditorClick(ListViewItem SelectedItem)
{
if (SelectedItem.Tag != null && SelectedItem.Tag is ParamEntry)
{
OpenEditor((ParamEntry)SelectedItem.Tag, SelectedItem);
}
}
private void LoadObjectDataList(ParamObject paramObj)
{
listViewCustom1.Items.Clear();
foreach (var entry in paramObj.paramEntries)
{
ListViewItem item = new ListViewItem(entry.HashString);
SetListItemParamObject(entry, item);
listViewCustom1.Items.Add(item);
}
}
private void SetListItemParamObject(ParamEntry entry, ListViewItem item)
{
item.SubItems.Clear();
item.Text = entry.HashString;
item.Tag = entry;
item.UseItemStyleForSubItems = false;
item.SubItems.Add(entry.ParamType.ToString());
string ValueText = "";
System.Drawing.Color color = System.Drawing.Color.Empty;
switch (entry.ParamType)
{
case ParamType.Boolean:
case ParamType.Float:
case ParamType.Int:
case ParamType.Uint:
ValueText = $"{entry.Value}";
break;
case ParamType.String64:
case ParamType.String32:
case ParamType.String256:
case ParamType.StringRef:
ValueText = $"{((AampCommon.StringEntry)entry.Value).ToString()}";
break;
case ParamType.Vector2F:
var vec2 = (Vector2F)entry.Value;
ValueText = $"{vec2.X} {vec2.Y}";
break;
case ParamType.Vector3F:
var vec3 = (Vector3F)entry.Value;
ValueText = $"{vec3.X} {vec3.Y} {vec3.Z}";
break;
case ParamType.Vector4F:
var vec4 = (Vector4F)entry.Value;
ValueText = $"{vec4.X} {vec4.Y} {vec4.Z} {vec4.W}";
break;
case ParamType.Color4F:
var col = (Vector4F)entry.Value;
ValueText = $"{col.X} {col.Y} {col.Z} {col.W}";
int ImageIndex = Images.Count;
color = System.Drawing.Color.FromArgb(
EditBox.FloatToIntClamp(col.W),
EditBox.FloatToIntClamp(col.X),
EditBox.FloatToIntClamp(col.Y),
EditBox.FloatToIntClamp(col.Z));
break;
default:
break;
}
item.SubItems.Add(ValueText);
if (color != System.Drawing.Color.Empty)
item.SubItems[2].BackColor = color;
}
public override void OnEntryDeletion(object obj, TreeNode objNode)
{
if (obj is ParamEntry)
{
var paramObjectParent = (ParamObject)objNode.Tag;
var entryList = new List<ParamEntry>();
for (int i = 0; i < paramObjectParent.paramEntries.Length; i++)
entryList.Add(paramObjectParent.paramEntries[i]);
entryList.Remove((ParamEntry)obj);
paramObjectParent.paramEntries = entryList.ToArray();
}
}
public void LoadChildNodes(ParamList paramList, TreeNode parentNode)
{
TreeNode newNode = new TreeNode(paramList.HashString);
newNode.Tag = paramList;
parentNode.Nodes.Add(newNode);
//Add lists and objects if exits
if (paramList.childParams.Length > 0)
newNode.Nodes.Add("list", "Lists {}");
if (paramList.paramObjects.Length > 0)
newNode.Nodes.Add("obj", "Objects {}");
//Add child nodes
foreach (var child in paramList.childParams)
LoadChildNodes(child, newNode.Nodes["list"]);
//Add object nodes
foreach (var obj in paramList.paramObjects)
SetObjNode(obj, newNode.Nodes["obj"]);
}
List<Bitmap> Images = new List<Bitmap>();
void SetObjNode(ParamObject paramObj, TreeNode parentNode)
{
string name = paramObj.HashString;
string groupName = paramObj.GroupHashString;
var objNode = new TreeNode(name);
objNode.Tag = paramObj;
parentNode.Nodes.Add(objNode);
}
private void OpenNewParamEditor(ParamEntry entry, ParamObject paramObject, ListViewItem SelectedItem)
{
EditBox editor = new EditBox();
editor.LoadEntry(entry);
editor.ToggleNameEditing(true);
if (editor.ShowDialog() == DialogResult.OK)
{
editor.SaveEntry();
SetListItemParamObject(entry, SelectedItem);
listViewCustom1.Items.Add(SelectedItem);
var entryList = new List<ParamEntry>();
for (int i = 0; i < paramObject.paramEntries.Length; i++)
entryList.Add(paramObject.paramEntries[i]);
entryList.Add(entry);
paramObject.paramEntries = entryList.ToArray();
}
}
private void OpenEditor(ParamEntry entry, ListViewItem SelectedItem)
{
EditBox editor = new EditBox();
editor.LoadEntry(entry);
editor.ToggleNameEditing(true);
if (editor.ShowDialog() == DialogResult.OK)
{
editor.SaveEntry();
SetListItemParamObject(entry, SelectedItem);
}
}
}
}

View file

@ -1,236 +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 AampV2Library;
using Syroot.Maths;
using Toolbox.Library;
using Toolbox.Library.Forms;
namespace FirstPlugin.Forms
{
public partial class AampV2Editor : AampEditorBase
{
public AampV2Editor(AAMP aamp, bool IsSaveDialog) : base(aamp, IsSaveDialog)
{
treeView1.Nodes.Add(aamp.FileName);
LoadFile(aamp.aampFileV2, treeView1.Nodes[0]);
}
public void LoadFile(AampFile aampFile, TreeNode parentNode)
{
LoadChildNodes(aampFile.RootNode, parentNode);
}
public override void TreeView_AfterSelect()
{
var node = treeView1.SelectedNode;
if (node.Tag != null)
{
if (node.Tag is ParamObject)
{
LoadObjectDataList((ParamObject)node.Tag);
}
}
}
public override void AddParamEntry(TreeNode parentNode)
{
if (parentNode.Tag != null && parentNode.Tag is ParamObject)
{
ParamEntry entry = new ParamEntry();
entry.ParamType = ParamType.Float;
entry.HashString = "NewEntry";
entry.Value = 0;
ListViewItem item = new ListViewItem();
SetListItemParamObject(entry, item);
OpenNewParamEditor(entry, (ParamObject)parentNode.Tag, item);
}
}
public override void RenameParamEntry(ListViewItem SelectedItem)
{
if (SelectedItem.Tag != null && SelectedItem.Tag is ParamEntry)
{
RenameDialog dialog = new RenameDialog();
dialog.SetString(SelectedItem.Text);
if (dialog.ShowDialog() == DialogResult.OK)
{
string NewString = dialog.textBox1.Text;
((ParamEntry)SelectedItem.Tag).HashString = NewString;
}
}
}
public override void OnEditorClick(ListViewItem SelectedItem)
{
if (SelectedItem.Tag != null && SelectedItem.Tag is ParamEntry)
{
OpenEditor((ParamEntry)SelectedItem.Tag, SelectedItem);
}
}
private void LoadObjectDataList(ParamObject paramObj)
{
listViewCustom1.Items.Clear();
foreach (var entry in paramObj.paramEntries)
{
ListViewItem item = new ListViewItem(entry.HashString);
SetListItemParamObject(entry, item);
listViewCustom1.Items.Add(item);
}
}
private void SetListItemParamObject(ParamEntry entry, ListViewItem item)
{
item.SubItems.Clear();
item.Text = entry.HashString;
item.Tag = entry;
item.UseItemStyleForSubItems = false;
item.SubItems.Add(entry.ParamType.ToString());
string ValueText = "";
System.Drawing.Color color = System.Drawing.Color.Empty;
switch (entry.ParamType)
{
case ParamType.Boolean:
case ParamType.Float:
case ParamType.Int:
case ParamType.Uint:
ValueText = $"{entry.Value}";
break;
case ParamType.String64:
case ParamType.String32:
case ParamType.String256:
case ParamType.StringRef:
ValueText = $"{((AampCommon.StringEntry)entry.Value).ToString()}";
break;
case ParamType.Vector2F:
var vec2 = (Vector2F)entry.Value;
ValueText = $"{vec2.X} {vec2.Y}";
break;
case ParamType.Vector3F:
var vec3 = (Vector3F)entry.Value;
ValueText = $"{vec3.X} {vec3.Y} {vec3.Z}";
break;
case ParamType.Vector4F:
var vec4 = (Vector4F)entry.Value;
ValueText = $"{vec4.X} {vec4.Y} {vec4.Z} {vec4.W}";
break;
case ParamType.Color4F:
var col = (Vector4F)entry.Value;
ValueText = $"{col.X} {col.Y} {col.Z} {col.W}";
int ImageIndex = Images.Count;
color = System.Drawing.Color.FromArgb(
EditBox.FloatToIntClamp(col.W),
EditBox.FloatToIntClamp(col.X),
EditBox.FloatToIntClamp(col.Y),
EditBox.FloatToIntClamp(col.Z));
break;
default:
break;
}
item.SubItems.Add(ValueText);
if (color != System.Drawing.Color.Empty)
item.SubItems[2].BackColor = color;
}
public override void OnEntryDeletion(object obj, TreeNode objNode)
{
if (obj is ParamEntry)
{
var paramObjectParent = (ParamObject)objNode.Tag;
var entryList = new List<ParamEntry>();
for (int i = 0; i < paramObjectParent.paramEntries.Length; i++)
entryList.Add(paramObjectParent.paramEntries[i]);
entryList.Remove((ParamEntry)obj);
paramObjectParent.paramEntries = entryList.ToArray();
}
}
public void LoadChildNodes(ParamList paramList, TreeNode parentNode)
{
TreeNode newNode = new TreeNode(paramList.HashString);
newNode.Tag = paramList;
parentNode.Nodes.Add(newNode);
//Add lists and objects if exits
if (paramList.childParams.Length > 0)
newNode.Nodes.Add("list", "Lists {}");
if (paramList.paramObjects.Length > 0)
newNode.Nodes.Add("obj", "Objects {}");
//Add child nodes
foreach (var child in paramList.childParams)
LoadChildNodes(child, newNode.Nodes["list"]);
//Add object nodes
foreach (var obj in paramList.paramObjects)
SetObjNode(obj, newNode.Nodes["obj"]);
}
List<Bitmap> Images = new List<Bitmap>();
void SetObjNode(ParamObject paramObj, TreeNode parentNode)
{
string name = paramObj.HashString;
var objNode = new TreeNode(name);
objNode.Tag = paramObj;
parentNode.Nodes.Add(objNode);
}
private void OpenNewParamEditor(ParamEntry entry, ParamObject paramObject, ListViewItem SelectedItem)
{
EditBox editor = new EditBox();
editor.LoadEntry(entry);
editor.ToggleNameEditing(true);
if (editor.ShowDialog() == DialogResult.OK)
{
editor.SaveEntry();
SetListItemParamObject(entry, SelectedItem);
listViewCustom1.Items.Add(SelectedItem);
var entryList = new List<ParamEntry>();
for (int i = 0; i < paramObject.paramEntries.Length; i++)
entryList.Add(paramObject.paramEntries[i]);
entryList.Add(entry);
paramObject.paramEntries = entryList.ToArray();
}
}
private void OpenEditor(ParamEntry entry, ListViewItem SelectedItem)
{
EditBox editor = new EditBox();
editor.LoadEntry(entry);
editor.ToggleNameEditing(true);
if (editor.ShowDialog() == DialogResult.OK)
{
editor.SaveEntry();
SetListItemParamObject(entry, SelectedItem);
}
}
}
}

View file

@ -1,133 +0,0 @@
namespace FirstPlugin.Forms
{
partial class EditBox
{
/// <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.nameTB = new System.Windows.Forms.TextBox();
this.typeCB = new System.Windows.Forms.ComboBox();
this.label1 = new System.Windows.Forms.Label();
this.label2 = new System.Windows.Forms.Label();
this.button1 = new System.Windows.Forms.Button();
this.dataTB = new System.Windows.Forms.TextBox();
this.pictureBox1 = new System.Windows.Forms.PictureBox();
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
this.SuspendLayout();
//
// nameTB
//
this.nameTB.Enabled = false;
this.nameTB.Location = new System.Drawing.Point(76, 12);
this.nameTB.Name = "nameTB";
this.nameTB.Size = new System.Drawing.Size(220, 20);
this.nameTB.TabIndex = 0;
//
// typeCB
//
this.typeCB.FormattingEnabled = true;
this.typeCB.Location = new System.Drawing.Point(76, 38);
this.typeCB.Name = "typeCB";
this.typeCB.Size = new System.Drawing.Size(220, 21);
this.typeCB.TabIndex = 1;
//
// label1
//
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(12, 15);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(38, 13);
this.label1.TabIndex = 2;
this.label1.Text = "Name:";
//
// label2
//
this.label2.AutoSize = true;
this.label2.Location = new System.Drawing.Point(12, 41);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(34, 13);
this.label2.TabIndex = 3;
this.label2.Text = "Type:";
//
// button1
//
this.button1.DialogResult = System.Windows.Forms.DialogResult.OK;
this.button1.Location = new System.Drawing.Point(275, 187);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(75, 23);
this.button1.TabIndex = 5;
this.button1.Text = "Save";
this.button1.UseVisualStyleBackColor = true;
//
// dataTB
//
this.dataTB.Location = new System.Drawing.Point(12, 74);
this.dataTB.Multiline = true;
this.dataTB.Name = "dataTB";
this.dataTB.Size = new System.Drawing.Size(346, 107);
this.dataTB.TabIndex = 6;
this.dataTB.TextChanged += new System.EventHandler(this.dataTB_TextChanged);
//
// pictureBox1
//
this.pictureBox1.Location = new System.Drawing.Point(302, 12);
this.pictureBox1.Name = "pictureBox1";
this.pictureBox1.Size = new System.Drawing.Size(56, 50);
this.pictureBox1.TabIndex = 7;
this.pictureBox1.TabStop = false;
this.pictureBox1.Click += new System.EventHandler(this.pictureBox1_Click);
//
// EditBox
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(362, 216);
this.Controls.Add(this.pictureBox1);
this.Controls.Add(this.dataTB);
this.Controls.Add(this.button1);
this.Controls.Add(this.label2);
this.Controls.Add(this.label1);
this.Controls.Add(this.typeCB);
this.Controls.Add(this.nameTB);
this.Name = "EditBox";
this.Text = "EditBox";
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.TextBox nameTB;
private System.Windows.Forms.ComboBox typeCB;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.Button button1;
private System.Windows.Forms.TextBox dataTB;
private System.Windows.Forms.PictureBox pictureBox1;
}
}

View file

@ -7,8 +7,7 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using AampV1Library;
using Aampv2 = AampV2Library;
using AampLibraryCSharp;
using Syroot.Maths;
namespace FirstPlugin.Forms
@ -26,39 +25,6 @@ namespace FirstPlugin.Forms
}
ParamEntry paramEntry;
Aampv2.ParamEntry paramEntryV2;
public void LoadEntry(Aampv2.ParamEntry entry)
{
typeCB.Items.Clear();
foreach (var type in Enum.GetValues(typeof(AampV2Library.ParamType)).Cast<AampV2Library.ParamType>())
typeCB.Items.Add(type);
paramEntryV2 = entry;
nameTB.Text = entry.HashString;
typeCB.SelectedItem = entry.ParamType;
dataTB.Text = entry.Value.ToString();
switch (entry.ParamType)
{
case AampV2Library.ParamType.Vector2F:
var vec2 = (Vector2F)entry.Value;
dataTB.Text = $"{vec2.X} {vec2.Y}";
break;
case AampV2Library.ParamType.Vector3F:
var vec3 = (Vector3F)entry.Value;
dataTB.Text = $"{vec3.X} {vec3.Y} {vec3.Z}";
break;
case AampV2Library.ParamType.Vector4F:
case AampV2Library.ParamType.Color4F:
var vec4 = (Vector4F)entry.Value;
dataTB.Text = $"{vec4.X} {vec4.Y} {vec4.Z} {vec4.W}";
break;
}
}
public void LoadEntry(ParamEntry entry)
{
typeCB.Items.Clear();
@ -87,6 +53,18 @@ namespace FirstPlugin.Forms
var vec4 = (Vector4F)entry.Value;
dataTB.Text = $"{vec4.X} {vec4.Y} {vec4.Z} {vec4.W}";
break;
case ParamType.BufferBinary:
dataTB.Text = string.Join(",", (byte[])entry.Value);
break;
case ParamType.BufferFloat:
dataTB.Text = string.Join(",", (float[])entry.Value);
break;
case ParamType.BufferInt:
dataTB.Text = string.Join(",", (int[])entry.Value);
break;
case ParamType.BufferUint:
dataTB.Text = string.Join(",", (uint[])entry.Value);
break;
}
}
@ -116,43 +94,69 @@ namespace FirstPlugin.Forms
int.TryParse(dataTB.Text, out valueInt);
paramEntry.Value = valueInt;
break;
case ParamType.BufferUint:
{
var strings = dataTB.Text.Split(',');
var array = new uint[strings.Length];
for (int i = 0; i < array.Length; i++)
array[i] = uint.Parse(strings[i]);
paramEntry.Value = array;
}
break;
case ParamType.BufferInt:
{
var strings = dataTB.Text.Split(',');
var array = new int[strings.Length];
for (int i = 0; i < array.Length; i++)
array[i] = int.Parse(strings[i]);
paramEntry.Value = array;
}
break;
case ParamType.BufferFloat:
{
var strings = dataTB.Text.Split(',');
var array = new float[strings.Length];
for (int i = 0; i < array.Length; i++)
array[i] = float.Parse(strings[i]);
paramEntry.Value = array;
}
break;
case ParamType.BufferBinary:
{
var strings = dataTB.Text.Split(',');
var array = new byte[strings.Length];
for (int i = 0; i < array.Length; i++)
array[i] = byte.Parse(strings[i]);
paramEntry.Value = array;
}
break;
case ParamType.Vector2F:
var values2F = dataTB.Text.Split(' ');
if (values2F.Length != 2)
{
}
else
{
if (values2F.Length == 2) {
float x, y;
float.TryParse(values2F[0], out x);
float.TryParse(values2F[1], out y);
paramEntry.Value = new Vector2F(x, y);
}
else
throw new Exception("Invalid amount of values. Type requires 2 values.");
break;
case ParamType.Vector3F:
var values3F = dataTB.Text.Split(' ');
if (values3F.Length != 3)
{
}
else
{
if (values3F.Length == 3) {
float x, y, z;
float.TryParse(values3F[0], out x);
float.TryParse(values3F[1], out y);
float.TryParse(values3F[2], out z);
paramEntry.Value = new Vector3F(x, y, z);
}
else
throw new Exception("Invalid amount of values. Type requires 3 values.");
break;
case ParamType.Vector4F:
case ParamType.Color4F:
var values = dataTB.Text.Split(' ');
if (values.Length != 4)
{
}
else
if (values.Length == 4)
{
float x, y, z, w;
float.TryParse(values[0], out x);
@ -161,6 +165,8 @@ namespace FirstPlugin.Forms
float.TryParse(values[3], out w);
paramEntry.Value = new Vector4F(x, y, z, w);
}
else
throw new Exception("Invalid amount of values. Type requires 4 values.");
break;
case ParamType.Uint:
uint valueUInt = 0;
@ -171,114 +177,19 @@ namespace FirstPlugin.Forms
case ParamType.String32:
case ParamType.String256:
case ParamType.StringRef:
paramEntry.Value = new AampCommon.StringEntry(dataTB.Text);
paramEntry.Value = new AampLibraryCSharp.StringEntry(dataTB.Text);
break;
}
}
else
{
paramEntryV2.ParamType = (AampV2Library.ParamType)typeCB.SelectedItem;
if (nameTB.Enabled)
paramEntryV2.HashString = nameTB.Text;
switch (paramEntryV2.ParamType)
{
case AampV2Library.ParamType.Boolean:
bool value = false;
bool.TryParse(dataTB.Text, out value);
paramEntryV2.Value = value;
break;
case AampV2Library.ParamType.Float:
float valueF = 0;
float.TryParse(dataTB.Text, out valueF);
paramEntryV2.Value = valueF;
break;
case AampV2Library.ParamType.Int:
int valueInt = 0;
int.TryParse(dataTB.Text, out valueInt);
paramEntryV2.Value = valueInt;
break;
case AampV2Library.ParamType.Vector2F:
var values2F = dataTB.Text.Split(' ');
if (values2F.Length != 2)
{
}
else
{
float x, y;
float.TryParse(values2F[0], out x);
float.TryParse(values2F[1], out y);
paramEntryV2.Value = new Vector2F(x, y);
}
break;
case AampV2Library.ParamType.Vector3F:
var values3F = dataTB.Text.Split(' ');
if (values3F.Length != 3)
{
}
else
{
float x, y, z;
float.TryParse(values3F[0], out x);
float.TryParse(values3F[1], out y);
float.TryParse(values3F[2], out z);
paramEntryV2.Value = new Vector3F(x, y, z);
}
break;
case AampV2Library.ParamType.Vector4F:
case AampV2Library.ParamType.Color4F:
var values = dataTB.Text.Split(' ');
if (values.Length != 4)
{
}
else
{
float x, y, z, w;
float.TryParse(values[0], out x);
float.TryParse(values[1], out y);
float.TryParse(values[2], out z);
float.TryParse(values[3], out w);
paramEntryV2.Value = new Vector4F(x, y, z, w);
}
break;
case AampV2Library.ParamType.Uint:
uint valueUInt = 0;
uint.TryParse(dataTB.Text, out valueUInt);
paramEntryV2.Value = valueUInt;
break;
case AampV2Library.ParamType.String64:
case AampV2Library.ParamType.String32:
case AampV2Library.ParamType.String256:
case AampV2Library.ParamType.StringRef:
paramEntryV2.Value = new AampCommon.StringEntry(dataTB.Text);
break;
}
}
}
private void dataTB_TextChanged(object sender, EventArgs e)
{
if (paramEntry != null)
switch (paramEntry.ParamType)
{
switch (paramEntry.ParamType)
{
case ParamType.Color4F:
UpdatePictureboxColor();
break;
}
}
else
{
switch (paramEntryV2.ParamType)
{
case AampV2Library.ParamType.Color4F:
UpdatePictureboxColor();
break;
}
case ParamType.Color4F:
UpdatePictureboxColor();
break;
}
}
@ -330,24 +241,145 @@ namespace FirstPlugin.Forms
}
}
}
else
{
if (paramEntryV2.ParamType == AampV2Library.ParamType.Color4F)
{
ColorDialog dlg = new ColorDialog();
if (dlg.ShowDialog() == DialogResult.OK)
{
paramEntryV2.Value = new Vector4F(
dlg.Color.R / 255.0f,
dlg.Color.G / 255.0f,
dlg.Color.B / 255.0f,
dlg.Color.A / 255.0f);
var vec4 = (Vector4F)paramEntryV2.Value;
dataTB.Text = $"{vec4.X} {vec4.Y} {vec4.Z} {vec4.W}";
}
}
}
}
/// <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.nameTB = new System.Windows.Forms.TextBox();
this.typeCB = new System.Windows.Forms.ComboBox();
this.label1 = new System.Windows.Forms.Label();
this.label2 = new System.Windows.Forms.Label();
this.button1 = new System.Windows.Forms.Button();
this.dataTB = new System.Windows.Forms.TextBox();
this.pictureBox1 = new System.Windows.Forms.PictureBox();
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
this.SuspendLayout();
//
// nameTB
//
this.nameTB.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.nameTB.Enabled = false;
this.nameTB.Location = new System.Drawing.Point(76, 12);
this.nameTB.Name = "nameTB";
this.nameTB.Size = new System.Drawing.Size(220, 20);
this.nameTB.TabIndex = 0;
//
// typeCB
//
this.typeCB.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.typeCB.FormattingEnabled = true;
this.typeCB.Location = new System.Drawing.Point(76, 38);
this.typeCB.Name = "typeCB";
this.typeCB.Size = new System.Drawing.Size(220, 21);
this.typeCB.TabIndex = 1;
//
// label1
//
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(12, 15);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(38, 13);
this.label1.TabIndex = 2;
this.label1.Text = "Name:";
//
// label2
//
this.label2.AutoSize = true;
this.label2.Location = new System.Drawing.Point(12, 41);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(34, 13);
this.label2.TabIndex = 3;
this.label2.Text = "Type:";
//
// button1
//
this.button1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.button1.DialogResult = System.Windows.Forms.DialogResult.OK;
this.button1.Location = new System.Drawing.Point(275, 187);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(75, 23);
this.button1.TabIndex = 5;
this.button1.Text = "Save";
this.button1.UseVisualStyleBackColor = true;
//
// dataTB
//
this.dataTB.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.dataTB.Location = new System.Drawing.Point(12, 74);
this.dataTB.Multiline = true;
this.dataTB.Name = "dataTB";
this.dataTB.Size = new System.Drawing.Size(346, 107);
this.dataTB.TabIndex = 6;
this.dataTB.TextChanged += new System.EventHandler(this.dataTB_TextChanged);
//
// pictureBox1
//
this.pictureBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.pictureBox1.Location = new System.Drawing.Point(302, 12);
this.pictureBox1.Name = "pictureBox1";
this.pictureBox1.Size = new System.Drawing.Size(56, 50);
this.pictureBox1.TabIndex = 7;
this.pictureBox1.TabStop = false;
this.pictureBox1.Click += new System.EventHandler(this.pictureBox1_Click);
//
// EditBox
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(362, 216);
this.Controls.Add(this.pictureBox1);
this.Controls.Add(this.dataTB);
this.Controls.Add(this.button1);
this.Controls.Add(this.label2);
this.Controls.Add(this.label1);
this.Controls.Add(this.typeCB);
this.Controls.Add(this.nameTB);
this.Name = "EditBox";
this.Text = "EditBox";
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.TextBox nameTB;
private System.Windows.Forms.ComboBox typeCB;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.Button button1;
private System.Windows.Forms.TextBox dataTB;
private System.Windows.Forms.PictureBox pictureBox1;
}
}

View file

@ -35,11 +35,11 @@
this.editValueNodeMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.deleteNodeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.exportJsonToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.importFromXmlToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
this.saveAsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.saveToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator();
this.importFromXmlToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.stPanel1 = new Toolbox.Library.Forms.STPanel();
this.stTabControl1 = new Toolbox.Library.Forms.STTabControl();
this.tabPage1 = new System.Windows.Forms.TabPage();
@ -50,11 +50,9 @@
this.columnHeader2 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.columnHeader3 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.tabPage2 = new System.Windows.Forms.TabPage();
this.stPanel4 = new Toolbox.Library.Forms.STPanel();
this.stPanel3 = new Toolbox.Library.Forms.STPanel();
this.btnToXml = new Toolbox.Library.Forms.STButton();
this.stPanel2 = new Toolbox.Library.Forms.STPanel();
this.btnXmlToByaml = new Toolbox.Library.Forms.STButton();
this.stMenuStrip1 = new Toolbox.Library.Forms.STMenuStrip();
this.stContextMenuStrip1 = new Toolbox.Library.Forms.STContextMenuStrip(this.components);
this.addItemToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.editToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
@ -62,7 +60,7 @@
this.deleteToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.copyToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.copyDataAsTextToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.stPanel4 = new Toolbox.Library.Forms.STPanel();
this.chkShiftJISEncoding = new Toolbox.Library.Forms.STCheckBox();
this.contextMenuStrip1.SuspendLayout();
this.stPanel1.SuspendLayout();
this.stTabControl1.SuspendLayout();
@ -83,11 +81,11 @@
this.editValueNodeMenuItem,
this.deleteNodeToolStripMenuItem,
this.exportJsonToolStripMenuItem,
this.importFromXmlToolStripMenuItem,
this.toolStripSeparator1,
this.saveAsToolStripMenuItem,
this.saveToolStripMenuItem,
this.toolStripSeparator2,
this.importFromXmlToolStripMenuItem});
this.toolStripSeparator2});
this.contextMenuStrip1.Name = "contextMenuStrip1";
this.contextMenuStrip1.Size = new System.Drawing.Size(170, 192);
this.contextMenuStrip1.Opening += new System.ComponentModel.CancelEventHandler(this.ContextMenuOpening);
@ -124,9 +122,16 @@
//
this.exportJsonToolStripMenuItem.Name = "exportJsonToolStripMenuItem";
this.exportJsonToolStripMenuItem.Size = new System.Drawing.Size(169, 22);
this.exportJsonToolStripMenuItem.Text = "Export as xml";
this.exportJsonToolStripMenuItem.Text = "Export";
this.exportJsonToolStripMenuItem.Click += new System.EventHandler(this.exportJsonToolStripMenuItem_Click);
//
// importFromXmlToolStripMenuItem
//
this.importFromXmlToolStripMenuItem.Name = "importFromXmlToolStripMenuItem";
this.importFromXmlToolStripMenuItem.Size = new System.Drawing.Size(169, 22);
this.importFromXmlToolStripMenuItem.Text = "Import";
this.importFromXmlToolStripMenuItem.Click += new System.EventHandler(this.importFromXmlToolStripMenuItem_Click);
//
// toolStripSeparator1
//
this.toolStripSeparator1.Name = "toolStripSeparator1";
@ -152,17 +157,10 @@
this.toolStripSeparator2.Name = "toolStripSeparator2";
this.toolStripSeparator2.Size = new System.Drawing.Size(166, 6);
//
// importFromXmlToolStripMenuItem
//
this.importFromXmlToolStripMenuItem.Name = "importFromXmlToolStripMenuItem";
this.importFromXmlToolStripMenuItem.Size = new System.Drawing.Size(169, 22);
this.importFromXmlToolStripMenuItem.Text = "Import from xml";
this.importFromXmlToolStripMenuItem.Click += new System.EventHandler(this.importFromXmlToolStripMenuItem_Click);
//
// stPanel1
//
this.stPanel1.Controls.Add(this.chkShiftJISEncoding);
this.stPanel1.Controls.Add(this.stTabControl1);
this.stPanel1.Controls.Add(this.stMenuStrip1);
this.stPanel1.Dock = System.Windows.Forms.DockStyle.Fill;
this.stPanel1.Location = new System.Drawing.Point(0, 0);
this.stPanel1.Name = "stPanel1";
@ -176,11 +174,11 @@
| System.Windows.Forms.AnchorStyles.Right)));
this.stTabControl1.Controls.Add(this.tabPage1);
this.stTabControl1.Controls.Add(this.tabPage2);
this.stTabControl1.Location = new System.Drawing.Point(0, 27);
this.stTabControl1.Location = new System.Drawing.Point(0, 20);
this.stTabControl1.myBackColor = System.Drawing.Color.Empty;
this.stTabControl1.Name = "stTabControl1";
this.stTabControl1.SelectedIndex = 0;
this.stTabControl1.Size = new System.Drawing.Size(549, 368);
this.stTabControl1.Size = new System.Drawing.Size(549, 378);
this.stTabControl1.TabIndex = 15;
//
// tabPage1
@ -189,7 +187,7 @@
this.tabPage1.Location = new System.Drawing.Point(4, 25);
this.tabPage1.Name = "tabPage1";
this.tabPage1.Padding = new System.Windows.Forms.Padding(3);
this.tabPage1.Size = new System.Drawing.Size(541, 339);
this.tabPage1.Size = new System.Drawing.Size(541, 349);
this.tabPage1.TabIndex = 0;
this.tabPage1.Text = "Editor";
this.tabPage1.UseVisualStyleBackColor = true;
@ -207,7 +205,7 @@
// splitContainer1.Panel2
//
this.splitContainer1.Panel2.Controls.Add(this.listViewCustom1);
this.splitContainer1.Size = new System.Drawing.Size(535, 333);
this.splitContainer1.Size = new System.Drawing.Size(535, 343);
this.splitContainer1.SplitterDistance = 178;
this.splitContainer1.TabIndex = 14;
//
@ -218,10 +216,11 @@
this.treeView1.Dock = System.Windows.Forms.DockStyle.Fill;
this.treeView1.Location = new System.Drawing.Point(0, 0);
this.treeView1.Name = "treeView1";
this.treeView1.Size = new System.Drawing.Size(178, 333);
this.treeView1.Size = new System.Drawing.Size(178, 343);
this.treeView1.TabIndex = 0;
this.treeView1.BeforeExpand += new System.Windows.Forms.TreeViewCancelEventHandler(this.BeforeExpand);
this.treeView1.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.treeView1_AfterSelect);
this.treeView1.NodeMouseClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(this.treeView1_MouseClick);
//
// listViewCustom1
//
@ -236,7 +235,7 @@
this.listViewCustom1.Location = new System.Drawing.Point(0, 0);
this.listViewCustom1.Name = "listViewCustom1";
this.listViewCustom1.OwnerDraw = true;
this.listViewCustom1.Size = new System.Drawing.Size(353, 333);
this.listViewCustom1.Size = new System.Drawing.Size(353, 343);
this.listViewCustom1.TabIndex = 0;
this.listViewCustom1.UseCompatibleStateImageBehavior = false;
this.listViewCustom1.View = System.Windows.Forms.View.Details;
@ -261,17 +260,23 @@
//
this.tabPage2.Controls.Add(this.stPanel4);
this.tabPage2.Controls.Add(this.stPanel3);
this.tabPage2.Controls.Add(this.btnToXml);
this.tabPage2.Controls.Add(this.stPanel2);
this.tabPage2.Controls.Add(this.btnXmlToByaml);
this.tabPage2.Location = new System.Drawing.Point(4, 25);
this.tabPage2.Name = "tabPage2";
this.tabPage2.Padding = new System.Windows.Forms.Padding(3);
this.tabPage2.Size = new System.Drawing.Size(541, 339);
this.tabPage2.Size = new System.Drawing.Size(541, 369);
this.tabPage2.TabIndex = 1;
this.tabPage2.Text = "XML Editor";
this.tabPage2.Text = "Text Editor";
this.tabPage2.UseVisualStyleBackColor = true;
//
// stPanel4
//
this.stPanel4.Dock = System.Windows.Forms.DockStyle.Fill;
this.stPanel4.Location = new System.Drawing.Point(3, 3);
this.stPanel4.Name = "stPanel4";
this.stPanel4.Size = new System.Drawing.Size(535, 363);
this.stPanel4.TabIndex = 4;
//
// stPanel3
//
this.stPanel3.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
@ -282,17 +287,6 @@
this.stPanel3.Size = new System.Drawing.Size(0, 0);
this.stPanel3.TabIndex = 3;
//
// btnToXml
//
this.btnToXml.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.btnToXml.Location = new System.Drawing.Point(15, 6);
this.btnToXml.Name = "btnToXml";
this.btnToXml.Size = new System.Drawing.Size(107, 23);
this.btnToXml.TabIndex = 2;
this.btnToXml.Text = "Generate";
this.btnToXml.UseVisualStyleBackColor = false;
this.btnToXml.Click += new System.EventHandler(this.btnToXml_Click);
//
// stPanel2
//
this.stPanel2.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
@ -303,26 +297,6 @@
this.stPanel2.Size = new System.Drawing.Size(0, 0);
this.stPanel2.TabIndex = 1;
//
// btnXmlToByaml
//
this.btnXmlToByaml.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.btnXmlToByaml.Location = new System.Drawing.Point(128, 6);
this.btnXmlToByaml.Name = "btnXmlToByaml";
this.btnXmlToByaml.Size = new System.Drawing.Size(107, 23);
this.btnXmlToByaml.TabIndex = 0;
this.btnXmlToByaml.Text = "Compile";
this.btnXmlToByaml.UseVisualStyleBackColor = false;
this.btnXmlToByaml.Click += new System.EventHandler(this.btnXmlToByaml_Click);
//
// stMenuStrip1
//
this.stMenuStrip1.HighlightSelectedTab = false;
this.stMenuStrip1.Location = new System.Drawing.Point(0, 0);
this.stMenuStrip1.Name = "stMenuStrip1";
this.stMenuStrip1.Size = new System.Drawing.Size(549, 24);
this.stMenuStrip1.TabIndex = 16;
this.stMenuStrip1.Text = "stMenuStrip1";
//
// stContextMenuStrip1
//
this.stContextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
@ -377,15 +351,16 @@
this.copyDataAsTextToolStripMenuItem.Text = "Copy data as text";
this.copyDataAsTextToolStripMenuItem.Click += new System.EventHandler(this.copyDataAsTextToolStripMenuItem_Click);
//
// stPanel4
// chkShiftJISEncoding
//
this.stPanel4.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.stPanel4.Location = new System.Drawing.Point(15, 35);
this.stPanel4.Name = "stPanel4";
this.stPanel4.Size = new System.Drawing.Size(520, 298);
this.stPanel4.TabIndex = 4;
this.chkShiftJISEncoding.AutoSize = true;
this.chkShiftJISEncoding.Location = new System.Drawing.Point(7, 3);
this.chkShiftJISEncoding.Name = "chkShiftJISEncoding";
this.chkShiftJISEncoding.Size = new System.Drawing.Size(135, 17);
this.chkShiftJISEncoding.TabIndex = 1;
this.chkShiftJISEncoding.Text = "Use Shift JIS Encoding";
this.chkShiftJISEncoding.UseVisualStyleBackColor = true;
this.chkShiftJISEncoding.CheckedChanged += new System.EventHandler(this.chkShiftJISEncoding_CheckedChanged);
//
// ByamlEditor
//
@ -438,13 +413,11 @@
private Toolbox.Library.Forms.STTabControl stTabControl1;
private System.Windows.Forms.TabPage tabPage1;
private System.Windows.Forms.TabPage tabPage2;
private Toolbox.Library.Forms.STButton btnXmlToByaml;
private Toolbox.Library.Forms.STPanel stPanel2;
private Toolbox.Library.Forms.STButton btnToXml;
private System.Windows.Forms.ToolStripMenuItem copyToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem copyDataAsTextToolStripMenuItem;
private Toolbox.Library.Forms.STPanel stPanel3;
private Toolbox.Library.Forms.STMenuStrip stMenuStrip1;
private Toolbox.Library.Forms.STPanel stPanel4;
private Toolbox.Library.Forms.STCheckBox chkShiftJISEncoding;
}
}

View file

@ -15,6 +15,7 @@ using Toolbox.Library.Forms;
using Toolbox.Library;
using ByamlExt;
using FirstPlugin.Forms;
using ByamlExt.Byaml;
namespace FirstPlugin
{
@ -22,7 +23,7 @@ namespace FirstPlugin
//Added as an editor form for saving data back via other plugins
public partial class ByamlEditor : UserControl, IFIleEditor
{
public IFileFormat FileFormat;
public BYAML FileFormat;
public List<IFileFormat> GetFileFormats()
{
@ -30,14 +31,19 @@ namespace FirstPlugin
}
public ByteOrder byteOrder;
public dynamic byml;
public dynamic byml
{
get { return FileFormat.BymlData.RootNode; }
set { FileFormat.BymlData.RootNode = value; }
}
public string FileName = "";
bool pathSupport;
ushort bymlVer;
bool useMuunt = true;
private TextEditor xmlEditor;
private TextEditor textEditor;
public ByamlEditor()
{
@ -55,6 +61,7 @@ namespace FirstPlugin
private void Reload()
{
chkShiftJISEncoding.Checked = BymlFileData.Encoding == Encoding.GetEncoding("shift_jis");
treeView1.BackColor = FormThemes.BaseTheme.FormBackColor;
treeView1.ForeColor = FormThemes.BaseTheme.FormForeColor;
treeView1.Nodes.Clear();
@ -91,10 +98,13 @@ namespace FirstPlugin
if (byml == null) return;
ParseBymlFirstNode();
xmlEditor = new TextEditor();
stPanel4.Controls.Add(xmlEditor);
xmlEditor.Dock = DockStyle.Fill;
xmlEditor.IsXML = true;
stPanel4.Controls.Clear();
textEditor = new TextEditor();
textEditor.ClearContextMenus();
textEditor.AddContextMenu("Decompile", TextEditorToYaml);
textEditor.AddContextMenu("Compile", TextEditorFromYaml);
stPanel4.Controls.Add(textEditor);
}
void ParseBymlFirstNode()
@ -105,7 +115,7 @@ namespace FirstPlugin
treeView1.SelectedNode = root;
//the first node should always be a dictionary node
if (byml is Dictionary<string, dynamic>)
if (byml is IDictionary<string, dynamic>)
{
parseDictNode(byml, root.Nodes);
}
@ -169,7 +179,7 @@ namespace FirstPlugin
{
foreach (string k in node.Keys)
{
if ((node[k] is Dictionary<string, dynamic>) ||
if ((node[k] is IDictionary<string, dynamic>) ||
(node[k] is List<dynamic>) ||
(node[k] is List<ByamlPathPoint>))
{
@ -206,7 +216,7 @@ namespace FirstPlugin
int index = 0;
foreach (dynamic k in list)
{
if ((k is Dictionary<string, dynamic>) ||
if ((k is IDictionary<string, dynamic>) ||
(k is List<dynamic>) ||
(k is List<ByamlPathPoint>))
{
@ -403,10 +413,20 @@ namespace FirstPlugin
private void exportJsonToolStripMenuItem_Click(object sender, EventArgs e)
{
SaveFileDialog sav = new SaveFileDialog() { Filter = "Xml file | *.xml" };
SaveFileDialog sav = new SaveFileDialog() { Filter = TextFilter };
sav.FileName = Path.GetFileNameWithoutExtension(FileName);
sav.DefaultExt = ".yaml";
if (sav.ShowDialog() != DialogResult.OK) return;
File.WriteAllText(sav.FileName,
XmlConverter.ToXml(new BymlFileData { Version = bymlVer, byteOrder = byteOrder, SupportPaths = pathSupport, RootNode = byml }));
string ext = Utils.GetExtension(sav.FileName);
if (ext == ".xml") {
File.WriteAllText(sav.FileName, XmlByamlConverter.ToXML(FileFormat.BymlData));
}
else {
File.WriteAllText(sav.FileName, YamlByamlConverter.ToYaml(FileFormat.BymlData));
}
MessageBox.Show("Byaml converted successfully!");
}
public static void ImportFromJson()
@ -424,6 +444,18 @@ namespace FirstPlugin
}
}
private static string TextFilter
{
get
{
return "Supported Formats|*.yaml;*.xml;|" +
"YAML |*.yaml|" +
"XML |*.xml|" +
"All files(*.*)|*.*";
;
}
}
static bool SupportPaths()
{
return MessageBox.Show("Does this game support paths ?", "", MessageBoxButtons.YesNo) == DialogResult.Yes;
@ -570,15 +602,17 @@ namespace FirstPlugin
return;
dynamic targetNode = treeView1.SelectedNode.Tag;
dynamic target = listViewCustom1.SelectedItems[0].Tag;
if (targetNode is IDictionary<string, dynamic>)
((IDictionary<string, dynamic>)targetNode).Remove(listViewCustom1.SelectedItems[0].Text);
if (targetNode is IList<dynamic>)
((IList<dynamic>)targetNode).Remove(target);
foreach (ListViewItem item in listViewCustom1.SelectedItems)
{
dynamic target = item.Tag;
if (targetNode is IDictionary<string, dynamic>)
((IDictionary<string, dynamic>)targetNode).Remove(item.Text);
if (targetNode is IList<dynamic>)
((IList<dynamic>)targetNode).Remove(target);
int index = listViewCustom1.Items.IndexOf(listViewCustom1.SelectedItems[0]);
listViewCustom1.Items.RemoveAt(index);
int index = listViewCustom1.Items.IndexOf(item);
listViewCustom1.Items.RemoveAt(index);
}
}
private void renameToolStripMenuItem_Click(object sender, EventArgs e)
@ -638,13 +672,14 @@ namespace FirstPlugin
target = treeView1.SelectedNode.Parent.Tag;
targetNode = treeView1.SelectedNode.Parent.Nodes;
}
int index = targetNode.IndexOf(treeView1.SelectedNode);
if (target is Dictionary<string, dynamic>)
{
target.Remove(((Dictionary<string, dynamic>)target).Keys.ToArray()[index]);
}
else
target.RemoveAt(targetNode.IndexOf(treeView1.SelectedNode));
if (target is IDictionary<string, dynamic>)
target.Remove(((Dictionary<string, dynamic>)target).ElementAt(index).Key);
if (target is IList<dynamic>)
target.RemoveAt(index);
targetNode.RemoveAt(index);
}
@ -658,12 +693,19 @@ namespace FirstPlugin
private void importFromXmlToolStripMenuItem_Click(object sender, EventArgs e)
{
OpenFileDialog openFile = new OpenFileDialog();
openFile.Filter = "xml file |*.xml| every file | *.*";
openFile.Filter = TextFilter;
if (openFile.ShowDialog() != DialogResult.OK) return;
StreamReader t = new StreamReader(new FileStream(openFile.FileName, FileMode.Open), UnicodeEncoding.Unicode);
string ext = Utils.GetExtension(openFile.FileName);
if (ext == ".xml") {
StreamReader t = new StreamReader(new FileStream(openFile.FileName, FileMode.Open));
FileFormat.BymlData = XmlByamlConverter.FromXML(t.ReadToEnd());
}
else {
StreamReader t = new StreamReader(new FileStream(openFile.FileName, FileMode.Open));
FileFormat.BymlData = YamlByamlConverter.FromYaml(t.ReadToEnd());
}
treeView1.Nodes.Clear();
byml = XmlConverter.ToByml(t.ReadToEnd()).RootNode;
ParseBymlFirstNode();
}
@ -681,30 +723,28 @@ namespace FirstPlugin
}
}
private void btnToXml_Click(object sender, EventArgs e)
private void TextEditorToYaml(object sender, EventArgs e)
{
xmlEditor.FillEditor(XmlConverter.ToXml(new BymlFileData {
Version = bymlVer,
byteOrder = byteOrder,
SupportPaths = pathSupport,
RootNode = byml
}));
var format = (IConvertableTextFormat)FileFormat;
textEditor.FillEditor(((IConvertableTextFormat)FileFormat).ConvertToString());
if (format.TextFileType == TextFileType.Xml)
textEditor.IsXML = true;
else
textEditor.IsYAML = true;
}
private void btnXmlToByaml_Click(object sender, EventArgs e)
private void TextEditorFromYaml(object sender, EventArgs e)
{
string editorText = xmlEditor.GetText();
string editorText = textEditor.GetText();
if (editorText == string.Empty)
return;
try
{
byte[] TextData = Encoding.Unicode.GetBytes(xmlEditor.GetText());
StreamReader t = new StreamReader(new MemoryStream(TextData), Encoding.GetEncoding(932));
byml = XmlConverter.ToByml(t.ReadToEnd()).RootNode;
if (FileFormat != null)
((BYAML)FileFormat).UpdateByamlRoot(byml);
if (FileFormat != null) {
FileFormat.ConvertFromString(textEditor.GetText());
}
}
catch (Exception ex)
{
@ -717,5 +757,25 @@ namespace FirstPlugin
MessageBox.Show("Byaml converted successfully!");
}
private void treeView1_MouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
treeView1.SelectedNode = e.Node;
}
}
private void chkShiftJISEncoding_CheckedChanged(object sender, EventArgs e) {
if (FileFormat == null) return;
if (chkShiftJISEncoding.Checked)
FileFormat.ReloadEncoding(Encoding.GetEncoding("shift_jis"));
else
FileFormat.ReloadEncoding(Encoding.UTF8);
treeView1.Nodes.Clear();
ParseBymlFirstNode();
}
}
}

View file

@ -120,9 +120,6 @@
<metadata name="contextMenuStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<metadata name="stMenuStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>339, 17</value>
</metadata>
<metadata name="stContextMenuStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>172, 17</value>
</metadata>

View file

@ -10,11 +10,10 @@ using FirstPlugin.Turbo.CourseMuuntStructs;
using GL_EditorFramework.EditorDrawables;
using OpenTK;
using OpenTK.Graphics.OpenGL;
using aampv1 = AampV1Library;
using aampv2 = AampV2Library;
using Toolbox.Library.Rendering;
using Toolbox.Library.IO;
using FirstPlugin.Turbo;
using AampLibraryCSharp;
namespace FirstPlugin.Forms
{
@ -121,14 +120,7 @@ namespace FirstPlugin.Forms
}
foreach (AAMP aamp in scene.ParameterArchives)
{
if (aamp.aampFileV1 != null)
LoadParameters(aamp.aampFileV1);
else if (aamp.aampFileV2 != null)
LoadParameters(aamp.aampFileV2);
else
throw new Exception("Failed to load parameter file " + aamp.FileName);
}
LoadParameters(aamp.aampFile);
viewport.AddDrawable(new GL_EditorFramework.EditorDrawables.SingleObject(new OpenTK.Vector3(0)));
@ -230,7 +222,7 @@ namespace FirstPlugin.Forms
ProbeLighting probeLightingConfig;
private void LoadParameters(aampv1.AampFile aamp)
private void LoadParameters(AampFile aamp)
{
if (aamp.EffectType == "Probe Data")
{
@ -295,7 +287,7 @@ namespace FirstPlugin.Forms
}
}
private void LoadDataBuffer(aampv1.ParamEntry[] paramEntries, ProbeLighting.Entry probeEntry)
private void LoadDataBuffer(ParamEntry[] paramEntries, ProbeLighting.Entry probeEntry)
{
foreach (var entry in paramEntries)
{
@ -307,13 +299,13 @@ namespace FirstPlugin.Forms
probeEntry.MaxShDataNum = (uint)entry.Value;
if (entry.HashString == "data_buffer")
{
if (entry.ParamType == aampv1.ParamType.BufferFloat)
if (entry.ParamType == ParamType.BufferFloat)
probeEntry.DataBuffer = (float[])entry.Value;
}
}
}
private void LoadIndexBuffer(aampv1.ParamEntry[] paramEntries, ProbeLighting.Entry probeEntry)
private void LoadIndexBuffer(ParamEntry[] paramEntries, ProbeLighting.Entry probeEntry)
{
foreach (var entry in paramEntries)
{
@ -325,7 +317,7 @@ namespace FirstPlugin.Forms
probeEntry.MaxIndexNum = (uint)entry.Value;
if (entry.HashString == "index_buffer")
{
if (entry.ParamType == aampv1.ParamType.BufferUint)
if (entry.ParamType == ParamType.BufferUint)
probeEntry.IndexBuffer = (uint[])entry.Value;
//Experimental, just fill in indices
@ -339,7 +331,7 @@ namespace FirstPlugin.Forms
}
}
private ProbeLighting.Grid LoadGridData(aampv1.ParamEntry[] paramEntries)
private ProbeLighting.Grid LoadGridData(ParamEntry[] paramEntries)
{
ProbeLighting.Grid grid = new ProbeLighting.Grid();
@ -365,11 +357,6 @@ namespace FirstPlugin.Forms
return grid;
}
private void LoadParameters(aampv2.AampFile aamp)
{
}
private void AddPathDrawable(string Name, IEnumerable<BasePathPoint> Groups, Color color, bool CanConnect = true)
{

View file

@ -31,7 +31,7 @@ namespace Toolbox.Library.IO
public class ZSTD
{
}
@ -43,9 +43,12 @@ namespace Toolbox.Library.IO
using (var reader = new FileReader(stream, true))
{
reader.ByteOrder = Syroot.BinaryData.ByteOrder.BigEndian;
reader.Position = 0;
reader.SetByteOrder(true);
uint chunkSize = reader.ReadUInt32();
if (chunkSize == 256)
reader.SetByteOrder(false);
uint chunkCount = reader.ReadUInt32();
uint decompressedSize = reader.ReadUInt32();
if (reader.BaseStream.Length > 8 + (chunkCount * 4) + 128)
@ -58,7 +61,7 @@ namespace Toolbox.Library.IO
ushort magic = reader.ReadUInt16();
reader.Position = 0;
if (magic == 0x78da)
if (magic == 0x78da || magic == 0xda78)
return true;
else
return false;
@ -74,10 +77,13 @@ namespace Toolbox.Library.IO
{
using (var reader = new FileReader(stream, true))
{
reader.ByteOrder = Syroot.BinaryData.ByteOrder.BigEndian;
reader.SetByteOrder(true);
uint chunkSize = reader.ReadUInt32();
if (chunkSize == 256)
reader.SetByteOrder(false);
try
{
uint chunkSize = reader.ReadUInt32();
uint chunkCount = reader.ReadUInt32();
uint decompressedSize = reader.ReadUInt32();
uint[] chunkSizes = reader.ReadUInt32s((int)chunkCount); //Not very sure about this
@ -106,6 +112,7 @@ namespace Toolbox.Library.IO
else //If the magic check fails, seek back 2. This shouldn't happen, but just incase
reader.Seek(-2);
}
//Return the decompressed stream with all chunks combined
return new MemoryStream(Utils.CombineByteArray(DecompressedChunks.ToArray()));
}
@ -360,12 +367,12 @@ namespace Toolbox.Library.IO
op_len = op_len_ext;
if (op_ofs >= 2)
{
Loop1(ref flag, ref op_len, ref chunk, ref data, ref output);
Loop1(ref flag, ref op_len, ref chunk, ref data, ref output);
}
}
}
Loop2(ref flag, ref op_len, ref data, ref output, ref chunk);
Loop2(ref flag, ref op_len, ref data, ref output, ref chunk);
}
}

View file

@ -104,13 +104,13 @@ namespace Toolbox.Library
private bool CheckSupport()
{
string ext = Utils.GetExtension(filePath);
/* string ext = Utils.GetExtension(filePath);
foreach (var format in FileManager.GetFileFormats())
{
for (int i = 0; i < format.Extension.Length; i++)
if (format.Extension[i].Contains(ext))
return true;
}
}*/
return false;

View file

@ -71,6 +71,8 @@ namespace Toolbox.Library.Forms
if (ClearPlaylist)
audioListView.Items.Clear();
AudioFileFormats.Add(fileFormat);
AudioFile file = new AudioFile();
file.Title = fileFormat.FileName;
@ -82,11 +84,6 @@ namespace Toolbox.Library.Forms
file.Artist = mp3.Artist;
}
AudioFileFormats.Add(fileFormat);
audioListView.AddObject(file);
AudioChannel audioChannel = new AudioChannel();
audioChannel.Name = $"Channel [0]";
file.Channels.Add(audioChannel);
@ -101,8 +98,12 @@ namespace Toolbox.Library.Forms
}
};
audioListView.UpdateObject(file);
audioListView.AddObject(file);
// audioListView.UpdateObject(file);
if (audioListView.Items.Count != 0)
audioListView.SelectedIndex = 0;
}
public void LoadFile(AudioData audioData, IFileFormat fileFormat, bool ClearPlaylist = false)

View file

@ -83,11 +83,11 @@ namespace Toolbox.Library.Forms
}
AudioFileFormats.Add(fileFormat);
audioListView.AddObject(file);
AudioChannel audioChannel = new AudioChannel();
audioChannel.Name = $"Channel [0]";
file.Channels.Add(audioChannel);
audioChannel.audioPlayer.Open(source, activeDevice);
audioChannel.audioPlayer.PlaybackStopped += (s, args) =>
@ -99,6 +99,8 @@ namespace Toolbox.Library.Forms
}
};
audioListView.AddObject(file);
audioListView.UpdateObject(file);
}

View file

@ -94,7 +94,6 @@ namespace Toolbox.Library.Forms
}
SelectNode(FileRoot);
for (int i = 0; i < FileRoot.FileNodes.Count; i++)
{
if (FileRoot.FileNodes[i].Item1.OpenFileFormatOnLoad)

View file

@ -41,39 +41,9 @@ namespace Toolbox.Library.Forms
{
scintilla1.Lexer = Lexer.Xml;
// Enable folding
scintilla1.SetProperty("fold", "1");
scintilla1.SetProperty("fold.compact", "1");
UpdateFolderMarkings();
scintilla1.SetProperty("fold.html", "1");
scintilla1.Margins[0].Width = 20;
// Use Margin 2 for fold markers
scintilla1.Margins[2].Type = MarginType.Symbol;
scintilla1.Margins[2].Mask = Marker.MaskFolders;
scintilla1.Margins[2].Sensitive = true;
scintilla1.Margins[2].Width = 20;
// Reset folder markers
for (int i = Marker.FolderEnd; i <= Marker.FolderOpen; i++)
{
scintilla1.Markers[i].SetForeColor(BACK_COLOR);
scintilla1.Markers[i].SetBackColor(Color.Gray);
}
// Style the folder markers
scintilla1.Markers[Marker.Folder].Symbol = MarkerSymbol.BoxPlus;
// scintilla1.Markers[Marker.Folder].SetBackColor(FormThemes.BaseTheme.TextEditorBackColor);
scintilla1.Markers[Marker.FolderOpen].Symbol = MarkerSymbol.BoxMinus;
scintilla1.Markers[Marker.FolderEnd].Symbol = MarkerSymbol.BoxPlusConnected;
// scintilla1.Markers[Marker.FolderEnd].SetBackColor(FormThemes.BaseTheme.TextEditorBackColor);
scintilla1.Markers[Marker.FolderMidTail].Symbol = MarkerSymbol.TCorner;
scintilla1.Markers[Marker.FolderOpenMid].Symbol = MarkerSymbol.BoxMinusConnected;
scintilla1.Markers[Marker.FolderSub].Symbol = MarkerSymbol.VLine;
scintilla1.Markers[Marker.FolderTail].Symbol = MarkerSymbol.LCorner;
scintilla1.AutomaticFold = AutomaticFold.Show | AutomaticFold.Click | AutomaticFold.Change;
scintilla1.Styles[Style.Xml.XmlStart].ForeColor = Color.FromArgb(128, 128, 128);
scintilla1.Styles[Style.Xml.XmlEnd].ForeColor = Color.FromArgb(128, 128, 128);
scintilla1.Styles[Style.Xml.Default].ForeColor = Color.FromArgb(180, 180, 180);
@ -116,6 +86,11 @@ namespace Toolbox.Library.Forms
scintilla1.Styles[Style.Json.StringEol].BackColor = Color.Pink;
scintilla1.Styles[Style.Json.Operator].ForeColor = Color.Purple;
scintilla1.Lexer = Lexer.Json;
UpdateFolderMarkings();
scintilla1.SetFoldMarginColor(true, BACK_COLOR);
scintilla1.SetFoldMarginHighlightColor(true, BACK_COLOR);
}
}
}
@ -135,28 +110,61 @@ namespace Toolbox.Library.Forms
{
scintilla1.Lexer = (Lexer)48;
scintilla1.Styles[Style.Xml.XmlStart].ForeColor = Color.FromArgb(86, 156, 214);
scintilla1.Styles[Style.Xml.XmlEnd].ForeColor = Color.FromArgb(86, 156, 214);
scintilla1.Styles[Style.Xml.Default].ForeColor = Color.FromArgb(214, 157, 133);
scintilla1.Styles[Style.Xml.Comment].ForeColor = Color.FromArgb(87, 166, 74);
scintilla1.Styles[Style.Xml.Number].ForeColor = Color.FromArgb(214, 157, 133);
scintilla1.Styles[Style.Json.Default].ForeColor = Color.FromArgb(214, 157, 133);
scintilla1.Styles[Style.Json.BlockComment].ForeColor = Color.FromArgb(87, 166, 74); // Green
scintilla1.Styles[Style.Json.LineComment].ForeColor = Color.FromArgb(87, 166, 74); // Green
scintilla1.Styles[Style.Json.Number].ForeColor = Color.FromArgb(214, 157, 133);
scintilla1.Styles[Style.Json.PropertyName].ForeColor = Color.FromArgb(214, 157, 133);
scintilla1.Styles[Style.Json.String].ForeColor = Color.FromArgb(86, 156, 214);
scintilla1.Styles[Style.Json.StringEol].BackColor = Color.FromArgb(214, 157, 133);
scintilla1.Styles[Style.Json.Operator].ForeColor = Color.FromArgb(180, 180, 180);
scintilla1.Styles[Style.Json.Keyword].ForeColor = Color.FromArgb(146, 202, 244);
scintilla1.Styles[Style.Json.EscapeSequence].ForeColor = Color.FromArgb(146, 202, 244);
UpdateFolderMarkings();
scintilla1.Styles[Style.Xml.DoubleString].ForeColor = Color.FromArgb(180, 180, 180);
scintilla1.Styles[Style.Xml.SingleString].ForeColor = Color.FromArgb(180, 180, 180);
scintilla1.Styles[Style.Xml.Tag].ForeColor = Color.FromArgb(214, 157, 133);
scintilla1.Styles[Style.Xml.TagEnd].ForeColor = Color.FromArgb(86, 156, 214);
scintilla1.Styles[Style.Xml.TagUnknown].ForeColor = Color.FromArgb(86, 156, 214);
scintilla1.Styles[Style.Xml.Attribute].ForeColor = Color.FromArgb(86, 156, 214);
scintilla1.Styles[Style.Xml.AttributeUnknown].ForeColor = Color.FromArgb(86, 156, 214);
scintilla1.Styles[Style.Xml.CData].ForeColor = Color.FromArgb(214, 157, 133);
scintilla1.SetKeywords(1, "!aamp !io");
scintilla1.SetKeywords(4, "!color !vec2 !vec3 !vec4 !str32 !str64 !str128 !str256 !obj");
// scintilla1.SetKeywords(0, "!aamp !io True False");
// scintilla1.SetKeywords(1, "!color !vec2 !vec3 !vec4 !str32 !str64 !str128 !str256 !obj");
}
}
}
public void UpdateFolderMarkings()
{
// Enable folding
scintilla1.SetProperty("fold", "1");
scintilla1.SetProperty("fold.compact", "1");
scintilla1.Margins[0].Width = 20;
// Use Margin 2 for fold markers
scintilla1.Margins[2].Type = MarginType.Symbol;
scintilla1.Margins[2].Mask = Marker.MaskFolders;
scintilla1.Margins[2].Sensitive = true;
scintilla1.Margins[2].Width = 20;
// Reset folder markers
for (int i = Marker.FolderEnd; i <= Marker.FolderOpen; i++)
{
scintilla1.Markers[i].SetForeColor(BACK_COLOR);
scintilla1.Markers[i].SetBackColor(Color.Gray);
}
scintilla1.Markers[Marker.Folder].Symbol = MarkerSymbol.BoxPlus;
scintilla1.Markers[Marker.FolderOpen].Symbol = MarkerSymbol.BoxMinus;
scintilla1.Markers[Marker.FolderEnd].Symbol = MarkerSymbol.BoxPlusConnected;
scintilla1.Markers[Marker.FolderMidTail].Symbol = MarkerSymbol.TCorner;
scintilla1.Markers[Marker.FolderOpenMid].Symbol = MarkerSymbol.BoxMinusConnected;
scintilla1.Markers[Marker.FolderSub].Symbol = MarkerSymbol.VLine;
scintilla1.Markers[Marker.FolderTail].Symbol = MarkerSymbol.LCorner;
scintilla1.AutomaticFold = AutomaticFold.Show | AutomaticFold.Click | AutomaticFold.Change;
scintilla1.SetFoldMarginColor(true, BACK_COLOR);
scintilla1.SetFoldMarginHighlightColor(true, BACK_COLOR);
}
public static Color IntToColor(int rgb)
{
return Color.FromArgb(255, (byte)(rgb >> 16), (byte)(rgb >> 8), (byte)rgb);
@ -197,6 +205,11 @@ namespace Toolbox.Library.Forms
stContextMenuStrip1.Items.Add(text, null, handler);
}
public void ClearContextMenus()
{
stContextMenuStrip1.Items.Clear();
}
public string GetText()
{
return scintilla1.Text;
@ -227,6 +240,8 @@ namespace Toolbox.Library.Forms
scintilla1.SetSelectionForeColor(true, FormThemes.BaseTheme.FormForeColor);
scintilla1.SetWhitespaceBackColor(true, Color.FromArgb(50,50,50));
scintilla1.WrapMode = WrapMode.Word;
wordWrapToolStripMenuItem.Checked = true;
scintilla1.Margins[0].Type = MarginType.Number;
scintilla1.Margins[0].Width = 35;

View file

@ -254,6 +254,7 @@ namespace Toolbox.Library
v.uv0 = new Vector2(v.uv0.X, 1 - v.uv0.Y);
}
}
public void FlipUvsHorizontal()
{
foreach (Vertex v in vertices)
@ -261,6 +262,7 @@ namespace Toolbox.Library
v.uv0 = new Vector2(1 - v.uv0.X, v.uv0.Y);
}
}
public void TransformUVs(Vector2 Translate, Vector2 Scale, int Index)
{
foreach (Vertex v in vertices)
@ -551,12 +553,10 @@ namespace Toolbox.Library
return;
Vector3[] normals = new Vector3[vertices.Count];
for (int i = 0; i < normals.Length; i++)
normals[i] = new Vector3(0, 0, 0);
List<int> f = GetFaces();
for (int i = 0; i < f.Count; i += 3)
{
Vertex v1 = vertices[f[i]];

View file

@ -215,6 +215,14 @@ namespace Toolbox.Library.IO
return new Syroot.IOExtension.Half(ReadUInt16());
}
public Quaternion ReadQuaternion(bool invert = false)
{
var quat = new Quaternion(
ReadSingle(), ReadSingle(),
ReadSingle(), ReadSingle());
return invert ? quat.Inverted() : quat;
}
public Matrix4 ReadMatrix4(bool SwapRows = false)
{
Matrix4 mat4 = new Matrix4();

View file

@ -19,6 +19,11 @@ namespace Toolbox.Library.IO
{
}
public FileWriter(Stream stream, Encoding encoding, bool leaveOpen = false)
: base(stream, encoding, leaveOpen)
{
}
public FileWriter(string fileName)
: this(new FileStream(fileName, FileMode.Create, FileAccess.Write, FileShare.Read))
{

View file

@ -67,6 +67,19 @@ namespace Toolbox.Library
return new Vector3(x, y, z) * -1;
}
public static Quaternion FromEulerAngles(Vector3 rotation)
{
Quaternion xRotation = Quaternion.FromAxisAngle(Vector3.UnitX, rotation.X);
Quaternion yRotation = Quaternion.FromAxisAngle(Vector3.UnitY, rotation.Y);
Quaternion zRotation = Quaternion.FromAxisAngle(Vector3.UnitZ, rotation.Z);
Quaternion q = (zRotation * yRotation * xRotation);
if (q.W < 0)
q *= -1;
return q;
}
public static float Clamp(float v, float min, float max)
{
if (v < min) return min;

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -360,15 +360,6 @@
<Content Include="Gl_EditorFramework.dll">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="Lib\AampCommon.dll">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="Lib\AampV1Library.dll">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="Lib\AampV2Library.dll">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="Lib\aamp_hashed_names.txt">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>