20 Vec3 e1 = inPolygonToClip[inPolygonToClip.size() - 1];
21 float prev_num = (inPlaneOrigin - e1).Dot(inPlaneNormal);
22 bool prev_inside = prev_num < 0.0f;
25 for (
typename VERTEX_ARRAY::size_type j = 0; j < inPolygonToClip.size(); ++j)
28 Vec3Arg e2 = inPolygonToClip[j];
29 float num = (inPlaneOrigin - e2).Dot(inPlaneNormal);
30 bool cur_inside = num < 0.0f;
33 if (cur_inside != prev_inside)
37 float denom = e12.
Dot(inPlaneNormal);
39 outClippedPolygon.push_back(e1 + (prev_num / denom) * e12);
41 cur_inside = prev_inside;
46 outClippedPolygon.push_back(e2);
50 prev_inside = cur_inside;
62void ClipPolyVsPoly(
const VERTEX_ARRAY &inPolygonToClip,
const VERTEX_ARRAY &inClippingPolygon,
Vec3Arg inClippingPolygonNormal, VERTEX_ARRAY &outClippedPolygon)
67 VERTEX_ARRAY tmp_vertices[2];
68 int tmp_vertices_idx = 0;
70 for (
typename VERTEX_ARRAY::size_type i = 0; i < inClippingPolygon.size(); ++i)
73 Vec3 clip_e1 = inClippingPolygon[i];
74 Vec3 clip_e2 = inClippingPolygon[(i + 1) % inClippingPolygon.size()];
75 Vec3 clip_normal = inClippingPolygonNormal.
Cross(clip_e2 - clip_e1);
78 const VERTEX_ARRAY &src_polygon = (i == 0)? inPolygonToClip : tmp_vertices[tmp_vertices_idx];
79 tmp_vertices_idx ^= 1;
80 VERTEX_ARRAY &tgt_polygon = (i == inClippingPolygon.size() - 1)? outClippedPolygon : tmp_vertices[tmp_vertices_idx];
87 if (tgt_polygon.size() < 3)
89 outClippedPolygon.clear();
104 Vec3 edge = inEdgeVertex2 - inEdgeVertex1;
105 Vec3 edge_normal = inClippingEdgeNormal.
Cross(edge);
108 Vec3 polygon_normal = (inPolygonToClip[2] - inPolygonToClip[0]).Cross(inPolygonToClip[1] - inPolygonToClip[0]);
109 float polygon_normal_len_sq = polygon_normal.
LengthSq();
110 Vec3 v1 = inEdgeVertex1 + polygon_normal.
Dot(inPolygonToClip[0] - inEdgeVertex1) * polygon_normal / polygon_normal_len_sq;
111 Vec3 v2 = inEdgeVertex2 + polygon_normal.
Dot(inPolygonToClip[0] - inEdgeVertex2) * polygon_normal / polygon_normal_len_sq;
116 Vec3 e1 = inPolygonToClip[inPolygonToClip.size() - 1];
117 float prev_num = (inEdgeVertex1 - e1).Dot(edge_normal);
118 bool prev_inside = prev_num < 0.0f;
121 for (
typename VERTEX_ARRAY::size_type j = 0; j < inPolygonToClip.size(); ++j)
124 Vec3 e2 = inPolygonToClip[j];
125 float num = (inEdgeVertex1 - e2).Dot(edge_normal);
126 bool cur_inside = num < 0.0f;
129 if (cur_inside != prev_inside)
133 float denom = e12.
Dot(edge_normal);
134 Vec3 clipped_point = denom != 0.0f? e1 + (prev_num / denom) * e12 : e1;
137 float projection = (clipped_point - v1).Dot(v12);
138 if (projection < 0.0f)
139 outClippedPolygon.push_back(v1);
140 else if (projection > v12_len_sq)
141 outClippedPolygon.push_back(v2);
143 outClippedPolygon.push_back(clipped_point);
148 prev_inside = cur_inside;
156void ClipPolyVsAABox(
const VERTEX_ARRAY &inPolygonToClip,
const AABox &inAABox, VERTEX_ARRAY &outClippedPolygon)
160 VERTEX_ARRAY tmp_vertices[2];
161 int tmp_vertices_idx = 0;
163 for (
int coord = 0; coord < 3; ++coord)
164 for (
int side = 0; side < 2; ++side)
170 normal.SetComponent(coord, 1.0f);
175 normal.SetComponent(coord, -1.0f);
180 const VERTEX_ARRAY &src_polygon = tmp_vertices_idx == 0? inPolygonToClip : tmp_vertices[tmp_vertices_idx & 1];
182 VERTEX_ARRAY &tgt_polygon = tmp_vertices_idx == 6? outClippedPolygon : tmp_vertices[tmp_vertices_idx & 1];
189 if (tgt_polygon.size() < 3)
191 outClippedPolygon.clear();
void ClipPolyVsPoly(const VERTEX_ARRAY &inPolygonToClip, const VERTEX_ARRAY &inClippingPolygon, Vec3Arg inClippingPolygonNormal, VERTEX_ARRAY &outClippedPolygon)
Definition ClipPoly.h:62
JPH_NAMESPACE_BEGIN void ClipPolyVsPlane(const VERTEX_ARRAY &inPolygonToClip, Vec3Arg inPlaneOrigin, Vec3Arg inPlaneNormal, VERTEX_ARRAY &outClippedPolygon)
Definition ClipPoly.h:14
void ClipPolyVsEdge(const VERTEX_ARRAY &inPolygonToClip, Vec3Arg inEdgeVertex1, Vec3Arg inEdgeVertex2, Vec3Arg inClippingEdgeNormal, VERTEX_ARRAY &outClippedPolygon)
Definition ClipPoly.h:98
void ClipPolyVsAABox(const VERTEX_ARRAY &inPolygonToClip, const AABox &inAABox, VERTEX_ARRAY &outClippedPolygon)
Definition ClipPoly.h:156