From 68be10f11be6098f5cb19bf373e2c6ff82f93c71 Mon Sep 17 00:00:00 2001 From: Tavian Barnes Date: Fri, 9 May 2014 14:00:42 -0400 Subject: object: Get rid of void *ptr field. Instead, allow dmnsn_object to be embedded in a larger struct. This gives a consistent 1% speed boost. --- libdimension/plane.c | 40 ++++++++++++++++++++++------------------ 1 file changed, 22 insertions(+), 18 deletions(-) (limited to 'libdimension/plane.c') diff --git a/libdimension/plane.c b/libdimension/plane.c index 33d2737..dc7fc1a 100644 --- a/libdimension/plane.c +++ b/libdimension/plane.c @@ -27,6 +27,12 @@ #include #include +/** Plane type. */ +typedef struct { + dmnsn_object object; + dmnsn_vector normal; +} dmnsn_plane; + /* Plane object callbacks */ static bool dmnsn_plane_intersection_fn(const dmnsn_object *plane, @@ -39,32 +45,30 @@ static bool dmnsn_plane_inside_fn(const dmnsn_object *plane, dmnsn_object * dmnsn_new_plane(dmnsn_vector normal) { - dmnsn_object *plane = dmnsn_new_object(); - - dmnsn_vector *param = DMNSN_MALLOC(dmnsn_vector); - *param = normal; + dmnsn_plane *plane = DMNSN_MALLOC(dmnsn_plane); + dmnsn_init_object(&plane->object); - plane->intersection_fn = dmnsn_plane_intersection_fn; - plane->inside_fn = dmnsn_plane_inside_fn; - plane->free_fn = dmnsn_free; - plane->bounding_box = dmnsn_infinite_bounding_box(); - plane->ptr = param; - return plane; + plane->object.intersection_fn = dmnsn_plane_intersection_fn; + plane->object.inside_fn = dmnsn_plane_inside_fn; + plane->object.bounding_box = dmnsn_infinite_bounding_box(); + plane->normal = normal; + return &plane->object; } /* Returns the closest intersection of `line' with `plane' */ static bool -dmnsn_plane_intersection_fn(const dmnsn_object *plane, dmnsn_line line, +dmnsn_plane_intersection_fn(const dmnsn_object *object, dmnsn_line line, dmnsn_intersection *intersection) { - dmnsn_vector *normal = plane->ptr; + const dmnsn_plane *plane = (const dmnsn_plane *)object; + dmnsn_vector normal = plane->normal; - double den = dmnsn_vector_dot(line.n, *normal); + double den = dmnsn_vector_dot(line.n, normal); if (den != 0.0) { - double t = -dmnsn_vector_dot(line.x0, *normal)/den; + double t = -dmnsn_vector_dot(line.x0, normal)/den; if (t >= 0.0) { intersection->t = t; - intersection->normal = *normal; + intersection->normal = normal; return true; } } @@ -73,8 +77,8 @@ dmnsn_plane_intersection_fn(const dmnsn_object *plane, dmnsn_line line, /* Return whether a point is inside a plane */ static bool -dmnsn_plane_inside_fn(const dmnsn_object *plane, dmnsn_vector point) +dmnsn_plane_inside_fn(const dmnsn_object *object, dmnsn_vector point) { - dmnsn_vector *normal = plane->ptr; - return dmnsn_vector_dot(point, *normal) < 0.0; + const dmnsn_plane *plane = (const dmnsn_plane *)object; + return dmnsn_vector_dot(point, plane->normal) < 0.0; } -- cgit v1.2.3