Compare commits

...

11 Commits

4 changed files with 63 additions and 25 deletions

View File

@ -132,7 +132,7 @@ public class WorldRep : IChunk
return new Vector4(raw1, raw1, raw1, 255) / 255.0f;
case 2:
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;
return new Vector4(raw2 & 31, (raw2 >> 5) & 31, (raw2 >> 10) & 31, 31) / 31.0f;
case 4:
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;
default:

View File

@ -1,5 +1,4 @@
using Godot;
using Godot.NativeInterop;
using KeepersCompound.LGS;
using KeepersCompound.LGS.Database;
using KeepersCompound.LGS.Database.Chunks;
@ -8,10 +7,10 @@ using RectpackSharp;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
namespace KeepersCompound;
[Tool]
public partial class Mission : Node3D
{
[Export(PropertyHint.GlobalFile, "*.mis")]
@ -65,6 +64,8 @@ public partial class Mission : Node3D
public void ClearMap()
{
_textures.Clear();
foreach (var node in GetChildren())
{
node.QueueFree();
@ -280,7 +281,6 @@ public partial class Mission : Node3D
var meshInstance = new MeshInstance3D
{
Mesh = arrMesh,
CastShadow = GeometryInstance3D.ShadowCastingSetting.On
};
return meshInstance;
}
@ -368,7 +368,37 @@ public partial class Mission : Node3D
private void LoadTextures(TxList textureList)
{
static string PathToKey(string baseDir, string path)
{
return path.TrimPrefix(baseDir).GetBaseName().ToLower();
}
// TODO: This has hardcoded .png extension and relies on you placing extracted and converted images in godot user directory
// Collect all the fm textures here to help with case sensitivity :)
// TODO: Only do this on case sensitive systems?
var baseDir = FileName.GetBaseDir();
var options = new EnumerationOptions { MatchCasing = MatchCasing.CaseInsensitive };
var dirPaths = Directory.GetDirectories(baseDir, "fam", options);
options.RecurseSubdirectories = true;
var texturePaths = new Dictionary<string, string>();
// Godot doesn't support runtime DDS :)
// TODO: Load DDS BMP PCX GIF CEL
string[] validExtensions = { "png", "tga" };
foreach (var dirPath in dirPaths)
{
foreach (var path in Directory.EnumerateFiles(dirPath, "*", options))
{
if (validExtensions.Contains(path.GetExtension().ToLower()))
{
// TODO: This only adds the first one found rather than the highest priority
texturePaths.TryAdd(PathToKey(baseDir, path), path);
}
}
}
// TODO: Use PathJoin
var count = textureList.ItemCount;
for (var i = 0; i < count; i++)
{
@ -384,18 +414,19 @@ public partial class Mission : Node3D
path += $"{textureList.Tokens[token - 1]}/";
}
path += item.Name + ".png"; // Hardcoded extension!
path += item.Name;
if (File.Exists(FileName + path))
if (texturePaths.TryGetValue(path.ToLower(), out var newPath))
{
path = FileName + path;
path = newPath;
}
else if (File.Exists(ProjectSettings.GlobalizePath($"user://textures{path}")))
else if (File.Exists(ProjectSettings.GlobalizePath($"user://textures{path}.png")))
{
path = ProjectSettings.GlobalizePath($"user://textures{path}");
path = ProjectSettings.GlobalizePath($"user://textures{path}.png");
}
else
{
GD.Print($"Failed to find texture: {path}");
path = "user://textures/jorge.png";
}

View File

@ -3,14 +3,33 @@
[sub_resource type="Shader" id="Shader_eumy4"]
code = "shader_type spatial;
render_mode blend_mix,depth_draw_opaque,cull_back,unshaded;
uniform sampler2D texture_albedo : source_color,filter_linear_mipmap,repeat_enable;
uniform sampler2D lightmap_albedo : source_color,filter_linear_mipmap,repeat_enable;
uniform sampler2D texture_albedo : filter_linear_mipmap_anisotropic,repeat_enable;
uniform sampler2D lightmap_albedo : filter_linear_mipmap_anisotropic,repeat_enable;
uniform float lightmap_modulation;
float srgb_to_linear_e(float input) {
float output;
if (input <= 0.04045) {
output = input / 12.92;
}
else {
output = pow((input + 0.055) / 1.055, 2.4);
}
return output;
}
vec3 srgb_to_linear(vec3 input) {
vec3 output;
output.r = srgb_to_linear_e(input.r);
output.g = srgb_to_linear_e(input.g);
output.b = srgb_to_linear_e(input.b);
return output;
}
void fragment() {
vec4 albedo_tex = texture(texture_albedo,UV);
vec4 lightmap_tex = texture(lightmap_albedo,UV2) * lightmap_modulation;
ALBEDO = albedo_tex.rgb * lightmap_tex.rgb;
ALBEDO = srgb_to_linear((albedo_tex * lightmap_tex).rgb);
}
"

View File

@ -1,14 +1,8 @@
[gd_scene load_steps=6 format=3 uid="uid://boxi211q3kx6c"]
[gd_scene load_steps=4 format=3 uid="uid://boxi211q3kx6c"]
[ext_resource type="Script" path="res://project/code/Mission.cs" id="1_xhqt7"]
[ext_resource type="Script" path="res://project/code/camera.gd" id="2_w5otl"]
[ext_resource type="PackedScene" uid="uid://cekg1xb5f0ux1" path="res://project/scenes/ui/mission_selector.tscn" id="3_hwfcj"]
[ext_resource type="Material" uid="uid://ck8h6dvojuegj" path="res://project/materials/base.tres" id="4_vxwmj"]
[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"]
@ -20,13 +14,7 @@ FileName = "/home/jarrod/Dev/thief/de-specs/test_data/rose-garden.mis"
[node name="Camera3D" type="Camera3D" parent="."]
script = ExtResource("2_w5otl")
[node name="WorldEnvironment" type="WorldEnvironment" parent="."]
environment = SubResource("Environment_oxkvl")
[node name="UI" type="CanvasLayer" parent="."]
[node name="MissionSelector" parent="UI" instance=ExtResource("3_hwfcj")]
unique_name_in_owner = true
[node name="MeshInstance3D" type="MeshInstance3D" parent="."]
material_overlay = ExtResource("4_vxwmj")