64 if (sub_pass !=
nullptr) {
65 sub_pass->
draw(geom, resource_handle);
74 if (object_pass !=
nullptr) {
75 object_pass->
draw(geom, res_handle);
110 bool is_alpha_blend =
false;
111 bool has_transparent_shadows =
false;
112 bool has_volume =
false;
113 float inflate_bounds = 0.0f;
115 gpu::Batch *geom = mat_geom[i];
116 if (geom ==
nullptr) {
145 is_alpha_blend = is_alpha_blend ||
material.is_alpha_blend_transparent;
146 has_transparent_shadows = has_transparent_shadows ||
material.has_transparent_shadows;
160 if (inflate_bounds != 0.0f) {
166 inst_.
shadows.
sync_object(ob, ob_handle, res_handle, is_alpha_blend, has_transparent_shadows);
183 bool has_motion =
false;
186 bool is_alpha_blend =
false;
187 bool has_transparent_shadows =
false;
188 bool has_volume =
false;
189 float inflate_bounds = 0.0f;
193 gpu::Batch *geom =
batch.batch;
194 if (geom ==
nullptr) {
206 if (
material.has_surface ==
false) {
222 is_alpha_blend = is_alpha_blend ||
material.is_alpha_blend_transparent;
223 has_transparent_shadows = has_transparent_shadows ||
material.has_transparent_shadows;
242 const float3 half_extent = bounds.
max - center + inflate_bounds;
247 inst_.
shadows.
sync_object(ob, ob_handle, res_handle, is_alpha_blend, has_transparent_shadows);
272 if (matpass.sub_pass ==
nullptr) {
277 object_pass.
draw(geometry, res_handle);
282 drawcall_add(
material.volume_occupancy);
283 drawcall_add(
material.volume_material);
288 if (
material.has_surface ==
false) {
294 drawcall_add(
material.overlap_masking);
299 drawcall_add(
material.planar_probe_prepass);
300 drawcall_add(
material.planar_probe_shading);
301 drawcall_add(
material.lightprobe_sphere_prepass);
302 drawcall_add(
material.lightprobe_sphere_shading);
318 material.is_alpha_blend_transparent,
339 const bool has_motion =
false;
361 if (object_pass !=
nullptr) {
362 object_pass->
draw(geom, res_handle);
371 bool is_rendered =
false;
372 is_rendered |= drawcall_add(
material.volume_occupancy, geom, res_handle);
373 is_rendered |= drawcall_add(
material.volume_material, geom, res_handle);
402 if (particle_sys !=
nullptr) {
406 if (res_handle.
raw == 0) {
412 ob_handle.
object_key, ob_ref, ob_handle.
recalc, res_handle, modifier_data, particle_sys);
416 if (matpass.sub_pass ==
nullptr) {
419 if (particle_sys !=
nullptr) {
422 sub_pass, inst_.
scene, ob_ref, particle_sys, modifier_data, matpass.gpumat);
423 sub_pass.
draw(geometry, res_handle);
428 sub_pass.
draw(geometry, res_handle);
434 drawcall_add(
material.volume_occupancy);
435 drawcall_add(
material.volume_material);
439 if (
material.has_surface ==
false) {
445 drawcall_add(
material.overlap_masking);
450 drawcall_add(
material.planar_probe_prepass);
451 drawcall_add(
material.planar_probe_shading);
452 drawcall_add(
material.lightprobe_sphere_prepass);
453 drawcall_add(
material.lightprobe_sphere_shading);
469 material.is_alpha_blend_transparent,
497 callback(particle_sys_handle, *md, *particle_sys);
bool BKE_sculptsession_use_pbvh_draw(const Object *ob, const RegionView3D *rv3d)
A BVH for high poly meshes.
#define LISTBASE_FOREACH(type, var, list)
BLI_INLINE bool BLI_listbase_is_empty(const ListBase *lb)
#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)
constexpr bool is_empty() const
IndexRange index_range() const
void extract_object_attributes(ResourceHandle handle, const ObjectRef &ref, const GPUMaterial *material)
ResourceHandleRange unique_handle(const ObjectRef &ref)
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, ResourceHandleRange 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)
ObjectHandle & sync_object(const ObjectRef &ob_ref)
void sync_mesh(Object *ob, ObjectHandle &ob_handle, const ObjectRef &ob_ref)
void sync_curves(Object *ob, ObjectHandle &ob_handle, const ObjectRef &ob_ref, ResourceHandle res_handle=0, ModifierData *modifier_data=nullptr, ParticleSystem *particle_sys=nullptr)
void sync_volume(Object *ob, ObjectHandle &ob_handle, const ObjectRef &ob_ref)
WorldHandle sync_world(const ::World &world)
bool sync_sculpt(Object *ob, ObjectHandle &ob_handle, const ObjectRef &ob_ref)
void sync_pointcloud(Object *ob, ObjectHandle &ob_handle, const ObjectRef &ob_ref)
bool step_object_sync(ObjectKey &object_key, const ObjectRef &object_ref, int recalc, ResourceHandle resource_handle, ModifierData *modifier_data=nullptr, ParticleSystem *particle_sys=nullptr)
gpu::Batch * unit_cube_batch_get()
void object_sync(const ObjectHandle &ob_handle)
DEGForeachIDComponentCallback callback
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 * curves_sub_pass_setup(PassMain::Sub &ps, const Scene *scene, Object *ob, GPUMaterial *gpu_material=nullptr)
gpu::Batch * pointcloud_sub_pass_setup(PassMain::Sub &sub_ps, Object *object, GPUMaterial *gpu_material=nullptr)
PassMain::Sub * volume_sub_pass(PassMain::Sub &ps, Scene *scene, Object *ob, GPUMaterial *gpu_material)
gpu::Batch * hair_sub_pass_setup(PassMain::Sub &sub_ps, const Scene *scene, const ObjectRef &ob_ref, ParticleSystem *psys, ModifierData *md, GPUMaterial *gpu_material=nullptr)
Vector< SculptBatch > sculpt_batches_per_material_get(const Object *ob, Span< const GPUMaterial * > materials)
Span< gpu::Batch * > DRW_cache_object_surface_material_get(Object *ob, const Span< const GPUMaterial * > materials)
static void geometry_call(PassMain::Sub *sub_pass, gpu::Batch *geom, ResourceHandle resource_handle)
void foreach_hair_particle_handle(ObjectRef &ob_ref, 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