#pragma BLENDER_REQUIRE(common_math_geom_lib.glsl) /** * Geometric shape structures. * Some constructors might seems redundant but are here to make the API cleaner and * allow for more than one constructor per type. */ /* ---------------------------------------------------------------------- */ /** \name Circle * \{ */ struct Circle { vec2 center; float radius; }; Circle shape_circle(vec2 center, float radius) { return Circle(center, radius); } /** \} */ /* ---------------------------------------------------------------------- */ /** \name Sphere * \{ */ struct Sphere { vec3 center; float radius; }; Sphere shape_sphere(vec3 center, float radius) { return Sphere(center, radius); } /** \} */ /* ---------------------------------------------------------------------- */ /** \name Box * \{ */ struct Box { vec3 corners[8]; }; /* Construct box from 4 basis points. */ Box shape_box(vec3 v000, vec3 v100, vec3 v010, vec3 v001) { v100 -= v000; v010 -= v000; v001 -= v000; Box box; box.corners[0] = v000; box.corners[1] = v000 + v100; box.corners[2] = v000 + v010 + v100; box.corners[3] = v000 + v010; box.corners[4] = box.corners[0] + v001; box.corners[5] = box.corners[1] + v001; box.corners[6] = box.corners[2] + v001; box.corners[7] = box.corners[3] + v001; return box; } /** \} */ /* ---------------------------------------------------------------------- */ /** \name Square Pyramid * \{ */ struct Pyramid { /* Apex is the first. Base vertices are in clockwise order from front view. */ vec3 corners[5]; }; /** * Regular Square Pyramid (can be oblique). * Use this corner order. * (Top-Down View of the pyramid) *
 *
 * Y
 * |
 * |
 * .-----X
 *
 *  4-----------3
 *  | \       / |
 *  |   \   /   |
 *  |     0     |
 *  |   /   \   |
 *  | /       \ |
 *  1-----------2
 * 
* base_corner_00 is vertex 1 * base_corner_01 is vertex 2 * base_corner_10 is vertex 4 */ Pyramid shape_pyramid(vec3 apex, vec3 base_corner_00, vec3 base_corner_01, vec3 base_corner_10) { Pyramid pyramid; pyramid.corners[0] = apex; pyramid.corners[1] = base_corner_00; pyramid.corners[2] = base_corner_01; pyramid.corners[3] = base_corner_10 + (base_corner_01 - base_corner_00); pyramid.corners[4] = base_corner_10; return pyramid; } /** * Regular Square Pyramid. *
 *
 * Y
 * |
 * |
 * .-----X
 *
 *  4-----Y-----3
 *  | \   |   / |
 *  |   \ | /   |
 *  |     0-----X
 *  |   /   \   |
 *  | /       \ |
 *  1-----------2
 * 
* base_center_pos_x is vector from base center to X * base_center_pos_y is vector from base center to Y */ Pyramid shape_pyramid_non_oblique(vec3 apex, vec3 base_center, vec3 base_center_pos_x, vec3 base_center_pos_y) { Pyramid pyramid; pyramid.corners[0] = apex; pyramid.corners[1] = base_center - base_center_pos_x - base_center_pos_y; pyramid.corners[2] = base_center + base_center_pos_x - base_center_pos_y; pyramid.corners[3] = base_center + base_center_pos_x + base_center_pos_y; pyramid.corners[4] = base_center - base_center_pos_x + base_center_pos_y; return pyramid; } /** \} */ /* ---------------------------------------------------------------------- */ /** \name Frustum * \{ */ struct Frustum { vec3 corners[8]; }; /** * Use this corner order. *
 *
 * Z  Y
 * | /
 * |/
 * .-----X
 *     2----------6
 *    /|         /|
 *   / |        / |
 *  1----------5  |
 *  |  |       |  |
 *  |  3-------|--7
 *  | /        | /
 *  |/         |/
 *  0----------4
 * 
*/ Frustum shape_frustum(vec3 corners[8]) { Frustum frustum; for (int i = 0; i < 8; i++) { frustum.corners[i] = corners[i]; } return frustum; } /** \} */ /* ---------------------------------------------------------------------- */ /** \name Cone * \{ */ /* Cone at orign with no height. */ struct Cone { vec3 direction; float angle_cos; }; Cone shape_cone(vec3 direction, float angle_cosine) { return Cone(direction, angle_cosine); } /** \} */