Add map clearing, handle cells without visible polys, add lighting
This commit is contained in:
parent
2e841276f3
commit
1ba0c6ac27
|
@ -144,7 +144,7 @@ public class WorldRep : IChunk
|
||||||
public int LightIndexCount { get; set; }
|
public int LightIndexCount { get; set; }
|
||||||
public ushort[] LightIndices { get; set; }
|
public ushort[] LightIndices { get; set; }
|
||||||
|
|
||||||
public Cell(BinaryReader reader)
|
public Cell(BinaryReader reader, int bpp)
|
||||||
{
|
{
|
||||||
VertexCount = reader.ReadByte();
|
VertexCount = reader.ReadByte();
|
||||||
PolyCount = reader.ReadByte();
|
PolyCount = reader.ReadByte();
|
||||||
|
@ -199,7 +199,6 @@ public class WorldRep : IChunk
|
||||||
for (var i = 0; i < RenderPolyCount; i++)
|
for (var i = 0; i < RenderPolyCount; i++)
|
||||||
{
|
{
|
||||||
var info = LightList[i];
|
var info = LightList[i];
|
||||||
var bpp = 4; // TODO: WREXT only!
|
|
||||||
Lightmaps[i] = new Lightmap(reader, info.Width, info.Height, info.AnimLightBitmask, bpp);
|
Lightmaps[i] = new Lightmap(reader, info.Width, info.Height, info.AnimLightBitmask, bpp);
|
||||||
}
|
}
|
||||||
LightIndexCount = reader.ReadInt32();
|
LightIndexCount = reader.ReadInt32();
|
||||||
|
@ -218,10 +217,12 @@ public class WorldRep : IChunk
|
||||||
public void ReadData(BinaryReader reader, DbFile.TableOfContents.Entry entry)
|
public void ReadData(BinaryReader reader, DbFile.TableOfContents.Entry entry)
|
||||||
{
|
{
|
||||||
DataHeader = new(reader);
|
DataHeader = new(reader);
|
||||||
|
var bpp = (DataHeader.LightmapFormat == 0) ? 2 : 4;
|
||||||
|
|
||||||
Cells = new Cell[DataHeader.CellCount];
|
Cells = new Cell[DataHeader.CellCount];
|
||||||
for (var i = 0; i < DataHeader.CellCount; i++)
|
for (var i = 0; i < DataHeader.CellCount; i++)
|
||||||
{
|
{
|
||||||
Cells[i] = new Cell(reader);
|
Cells[i] = new Cell(reader, bpp);
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: All the other info lol
|
// TODO: All the other info lol
|
||||||
|
|
|
@ -96,8 +96,8 @@ public class DbFile
|
||||||
{
|
{
|
||||||
return entryName switch
|
return entryName switch
|
||||||
{
|
{
|
||||||
"AI_ROOM_DB" => new AiRoomDb(),
|
// "AI_ROOM_DB" => new AiRoomDb(),
|
||||||
"AICONVERSE" => new AiConverseChunk(),
|
// "AICONVERSE" => new AiConverseChunk(),
|
||||||
"WREXT" => new WorldRep(),
|
"WREXT" => new WorldRep(),
|
||||||
_ => new GenericChunk(),
|
_ => new GenericChunk(),
|
||||||
};
|
};
|
||||||
|
|
|
@ -15,6 +15,8 @@ public partial class Mission : Node3D
|
||||||
public string FileName { get; set; }
|
public string FileName { get; set; }
|
||||||
[Export]
|
[Export]
|
||||||
public bool Build = false;
|
public bool Build = false;
|
||||||
|
[Export]
|
||||||
|
public bool Clear = false;
|
||||||
|
|
||||||
|
|
||||||
DbFile _file;
|
DbFile _file;
|
||||||
|
@ -31,6 +33,11 @@ public partial class Mission : Node3D
|
||||||
RebuildMap();
|
RebuildMap();
|
||||||
Build = false;
|
Build = false;
|
||||||
}
|
}
|
||||||
|
if (Clear)
|
||||||
|
{
|
||||||
|
ClearMap();
|
||||||
|
Clear = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void _Input(InputEvent @event)
|
public override void _Input(InputEvent @event)
|
||||||
|
@ -44,12 +51,17 @@ public partial class Mission : Node3D
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void RebuildMap()
|
public void ClearMap()
|
||||||
{
|
{
|
||||||
foreach (var node in GetChildren())
|
foreach (var node in GetChildren())
|
||||||
{
|
{
|
||||||
node.QueueFree();
|
node.QueueFree();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void RebuildMap()
|
||||||
|
{
|
||||||
|
ClearMap();
|
||||||
|
|
||||||
_file = new(FileName);
|
_file = new(FileName);
|
||||||
var wr = (WorldRep)_file.Chunks["WREXT"];
|
var wr = (WorldRep)_file.Chunks["WREXT"];
|
||||||
|
@ -66,6 +78,11 @@ public partial class Mission : Node3D
|
||||||
var numRenderPolys = cell.RenderPolyCount;
|
var numRenderPolys = cell.RenderPolyCount;
|
||||||
var numPortalPolys = cell.PortalPolyCount;
|
var numPortalPolys = cell.PortalPolyCount;
|
||||||
|
|
||||||
|
if (numRenderPolys == 0 || numPortalPolys >= numPolys)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
var vertices = new List<Vector3>();
|
var vertices = new List<Vector3>();
|
||||||
var normals = new List<Vector3>();
|
var normals = new List<Vector3>();
|
||||||
var idxOffset = 0;
|
var idxOffset = 0;
|
||||||
|
@ -86,13 +103,10 @@ public partial class Mission : Node3D
|
||||||
for (int j = 1; j < numPolyVertices - 1; j++)
|
for (int j = 1; j < numPolyVertices - 1; j++)
|
||||||
{
|
{
|
||||||
foreach (var offset in new int[] { 0, j, j + 1 })
|
foreach (var offset in new int[] { 0, j, j + 1 })
|
||||||
// foreach (var offset in new int[] { j + 1, j, 0 })
|
|
||||||
{
|
{
|
||||||
var vertex = cell.Vertices[cell.Indices[idxOffset + offset]];
|
var vertex = cell.Vertices[cell.Indices[idxOffset + offset]];
|
||||||
vertices.Add(vertex.ToGodotVec3(4.0f));
|
vertices.Add(vertex.ToGodotVec3(4.0f));
|
||||||
normals.Add(normal.ToGodotVec3(4.0f));
|
normals.Add(normal.ToGodotVec3(4.0f));
|
||||||
// vertices.Add(new Vector3(vertex.Y, vertex.Z, vertex.X));
|
|
||||||
// normals.Add(new Vector3(normal.Y, normal.Z, normal.X));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -111,7 +125,17 @@ public partial class Mission : Node3D
|
||||||
Mesh = arrMesh,
|
Mesh = arrMesh,
|
||||||
CastShadow = GeometryInstance3D.ShadowCastingSetting.On
|
CastShadow = GeometryInstance3D.ShadowCastingSetting.On
|
||||||
};
|
};
|
||||||
|
|
||||||
AddChild(meshInstance);
|
AddChild(meshInstance);
|
||||||
|
|
||||||
|
var r = new Random();
|
||||||
|
if (r.NextSingle() > 0.9 && cell.SphereRadius > 5.0)
|
||||||
|
{
|
||||||
|
var light = new OmniLight3D
|
||||||
|
{
|
||||||
|
Position = cell.SphereCenter.ToGodotVec3(4.0f),
|
||||||
|
OmniRange = cell.SphereRadius * (r.NextSingle() + 1.0f) * 0.5f,
|
||||||
|
};
|
||||||
|
AddChild(light);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -9,17 +9,10 @@
|
||||||
|
|
||||||
[node name="Mission" type="Node3D" parent="."]
|
[node name="Mission" type="Node3D" parent="."]
|
||||||
script = ExtResource("1_xhqt7")
|
script = ExtResource("1_xhqt7")
|
||||||
FileName = "/home/jarrod/Dev/thief/de-specs/test_data/wr-test.cow"
|
FileName = "/home/jarrod/Dev/thief/de-specs/test_data/rose-garden.mis"
|
||||||
|
|
||||||
[node name="Camera3D" type="Camera3D" parent="."]
|
[node name="Camera3D" type="Camera3D" parent="."]
|
||||||
script = ExtResource("2_w5otl")
|
script = ExtResource("2_w5otl")
|
||||||
|
|
||||||
[node name="WorldEnvironment" type="WorldEnvironment" parent="."]
|
[node name="WorldEnvironment" type="WorldEnvironment" parent="."]
|
||||||
environment = SubResource("Environment_oxkvl")
|
environment = SubResource("Environment_oxkvl")
|
||||||
|
|
||||||
[node name="OmniLight3D" type="OmniLight3D" parent="."]
|
|
||||||
shadow_enabled = true
|
|
||||||
|
|
||||||
[node name="OmniLight3D3" type="OmniLight3D" parent="."]
|
|
||||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.509499, 0.98353, 1.1662)
|
|
||||||
shadow_enabled = true
|
|
||||||
|
|
Loading…
Reference in New Issue