Changeset View
Changeset View
Standalone View
Standalone View
source/blender/draw/engines/eevee/eevee_volumes.c
| Show First 20 Lines • Show All 345 Lines • ▼ Show 20 Lines | void EEVEE_volumes_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata) | ||||
| DRW_PASS_CREATE(psl->volumetric_objects_ps, DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND_ADD); | DRW_PASS_CREATE(psl->volumetric_objects_ps, DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND_ADD); | ||||
| /* World Volumetric */ | /* World Volumetric */ | ||||
| struct World *wo = scene->world; | struct World *wo = scene->world; | ||||
| if (wo != NULL && wo->use_nodes && wo->nodetree && | if (wo != NULL && wo->use_nodes && wo->nodetree && | ||||
| !LOOK_DEV_STUDIO_LIGHT_ENABLED(draw_ctx->v3d)) { | !LOOK_DEV_STUDIO_LIGHT_ENABLED(draw_ctx->v3d)) { | ||||
| struct GPUMaterial *mat = EEVEE_material_world_volume_get(scene, wo); | struct GPUMaterial *mat = EEVEE_material_world_volume_get(scene, wo); | ||||
| if (GPU_material_use_domain_volume(mat)) { | if (GPU_material_has_volume_output(mat)) { | ||||
| grp = DRW_shgroup_material_create(mat, psl->volumetric_world_ps); | grp = DRW_shgroup_material_create(mat, psl->volumetric_world_ps); | ||||
| } | } | ||||
| if (grp) { | if (grp) { | ||||
| DRW_shgroup_uniform_block(grp, "common_block", sldata->common_ubo); | DRW_shgroup_uniform_block(grp, "common_block", sldata->common_ubo); | ||||
| /* TODO (fclem): remove those (need to clean the GLSL files). */ | /* TODO (fclem): remove those (need to clean the GLSL files). */ | ||||
| DRW_shgroup_uniform_block(grp, "grid_block", sldata->grid_ubo); | DRW_shgroup_uniform_block(grp, "grid_block", sldata->grid_ubo); | ||||
| DRW_shgroup_uniform_block(grp, "probe_block", sldata->probe_ubo); | DRW_shgroup_uniform_block(grp, "probe_block", sldata->probe_ubo); | ||||
| DRW_shgroup_uniform_block(grp, "planar_block", sldata->planar_ubo); | DRW_shgroup_uniform_block(grp, "planar_block", sldata->planar_ubo); | ||||
| DRW_shgroup_uniform_block(grp, "light_block", sldata->light_ubo); | DRW_shgroup_uniform_block(grp, "light_block", sldata->light_ubo); | ||||
| DRW_shgroup_uniform_block(grp, "shadow_block", sldata->shadow_ubo); | DRW_shgroup_uniform_block(grp, "shadow_block", sldata->shadow_ubo); | ||||
| DRW_shgroup_uniform_block( | DRW_shgroup_uniform_block( | ||||
| grp, "renderpass_block", EEVEE_material_default_render_pass_ubo_get(sldata)); | grp, "renderpass_block", EEVEE_material_default_render_pass_ubo_get(sldata)); | ||||
| /* Fix principle volumetric not working with world materials. */ | /* Fix principle volumetric not working with world materials. */ | ||||
| DRW_shgroup_uniform_texture(grp, "sampdensity", e_data.dummy_density); | ListBase gpu_grids = GPU_material_volume_grids(mat); | ||||
| DRW_shgroup_uniform_texture(grp, "sampcolor", e_data.dummy_density); | for (GPUMaterialVolumeGrid *gpu_grid = gpu_grids.first; gpu_grid; | ||||
| DRW_shgroup_uniform_texture(grp, "sampflame", e_data.dummy_flame); | gpu_grid = gpu_grid->next) { | ||||
| DRW_shgroup_uniform_vec2_copy(grp, "unftemperature", (float[2]){0.0f, 1.0f}); | DRW_shgroup_uniform_texture(grp, gpu_grid->sampler_name, e_data.dummy_density); | ||||
| } | |||||
| DRW_shgroup_call_procedural_triangles(grp, NULL, common_data->vol_tex_size[2]); | DRW_shgroup_call_procedural_triangles(grp, NULL, common_data->vol_tex_size[2]); | ||||
| effects->enabled_effects |= (EFFECT_VOLUMETRIC | EFFECT_POST_BUFFER); | effects->enabled_effects |= (EFFECT_VOLUMETRIC | EFFECT_POST_BUFFER); | ||||
| } | } | ||||
| } | } | ||||
| if (grp == NULL) { | if (grp == NULL) { | ||||
| ▲ Show 20 Lines • Show All 59 Lines • ▼ Show 20 Lines | void EEVEE_volumes_cache_object_add(EEVEE_ViewLayerData *sldata, | ||||
| DRW_shgroup_uniform_block(grp, "grid_block", sldata->grid_ubo); | DRW_shgroup_uniform_block(grp, "grid_block", sldata->grid_ubo); | ||||
| DRW_shgroup_uniform_block( | DRW_shgroup_uniform_block( | ||||
| grp, "renderpass_block", EEVEE_material_default_render_pass_ubo_get(sldata)); | grp, "renderpass_block", EEVEE_material_default_render_pass_ubo_get(sldata)); | ||||
| DRW_shgroup_uniform_block(grp, "common_block", sldata->common_ubo); | DRW_shgroup_uniform_block(grp, "common_block", sldata->common_ubo); | ||||
| DRW_shgroup_uniform_vec3(grp, "volumeOrcoLoc", texcoloc, 1); | DRW_shgroup_uniform_vec3(grp, "volumeOrcoLoc", texcoloc, 1); | ||||
| DRW_shgroup_uniform_vec3(grp, "volumeOrcoSize", texcosize, 1); | DRW_shgroup_uniform_vec3(grp, "volumeOrcoSize", texcosize, 1); | ||||
| ListBase gpu_grids = GPU_material_volume_grids(mat); | |||||
| /* Smoke Simulation */ | /* Smoke Simulation */ | ||||
| if (((ob->base_flag & BASE_FROM_DUPLI) == 0) && | if (((ob->base_flag & BASE_FROM_DUPLI) == 0) && | ||||
| (md = modifiers_findByType(ob, eModifierType_Fluid)) && | (md = modifiers_findByType(ob, eModifierType_Fluid)) && | ||||
| (modifier_isEnabled(scene, md, eModifierMode_Realtime)) && | (modifier_isEnabled(scene, md, eModifierMode_Realtime)) && | ||||
| ((FluidModifierData *)md)->domain != NULL) { | ((FluidModifierData *)md)->domain != NULL) { | ||||
| FluidModifierData *mmd = (FluidModifierData *)md; | FluidModifierData *mmd = (FluidModifierData *)md; | ||||
| FluidDomainSettings *mds = mmd->domain; | FluidDomainSettings *mds = mmd->domain; | ||||
| Show All 15 Lines | if (mds->fluid && (mds->type == FLUID_DOMAIN_TYPE_GAS) /* && show_smoke */) { | ||||
| GPU_create_smoke(mmd, 0); | GPU_create_smoke(mmd, 0); | ||||
| } | } | ||||
| else if (mds->flags & FLUID_DOMAIN_USE_NOISE) { | else if (mds->flags & FLUID_DOMAIN_USE_NOISE) { | ||||
| GPU_create_smoke(mmd, 1); | GPU_create_smoke(mmd, 1); | ||||
| } | } | ||||
| BLI_addtail(&e_data.smoke_domains, BLI_genericNodeN(mmd)); | BLI_addtail(&e_data.smoke_domains, BLI_genericNodeN(mmd)); | ||||
| } | } | ||||
| for (GPUMaterialVolumeGrid *gpu_grid = gpu_grids.first; gpu_grid; gpu_grid = gpu_grid->next) { | |||||
| if (STREQ(gpu_grid->name, "density")) { | |||||
| DRW_shgroup_uniform_texture_ref(grp, | |||||
| gpu_grid->sampler_name, | |||||
| mds->tex_density ? &mds->tex_density : | |||||
| &e_data.dummy_density); | |||||
| } | |||||
| else if (STREQ(gpu_grid->name, "color")) { | |||||
| DRW_shgroup_uniform_texture_ref( | DRW_shgroup_uniform_texture_ref( | ||||
| grp, "sampdensity", mds->tex_density ? &mds->tex_density : &e_data.dummy_density); | grp, gpu_grid->sampler_name, mds->tex_color ? &mds->tex_color : &e_data.dummy_density); | ||||
| DRW_shgroup_uniform_texture_ref( | } | ||||
| grp, "sampcolor", mds->tex_color ? &mds->tex_color : &e_data.dummy_density); | else if (STREQ(gpu_grid->name, "flame") || STREQ(gpu_grid->name, "temperature")) { | ||||
| DRW_shgroup_uniform_texture_ref( | DRW_shgroup_uniform_texture_ref( | ||||
| grp, "sampflame", mds->tex_flame ? &mds->tex_flame : &e_data.dummy_flame); | grp, gpu_grid->sampler_name, mds->tex_flame ? &mds->tex_flame : &e_data.dummy_flame); | ||||
| } | |||||
| else { | |||||
| DRW_shgroup_uniform_texture_ref(grp, gpu_grid->sampler_name, &e_data.dummy_density); | |||||
| } | |||||
| } | |||||
| /* Constant Volume color. */ | /* Constant Volume color. */ | ||||
| bool use_constant_color = ((mds->active_fields & FLUID_DOMAIN_ACTIVE_COLORS) == 0 && | bool use_constant_color = ((mds->active_fields & FLUID_DOMAIN_ACTIVE_COLORS) == 0 && | ||||
| (mds->active_fields & FLUID_DOMAIN_ACTIVE_COLOR_SET) != 0); | (mds->active_fields & FLUID_DOMAIN_ACTIVE_COLOR_SET) != 0); | ||||
| DRW_shgroup_uniform_vec3( | DRW_shgroup_uniform_vec3( | ||||
| grp, "volumeColor", (use_constant_color) ? mds->active_color : white, 1); | grp, "volumeColor", (use_constant_color) ? mds->active_color : white, 1); | ||||
| /* Output is such that 0..1 maps to 0..1000K */ | /* Output is such that 0..1 maps to 0..1000K */ | ||||
| DRW_shgroup_uniform_vec2(grp, "unftemperature", &mds->flame_ignition, 1); | DRW_shgroup_uniform_vec2(grp, "volumeTemperature", &mds->flame_ignition, 1); | ||||
| } | } | ||||
| else { | else { | ||||
| DRW_shgroup_uniform_texture(grp, "sampdensity", e_data.dummy_density); | for (GPUMaterialVolumeGrid *gpu_grid = gpu_grids.first; gpu_grid; gpu_grid = gpu_grid->next) { | ||||
| DRW_shgroup_uniform_texture(grp, "sampcolor", e_data.dummy_density); | DRW_shgroup_uniform_texture(grp, gpu_grid->sampler_name, e_data.dummy_density); | ||||
| DRW_shgroup_uniform_texture(grp, "sampflame", e_data.dummy_flame); | } | ||||
| DRW_shgroup_uniform_vec3(grp, "volumeColor", white, 1); | DRW_shgroup_uniform_vec3(grp, "volumeColor", white, 1); | ||||
| DRW_shgroup_uniform_vec2(grp, "unftemperature", (float[2]){0.0f, 1.0f}, 1); | |||||
| } | } | ||||
| /* TODO Reduce to number of slices intersecting. */ | /* TODO Reduce to number of slices intersecting. */ | ||||
| /* TODO Preemptive culling. */ | /* TODO Preemptive culling. */ | ||||
| DRW_shgroup_call_procedural_triangles(grp, ob, sldata->common_data.vol_tex_size[2]); | DRW_shgroup_call_procedural_triangles(grp, ob, sldata->common_data.vol_tex_size[2]); | ||||
| vedata->stl->effects->enabled_effects |= (EFFECT_VOLUMETRIC | EFFECT_POST_BUFFER); | vedata->stl->effects->enabled_effects |= (EFFECT_VOLUMETRIC | EFFECT_POST_BUFFER); | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 313 Lines • Show Last 20 Lines | |||||