techkaczynski.dev / code

summaryrefslogtreecommitdiff
path: root/ent.c
diff options
context:
space:
mode:
Diffstat (limited to 'ent.c')
-rw-r--r--ent.c190
1 files changed, 153 insertions, 37 deletions
diff --git a/ent.c b/ent.c
index 055239e..0cec83e 100644
--- a/ent.c
+++ b/ent.c
@@ -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 = &copy.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;
}
}