Skip to content

Commit

Permalink
light rework
Browse files Browse the repository at this point in the history
  • Loading branch information
sevonj committed May 16, 2023
1 parent 664bd69 commit 344a799
Show file tree
Hide file tree
Showing 27 changed files with 1,579 additions and 1,148 deletions.
4 changes: 2 additions & 2 deletions .gitignore
Expand Up @@ -9,7 +9,7 @@ export_presets.cfg
# Mono-specific ignores
.mono/
data_*/

mono_crash*.json
# Volition
*.chunk_pc
*.g_chunk_pc
Expand All @@ -18,4 +18,4 @@ data_*/

# Project
build*/
build*.zip
build*.zip
22 changes: 16 additions & 6 deletions autoload/ChunkEditor.gd
Expand Up @@ -48,11 +48,21 @@ func _on_files_dropped(files, _screen):
func _on_main_ready():
ui = get_tree().root.get_node("main").get_node("ui")
if Globals.on_clear_chunkfile_to_load:
ChunkHandler.LoadChunk(Globals.on_clear_chunkfile_to_load)
_load_chunk(Globals.on_clear_chunkfile_to_load)
Globals.on_clear_chunkfile_to_load = null

# Load should always go through this
func _load_chunk(file):
ChunkHandler.LoadChunk(file)
for obj in Globals.loaded_cityobjects:
Globals.objects_by_uid[obj.uid] = obj
for obj in Globals.loaded_lights:
Globals.objects_by_uid[obj.uid] = obj


# Select object.
func _select(target: Spatial):
func _select(uid: String):
var target = Globals.objects_by_uid[uid]
_unselect()
gizmo.translation = target.translation

Expand All @@ -64,23 +74,21 @@ func _select(target: Spatial):
menu_selected_light._select(target)
menu_selected_light.show()
menu_selected_light._update_color(target.color)

"cityobjects":
if menu_selected_title:
menu_selected_title.text = "Selected type: cityobject"
if menu_selected_cityobj:
menu_selected_cityobj._select(target)
menu_selected_cityobj.show()

_:
push_error("unknown selected")
return

currently_selected = target
currently_selected._set_highlight(true)
menu_selector._on_select(target)
menu_selector._select(target.uid)

func _unselect():
menu_selector._unselect()
if currently_selected:
currently_selected._set_highlight(false)
currently_selected = null
Expand All @@ -90,6 +98,7 @@ func _unselect():
menu_selected_cityobj.hide()
if menu_selected_light:
menu_selected_light.hide()


func _focus():
if currently_selected:
Expand All @@ -99,6 +108,7 @@ func _save():
ChunkHandler.SaveChunk()

func _clear():
Globals._clear()
ChunkHandler.OnClearChunk()
is_chunk_loaded = false
cam = null
Expand Down
111 changes: 50 additions & 61 deletions autoload/ChunkHandler.cs
Expand Up @@ -5,7 +5,7 @@

public class ChunkHandler : Node
{
Sr2CpuChunkPc loadedChunk;
Sr2ChunkPc loadedChunk;
string loadedChunkName;
string loadedChunkPath;

Expand Down Expand Up @@ -54,7 +54,7 @@ public void LoadChunk(string input_filepath)
return;
}

Sr2CpuChunkPc chunk = Sr2CpuChunkPc.FromFile(cpu_chunk_filepath);
Sr2ChunkPc chunk = Sr2ChunkPc.FromFile(cpu_chunk_filepath);

GD.Print("Chunk parsed");
loadedChunk = chunk;
Expand All @@ -63,15 +63,16 @@ public void LoadChunk(string input_filepath)
ImportChunkToScene(loadedChunk, gpu_chunk_filepath);
}

void ImportChunkToScene(Sr2CpuChunkPc chunk, string gpu_chunk_filepath)
void ImportChunkToScene(Sr2ChunkPc chunk, string gpu_chunk_filepath)
{
Node chunkEditor = GetNode("/root/ChunkEditor");
Node globals = GetNode("/root/Globals");
Node world = GetNode("/root/main/chunk/cityobjects");
Node lights = GetNode("/root/main/chunk/lights");

chunkEditor.Set("is_chunk_loaded", true);

if ((bool)chunkEditor.Get("opt_cityobjects")){
if ((bool)chunkEditor.Get("opt_cityobjects"))
{
Sr2GpuChunkLoader gLoader = new Sr2GpuChunkLoader();
Mesh[] chunk_rendermodels = gLoader.LoadMeshesFromChunk(chunk, gpu_chunk_filepath);
GD.Print("meshes len: ", chunk_rendermodels.Length);
Expand All @@ -80,94 +81,82 @@ void ImportChunkToScene(Sr2CpuChunkPc chunk, string gpu_chunk_filepath)
Mesh mesh = chunk_rendermodels[i];
chunkEditor.Call("_add_chunk_rendermodel", mesh);
}

for (int i = 0; i < chunk.CityobjectCount; i++)
var loaded_cobjs = new Godot.Collections.Array<Node>();
for (int i = 0; i < chunk.NumCityobjects; i++)
{
Sr2CpuChunkPc.Cityobject cobj = chunk.Cityobjects[i];
Sr2ChunkPc.Cityobject cobj = chunk.Cityobjects[i];
int partId = (int)cobj.CityobjectPartId;
Sr2CpuChunkPc.CityobjectPart temp = chunk.CityobjectParts[partId];

Sr2ChunkPc.CityobjectPart temp = chunk.CityobjectParts[partId];
Spatial cityObjectNode = new Spatial();
cityObjectNode.SetScript(ResourceLoader.Load("res://scenes/editor/scripts/cityobject.gd"));
cityObjectNode.Set("uid", "cobj_" + i);
cityObjectNode.Translation = new Vector3(-temp.Pos.X, temp.Pos.Y, temp.Pos.Z);
cityObjectNode.Name = chunk.CityobjectNames[i];
cityObjectNode.Set("rendermodel_id", temp.RendermodelId);
cityObjectNode.Set("cityobjpart_id", partId);

world.AddChild(cityObjectNode);
loaded_cobjs.Add(cityObjectNode);
// Has to be done in this roundabout way, cannot set transform via csharp?
cityObjectNode.Call("_set_basis", new Basis(
new Vector3(temp.BasisX.X, -temp.BasisX.Y, -temp.BasisX.Z),
new Vector3(-temp.BasisY.X, temp.BasisY.Y, -temp.BasisY.Z),
new Vector3(-temp.BasisZ.X, -temp.BasisZ.Y, temp.BasisZ.Z)));
}
}
if ((bool)chunkEditor.Get("opt_lights")){
for (int i = 0; i < chunk.LightCount; i++)
globals.Set("loaded_cityobjects", loaded_cobjs);
}
if ((bool)chunkEditor.Get("opt_lights"))
{
var loaded_lights = new Godot.Collections.Array<Node>();
for (int i = 0; i < chunk.NumLights.Result; i++)
{
if (chunk.LightCount == 1212891981) break; // Duct tape solution for MCKH (this means chunk has no lights)

Sr2CpuChunkPc.Light light = chunk.LightSections.Lights[i];
string name = chunk.LightSections.LightNames[i];
Vector3 pos = new Vector3(-light.Pos.X, light.Pos.Y, light.Pos.Z);
Sr2ChunkPc.LightDataType light = chunk.LightData[i];
string name = chunk.LightNames[i];
Vector3 pos = new Vector3(-light.Position.X, light.Position.Y, light.Position.Z);
Color col = new Color(light.R, light.G, light.B);

Spatial lightNode = new Spatial();
lightNode.Name = name;
lightNode.SetScript(ResourceLoader.Load("res://scenes/editor/scripts/lightsource.gd"));

lightNode.Set("uid", "light_" + i);
Godot.Collections.Array flags = new Godot.Collections.Array();
flags.Add(light.Flags.Bit00);
flags.Add(light.Flags.Bit01);
flags.Add(light.Flags.Bit02);
flags.Add(light.Flags.Bit03);
flags.Add(light.Flags.Bit04);
flags.Add(light.Flags.Bit05);
flags.Add(light.Flags.Bit06);
flags.Add(light.Flags.Bit07);
flags.Add(light.Flags.Bit08);
flags.Add(light.Flags.Bit09);
flags.Add(light.Flags.Bit0a);
flags.Add(light.Flags.Bit0b);
flags.Add(light.Flags.Bit0c);
flags.Add(light.Flags.Bit0d);
flags.Add(light.Flags.Bit0e);
flags.Add(light.Flags.Bit0f);
flags.Add(light.Flags.Bit10);
flags.Add(light.Flags.Bit11);
flags.Add(light.Flags.CastShadowsOnWorld);
flags.Add(light.Flags.CastShadowsOnPeople);
flags.Add(light.Flags.Bit14);
flags.Add(light.Flags.Bit15);
flags.Add(light.Flags.Bit16);
flags.Add(light.Flags.Bit17);
flags.Add(light.Flags.Bit18);
flags.Add(light.Flags.Bit19);
flags.Add(light.Flags.Bit1a);
flags.Add(light.Flags.Bit1b);
flags.Add(light.Flags.Bit1c);
flags.Add(light.Flags.Bit1d);
flags.Add(light.Flags.Bit1e);
flags.Add(light.Flags.Bit1f);

flags.Add(light.Bitflag0);
flags.Add(light.Bitflag1);
flags.Add(light.Bitflag2);
flags.Add(light.Bitflag3);
flags.Add(light.Bitflag4);
flags.Add(light.Bitflag8);
flags.Add(light.Bitflag10);
flags.Add(light.ShadowCharacter);
flags.Add(light.ShadowLevel);
flags.Add(light.LightCharacter);
flags.Add(light.LightLevel);
flags.Add(light.Bitflag22);
lightNode.Set("flags", flags);

lightNode.Set("color", col);

lightNode.Set("unk10", light.Unk10);
lightNode.Translation = pos;
lightNode.Set("type", light.Type);
lightNode.Set("radius_inner", light.RadiusInner);
lightNode.Set("radius_outer", light.RadiusOuter);
lightNode.Set("render_dist", light.RenderDist);


lightNode.Set("parent", light.ParentCityobject);
lights.AddChild(lightNode);
loaded_lights.Add(lightNode);
// Has to be done in this roundabout way, cannot set transform via csharp?
lightNode.Call("_set_basis", new Basis(
new Vector3(light.BasisX.X, -light.BasisX.Y, -light.BasisX.Z),
new Vector3(-light.BasisY.X, light.BasisY.Y, -light.BasisY.Z),
new Vector3(-light.BasisZ.X, -light.BasisZ.Y, light.BasisZ.Z)));

}
}

globals.Set("loaded_lights", loaded_lights);
}
Spatial camera = (Spatial)GetNode("/root/main/editor/cameraman");
camera.Translation = new Vector3(
-loadedChunk.CityobjectParts[0].Pos.X,
loadedChunk.CityobjectParts[0].Pos.Y,
loadedChunk.CityobjectParts[0].Pos.Z
);

chunkEditor.Call("_update");
}

Expand Down

0 comments on commit 344a799

Please sign in to comment.