diff options
| author | tech kaczynski <tk@techkaczynski.dev> | 2026-11-02 03:23:17 +1000 |
|---|---|---|
| committer | tech kaczynski <tk@techkaczynski.dev> | 2026-11-02 03:23:17 +1000 |
| commit | b47b2e022bfa74cd94d3296aae6bd34ca4afff02 (patch) | |
| tree | 5fa05b743289e1ab877a85c1bf1874be2736f04f /ent.c | |
| parent | 040a896cb98963c74916c0b833efa9df2ef965e3 (diff) | |
new shaders for foliage, new material settings, added lots of assets.
Diffstat (limited to 'ent.c')
| -rw-r--r-- | ent.c | 190 |
1 files changed, 153 insertions, 37 deletions
@@ -260,60 +260,170 @@ entity_draw_mdl(u64 id) { model->mdl = &asset->mdl; } - Model mdl = *model->mdl; - mdl.transform = entity_world_matrix(id); + Model *mdl = model->mdl; + Matrix transform = entity_world_matrix(id); Color tint = ent->ed.selected && ed.mode == ED_MODE_SCENE ? - (Color){100, 100, 100, 255} : BLACK; + (Color){100, 100, 100, 255} : BLACK; - u32 count = MIN(model->mat_cnt, (u32)mdl.materialCount); + for (int i = 0; i < mdl->meshCount; ++i) { + u32 mat_idx = mdl->meshMaterial[i]; + Material material = mdl->materials[mat_idx]; - if (!count) { - DrawModel(mdl, (Vec3){0}, 1, tint); - return; - } + MaterialMap *albedo = &material.maps[MATERIAL_MAP_ALBEDO]; + MaterialMap saved_albedo = *albedo; - struct { - MaterialMap albedo; - Shader shader; - } saved[count]; + Vec2 uv_scale = {1, 1}; + Vec2 uv_offset = {0, 0}; + cstr shader_key = "default"; - for (u32 i = 0; i < count; ++i) { - Material *material = &mdl.materials[i]; - MaterialMap *albedo; - albedo = &material->maps[MATERIAL_MAP_ALBEDO]; + if (mat_idx < model->mat_cnt) { + const MaterialOverride *override; + override = &model->materials[mat_idx]; - saved[i].albedo = *albedo; - saved[i].shader = material->shader; + uv_scale = override->uv_scale; + uv_offset = override->uv_offset; - MaterialOverride *override = &model->materials[i]; + if (override->tex_key) { + Asset *asset = asset_get(override->tex_key); + if (asset) { + albedo->texture = asset->tex; + } + } - if (override->tex_key) { - Asset *asset = asset_get(override->tex_key); - if (asset) { - albedo->texture = asset->tex; + if (override->shader_key) { + shader_key = override->shader_key; } } - if (override->shader_key) { - FunShader *shader; - shader = shader_get(override->shader_key); + FunShader *shader = shader_get(shader_key); + if (!shader) { + *albedo = saved_albedo; + continue; + } + material.shader = shader->sdr; + + SetShaderValue( + material.shader, + fun_shader_uniform(shader_key, "uv_tiling"), + &uv_scale, + SHADER_UNIFORM_VEC2 + ); + + SetShaderValue( + material.shader, + fun_shader_uniform(shader_key, "uv_offset"), + &uv_offset, + SHADER_UNIFORM_VEC2 + ); + + /* Match DrawModel's material tint multiplication. */ + Color colour = albedo->color; + albedo->color = (Color){ + (u8)((int)colour.r * tint.r / 255), + (u8)((int)colour.g * tint.g / 255), + (u8)((int)colour.b * tint.b / 255), + (u8)((int)colour.a * tint.a / 255), + }; - if (shader) { - material->shader = shader->sdr; - } + /* 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 + ); } - } - DrawModel(mdl, (Vec3){0}, 1, tint); + bool nocull = + strcmp(shader_key, "alpha_cutoff_nocull") == 0 || + strcmp(shader_key, "foliage") == 0; - 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; + if (nocull) { + rlDisableBackfaceCulling(); + } + + DrawMesh(mdl->meshes[i], material, transform); + + if (nocull) { + rlEnableBackfaceCulling(); + } + + *albedo = saved_albedo; } } +// 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(); @@ -453,9 +563,15 @@ entity_model_copy(const ModelCmp *src) { MaterialOverride *to = ©.materials[i]; to->tex_key = from->tex_key ? - strdup(from->tex_key) : NULL; + strdup(from->tex_key) : + NULL; + to->shader_key = from->shader_key ? - strdup(from->shader_key) : NULL; + strdup(from->shader_key) : + NULL; + + to->uv_scale = from->uv_scale; + to->uv_offset = from->uv_offset; } } |
