Blender V5.0
draw_hair.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2017 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
10
11#include "BKE_customdata.hh"
12
13#include "DNA_modifier_types.h"
14#include "DNA_particle_types.h"
15#include "DNA_scene_types.h"
16
17#include "DRW_render.hh"
18
19#include "GPU_batch.hh"
20#include "GPU_material.hh"
21#include "GPU_shader.hh"
22#include "GPU_texture.hh"
23#include "GPU_vertex_buffer.hh"
24
25#include "draw_common_c.hh"
27#include "draw_hair_private.hh"
28#include "draw_manager.hh"
29#include "draw_shader_shared.hh"
30
31/* New Draw Manager. */
32#include "draw_common.hh"
33
34namespace blender::draw {
35
37 Object *object,
38 ParticleSystem *psys,
39 ModifierData *md)
40{
41 /* TODO(fclem): Remove Global access. */
43
44 drw_particle_update_ptcache(object, psys);
46 object, psys, md, nullptr, scene->r.hair_subdiv);
47
49 cache.ensure_positions(module, source);
50
51 return cache.evaluated_pos_rad_buf.get();
52}
53
54template<typename PassT>
55blender::gpu::Batch *hair_sub_pass_setup_implementation(PassT &sub_ps,
56 const Scene *scene,
57 const ObjectRef &ob_ref,
58 ParticleSystem *psys,
59 ModifierData *md,
60 GPUMaterial *gpu_material)
61{
63 Object *object = ob_ref.object;
64
65 drw_particle_update_ptcache(object, psys);
66
68 object, psys, md, nullptr, scene->r.hair_subdiv);
69
71
72 const int face_per_segment = (scene->r.hair_type == SCE_HAIR_SHAPE_STRAND) ? 0 :
73 (scene->r.hair_type == SCE_HAIR_SHAPE_CYLINDER) ? 3 :
74 1;
75
76 if (source.evaluated_points_num() == 0) {
77 /* Nothing to draw. Just return an empty drawcall that will be skipped. */
78 bool unused_error;
79 return cache.batch_get(0, 0, face_per_segment, false, unused_error);
80 }
81
82 /* TODO(fclem): Remove Global access. */
84
85 cache.ensure_positions(module, source);
86 cache.ensure_attributes(module, source, gpu_material);
87
88 gpu::VertBufPtr &indirection_buf = cache.indirection_buf_get(module, source, face_per_segment);
89
90 {
92 Mesh &mesh = *psmd->mesh_final;
96 sub_ps, module, cache, face_per_segment, gpu_material, indirection_buf, active_uv);
97 }
98
99 bool unused_error;
100 return cache.batch_get(
101 source.evaluated_points_num(), source.curves_num(), face_per_segment, false, unused_error);
102}
103
104blender::gpu::Batch *hair_sub_pass_setup(PassMain::Sub &sub_ps,
105 const Scene *scene,
106 const ObjectRef &ob_ref,
107 ParticleSystem *psys,
108 ModifierData *md,
109 GPUMaterial *gpu_material)
110{
111 return hair_sub_pass_setup_implementation(sub_ps, scene, ob_ref, psys, md, gpu_material);
112}
113
114blender::gpu::Batch *hair_sub_pass_setup(PassSimple::Sub &sub_ps,
115 const Scene *scene,
116 const ObjectRef &ob_ref,
117 ParticleSystem *psys,
118 ModifierData *md,
119 GPUMaterial *gpu_material)
120{
121 return hair_sub_pass_setup_implementation(sub_ps, scene, ob_ref, psys, md, gpu_material);
122}
123
124} // namespace blender::draw
CustomData interface, see also DNA_customdata_types.h.
const char * CustomData_get_active_layer_name(const CustomData *data, eCustomDataType type)
@ CD_PROP_FLOAT2
@ SCE_HAIR_SHAPE_CYLINDER
@ SCE_HAIR_SHAPE_STRAND
detail::PassBase< command::DrawMultiBuf > Sub
Definition draw_pass.hh:499
DRWContext & drw_get()
void drw_particle_update_ptcache(Object *object_eval, ParticleSystem *psys)
CurvesEvalCache & hair_particle_get_eval_cache(ParticleDrawSource &src)
ParticleDrawSource drw_particle_get_hair_source(Object *object, ParticleSystem *psys, ModifierData *md, PTCacheEdit *edit, const int additional_subdivision)
void curves_bind_resources(PassMain::Sub &sub_ps, CurvesModule &module, CurvesEvalCache &cache, const int face_per_segment, GPUMaterial *gpu_material, gpu::VertBufPtr &indirection_buf, const std::optional< StringRef > active_uv_name)
blender::gpu::Batch * hair_sub_pass_setup_implementation(PassT &sub_ps, const Scene *scene, const ObjectRef &ob_ref, ParticleSystem *psys, ModifierData *md, GPUMaterial *gpu_material)
Definition draw_hair.cc:55
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)
Definition draw_hair.cc:104
gpu::VertBuf * hair_pos_buffer_get(Scene *scene, Object *object, ParticleSystem *psys, ModifierData *md)
Definition draw_hair.cc:36
std::unique_ptr< gpu::VertBuf, gpu::VertBufDeleter > VertBufPtr
static struct PyModuleDef module
Definition python.cpp:796
DRWData * data
blender::draw::CurvesModule * curves_module
CustomData corner_data
struct RenderData r
gpu::Batch * batch_get(int evaluated_point_count, int curve_count, int face_per_segment, bool use_cyclic, bool &r_over_limit)
gpu::VertBufPtr & indirection_buf_get(CurvesModule &module, const bke::CurvesGeometry &curves, int face_per_segment)
void ensure_attributes(struct CurvesModule &module, const bke::CurvesGeometry &curves, const GPUMaterial *gpu_material)
void ensure_positions(CurvesModule &module, const bke::CurvesGeometry &curves)