From 0f0b704144bddc045657f7ed852b49d5e349b0bd Mon Sep 17 00:00:00 2001 From: Tavian Barnes Date: Sat, 21 May 2011 20:27:09 -0600 Subject: Add refcounts to cameras. --- libdimension/camera.c | 8 +++++--- libdimension/dimension/camera.h | 5 +++-- libdimension/dimension/refcount.h | 3 +++ libdimension/dimension/scene.h | 7 +++++++ libdimension/scene.c | 8 ++++++++ libdimension/tests/render.c | 5 +++-- 6 files changed, 29 insertions(+), 7 deletions(-) diff --git a/libdimension/camera.c b/libdimension/camera.c index 67117f9..e76200a 100644 --- a/libdimension/camera.c +++ b/libdimension/camera.c @@ -31,8 +31,9 @@ dmnsn_camera * dmnsn_new_camera(void) { dmnsn_camera *camera = dmnsn_malloc(sizeof(dmnsn_camera)); - camera->free_fn = NULL; - camera->trans = dmnsn_identity_matrix(); + camera->free_fn = NULL; + camera->trans = dmnsn_identity_matrix(); + camera->refcount = dmnsn_new_refcount(); return camera; } @@ -40,7 +41,8 @@ dmnsn_new_camera(void) void dmnsn_delete_camera(dmnsn_camera *camera) { - if (camera) { + if (camera && DMNSN_DECREF(camera)) { + dmnsn_delete_refcount(camera->refcount); if (camera->free_fn) { camera->free_fn(camera->ptr); } diff --git a/libdimension/dimension/camera.h b/libdimension/dimension/camera.h index c3ad65b..67fffc0 100644 --- a/libdimension/dimension/camera.h +++ b/libdimension/dimension/camera.h @@ -44,8 +44,9 @@ struct dmnsn_camera { dmnsn_matrix trans; /**< Transformation matrix. */ - /** Generic pointer for camera info. */ - void *ptr; + void *ptr; /**< @internal Generic pointer for camera info. */ + + dmnsn_refcount *refcount; /**< @internal reference count. */ }; /** diff --git a/libdimension/dimension/refcount.h b/libdimension/dimension/refcount.h index 14f31ab..9d2c304 100644 --- a/libdimension/dimension/refcount.h +++ b/libdimension/dimension/refcount.h @@ -30,6 +30,7 @@ #define DMNSN_INCREF(obj) ((void)++(*(obj)->refcount)) /** + * @internal * Decrement a reference count. * @param[in,out] object The reference-counted object to release. * @return Whether the object is now garbage. @@ -42,6 +43,7 @@ typedef unsigned int dmnsn_refcount; /** + * @internal * Create a reference count. * @return A new reference counter, initialized to zero (a "borrowed" reference, * which will be garbage-collected the first time it is deleted). @@ -49,6 +51,7 @@ typedef unsigned int dmnsn_refcount; dmnsn_refcount *dmnsn_new_refcount(void); /** + * @internal * Delete a reference count. Raises an error if the reference count wasn't * zero. */ diff --git a/libdimension/dimension/scene.h b/libdimension/dimension/scene.h index ffe5fb3..b726a77 100644 --- a/libdimension/dimension/scene.h +++ b/libdimension/dimension/scene.h @@ -99,6 +99,13 @@ void dmnsn_initialize_scene(dmnsn_scene *scene); */ void dmnsn_scene_set_canvas(dmnsn_scene *scene, dmnsn_canvas *canvas); +/** + * Set the camera for a scene. + * @param[in,out] scene The scene for which to set the canvas. + * @param[in] camera The camera to set. + */ +void dmnsn_scene_set_camera(dmnsn_scene *scene, dmnsn_camera *camera); + /** * Add an object to a scene. * @param[in,out] scene The scene to which to add the object. diff --git a/libdimension/scene.c b/libdimension/scene.c index 51b8215..ec9fdbd 100644 --- a/libdimension/scene.c +++ b/libdimension/scene.c @@ -91,6 +91,14 @@ dmnsn_scene_set_canvas(dmnsn_scene *scene, dmnsn_canvas *canvas) scene->canvas = canvas; } +void +dmnsn_scene_set_camera(dmnsn_scene *scene, dmnsn_camera *camera) +{ + DMNSN_INCREF(camera); + dmnsn_delete_camera(scene->camera); + scene->camera = camera; +} + void dmnsn_scene_add_object(dmnsn_scene *scene, dmnsn_object *object) { diff --git a/libdimension/tests/render.c b/libdimension/tests/render.c index a84ba63..a79c85c 100644 --- a/libdimension/tests/render.c +++ b/libdimension/tests/render.c @@ -62,8 +62,9 @@ dmnsn_new_test_scene(void) ); /* Create a perspective camera */ - scene->camera = dmnsn_new_perspective_camera(); - scene->camera->trans = trans; + dmnsn_camera *camera = dmnsn_new_perspective_camera(); + camera->trans = trans; + dmnsn_scene_set_camera(scene, camera); /* Background color */ scene->background = dmnsn_clear; -- cgit v1.2.3