diff --git a/ink/geometry/internal/jni/BUILD.bazel b/ink/geometry/internal/jni/BUILD.bazel index fbc7e6bc..1140f4dc 100644 --- a/ink/geometry/internal/jni/BUILD.bazel +++ b/ink/geometry/internal/jni/BUILD.bazel @@ -25,9 +25,8 @@ cc_library( deps = [ ":affine_transform_jni", ":angle_jni", - ":box_accumulator_jni", ":box_jni", - ":intersects_jni", + ":intersection_jni", ":mesh_format_jni", ":mesh_jni", ":parallelogram_jni", @@ -51,6 +50,7 @@ cc_library( ":affine_transform_native", ":angle_native", ":box_native", + ":intersection_native", ":mesh_format_native", ":mesh_native", ":parallelogram_native", @@ -86,30 +86,36 @@ cc_library( ) cc_library( - name = "intersects_jni", - srcs = ["intersects_jni.cc"], + name = "intersection_jni", + srcs = ["intersection_jni.cc"], tags = ["keep_dep"], + deps = [ + ":intersection_native", + "//ink/jni/internal:jni_defines", + ] + select({ + "@platforms//os:android": [], + "//conditions:default": [ + "@rules_jni//jni", + ], + }), + alwayslink = 1, +) + +cc_library( + name = "intersection_native", + srcs = ["intersection_native.cc"], + hdrs = ["intersection_native.h"], deps = [ ":partitioned_mesh_native_helper", "//ink/geometry:affine_transform", "//ink/geometry:angle", "//ink/geometry:intersects", - "//ink/geometry:mesh", - "//ink/geometry:partitioned_mesh", "//ink/geometry:point", "//ink/geometry:quad", "//ink/geometry:rect", "//ink/geometry:segment", "//ink/geometry:triangle", - "//ink/jni/internal:jni_defines", - "@com_google_absl//absl/log:absl_check", - "@com_google_absl//absl/types:span", - ] + select({ - "@platforms//os:android": [], - "//conditions:default": [ - "@rules_jni//jni", - ], - }), + ], alwayslink = 1, ) @@ -188,22 +194,15 @@ cc_library( deps = [ ":mesh_format_native_helper", ":mesh_native_helper", - "//ink/geometry:envelope", "//ink/geometry:mesh", "//ink/geometry:mesh_format", "//ink/geometry:mesh_packing_types", "//ink/geometry:point", "//ink/geometry:rect", - "//ink/jni/internal:jni_defines", "@com_google_absl//absl/base", "@com_google_absl//absl/log:absl_check", "@com_google_absl//absl/types:span", - ] + select({ - "@platforms//os:android": [], - "//conditions:default": [ - "@rules_jni//jni", - ], - }), + ], alwayslink = 1, ) @@ -221,29 +220,6 @@ cc_library( }), ) -cc_library( - name = "box_accumulator_jni", - srcs = ["box_accumulator_jni.cc"], - tags = ["keep_dep"], - deps = [ - ":box_accumulator_jni_helper", - "//ink/geometry:angle", - "//ink/geometry:envelope", - "//ink/geometry:point", - "//ink/geometry:quad", - "//ink/geometry:rect", - "//ink/geometry:segment", - "//ink/geometry:triangle", - "//ink/jni/internal:jni_defines", - ] + select({ - "@platforms//os:android": [], - "//conditions:default": [ - "@rules_jni//jni", - ], - }), - alwayslink = 1, -) - cc_library( name = "mesh_format_jni", srcs = ["mesh_format_jni.cc"], diff --git a/ink/geometry/internal/jni/box_accumulator_jni.cc b/ink/geometry/internal/jni/box_accumulator_jni.cc deleted file mode 100644 index 7b98727d..00000000 --- a/ink/geometry/internal/jni/box_accumulator_jni.cc +++ /dev/null @@ -1,132 +0,0 @@ -// Copyright 2024 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#include - -#include "ink/geometry/angle.h" -#include "ink/geometry/envelope.h" -#include "ink/geometry/internal/jni/box_accumulator_jni_helper.h" -#include "ink/geometry/point.h" -#include "ink/geometry/quad.h" -#include "ink/geometry/rect.h" -#include "ink/geometry/segment.h" -#include "ink/geometry/triangle.h" -#include "ink/jni/internal/jni_defines.h" - -namespace { - -using ::ink::Angle; -using ::ink::Envelope; -using ::ink::Point; -using ::ink::Quad; -using ::ink::Rect; -using ::ink::Segment; -using ::ink::Triangle; -using ::ink::jni::FillJBoxAccumulatorOrThrow; - -Envelope BuildEnvelopeFromBounds(jboolean envelope_has_bounds, - jfloat envelope_bounds_x_min, - jfloat envelope_bounds_y_min, - jfloat envelope_bounds_x_max, - jfloat envelope_bounds_y_max) { - return (envelope_has_bounds - ? Envelope(Rect::FromTwoPoints( - {envelope_bounds_x_min, envelope_bounds_y_min}, - {envelope_bounds_x_max, envelope_bounds_y_max})) - : Envelope()); -} - -} // namespace - -extern "C" { - -JNI_METHOD(geometry, BoxAccumulatorNative, void, addSegment) -(JNIEnv* env, jobject object, jboolean envelope_has_bounds, - jfloat envelope_bounds_x_min, jfloat envelope_bounds_y_min, - jfloat envelope_bounds_x_max, jfloat envelope_bounds_y_max, - jfloat segment_start_x, jfloat segment_start_y, jfloat segment_end_x, - jfloat segment_end_y, jobject output) { - Envelope envelope = BuildEnvelopeFromBounds( - envelope_has_bounds, envelope_bounds_x_min, envelope_bounds_y_min, - envelope_bounds_x_max, envelope_bounds_y_max); - Segment segment{{segment_start_x, segment_start_y}, - {segment_end_x, segment_end_y}}; - envelope.Add(segment); - FillJBoxAccumulatorOrThrow(env, envelope, output); -} - -JNI_METHOD(geometry, BoxAccumulatorNative, void, addTriangle) -(JNIEnv* env, jobject object, jboolean envelope_has_bounds, - jfloat envelope_bounds_x_min, jfloat envelope_bounds_y_min, - jfloat envelope_bounds_x_max, jfloat envelope_bounds_y_max, - jfloat triangle_p0_x, jfloat triangle_p0_y, jfloat triangle_p1_x, - jfloat triangle_p1_y, jfloat triangle_p2_x, jfloat triangle_p2_y, - jobject output) { - Envelope envelope = BuildEnvelopeFromBounds( - envelope_has_bounds, envelope_bounds_x_min, envelope_bounds_y_min, - envelope_bounds_x_max, envelope_bounds_y_max); - Triangle triangle{{triangle_p0_x, triangle_p0_y}, - {triangle_p1_x, triangle_p1_y}, - {triangle_p2_x, triangle_p2_y}}; - envelope.Add(triangle); - FillJBoxAccumulatorOrThrow(env, envelope, output); -} - -JNI_METHOD(geometry, BoxAccumulatorNative, void, addParallelogram) -(JNIEnv* env, jobject object, jboolean envelope_has_bounds, - jfloat envelope_bounds_x_min, jfloat envelope_bounds_y_min, - jfloat envelope_bounds_x_max, jfloat envelope_bounds_y_max, - jfloat quad_center_x, jfloat quad_center_y, jfloat quad_width, - jfloat quad_height, jfloat quad_angle_radian, jfloat quad_shear_factor, - jobject output) { - Envelope envelope = BuildEnvelopeFromBounds( - envelope_has_bounds, envelope_bounds_x_min, envelope_bounds_y_min, - envelope_bounds_x_max, envelope_bounds_y_max); - Quad quad = Quad::FromCenterDimensionsRotationAndSkew( - Point{quad_center_x, quad_center_y}, quad_width, quad_height, - Angle::Radians(quad_angle_radian), quad_shear_factor); - envelope.Add(quad); - FillJBoxAccumulatorOrThrow(env, envelope, output); -} - -JNI_METHOD(geometry, BoxAccumulatorNative, void, addPoint) -(JNIEnv* env, jobject object, jboolean envelope_has_bounds, - jfloat envelope_bounds_x_min, jfloat envelope_bounds_y_min, - jfloat envelope_bounds_x_max, jfloat envelope_bounds_y_max, jfloat point_x, - jfloat point_y, jobject output) { - Envelope envelope = BuildEnvelopeFromBounds( - envelope_has_bounds, envelope_bounds_x_min, envelope_bounds_y_min, - envelope_bounds_x_max, envelope_bounds_y_max); - Point point = Point{point_x, point_y}; - envelope.Add(point); - FillJBoxAccumulatorOrThrow(env, envelope, output); -} - -JNI_METHOD(geometry, BoxAccumulatorNative, void, addOptionalBox) -(JNIEnv* env, jobject object, jboolean envelope_has_bounds, - jfloat envelope_bounds_x_min, jfloat envelope_bounds_y_min, - jfloat envelope_bounds_x_max, jfloat envelope_bounds_y_max, - jboolean box_has_bounds, jfloat box_x_min, jfloat box_y_min, jfloat box_x_max, - jfloat box_y_max, jobject output) { - if (!box_has_bounds) return; - Envelope envelope = BuildEnvelopeFromBounds( - envelope_has_bounds, envelope_bounds_x_min, envelope_bounds_y_min, - envelope_bounds_x_max, envelope_bounds_y_max); - Rect rect = - ink::Rect::FromTwoPoints({box_x_min, box_y_min}, {box_x_max, box_y_max}); - envelope.Add(rect); - FillJBoxAccumulatorOrThrow(env, envelope, output); -} - -} // extern "C" diff --git a/ink/geometry/internal/jni/intersects_jni.cc b/ink/geometry/internal/jni/intersection_jni.cc similarity index 51% rename from ink/geometry/internal/jni/intersects_jni.cc rename to ink/geometry/internal/jni/intersection_jni.cc index 81a80c9b..4dc7a05c 100644 --- a/ink/geometry/internal/jni/intersects_jni.cc +++ b/ink/geometry/internal/jni/intersection_jni.cc @@ -14,61 +14,34 @@ #include -#include "ink/geometry/affine_transform.h" -#include "ink/geometry/angle.h" -#include "ink/geometry/internal/jni/partitioned_mesh_native_helper.h" -#include "ink/geometry/intersects.h" -#include "ink/geometry/point.h" -#include "ink/geometry/quad.h" -#include "ink/geometry/rect.h" -#include "ink/geometry/segment.h" -#include "ink/geometry/triangle.h" +#include "ink/geometry/internal/jni/intersection_native.h" #include "ink/jni/internal/jni_defines.h" -namespace { - -using ::ink::AffineTransform; -using ::ink::Angle; -using ::ink::Intersects; -using ::ink::Point; -using ::ink::Quad; -using ::ink::Rect; -using ::ink::Segment; -using ::ink::Triangle; -using ::ink::native::CastToPartitionedMesh; - -} // namespace - extern "C" { JNI_METHOD(geometry, IntersectionNative, jboolean, vecSegmentIntersects) (JNIEnv* env, jobject object, jfloat vec_x, jfloat vec_y, jfloat segment_start_x, jfloat segment_start_y, jfloat segment_end_x, jfloat segment_end_y) { - Point point{vec_x, vec_y}; - Segment segment{{segment_start_x, segment_start_y}, - {segment_end_x, segment_end_y}}; - return Intersects(point, segment); + return IntersectionNative_vecSegmentIntersects(vec_x, vec_y, segment_start_x, + segment_start_y, segment_end_x, + segment_end_y); } JNI_METHOD(geometry, IntersectionNative, jboolean, vecTriangleIntersects) (JNIEnv* env, jobject object, jfloat vec_x, jfloat vec_y, jfloat triangle_p0_x, jfloat triangle_p0_y, jfloat triangle_p1_x, jfloat triangle_p1_y, jfloat triangle_p2_x, jfloat triangle_p2_y) { - Point point{vec_x, vec_y}; - Triangle triangle{{triangle_p0_x, triangle_p0_y}, - {triangle_p1_x, triangle_p1_y}, - {triangle_p2_x, triangle_p2_y}}; - return Intersects(point, triangle); + return IntersectionNative_vecTriangleIntersects( + vec_x, vec_y, triangle_p0_x, triangle_p0_y, triangle_p1_x, triangle_p1_y, + triangle_p2_x, triangle_p2_y); } JNI_METHOD(geometry, IntersectionNative, jboolean, vecBoxIntersects) (JNIEnv* env, jobject object, jfloat vec_x, jfloat vec_y, jfloat box_x_min, jfloat box_y_min, jfloat box_x_max, jfloat box_y_max) { - Point point{vec_x, vec_y}; - Rect rect = - Rect::FromTwoPoints({box_x_min, box_y_min}, {box_x_max, box_y_max}); - return Intersects(point, rect); + return IntersectionNative_vecBoxIntersects(vec_x, vec_y, box_x_min, box_y_min, + box_x_max, box_y_max); } JNI_METHOD(geometry, IntersectionNative, jboolean, vecParallelogramIntersects) @@ -76,12 +49,10 @@ JNI_METHOD(geometry, IntersectionNative, jboolean, vecParallelogramIntersects) jfloat parallelogram_center_x, jfloat parallelogram_center_y, jfloat parallelogram_width, jfloat parallelogram_height, jfloat parallelogram_angle_radian, jfloat parallelogram_shear_factor) { - Point point{vec_x, vec_y}; - Quad quad = Quad::FromCenterDimensionsRotationAndSkew( - Point{parallelogram_center_x, parallelogram_center_y}, - parallelogram_width, parallelogram_height, - Angle::Radians(parallelogram_angle_radian), parallelogram_shear_factor); - return Intersects(point, quad); + return IntersectionNative_vecParallelogramIntersects( + vec_x, vec_y, parallelogram_center_x, parallelogram_center_y, + parallelogram_width, parallelogram_height, parallelogram_angle_radian, + parallelogram_shear_factor); } JNI_METHOD(geometry, IntersectionNative, jboolean, segmentSegmentIntersects) @@ -89,11 +60,9 @@ JNI_METHOD(geometry, IntersectionNative, jboolean, segmentSegmentIntersects) jfloat segment_1_start_y, jfloat segment_1_end_x, jfloat segment_1_end_y, jfloat segment_2_start_x, jfloat segment_2_start_y, jfloat segment_2_end_x, jfloat segment_2_end_y) { - Segment segment1{{segment_1_start_x, segment_1_start_y}, - {segment_1_end_x, segment_1_end_y}}; - Segment segment2{{segment_2_start_x, segment_2_start_y}, - {segment_2_end_x, segment_2_end_y}}; - return Intersects(segment1, segment2); + return IntersectionNative_segmentSegmentIntersects( + segment_1_start_x, segment_1_start_y, segment_1_end_x, segment_1_end_y, + segment_2_start_x, segment_2_start_y, segment_2_end_x, segment_2_end_y); } JNI_METHOD(geometry, IntersectionNative, jboolean, segmentTriangleIntersects) @@ -101,23 +70,19 @@ JNI_METHOD(geometry, IntersectionNative, jboolean, segmentTriangleIntersects) jfloat segment_end_x, jfloat segment_end_y, jfloat triangle_p0_x, jfloat triangle_p0_y, jfloat triangle_p1_x, jfloat triangle_p1_y, jfloat triangle_p2_x, jfloat triangle_p2_y) { - Segment segment{{segment_start_x, segment_start_y}, - {segment_end_x, segment_end_y}}; - Triangle triangle{{triangle_p0_x, triangle_p0_y}, - {triangle_p1_x, triangle_p1_y}, - {triangle_p2_x, triangle_p2_y}}; - return Intersects(segment, triangle); + return IntersectionNative_segmentTriangleIntersects( + segment_start_x, segment_start_y, segment_end_x, segment_end_y, + triangle_p0_x, triangle_p0_y, triangle_p1_x, triangle_p1_y, triangle_p2_x, + triangle_p2_y); } JNI_METHOD(geometry, IntersectionNative, jboolean, segmentBoxIntersects) (JNIEnv* env, jobject object, jfloat segment_start_x, jfloat segment_start_y, jfloat segment_end_x, jfloat segment_end_y, jfloat box_x_min, jfloat box_y_min, jfloat box_x_max, jfloat box_y_max) { - Segment segment{{segment_start_x, segment_start_y}, - {segment_end_x, segment_end_y}}; - Rect rect = - Rect::FromTwoPoints({box_x_min, box_y_min}, {box_x_max, box_y_max}); - return Intersects(segment, rect); + return IntersectionNative_segmentBoxIntersects( + segment_start_x, segment_start_y, segment_end_x, segment_end_y, box_x_min, + box_y_min, box_x_max, box_y_max); } JNI_METHOD(geometry, IntersectionNative, jboolean, @@ -127,13 +92,11 @@ JNI_METHOD(geometry, IntersectionNative, jboolean, jfloat parallelogram_center_y, jfloat parallelogram_width, jfloat parallelogram_height, jfloat parallelogram_angle_radian, jfloat parallelogram_shear_factor) { - Segment segment{{segment_start_x, segment_start_y}, - {segment_end_x, segment_end_y}}; - Quad quad = Quad::FromCenterDimensionsRotationAndSkew( - Point{parallelogram_center_x, parallelogram_center_y}, - parallelogram_width, parallelogram_height, - Angle::Radians(parallelogram_angle_radian), parallelogram_shear_factor); - return Intersects(segment, quad); + return IntersectionNative_segmentParallelogramIntersects( + segment_start_x, segment_start_y, segment_end_x, segment_end_y, + parallelogram_center_x, parallelogram_center_y, parallelogram_width, + parallelogram_height, parallelogram_angle_radian, + parallelogram_shear_factor); } JNI_METHOD(geometry, IntersectionNative, jboolean, triangleTriangleIntersects) @@ -142,13 +105,10 @@ JNI_METHOD(geometry, IntersectionNative, jboolean, triangleTriangleIntersects) jfloat triangle_1_p2_y, jfloat triangle_2_p0_x, jfloat triangle_2_p0_y, jfloat triangle_2_p1_x, jfloat triangle_2_p1_y, jfloat triangle_2_p2_x, jfloat triangle_2_p2_y) { - Triangle triangle1{{triangle_1_p0_x, triangle_1_p0_y}, - {triangle_1_p1_x, triangle_1_p1_y}, - {triangle_1_p2_x, triangle_1_p2_y}}; - Triangle triangle2{{triangle_2_p0_x, triangle_2_p0_y}, - {triangle_2_p1_x, triangle_2_p1_y}, - {triangle_2_p2_x, triangle_2_p2_y}}; - return Intersects(triangle1, triangle2); + return IntersectionNative_triangleTriangleIntersects( + triangle_1_p0_x, triangle_1_p0_y, triangle_1_p1_x, triangle_1_p1_y, + triangle_1_p2_x, triangle_1_p2_y, triangle_2_p0_x, triangle_2_p0_y, + triangle_2_p1_x, triangle_2_p1_y, triangle_2_p2_x, triangle_2_p2_y); } JNI_METHOD(geometry, IntersectionNative, jboolean, triangleBoxIntersects) @@ -156,12 +116,9 @@ JNI_METHOD(geometry, IntersectionNative, jboolean, triangleBoxIntersects) jfloat triangle_p1_x, jfloat triangle_p1_y, jfloat triangle_p2_x, jfloat triangle_p2_y, jfloat box_x_min, jfloat box_y_min, jfloat box_x_max, jfloat box_y_max) { - Triangle triangle{{triangle_p0_x, triangle_p0_y}, - {triangle_p1_x, triangle_p1_y}, - {triangle_p2_x, triangle_p2_y}}; - Rect rect = - Rect::FromTwoPoints({box_x_min, box_y_min}, {box_x_max, box_y_max}); - return Intersects(triangle, rect); + return IntersectionNative_triangleBoxIntersects( + triangle_p0_x, triangle_p0_y, triangle_p1_x, triangle_p1_y, triangle_p2_x, + triangle_p2_y, box_x_min, box_y_min, box_x_max, box_y_max); } JNI_METHOD(geometry, IntersectionNative, jboolean, @@ -172,25 +129,20 @@ JNI_METHOD(geometry, IntersectionNative, jboolean, jfloat parallelogram_center_y, jfloat parallelogram_width, jfloat parallelogram_height, jfloat parallelogram_angle_radian, jfloat parallelogram_shear_factor) { - Triangle triangle{{triangle_p0_x, triangle_p0_y}, - {triangle_p1_x, triangle_p1_y}, - {triangle_p2_x, triangle_p2_y}}; - Quad quad = Quad::FromCenterDimensionsRotationAndSkew( - Point{parallelogram_center_x, parallelogram_center_y}, - parallelogram_width, parallelogram_height, - Angle::Radians(parallelogram_angle_radian), parallelogram_shear_factor); - return Intersects(triangle, quad); + return IntersectionNative_triangleParallelogramIntersects( + triangle_p0_x, triangle_p0_y, triangle_p1_x, triangle_p1_y, triangle_p2_x, + triangle_p2_y, parallelogram_center_x, parallelogram_center_y, + parallelogram_width, parallelogram_height, parallelogram_angle_radian, + parallelogram_shear_factor); } JNI_METHOD(geometry, IntersectionNative, jboolean, boxBoxIntersects) (JNIEnv* env, jobject object, jfloat box_1_x_min, jfloat box_1_y_min, jfloat box_1_x_max, jfloat box_1_y_max, jfloat box_2_x_min, jfloat box_2_y_min, jfloat box_2_x_max, jfloat box_2_y_max) { - Rect rect1 = Rect::FromTwoPoints({box_1_x_min, box_1_y_min}, - {box_1_x_max, box_1_y_max}); - Rect rect2 = Rect::FromTwoPoints({box_2_x_min, box_2_y_min}, - {box_2_x_max, box_2_y_max}); - return Intersects(rect1, rect2); + return IntersectionNative_boxBoxIntersects( + box_1_x_min, box_1_y_min, box_1_x_max, box_1_y_max, box_2_x_min, + box_2_y_min, box_2_x_max, box_2_y_max); } JNI_METHOD(geometry, IntersectionNative, jboolean, boxParallelogramIntersects) @@ -199,13 +151,10 @@ JNI_METHOD(geometry, IntersectionNative, jboolean, boxParallelogramIntersects) jfloat parallelogram_center_y, jfloat parallelogram_width, jfloat parallelogram_height, jfloat parallelogram_angle_radian, jfloat parallelogram_shear_factor) { - Rect rect = - Rect::FromTwoPoints({box_x_min, box_y_min}, {box_x_max, box_y_max}); - Quad quad = Quad::FromCenterDimensionsRotationAndSkew( - Point{parallelogram_center_x, parallelogram_center_y}, - parallelogram_width, parallelogram_height, - Angle::Radians(parallelogram_angle_radian), parallelogram_shear_factor); - return Intersects(rect, quad); + return IntersectionNative_boxParallelogramIntersects( + box_x_min, box_y_min, box_x_max, box_y_max, parallelogram_center_x, + parallelogram_center_y, parallelogram_width, parallelogram_height, + parallelogram_angle_radian, parallelogram_shear_factor); } JNI_METHOD(geometry, IntersectionNative, jboolean, @@ -217,17 +166,12 @@ JNI_METHOD(geometry, IntersectionNative, jboolean, jfloat parallelogram_2_center_y, jfloat parallelogram_2_width, jfloat parallelogram_2_height, jfloat parallelogram_2_angle_in_radian, jfloat parallelogram_2_shear_factor) { - Quad quad1 = Quad::FromCenterDimensionsRotationAndSkew( - Point{parallelogram_1_center_x, parallelogram_1_center_y}, - parallelogram_1_width, parallelogram_1_height, - Angle::Radians(parallelogram_1_angle_in_radian), - parallelogram_1_shear_factor); - Quad quad2 = Quad::FromCenterDimensionsRotationAndSkew( - Point{parallelogram_2_center_x, parallelogram_2_center_y}, - parallelogram_2_width, parallelogram_2_height, - Angle::Radians(parallelogram_2_angle_in_radian), - parallelogram_2_shear_factor); - return Intersects(quad1, quad2); + return IntersectionNative_parallelogramParallelogramIntersects( + parallelogram_1_center_x, parallelogram_1_center_y, parallelogram_1_width, + parallelogram_1_height, parallelogram_1_angle_in_radian, + parallelogram_1_shear_factor, parallelogram_2_center_x, + parallelogram_2_center_y, parallelogram_2_width, parallelogram_2_height, + parallelogram_2_angle_in_radian, parallelogram_2_shear_factor); } JNI_METHOD(geometry, IntersectionNative, jboolean, partitionedMeshVecIntersects) @@ -238,14 +182,11 @@ JNI_METHOD(geometry, IntersectionNative, jboolean, partitionedMeshVecIntersects) jfloat vec_to_partitionedMesh_transform_d, jfloat vec_to_partitionedMesh_transform_e, jfloat vec_to_partitionedMesh_transform_f) { - Point point{vec_x, vec_y}; - - AffineTransform transform( + return IntersectionNative_partitionedMeshVecIntersects( + partitioned_mesh_native_pointer, vec_x, vec_y, vec_to_partitionedMesh_transform_a, vec_to_partitionedMesh_transform_b, vec_to_partitionedMesh_transform_c, vec_to_partitionedMesh_transform_d, vec_to_partitionedMesh_transform_e, vec_to_partitionedMesh_transform_f); - return Intersects( - point, CastToPartitionedMesh(partitioned_mesh_native_pointer), transform); } JNI_METHOD(geometry, IntersectionNative, jboolean, @@ -258,17 +199,14 @@ JNI_METHOD(geometry, IntersectionNative, jboolean, jfloat segment_to_partitionedMesh_transform_d, jfloat segment_to_partitionedMesh_transform_e, jfloat segment_to_partitionedMesh_transform_f) { - Segment segment{{segment_start_x, segment_start_y}, - {segment_end_x, segment_end_y}}; - AffineTransform transform(segment_to_partitionedMesh_transform_a, - segment_to_partitionedMesh_transform_b, - segment_to_partitionedMesh_transform_c, - segment_to_partitionedMesh_transform_d, - segment_to_partitionedMesh_transform_e, - segment_to_partitionedMesh_transform_f); - return Intersects(segment, - CastToPartitionedMesh(partitioned_mesh_native_pointer), - transform); + return IntersectionNative_partitionedMeshSegmentIntersects( + partitioned_mesh_native_pointer, segment_start_x, segment_start_y, + segment_end_x, segment_end_y, segment_to_partitionedMesh_transform_a, + segment_to_partitionedMesh_transform_b, + segment_to_partitionedMesh_transform_c, + segment_to_partitionedMesh_transform_d, + segment_to_partitionedMesh_transform_e, + segment_to_partitionedMesh_transform_f); } JNI_METHOD(geometry, IntersectionNative, jboolean, @@ -282,18 +220,15 @@ JNI_METHOD(geometry, IntersectionNative, jboolean, jfloat triangle_to_partitionedMesh_transform_d, jfloat triangle_to_partitionedMesh_transform_e, jfloat triangle_to_partitionedMesh_transform_f) { - Triangle triangle{{triangle_p0_x, triangle_p0_y}, - {triangle_p1_x, triangle_p1_y}, - {triangle_p2_x, triangle_p2_y}}; - AffineTransform transform(triangle_to_partitionedMesh_transform_a, - triangle_to_partitionedMesh_transform_b, - triangle_to_partitionedMesh_transform_c, - triangle_to_partitionedMesh_transform_d, - triangle_to_partitionedMesh_transform_e, - triangle_to_partitionedMesh_transform_f); - return Intersects(triangle, - CastToPartitionedMesh(partitioned_mesh_native_pointer), - transform); + return IntersectionNative_partitionedMeshTriangleIntersects( + partitioned_mesh_native_pointer, triangle_p0_x, triangle_p0_y, + triangle_p1_x, triangle_p1_y, triangle_p2_x, triangle_p2_y, + triangle_to_partitionedMesh_transform_a, + triangle_to_partitionedMesh_transform_b, + triangle_to_partitionedMesh_transform_c, + triangle_to_partitionedMesh_transform_d, + triangle_to_partitionedMesh_transform_e, + triangle_to_partitionedMesh_transform_f); } JNI_METHOD(geometry, IntersectionNative, jboolean, partitionedMeshBoxIntersects) @@ -305,14 +240,12 @@ JNI_METHOD(geometry, IntersectionNative, jboolean, partitionedMeshBoxIntersects) jfloat box_to_partitionedMesh_transform_d, jfloat box_to_partitionedMesh_transform_e, jfloat box_to_partitionedMesh_transform_f) { - Rect rect = - Rect::FromTwoPoints({box_x_min, box_y_min}, {box_x_max, box_y_max}); - AffineTransform transform( - box_to_partitionedMesh_transform_a, box_to_partitionedMesh_transform_b, - box_to_partitionedMesh_transform_c, box_to_partitionedMesh_transform_d, - box_to_partitionedMesh_transform_e, box_to_partitionedMesh_transform_f); - return Intersects( - rect, CastToPartitionedMesh(partitioned_mesh_native_pointer), transform); + return IntersectionNative_partitionedMeshBoxIntersects( + partitioned_mesh_native_pointer, box_x_min, box_y_min, box_x_max, + box_y_max, box_to_partitionedMesh_transform_a, + box_to_partitionedMesh_transform_b, box_to_partitionedMesh_transform_c, + box_to_partitionedMesh_transform_d, box_to_partitionedMesh_transform_e, + box_to_partitionedMesh_transform_f); } JNI_METHOD(geometry, IntersectionNative, jboolean, @@ -327,18 +260,16 @@ JNI_METHOD(geometry, IntersectionNative, jboolean, jfloat parallelogram_to_partitionedMesh_transform_d, jfloat parallelogram_to_partitionedMesh_transform_e, jfloat parallelogram_to_partitionedMesh_transform_f) { - Quad quad = Quad::FromCenterDimensionsRotationAndSkew( - Point{parallelogram_center_x, parallelogram_center_y}, - parallelogram_width, parallelogram_height, - Angle::Radians(parallelogram_angle_radian), parallelogram_shear_factor); - AffineTransform transform(parallelogram_to_partitionedMesh_transform_a, - parallelogram_to_partitionedMesh_transform_b, - parallelogram_to_partitionedMesh_transform_c, - parallelogram_to_partitionedMesh_transform_d, - parallelogram_to_partitionedMesh_transform_e, - parallelogram_to_partitionedMesh_transform_f); - return Intersects( - quad, CastToPartitionedMesh(partitioned_mesh_native_pointer), transform); + return IntersectionNative_partitionedMeshParallelogramIntersects( + partitioned_mesh_native_pointer, parallelogram_center_x, + parallelogram_center_y, parallelogram_width, parallelogram_height, + parallelogram_angle_radian, parallelogram_shear_factor, + parallelogram_to_partitionedMesh_transform_a, + parallelogram_to_partitionedMesh_transform_b, + parallelogram_to_partitionedMesh_transform_c, + parallelogram_to_partitionedMesh_transform_d, + parallelogram_to_partitionedMesh_transform_e, + parallelogram_to_partitionedMesh_transform_f); } JNI_METHOD(geometry, IntersectionNative, jboolean, @@ -351,19 +282,15 @@ JNI_METHOD(geometry, IntersectionNative, jboolean, jfloat other_to_common_transform_b, jfloat other_to_common_transform_c, jfloat other_to_common_transform_d, jfloat other_to_common_transform_e, jfloat other_to_common_transform_f) { - AffineTransform this_to_common_transform( - this_to_common_transform_a, this_to_common_transform_b, - this_to_common_transform_c, this_to_common_transform_d, - this_to_common_transform_e, this_to_common_transform_f); - AffineTransform other_to_common_transform( - other_to_common_transform_a, other_to_common_transform_b, - other_to_common_transform_c, other_to_common_transform_d, - other_to_common_transform_e, other_to_common_transform_f); - return Intersects( - CastToPartitionedMesh(this_partitioned_mesh_native_pointer), - this_to_common_transform, - CastToPartitionedMesh(other_partitioned_mesh_native_pointer), - other_to_common_transform); + return IntersectionNative_partitionedMeshPartitionedMeshIntersects( + this_partitioned_mesh_native_pointer, + other_partitioned_mesh_native_pointer, this_to_common_transform_a, + this_to_common_transform_b, this_to_common_transform_c, + this_to_common_transform_d, this_to_common_transform_e, + this_to_common_transform_f, other_to_common_transform_a, + other_to_common_transform_b, other_to_common_transform_c, + other_to_common_transform_d, other_to_common_transform_e, + other_to_common_transform_f); } -} // extern "C +} // extern "C" diff --git a/ink/geometry/internal/jni/intersection_native.cc b/ink/geometry/internal/jni/intersection_native.cc new file mode 100644 index 00000000..99fba07e --- /dev/null +++ b/ink/geometry/internal/jni/intersection_native.cc @@ -0,0 +1,279 @@ +// Copyright 2026 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "ink/geometry/internal/jni/intersection_native.h" + +#include + +#include "ink/geometry/affine_transform.h" +#include "ink/geometry/angle.h" +#include "ink/geometry/internal/jni/partitioned_mesh_native_helper.h" +#include "ink/geometry/intersects.h" +#include "ink/geometry/point.h" +#include "ink/geometry/quad.h" +#include "ink/geometry/rect.h" +#include "ink/geometry/segment.h" +#include "ink/geometry/triangle.h" + +using ::ink::AffineTransform; +using ::ink::Angle; +using ::ink::Intersects; +using ::ink::Point; +using ::ink::Quad; +using ::ink::Rect; +using ::ink::Segment; +using ::ink::Triangle; +using ::ink::native::CastToPartitionedMesh; + +extern "C" { + +bool IntersectionNative_vecSegmentIntersects(float vec_x, float vec_y, + float segment_start_x, + float segment_start_y, + float segment_end_x, + float segment_end_y) { + return Intersects(Point{vec_x, vec_y}, + Segment{{segment_start_x, segment_start_y}, + {segment_end_x, segment_end_y}}); +} + +bool IntersectionNative_vecTriangleIntersects( + float vec_x, float vec_y, float triangle_p0_x, float triangle_p0_y, + float triangle_p1_x, float triangle_p1_y, float triangle_p2_x, + float triangle_p2_y) { + return Intersects(Point{vec_x, vec_y}, + Triangle{{triangle_p0_x, triangle_p0_y}, + {triangle_p1_x, triangle_p1_y}, + {triangle_p2_x, triangle_p2_y}}); +} + +bool IntersectionNative_vecBoxIntersects(float vec_x, float vec_y, + float box_x_min, float box_y_min, + float box_x_max, float box_y_max) { + return Intersects( + Point{vec_x, vec_y}, + Rect::FromTwoPoints({box_x_min, box_y_min}, {box_x_max, box_y_max})); +} + +bool IntersectionNative_vecParallelogramIntersects( + float vec_x, float vec_y, float parallelogram_center_x, + float parallelogram_center_y, float parallelogram_width, + float parallelogram_height, float parallelogram_angle_radian, + float parallelogram_shear_factor) { + return Intersects( + Point{vec_x, vec_y}, + Quad::FromCenterDimensionsRotationAndSkew( + {parallelogram_center_x, parallelogram_center_y}, parallelogram_width, + parallelogram_height, Angle::Radians(parallelogram_angle_radian), + parallelogram_shear_factor)); +} + +bool IntersectionNative_segmentSegmentIntersects( + float segment_1_start_x, float segment_1_start_y, float segment_1_end_x, + float segment_1_end_y, float segment_2_start_x, float segment_2_start_y, + float segment_2_end_x, float segment_2_end_y) { + return Intersects(Segment{{segment_1_start_x, segment_1_start_y}, + {segment_1_end_x, segment_1_end_y}}, + Segment{{segment_2_start_x, segment_2_start_y}, + {segment_2_end_x, segment_2_end_y}}); +} + +bool IntersectionNative_segmentTriangleIntersects( + float segment_start_x, float segment_start_y, float segment_end_x, + float segment_end_y, float triangle_p0_x, float triangle_p0_y, + float triangle_p1_x, float triangle_p1_y, float triangle_p2_x, + float triangle_p2_y) { + return Intersects(Segment{{segment_start_x, segment_start_y}, + {segment_end_x, segment_end_y}}, + Triangle{{triangle_p0_x, triangle_p0_y}, + {triangle_p1_x, triangle_p1_y}, + {triangle_p2_x, triangle_p2_y}}); +} + +bool IntersectionNative_segmentBoxIntersects(float segment_start_x, + float segment_start_y, + float segment_end_x, + float segment_end_y, + float box_x_min, float box_y_min, + float box_x_max, float box_y_max) { + return Intersects( + Segment{{segment_start_x, segment_start_y}, + {segment_end_x, segment_end_y}}, + Rect::FromTwoPoints({box_x_min, box_y_min}, {box_x_max, box_y_max})); +} + +bool IntersectionNative_segmentParallelogramIntersects( + float segment_start_x, float segment_start_y, float segment_end_x, + float segment_end_y, float parallelogram_center_x, + float parallelogram_center_y, float parallelogram_width, + float parallelogram_height, float parallelogram_angle_radian, + float parallelogram_shear_factor) { + return Intersects( + Segment{{segment_start_x, segment_start_y}, + {segment_end_x, segment_end_y}}, + Quad::FromCenterDimensionsRotationAndSkew( + {parallelogram_center_x, parallelogram_center_y}, parallelogram_width, + parallelogram_height, Angle::Radians(parallelogram_angle_radian), + parallelogram_shear_factor)); +} + +bool IntersectionNative_triangleTriangleIntersects( + float triangle_1_p0_x, float triangle_1_p0_y, float triangle_1_p1_x, + float triangle_1_p1_y, float triangle_1_p2_x, float triangle_1_p2_y, + float triangle_2_p0_x, float triangle_2_p0_y, float triangle_2_p1_x, + float triangle_2_p1_y, float triangle_2_p2_x, float triangle_2_p2_y) { + return Intersects(Triangle{{triangle_1_p0_x, triangle_1_p0_y}, + {triangle_1_p1_x, triangle_1_p1_y}, + {triangle_1_p2_x, triangle_1_p2_y}}, + Triangle{{triangle_2_p0_x, triangle_2_p0_y}, + {triangle_2_p1_x, triangle_2_p1_y}, + {triangle_2_p2_x, triangle_2_p2_y}}); +} + +bool IntersectionNative_triangleBoxIntersects( + float triangle_p0_x, float triangle_p0_y, float triangle_p1_x, + float triangle_p1_y, float triangle_p2_x, float triangle_p2_y, + float box_x_min, float box_y_min, float box_x_max, float box_y_max) { + return Intersects( + Triangle{{triangle_p0_x, triangle_p0_y}, + {triangle_p1_x, triangle_p1_y}, + {triangle_p2_x, triangle_p2_y}}, + Rect::FromTwoPoints({box_x_min, box_y_min}, {box_x_max, box_y_max})); +} + +bool IntersectionNative_triangleParallelogramIntersects( + float triangle_p0_x, float triangle_p0_y, float triangle_p1_x, + float triangle_p1_y, float triangle_p2_x, float triangle_p2_y, + float parallelogram_center_x, float parallelogram_center_y, + float parallelogram_width, float parallelogram_height, + float parallelogram_angle_radian, float parallelogram_shear_factor) { + return Intersects( + Triangle{{triangle_p0_x, triangle_p0_y}, + {triangle_p1_x, triangle_p1_y}, + {triangle_p2_x, triangle_p2_y}}, + Quad::FromCenterDimensionsRotationAndSkew( + {parallelogram_center_x, parallelogram_center_y}, parallelogram_width, + parallelogram_height, Angle::Radians(parallelogram_angle_radian), + parallelogram_shear_factor)); +} + +bool IntersectionNative_boxBoxIntersects(float box_1_x_min, float box_1_y_min, + float box_1_x_max, float box_1_y_max, + float box_2_x_min, float box_2_y_min, + float box_2_x_max, float box_2_y_max) { + return Intersects(Rect::FromTwoPoints({box_1_x_min, box_1_y_min}, + {box_1_x_max, box_1_y_max}), + Rect::FromTwoPoints({box_2_x_min, box_2_y_min}, + {box_2_x_max, box_2_y_max})); +} + +bool IntersectionNative_boxParallelogramIntersects( + float box_x_min, float box_y_min, float box_x_max, float box_y_max, + float parallelogram_center_x, float parallelogram_center_y, + float parallelogram_width, float parallelogram_height, + float parallelogram_angle_radian, float parallelogram_shear_factor) { + return Intersects( + Rect::FromTwoPoints({box_x_min, box_y_min}, {box_x_max, box_y_max}), + Quad::FromCenterDimensionsRotationAndSkew( + {parallelogram_center_x, parallelogram_center_y}, parallelogram_width, + parallelogram_height, Angle::Radians(parallelogram_angle_radian), + parallelogram_shear_factor)); +} + +bool IntersectionNative_parallelogramParallelogramIntersects( + float parallelogram_1_center_x, float parallelogram_1_center_y, + float parallelogram_1_width, float parallelogram_1_height, + float parallelogram_1_angle_in_radian, float parallelogram_1_shear_factor, + float parallelogram_2_center_x, float parallelogram_2_center_y, + float parallelogram_2_width, float parallelogram_2_height, + float parallelogram_2_angle_in_radian, float parallelogram_2_shear_factor) { + return Intersects(Quad::FromCenterDimensionsRotationAndSkew( + {parallelogram_1_center_x, parallelogram_1_center_y}, + parallelogram_1_width, parallelogram_1_height, + Angle::Radians(parallelogram_1_angle_in_radian), + parallelogram_1_shear_factor), + Quad::FromCenterDimensionsRotationAndSkew( + {parallelogram_2_center_x, parallelogram_2_center_y}, + parallelogram_2_width, parallelogram_2_height, + Angle::Radians(parallelogram_2_angle_in_radian), + parallelogram_2_shear_factor)); +} + +bool IntersectionNative_partitionedMeshVecIntersects( + int64_t partitioned_mesh_ptr, float vec_x, float vec_y, float a, float b, + float c, float d, float e, float f) { + return Intersects(Point{vec_x, vec_y}, + CastToPartitionedMesh(partitioned_mesh_ptr), + AffineTransform(a, b, c, d, e, f)); +} + +bool IntersectionNative_partitionedMeshSegmentIntersects( + int64_t partitioned_mesh_ptr, float segment_start_x, float segment_start_y, + float segment_end_x, float segment_end_y, float a, float b, float c, + float d, float e, float f) { + return Intersects(Segment{{segment_start_x, segment_start_y}, + {segment_end_x, segment_end_y}}, + CastToPartitionedMesh(partitioned_mesh_ptr), + AffineTransform(a, b, c, d, e, f)); +} + +bool IntersectionNative_partitionedMeshTriangleIntersects( + int64_t partitioned_mesh_ptr, float triangle_p0_x, float triangle_p0_y, + float triangle_p1_x, float triangle_p1_y, float triangle_p2_x, + float triangle_p2_y, float a, float b, float c, float d, float e, float f) { + return Intersects(Triangle{{triangle_p0_x, triangle_p0_y}, + {triangle_p1_x, triangle_p1_y}, + {triangle_p2_x, triangle_p2_y}}, + CastToPartitionedMesh(partitioned_mesh_ptr), + AffineTransform(a, b, c, d, e, f)); +} + +bool IntersectionNative_partitionedMeshBoxIntersects( + int64_t partitioned_mesh_ptr, float box_x_min, float box_y_min, + float box_x_max, float box_y_max, float a, float b, float c, float d, + float e, float f) { + return Intersects( + Rect::FromTwoPoints({box_x_min, box_y_min}, {box_x_max, box_y_max}), + CastToPartitionedMesh(partitioned_mesh_ptr), + AffineTransform(a, b, c, d, e, f)); +} + +bool IntersectionNative_partitionedMeshParallelogramIntersects( + int64_t partitioned_mesh_ptr, float parallelogram_center_x, + float parallelogram_center_y, float parallelogram_width, + float parallelogram_height, float parallelogram_angle_radian, + float parallelogram_shear_factor, float a, float b, float c, float d, + float e, float f) { + return Intersects( + Quad::FromCenterDimensionsRotationAndSkew( + {parallelogram_center_x, parallelogram_center_y}, parallelogram_width, + parallelogram_height, Angle::Radians(parallelogram_angle_radian), + parallelogram_shear_factor), + CastToPartitionedMesh(partitioned_mesh_ptr), + AffineTransform(a, b, c, d, e, f)); +} + +bool IntersectionNative_partitionedMeshPartitionedMeshIntersects( + int64_t this_partitioned_mesh_ptr, int64_t other_partitioned_mesh_ptr, + float this_a, float this_b, float this_c, float this_d, float this_e, + float this_f, float other_a, float other_b, float other_c, float other_d, + float other_e, float other_f) { + return Intersects( + CastToPartitionedMesh(this_partitioned_mesh_ptr), + AffineTransform(this_a, this_b, this_c, this_d, this_e, this_f), + CastToPartitionedMesh(other_partitioned_mesh_ptr), + AffineTransform(other_a, other_b, other_c, other_d, other_e, other_f)); +} + +} // extern "C" diff --git a/ink/geometry/internal/jni/intersection_native.h b/ink/geometry/internal/jni/intersection_native.h new file mode 100644 index 00000000..754b4365 --- /dev/null +++ b/ink/geometry/internal/jni/intersection_native.h @@ -0,0 +1,146 @@ +// Copyright 2026 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef INK_GEOMETRY_INTERNAL_JNI_INTERSECTION_NATIVE_H_ +#define INK_GEOMETRY_INTERNAL_JNI_INTERSECTION_NATIVE_H_ + +#include +#include + +// C-compatible library header for Kotlin-native bindings. + +#ifdef __cplusplus +extern "C" { +#endif + +bool IntersectionNative_vecSegmentIntersects(float vec_x, float vec_y, + float segment_start_x, + float segment_start_y, + float segment_end_x, + float segment_end_y); + +bool IntersectionNative_vecTriangleIntersects( + float vec_x, float vec_y, float triangle_p0_x, float triangle_p0_y, + float triangle_p1_x, float triangle_p1_y, float triangle_p2_x, + float triangle_p2_y); + +bool IntersectionNative_vecBoxIntersects(float vec_x, float vec_y, + float box_x_min, float box_y_min, + float box_x_max, float box_y_max); + +bool IntersectionNative_vecParallelogramIntersects( + float vec_x, float vec_y, float parallelogram_center_x, + float parallelogram_center_y, float parallelogram_width, + float parallelogram_height, float parallelogram_angle_radian, + float parallelogram_shear_factor); + +bool IntersectionNative_segmentSegmentIntersects( + float segment_1_start_x, float segment_1_start_y, float segment_1_end_x, + float segment_1_end_y, float segment_2_start_x, float segment_2_start_y, + float segment_2_end_x, float segment_2_end_y); + +bool IntersectionNative_segmentTriangleIntersects( + float segment_start_x, float segment_start_y, float segment_end_x, + float segment_end_y, float triangle_p0_x, float triangle_p0_y, + float triangle_p1_x, float triangle_p1_y, float triangle_p2_x, + float triangle_p2_y); + +bool IntersectionNative_segmentBoxIntersects(float segment_start_x, + float segment_start_y, + float segment_end_x, + float segment_end_y, + float box_x_min, float box_y_min, + float box_x_max, float box_y_max); + +bool IntersectionNative_segmentParallelogramIntersects( + float segment_start_x, float segment_start_y, float segment_end_x, + float segment_end_y, float parallelogram_center_x, + float parallelogram_center_y, float parallelogram_width, + float parallelogram_height, float parallelogram_angle_radian, + float parallelogram_shear_factor); + +bool IntersectionNative_triangleTriangleIntersects( + float triangle_1_p0_x, float triangle_1_p0_y, float triangle_1_p1_x, + float triangle_1_p1_y, float triangle_1_p2_x, float triangle_1_p2_y, + float triangle_2_p0_x, float triangle_2_p0_y, float triangle_2_p1_x, + float triangle_2_p1_y, float triangle_2_p2_x, float triangle_2_p2_y); + +bool IntersectionNative_triangleBoxIntersects( + float triangle_p0_x, float triangle_p0_y, float triangle_p1_x, + float triangle_p1_y, float triangle_p2_x, float triangle_p2_y, + float box_x_min, float box_y_min, float box_x_max, float box_y_max); + +bool IntersectionNative_triangleParallelogramIntersects( + float triangle_p0_x, float triangle_p0_y, float triangle_p1_x, + float triangle_p1_y, float triangle_p2_x, float triangle_p2_y, + float parallelogram_center_x, float parallelogram_center_y, + float parallelogram_width, float parallelogram_height, + float parallelogram_angle_radian, float parallelogram_shear_factor); + +bool IntersectionNative_boxBoxIntersects(float box_1_x_min, float box_1_y_min, + float box_1_x_max, float box_1_y_max, + float box_2_x_min, float box_2_y_min, + float box_2_x_max, float box_2_y_max); + +bool IntersectionNative_boxParallelogramIntersects( + float box_x_min, float box_y_min, float box_x_max, float box_y_max, + float parallelogram_center_x, float parallelogram_center_y, + float parallelogram_width, float parallelogram_height, + float parallelogram_angle_radian, float parallelogram_shear_factor); + +bool IntersectionNative_parallelogramParallelogramIntersects( + float parallelogram_1_center_x, float parallelogram_1_center_y, + float parallelogram_1_width, float parallelogram_1_height, + float parallelogram_1_angle_in_radian, float parallelogram_1_shear_factor, + float parallelogram_2_center_x, float parallelogram_2_center_y, + float parallelogram_2_width, float parallelogram_2_height, + float parallelogram_2_angle_in_radian, float parallelogram_2_shear_factor); + +bool IntersectionNative_partitionedMeshVecIntersects( + int64_t partitioned_mesh_ptr, float vec_x, float vec_y, float a, float b, + float c, float d, float e, float f); + +bool IntersectionNative_partitionedMeshSegmentIntersects( + int64_t partitioned_mesh_ptr, float segment_start_x, float segment_start_y, + float segment_end_x, float segment_end_y, float a, float b, float c, + float d, float e, float f); + +bool IntersectionNative_partitionedMeshTriangleIntersects( + int64_t partitioned_mesh_ptr, float triangle_p0_x, float triangle_p0_y, + float triangle_p1_x, float triangle_p1_y, float triangle_p2_x, + float triangle_p2_y, float a, float b, float c, float d, float e, float f); + +bool IntersectionNative_partitionedMeshBoxIntersects( + int64_t partitioned_mesh_ptr, float box_x_min, float box_y_min, + float box_x_max, float box_y_max, float a, float b, float c, float d, + float e, float f); + +bool IntersectionNative_partitionedMeshParallelogramIntersects( + int64_t partitioned_mesh_ptr, float parallelogram_center_x, + float parallelogram_center_y, float parallelogram_width, + float parallelogram_height, float parallelogram_angle_radian, + float parallelogram_shear_factor, float a, float b, float c, float d, + float e, float f); + +bool IntersectionNative_partitionedMeshPartitionedMeshIntersects( + int64_t this_partitioned_mesh_ptr, int64_t other_partitioned_mesh_ptr, + float this_a, float this_b, float this_c, float this_d, float this_e, + float this_f, float other_a, float other_b, float other_c, float other_d, + float other_e, float other_f); + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif // INK_GEOMETRY_INTERNAL_JNI_INTERSECTION_NATIVE_H_