techkaczynski.dev / code

summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortech kaczynski <tk@techkaczynski.dev>2026-11-02 16:20:50 +1000
committertech kaczynski <tk@techkaczynski.dev>2026-11-02 16:20:50 +1000
commite5560f69e11051a85c1d54780a59a4fbd83d8ed9 (patch)
treed37903d38226066c993662229b9809d7a46df5a7
parentc7185ab0bace46d63fde4a2af6dbc2f7a4c2dd87 (diff)
fixed foliage shader lighting bugmain
-rw-r--r--editor.c38
-rw-r--r--ent.c89
-rw-r--r--fgsf_spec.txt11
-rw-r--r--res/sdr/mdl_foliage.vs11
4 files changed, 69 insertions, 80 deletions
diff --git a/editor.c b/editor.c
index 0a61ad3..2591cc1 100644
--- a/editor.c
+++ b/editor.c
@@ -67,6 +67,7 @@ typedef enum {
ED_CMD_NONE = -1,
ED_CMD_TIME,
ED_CMD_SPAWN_PREFAB,
+ ED_CMD_SPAWN_MODEL,
ED_CMD_CNT,
} EditorCommand;
@@ -4756,6 +4757,7 @@ panel_commands(Rect bounds, bool input) {
static const cstr names[ED_CMD_CNT] = {
[ED_CMD_TIME] = "Time of day",
[ED_CMD_SPAWN_PREFAB] = "Spawn prefab",
+ [ED_CMD_SPAWN_MODEL] = "Spawn model entity",
};
GuiPanel(bounds, "Command Menu");
@@ -4938,6 +4940,11 @@ panel_draw(EditorPanelContainer container) {
ed.focus_captured = false;
break;
+ case ED_CMD_SPAWN_MODEL:
+ asset_picker_open(ASSET_TAG_MODEL,
+ ASSET_PICK_MDL_ENT_CREATE);
+ break;
+
default:
break;
}
@@ -4962,9 +4969,36 @@ panel_draw(EditorPanelContainer container) {
}
break;
- case ASSET_PICK_MDL_ENT_CREATE:
- /* TODO: */
+ case ASSET_PICK_MDL_ENT_CREATE: {
+ Asset *asset = asset_get(key);
+ EditorAction action =
+ action_begin(ED_ACTION_CREATE, false);
+
+ u64 id = entity_id_from_pid(action.item[0].pid);
+ Entity *ent = entity_get(id);
+
+ ent->tr.pos = main_cam.cam.target;
+ ent->mdl = (ModelCmp){
+ .key = strdup(key),
+ .mdl = &asset->mdl,
+ .has = true,
+ .draw = true,
+ };
+
+ if (ent->name) {
+ free(ent->name);
+ }
+ ent->name = strdup(GetFileNameWithoutExt(key));
+
+ ed.sel_cnt = 1;
+ ed.sel_point = ent->tr.pos;
+ ed.sel_rot = ent->tr.rot;
+
+ action_commit(&action);
+ asset_picker_close();
+ ed.interact = ED_INTERACT_MOVE;
break;
+ }
case ASSET_PICK_MAT_TEX:
editor_set_material(key, asset_picker.mat_idx,
diff --git a/ent.c b/ent.c
index 0cec83e..2f61aa7 100644
--- a/ent.c
+++ b/ent.c
@@ -327,17 +327,17 @@ entity_draw_mdl(u64 id) {
};
/* Preserve DrawModel's GPU skinning support. */
- int loc = SHADER_LOC_MATRIX_BONETRANSFORMS;
- if (material.shader.locs != NULL &&
- material.shader.locs[loc] != -1 &&
- mdl->boneMatrices != NULL) {
- rlEnableShader(material.shader.id);
- rlSetUniformMatrices(
- material.shader.locs[loc],
- mdl->boneMatrices,
- mdl->skeleton.boneCount
- );
- }
+ // int loc = SHADER_LOC_MATRIX_BONETRANSFORMS;
+ // if (material.shader.locs != NULL &&
+ // material.shader.locs[loc] != -1 &&
+ // mdl->boneMatrices != NULL) {
+ // rlEnableShader(material.shader.id);
+ // rlSetUniformMatrices(
+ // material.shader.locs[loc],
+ // mdl->boneMatrices,
+ // mdl->skeleton.boneCount
+ // );
+ // }
bool nocull =
strcmp(shader_key, "alpha_cutoff_nocull") == 0 ||
@@ -357,73 +357,6 @@ entity_draw_mdl(u64 id) {
}
}
-// static void
-// entity_draw_mdl(u64 id) {
-// Entity *ent = entity_get(id);
-// ModelCmp *model = &ent->mdl;
-
-// if (!model->mdl) {
-// Asset *asset = asset_get(model->key);
-// if (!asset) {
-// return;
-// }
-// model->mdl = &asset->mdl;
-// }
-
-// Model mdl = *model->mdl;
-// mdl.transform = entity_world_matrix(id);
-
-// Color tint = ent->ed.selected && ed.mode == ED_MODE_SCENE ?
-// (Color){100, 100, 100, 255} : BLACK;
-
-// u32 count = MIN(model->mat_cnt, (u32)mdl.materialCount);
-
-// if (!count) {
-// DrawModel(mdl, (Vec3){0}, 1, tint);
-// return;
-// }
-
-// struct {
-// MaterialMap albedo;
-// Shader shader;
-// } saved[count];
-
-// for (u32 i = 0; i < count; ++i) {
-// Material *material = &mdl.materials[i];
-// MaterialMap *albedo;
-// albedo = &material->maps[MATERIAL_MAP_ALBEDO];
-
-// saved[i].albedo = *albedo;
-// saved[i].shader = material->shader;
-
-// MaterialOverride *override = &model->materials[i];
-
-// if (override->tex_key) {
-// Asset *asset = asset_get(override->tex_key);
-// if (asset) {
-// albedo->texture = asset->tex;
-// }
-// }
-
-// if (override->shader_key) {
-// FunShader *shader;
-// shader = shader_get(override->shader_key);
-
-// if (shader) {
-// material->shader = shader->sdr;
-// }
-// }
-// }
-
-// DrawModel(mdl, (Vec3){0}, 1, tint);
-
-// for (u32 i = 0; i < count; ++i) {
-// Material *material = &mdl.materials[i];
-// material->maps[MATERIAL_MAP_ALBEDO] = saved[i].albedo;
-// material->shader = saved[i].shader;
-// }
-// }
-
void
entity_system_update(void) {
entity_process_delete_queue();
diff --git a/fgsf_spec.txt b/fgsf_spec.txt
index 3e4395d..6978afa 100644
--- a/fgsf_spec.txt
+++ b/fgsf_spec.txt
@@ -22,6 +22,7 @@ CHUNK LABELS
- TRFM
- MODL
- MTEX
+ - MUVS
- MSHD
- PHYS
@@ -31,6 +32,7 @@ DATA RECORDS
- transform component record
- model component record
- texture override record
+ - texcoord override record
- shader override record
- physics component record
- physics body record
@@ -94,6 +96,15 @@ MTEX
u32 key_len
char[key_len] texture_key
+MUVS
+ u32 material_uv_cnt
+
+ repeat material_uv_cnt:
+ u64 entity_pid
+ u32 material_idx
+ f32[2] uv_scale
+ f32[2] uv_offset
+
MSHD
u32 shader_override_cnt
diff --git a/res/sdr/mdl_foliage.vs b/res/sdr/mdl_foliage.vs
index db9d7b6..1198009 100644
--- a/res/sdr/mdl_foliage.vs
+++ b/res/sdr/mdl_foliage.vs
@@ -28,9 +28,20 @@ out vec3 frag_lighting;
void main() {
vec3 world_normal = normalize((matNormal * vec4(vertexNormal, 0.0)).xyz);
+
+ // float sun_diffuse = abs(dot(world_normal, sun_direction));
+ // float moon_diffuse = abs(dot(world_normal, moon_direction));
+
+ // for stronger shading, use 0.3 + 0.7 * abs(...)
+ // float sun_diffuse = 0.5 + 0.5 * abs(dot(world_normal, sun_direction));
+ // float moon_diffuse = 0.5 + 0.5 * abs(dot(world_normal, moon_direction));
float sun_diffuse = abs(dot(world_normal, sun_direction));
float moon_diffuse = abs(dot(world_normal, moon_direction));
+ // hack to fix lighting at midday
+ float midday = smoothstep(0.7, 1.0, sun_direction.y);
+ sun_diffuse = mix(sun_diffuse, 0.65, midday);
+
vec3 ambient_light = ambient_colour * ambient_intensity;
vec3 sun_light = sun_colour * sun_intensity * sun_diffuse;
vec3 moon_light = moon_colour * moon_intensity * moon_diffuse;