/** * graphene_triangle_get_plane: * @t: a #graphene_triangle_t * @res: (out caller-allocates): return location for the plane * * Computes the plane based on the vertices of the given #graphene_triangle_t. * * Since: 1.2 */ void graphene_triangle_get_plane (const graphene_triangle_t *t, graphene_plane_t *res) { graphene_point3d_t a, b, c; graphene_point3d_init_from_vec3 (&a, &t->a); graphene_point3d_init_from_vec3 (&b, &t->b); graphene_point3d_init_from_vec3 (&c, &t->c); graphene_plane_init_from_points (res, &a, &b, &c); }
/** * graphene_triangle_get_points: * @t: a #graphene_triangle_t * @a: (out caller-allocates) (optional): return location for the coordinates * of the first vertex * @b: (out caller-allocates) (optional): return location for the coordinates * of the second vertex * @c: (out caller-allocates) (optional): return location for the coordinates * of the third vertex * * Retrieves the three vertices of the given #graphene_triangle_t and returns * their coordinates as #graphene_point3d_t. * * Since: 1.2 */ void graphene_triangle_get_points (const graphene_triangle_t *t, graphene_point3d_t *a, graphene_point3d_t *b, graphene_point3d_t *c) { if (a != NULL) graphene_point3d_init_from_vec3 (a, &t->a); if (b != NULL) graphene_point3d_init_from_vec3 (b, &t->b); if (c != NULL) graphene_point3d_init_from_vec3 (c, &t->c); }
/** * graphene_ray_get_distance_to_plane: * @r: a #graphene_ray_t * @p: a #graphene_plane_t * * Computes the distance of the origin of the given #graphene_ray_t from the * given plane. * * If the ray does not intersect the plane, this function returns `INFINITY`. * * Returns: the distance of the origin of the ray from the plane * * Since: 1.4 */ float graphene_ray_get_distance_to_plane (const graphene_ray_t *r, const graphene_plane_t *p) { float denom, t; denom = graphene_vec3_dot (&p->normal, &r->direction); if (fabsf (denom) < GRAPHENE_FLOAT_EPSILON) { graphene_point3d_t tmp; /* If the ray is coplanar, return 0 */ graphene_point3d_init_from_vec3 (&tmp, &r->origin); if (fabsf (graphene_plane_distance (p, &tmp)) < GRAPHENE_FLOAT_EPSILON) return 0.f; return INFINITY; } t = -1.f * (graphene_vec3_dot (&r->origin, &p->normal) + p->constant) / denom; if (t >= 0.f) return t; return INFINITY; }
/** * graphene_triangle_get_midpoint: * @t: a #graphene_triangle_t * @res: (out caller-allocates): return location for the coordinates of * the midpoint * * Computes the coordinates of the midpoint of the given #graphene_triangle_t. * * Since: 1.2 */ void graphene_triangle_get_midpoint (const graphene_triangle_t *t, graphene_point3d_t *res) { graphene_vec3_t tmp; graphene_vec3_add (&t->a, &t->b, &tmp); graphene_vec3_add (&tmp, &t->c, &tmp); graphene_vec3_scale (&tmp, (1.f / 3.f), &tmp); graphene_point3d_init_from_vec3 (res, &tmp); }
/** * graphene_ray_get_position_at: * @r: a #graphene_ray_t * @t: the distance along the ray * @position: (out caller-allocates): return location for the position * * Retrieves the coordinates of a point at the distance @t along the * given #graphene_ray_t. * * Since: 1.4 */ void graphene_ray_get_position_at (const graphene_ray_t *r, float t, graphene_point3d_t *position) { graphene_vec3_t res; graphene_vec3_scale (&r->direction, t, &res); graphene_vec3_add (&res, &r->origin, &res); graphene_point3d_init_from_vec3 (position, &res); }
/** * graphene_ray_get_closest_point_to_point: * @r: a #graphene_ray_t * @p: a #graphene_point3d_t * @res: (out caller-allocates): return location for the closest point3d * * Computes the point on the given #graphene_ray_t that is closest to the * given point @p. * * Since: 1.4 */ void graphene_ray_get_closest_point_to_point (const graphene_ray_t *r, const graphene_point3d_t *p, graphene_point3d_t *res) { graphene_vec3_t point, result; float distance; graphene_point3d_to_vec3 (p, &point); graphene_vec3_subtract (&point, &r->origin, &result); distance = graphene_vec3_dot (&result, &r->direction); if (distance < 0) graphene_vec3_init_from_vec3 (&result, &r->origin); else { graphene_vec3_scale (&r->direction, distance, &result); graphene_vec3_add (&result, &r->origin, &result); } graphene_point3d_init_from_vec3 (res, &result); }
/** * graphene_ray_get_origin: * @r: a #graphene_ray_t * @origin: (out caller-allocates): return location for the origin * * Retrieves the origin of the given #graphene_ray_t. * * Since: 1.4 */ void graphene_ray_get_origin (const graphene_ray_t *r, graphene_point3d_t *origin) { graphene_point3d_init_from_vec3 (origin, &r->origin); }