Fix T98091: EEVEE: Volume: Crash caused by non-present grid
This was caused by the `copy_m4_m4` trying to copy the `object_to_texture` from `drw_grid` which was `nullptr`. Fixing this also exposed that rendering such volumes (without any valid grid attributes) is not supported and we should follow what Cycles does. Differential Revision: https://developer.blender.org/D15147
This commit is contained in:
@@ -91,7 +91,7 @@ void DRW_curves_free(void);
|
||||
/**
|
||||
* Add attributes bindings of volume grids to an existing shading group.
|
||||
* No draw call is added so the caller can decide how to use the data.
|
||||
* \return nullptr if there is something to draw.
|
||||
* \return nullptr if there is nothing to draw.
|
||||
*/
|
||||
struct DRWShadingGroup *DRW_shgroup_volume_create_sub(struct Scene *scene,
|
||||
struct Object *ob,
|
||||
|
||||
@@ -129,12 +129,14 @@ static DRWShadingGroup *drw_volume_object_grids_init(Object *ob,
|
||||
volume_infos.temperature_bias = 0.0f;
|
||||
|
||||
/* Bind volume grid textures. */
|
||||
int grid_id = 0;
|
||||
int grid_id = 0, grids_len = 0;
|
||||
LISTBASE_FOREACH (GPUMaterialAttribute *, attr, attrs) {
|
||||
const VolumeGrid *volume_grid = BKE_volume_grid_find_for_read(volume, attr->name);
|
||||
const DRWVolumeGrid *drw_grid = (volume_grid) ?
|
||||
DRW_volume_batch_cache_get_grid(volume, volume_grid) :
|
||||
nullptr;
|
||||
/* Count number of valid attributes. */
|
||||
grids_len += int(volume_grid != nullptr);
|
||||
|
||||
/* Handle 3 cases here:
|
||||
* - Grid exists and texture was loaded -> use texture.
|
||||
@@ -145,7 +147,13 @@ static DRWShadingGroup *drw_volume_object_grids_init(Object *ob,
|
||||
grid_default_texture(attr->default_value);
|
||||
DRW_shgroup_uniform_texture(grp, attr->input_name, grid_tex);
|
||||
|
||||
copy_m4_m4(volume_infos.grids_xform[grid_id++].ptr(), drw_grid->object_to_texture);
|
||||
copy_m4_m4(volume_infos.grids_xform[grid_id++].ptr(),
|
||||
(drw_grid) ? drw_grid->object_to_texture : g_data.dummy_grid_mat);
|
||||
}
|
||||
/* Render nothing if there is no attribute for the shader to render.
|
||||
* This also avoids an assert caused by the bounding box being zero in size. */
|
||||
if (grids_len == 0) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
volume_infos.push_update();
|
||||
|
||||
Reference in New Issue
Block a user