41 ObjectHandle &handle = ob_handles.lookup_or_add_cb(key, [&]() {
69 if (sub_pass !=
nullptr) {
70 sub_pass->
draw(geom, resource_handle);
79 if (object_pass !=
nullptr) {
80 object_pass->
draw(geom, res_handle);
108 if (mat_geom ==
nullptr) {
117 bool is_alpha_blend =
false;
118 bool has_transparent_shadows =
false;
119 bool has_volume =
false;
120 float inflate_bounds = 0.0f;
122 gpu::Batch *geom = mat_geom[i];
123 if (geom ==
nullptr) {
130 if (material.has_volume) {
136 if (!material.has_surface) {
142 geometry_call(material.overlap_masking.sub_pass, geom, res_handle);
147 geometry_call(material.planar_probe_prepass.sub_pass, geom, res_handle);
148 geometry_call(material.planar_probe_shading.sub_pass, geom, res_handle);
149 geometry_call(material.lightprobe_sphere_prepass.sub_pass, geom, res_handle);
150 geometry_call(material.lightprobe_sphere_shading.sub_pass, geom, res_handle);
152 is_alpha_blend = is_alpha_blend || material.is_alpha_blend_transparent;
153 has_transparent_shadows = has_transparent_shadows || material.has_transparent_shadows;
167 if (inflate_bounds != 0.0f) {
173 inst_.
shadows.
sync_object(ob, ob_handle, res_handle, is_alpha_blend, has_transparent_shadows);
191 bool has_motion =
false;
194 bool is_alpha_blend =
false;
195 bool has_transparent_shadows =
false;
196 bool has_volume =
false;
197 float inflate_bounds = 0.0f;
201 gpu::Batch *geom =
batch.batch;
202 if (geom ==
nullptr) {
208 if (material.has_volume) {
214 if (material.has_surface ==
false) {
220 geometry_call(material.overlap_masking.sub_pass, geom, res_handle);
225 geometry_call(material.planar_probe_prepass.sub_pass, geom, res_handle);
226 geometry_call(material.planar_probe_shading.sub_pass, geom, res_handle);
227 geometry_call(material.lightprobe_sphere_prepass.sub_pass, geom, res_handle);
228 geometry_call(material.lightprobe_sphere_shading.sub_pass, geom, res_handle);
230 is_alpha_blend = is_alpha_blend || material.is_alpha_blend_transparent;
231 has_transparent_shadows = has_transparent_shadows || material.has_transparent_shadows;
250 const float3 half_extent = bounds.
max - center + inflate_bounds;
255 inst_.
shadows.
sync_object(ob, ob_handle, res_handle, is_alpha_blend, has_transparent_shadows);
281 if (matpass.sub_pass ==
nullptr) {
286 object_pass.
draw(geometry, res_handle);
289 if (material.has_volume) {
291 drawcall_add(material.volume_occupancy);
292 drawcall_add(material.volume_material);
297 if (material.has_surface ==
false) {
302 drawcall_add(material.capture);
303 drawcall_add(material.overlap_masking);
304 drawcall_add(material.prepass);
305 drawcall_add(material.shading);
306 drawcall_add(material.shadow);
308 drawcall_add(material.planar_probe_prepass);
309 drawcall_add(material.planar_probe_shading);
310 drawcall_add(material.lightprobe_sphere_prepass);
311 drawcall_add(material.lightprobe_sphere_shading);
314 GPUMaterial *gpu_material = material.shading.gpumat;
327 material.is_alpha_blend_transparent,
328 material.has_transparent_shadows);
349 const bool has_motion =
false;
371 if (object_pass !=
nullptr) {
372 object_pass->
draw(geom, res_handle);
381 bool is_rendered =
false;
382 is_rendered |= drawcall_add(material.volume_occupancy, geom, res_handle);
383 is_rendered |= drawcall_add(material.volume_material, geom, res_handle);
412 if (particle_sys !=
nullptr) {
417 ob, ob_handle.
object_key, res_handle, ob_handle.
recalc, modifier_data, particle_sys);
421 if (matpass.sub_pass ==
nullptr) {
424 if (particle_sys !=
nullptr) {
427 sub_pass, inst_.
scene, ob, particle_sys, modifier_data, matpass.gpumat);
428 sub_pass.
draw(geometry, res_handle);
433 sub_pass.
draw(geometry, res_handle);
437 if (material.has_volume) {
439 drawcall_add(material.volume_occupancy);
440 drawcall_add(material.volume_material);
444 if (material.has_surface ==
false) {
449 drawcall_add(material.capture);
450 drawcall_add(material.overlap_masking);
451 drawcall_add(material.prepass);
452 drawcall_add(material.shading);
453 drawcall_add(material.shadow);
455 drawcall_add(material.planar_probe_prepass);
456 drawcall_add(material.planar_probe_shading);
457 drawcall_add(material.lightprobe_sphere_prepass);
458 drawcall_add(material.lightprobe_sphere_shading);
461 GPUMaterial *gpu_material = material.shading.gpumat;
474 material.is_alpha_blend_transparent,
475 material.has_transparent_shadows);
500 callback(particle_sys_handle, *md, *particle_sys);
General operations, lookup, etc. for blender objects.
bool BKE_sculptsession_use_pbvh_draw(const Object *ob, const RegionView3D *rv3d)
A BVH for high poly meshes.
BLI_INLINE bool BLI_listbase_is_empty(const struct ListBase *lb)
#define LISTBASE_FOREACH(type, var, list)
#define CURVES_MATERIAL_NR
@ eModifierType_ParticleSystem
#define POINTCLOUD_MATERIAL_NR
#define VOLUME_MATERIAL_NR
ListBase GPU_material_attributes(const GPUMaterial *material)
Material * GPU_material_get_material(GPUMaterial *material)
bool GPU_material_has_displacement_output(GPUMaterial *mat)
bool GPU_material_has_volume_output(GPUMaterial *mat)
IndexRange index_range() const
void extract_object_attributes(ResourceHandle handle, const ObjectRef &ref, const GPUMaterial *material)
void update_handle_bounds(ResourceHandle handle, const ObjectRef &ref, float inflate_bounds=0.0f)
void draw(gpu::Batch *batch, uint instance_len=-1, uint vertex_len=-1, uint vertex_first=-1, ResourceHandle handle={0}, uint custom_id=0)
PassBase< DrawCommandBufType > & sub(const char *name)
void sync_object(Object *ob, ResourceHandle res_handle)
void sync_material(const ::Material *material)
int get_recalc_flags(const ObjectRef &ob_ref)
const RegionView3D * rv3d
Material & material_get(Object *ob, bool has_motion, int mat_nr, eMaterialGeometry geometry_type)
MaterialArray & material_array_get(Object *ob, bool has_motion)
void sync_object(const Object *ob, const ObjectHandle &handle, const ResourceHandle &resource_handle, bool is_alpha_blend, bool has_transparent_shadows)
void sync_point_cloud(Object *ob, ObjectHandle &ob_handle, ResourceHandle res_handle, const ObjectRef &ob_ref)
ObjectHandle & sync_object(const ObjectRef &ob_ref)
void sync_mesh(Object *ob, ObjectHandle &ob_handle, ResourceHandle res_handle, const ObjectRef &ob_ref)
void sync_volume(Object *ob, ObjectHandle &ob_handle, ResourceHandle res_handle, const ObjectRef &ob_ref)
void sync_curves(Object *ob, ObjectHandle &ob_handle, ResourceHandle res_handle, const ObjectRef &ob_ref, ModifierData *modifier_data=nullptr, ParticleSystem *particle_sys=nullptr)
WorldHandle sync_world(const ::World &world)
bool sync_sculpt(Object *ob, ObjectHandle &ob_handle, ResourceHandle res_handle, const ObjectRef &ob_ref)
bool step_object_sync(Object *ob, ObjectKey &object_key, ResourceHandle resource_handle, int recalc=0, ModifierData *modifier_data=nullptr, ParticleSystem *particle_sys=nullptr)
void object_sync(const ObjectHandle &ob_handle)
DEGForeachIDComponentCallback callback
blender::gpu::Batch ** DRW_cache_object_surface_material_get(Object *ob, GPUMaterial **gpumat_array, uint gpumat_array_len)
blender::gpu::Batch * DRW_cache_cube_get()
bool DRW_state_is_image_render()
bool DRW_object_is_visible_psys_in_active_context(const Object *object, const ParticleSystem *psys)
pbvh::Tree * pbvh_get(Object &object)
Bounds< float3 > bounds_get(const Tree &pbvh)
gpu::Batch * point_cloud_sub_pass_setup(PassMain::Sub &sub_ps, Object *object, GPUMaterial *gpu_material=nullptr)
gpu::Batch * hair_sub_pass_setup(PassMain::Sub &sub_ps, const Scene *scene, Object *object, ParticleSystem *psys, ModifierData *md, GPUMaterial *gpu_material=nullptr)
gpu::Batch * curves_sub_pass_setup(PassMain::Sub &ps, const Scene *scene, Object *ob, GPUMaterial *gpu_material=nullptr)
PassMain::Sub * volume_sub_pass(PassMain::Sub &ps, Scene *scene, Object *ob, GPUMaterial *gpu_material)
Vector< SculptBatch > sculpt_batches_per_material_get(const Object *ob, Span< const GPUMaterial * > materials)
static void geometry_call(PassMain::Sub *sub_pass, gpu::Batch *geom, ResourceHandle resource_handle)
void foreach_hair_particle_handle(Object *ob, ObjectHandle ob_handle, HairHandleCallback callback)
static void volume_call(MaterialPass &matpass, Scene *scene, Object *ob, gpu::Batch *geom, ResourceHandle res_handle)
T midpoint(const T &a, const T &b)
T max(const T &a, const T &b)
Vector< GPUMaterial * > gpu_materials
Vector< Material > materials