MLO editing progress

This commit is contained in:
dexy
2019-12-30 00:56:29 +11:00
Unverified
parent 92ad8a1067
commit e31e401fa8
10 changed files with 380 additions and 202 deletions
+10 -7
View File
@@ -130,10 +130,15 @@ namespace CodeWalker.Project.Panels
MiloFloorIDTextBox.Text = milo.floorId.ToString();
MiloNumExitPortalsTextBox.Text = milo.numExitPortals.ToString();
MiloFlagsTextBox.Text = milo.MLOInstflags.ToString();
foreach (var sets in CurrentEntity.MloInstance.EntitySets)
if (CurrentEntity.MloInstance.EntitySets != null)
{
MloInstanceEntitySet set = sets.Value;
MiloEntitySetsListBox.Items.Add(set.EntitySet.ToString(), set.Visible);
foreach (var set in CurrentEntity.MloInstance.EntitySets)
{
if (set?.EntitySet != null)
{
MiloEntitySetsListBox.Items.Add(set.EntitySet.ToString(), set.Visible);
}
}
}
}
else
@@ -793,11 +798,9 @@ namespace CodeWalker.Project.Panels
{
if (populatingui) return;
var inst = CurrentEntity?.MloInstance;
var mloarch = CurrentEntity?.Archetype as MloArchetype;
if ((inst != null) && (mloarch != null))
if ((inst != null) && (inst.EntitySets != null) && (e.Index < inst.EntitySets.Length) && (e.Index >= 0))
{
MloInstanceEntitySet mloInstanceEntitySet = inst.EntitySets[mloarch.entitySets[e.Index]._Data.name];
mloInstanceEntitySet.Visible = e.NewValue == CheckState.Checked;
inst.EntitySets[e.Index].Visible = e.NewValue == CheckState.Checked;
return;
}
e.NewValue = CheckState.Unchecked;
+1 -1
View File
@@ -82,7 +82,7 @@ namespace CodeWalker.Project.Panels
TreeNode tn = ProjectForm.ProjectExplorer?.FindMloRoomTreeNode(CurrentRoom);
if (tn != null)
{
tn.Text = CurrentRoom.RoomName;
tn.Text = CurrentRoom.Index.ToString() + ": " + CurrentRoom.RoomName;
}
UpdateFormTitle();
+60 -1
View File
@@ -281,7 +281,7 @@ namespace CodeWalker.Project.Panels
for (int j = 0; j < rooms.Length; j++)
{
var room = rooms[j];
var roomnode = roomsnode.Nodes.Add(room.RoomName);
var roomnode = roomsnode.Nodes.Add(room.Index.ToString() + ": " + room.RoomName);
roomnode.Tag = room;
var roomentities = room.AttachedObjects;
if ((roomentities != null) && (entities != null))
@@ -646,6 +646,10 @@ namespace CodeWalker.Project.Panels
}
public void SetYmapHasChanged(YmapFile ymap, bool changed)
{
if (ymap != null)
{
ymap.HasChanged = true;
}
if (ProjectTreeView.Nodes.Count > 0)
{
var pnode = ProjectTreeView.Nodes[0];
@@ -670,6 +674,10 @@ namespace CodeWalker.Project.Panels
}
public void SetYtypHasChanged(YtypFile ytyp, bool changed)
{
if (ytyp != null)
{
ytyp.HasChanged = true;
}
if (ProjectTreeView.Nodes.Count > 0)
{
var pnode = ProjectTreeView.Nodes[0];
@@ -694,6 +702,10 @@ namespace CodeWalker.Project.Panels
}
public void SetYndHasChanged(YndFile ynd, bool changed)
{
if (ynd != null)
{
ynd.HasChanged = true;
}
if (ProjectTreeView.Nodes.Count > 0)
{
var pnode = ProjectTreeView.Nodes[0];
@@ -718,6 +730,10 @@ namespace CodeWalker.Project.Panels
}
public void SetYnvHasChanged(YnvFile ynv, bool changed)
{
if (ynv != null)
{
ynv.HasChanged = true;
}
if (ProjectTreeView.Nodes.Count > 0)
{
var pnode = ProjectTreeView.Nodes[0];
@@ -742,6 +758,10 @@ namespace CodeWalker.Project.Panels
}
public void SetTrainTrackHasChanged(TrainTrack track, bool changed)
{
if (track != null)
{
track.HasChanged = true;
}
if (ProjectTreeView.Nodes.Count > 0)
{
var pnode = ProjectTreeView.Nodes[0];
@@ -766,6 +786,10 @@ namespace CodeWalker.Project.Panels
}
public void SetScenarioHasChanged(YmtFile scenario, bool changed)
{
if (scenario != null)
{
scenario.HasChanged = true;
}
if (ProjectTreeView.Nodes.Count > 0)
{
var pnode = ProjectTreeView.Nodes[0];
@@ -790,6 +814,10 @@ namespace CodeWalker.Project.Panels
}
public void SetAudioRelHasChanged(RelFile rel, bool changed)
{
if (rel != null)
{
rel.HasChanged = true;
}
if (ProjectTreeView.Nodes.Count > 0)
{
var pnode = ProjectTreeView.Nodes[0];
@@ -814,6 +842,10 @@ namespace CodeWalker.Project.Panels
}
public void SetGrassBatchHasChanged(YmapGrassInstanceBatch batch, bool changed)
{
if (batch?.Ymap != null)
{
batch.Ymap.HasChanged = true;
}
if (ProjectTreeView.Nodes.Count > 0)
{
var gbnode = FindGrassTreeNode(batch);
@@ -1791,6 +1823,33 @@ namespace CodeWalker.Project.Panels
tn.Parent.Nodes.Remove(tn);
}
}
public void RemoveMloRoomTreeNode(MCMloRoomDef room)
{
var tn = FindMloRoomTreeNode(room);
if ((tn != null) && (tn.Parent != null))
{
tn.Parent.Text = "Rooms (" + (room.OwnerMlo?.rooms?.Length.ToString() ?? "0") + ")";
tn.Parent.Nodes.Remove(tn);
}
}
public void RemoveMloPortalTreeNode(MCMloPortalDef portal)
{
var tn = FindMloPortalTreeNode(portal);
if ((tn != null) && (tn.Parent != null))
{
tn.Parent.Text = "Portals (" + (portal.OwnerMlo?.portals?.Length.ToString() ?? "0") + ")";
tn.Parent.Nodes.Remove(tn);
}
}
public void RemoveMloEntitySetTreeNode(MCMloEntitySet set)
{
var tn = FindMloEntitySetTreeNode(set);
if ((tn != null) && (tn.Parent != null))
{
tn.Parent.Text = "Entity Sets (" + (set.OwnerMlo?.entitySets?.Length.ToString() ?? "0") + ")";
tn.Parent.Nodes.Remove(tn);
}
}
public void RemovePathNodeTreeNode(YndNode node)
{
var tn = FindPathNodeTreeNode(node);
+71 -41
View File
@@ -706,7 +706,6 @@ namespace CodeWalker.Project
if (instance != null)
{
CurrentEntity = instance.TryGetYmapEntity(CurrentMloEntity);
CurrentYmapFile = instance.Owner?.Ymap;
}
@@ -721,7 +720,6 @@ namespace CodeWalker.Project
else
{
CurrentArchetype = CurrentEntity.Archetype;
CurrentYmapFile = CurrentEntity.Ymap;
}
}
@@ -2339,45 +2337,50 @@ namespace CodeWalker.Project
return;
}
if ((CurrentMloEntity == null) && (CurrentEntity != null))
{
CurrentMloEntity = mloInstance.TryGetArchetypeEntity(CurrentEntity);
}
if ((CurrentMloRoom == null) && (CurrentMloPortal == null) && (CurrentMloEntitySet == null))
{
if ((mloArch.rooms?.Length??0) <= 0)
if (CurrentMloEntity != null)
{
MessageBox.Show($@"Mlo {mloArch.Name} has no rooms! Cannot create entity.");
return;
CurrentMloRoom = mloArch.GetEntityRoom(CurrentMloEntity);
CurrentMloPortal = mloArch.GetEntityPortal(CurrentMloEntity);
CurrentMloEntitySet = mloArch.GetEntitySet(CurrentMloEntity);
}
else
{
if ((mloArch.rooms?.Length??0) <= 0)
{
MessageBox.Show($@"Mlo {mloArch.Name} has no rooms! Cannot create entity.");
return;
}
CurrentMloRoom = mloArch.rooms[0];
}
CurrentMloRoom = mloArch?.GetEntityRoom(CurrentMloEntity);
}
int roomIndex = CurrentMloRoom?.Index ?? -1;
if (roomIndex >= 0)
if (roomIndex >= (mloArch.rooms?.Length ?? 0))
{
if (roomIndex >= (mloArch.rooms?.Length??0))
{
MessageBox.Show($@"Room at index {roomIndex} does not exist in {mloArch.Name}! {mloArch.Name} only has {(mloArch.rooms?.Length??0)} rooms.");
return;
}
MessageBox.Show($@"Room at index {roomIndex} does not exist in {mloArch.Name}! {mloArch.Name} only has {(mloArch.rooms?.Length ?? 0)} rooms.");
return;
}
int portalIndex = CurrentMloPortal?.Index ?? -1;
if (portalIndex >= 0)
if (portalIndex >= (mloArch.portals?.Length ?? 0))
{
if (portalIndex >= (mloArch.portals?.Length??0))
{
MessageBox.Show($@"Portal at index {portalIndex} does not exist in {mloArch.Name}! {mloArch.Name} only has {(mloArch.portals?.Length??0)} portals.");
return;
}
MessageBox.Show($@"Portal at index {portalIndex} does not exist in {mloArch.Name}! {mloArch.Name} only has {(mloArch.portals?.Length ?? 0)} portals.");
return;
}
int entsetIndex = CurrentMloEntitySet?.Index ?? -1;
if (entsetIndex >= 0)
if (entsetIndex >= (mloArch.entitySets?.Length ?? 0))
{
if (entsetIndex >= (mloArch.entitySets?.Length ?? 0))
{
MessageBox.Show($@"EntitySet at index {entsetIndex} does not exist in {mloArch.Name}! {mloArch.Name} only has {(mloArch.entitySets?.Length ?? 0)} entitySets.");
return;
}
MessageBox.Show($@"EntitySet at index {entsetIndex} does not exist in {mloArch.Name}! {mloArch.Name} only has {(mloArch.entitySets?.Length ?? 0)} entitySets.");
return;
}
@@ -2418,8 +2421,8 @@ namespace CodeWalker.Project
cent.rotation = rot.ToVector4();
var createindex = mloArch.entities.Length;
MCEntityDef ment = new MCEntityDef(ref cent, mloArch);
YmapEntityDef outEnt = mloInstance.CreateYmapEntity(mloInstance.Owner, ment, createindex);
var ment = new MCEntityDef(ref cent, mloArch);
var outEnt = mloInstance.CreateYmapEntity(mloInstance.Owner, ment, createindex);
try
{
@@ -2428,14 +2431,14 @@ namespace CodeWalker.Project
lock (WorldForm.RenderSyncRoot) //don't try to do this while rendering...
{
mloArch.AddEntity(outEnt, roomIndex, portalIndex, entsetIndex);
mloInstance.AddEntity(outEnt);//in the case of entitySets, this will add to the archetype entity set... weird and bad - should change this!
mloInstance.AddEntity(outEnt);
outEnt.SetArchetype(GameFileCache.GetArchetype(cent.archetypeName));
}
}
else
{
mloArch.AddEntity(outEnt, roomIndex, portalIndex, entsetIndex);
mloInstance.AddEntity(outEnt);//in the case of entitySets, this will add to the archetype entity set... weird and bad - should change this!
mloInstance.AddEntity(outEnt);
outEnt.SetArchetype(GameFileCache.GetArchetype(cent.archetypeName));
}
}
@@ -2445,14 +2448,17 @@ namespace CodeWalker.Project
return;
}
ment = mloInstance.TryGetArchetypeEntity(outEnt);
LoadProjectTree();
ProjectExplorer?.TrySelectMloEntityTreeNode(mloInstance.TryGetArchetypeEntity(outEnt));
ProjectExplorer?.TrySelectMloEntityTreeNode(ment);
CurrentEntity = outEnt;
CurrentMloEntity = ment;
CurrentYtypFile = CurrentEntity.MloParent?.Archetype?.Ytyp;
}
public void NewMloRoom(MCMloRoomDef copy = null)
{
var mlo = CurrentMloRoom?.OwnerMlo ?? CurrentMloPortal?.OwnerMlo ?? CurrentMloEntitySet?.OwnerMlo ?? (CurrentEntity?.MloParent.Archetype as MloArchetype);
var mlo = CurrentMloRoom?.OwnerMlo ?? CurrentMloPortal?.OwnerMlo ?? CurrentMloEntitySet?.OwnerMlo ?? (CurrentEntity?.MloParent.Archetype as MloArchetype) ?? (CurrentArchetype as MloArchetype);
if (mlo == null) return;
if (copy == null)
@@ -2488,7 +2494,7 @@ namespace CodeWalker.Project
}
public void NewMloPortal(MCMloPortalDef copy = null)
{
var mlo = CurrentMloRoom?.OwnerMlo ?? CurrentMloPortal?.OwnerMlo ?? CurrentMloEntitySet?.OwnerMlo ?? (CurrentEntity?.MloParent.Archetype as MloArchetype);
var mlo = CurrentMloRoom?.OwnerMlo ?? CurrentMloPortal?.OwnerMlo ?? CurrentMloEntitySet?.OwnerMlo ?? (CurrentEntity?.MloParent.Archetype as MloArchetype) ?? (CurrentArchetype as MloArchetype);
if (mlo == null) return;
if (copy == null)
@@ -2500,13 +2506,17 @@ namespace CodeWalker.Project
if (copy != null)
{
portal._Data = copy._Data;
portal.Corners = (Vector4[])copy.Corners.Clone();
portal.Corners = (Vector4[])copy.Corners?.Clone();
}
else
{
portal._Data.roomFrom = 1;
portal._Data.roomTo = 0;
}
if (portal.Corners == null)
{
portal.Corners = new[] { new Vector4(0, 0, 0, float.NaN), new Vector4(0, 0, 1, float.NaN), new Vector4(0, 1, 1, float.NaN), new Vector4(0, 1, 0, float.NaN) };
}
mlo.AddPortal(portal);
@@ -2522,7 +2532,7 @@ namespace CodeWalker.Project
}
public void NewMloEntitySet(MCMloEntitySet copy = null)
{
var mlo = CurrentMloRoom?.OwnerMlo ?? CurrentMloPortal?.OwnerMlo ?? CurrentMloEntitySet?.OwnerMlo ?? (CurrentEntity?.MloParent.Archetype as MloArchetype);
var mlo = CurrentMloRoom?.OwnerMlo ?? CurrentMloPortal?.OwnerMlo ?? CurrentMloEntitySet?.OwnerMlo ?? (CurrentEntity?.MloParent.Archetype as MloArchetype) ?? (CurrentArchetype as MloArchetype);
if (mlo == null) return;
if (copy == null)
@@ -2546,6 +2556,7 @@ namespace CodeWalker.Project
var mloInstance = TryGetMloInstance(mlo);
if (mloInstance != null)
{
mloInstance.AddEntitySet(set);
}
LoadProjectTree();
@@ -2617,9 +2628,13 @@ namespace CodeWalker.Project
MloInstanceData mloInstance = CurrentEntity.MloParent.MloInstance;
if (mloInstance == null) return false;
var ent = CurrentEntity;
var mcEnt = mloInstance.TryGetArchetypeEntity(ent);
var delent = CurrentEntity; //CurrentEntity could get changed when we remove the tree node..
var delytyp = CurrentEntity.MloParent.Archetype.Ytyp;
var mcEnt = mloInstance.TryGetArchetypeEntity(CurrentEntity);
ProjectExplorer?.RemoveMloEntityTreeNode(mcEnt);
ProjectExplorer?.SetYtypHasChanged(delytyp, true);
try
{
@@ -2627,13 +2642,15 @@ namespace CodeWalker.Project
{
lock (WorldForm.RenderSyncRoot) //don't try to do this while rendering...
{
mloInstance.DeleteEntity(ent);
mloArchetype.RemoveEntity(delent);
mloInstance.DeleteEntity(delent);
//WorldForm.SelectItem(null, null, null);
}
}
else
{
mloInstance.DeleteEntity(ent);
mloArchetype.RemoveEntity(delent);
mloInstance.DeleteEntity(delent);
}
}
catch (Exception e) // various failures could happen so we'll use a trycatch for when an exception is thrown.
@@ -2642,13 +2659,10 @@ namespace CodeWalker.Project
return false;
}
var delent = ent;
var delytyp = delent.MloParent.Archetype.Ytyp;
ProjectExplorer?.SetYtypHasChanged(delytyp, true);
ClosePanel((EditYmapEntityPanel p) => { return p.Tag == delent; });
CurrentEntity = null;
CurrentMloEntity = null;
WorldForm.SelectItem(null);
return true;
@@ -2670,6 +2684,11 @@ namespace CodeWalker.Project
{
}
ProjectExplorer?.RemoveMloRoomTreeNode(CurrentMloRoom);
ProjectExplorer?.SetYtypHasChanged(mlo.Ytyp, true);
ClosePanel((EditYtypMloRoomPanel p) => { return p.Tag == CurrentMloRoom; });
CurrentMloRoom = null;
return true;
}
public bool DeleteMloPortal()
@@ -2689,6 +2708,11 @@ namespace CodeWalker.Project
{
}
ProjectExplorer?.RemoveMloPortalTreeNode(CurrentMloPortal);
ProjectExplorer?.SetYtypHasChanged(mlo.Ytyp, true);
ClosePanel((EditYtypMloPortalPanel p) => { return p.Tag == CurrentMloPortal; });
CurrentMloPortal = null;
return true;
}
public bool DeleteMloEntitySet()
@@ -2706,8 +2730,14 @@ namespace CodeWalker.Project
var mloInstance = TryGetMloInstance(mlo);
if (mloInstance != null)
{
mloInstance.DeleteEntitySet(CurrentMloEntitySet);
}
ProjectExplorer?.RemoveMloEntitySetTreeNode(CurrentMloEntitySet);
ProjectExplorer?.SetYtypHasChanged(mlo.Ytyp, true);
ClosePanel((EditYtypMloEntSetPanel p) => { return p.Tag == CurrentMloEntitySet; });
CurrentMloEntitySet = null;
return true;
}