2019-05-09 20:49:11 +02:00
|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.Linq;
|
|
|
|
|
using System.Text;
|
|
|
|
|
using System.Threading.Tasks;
|
|
|
|
|
using Switch_Toolbox;
|
|
|
|
|
using System.Windows.Forms;
|
|
|
|
|
using Switch_Toolbox.Library;
|
2019-05-09 22:05:17 +02:00
|
|
|
|
using Switch_Toolbox.Library.Forms;
|
2019-05-09 20:49:11 +02:00
|
|
|
|
using BcresLibrary;
|
2019-05-11 19:10:39 +02:00
|
|
|
|
using FirstPlugin.Forms;
|
|
|
|
|
using GL_EditorFramework.Interfaces;
|
2019-05-09 20:49:11 +02:00
|
|
|
|
|
|
|
|
|
namespace FirstPlugin
|
|
|
|
|
{
|
|
|
|
|
public class BCRES : TreeNodeFile, IFileFormat
|
|
|
|
|
{
|
|
|
|
|
public FileType FileType { get; set; } = FileType.Layout;
|
|
|
|
|
|
|
|
|
|
public bool CanSave { get; set; }
|
|
|
|
|
public string[] Description { get; set; } = new string[] { "BCRES" };
|
|
|
|
|
public string[] Extension { get; set; } = new string[] { "*.bcres" };
|
|
|
|
|
public string FileName { get; set; }
|
|
|
|
|
public string FilePath { get; set; }
|
|
|
|
|
public IFileInfo IFileInfo { get; set; }
|
|
|
|
|
|
|
|
|
|
public bool Identify(System.IO.Stream stream)
|
|
|
|
|
{
|
|
|
|
|
using (var reader = new Switch_Toolbox.Library.IO.FileReader(stream, true))
|
|
|
|
|
{
|
|
|
|
|
return reader.CheckSignature(4, "CGFX");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public Type[] Types
|
|
|
|
|
{
|
|
|
|
|
get
|
|
|
|
|
{
|
|
|
|
|
List<Type> types = new List<Type>();
|
|
|
|
|
return types.ToArray();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public BcresFile BcresFile;
|
2019-05-10 23:51:59 +02:00
|
|
|
|
public BCRES_Render RenderedBcres;
|
2019-05-09 20:49:11 +02:00
|
|
|
|
|
|
|
|
|
public void Load(System.IO.Stream stream)
|
|
|
|
|
{
|
|
|
|
|
Text = FileName;
|
|
|
|
|
BcresFile = new BcresFile(stream);
|
2019-05-10 23:51:59 +02:00
|
|
|
|
RenderedBcres = new BCRES_Render();
|
2019-05-09 20:49:11 +02:00
|
|
|
|
|
|
|
|
|
AddNodeGroup(BcresFile.Data.Models, new BCRESGroupNode(BCRESGroupType.Models));
|
|
|
|
|
AddNodeGroup(BcresFile.Data.Textures, new BCRESGroupNode(BCRESGroupType.Textures));
|
|
|
|
|
AddNodeGroup(BcresFile.Data.Lookups, new BCRESGroupNode(BCRESGroupType.Lookups));
|
|
|
|
|
AddNodeGroup(BcresFile.Data.Shaders, new BCRESGroupNode(BCRESGroupType.Shaders));
|
|
|
|
|
AddNodeGroup(BcresFile.Data.Cameras, new BCRESGroupNode(BCRESGroupType.Cameras));
|
|
|
|
|
AddNodeGroup(BcresFile.Data.Fogs, new BCRESGroupNode(BCRESGroupType.Fogs));
|
|
|
|
|
AddNodeGroup(BcresFile.Data.Scenes, new BCRESGroupNode(BCRESGroupType.Scenes));
|
|
|
|
|
AddNodeGroup(BcresFile.Data.SkeletalAnims, new BCRESGroupNode(BCRESGroupType.SkeletalAnim));
|
|
|
|
|
AddNodeGroup(BcresFile.Data.MaterialAnims, new BCRESGroupNode(BCRESGroupType.MaterialAnim));
|
|
|
|
|
AddNodeGroup(BcresFile.Data.VisibiltyAnims, new BCRESGroupNode(BCRESGroupType.VisibiltyAnim));
|
|
|
|
|
AddNodeGroup(BcresFile.Data.CameraAnims, new BCRESGroupNode(BCRESGroupType.CameraAnim));
|
|
|
|
|
AddNodeGroup(BcresFile.Data.LightAnims, new BCRESGroupNode(BCRESGroupType.LightAnim));
|
|
|
|
|
AddNodeGroup(BcresFile.Data.EmitterAnims, new BCRESGroupNode(BCRESGroupType.EmitterAnim));
|
|
|
|
|
AddNodeGroup(BcresFile.Data.Particles, new BCRESGroupNode(BCRESGroupType.Particles));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void AddNodeGroup<T>(ResDict<T> SubSections, BCRESGroupNode Folder)
|
|
|
|
|
where T : CtrObject, new()
|
|
|
|
|
{
|
|
|
|
|
if (SubSections == null || SubSections.Count == 0)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
Nodes.Add(Folder);
|
|
|
|
|
|
|
|
|
|
foreach (CtrObject section in SubSections.Values)
|
|
|
|
|
{
|
|
|
|
|
switch (Folder.Type)
|
|
|
|
|
{
|
|
|
|
|
case BCRESGroupType.Models:
|
2019-05-10 23:51:59 +02:00
|
|
|
|
var CMDLWrapper = new CMDLWrapper((Model)section, this);
|
|
|
|
|
Folder.AddNode(CMDLWrapper);
|
|
|
|
|
RenderedBcres.Models.Add(CMDLWrapper);
|
2019-05-09 20:49:11 +02:00
|
|
|
|
break;
|
|
|
|
|
case BCRESGroupType.Textures:
|
2019-05-09 22:14:42 +02:00
|
|
|
|
Folder.AddNode(new TXOBWrapper((Texture)section, this));
|
2019-05-09 20:49:11 +02:00
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2019-05-11 19:10:39 +02:00
|
|
|
|
List<AbstractGlDrawable> drawables = new List<AbstractGlDrawable>();
|
|
|
|
|
|
2019-05-09 22:05:17 +02:00
|
|
|
|
public void LoadEditors(TreeNode Wrapper, Action OnPropertyChanged)
|
|
|
|
|
{
|
2019-05-11 19:10:39 +02:00
|
|
|
|
BcresEditor bcresEditor = (BcresEditor)LibraryGUI.Instance.GetActiveContent(typeof(BcresEditor));
|
|
|
|
|
bool HasModels = RenderedBcres.Models.Count > 0;
|
|
|
|
|
if (bcresEditor == null)
|
|
|
|
|
{
|
|
|
|
|
bcresEditor = new BcresEditor(HasModels);
|
|
|
|
|
bcresEditor.Dock = DockStyle.Fill;
|
|
|
|
|
LibraryGUI.Instance.LoadEditor(bcresEditor);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (drawables.Count <= 0)
|
|
|
|
|
{
|
|
|
|
|
//Add drawables
|
|
|
|
|
drawables.Add(RenderedBcres);
|
|
|
|
|
|
|
|
|
|
for (int m = 0; m < RenderedBcres.Models.Count; m++)
|
2019-05-11 22:11:27 +02:00
|
|
|
|
{
|
|
|
|
|
if (RenderedBcres.Models[m].Skeleton.Renderable != null)
|
|
|
|
|
drawables.Add(RenderedBcres.Models[m].Skeleton.Renderable);
|
|
|
|
|
}
|
2019-05-11 19:10:39 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (Runtime.UseOpenGL)
|
|
|
|
|
bcresEditor.LoadViewport(drawables);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2019-05-09 22:05:17 +02:00
|
|
|
|
if (Wrapper is MTOBWrapper) {
|
2019-05-11 19:10:39 +02:00
|
|
|
|
LoadPropertyGrid(((MTOBWrapper)Wrapper).Material, bcresEditor, OnPropertyChanged);
|
2019-05-09 22:05:17 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (Wrapper is CMDLWrapper) {
|
2019-05-11 19:10:39 +02:00
|
|
|
|
LoadPropertyGrid(((CMDLWrapper)Wrapper).Model, bcresEditor, OnPropertyChanged);
|
2019-05-09 22:05:17 +02:00
|
|
|
|
}
|
2019-05-11 01:26:45 +02:00
|
|
|
|
|
|
|
|
|
if (Wrapper is CRESBoneWrapper) {
|
2019-05-11 19:10:39 +02:00
|
|
|
|
LoadPropertyGrid(((CRESBoneWrapper)Wrapper).Bone, bcresEditor, OnPropertyChanged);
|
2019-05-11 01:26:45 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (Wrapper is CRESSkeletonWrapper) {
|
2019-05-11 19:10:39 +02:00
|
|
|
|
LoadPropertyGrid(((CRESSkeletonWrapper)Wrapper).Skeleton, bcresEditor, OnPropertyChanged);
|
2019-05-11 01:26:45 +02:00
|
|
|
|
}
|
2019-05-09 22:05:17 +02:00
|
|
|
|
}
|
|
|
|
|
|
2019-05-11 19:10:39 +02:00
|
|
|
|
private void LoadPropertyGrid(object property, BcresEditor bcresEditor, Action OnPropertyChanged)
|
2019-05-09 22:05:17 +02:00
|
|
|
|
{
|
2019-05-11 19:10:39 +02:00
|
|
|
|
STPropertyGrid editor = (STPropertyGrid)bcresEditor.GetActiveEditor(typeof(STPropertyGrid));
|
2019-05-09 22:05:17 +02:00
|
|
|
|
if (editor == null)
|
|
|
|
|
{
|
|
|
|
|
editor = new STPropertyGrid();
|
|
|
|
|
editor.Dock = DockStyle.Fill;
|
2019-05-11 19:10:39 +02:00
|
|
|
|
bcresEditor.LoadEditor(editor);
|
2019-05-09 22:05:17 +02:00
|
|
|
|
}
|
|
|
|
|
editor.LoadProperty(property, OnPropertyChanged);
|
|
|
|
|
}
|
|
|
|
|
|
2019-05-09 20:49:11 +02:00
|
|
|
|
public void Unload()
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
public byte[] Save()
|
|
|
|
|
{
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|