vk: brush: assign white texture for kRenderTransColor
kRenderTransColor mode strips geometry of its texture and makes it solid color. Previously we were noticing this rendermode late, and failed to update the textures. Now we depend on reading this rendermode from map entities, and pre-assigning correct (white) textures on load. Assumes that rendermode doesn't change at runtime for brush models. Fixes #528
This commit is contained in:
parent
b740e0848d
commit
6bfa4c90fa
|
@ -730,16 +730,8 @@ void VK_BrushModelDraw( const cl_entity_t *ent, int render_mode, float blend, co
|
|||
if (bmodel->render_model.num_geometries == 0)
|
||||
return;
|
||||
|
||||
// TransColor means ignore textures and draw just color
|
||||
if (render_mode == kRenderTransColor) {
|
||||
// TODO cache previous render_mode.
|
||||
// TODO also it will break switching render type from TransColor to anyting else -- textures will be stuck at white
|
||||
for (int i = 0; i < bmodel->render_model.num_geometries; ++i) {
|
||||
vk_render_geometry_t *geom = bmodel->render_model.geometries + i;
|
||||
geom->material = R_VkMaterialGetForTexture(tglob.whiteTexture);
|
||||
geom->ye_olde_texture = tglob.whiteTexture;
|
||||
}
|
||||
} else {
|
||||
// Animate textures
|
||||
{
|
||||
APROF_SCOPE_DECLARE_BEGIN(brush_update_textures, "brush: update animated textures");
|
||||
// Update animated textures
|
||||
int updated_textures_count = 0;
|
||||
|
@ -1121,6 +1113,8 @@ static qboolean fillBrushSurfaces(fill_geometries_args_t args) {
|
|||
return false;
|
||||
}
|
||||
|
||||
model_geometry->ye_olde_texture = orig_tex_id;
|
||||
|
||||
qboolean material_assigned = false;
|
||||
if (entity_patch) {
|
||||
for (int i = 0; i < entity_patch->matmap_count; ++i) {
|
||||
|
@ -1132,8 +1126,13 @@ static qboolean fillBrushSurfaces(fill_geometries_args_t args) {
|
|||
}
|
||||
|
||||
if (!material_assigned && entity_patch->rendermode > 0) {
|
||||
model_geometry->material = R_VkMaterialGetEx(tex_id, entity_patch->rendermode);
|
||||
material_assigned = true;
|
||||
material_assigned = R_VkMaterialGetEx(tex_id, entity_patch->rendermode, &model_geometry->material);
|
||||
if (!material_assigned && entity_patch->rendermode == kRenderTransColor) {
|
||||
// TransColor means ignore textures and draw just color
|
||||
model_geometry->material = R_VkMaterialGetForTexture(tglob.whiteTexture);
|
||||
model_geometry->ye_olde_texture = tglob.whiteTexture;
|
||||
material_assigned = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1145,7 +1144,6 @@ static qboolean fillBrushSurfaces(fill_geometries_args_t args) {
|
|||
VectorClear(model_geometry->emissive);
|
||||
|
||||
model_geometry->surf_deprecate = surf;
|
||||
model_geometry->ye_olde_texture = orig_tex_id;
|
||||
|
||||
model_geometry->vertex_offset = args.base_vertex_offset;
|
||||
model_geometry->max_vertex = vertex_offset + surf->numedges;
|
||||
|
|
|
@ -361,18 +361,23 @@ r_vk_material_t R_VkMaterialGetForRef( r_vk_material_ref_t ref ) {
|
|||
return g_materials.materials[ref.index];
|
||||
}
|
||||
|
||||
r_vk_material_t R_VkMaterialGetEx( int tex_id, int rendermode ) {
|
||||
qboolean R_VkMaterialGetEx( int tex_id, int rendermode, r_vk_material_t *out_material ) {
|
||||
DEBUG("Getting material for tex_id=%d rendermode=%d", tex_id, rendermode);
|
||||
|
||||
if (rendermode > 0) {
|
||||
ASSERT(rendermode < COUNTOF(g_materials.rendermode));
|
||||
const r_vk_material_per_mode_t* const mode = &g_materials.rendermode[rendermode];
|
||||
for (int i = 0; i < mode->count; ++i) {
|
||||
if (mode->materials[i].tex_id == tex_id)
|
||||
return mode->materials[i].mat;
|
||||
if (rendermode == 0) {
|
||||
WARN("rendermode==0: fallback to regular tex_id=%d", tex_id);
|
||||
*out_material = R_VkMaterialGetForTexture(tex_id);
|
||||
return true;
|
||||
}
|
||||
|
||||
ASSERT(rendermode < COUNTOF(g_materials.rendermode));
|
||||
const r_vk_material_per_mode_t* const mode = &g_materials.rendermode[rendermode];
|
||||
for (int i = 0; i < mode->count; ++i) {
|
||||
if (mode->materials[i].tex_id == tex_id) {
|
||||
*out_material = mode->materials[i].mat;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
DEBUG("Fallback to regular tex_id=%d", tex_id);
|
||||
return R_VkMaterialGetForTexture(tex_id);
|
||||
return false;
|
||||
}
|
||||
|
|
|
@ -28,7 +28,7 @@ void R_VkMaterialsLoadForModel( const struct model_s* mod );
|
|||
|
||||
r_vk_material_t R_VkMaterialGetForTexture( int tex_id );
|
||||
|
||||
r_vk_material_t R_VkMaterialGetEx( int tex_id, int rendermode );
|
||||
qboolean R_VkMaterialGetEx( int tex_id, int rendermode, r_vk_material_t *out_material );
|
||||
|
||||
r_vk_material_ref_t R_VkMaterialGetForName( const char *name );
|
||||
r_vk_material_t R_VkMaterialGetForRef( r_vk_material_ref_t ref );
|
||||
|
|
Loading…
Reference in New Issue