/** * graphene_ray_get_distance_to_point: * @r: a #graphene_ray_t * @p: a #graphene_point3d_t * * Computes the distance from the origin of the given ray to the given point. * * Returns: the distance of the point * * Since: 1.4 */ float graphene_ray_get_distance_to_point (const graphene_ray_t *r, const graphene_point3d_t *p) { graphene_vec3_t point; graphene_vec3_t tmp; float distance; graphene_point3d_to_vec3 (p, &point); graphene_vec3_subtract (&point, &r->origin, &tmp); distance = graphene_vec3_dot (&tmp, &r->direction); /* the point is behind the ray */ if (distance < 0) { graphene_vec3_subtract (&r->origin, &point, &tmp); return graphene_vec3_length (&tmp); } /* get the position on the ray at the given distance */ graphene_vec3_scale (&r->direction, distance, &tmp); graphene_vec3_add (&tmp, &r->origin, &tmp); graphene_vec3_subtract (&tmp, &point, &tmp); return graphene_vec3_length (&tmp); }
static void extract_matrix_metadata (const graphene_matrix_t *m, OpsMatrixMetadata *md) { switch (md->category) { case GSK_TRANSFORM_CATEGORY_IDENTITY: md->scale_x = 1; md->scale_y = 1; break; case GSK_TRANSFORM_CATEGORY_2D_TRANSLATE: md->translate_x = graphene_matrix_get_value (m, 3, 0); md->translate_y = graphene_matrix_get_value (m, 3, 1); md->scale_x = 1; md->scale_y = 1; break; case GSK_TRANSFORM_CATEGORY_UNKNOWN: case GSK_TRANSFORM_CATEGORY_ANY: case GSK_TRANSFORM_CATEGORY_3D: case GSK_TRANSFORM_CATEGORY_2D: case GSK_TRANSFORM_CATEGORY_2D_AFFINE: { graphene_vec3_t col1; graphene_vec3_t col2; md->translate_x = graphene_matrix_get_value (m, 3, 0); md->translate_y = graphene_matrix_get_value (m, 3, 1); graphene_vec3_init (&col1, graphene_matrix_get_value (m, 0, 0), graphene_matrix_get_value (m, 1, 0), graphene_matrix_get_value (m, 2, 0)); graphene_vec3_init (&col2, graphene_matrix_get_value (m, 0, 1), graphene_matrix_get_value (m, 1, 1), graphene_matrix_get_value (m, 2, 1)); md->scale_x = graphene_vec3_length (&col1); md->scale_y = graphene_vec3_length (&col2); } break; default: {} } }
/** * graphene_vec3_normalize: * @v: a #graphene_vec3_t * @res: (out caller-allocates): return location for the normalized vector * * Normalizes the given #graphene_vec3_t. * * Since: 1.0 */ void graphene_vec3_normalize (const graphene_vec3_t *v, graphene_vec3_t *res) { if (graphene_vec3_length (v) != 0.f) res->value = graphene_simd4f_normalize3 (v->value); else res->value = graphene_simd4f_init_zero (); }
/** * graphene_triangle_get_area: * @t: a #graphene_triangle_t * * Computes the area of the given #graphene_triangle_t. * * Returns: the area of the triangle * * Since: 1.2 */ float graphene_triangle_get_area (const graphene_triangle_t *t) { graphene_vec3_t v1, v2, tmp; graphene_vec3_subtract (&t->c, &t->b, &v1); graphene_vec3_subtract (&t->a, &t->b, &v2); graphene_vec3_cross (&v1, &v2, &tmp); return graphene_vec3_length (&tmp) * .5f; }