2025-08-27 09:49:43 +02:00
|
|
|
/* SPDX-FileCopyrightText: 2025 Blender Authors
|
|
|
|
|
*
|
|
|
|
|
* SPDX-License-Identifier: GPL-2.0-or-later */
|
|
|
|
|
|
|
|
|
|
/** \file
|
|
|
|
|
* \ingroup draw
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
#ifdef GPU_SHADER
|
|
|
|
|
# pragma once
|
2025-09-15 17:22:19 +02:00
|
|
|
# include "gpu_shader_compat.hh"
|
2025-08-27 09:49:43 +02:00
|
|
|
|
|
|
|
|
# include "draw_attribute_shader_shared.hh"
|
2025-09-25 10:57:02 +02:00
|
|
|
# include "draw_object_infos_infos.hh"
|
2025-08-27 09:49:43 +02:00
|
|
|
|
|
|
|
|
# define DRW_HAIR_INFO
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#include "draw_curves_defines.hh"
|
|
|
|
|
|
|
|
|
|
#include "gpu_shader_create_info.hh"
|
|
|
|
|
|
|
|
|
|
GPU_SHADER_CREATE_INFO(draw_curves_topology)
|
|
|
|
|
LOCAL_GROUP_SIZE(CURVES_PER_THREADGROUP)
|
|
|
|
|
/* Offsets giving the start and end of the curve. */
|
|
|
|
|
STORAGE_BUF(0, read, int, evaluated_offsets_buf[])
|
|
|
|
|
STORAGE_BUF(1, read, uint, curves_cyclic_buf[]) /* Actually bool (1 byte). */
|
|
|
|
|
STORAGE_BUF(2, write, int, indirection_buf[])
|
|
|
|
|
PUSH_CONSTANT(int, curves_start)
|
|
|
|
|
PUSH_CONSTANT(int, curves_count)
|
|
|
|
|
PUSH_CONSTANT(bool, is_ribbon_topology)
|
|
|
|
|
PUSH_CONSTANT(bool, use_cyclic)
|
|
|
|
|
COMPUTE_SOURCE("draw_curves_topology_comp.glsl")
|
|
|
|
|
DO_STATIC_COMPILATION()
|
|
|
|
|
GPU_SHADER_CREATE_END()
|
|
|
|
|
|
|
|
|
|
GPU_SHADER_CREATE_INFO(draw_curves_data)
|
|
|
|
|
LOCAL_GROUP_SIZE(CURVES_PER_THREADGROUP)
|
|
|
|
|
/* Offsets giving the start and end of the curve. */
|
|
|
|
|
STORAGE_BUF(EVALUATED_POINT_SLOT, read, int, evaluated_points_by_curve_buf[])
|
|
|
|
|
STORAGE_BUF(POINTS_BY_CURVES_SLOT, read, int, points_by_curve_buf[])
|
|
|
|
|
STORAGE_BUF(CURVE_RESOLUTION_SLOT, read, uint, curves_resolution_buf[])
|
|
|
|
|
STORAGE_BUF(CURVE_TYPE_SLOT, read, uint, curves_type_buf[]) /* Actually int8_t. */
|
|
|
|
|
STORAGE_BUF(CURVE_CYCLIC_SLOT, read, uint, curves_cyclic_buf[]) /* Actually bool (1 byte). */
|
|
|
|
|
/* Bezier handles (if needed). */
|
|
|
|
|
STORAGE_BUF(HANDLES_POS_LEFT_SLOT, read, float, handles_positions_left_buf[])
|
|
|
|
|
STORAGE_BUF(HANDLES_POS_RIGHT_SLOT, read, float, handles_positions_right_buf[])
|
|
|
|
|
STORAGE_BUF(BEZIER_OFFSETS_SLOT, read, int, bezier_offsets_buf[])
|
|
|
|
|
/* Nurbs (alias of other buffers). */
|
|
|
|
|
// STORAGE_BUF(CURVES_ORDER_SLOT, read, uint, curves_order_buf[]) /* Actually int8_t. */
|
|
|
|
|
// STORAGE_BUF(BASIS_CACHE_SLOT, read, float, basis_cache_buf[])
|
|
|
|
|
// STORAGE_BUF(CONTROL_WEIGHTS_SLOT, read, float, control_weights_buf[])
|
|
|
|
|
// STORAGE_BUF(BASIS_CACHE_OFFSET_SLOT, read, int, basis_cache_offset_buf[])
|
|
|
|
|
PUSH_CONSTANT(int, curves_start)
|
|
|
|
|
PUSH_CONSTANT(int, curves_count)
|
|
|
|
|
PUSH_CONSTANT(bool, use_point_weight)
|
|
|
|
|
PUSH_CONSTANT(bool, use_cyclic)
|
|
|
|
|
/** IMPORTANT: For very dumb reasons, on GL the default specialization is compiled and used for
|
|
|
|
|
* creating the shader interface. If this happens to optimize out some push_constants that are
|
|
|
|
|
* valid in other specialization, we will never be able to set them. So choose the specialization
|
|
|
|
|
* that uses all push_constants. */
|
|
|
|
|
SPECIALIZATION_CONSTANT(int, evaluated_type, 3) /* CURVE_TYPE_NURBS */
|
|
|
|
|
TYPEDEF_SOURCE("draw_attribute_shader_shared.hh")
|
|
|
|
|
COMPUTE_SOURCE("draw_curves_interpolation_comp.glsl")
|
|
|
|
|
GPU_SHADER_CREATE_END()
|
|
|
|
|
|
|
|
|
|
GPU_SHADER_CREATE_INFO(draw_curves_interpolate_position)
|
|
|
|
|
ADDITIONAL_INFO(draw_curves_data)
|
|
|
|
|
/* Attributes. */
|
|
|
|
|
STORAGE_BUF(POINT_POSITIONS_SLOT, read, float, positions_buf[])
|
|
|
|
|
STORAGE_BUF(POINT_RADII_SLOT, read, float, radii_buf[])
|
|
|
|
|
/* Outputs. */
|
|
|
|
|
STORAGE_BUF(EVALUATED_POS_RAD_SLOT, read_write, float4, evaluated_positions_radii_buf[])
|
|
|
|
|
PUSH_CONSTANT(float4x4, transform)
|
|
|
|
|
COMPUTE_FUNCTION("evaluate_position_radius")
|
|
|
|
|
DO_STATIC_COMPILATION()
|
|
|
|
|
GPU_SHADER_CREATE_END()
|
|
|
|
|
|
|
|
|
|
GPU_SHADER_CREATE_INFO(draw_curves_interpolate_float4_attribute)
|
|
|
|
|
ADDITIONAL_INFO(draw_curves_data)
|
|
|
|
|
STORAGE_BUF(POINT_ATTR_SLOT, read, StoredFloat4, attribute_float4_buf[])
|
|
|
|
|
STORAGE_BUF(EVALUATED_ATTR_SLOT, read_write, StoredFloat4, evaluated_float4_buf[])
|
|
|
|
|
COMPUTE_FUNCTION("evaluate_attribute_float4")
|
|
|
|
|
DO_STATIC_COMPILATION()
|
|
|
|
|
GPU_SHADER_CREATE_END()
|
|
|
|
|
|
|
|
|
|
GPU_SHADER_CREATE_INFO(draw_curves_interpolate_float3_attribute)
|
|
|
|
|
ADDITIONAL_INFO(draw_curves_data)
|
|
|
|
|
STORAGE_BUF(POINT_ATTR_SLOT, read, StoredFloat3, attribute_float3_buf[])
|
|
|
|
|
STORAGE_BUF(EVALUATED_ATTR_SLOT, read_write, StoredFloat3, evaluated_float3_buf[])
|
|
|
|
|
COMPUTE_FUNCTION("evaluate_attribute_float3")
|
|
|
|
|
DO_STATIC_COMPILATION()
|
|
|
|
|
GPU_SHADER_CREATE_END()
|
|
|
|
|
|
|
|
|
|
GPU_SHADER_CREATE_INFO(draw_curves_interpolate_float2_attribute)
|
|
|
|
|
ADDITIONAL_INFO(draw_curves_data)
|
|
|
|
|
STORAGE_BUF(POINT_ATTR_SLOT, read, StoredFloat2, attribute_float2_buf[])
|
|
|
|
|
STORAGE_BUF(EVALUATED_ATTR_SLOT, read_write, StoredFloat2, evaluated_float2_buf[])
|
|
|
|
|
COMPUTE_FUNCTION("evaluate_attribute_float2")
|
|
|
|
|
DO_STATIC_COMPILATION()
|
|
|
|
|
GPU_SHADER_CREATE_END()
|
|
|
|
|
|
|
|
|
|
GPU_SHADER_CREATE_INFO(draw_curves_interpolate_float_attribute)
|
|
|
|
|
ADDITIONAL_INFO(draw_curves_data)
|
|
|
|
|
STORAGE_BUF(POINT_ATTR_SLOT, read, StoredFloat, attribute_float_buf[])
|
|
|
|
|
STORAGE_BUF(EVALUATED_ATTR_SLOT, read_write, StoredFloat, evaluated_float_buf[])
|
|
|
|
|
COMPUTE_FUNCTION("evaluate_attribute_float")
|
|
|
|
|
DO_STATIC_COMPILATION()
|
|
|
|
|
GPU_SHADER_CREATE_END()
|
|
|
|
|
|
|
|
|
|
GPU_SHADER_CREATE_INFO(draw_curves_evaluate_length_intercept)
|
|
|
|
|
LOCAL_GROUP_SIZE(CURVES_PER_THREADGROUP)
|
|
|
|
|
STORAGE_BUF(EVALUATED_POINT_SLOT, read, int, evaluated_points_by_curve_buf[])
|
|
|
|
|
STORAGE_BUF(EVALUATED_POS_RAD_SLOT, read, float4, evaluated_positions_radii_buf[])
|
|
|
|
|
STORAGE_BUF(EVALUATED_TIME_SLOT, read_write, float, evaluated_time_buf[])
|
|
|
|
|
STORAGE_BUF(CURVES_LENGTH_SLOT, write, float, curves_length_buf[])
|
|
|
|
|
PUSH_CONSTANT(int, curves_start)
|
|
|
|
|
PUSH_CONSTANT(int, curves_count)
|
|
|
|
|
PUSH_CONSTANT(bool, use_cyclic)
|
|
|
|
|
COMPUTE_FUNCTION("evaluate_length_intercept")
|
|
|
|
|
COMPUTE_SOURCE("draw_curves_length_intercept_comp.glsl")
|
|
|
|
|
DO_STATIC_COMPILATION()
|
|
|
|
|
GPU_SHADER_CREATE_END()
|
|
|
|
|
|
|
|
|
|
GPU_SHADER_CREATE_INFO(draw_curves_test)
|
|
|
|
|
STORAGE_BUF(0, write, float, result_pos_buf[])
|
|
|
|
|
STORAGE_BUF(1, write, int4, result_indices_buf[])
|
|
|
|
|
VERTEX_SOURCE("draw_curves_test.glsl")
|
|
|
|
|
FRAGMENT_SOURCE("draw_curves_test.glsl")
|
|
|
|
|
ADDITIONAL_INFO(draw_curves_infos)
|
|
|
|
|
ADDITIONAL_INFO(draw_curves)
|
|
|
|
|
DO_STATIC_COMPILATION()
|
|
|
|
|
GPU_SHADER_CREATE_END()
|