368 "draw_curves_evaluate_length_intercept");
370 const int curve_resolution = 2;
380 points_by_curve_buf->
data<
int>().copy_from({0, 3, 5});
383 curves_type_buf->allocate(1);
387 curves_resolution_buf->allocate(2);
388 curves_resolution_buf->data<
int>().copy_from({curve_resolution, curve_resolution});
391 evaluated_points_by_curve_buf->allocate(3);
392 evaluated_points_by_curve_buf->data<
int>().copy_from(evaluated_offsets);
394 const Vector<float> points_radius = {1.0f, 0.5f, 0.0f, 0.0f, 2.0f};
405 positions_buf->
data<
float3>().copy_from(positions);
414 radii_buf->
data<
float>().copy_from(points_radius);
424 PassSimple pass(
"Curves Interpolation Catmull Rom");
459 evaluated_positions_radii_buf.
read();
460 evaluated_time_buf.
read();
461 curves_length_buf.
read();
492 EXPECT_FLOAT_EQ(evaluated_time_buf[0], 0.0f);
493 EXPECT_FLOAT_EQ(evaluated_time_buf[1], 0.218749985f);
494 EXPECT_FLOAT_EQ(evaluated_time_buf[2], 0.5f);
495 EXPECT_FLOAT_EQ(evaluated_time_buf[3], 0.78125f);
496 EXPECT_FLOAT_EQ(evaluated_time_buf[4], 1.0f);
497 EXPECT_FLOAT_EQ(evaluated_time_buf[5], 0.0f);
498 EXPECT_FLOAT_EQ(evaluated_time_buf[6], 0.5f);
499 EXPECT_FLOAT_EQ(evaluated_time_buf[7], 1.0f);
511 handles_positions_left_buf->
allocate(handle_pos_left.
size());
512 handles_positions_left_buf->
data<
float3>().copy_from(handle_pos_left);
516 handles_positions_right_buf->
allocate(handle_pos_right.
size());
517 handles_positions_right_buf->
data<
float3>().copy_from(handle_pos_right);
519 const Vector<int> bezier_offsets = {0, 2, 4, 5, 0, 2, 3};
524 bezier_offsets_buf->
data<
int>().copy_from(bezier_offsets);
527 curves_type_bezier_buf->
allocate(1);
538 PassSimple pass(
"Curves Interpolation Bezier");
572 evaluated_positions_radii_buf.
read();
573 evaluated_time_buf.
read();
574 curves_length_buf.
read();
583 const int curve_index = 0;
589 positions.
as_span().slice(points),
590 handle_pos_left.
as_span().slice(points),
591 handle_pos_right.
as_span().slice(points),
592 bezier_offsets.
as_span().slice(offsets),
596 points_radius.
as_span().slice(points),
597 bezier_offsets.
as_span().slice(offsets),
601 const int curve_index = 1;
607 positions.
as_span().slice(points),
608 handle_pos_left.
as_span().slice(points),
609 handle_pos_right.
as_span().slice(points),
610 bezier_offsets.
as_span().slice(offsets),
614 points_radius.
as_span().slice(points),
615 bezier_offsets.
as_span().slice(offsets),
619 EXPECT_EQ(evaluated_positions_radii_buf[0],
float4(interp_pos[0], interp_rad[0]));
620 EXPECT_EQ(evaluated_positions_radii_buf[1],
float4(interp_pos[1], interp_rad[1]));
621 EXPECT_EQ(evaluated_positions_radii_buf[2],
float4(interp_pos[2], interp_rad[2]));
622 EXPECT_EQ(evaluated_positions_radii_buf[3],
float4(interp_pos[3], interp_rad[3]));
623 EXPECT_EQ(evaluated_positions_radii_buf[4],
float4(interp_pos[4], interp_rad[4]));
624 EXPECT_EQ(evaluated_positions_radii_buf[5],
float4(interp_pos[5], interp_rad[5]));
625 EXPECT_EQ(evaluated_positions_radii_buf[6],
float4(interp_pos[6], interp_rad[6]));
626 EXPECT_EQ(evaluated_positions_radii_buf[7],
float4(interp_pos[7], interp_rad[7]));
630 float curve_len[2] = {0.0f, 0.0f};
633 interp_time[0] = 0.0f;
636 interp_time[
i] = curve_len[0];
639 interp_time[
i] /= curve_len[0];
641 interp_time[5] = 0.0f;
644 interp_time[
i] = curve_len[1];
647 interp_time[
i] /= curve_len[1];
650 EXPECT_FLOAT_EQ(curves_length_buf[0], curve_len[0]);
651 EXPECT_FLOAT_EQ(curves_length_buf[1], curve_len[1]);
653 EXPECT_FLOAT_EQ(evaluated_time_buf[0], interp_time[0]);
654 EXPECT_FLOAT_EQ(evaluated_time_buf[1], interp_time[1]);
655 EXPECT_FLOAT_EQ(evaluated_time_buf[2], interp_time[2]);
656 EXPECT_FLOAT_EQ(evaluated_time_buf[3], interp_time[3]);
657 EXPECT_FLOAT_EQ(evaluated_time_buf[4], interp_time[4]);
658 EXPECT_FLOAT_EQ(evaluated_time_buf[5], interp_time[5]);
659 EXPECT_FLOAT_EQ(evaluated_time_buf[6], interp_time[6]);
660 EXPECT_FLOAT_EQ(evaluated_time_buf[7], interp_time[7]);
666 {0.1f, 0.2f, 0.4f, 0.5f, 0.6f, 0.7f, 0.8f, 0.9f, 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f},
671 {0.6f, 0.7f, 0.8f, 0.9f, 1.0f, 2.0f},
679 basis_cache_offset.
append(basis_cache_c0.
invalid ? -1 : basis_cache_packed.
size());
680 basis_cache_packed.
extend(
683 basis_cache_packed.
extend(
684 Span{
reinterpret_cast<const uint32_t *
>(basis_cache_c0.
weights.
data()),
687 basis_cache_offset.
append(basis_cache_c1.
invalid ? -1 : basis_cache_packed.
size());
688 basis_cache_packed.
extend(
691 basis_cache_packed.
extend(
692 Span{
reinterpret_cast<const uint32_t *
>(basis_cache_c1.
weights.
data()),
700 basis_cache_buf->
data<
uint>().copy_from(basis_cache_packed);
704 basis_cache_offset_buf->
allocate(basis_cache_offset.
size());
705 basis_cache_offset_buf->
data<
int>().copy_from(basis_cache_offset);
712 curves_order_buf->
data<
int>().copy_from(
713 Span<int>(
reinterpret_cast<const int *
>(curves_order.
data()), curves_order.
size() / 4));
715 const Vector<float> control_weights = {1.0f, 2.0f, 3.0f, 4.0f, 5.0f};
719 control_weights_buf->
data<
float>().copy_from(control_weights);
733 PassSimple pass(
"Curves Interpolation Nurbs");
769 evaluated_positions_radii_buf.
read();
770 evaluated_time_buf.
read();
771 curves_length_buf.
read();
780 const int curve_index = 0;
786 curves_order[curve_index],
787 control_weights.
as_span().slice(points),
788 positions.
as_span().slice(points),
793 curves_order[curve_index],
794 control_weights.
as_span().slice(points),
795 points_radius.
as_span().slice(points),
799 const int curve_index = 1;
805 curves_order[curve_index],
806 control_weights.
as_span().slice(points),
807 positions.
as_span().slice(points),
812 curves_order[curve_index],
813 control_weights.
as_span().slice(points),
814 points_radius.
as_span().slice(points),
818 EXPECT_NEAR(evaluated_positions_radii_buf[0].
x, interp_pos[0].
x, 0.000001f);
819 EXPECT_NEAR(evaluated_positions_radii_buf[1].
x, interp_pos[1].
x, 0.000001f);
820 EXPECT_NEAR(evaluated_positions_radii_buf[2].
x, interp_pos[2].
x, 0.000001f);
821 EXPECT_NEAR(evaluated_positions_radii_buf[3].
x, interp_pos[3].
x, 0.000001f);
822 EXPECT_NEAR(evaluated_positions_radii_buf[4].
x, interp_pos[4].
x, 0.000001f);
823 EXPECT_NEAR(evaluated_positions_radii_buf[5].
x, interp_pos[5].
x, 0.000001f);
824 EXPECT_NEAR(evaluated_positions_radii_buf[6].
x, interp_pos[6].
x, 0.000001f);
825 EXPECT_NEAR(evaluated_positions_radii_buf[7].
x, interp_pos[7].
x, 0.000001f);
827 EXPECT_NEAR(evaluated_positions_radii_buf[0].
w, interp_rad[0], 0.000001f);
828 EXPECT_NEAR(evaluated_positions_radii_buf[1].
w, interp_rad[1], 0.000001f);
829 EXPECT_NEAR(evaluated_positions_radii_buf[2].
w, interp_rad[2], 0.000001f);
830 EXPECT_NEAR(evaluated_positions_radii_buf[3].
w, interp_rad[3], 0.000001f);
831 EXPECT_NEAR(evaluated_positions_radii_buf[4].
w, interp_rad[4], 0.000001f);
832 EXPECT_NEAR(evaluated_positions_radii_buf[5].
w, interp_rad[5], 0.000001f);
833 EXPECT_NEAR(evaluated_positions_radii_buf[6].
w, interp_rad[6], 0.000001f);
834 EXPECT_NEAR(evaluated_positions_radii_buf[7].
w, interp_rad[7], 0.000001f);
838 float curve_len[2] = {0.0f, 0.0f};
841 interp_time[0] = 0.0f;
844 interp_time[
i] = curve_len[0];
847 interp_time[
i] /= curve_len[0];
849 interp_time[5] = 0.0f;
852 interp_time[
i] = curve_len[1];
855 interp_time[
i] /= curve_len[1];
858 EXPECT_NEAR(curves_length_buf[0], curve_len[0], 0.000001f);
859 EXPECT_NEAR(curves_length_buf[1], curve_len[1], 0.000001f);
861 EXPECT_EQ(evaluated_time_buf[0], interp_time[0]);
862 EXPECT_NEAR(evaluated_time_buf[1], interp_time[1], 0.000001f);
863 EXPECT_NEAR(evaluated_time_buf[2], interp_time[2], 0.000001f);
864 EXPECT_NEAR(evaluated_time_buf[3], interp_time[3], 0.000001f);
865 EXPECT_NEAR(evaluated_time_buf[4], interp_time[4], 0.000001f);
866 EXPECT_EQ(evaluated_time_buf[5], interp_time[5]);
867 EXPECT_NEAR(evaluated_time_buf[6], interp_time[6], 0.000001f);
868 EXPECT_NEAR(evaluated_time_buf[7], interp_time[7], 0.000001f);
899 const int curve_resolution = 2;
902 const Vector<int> evaluated_offsets = {0, 5, 8, 11};
910 points_by_curve_buf->
data<
int>().copy_from(curves_to_point);
914 curves_type_buf->
data<
char>().copy_from(
918 curves_resolution_buf->allocate(3);
919 curves_resolution_buf->data<
int>().copy_from(
920 {curve_resolution, curve_resolution, curve_resolution});
923 evaluated_points_by_curve_buf->allocate(evaluated_offsets.
size());
924 evaluated_points_by_curve_buf->data<
int>().copy_from(evaluated_offsets);
929 float4(0.5f, 0.0f, 0.0f, 4.0f),
930 float4(0.0f, 0.0f, 2.0f, 4.0f),
931 float4(2.0f, 3.0f, 4.0f, 7.0f),
932 float4(3.0f, 4.0f, 3.0f, 4.0f),
933 float4(2.0f, 2.0f, 3.0f, 4.0f),
934 float4(4.0f, 5.0f, 6.0f, 7.0f)};
936 attr_float4.
as_span().cast<
float>().take_front(attr_float4.
size() * 3).cast<
float3>();
938 attr_float4.
as_span().cast<
float>().take_front(attr_float4.
size() * 2).cast<
float2>();
948 attribute_float4_buf->
data<
float4>().copy_from(attr_float4);
956 attribute_float3_buf->
data<
float3>().copy_from(attr_float3);
964 attribute_float2_buf->
data<
float2>().copy_from(attr_float2);
972 attribute_float_buf->
data<
float>().copy_from(attr_float);
977 {0.1f, 0.2f, 0.4f, 0.5f, 0.6f, 0.7f, 0.8f, 0.9f, 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f},
985 basis_cache_offset.
append(basis_cache_c0.
invalid ? -1 : basis_cache_packed.
size());
986 basis_cache_packed.
extend(
989 basis_cache_packed.
extend(
990 Span{
reinterpret_cast<const uint32_t *
>(basis_cache_c0.
weights.
data()),
993 basis_cache_offset.
append(-1);
994 basis_cache_offset.
append(-1);
1000 basis_cache_buf->
data<
uint>().copy_from(basis_cache_packed);
1003 basis_cache_offset_buf->
allocate(basis_cache_offset.
size());
1004 basis_cache_offset_buf->
data<
int>().copy_from(basis_cache_offset);
1010 curves_order_buf->
data<
int>().copy_from(
1011 Span<int>(
reinterpret_cast<const int *
>(curves_order.
data()), curves_order.
size() / 4));
1013 const Vector<float> control_weights = {1.0f, 2.0f, 3.0f, 4.0f, 5.0f};
1017 control_weights_buf->
data<
float>().copy_from(control_weights);
1027 handles_positions_left_buf->
allocate(handle_pos_left.
size());
1028 handles_positions_left_buf->
data<
float3>().copy_from(handle_pos_left);
1031 handles_positions_right_buf->
allocate(handle_pos_right.
size());
1032 handles_positions_right_buf->
data<
float3>().copy_from(handle_pos_right);
1034 const Vector<int> bezier_offsets = {0, 2, 4, 5, 0, 2, 3};
1038 bezier_offsets_buf->
data<
int>().copy_from(bezier_offsets);
1042 std::string pass_name = std::string(
"Curves ") + attr_type +
" Interpolation";
1043 std::string sh_name = std::string(
"draw_curves_interpolate_") + attr_type +
"_attribute";
1101 dispatch(
"float4", attribute_float4_buf, evaluated_float4_buf);
1103 evaluated_float4_buf.
read();
1113 const int curve_index = 0;
1114 const IndexRange points = curves_to_point_indices[curve_index];
1115 const IndexRange evaluated_points = curves_to_eval_indices[curve_index];
1117 curves_order[curve_index],
1118 control_weights.
as_span().slice(points),
1119 in_attr.
slice(points),
1120 out_attr.
slice(evaluated_points));
1123 const int curve_index = 1;
1124 const IndexRange points = curves_to_point_indices[curve_index];
1125 const IndexRange evaluated_points = curves_to_eval_indices[curve_index];
1128 bezier_offsets.
as_span().slice(offsets),
1129 out_attr.slice(evaluated_points));
1132 const int curve_index = 2;
1133 const IndexRange points = curves_to_point_indices[curve_index];
1134 const IndexRange evaluated_points = curves_to_eval_indices[curve_index];
1136 in_attr.
slice(points),
false, curve_resolution, out_attr.
slice(evaluated_points));
1158 dispatch(
"float3", attribute_float3_buf, evaluated_float3_buf);
1160 evaluated_float3_buf.
read();
1170 const int curve_index = 0;
1171 const IndexRange points = curves_to_point_indices[curve_index];
1172 const IndexRange evaluated_points = curves_to_eval_indices[curve_index];
1174 curves_order[curve_index],
1175 control_weights.
as_span().slice(points),
1176 in_attr.
slice(points),
1177 out_attr.
slice(evaluated_points));
1180 const int curve_index = 1;
1181 const IndexRange points = curves_to_point_indices[curve_index];
1182 const IndexRange evaluated_points = curves_to_eval_indices[curve_index];
1185 bezier_offsets.
as_span().slice(offsets),
1186 out_attr.
slice(evaluated_points));
1189 const int curve_index = 2;
1190 const IndexRange points = curves_to_point_indices[curve_index];
1191 const IndexRange evaluated_points = curves_to_eval_indices[curve_index];
1193 in_attr.
slice(points),
false, curve_resolution, out_attr.
slice(evaluated_points));
1215 dispatch(
"float2", attribute_float2_buf, evaluated_float2_buf);
1217 evaluated_float2_buf.
read();
1227 const int curve_index = 0;
1228 const IndexRange points = curves_to_point_indices[curve_index];
1229 const IndexRange evaluated_points = curves_to_eval_indices[curve_index];
1231 curves_order[curve_index],
1232 control_weights.
as_span().slice(points),
1233 in_attr.
slice(points),
1234 out_attr.
slice(evaluated_points));
1237 const int curve_index = 1;
1238 const IndexRange points = curves_to_point_indices[curve_index];
1239 const IndexRange evaluated_points = curves_to_eval_indices[curve_index];
1242 bezier_offsets.
as_span().slice(offsets),
1243 out_attr.
slice(evaluated_points));
1246 const int curve_index = 2;
1247 const IndexRange points = curves_to_point_indices[curve_index];
1248 const IndexRange evaluated_points = curves_to_eval_indices[curve_index];
1250 in_attr.
slice(points),
false, curve_resolution, out_attr.
slice(evaluated_points));
1272 dispatch(
"float", attribute_float_buf, evaluated_float_buf);
1274 evaluated_float_buf.
read();
1284 const int curve_index = 0;
1285 const IndexRange points = curves_to_point_indices[curve_index];
1286 const IndexRange evaluated_points = curves_to_eval_indices[curve_index];
1288 curves_order[curve_index],
1289 control_weights.
as_span().slice(points),
1290 in_attr.
slice(points),
1291 out_attr.
slice(evaluated_points));
1294 const int curve_index = 1;
1295 const IndexRange points = curves_to_point_indices[curve_index];
1296 const IndexRange evaluated_points = curves_to_eval_indices[curve_index];
1299 bezier_offsets.
as_span().slice(offsets),
1300 out_attr.
slice(evaluated_points));
1303 const int curve_index = 2;
1304 const IndexRange points = curves_to_point_indices[curve_index];
1305 const IndexRange evaluated_points = curves_to_eval_indices[curve_index];
1307 in_attr.
slice(points),
false, curve_resolution, out_attr.
slice(evaluated_points));
1310 EXPECT_EQ(evaluated_float_buf[0],
float(interp_data[0]));
1311 EXPECT_EQ(evaluated_float_buf[1],
float(interp_data[1]));
1312 EXPECT_EQ(evaluated_float_buf[2],
float(interp_data[2]));
1313 EXPECT_EQ(evaluated_float_buf[3],
float(interp_data[3]));
1314 EXPECT_EQ(evaluated_float_buf[4],
float(interp_data[4]));
1315 EXPECT_EQ(evaluated_float_buf[5],
float(interp_data[5]));
1316 EXPECT_EQ(evaluated_float_buf[6],
float(interp_data[6]));
1317 EXPECT_EQ(evaluated_float_buf[7],
float(interp_data[7]));
1318 EXPECT_EQ(evaluated_float_buf[8],
float(interp_data[8]));
1319 EXPECT_EQ(evaluated_float_buf[9],
float(interp_data[9]));
1320 EXPECT_EQ(evaluated_float_buf[10],
float(interp_data[10]));
1322 EXPECT_EQ(evaluated_float_buf[11],
float(0.0));