Compare commits
3 Commits
e8b77b42bb
...
50c4d06f19
Author | SHA1 | Date |
---|---|---|
Jarrod Doyle | 50c4d06f19 | |
Jarrod Doyle | d7b8ee35f4 | |
Jarrod Doyle | 3307cdc8a9 |
|
@ -118,42 +118,26 @@ public class WorldRep : IChunk
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public readonly Vector4[] AsRgba(uint layer)
|
public readonly Vector4 GetPixel(uint layer, uint x, uint y)
|
||||||
{
|
{
|
||||||
if (layer >= Pixels.GetLength(0))
|
if (layer >= Pixels.GetLength(0) || x >= Pixels.GetLength(2) || y >= Pixels.GetLength(1))
|
||||||
{
|
{
|
||||||
|
return Vector4.Zero;
|
||||||
return System.Array.Empty<Vector4>();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var height = Pixels.GetLength(1);
|
switch (Pixels.GetLength(3))
|
||||||
var width = Pixels.GetLength(2);
|
|
||||||
var bpp = Pixels.GetLength(3);
|
|
||||||
var colours = new Vector4[height * width];
|
|
||||||
for (var y = 0; y < height; y++)
|
|
||||||
{
|
{
|
||||||
for (var x = 0; x < width; x++)
|
case 1:
|
||||||
{
|
var raw1 = Pixels[layer, y, x, 0];
|
||||||
var idx = x + y * width;
|
return new Vector4(raw1, raw1, raw1, 255) / 255.0f;
|
||||||
|
case 2:
|
||||||
switch (bpp)
|
var raw2 = Pixels[layer, y, x, 0] + (Pixels[layer, y, x, 1] << 8);
|
||||||
{
|
return new Vector4(raw2 & 31, (raw2 >> 5) & 31, (raw2 >> 10) & 31, 32) / 32.0f;
|
||||||
case 1:
|
case 4:
|
||||||
var raw1 = Pixels[layer, y, x, 0];
|
return new Vector4(Pixels[layer, y, x, 0], Pixels[layer, y, x, 1], Pixels[layer, y, x, 2], Pixels[layer, y, x, 3]) / 255.0f;
|
||||||
colours[idx] = new Vector4(raw1, raw1, raw1, 255) / 255.0f;
|
default:
|
||||||
break;
|
return Vector4.Zero;
|
||||||
case 2:
|
|
||||||
var raw2 = Pixels[layer, y, x, 0] + (Pixels[layer, y, x, 1] << 8);
|
|
||||||
colours[idx] = new Vector4(raw2 & 31, (raw2 >> 5) & 31, (raw2 >> 10) & 31, 32) / 32.0f;
|
|
||||||
break;
|
|
||||||
case 4:
|
|
||||||
colours[idx] = new Vector4(Pixels[layer, y, x, 0], Pixels[layer, y, x, 1], Pixels[layer, y, x, 2], Pixels[layer, y, x, 3]) / 255.0f;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return colours;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -5,8 +5,9 @@ namespace KeepersCompound.LGS;
|
||||||
|
|
||||||
public static class Utils
|
public static class Utils
|
||||||
{
|
{
|
||||||
public static Godot.Vector3 ToGodotVec3(this Vector3 vec, float inverseScale)
|
const float InverseScale = 4.0f;
|
||||||
|
public static Godot.Vector3 ToGodotVec3(this Vector3 vec)
|
||||||
{
|
{
|
||||||
return new Godot.Vector3(vec.Y, vec.Z, vec.X) / inverseScale;
|
return new Godot.Vector3(vec.Y, vec.Z, vec.X) / InverseScale;
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -103,12 +103,12 @@ public partial class Mission : Node3D
|
||||||
var poly = cell.Polys[i];
|
var poly = cell.Polys[i];
|
||||||
var meshIdxOffset = vertices.Count;
|
var meshIdxOffset = vertices.Count;
|
||||||
|
|
||||||
var normal = cell.Planes[poly.PlaneId].Normal.ToGodotVec3(4.0f);
|
var normal = cell.Planes[poly.PlaneId].Normal.ToGodotVec3();
|
||||||
var numPolyVertices = poly.VertexCount;
|
var numPolyVertices = poly.VertexCount;
|
||||||
for (var j = 0; j < numPolyVertices; j++)
|
for (var j = 0; j < numPolyVertices; j++)
|
||||||
{
|
{
|
||||||
var vertex = cell.Vertices[cell.Indices[cellIdxOffset + j]];
|
var vertex = cell.Vertices[cell.Indices[cellIdxOffset + j]];
|
||||||
vertices.Add(vertex.ToGodotVec3(4.0f));
|
vertices.Add(vertex.ToGodotVec3());
|
||||||
normals.Add(normal);
|
normals.Add(normal);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -137,15 +137,20 @@ public partial class Mission : Node3D
|
||||||
// Build lightmap
|
// Build lightmap
|
||||||
var lightmap = cell.Lightmaps[rect.Id];
|
var lightmap = cell.Lightmaps[rect.Id];
|
||||||
// TODO: Handle animlight layers
|
// TODO: Handle animlight layers
|
||||||
var colours = lightmap.AsRgba(0);
|
var layers = (uint)lightmap.Pixels.GetLength(0);
|
||||||
var height = lightmap.Pixels.GetLength(1);
|
var height = (uint)lightmap.Pixels.GetLength(1);
|
||||||
var width = lightmap.Pixels.GetLength(2);
|
var width = (uint)lightmap.Pixels.GetLength(2);
|
||||||
for (var y = 0; y < height; y++)
|
for (uint y = 0; y < height; y++)
|
||||||
{
|
{
|
||||||
for (var x = 0; x < width; x++)
|
for (uint x = 0; x < width; x++)
|
||||||
{
|
{
|
||||||
var rawColour = colours[x + y * width];
|
var rawColour = System.Numerics.Vector4.Zero;
|
||||||
image.SetPixel((int)rect.X + x, (int)rect.Y + y, new Color(rawColour.X, rawColour.Y, rawColour.Z, rawColour.W));
|
for (uint l = 0; l < layers; l++)
|
||||||
|
{
|
||||||
|
rawColour += lightmap.GetPixel(l, x, y);
|
||||||
|
}
|
||||||
|
var colour = new Color(MathF.Min(rawColour.X, 1.0f), MathF.Min(rawColour.Y, 1.0f), MathF.Min(rawColour.Z, 1.0f), MathF.Min(rawColour.W, 1.0f));
|
||||||
|
image.SetPixel((int)(rect.X + x), (int)(rect.Y + y), colour);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -211,7 +216,7 @@ public partial class Mission : Node3D
|
||||||
{
|
{
|
||||||
var light = new OmniLight3D
|
var light = new OmniLight3D
|
||||||
{
|
{
|
||||||
Position = cell.SphereCenter.ToGodotVec3(4.0f),
|
Position = cell.SphereCenter.ToGodotVec3(),
|
||||||
OmniRange = cell.SphereRadius * (r.NextSingle() + 1.0f) * 0.5f,
|
OmniRange = cell.SphereRadius * (r.NextSingle() + 1.0f) * 0.5f,
|
||||||
};
|
};
|
||||||
// cellNode.AddChild(light);
|
// cellNode.AddChild(light);
|
||||||
|
@ -230,8 +235,8 @@ public partial class Mission : Node3D
|
||||||
{
|
{
|
||||||
// TODO: This is slightly hardcoded for ND. Check other stuff at some point. Should be handled in LG side imo
|
// TODO: This is slightly hardcoded for ND. Check other stuff at some point. Should be handled in LG side imo
|
||||||
// TODO: This is a mess lol
|
// TODO: This is a mess lol
|
||||||
var texU = renderPoly.TextureVectors.Item1.ToGodotVec3(4.0f);
|
var texU = renderPoly.TextureVectors.Item1.ToGodotVec3();
|
||||||
var texV = renderPoly.TextureVectors.Item2.ToGodotVec3(4.0f);
|
var texV = renderPoly.TextureVectors.Item2.ToGodotVec3();
|
||||||
|
|
||||||
var uu = texU.Dot(texU);
|
var uu = texU.Dot(texU);
|
||||||
var vv = texV.Dot(texV);
|
var vv = texV.Dot(texV);
|
||||||
|
@ -243,7 +248,7 @@ public partial class Mission : Node3D
|
||||||
var baseV = renderPoly.TextureBases.Item2;
|
var baseV = renderPoly.TextureBases.Item2;
|
||||||
var lmUBase = lmUScale * (baseU + (0.5f - light.Bases.Item1) / 4.0f);
|
var lmUBase = lmUScale * (baseU + (0.5f - light.Bases.Item1) / 4.0f);
|
||||||
var lmVBase = lmVScale * (baseV + (0.5f - light.Bases.Item2) / 4.0f);
|
var lmVBase = lmVScale * (baseV + (0.5f - light.Bases.Item2) / 4.0f);
|
||||||
var anchor = cell.Vertices[cell.Indices[cellIdxOffset + 0]].ToGodotVec3(4.0f); // TODO: This probably shouldn't be hardcoded idx 0
|
var anchor = cell.Vertices[cell.Indices[cellIdxOffset + 0]].ToGodotVec3(); // TODO: This probably shouldn't be hardcoded idx 0
|
||||||
|
|
||||||
var uvIdxs = new int[poly.VertexCount];
|
var uvIdxs = new int[poly.VertexCount];
|
||||||
if (uv == 0.0)
|
if (uv == 0.0)
|
||||||
|
@ -254,7 +259,7 @@ public partial class Mission : Node3D
|
||||||
{
|
{
|
||||||
uvIdxs[i] = lightmapUvs.Count;
|
uvIdxs[i] = lightmapUvs.Count;
|
||||||
|
|
||||||
var v = cell.Vertices[cell.Indices[cellIdxOffset + i]].ToGodotVec3(4.0f);
|
var v = cell.Vertices[cell.Indices[cellIdxOffset + i]].ToGodotVec3();
|
||||||
var delta = new Vector3(v.X - anchor.X, v.Y - anchor.Y, v.Z - anchor.Z);
|
var delta = new Vector3(v.X - anchor.X, v.Y - anchor.Y, v.Z - anchor.Z);
|
||||||
var lmUV = new Vector2(delta.Dot(lmUVec) + lmUBase, delta.Dot(lmVVec) + lmVBase);
|
var lmUV = new Vector2(delta.Dot(lmUVec) + lmUBase, delta.Dot(lmVVec) + lmVBase);
|
||||||
lightmapUvs.Add(lmUV);
|
lightmapUvs.Add(lmUV);
|
||||||
|
@ -271,7 +276,7 @@ public partial class Mission : Node3D
|
||||||
{
|
{
|
||||||
uvIdxs[i] = lightmapUvs.Count;
|
uvIdxs[i] = lightmapUvs.Count;
|
||||||
|
|
||||||
var v = cell.Vertices[cell.Indices[cellIdxOffset + i]].ToGodotVec3(4.0f);
|
var v = cell.Vertices[cell.Indices[cellIdxOffset + i]].ToGodotVec3();
|
||||||
var delta = new Vector3(v.X - anchor.X, v.Y - anchor.Y, v.Z - anchor.Z);
|
var delta = new Vector3(v.X - anchor.X, v.Y - anchor.Y, v.Z - anchor.Z);
|
||||||
var du = delta.Dot(texU);
|
var du = delta.Dot(texU);
|
||||||
var dv = delta.Dot(texV);
|
var dv = delta.Dot(texV);
|
||||||
|
|
|
@ -4,6 +4,9 @@
|
||||||
[ext_resource type="Script" path="res://project/code/camera.gd" id="2_w5otl"]
|
[ext_resource type="Script" path="res://project/code/camera.gd" id="2_w5otl"]
|
||||||
|
|
||||||
[sub_resource type="Environment" id="Environment_oxkvl"]
|
[sub_resource type="Environment" id="Environment_oxkvl"]
|
||||||
|
ambient_light_source = 2
|
||||||
|
ambient_light_color = Color(1, 1, 1, 1)
|
||||||
|
ssao_enabled = true
|
||||||
|
|
||||||
[node name="Main" type="Node3D"]
|
[node name="Main" type="Node3D"]
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue