Added unit cube generation and get_support queries.
parent
0c53f3fd8b
commit
e93a659daf
|
@ -121,6 +121,8 @@ int sch_hull_connect_face_edges(const sch_hull* hull, int face_index);
|
|||
|
||||
void sch_create_face(int num_vert, simd4f* vertices, sch_face* out_face);
|
||||
|
||||
void sch_create_unitbox(sch_hull* out_hull);
|
||||
|
||||
//
|
||||
// sconvcol Implementation
|
||||
//
|
||||
|
@ -337,6 +339,26 @@ sch_edge* sch_hull_find_edge (const sch_hull* hull, const simd4f v0, const simd4
|
|||
return NULL;
|
||||
}
|
||||
|
||||
void sch_hull_get_support(const sch_hull* hull, simd4f normal, simd4f* out_vert) {
|
||||
sch_edge* edge = hull->faces[0].edge;
|
||||
sch_edge* last_edge = edge;
|
||||
float normal_dot_edge = -1.;
|
||||
|
||||
do {
|
||||
simd4f dir = simd4f_normalize3(simd4f_sub (edge->next->vert->p, edge->vert->p));
|
||||
normal_dot_edge = simd4f_dot3_scalar(dir, normal);
|
||||
|
||||
if (normal_dot_edge <= 0.) {
|
||||
edge = edge->twin->next;
|
||||
} else {
|
||||
edge = edge->next;
|
||||
last_edge = edge;
|
||||
}
|
||||
} while (last_edge != edge || normal_dot_edge > 0);
|
||||
|
||||
*out_vert = edge->vert->p;
|
||||
}
|
||||
|
||||
int sch_hull_is_vertex_concave(const sch_hull* hull, const simd4f v) {
|
||||
sch_plane plane;
|
||||
for (int i = 0; i < hull->num_faces; i++) {
|
||||
|
@ -407,6 +429,62 @@ int sch_hull_is_closed (const sch_hull* hull) {
|
|||
return SchHullResultOK;
|
||||
}
|
||||
|
||||
void sch_create_unitbox(sch_hull* out_hull) {
|
||||
sch_hull_builder builder;
|
||||
sch_builder_reset(&builder);
|
||||
|
||||
// +x
|
||||
sch_builder_face_begin(&builder);
|
||||
sch_builder_face_vertex(&builder, simd4f_create (0.5f, -0.5f, 0.5f, 1.f));
|
||||
sch_builder_face_vertex(&builder, simd4f_create ( 0.5f, -0.5f, -0.5f, 1.f));
|
||||
sch_builder_face_vertex(&builder, simd4f_create ( 0.5f, 0.5f, -0.5f, 1.f));
|
||||
sch_builder_face_vertex(&builder, simd4f_create (0.5f, 0.5f, 0.5f, 1.f));
|
||||
sch_builder_face_end(&builder);
|
||||
|
||||
// -x
|
||||
sch_builder_face_begin(&builder);
|
||||
sch_builder_face_vertex(&builder, simd4f_create (-0.5f, -0.5f, -0.5f, 1.f));
|
||||
sch_builder_face_vertex(&builder, simd4f_create ( -0.5f, -0.5f, 0.5f, 1.f));
|
||||
sch_builder_face_vertex(&builder, simd4f_create ( -0.5f, 0.5f, 0.5f, 1.f));
|
||||
sch_builder_face_vertex(&builder, simd4f_create (-0.5f, 0.5f, -0.5f, 1.f));
|
||||
sch_builder_face_end(&builder);
|
||||
|
||||
// +y
|
||||
sch_builder_face_begin(&builder);
|
||||
sch_builder_face_vertex(&builder, simd4f_create (0.5f, 0.5f, 0.5f, 1.f));
|
||||
sch_builder_face_vertex(&builder, simd4f_create ( 0.5f, 0.5f, -0.5f, 1.f));
|
||||
sch_builder_face_vertex(&builder, simd4f_create ( -0.5f, 0.5f, -0.5f, 1.f));
|
||||
sch_builder_face_vertex(&builder, simd4f_create (-0.5f, 0.5f, 0.5f, 1.f));
|
||||
sch_builder_face_end(&builder);
|
||||
|
||||
// +y
|
||||
sch_builder_face_begin(&builder);
|
||||
sch_builder_face_vertex(&builder, simd4f_create (-0.5f, -0.5f, -0.5f, 1.f));
|
||||
sch_builder_face_vertex(&builder, simd4f_create ( 0.5f, -0.5f, -0.5f, 1.f));
|
||||
sch_builder_face_vertex(&builder, simd4f_create ( 0.5f, -0.5f, 0.5f, 1.f));
|
||||
sch_builder_face_vertex(&builder, simd4f_create (-0.5f, -0.5f, 0.5f, 1.f));
|
||||
sch_builder_face_end(&builder);
|
||||
|
||||
// +z
|
||||
sch_builder_face_begin(&builder);
|
||||
sch_builder_face_vertex(&builder, simd4f_create (-0.5f, -0.5f, 0.5f, 1.f));
|
||||
sch_builder_face_vertex(&builder, simd4f_create ( 0.5f, -0.5f, 0.5f, 1.f));
|
||||
sch_builder_face_vertex(&builder, simd4f_create ( 0.5f, 0.5f, 0.5f, 1.f));
|
||||
sch_builder_face_vertex(&builder, simd4f_create (-0.5f, 0.5f, 0.5f, 1.f));
|
||||
sch_builder_face_end(&builder);
|
||||
|
||||
// -z
|
||||
sch_builder_face_begin(&builder);
|
||||
sch_builder_face_vertex(&builder, simd4f_create(0.5f, -0.5f, -0.5f, 1.f));
|
||||
sch_builder_face_vertex(&builder, simd4f_create(-0.5f, -0.5f, -0.5f, 1.f));
|
||||
sch_builder_face_vertex(&builder, simd4f_create(-0.5f, 0.5f, -0.5f, 1.f));
|
||||
sch_builder_face_vertex(&builder, simd4f_create(0.5f, 0.5f, -0.5f, 1.f));
|
||||
sch_builder_face_end(&builder);
|
||||
|
||||
int hull_result = sch_builder_create_hull(&builder, out_hull);
|
||||
assert (hull_result == SchHullResultOK);
|
||||
}
|
||||
|
||||
#endif /* SCONVCOL_IMPLEMENTATION */
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
|
Loading…
Reference in New Issue