44 ubos.append(std::make_unique<CurvesInfosBuf>());
63 const float vert[4] = {0.0f, 0.0f, 0.0f, 0.0f};
73 if (drw_data ==
nullptr) {
77 drw_data->
curves_module = MEM_new<CurvesModule>(
"CurvesModule");
88 MEM_delete(curves_module);
110 int strands_start = 0;
111 while (strands_start < curves_num) {
112 int batch_strands_len = std::min(curves_num - strands_start, max_strands_per_call);
115 strands_start += batch_strands_len;
123 if (final_points_len == 0) {
146 &curves, &cache, gpu_material, subdiv, thickness_res);
178 if (gpu_attr->name == name) {
214 &curves, &cache, gpu_material, subdiv, thickness_res);
237 int strands_start = 0;
238 while (strands_start < curves_num) {
239 int batch_strands_len = std::min(curves_num - strands_start, max_strands_per_call);
243 strands_start += batch_strands_len;
247 if (final_points_len > 0) {
273template<
typename PassT>
290 curves_id, gpu_material, subdiv, thickness_res);
295 sub_ps.bind_texture(
"u",
module.dummy_vbo);
296 sub_ps.bind_texture(
"au",
module.dummy_vbo);
297 sub_ps.bind_texture(
"a",
module.dummy_vbo);
298 sub_ps.bind_texture(
"c",
module.dummy_vbo);
299 sub_ps.bind_texture(
"ac",
module.dummy_vbo);
304 sub_ps.bind_texture(attr->input_name,
module.dummy_vbo);
309 float hair_rad_shape = 0.0f;
310 float hair_rad_root = 0.005f;
311 float hair_rad_tip = 0.0f;
312 bool hair_close_tip =
true;
321 const float first_radius = radii[first_curve_points.
first()];
322 const float last_radius = radii[first_curve_points.
last()];
323 const float middle_radius = radii[first_curve_points.
size() / 2];
324 hair_rad_root = radii[first_curve_points.
first()];
325 hair_rad_tip = radii[first_curve_points.
last()];
326 hair_rad_shape = std::clamp(
327 math::safe_divide(middle_radius - first_radius, last_radius - first_radius) * 2.0f - 1.0f,
332 sub_ps.bind_texture(
"hairPointBuffer", curves_cache->
final.
proc_buf);
351 char sampler_name[32];
359 if (name == curve_data_render_uv) {
368 if (name == point_data_render_uv) {
385 sub_ps.bind_ubo(
"drw_curves", curves_infos);
387 sub_ps.push_constant(
"hairStrandsRes", &curves_cache->
final.
resolution, 1);
388 sub_ps.push_constant(
"hairThicknessRes", thickness_res);
389 sub_ps.push_constant(
"hairRadShape", hair_rad_shape);
390 sub_ps.push_constant(
"hairDupliMatrix", ob->object_to_world());
391 sub_ps.push_constant(
"hairRadRoot", hair_rad_root);
392 sub_ps.push_constant(
"hairRadTip", hair_rad_tip);
393 sub_ps.push_constant(
"hairCloseTip", hair_close_tip);
Low-level operations for curves.
CustomData interface, see also DNA_customdata_types.h.
const char * CustomData_get_render_layer_name(const CustomData *data, eCustomDataType type)
bool CustomData_has_layer(const CustomData *data, eCustomDataType type)
#define LISTBASE_FOREACH(type, var, list)
void DRW_submission_end()
void DRW_submission_start()
int GPU_max_work_group_count(int index)
ListBase GPU_material_attributes(const GPUMaterial *material)
void GPU_memory_barrier(eGPUBarrier barrier)
@ GPU_BARRIER_SHADER_STORAGE
void GPU_vertbuf_use(blender::gpu::VertBuf *)
void GPU_vertbuf_attr_fill(blender::gpu::VertBuf *, uint a_idx, const void *data)
blender::gpu::VertBuf * GPU_vertbuf_create_with_format_ex(const GPUVertFormat &format, GPUUsageType usage)
void GPU_vertbuf_data_alloc(blender::gpu::VertBuf &verts, uint v_len)
@ GPU_USAGE_FLAG_BUFFER_TEXTURE_ONLY
constexpr int64_t first() const
constexpr int64_t last(const int64_t n=0) const
constexpr int64_t size() const
IndexRange index_range() const
GAttributeReader lookup_or_default(StringRef attribute_id, AttrDomain domain, eCustomDataType data_type, const void *default_value=nullptr) const
OffsetIndices< int > points_by_curve() const
AttributeAccessor attributes() const
void submit(PassSimple &pass, View &view)
void bind_texture(const char *name, GPUTexture *texture, GPUSamplerState state=sampler_auto)
PassBase< DrawCommandBufType > & sub(const char *name)
void dispatch(int group_len)
void push_constant(const char *name, const float &data)
void bind_ssbo(const char *name, GPUStorageBuf *buffer)
void shader_set(GPUShader *shader)
detail::PassBase< command::DrawCommandBuf > Sub
const DRWContext * DRW_context_get()
Mesh & DRW_object_get_data_for_drawing(const Object &object)
GPUShader * DRW_shader_curves_refine_get(blender::draw::CurvesEvalShader)
void DRW_curves_module_free(draw::CurvesModule *module)
static CurvesEvalCache * drw_curves_cache_get(Curves &curves, GPUMaterial *gpu_material, int subdiv, int thickness_res)
gpu::VertBuf * curves_pos_buffer_get(Scene *scene, Object *object)
static CurvesEvalCache * curves_cache_get(Curves &curves, GPUMaterial *gpu_material, int subdiv, int thickness_res)
detail::Pass< command::DrawCommandBuf > PassSimple
gpu::Batch * curves_sub_pass_setup(PassMain::Sub &ps, const Scene *scene, Object *ob, GPUMaterial *gpu_material=nullptr)
static void drw_curves_cache_update_compute(CurvesEvalCache *cache, const int curves_num, gpu::VertBuf *output_buf, gpu::VertBuf *input_buf)
void DRW_curves_init(DRWData *drw_data=nullptr)
static int attribute_index_in_material(GPUMaterial *gpu_material, const StringRef name)
void DRW_curves_update(draw::Manager &manager)
void drw_curves_get_attribute_sampler_name(const StringRef layer_name, char r_sampler_name[32])
gpu::Batch * curves_sub_pass_setup_implementation(PassT &sub_ps, const Scene *scene, Object *ob, GPUMaterial *gpu_material)
void DRW_curves_begin_sync(DRWData *drw_data)
@ CURVES_EVAL_CATMULL_ROM
bool curves_ensure_procedural_data(Curves *curves_id, CurvesEvalCache **r_cache, const GPUMaterial *gpu_material, const int subdiv, const int thickness_res)
UniformBuffer< CurvesInfos > CurvesInfosBuf
gpu::VertBuf * DRW_curves_pos_buffer_get(Object *object)
T safe_divide(const T &a, const T &b)
VecBase< int32_t, 3 > int3
ListBaseWrapperTemplate< ListBase, T > ListBaseWrapper
static void update(bNodeTree *ntree)
static struct PyModuleDef module
uint4 is_point_attribute[DRW_ATTRIBUTE_PER_CURVES_MAX]
blender::draw::CurvesModule * curves_module
gpu::VertBuf * proc_strand_seg_buf
CurvesEvalFinalCache final
gpu::VertBuf * proc_length_buf
gpu::VertBuf * proc_attributes_buf[GPU_MAX_ATTR]
gpu::VertBuf * proc_point_buf
std::array< bool, GPU_MAX_ATTR > proc_attributes_point_domain
gpu::VertBuf * proc_strand_buf
gpu::VertBuf * attributes_buf[GPU_MAX_ATTR]
VectorSet< std::string > attr_used