Skip to content

Commit 66e719b

Browse files
author
Dolu
committed
feat(CodeWalker): improve MLO Portals
Add a flip button to MLO portarls + display an arrow like in blender. Thansk to kirill-mapper: dexyfex#330
1 parent 4f71520 commit 66e719b

5 files changed

Lines changed: 140 additions & 10 deletions

File tree

CodeWalker/Project/Panels/EditYtypMloPortalPanel.Designer.cs

Lines changed: 15 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

CodeWalker/Project/Panels/EditYtypMloPortalPanel.cs

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ public void SetPortal(MCMloPortalDef portal)
3131
Tag = portal;
3232
UpdateFormTitle();
3333
MloInstanceData instance = ProjectForm.TryGetMloInstance(portal?.OwnerMlo);
34-
//ProjectForm.WorldForm?.SelectMloPortal(portal, instance);
34+
ProjectForm.WorldForm?.SelectObject(portal, instance);
3535
UpdateControls();
3636
}
3737

@@ -266,5 +266,35 @@ private void DeleteButton_Click(object sender, EventArgs e)
266266
ProjectForm.SetProjectItem(CurrentPortal);
267267
ProjectForm.DeleteMloPortal();
268268
}
269+
270+
private void FlipPortalButton_Click(object sender, EventArgs e)
271+
{
272+
if (CurrentPortal == null || CurrentPortal.Corners == null || CurrentPortal.Corners.Length < 3) return;
273+
274+
lock (ProjectForm.ProjectSyncRoot)
275+
{
276+
var corners = CurrentPortal.Corners.ToList();
277+
corners.Reverse();
278+
CurrentPortal.Corners = corners.ToArray();
279+
uint tempRoom = CurrentPortal._Data.roomFrom;
280+
CurrentPortal._Data.roomFrom = CurrentPortal._Data.roomTo;
281+
CurrentPortal._Data.roomTo = tempRoom;
282+
populatingui = true;
283+
StringBuilder sb = new StringBuilder();
284+
foreach (var corner in CurrentPortal.Corners)
285+
{
286+
if (sb.Length > 0) sb.AppendLine();
287+
sb.Append(FloatUtil.GetVector3String(new Vector3(corner.X, corner.Y, corner.Z)));
288+
}
289+
CornersTextBox.Text = sb.ToString();
290+
RoomFromTextBox.Text = CurrentPortal._Data.roomFrom.ToString();
291+
RoomToTextBox.Text = CurrentPortal._Data.roomTo.ToString();
292+
populatingui = false;
293+
CurrentPortal.OwnerMlo?.UpdatePortalCounts(); //Is this necessary if the counter doesn't change?
294+
ProjectForm.SetYtypHasChanged(true);
295+
UpdateFormTitle();
296+
UpdateProjectExplorer();
297+
}
298+
}
269299
}
270300
}

CodeWalker/Project/ProjectForm.cs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7655,6 +7655,7 @@ public void OnWorldSelectionChanged(MapSelection sel)
76557655

76567656
var mlo = sel.MloEntityDef;
76577657
var room = sel.MloRoomDef;
7658+
var portal = sel.MloPortalDef;
76587659
var ent = sel.EntityDef;
76597660
var cargen = sel.CarGenerator;
76607661
var lodlight = sel.LodLight;
@@ -7674,7 +7675,7 @@ public void OnWorldSelectionChanged(MapSelection sel)
76747675
var scenarioedge = sel.ScenarioEdge;
76757676
var audiopl = sel.Audio;
76767677
Archetype arch = mlo?.Archetype ?? ent?.MloParent?.Archetype ?? ent?.Archetype;
7677-
YtypFile ytyp = mlo?.Archetype?.Ytyp ?? ent?.MloParent?.Archetype?.Ytyp ?? ent?.Archetype?.Ytyp ?? room?.OwnerMlo?.Ytyp;
7678+
YtypFile ytyp = mlo?.Archetype?.Ytyp ?? ent?.MloParent?.Archetype?.Ytyp ?? ent?.Archetype?.Ytyp ?? room?.OwnerMlo?.Ytyp ?? portal?.OwnerMlo?.Ytyp;
76787679
YmapFile ymap = ent?.Ymap ?? cargen?.Ymap ?? lodlight?.Ymap ?? boxoccluder?.Ymap ?? occludetri?.Ymap ?? grassbatch?.Ymap ?? mlo?.Ymap;
76797680
YbnFile ybn = collbound?.GetRootYbn();
76807681
YndFile ynd = pathnode?.Ynd;
@@ -7731,6 +7732,10 @@ public void OnWorldSelectionChanged(MapSelection sel)
77317732
{
77327733
ProjectExplorer?.TrySelectMloRoomTreeNode(room);
77337734
}
7735+
if (wasmult || (portal != CurrentMloPortal))
7736+
{
7737+
ProjectExplorer?.TrySelectMloPortalTreeNode(portal);
7738+
}
77347739
}
77357740
else if (YbnExistsInProject(ybn))
77367741
{
@@ -7806,7 +7811,7 @@ public void OnWorldSelectionChanged(MapSelection sel)
78067811
}
78077812

78087813
CurrentMloRoom = room;
7809-
CurrentMloPortal = null;
7814+
CurrentMloPortal = portal;
78107815
CurrentMloEntitySet = null;
78117816
CurrentYmapFile = ymap;
78127817
CurrentYtypFile = ytyp;

CodeWalker/World/MapSelection.cs

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ public struct MapSelection
6060
public YmapOccludeModelTriangle OccludeModelTri { get; set; }
6161
public YmapEntityDef MloEntityDef { get; set; }
6262
public MCMloRoomDef MloRoomDef { get; set; }
63+
public MCMloPortalDef MloPortalDef { get; set; }
6364
public WaterQuad WaterQuad { get; set; }
6465
public WaterCalmingQuad CalmingQuad { get; set; }
6566
public WaterWaveQuad WaveQuad { get; set; }
@@ -121,7 +122,8 @@ public bool HasValue
121122
(MloEntityDef != null) ||
122123
(ScenarioNode != null) ||
123124
(Audio != null) ||
124-
(MloRoomDef != null);
125+
(MloRoomDef != null) ||
126+
(MloPortalDef != null);
125127
}
126128
}
127129

@@ -158,7 +160,8 @@ public bool CheckForChanges(MapSelection mhit)
158160
|| (TrainTrackNode != mhit.TrainTrackNode)
159161
|| (ScenarioNode != mhit.ScenarioNode)
160162
|| (Audio != mhit.Audio)
161-
|| (MloRoomDef != mhit.MloRoomDef);
163+
|| (MloRoomDef != mhit.MloRoomDef)
164+
|| (MloPortalDef != mhit.MloPortalDef);
162165
}
163166
public bool CheckForChanges()
164167
{
@@ -188,7 +191,8 @@ public bool CheckForChanges()
188191
|| (TrainTrackNode != null)
189192
|| (ScenarioNode != null)
190193
|| (Audio != null)
191-
|| (MloRoomDef != null);
194+
|| (MloRoomDef != null)
195+
|| (MloPortalDef != null);
192196
}
193197

194198

@@ -284,7 +288,7 @@ public string GetNameString(string defval)
284288
}
285289
else if (OccludeModelTri != null)
286290
{
287-
name = "OccludeModel " + (OccludeModelTri.Ymap?.Name ?? "") + ": " + (OccludeModelTri.Model?.Index??0).ToString() + ":" + OccludeModelTri.Index.ToString();
291+
name = "OccludeModel " + (OccludeModelTri.Ymap?.Name ?? "") + ": " + (OccludeModelTri.Model?.Index ?? 0).ToString() + ":" + OccludeModelTri.Index.ToString();
288292
}
289293
else if (WaterQuad != null)
290294
{
@@ -330,6 +334,10 @@ public string GetNameString(string defval)
330334
{
331335
name = "MloRoomDef " + MloRoomDef.RoomName;
332336
}
337+
if (MloPortalDef != null)
338+
{
339+
name = "MloPortalDef " + MloPortalDef.Name;
340+
}
333341
if (EntityExtension != null)
334342
{
335343
name += ": " + EntityExtension.Name;
@@ -1557,6 +1565,15 @@ public static MapSelection FromProjectObject(WorldForm worldForm, object o, obje
15571565
ms.BBOrientation = instance.Owner.Orientation;
15581566
}
15591567
}
1568+
else if (o is MCMloPortalDef portal)
1569+
{
1570+
if (parent is MloInstanceData instance)
1571+
{
1572+
ms.MloPortalDef = portal;
1573+
ms.BBOffset = instance.Owner.Position;
1574+
ms.BBOrientation = instance.Owner.Orientation;
1575+
}
1576+
}
15601577
else if (o is Bounds b)
15611578
{
15621579
ms.CollisionBounds = b;
@@ -1588,9 +1605,9 @@ public static MapSelection FromProjectObject(WorldForm worldForm, object o, obje
15881605
ms.NavPoint = point;
15891606
ms.AABB = new BoundingBox(new Vector3(-nrad), new Vector3(nrad));
15901607
}
1591-
else if (o is YnvPortal portal)
1608+
else if (o is YnvPortal ynvportal)
15921609
{
1593-
ms.NavPortal = portal;
1610+
ms.NavPortal = ynvportal;
15941611
ms.AABB = new BoundingBox(new Vector3(-nrad), new Vector3(nrad));
15951612
}
15961613
else if (o is YndNode node)

CodeWalker/WorldForm.cs

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1508,6 +1508,25 @@ private void RenderSelection(ref MapSelection selectionItem)
15081508
Renderer.SelectionLineVerts.Add(p1);
15091509
Renderer.SelectionLineVerts.Add(p2);
15101510
}
1511+
if (pcl >= 3)
1512+
{
1513+
Vector3 edge1 = portal.Corners[1].XYZ() - portal.Corners[0].XYZ();
1514+
Vector3 normal = Vector3.Cross(edge1, portal.Corners[2].XYZ() - portal.Corners[0].XYZ());
1515+
float len = normal.Length();
1516+
if (len > 1e-6f)
1517+
{
1518+
normal /= len;
1519+
edge1.Normalize();
1520+
Renderer.RenderSelectionArrowOutline(
1521+
mlop + mlo.Orientation.Multiply(portal.Center),
1522+
mlo.Orientation.Multiply(normal),
1523+
mlo.Orientation.Multiply(Vector3.Normalize(Vector3.Cross(edge1, normal))),
1524+
Quaternion.Identity,
1525+
0.5f, 0.05f,
1526+
((portal._Data.flags & 4) > 0) ? cblu : caqu
1527+
);
1528+
}
1529+
}
15111530
}
15121531
}
15131532
if (mloa.rooms != null)
@@ -1538,6 +1557,51 @@ private void RenderSelection(ref MapSelection selectionItem)
15381557
}
15391558
}
15401559
}
1560+
if (selectionItem.MloPortalDef != null)
1561+
{
1562+
var portal = selectionItem.MloPortalDef;
1563+
var mlop = selectionItem.BBOffset;
1564+
var mloOrientation = selectionItem.BBOrientation;
1565+
if (portal.Corners != null && portal.Corners.Length > 0)
1566+
{
1567+
VertexTypePC p1 = new VertexTypePC();
1568+
VertexTypePC p2 = new VertexTypePC();
1569+
p2.Colour = caqu;
1570+
if ((portal._Data.flags & 4) > 0)
1571+
{
1572+
p2.Colour = cblu;
1573+
}
1574+
var pcl = portal.Corners.Length;
1575+
for (int ic = 0; ic < pcl; ic++)
1576+
{
1577+
var icn = ic + 1; if (icn >= pcl) icn = 0;
1578+
p1.Colour = (ic == 0) ? cred : p2.Colour; // highlight index 0 and winding direction
1579+
p1.Position = mlop + mloOrientation.Multiply(portal.Corners[ic].XYZ());
1580+
p2.Position = mlop + mloOrientation.Multiply(portal.Corners[icn].XYZ());
1581+
Renderer.SelectionLineVerts.Add(p1);
1582+
Renderer.SelectionLineVerts.Add(p2);
1583+
}
1584+
if (pcl >= 3)
1585+
{
1586+
Vector3 edge1 = portal.Corners[1].XYZ() - portal.Corners[0].XYZ();
1587+
Vector3 normal = Vector3.Cross(edge1, portal.Corners[2].XYZ() - portal.Corners[0].XYZ());
1588+
float len = normal.Length();
1589+
if (len > 1e-6f)
1590+
{
1591+
normal /= len;
1592+
edge1.Normalize();
1593+
Renderer.RenderSelectionArrowOutline(
1594+
mlop + mloOrientation.Multiply(portal.Center),
1595+
mloOrientation.Multiply(normal),
1596+
mloOrientation.Multiply(Vector3.Normalize(Vector3.Cross(edge1, normal))),
1597+
Quaternion.Identity,
1598+
0.5f, 0.05f,
1599+
((portal._Data.flags & 4) > 0) ? cblu : caqu
1600+
);
1601+
}
1602+
}
1603+
}
1604+
}
15411605
if (selectionItem.MloRoomDef != null)
15421606
{
15431607
camrel += ori.Multiply(selectionItem.BBOffset);

0 commit comments

Comments
 (0)