Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 15 additions & 1 deletion CodeWalker/Project/Panels/EditYtypMloPortalPanel.Designer.cs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

32 changes: 31 additions & 1 deletion CodeWalker/Project/Panels/EditYtypMloPortalPanel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ public void SetPortal(MCMloPortalDef portal)
Tag = portal;
UpdateFormTitle();
MloInstanceData instance = ProjectForm.TryGetMloInstance(portal?.OwnerMlo);
//ProjectForm.WorldForm?.SelectMloPortal(portal, instance);
ProjectForm.WorldForm?.SelectObject(portal, instance);
UpdateControls();
}

Expand Down Expand Up @@ -266,5 +266,35 @@ private void DeleteButton_Click(object sender, EventArgs e)
ProjectForm.SetProjectItem(CurrentPortal);
ProjectForm.DeleteMloPortal();
}

private void FlipPortalButton_Click(object sender, EventArgs e)
{
if (CurrentPortal == null || CurrentPortal.Corners == null || CurrentPortal.Corners.Length < 3) return;

lock (ProjectForm.ProjectSyncRoot)
{
var corners = CurrentPortal.Corners.ToList();
corners.Reverse();
CurrentPortal.Corners = corners.ToArray();
uint tempRoom = CurrentPortal._Data.roomFrom;
CurrentPortal._Data.roomFrom = CurrentPortal._Data.roomTo;
CurrentPortal._Data.roomTo = tempRoom;
populatingui = true;
StringBuilder sb = new StringBuilder();
foreach (var corner in CurrentPortal.Corners)
{
if (sb.Length > 0) sb.AppendLine();
sb.Append(FloatUtil.GetVector3String(new Vector3(corner.X, corner.Y, corner.Z)));
}
CornersTextBox.Text = sb.ToString();
RoomFromTextBox.Text = CurrentPortal._Data.roomFrom.ToString();
RoomToTextBox.Text = CurrentPortal._Data.roomTo.ToString();
populatingui = false;
CurrentPortal.OwnerMlo?.UpdatePortalCounts(); //Is this necessary if the counter doesn't change?
ProjectForm.SetYtypHasChanged(true);
UpdateFormTitle();
UpdateProjectExplorer();
}
}
}
}
9 changes: 7 additions & 2 deletions CodeWalker/Project/ProjectForm.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7640,6 +7640,7 @@ public void OnWorldSelectionChanged(MapSelection sel)

var mlo = sel.MloEntityDef;
var room = sel.MloRoomDef;
var portal = sel.MloPortalDef;
var ent = sel.EntityDef;
var cargen = sel.CarGenerator;
var lodlight = sel.LodLight;
Expand All @@ -7659,7 +7660,7 @@ public void OnWorldSelectionChanged(MapSelection sel)
var scenarioedge = sel.ScenarioEdge;
var audiopl = sel.Audio;
Archetype arch = mlo?.Archetype ?? ent?.MloParent?.Archetype ?? ent?.Archetype;
YtypFile ytyp = mlo?.Archetype?.Ytyp ?? ent?.MloParent?.Archetype?.Ytyp ?? ent?.Archetype?.Ytyp ?? room?.OwnerMlo?.Ytyp;
YtypFile ytyp = mlo?.Archetype?.Ytyp ?? ent?.MloParent?.Archetype?.Ytyp ?? ent?.Archetype?.Ytyp ?? room?.OwnerMlo?.Ytyp ?? portal?.OwnerMlo?.Ytyp;
YmapFile ymap = ent?.Ymap ?? cargen?.Ymap ?? lodlight?.Ymap ?? boxoccluder?.Ymap ?? occludetri?.Ymap ?? grassbatch?.Ymap ?? mlo?.Ymap;
YbnFile ybn = collbound?.GetRootYbn();
YndFile ynd = pathnode?.Ynd;
Expand Down Expand Up @@ -7716,6 +7717,10 @@ public void OnWorldSelectionChanged(MapSelection sel)
{
ProjectExplorer?.TrySelectMloRoomTreeNode(room);
}
if (wasmult || (portal != CurrentMloPortal))
{
ProjectExplorer?.TrySelectMloPortalTreeNode(portal);
}
}
else if (YbnExistsInProject(ybn))
{
Expand Down Expand Up @@ -7791,7 +7796,7 @@ public void OnWorldSelectionChanged(MapSelection sel)
}

CurrentMloRoom = room;
CurrentMloPortal = null;
CurrentMloPortal = portal;
CurrentMloEntitySet = null;
CurrentYmapFile = ymap;
CurrentYtypFile = ytyp;
Expand Down
29 changes: 23 additions & 6 deletions CodeWalker/World/MapSelection.cs
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ public struct MapSelection
public YmapOccludeModelTriangle OccludeModelTri { get; set; }
public YmapEntityDef MloEntityDef { get; set; }
public MCMloRoomDef MloRoomDef { get; set; }
public MCMloPortalDef MloPortalDef { get; set; }
public WaterQuad WaterQuad { get; set; }
public WaterCalmingQuad CalmingQuad { get; set; }
public WaterWaveQuad WaveQuad { get; set; }
Expand Down Expand Up @@ -121,7 +122,8 @@ public bool HasValue
(MloEntityDef != null) ||
(ScenarioNode != null) ||
(Audio != null) ||
(MloRoomDef != null);
(MloRoomDef != null) ||
(MloPortalDef != null);
}
}

Expand Down Expand Up @@ -158,7 +160,8 @@ public bool CheckForChanges(MapSelection mhit)
|| (TrainTrackNode != mhit.TrainTrackNode)
|| (ScenarioNode != mhit.ScenarioNode)
|| (Audio != mhit.Audio)
|| (MloRoomDef != mhit.MloRoomDef);
|| (MloRoomDef != mhit.MloRoomDef)
|| (MloPortalDef != mhit.MloPortalDef);
}
public bool CheckForChanges()
{
Expand Down Expand Up @@ -188,7 +191,8 @@ public bool CheckForChanges()
|| (TrainTrackNode != null)
|| (ScenarioNode != null)
|| (Audio != null)
|| (MloRoomDef != null);
|| (MloRoomDef != null)
|| (MloPortalDef != null);
}


Expand Down Expand Up @@ -284,7 +288,7 @@ public string GetNameString(string defval)
}
else if (OccludeModelTri != null)
{
name = "OccludeModel " + (OccludeModelTri.Ymap?.Name ?? "") + ": " + (OccludeModelTri.Model?.Index??0).ToString() + ":" + OccludeModelTri.Index.ToString();
name = "OccludeModel " + (OccludeModelTri.Ymap?.Name ?? "") + ": " + (OccludeModelTri.Model?.Index ?? 0).ToString() + ":" + OccludeModelTri.Index.ToString();
}
else if (WaterQuad != null)
{
Expand Down Expand Up @@ -330,6 +334,10 @@ public string GetNameString(string defval)
{
name = "MloRoomDef " + MloRoomDef.RoomName;
}
if (MloPortalDef != null)
{
name = "MloPortalDef " + MloPortalDef.Name;
}
if (EntityExtension != null)
{
name += ": " + EntityExtension.Name;
Expand Down Expand Up @@ -1557,6 +1565,15 @@ public static MapSelection FromProjectObject(WorldForm worldForm, object o, obje
ms.BBOrientation = instance.Owner.Orientation;
}
}
else if (o is MCMloPortalDef portal)
{
if (parent is MloInstanceData instance)
{
ms.MloPortalDef = portal;
ms.BBOffset = instance.Owner.Position;
ms.BBOrientation = instance.Owner.Orientation;
}
}
else if (o is Bounds b)
{
ms.CollisionBounds = b;
Expand Down Expand Up @@ -1588,9 +1605,9 @@ public static MapSelection FromProjectObject(WorldForm worldForm, object o, obje
ms.NavPoint = point;
ms.AABB = new BoundingBox(new Vector3(-nrad), new Vector3(nrad));
}
else if (o is YnvPortal portal)
else if (o is YnvPortal ynvportal)
{
ms.NavPortal = portal;
ms.NavPortal = ynvportal;
ms.AABB = new BoundingBox(new Vector3(-nrad), new Vector3(nrad));
}
else if (o is YndNode node)
Expand Down
64 changes: 64 additions & 0 deletions CodeWalker/WorldForm.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1508,6 +1508,25 @@ private void RenderSelection(ref MapSelection selectionItem)
Renderer.SelectionLineVerts.Add(p1);
Renderer.SelectionLineVerts.Add(p2);
}
if (pcl >= 3)
{
Vector3 edge1 = portal.Corners[1].XYZ() - portal.Corners[0].XYZ();
Vector3 normal = Vector3.Cross(edge1, portal.Corners[2].XYZ() - portal.Corners[0].XYZ());
float len = normal.Length();
if (len > 1e-6f)
{
normal /= len;
edge1.Normalize();
Renderer.RenderSelectionArrowOutline(
mlop + mlo.Orientation.Multiply(portal.Center),
mlo.Orientation.Multiply(normal),
mlo.Orientation.Multiply(Vector3.Normalize(Vector3.Cross(edge1, normal))),
Quaternion.Identity,
0.5f, 0.05f,
((portal._Data.flags & 4) > 0) ? cblu : caqu
);
}
}
}
}
if (mloa.rooms != null)
Expand Down Expand Up @@ -1538,6 +1557,51 @@ private void RenderSelection(ref MapSelection selectionItem)
}
}
}
if (selectionItem.MloPortalDef != null)
{
var portal = selectionItem.MloPortalDef;
var mlop = selectionItem.BBOffset;
var mloOrientation = selectionItem.BBOrientation;
if (portal.Corners != null && portal.Corners.Length > 0)
{
VertexTypePC p1 = new VertexTypePC();
VertexTypePC p2 = new VertexTypePC();
p2.Colour = caqu;
if ((portal._Data.flags & 4) > 0)
{
p2.Colour = cblu;
}
var pcl = portal.Corners.Length;
for (int ic = 0; ic < pcl; ic++)
{
var icn = ic + 1; if (icn >= pcl) icn = 0;
p1.Colour = (ic == 0) ? cred : p2.Colour; // highlight index 0 and winding direction
p1.Position = mlop + mloOrientation.Multiply(portal.Corners[ic].XYZ());
p2.Position = mlop + mloOrientation.Multiply(portal.Corners[icn].XYZ());
Renderer.SelectionLineVerts.Add(p1);
Renderer.SelectionLineVerts.Add(p2);
}
if (pcl >= 3)
{
Vector3 edge1 = portal.Corners[1].XYZ() - portal.Corners[0].XYZ();
Vector3 normal = Vector3.Cross(edge1, portal.Corners[2].XYZ() - portal.Corners[0].XYZ());
float len = normal.Length();
if (len > 1e-6f)
{
normal /= len;
edge1.Normalize();
Renderer.RenderSelectionArrowOutline(
mlop + mloOrientation.Multiply(portal.Center),
mloOrientation.Multiply(normal),
mloOrientation.Multiply(Vector3.Normalize(Vector3.Cross(edge1, normal))),
Quaternion.Identity,
0.5f, 0.05f,
((portal._Data.flags & 4) > 0) ? cblu : caqu
);
}
}
}
}
if (selectionItem.MloRoomDef != null)
{
camrel += ori.Multiply(selectionItem.BBOffset);
Expand Down