Skip to content
Draft
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
12 changes: 12 additions & 0 deletions TombEditor/Editor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1076,6 +1076,16 @@ obj is RoomTextureChangedEvent ||
Tool = _lastGeometryTool;
else
Tool = _lastFaceEditTool;

// If the mode switched to lighting mode, relight all rooms which have `PendingRelight` set to true
if (@event.Current == EditorMode.Lighting)
{
foreach (Room room in Level.Rooms)
{
if (room?.PendingRelight == true)
room.RebuildLighting(Configuration.Rendering3D_HighQualityLightPreview);
}
}
}

// Backup last used tool for next mode
Expand Down Expand Up @@ -1449,5 +1459,7 @@ public bool IsPreciseGeometryAllowed
=> Level.Settings.GameVersion is TRVersion.Game.TombEngine || Configuration.Editor_EnableStepHeightControlsForUnsupportedEngines;

public int IncrementReference => IsPreciseGeometryAllowed ? Configuration.Editor_StepHeight : Level.FullClickHeight;

public bool ShouldRelight => Mode is EditorMode.Lighting;
}
}
54 changes: 31 additions & 23 deletions TombEditor/EditorActions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ public static void SmartBuildGeometry(Room room, RectangleInt2 area)

var watch = new Stopwatch();
watch.Start();
room.SmartBuildGeometry(area, _editor.Configuration.Rendering3D_HighQualityLightPreview);
room.SmartBuildGeometry(area, _editor.ShouldRelight, _editor.Configuration.Rendering3D_HighQualityLightPreview);
watch.Stop();
logger.Debug("Edit geometry time: " + watch.ElapsedMilliseconds + " ms");
_editor.RoomGeometryChange(room);
Expand Down Expand Up @@ -1323,27 +1323,31 @@ public static void DeleteObjectWithoutUpdate(ObjectInstance instance)

if (instance is LightInstance)
{
room.RebuildLighting(_editor.Configuration.Rendering3D_HighQualityLightPreview);
if (_editor.ShouldRelight)
room.RebuildLighting(_editor.Configuration.Rendering3D_HighQualityLightPreview);

_editor.RoomGeometryChange(room);
}

if (instance is PortalInstance)
{
room.BuildGeometry(_editor.Configuration.Rendering3D_HighQualityLightPreview);
room.Rebuild(_editor.ShouldRelight, _editor.Configuration.Rendering3D_HighQualityLightPreview);

if (adjoiningRoom != null)
{
adjoiningRoom.BuildGeometry(_editor.Configuration.Rendering3D_HighQualityLightPreview);
adjoiningRoom.Rebuild(_editor.ShouldRelight, _editor.Configuration.Rendering3D_HighQualityLightPreview);
_editor.RoomSectorPropertiesChange(adjoiningRoom);

if (adjoiningRoom.AlternateOpposite != null)
{
adjoiningRoom.AlternateOpposite.BuildGeometry(_editor.Configuration.Rendering3D_HighQualityLightPreview);
adjoiningRoom.AlternateOpposite.Rebuild(_editor.ShouldRelight, _editor.Configuration.Rendering3D_HighQualityLightPreview);
_editor.RoomSectorPropertiesChange(adjoiningRoom.AlternateOpposite);
}
}

if (room.AlternateOpposite != null)
{
room.AlternateOpposite.BuildGeometry(_editor.Configuration.Rendering3D_HighQualityLightPreview);
room.AlternateOpposite.Rebuild(_editor.ShouldRelight, _editor.Configuration.Rendering3D_HighQualityLightPreview);
_editor.RoomSectorPropertiesChange(room.AlternateOpposite);
}
}
Expand Down Expand Up @@ -2555,8 +2559,8 @@ public static void DeleteRooms(IEnumerable<Room> rooms_, IWin32Window owner = nu
// Update selection
foreach (Room adjoiningRoom in adjoiningRooms)
{
adjoiningRoom?.BuildGeometry(_editor.Configuration.Rendering3D_HighQualityLightPreview);
adjoiningRoom?.AlternateOpposite?.BuildGeometry(_editor.Configuration.Rendering3D_HighQualityLightPreview);
adjoiningRoom?.Rebuild(_editor.ShouldRelight, _editor.Configuration.Rendering3D_HighQualityLightPreview);
adjoiningRoom?.AlternateOpposite?.Rebuild(_editor.ShouldRelight, _editor.Configuration.Rendering3D_HighQualityLightPreview);
}

// Select last room, if available. Else select first existing room.
Expand Down Expand Up @@ -2605,7 +2609,7 @@ public static void CropRoom(Room room, RectangleInt2 newArea, IWin32Window owner
Room.FixupNeighborPortals(_editor.Level, new[] { room }, new[] { room }, ref relevantRooms);
Parallel.ForEach(relevantRooms, relevantRoom =>
{
relevantRoom.BuildGeometry(_editor.Configuration.Rendering3D_HighQualityLightPreview);
relevantRoom.Rebuild(_editor.ShouldRelight, _editor.Configuration.Rendering3D_HighQualityLightPreview);
});

// Cleanup
Expand Down Expand Up @@ -3120,7 +3124,7 @@ public static void AddPortal(Room room, RectangleInt2 area, IWin32Window owner)
// Update
foreach (Room portalRoom in portals.Select(portal => portal.Room).Distinct())
{
portalRoom.BuildGeometry(_editor.Configuration.Rendering3D_HighQualityLightPreview);
portalRoom.Rebuild(_editor.ShouldRelight, _editor.Configuration.Rendering3D_HighQualityLightPreview);
}

foreach (PortalInstance portal in portals)
Expand Down Expand Up @@ -3148,7 +3152,7 @@ public static void AlternateRoomEnable(Room room, short AlternateGroup)
newRoom.Properties.Locked = false;

newRoom.Name = room + " (Flipped)";
newRoom.BuildGeometry(_editor.Configuration.Rendering3D_HighQualityLightPreview);
newRoom.Rebuild(_editor.ShouldRelight, _editor.Configuration.Rendering3D_HighQualityLightPreview);

// Assign room
_editor.Level.AssignRoomToFree(newRoom);
Expand Down Expand Up @@ -3444,7 +3448,7 @@ public static void GridWallsSquares(Room room, RectangleInt2 area, bool fiveDivi
if (fromUI)
SmartBuildGeometry(room, area);
else
room.BuildGeometry();
room.Rebuild(_editor.ShouldRelight, _editor.Configuration.Rendering3D_HighQualityLightPreview);
}

public static Room CreateAdjoiningRoom(Room room, SectorSelection selection, PortalDirection direction, bool grid, int roomDepth, bool switchRoom = true, bool clearAdjoiningArea = false)
Expand Down Expand Up @@ -3591,10 +3595,10 @@ public static Room CreateAdjoiningRoom(Room room, SectorSelection selection, Por
// Build the geometry of the new room
Parallel.Invoke(() =>
{
newRoom.BuildGeometry(_editor.Configuration.Rendering3D_HighQualityLightPreview);
newRoom.Rebuild(_editor.ShouldRelight, _editor.Configuration.Rendering3D_HighQualityLightPreview);
}, () =>
{
room.BuildGeometry(_editor.Configuration.Rendering3D_HighQualityLightPreview);
room.Rebuild(_editor.ShouldRelight, _editor.Configuration.Rendering3D_HighQualityLightPreview);
});

if (switchRoom && (_editor.SelectedRoom == room || _editor.SelectedRoom == room.AlternateOpposite))
Expand Down Expand Up @@ -3905,7 +3909,7 @@ public static void MergeRoomsHorizontally(IEnumerable<Room> rooms, IWin32Window
Room.FixupNeighborPortals(_editor.Level, new[] { newRoom }, new[] { newRoom }.Concat(mergeRooms), ref relevantRooms);
Parallel.ForEach(relevantRooms, relevantRoom =>
{
relevantRoom.BuildGeometry(_editor.Configuration.Rendering3D_HighQualityLightPreview);
relevantRoom.Rebuild(_editor.ShouldRelight, _editor.Configuration.Rendering3D_HighQualityLightPreview);
});

// Add room and update the editor
Expand Down Expand Up @@ -3956,7 +3960,7 @@ public static void SplitRoom(IWin32Window owner)
Room.FixupNeighborPortals(_editor.Level, new[] { room, splitRoom }, new[] { room, splitRoom }, ref relevantRooms);
Parallel.ForEach(relevantRooms, relevantRoom =>
{
relevantRoom.BuildGeometry(_editor.Configuration.Rendering3D_HighQualityLightPreview);
relevantRoom.Rebuild(_editor.ShouldRelight, _editor.Configuration.Rendering3D_HighQualityLightPreview);
});

// Cleanup
Expand Down Expand Up @@ -4003,7 +4007,7 @@ public static void DuplicateRoom(IWin32Window owner)

var newRoom = _editor.SelectedRoom.Clone(_editor.Level);
newRoom.Name = cutName + " (copy" + buffer + ")";
newRoom.BuildGeometry(_editor.Configuration.Rendering3D_HighQualityLightPreview);
newRoom.Rebuild(_editor.ShouldRelight, _editor.Configuration.Rendering3D_HighQualityLightPreview);
_editor.Level.AssignRoomToFree(newRoom);
_editor.RoomListChange();
_editor.UndoManager.PushRoomCreated(newRoom);
Expand Down Expand Up @@ -4711,7 +4715,7 @@ public static bool TransformRooms(RectTransformation transformation, IWin32Windo
var newRooms = _editor.Level.TransformRooms(_editor.SelectedRooms, transformation);
foreach (Room room in newRooms)
{
room.BuildGeometry(_editor.Configuration.Rendering3D_HighQualityLightPreview);
room.Rebuild(_editor.ShouldRelight, _editor.Configuration.Rendering3D_HighQualityLightPreview);
}

_editor.SelectRoomsAndResetCamera(newRooms);
Expand Down Expand Up @@ -4814,9 +4818,13 @@ public static void TryPasteSectors(SectorsClipboardData data, IWin32Window owner
}

// Redraw rooms in portals
portals.Select(p => p.AdjoiningRoom).ToList().ForEach(room => { room.BuildGeometry(); _editor.RoomGeometryChange(room); });
portals.Select(p => p.AdjoiningRoom).ToList().ForEach(room =>
{
room.Rebuild(_editor.ShouldRelight, _editor.Configuration.Rendering3D_HighQualityLightPreview);
_editor.RoomGeometryChange(room);
});

_editor.SelectedRoom.BuildGeometry(_editor.Configuration.Rendering3D_HighQualityLightPreview);
_editor.SelectedRoom.Rebuild(_editor.ShouldRelight, _editor.Configuration.Rendering3D_HighQualityLightPreview);
_editor.RoomSectorPropertiesChange(_editor.SelectedRoom);
}

Expand Down Expand Up @@ -4916,7 +4924,7 @@ public static void SetPortalOpacity(PortalOpacity opacity, IWin32Window owner)
}

portal.Opacity = opacity;
portal.Room.BuildGeometry(_editor.Configuration.Rendering3D_HighQualityLightPreview);
portal.Room.Rebuild(_editor.ShouldRelight, _editor.Configuration.Rendering3D_HighQualityLightPreview);
_editor.RoomGeometryChange(portal.Room);
_editor.ObjectChange(portal, ObjectChangeType.Change);
}
Expand Down Expand Up @@ -5420,7 +5428,7 @@ public static void MoveRooms(VectorInt3 positionDelta, IEnumerable<Room> rooms,
// Update
foreach (Room room in roomsToUpdate)
{
room.BuildGeometry(_editor.Configuration.Rendering3D_HighQualityLightPreview);
room.Rebuild(_editor.ShouldRelight, _editor.Configuration.Rendering3D_HighQualityLightPreview);
_editor.RoomSectorPropertiesChange(room);
}

Expand Down Expand Up @@ -5480,7 +5488,7 @@ public static void SplitSectorObjectOnSelection(SectorBasedObjectInstance @objec
Room.FixupNeighborPortals(_editor.Level, new[] { room }, new[] { room }, ref relevantRooms);
Parallel.ForEach(relevantRooms, relevantRoom =>
{
relevantRoom.BuildGeometry(_editor.Configuration.Rendering3D_HighQualityLightPreview);
relevantRoom.Rebuild(_editor.ShouldRelight, _editor.Configuration.Rendering3D_HighQualityLightPreview);
});
foreach (Room relevantRoom in relevantRooms)
_editor.RoomPropertiesChange(relevantRoom);
Expand Down
2 changes: 1 addition & 1 deletion TombEditor/Forms/FormTextureRemap.cs
Original file line number Diff line number Diff line change
Expand Up @@ -218,7 +218,7 @@ private void butOk_Click(object sender, EventArgs e)
}

// Send out updates
Parallel.ForEach(relevantRooms, room => room.BuildGeometry());
Parallel.ForEach(relevantRooms, room => room.Rebuild(_editor.ShouldRelight, _editor.Configuration.Rendering3D_HighQualityLightPreview));
foreach (Room room in relevantRooms)
_editor.RoomTextureChange(room);

Expand Down
8 changes: 4 additions & 4 deletions TombEditor/Undo.cs
Original file line number Diff line number Diff line change
Expand Up @@ -187,7 +187,7 @@ public TransformObjectUndoInstance(EditorUndoManager parent, PositionBasedObject

// Rebuild lighting!
if (UndoObject is LightInstance)
Room.BuildGeometry();
Room.RebuildLighting(parent.Editor.Configuration.Rendering3D_HighQualityLightPreview);

// Move origin of object group, if it contains object
if (Parent.Editor.SelectedObject is ObjectGroup)
Expand Down Expand Up @@ -401,12 +401,12 @@ public GeometryUndoInstance(EditorUndoManager parent, Room room) : base(parent,
for (int z = Area.Y0, j = 0; z < Area.Y1; z++, j++)
Room.Sectors[x, z].ReplaceGeometry(Parent.Editor.Level, Sectors[i, j]);

Room.BuildGeometry();
Room.Rebuild(parent.Editor.ShouldRelight, parent.Editor.Configuration.Rendering3D_HighQualityLightPreview);
Parent.Editor.RoomGeometryChange(Room);
Parent.Editor.RoomSectorPropertiesChange(Room);
var relevantRooms = room.Portals.Select(p => p.AdjoiningRoom).Distinct();
Parallel.ForEach(relevantRooms, r => r.BuildGeometry());
Parallel.ForEach(relevantRooms, r => r.Rebuild(parent.Editor.ShouldRelight, parent.Editor.Configuration.Rendering3D_HighQualityLightPreview));


foreach (Room relevantRoom in relevantRooms)
Parent.Editor.RoomGeometryChange(relevantRoom);
Expand Down
2 changes: 1 addition & 1 deletion TombLib/TombLib/LevelData/IO/Prj2Loader.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1182,7 +1182,7 @@ private static bool LoadRooms(ChunkReader chunkIO, ChunkId idOuter, Level level,
CancellationToken = cancelToken,
};
progressReporter?.ReportInfo("Building world geometry");
Parallel.ForEach(level.ExistingRooms, parallelOptions, room => room.BuildGeometry());
Parallel.ForEach(level.ExistingRooms, parallelOptions, room => room.Rebuild(relight: true, highQualityLighting: true));
return true;
}

Expand Down
2 changes: 1 addition & 1 deletion TombLib/TombLib/LevelData/IO/PrjLoader.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1985,7 +1985,7 @@ public static Level LoadFromPrj(string filename, string soundsPath,
{
CancellationToken = cancelToken
};
Parallel.ForEach(level.ExistingRooms, options, room => room.BuildGeometry());
Parallel.ForEach(level.ExistingRooms, options, room => room.Rebuild(relight: true, highQualityLighting: true));
progressReporter?.ReportProgress(100, "Level loaded correctly!");

return level;
Expand Down
2 changes: 1 addition & 1 deletion TombLib/TombLib/LevelData/Level.cs
Original file line number Diff line number Diff line change
Expand Up @@ -377,7 +377,7 @@ public void RemoveTextures(Predicate<LevelTexture> askIfTextureToRemove)
sector.SetFaceTexture(face, TextureArea.None);
}
}
room.BuildGeometry();
room.Rebuild(relight: true, highQualityLighting: true);
});

foreach (AnimatedTextureSet set in Settings.AnimatedTextureSets)
Expand Down
31 changes: 24 additions & 7 deletions TombLib/TombLib/LevelData/Room.cs
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,7 @@ public class Room : ITriggerParameter

// Internal data structures
public RoomGeometry RoomGeometry { get; } = new RoomGeometry();
public bool PendingRelight { get; private set; } = true;

private IEnumerable<PortalInstance> _portalsCache;

Expand All @@ -143,7 +144,7 @@ public Room(Level level, int numXSectors, int numZSectors, Vector3 ambientLight,
Level = level;
Properties = new RoomProperties() { AmbientLight = ambientLight };
Resize(null, new RectangleInt2(0, 0, numXSectors - 1, numZSectors - 1), 0, ceiling, true);
BuildGeometry();
Rebuild(relight: true, highQualityLighting: true);
}

public Room(Level level, VectorInt2 sectorSize, Vector3 ambientLight, string name = "Unnamed", int ceiling = DefaultHeight)
Expand Down Expand Up @@ -311,8 +312,8 @@ public Room Split(Level level, RectangleInt2 area, Room alternateOppositeSplitRo
newRoom.MoveObjectFrom(level, this, instance);
}

newRoom.BuildGeometry();
BuildGeometry();
newRoom.Rebuild(relight: true, highQualityLighting: true);
Rebuild(relight: true, highQualityLighting: true);
return newRoom;
}

Expand Down Expand Up @@ -949,14 +950,30 @@ public FaceShape GetFaceShape(int x, int z, SectorFace face)
}
}

public void BuildGeometry(bool highQualityLighting = false, bool useLegacyCode = false)
public void Rebuild(bool relight, bool highQualityLighting)
{
RoomGeometry.Build(this, highQualityLighting, useLegacyCode);
RoomGeometry.Build(this);

if (relight)
{
RoomGeometry.Relight(this, highQualityLighting);
PendingRelight = false;
}
else
{
PendingRelight = true;
}
}

public void BuildGeometry(bool useLegacyCode = false)
{
RoomGeometry.Build(this, useLegacyCode);
}

public void RebuildLighting(bool highQualityLighting)
{
RoomGeometry.Relight(this, highQualityLighting);
PendingRelight = false;
}

public Matrix4x4 Transform => Matrix4x4.CreateTranslation(WorldPos);
Expand Down Expand Up @@ -1549,7 +1566,7 @@ public RoomConnectionInfo GetCeilingRoomConnectionInfo(VectorInt2 pos, bool incl
return new RoomConnectionInfo();
}

public void SmartBuildGeometry(RectangleInt2 area, bool highQualityLighting = false)
public void SmartBuildGeometry(RectangleInt2 area, bool relight, bool highQualityLighting = false)
{
area = area.Inflate(1); // Add margin

Expand Down Expand Up @@ -1593,7 +1610,7 @@ public void SmartBuildGeometry(RectangleInt2 area, bool highQualityLighting = fa
// Update the collected stuff now
Parallel.For(0, roomsToProcess.Count, index =>
{
roomsToProcess[index].BuildGeometry(highQualityLighting);
roomsToProcess[index].Rebuild(relight, highQualityLighting);
});
}

Expand Down
5 changes: 1 addition & 4 deletions TombLib/TombLib/LevelData/RoomGeometry.cs
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ public class RoomGeometry
public SortedList<SectorFaceIdentity, VertexRange> VertexRangeLookup { get; } = new SortedList<SectorFaceIdentity, VertexRange>();

// useLegacyCode is used for converting legacy .PRJ files to .PRJ2 files
public void Build(Room room, bool highQualityLighting, bool useLegacyCode = false)
public void Build(Room room, bool useLegacyCode = false)
{
VertexPositions.Clear();
VertexEditorUVs.Clear();
Expand Down Expand Up @@ -321,9 +321,6 @@ public void Build(Room room, bool highQualityLighting, bool useLegacyCode = fals

// Build color array
VertexColors.Resize(VertexPositions.Count, room.Properties.AmbientLight);

// Lighting
Relight(room, highQualityLighting);
}

public void UpdateFaceTexture(int x, int z, SectorFace face, TextureArea texture, bool wasDoubleSided)
Expand Down