242 constexpr float no_active_weight = 666.0f;
246 grease_pencil.
runtime->batch_cache);
258 const char *active_defgroup_name = (active_defgroup ==
nullptr) ?
"" : active_defgroup->
name;
267 if (format_points_pos.
attr_len == 0) {
272 if (format_points_weight.
attr_len == 0) {
280 int visible_points_num = 0;
281 int total_line_ids_num = 0;
282 int total_points_num = 0;
288 if (total_points_num == 0) {
298 int drawing_start_offset = 0;
300 const Layer &layer = *layers[info.layer_index];
301 const float4x4 layer_space_to_object_space = layer.to_object_space(
object);
307 object, info.drawing, memory);
309 const IndexRange points(drawing_start_offset, curves.points_num());
313 copy_transformed_positions(positions, range, layer_space_to_object_space, positions_slice);
317 const VArray<float> weights = *curves.attributes().lookup_or_default<
float>(
322 drawing_start_offset += curves.points_num();
325 total_line_ids_num += visible_strokes.
size();
329 total_line_ids_num += std::accumulate(
330 size_per_editable_stroke.
begin(), size_per_editable_stroke.
end(), 0);
335 if (layer.is_locked()) {
340 const IndexRange points = points_by_curve[curve_i];
341 visible_points_num += points.
size();
358 drawing_start_offset = 0;
360 const Layer *layer = layers[info.layer_index];
366 object, info.drawing, memory);
370 const IndexRange points = points_by_curve[curve_i];
373 for (
const int point_i : points) {
385 if (!layer->is_locked()) {
387 const IndexRange points = points_by_curve[curve_i];
388 for (
const int point : points) {
394 drawing_start_offset += curves.points_num();
685 grease_pencil.
runtime->batch_cache);
701 if (format_edit_points_pos.
attr_len == 0) {
706 if (format_edit_line_pos.
attr_len == 0) {
711 if (format_edit_points_selection.
attr_len == 0) {
717 if (format_edit_points_vflag.
attr_len == 0) {
722 if (format_edit_line_selection.
attr_len == 0) {
736 int total_points_num = 0;
738 const Layer &layer = *layers[info.layer_index];
740 if (layer.is_locked()) {
748 int total_line_points_num = 0;
754 int total_bezier_point_num = 0;
758 object, info.drawing, info.layer_index, memory);
760 total_bezier_point_num += bezier_points.
size();
766 object, info.drawing, info.layer_index, memory);
769 total_line_points_num += nurbs_points.
size();
773 total_points_num += total_bezier_point_num * 2;
775 total_line_points_num += total_bezier_point_num * 3;
777 if (total_points_num == 0) {
792 edit_points_selection.fill(0.0f);
793 edit_points_vflag.fill(0);
794 edit_line_selection.fill(0.0f);
796 int visible_points_num = 0;
797 int total_line_ids_num = 0;
798 int drawing_start_offset = 0;
799 int drawing_line_start_offset = 0;
801 const Layer &layer = *layers[info.layer_index];
802 const float4x4 layer_space_to_object_space = layer.to_object_space(
object);
809 object, info.drawing, memory);
811 const IndexRange points(drawing_start_offset, curves.points_num());
812 const IndexRange points_eval(drawing_line_start_offset, curves.evaluated_points_num());
815 if (!layer.is_locked()) {
818 copy_transformed_positions(positions, range, layer_space_to_object_space, positions_slice);
822 const Span<float3> positions_eval = curves.evaluated_positions();
827 copy_transformed_positions(
828 positions_eval, range, layer_space_to_object_space, positions_eval_slice);
832 if (!layer.is_locked()) {
835 for (
const int curve_i : curves.curves_range()) {
836 const IndexRange points = points_by_curve[curve_i].shift(drawing_start_offset);
841 const IndexMask selected_editable_points =
843 object, info.drawing, info.layer_index, memory);
855 curves.ensure_can_interpolate_to_evaluated();
856 curves.interpolate_to_evaluated(selection_slice.
as_span(), line_selection_slice);
860 drawing_line_start_offset += curves.evaluated_points_num();
863 total_line_ids_num += visible_strokes_for_lines.
size();
864 Array<int> size_per_editable_stroke(visible_strokes_for_lines.
size());
866 points_by_curve_eval, visible_strokes_for_lines, size_per_editable_stroke);
868 total_line_ids_num += std::accumulate(
869 size_per_editable_stroke.
begin(), size_per_editable_stroke.
end(), 0);
874 if (layer.is_locked()) {
878 drawing_start_offset += curves.points_num();
879 const IndexMask selected_editable_strokes =
881 object, info.drawing, info.layer_index, memory);
883 Array<int> size_per_selected_editable_stroke(selected_editable_strokes.
size());
885 points_by_curve, selected_editable_strokes, size_per_selected_editable_stroke);
888 visible_points_num += std::accumulate(
889 size_per_selected_editable_stroke.
begin(), size_per_selected_editable_stroke.
end(), 0);
891 const VArray<float> selected_point = *curves.attributes().lookup_or_default<
float>(
899 layer_space_to_object_space,
902 &drawing_line_start_offset,
903 &total_line_ids_num);
906 object, info.drawing, info.layer_index, memory);
913 bezier_points.
size());
918 const Span<float3> handles_left = curves.handle_positions_left();
919 const Span<float3> handles_right = curves.handle_positions_right();
927 copy_transformed_positions(
928 positions_slice_left, range, layer_space_to_object_space, positions_slice_left);
929 copy_transformed_positions(
930 positions_slice_right, range, layer_space_to_object_space, positions_slice_right);
933 const VArray<float> selected_left = *curves.attributes().lookup_or_default<
float>(
935 const VArray<float> selected_right = *curves.attributes().lookup_or_default<
float>(
945 drawing_line_start_offset + bezier_points.
size(), bezier_points.
size());
947 drawing_line_start_offset + bezier_points.
size() * 2, bezier_points.
size());
961 copy_transformed_positions(positions_eval_center_slice,
963 layer_space_to_object_space,
964 positions_eval_center_slice);
976 visible_points_num += bezier_points.
size() * 2;
977 drawing_start_offset += bezier_points.
size() * 2;
980 drawing_line_start_offset += bezier_points.
size() * 3;
981 total_line_ids_num += bezier_points.
size() * 3;
984 total_line_ids_num += bezier_points.
size();
1000 drawing_start_offset = 0;
1001 drawing_line_start_offset = 0;
1003 const Layer *layer = layers[info.layer_index];
1007 object, info.drawing, info.layer_index, &elb, memory, &drawing_line_start_offset);
1009 if (!layer->is_locked()) {
1011 object, info.drawing, info.layer_index, &elb, memory, &drawing_line_start_offset);
1013 object, info.drawing, info.layer_index, &elb, memory, &drawing_line_start_offset);
1015 object, info.drawing, info.layer_index, &epb, memory, &drawing_start_offset);
1017 object, info.drawing, info.layer_index, &epb, memory, &drawing_start_offset);
1063 grease_pencil.
runtime->batch_cache);
1065 if (cache->
vbo !=
nullptr) {
1079 int total_verts_num = 0;
1080 int total_triangles_num = 0;
1090 object, info.drawing, memory);
1092 const int num_curves = visible_strokes.
size();
1093 const int verts_start_offsets_size = num_curves;
1094 const int tris_start_offsets_size = num_curves;
1095 Array<int> verts_start_offsets(verts_start_offsets_size);
1096 Array<int> tris_start_offsets(tris_start_offsets_size);
1101 for (
const int curve_i : curves.curves_range()) {
1102 IndexRange points = points_by_curve[curve_i];
1103 if (visible_strokes.
contains(curve_i)) {
1104 tris_start_offsets[
pos] = t_offset;
1107 if (points.size() >= 3) {
1108 t_offset += points.
size() - 2;
1116 IndexRange points = points_by_curve[curve_i];
1117 const bool is_cyclic = cyclic[curve_i] && (points.size() > 2);
1123 verts_start_offsets[
pos] = v_offset;
1125 num_points += points.size();
1129 total_verts_num += num_points + num_cyclic + num_curves * 2;
1130 total_triangles_num += (num_points + num_cyclic) * 2;
1131 total_triangles_num += info.drawing.triangles().size();
1133 verts_start_offsets_per_visible_drawing.
append(std::move(verts_start_offsets));
1134 tris_start_offsets_per_visible_drawing.
append(std::move(tris_start_offsets));
1154 for (
const int drawing_i : drawings.
index_range()) {
1157 const float4x4 layer_space_to_object_space = layer.to_object_space(
object);
1160 if (curves.evaluated_points_num() == 0) {
1166 const Span<float3> positions = curves.evaluated_positions();
1169 curves.ensure_can_interpolate_to_evaluated();
1181 const VArray<float> selection_float = *attributes.lookup_or_default<
float>(
1187 const VArray<float> stroke_softness = *attributes.lookup_or_default<
float>(
1189 const VArray<float> stroke_point_aspect_ratios = *attributes.lookup_or_default<
float>(
1192 const VArray<int> materials = *attributes.lookup_or_default<
int>(
1194 const VArray<float> u_translations = *attributes.lookup_or_default<
float>(
1196 const VArray<float> u_scales = *attributes.lookup_or_default<
float>(
1198 const VArray<float> fill_opacities = *attributes.lookup_or_default<
float>(
1203 const Span<int> verts_start_offsets = verts_start_offsets_per_visible_drawing[drawing_i];
1204 const Span<int> tris_start_offsets = tris_start_offsets_per_visible_drawing[drawing_i];
1207 object, info.
drawing, memory);
1209 curves.ensure_evaluated_lengths();
1211 auto populate_point = [&](
IndexRange verts_range,
1225 s_vert.radius =
math::max(radii[point_i], 0.0f) *
1230 s_vert.opacity = opacities[point_i] *
1232 s_vert.point_id = verts_range[idx];
1233 s_vert.stroke_id = verts_range.
first();
1237 rotations[point_i], stroke_point_aspect_ratios[curve_i], stroke_softness[curve_i]);
1238 s_vert.u_stroke = u_stroke;
1241 copy_v4_v4(c_vert.vcol, vertex_colors[point_i]);
1242 copy_v4_v4(c_vert.fcol, stroke_fill_colors[curve_i]);
1243 c_vert.fcol[3] = (
int(c_vert.fcol[3] * 10000.0f) * 10.0f) + fill_opacities[curve_i];
1251 const IndexRange points = points_by_curve[curve_i];
1252 const bool is_cyclic = cyclic[curve_i] && (points.size() > 2);
1253 const int verts_start_offset = verts_start_offsets[
pos];
1254 const int tris_start_offset = tris_start_offsets[
pos];
1255 const int num_verts = 1 + points.
size() + (
is_cyclic ? 1 : 0) + 1;
1259 const float4x2 texture_matrix = texture_matrices[curve_i] * object_space_to_layer_space;
1261 const Span<float> lengths = curves.evaluated_lengths_for_curve(curve_i, cyclic[curve_i]);
1264 verts_slice.
first().mat = -1;
1267 if (points.size() >= 3) {
1268 const Span<uint3> tris_slice = triangles.
slice(tris_start_offset, points.size() - 2);
1269 for (
const uint3 tri : tris_slice) {
1278 const float u_scale = u_scales[curve_i];
1279 const float u_translation = u_translations[curve_i];
1280 for (
const int i :
IndexRange(points.size())) {
1281 const int idx = i + 1;
1282 const float u_stroke = u_scale * (i > 0 ? lengths[i - 1] : 0.0f) + u_translation;
1283 populate_point(verts_range,
1285 start_caps[curve_i],
1296 const int idx = points.size() + 1;
1297 const float u = points.size() > 1 ? lengths[points.size() - 1] : 0.0f;
1298 const float u_stroke = u_scale * u + u_translation;
1299 populate_point(verts_range,
1301 start_caps[curve_i],
1312 verts_slice.
last().mat = -1;
1317 verts[total_verts_num + 0].mat = -1;
1318 verts[total_verts_num + 1].mat = -1;