Changeset View
Changeset View
Standalone View
Standalone View
source/blender/draw/engines/eevee/eevee_materials.c
| Show First 20 Lines • Show All 788 Lines • ▼ Show 20 Lines | struct GPUMaterial *EEVEE_material_world_lightprobe_get(struct Scene *scene, World *wo) | ||||
| GPUMaterial *mat = DRW_shader_find_from_world(wo, engine, options, false); | GPUMaterial *mat = DRW_shader_find_from_world(wo, engine, options, false); | ||||
| if (mat != NULL) { | if (mat != NULL) { | ||||
| return mat; | return mat; | ||||
| } | } | ||||
| return DRW_shader_create_from_world(scene, | return DRW_shader_create_from_world(scene, | ||||
| wo, | wo, | ||||
| engine, | engine, | ||||
| options, | options, | ||||
| false, | |||||
| e_data.vert_background_shader_str, | e_data.vert_background_shader_str, | ||||
| NULL, | NULL, | ||||
| e_data.frag_shader_lib, | e_data.frag_shader_lib, | ||||
| SHADER_DEFINES "#define PROBE_CAPTURE\n", | SHADER_DEFINES "#define PROBE_CAPTURE\n", | ||||
| false); | false); | ||||
| } | } | ||||
| struct GPUMaterial *EEVEE_material_world_background_get(struct Scene *scene, World *wo) | struct GPUMaterial *EEVEE_material_world_background_get(struct Scene *scene, World *wo) | ||||
| { | { | ||||
| const void *engine = &DRW_engine_viewport_eevee_type; | const void *engine = &DRW_engine_viewport_eevee_type; | ||||
| int options = VAR_WORLD_BACKGROUND; | int options = VAR_WORLD_BACKGROUND; | ||||
| GPUMaterial *mat = DRW_shader_find_from_world(wo, engine, options, true); | GPUMaterial *mat = DRW_shader_find_from_world(wo, engine, options, true); | ||||
| if (mat != NULL) { | if (mat != NULL) { | ||||
| return mat; | return mat; | ||||
| } | } | ||||
| return DRW_shader_create_from_world(scene, | return DRW_shader_create_from_world(scene, | ||||
| wo, | wo, | ||||
| engine, | engine, | ||||
| options, | options, | ||||
| false, | |||||
| e_data.vert_background_shader_str, | e_data.vert_background_shader_str, | ||||
| NULL, | NULL, | ||||
| e_data.frag_shader_lib, | e_data.frag_shader_lib, | ||||
| SHADER_DEFINES "#define WORLD_BACKGROUND\n", | SHADER_DEFINES "#define WORLD_BACKGROUND\n", | ||||
| true); | true); | ||||
| } | } | ||||
| struct GPUMaterial *EEVEE_material_world_volume_get(struct Scene *scene, World *wo) | struct GPUMaterial *EEVEE_material_world_volume_get(struct Scene *scene, World *wo) | ||||
| { | { | ||||
| const void *engine = &DRW_engine_viewport_eevee_type; | const void *engine = &DRW_engine_viewport_eevee_type; | ||||
| int options = VAR_WORLD_VOLUME; | int options = VAR_WORLD_VOLUME; | ||||
| GPUMaterial *mat = DRW_shader_find_from_world(wo, engine, options, true); | GPUMaterial *mat = DRW_shader_find_from_world(wo, engine, options, true); | ||||
| if (mat != NULL) { | if (mat != NULL) { | ||||
| return mat; | return mat; | ||||
| } | } | ||||
| char *defines = eevee_get_volume_defines(options); | char *defines = eevee_get_volume_defines(options); | ||||
| mat = DRW_shader_create_from_world(scene, | mat = DRW_shader_create_from_world(scene, | ||||
| wo, | wo, | ||||
| engine, | engine, | ||||
| options, | options, | ||||
| true, | |||||
| e_data.vert_volume_shader_str, | e_data.vert_volume_shader_str, | ||||
| e_data.geom_volume_shader_str, | e_data.geom_volume_shader_str, | ||||
| e_data.volume_shader_lib, | e_data.volume_shader_lib, | ||||
| defines, | defines, | ||||
| true); | true); | ||||
| MEM_freeN(defines); | MEM_freeN(defines); | ||||
| Show All 18 Lines | struct GPUMaterial *EEVEE_material_mesh_get(struct Scene *scene, | ||||
| } | } | ||||
| char *defines = eevee_get_defines(options); | char *defines = eevee_get_defines(options); | ||||
| mat = DRW_shader_create_from_material(scene, | mat = DRW_shader_create_from_material(scene, | ||||
| ma, | ma, | ||||
| engine, | engine, | ||||
| options, | options, | ||||
| false, | |||||
| e_data.vert_shader_str, | e_data.vert_shader_str, | ||||
| NULL, | NULL, | ||||
| e_data.frag_shader_lib, | e_data.frag_shader_lib, | ||||
| defines, | defines, | ||||
| true); | true); | ||||
| MEM_freeN(defines); | MEM_freeN(defines); | ||||
| Show All 11 Lines | struct GPUMaterial *EEVEE_material_mesh_volume_get(struct Scene *scene, Material *ma) | ||||
| } | } | ||||
| char *defines = eevee_get_volume_defines(options); | char *defines = eevee_get_volume_defines(options); | ||||
| mat = DRW_shader_create_from_material(scene, | mat = DRW_shader_create_from_material(scene, | ||||
| ma, | ma, | ||||
| engine, | engine, | ||||
| options, | options, | ||||
| true, | |||||
| e_data.vert_volume_shader_str, | e_data.vert_volume_shader_str, | ||||
| e_data.geom_volume_shader_str, | e_data.geom_volume_shader_str, | ||||
| e_data.volume_shader_lib, | e_data.volume_shader_lib, | ||||
| defines, | defines, | ||||
| true); | true); | ||||
| MEM_freeN(defines); | MEM_freeN(defines); | ||||
| Show All 20 Lines | struct GPUMaterial *EEVEE_material_mesh_depth_get(struct Scene *scene, | ||||
| char *defines = eevee_get_defines(options); | char *defines = eevee_get_defines(options); | ||||
| char *frag_str = BLI_string_joinN(e_data.frag_shader_lib, datatoc_prepass_frag_glsl); | char *frag_str = BLI_string_joinN(e_data.frag_shader_lib, datatoc_prepass_frag_glsl); | ||||
| mat = DRW_shader_create_from_material(scene, | mat = DRW_shader_create_from_material(scene, | ||||
| ma, | ma, | ||||
| engine, | engine, | ||||
| options, | options, | ||||
| false, | |||||
| (is_shadow) ? e_data.vert_shadow_shader_str : | (is_shadow) ? e_data.vert_shadow_shader_str : | ||||
| e_data.vert_shader_str, | e_data.vert_shader_str, | ||||
| NULL, | NULL, | ||||
| frag_str, | frag_str, | ||||
| defines, | defines, | ||||
| true); | true); | ||||
| MEM_freeN(frag_str); | MEM_freeN(frag_str); | ||||
| Show All 13 Lines | struct GPUMaterial *EEVEE_material_hair_get(struct Scene *scene, Material *ma) | ||||
| } | } | ||||
| char *defines = eevee_get_defines(options); | char *defines = eevee_get_defines(options); | ||||
| mat = DRW_shader_create_from_material(scene, | mat = DRW_shader_create_from_material(scene, | ||||
| ma, | ma, | ||||
| engine, | engine, | ||||
| options, | options, | ||||
| false, | |||||
| e_data.vert_shader_str, | e_data.vert_shader_str, | ||||
| NULL, | NULL, | ||||
| e_data.frag_shader_lib, | e_data.frag_shader_lib, | ||||
| defines, | defines, | ||||
| true); | true); | ||||
| MEM_freeN(defines); | MEM_freeN(defines); | ||||
| ▲ Show 20 Lines • Show All 958 Lines • ▼ Show 20 Lines | for (int i = 0; i < materials_len; i++) { | ||||
| } | } | ||||
| } | } | ||||
| /* Only support single volume material for now. */ | /* Only support single volume material for now. */ | ||||
| /* XXX We rely on the previously compiled surface shader | /* XXX We rely on the previously compiled surface shader | ||||
| * to know if the material has a "volume nodetree". | * to know if the material has a "volume nodetree". | ||||
| */ | */ | ||||
| bool use_volume_material = (gpumat_array[0] && | bool use_volume_material = (gpumat_array[0] && | ||||
| GPU_material_use_domain_volume(gpumat_array[0])); | GPU_material_has_volume_output(gpumat_array[0])); | ||||
| if ((ob->dt >= OB_SOLID) || DRW_state_is_image_render()) { | if ((ob->dt >= OB_SOLID) || DRW_state_is_image_render()) { | ||||
| /* Get per-material split surface */ | /* Get per-material split surface */ | ||||
| struct GPUBatch **mat_geom = NULL; | struct GPUBatch **mat_geom = NULL; | ||||
| if (!use_sculpt_pbvh) { | if (!use_sculpt_pbvh) { | ||||
| mat_geom = DRW_cache_object_surface_material_get(ob, gpumat_array, materials_len); | mat_geom = DRW_cache_object_surface_material_get(ob, gpumat_array, materials_len); | ||||
| } | } | ||||
| Show All 32 Lines | if ((ob->dt >= OB_SOLID) || DRW_state_is_image_render()) { | ||||
| for (int i = 0; i < materials_len; i++) { | for (int i = 0; i < materials_len; i++) { | ||||
| if (mat_geom[i] == NULL) { | if (mat_geom[i] == NULL) { | ||||
| continue; | continue; | ||||
| } | } | ||||
| /* Do not render surface if we are rendering a volume object | /* Do not render surface if we are rendering a volume object | ||||
| * and do not have a surface closure. */ | * and do not have a surface closure. */ | ||||
| if (use_volume_material && | if (use_volume_material && | ||||
| (gpumat_array[i] && !GPU_material_use_domain_surface(gpumat_array[i]))) { | (gpumat_array[i] && !GPU_material_has_surface_output(gpumat_array[i]))) { | ||||
| continue; | continue; | ||||
| } | } | ||||
| /* XXX TODO rewrite this to include the dupli objects. | /* XXX TODO rewrite this to include the dupli objects. | ||||
| * This means we cannot exclude dupli objects from reflections!!! */ | * This means we cannot exclude dupli objects from reflections!!! */ | ||||
| EEVEE_ObjectEngineData *oedata = NULL; | EEVEE_ObjectEngineData *oedata = NULL; | ||||
| if ((ob->base_flag & BASE_FROM_DUPLI) == 0) { | if ((ob->base_flag & BASE_FROM_DUPLI) == 0) { | ||||
| oedata = EEVEE_object_data_ensure(ob); | oedata = EEVEE_object_data_ensure(ob); | ||||
| ▲ Show 20 Lines • Show All 299 Lines • Show Last 20 Lines | |||||