44 bsdf,
SOCK_IN,
"Specular IOR Level")
125 error_mat_->use_nodes =
true;
156 material_map_.clear();
168 default_surface_ntree_.nodetree_get(blender_mat);
174 blender_mat, ntree, pipeline_type, geometry_type, use_deferred_compilation);
177 const bool is_forward =
ELEM(pipeline_type,
199 error_mat_, error_mat_->nodetree, pipeline_type, geometry_type,
false);
218 if (((pipeline_type ==
MAT_PIPE_SHADOW) && (is_transparent || has_displacement)) || has_volume)
227 if (is_volume || (is_forward && is_transparent)) {
232 ShaderKey shader_key(matpass.
gpumat, blender_mat, probe_capture);
234 PassMain::Sub *shader_sub = shader_map_.lookup_or_add_cb(shader_key, [&]() {
237 ob, blender_mat, matpass.
gpumat, pipeline_type, probe_capture);
240 if (shader_sub !=
nullptr) {
261 MaterialKey material_key(
263 Material &mat = material_map_.lookup_or_add_cb(material_key, [&]() {
265 mat.volume_occupancy = material_pass_get(
267 mat.volume_material = material_pass_get(
273 VolumeLayer *layer = hide_on_camera ? nullptr :
276 mat.volume_occupancy.sub_pass = layer->occupancy_add(
277 ob, blender_mat, mat.volume_occupancy.gpumat);
278 mat.volume_material.sub_pass = layer->material_add(
279 ob, blender_mat, mat.volume_material.gpumat);
283 mat.volume_occupancy.sub_pass =
nullptr;
284 mat.volume_material.sub_pass =
nullptr;
292 if (use_forward_pipeline) {
301 MaterialKey material_key(blender_mat, geometry_type, surface_pipe, ob->
visibility_flag);
303 Material &mat = material_map_.lookup_or_add_cb(material_key, [&]() {
306 if (ob->visibility_flag & OB_HIDE_PROBE_VOLUME) {
307 mat.capture = MaterialPass();
310 mat.capture = material_pass_get(ob, blender_mat, MAT_PIPE_CAPTURE, geometry_type);
312 mat.prepass = MaterialPass();
315 mat.shading = material_pass_get(ob, blender_mat, surface_pipe, geometry_type);
316 mat.overlap_masking = MaterialPass();
317 mat.lightprobe_sphere_prepass = MaterialPass();
318 mat.lightprobe_sphere_shading = MaterialPass();
319 mat.planar_probe_prepass = MaterialPass();
320 mat.planar_probe_shading = MaterialPass();
321 mat.volume_occupancy = MaterialPass();
322 mat.volume_material = MaterialPass();
323 mat.has_volume =
false;
328 if (!hide_on_camera) {
329 mat.prepass = material_pass_get(ob, blender_mat, prepass_pipe, geometry_type);
332 mat.prepass = MaterialPass();
335 mat.shading = material_pass_get(ob, blender_mat, surface_pipe, geometry_type);
336 if (hide_on_camera) {
339 mat.shading.sub_pass =
nullptr;
342 mat.overlap_masking = MaterialPass();
343 mat.capture = MaterialPass();
347 mat.lightprobe_sphere_prepass = material_pass_get(
349 mat.lightprobe_sphere_shading = material_pass_get(
353 mat.lightprobe_sphere_prepass = MaterialPass();
354 mat.lightprobe_sphere_shading = MaterialPass();
358 mat.planar_probe_prepass = material_pass_get(
360 mat.planar_probe_shading = material_pass_get(
364 mat.planar_probe_prepass = MaterialPass();
365 mat.planar_probe_shading = MaterialPass();
370 if (mat.has_volume && !hide_on_camera) {
371 mat.volume_occupancy = material_pass_get(
373 mat.volume_material = material_pass_get(
377 mat.volume_occupancy = MaterialPass();
378 mat.volume_material = MaterialPass();
383 mat.shadow = material_pass_get(ob, blender_mat,
MAT_PIPE_SHADOW, geometry_type);
386 mat.shadow = MaterialPass();
389 mat.is_alpha_blend_transparent = use_forward_pipeline &&
399 if (mat.is_alpha_blend_transparent && !hide_on_camera) {
402 mat.overlap_masking.sub_pass = inst_.pipelines.forward.prepass_transparent_add(
403 ob, blender_mat, mat.shading.gpumat);
404 mat.shading.sub_pass = inst_.pipelines.forward.material_transparent_add(
405 ob, blender_mat, mat.shading.gpumat);
408 if (mat.has_volume) {
410 VolumeLayer *layer = hide_on_camera ? nullptr :
411 inst_.pipelines.volume.register_and_get_layer(ob);
413 mat.volume_occupancy.sub_pass = layer->occupancy_add(
414 ob, blender_mat, mat.volume_occupancy.gpumat);
415 mat.volume_material.sub_pass = layer->material_add(
416 ob, blender_mat, mat.volume_material.gpumat);
420 mat.volume_occupancy.sub_pass =
nullptr;
421 mat.volume_material.sub_pass =
nullptr;
442 material_array_.gpu_materials.clear();
447 ::Material *blender_mat = material_from_slot(ob, i);
448 Material &mat = material_sync(ob, blender_mat, to_material_geometry(ob), has_motion);
451 material_array_.materials.append(mat);
454 return material_array_;
462 ::Material *blender_mat = material_from_slot(ob, mat_nr);
463 Material &mat = material_sync(ob, blender_mat, geometry_type, has_motion);
void BKE_id_free(Main *bmain, void *idv)
void * BKE_id_new_nomain(short type, const char *name)
General operations, lookup, etc. for materials.
struct Material * BKE_object_material_get(struct Object *ob, short act)
struct Material * BKE_material_default_surface(void)
struct Material * BKE_material_default_volume(void)
#define SH_NODE_OUTPUT_MATERIAL
MINLINE void copy_v3_fl3(float v[3], float x, float y, float z)
MINLINE void copy_v3_fl(float r[3], float f)
@ MA_BL_TRANSPARENT_SHADOW
@ MA_SURFACE_METHOD_FORWARD
bool GPU_use_parallel_compilation()
bool GPU_material_has_surface_output(GPUMaterial *mat)
bool GPU_material_flag_get(const GPUMaterial *mat, eGPUMaterialFlag flag)
bool GPU_material_recalc_flag_get(GPUMaterial *mat)
eGPUMaterialStatus GPU_material_status(GPUMaterial *mat)
@ GPU_MATFLAG_TRANSPARENT
@ GPU_MAT_OPTIMIZATION_QUEUED
const char * GPU_material_get_name(GPUMaterial *material)
bool GPU_material_has_displacement_output(GPUMaterial *mat)
bool GPU_material_has_volume_output(GPUMaterial *mat)
eGPUMaterialOptimizationStatus GPU_material_optimization_status(GPUMaterial *mat)
struct blender::bke::bNodeTreeType * ntreeType_Shader
void register_layer_attributes(GPUMaterial *material)
PassBase< DrawCommandBufType > & sub(const char *name)
void material_set(Manager &manager, GPUMaterial *material)
detail::PassBase< command::DrawMultiBuf > Sub
bNodeTree * nodetree_get(::Material *ma)
~DefaultSurfaceNodeTree()
A running instance of the engine.
bool needs_lightprobe_sphere_passes() const
bool needs_planar_probe_passes() const
MaterialModule(Instance &inst)
::Material * metallic_mat
int64_t queued_optimize_shaders_count
int64_t queued_shaders_count
PassMain::Sub * material_add(Object *, ::Material *blender_mat, GPUMaterial *gpumat, eMaterialPipeline pipeline_type, eMaterialProbe probe_capture)
GPUMaterial * material_shader_get(::Material *blender_mat, bNodeTree *nodetree, eMaterialPipeline pipeline_type, eMaterialGeometry geometry_type, bool deferred_compilation)
GPUMaterial * material_default_shader_get(eMaterialPipeline pipeline_type, eMaterialGeometry geometry_type)
VolumeLayer * register_and_get_layer(Object *ob)
int DRW_cache_object_material_count_get(const Object *ob)
void node_set_active(bNodeTree *ntree, bNode *node)
bNode * node_add_static_node(const bContext *C, bNodeTree *ntree, int type)
bNodeLink * node_add_link(bNodeTree *ntree, bNode *fromnode, bNodeSocket *fromsock, bNode *tonode, bNodeSocket *tosock)
bNodeTree * node_tree_add_tree(Main *bmain, const char *name, const char *idname)
bNodeTree * node_tree_add_tree_embedded(Main *bmain, ID *owner_id, const char *name, const char *idname)
bNodeSocket * node_find_socket(bNode *node, eNodeSocketInOut in_out, StringRef identifier)
void node_tree_free_embedded_tree(bNodeTree *ntree)
@ MAT_PIPE_PREPASS_FORWARD_VELOCITY
@ MAT_PIPE_VOLUME_MATERIAL
@ MAT_PIPE_PREPASS_DEFERRED
@ MAT_PIPE_PREPASS_OVERLAP
@ MAT_PIPE_PREPASS_PLANAR
@ MAT_PIPE_PREPASS_DEFERRED_VELOCITY
@ MAT_PIPE_VOLUME_OCCUPANCY
@ MAT_PIPE_PREPASS_FORWARD
struct bNodeTree * nodetree
char surface_render_method
Vector< Material > materials