diff options
| author | tech kaczynski <tk@techkaczynski.dev> | 2026-11-02 16:20:50 +1000 |
|---|---|---|
| committer | tech kaczynski <tk@techkaczynski.dev> | 2026-11-02 16:20:50 +1000 |
| commit | e5560f69e11051a85c1d54780a59a4fbd83d8ed9 (patch) | |
| tree | d37903d38226066c993662229b9809d7a46df5a7 | |
| parent | c7185ab0bace46d63fde4a2af6dbc2f7a4c2dd87 (diff) | |
fixed foliage shader lighting bugmain
| -rw-r--r-- | editor.c | 38 | ||||
| -rw-r--r-- | ent.c | 89 | ||||
| -rw-r--r-- | fgsf_spec.txt | 11 | ||||
| -rw-r--r-- | res/sdr/mdl_foliage.vs | 11 |
4 files changed, 69 insertions, 80 deletions
@@ -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, @@ -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; |
