From 21794278ae305acd5dc13d0cd6a491f420b69880 Mon Sep 17 00:00:00 2001 From: Tavian Barnes Date: Thu, 25 Feb 2010 01:26:14 -0500 Subject: New dmnsn_interior* type. --- libdimension/Makefile.am | 2 ++ libdimension/dimension.h | 1 + libdimension/dimension/interior.h | 42 +++++++++++++++++++++++++++++++++++ libdimension/dimension/object.h | 3 +++ libdimension/interior.c | 46 +++++++++++++++++++++++++++++++++++++++ libdimension/object.c | 7 +++--- libdimension/texture.c | 2 +- tests/libdimension/tests.c | 14 +++++++++++- 8 files changed, 112 insertions(+), 5 deletions(-) create mode 100644 libdimension/dimension/interior.h create mode 100644 libdimension/interior.c diff --git a/libdimension/Makefile.am b/libdimension/Makefile.am index eca9bf1..deb60c3 100644 --- a/libdimension/Makefile.am +++ b/libdimension/Makefile.am @@ -30,6 +30,7 @@ nobase_include_HEADERS = dimension.h \ dimension/finishes.h \ dimension/geometry.h \ dimension/gl.h \ + dimension/interior.h \ dimension/light.h \ dimension/lights.h \ dimension/object.h \ @@ -58,6 +59,7 @@ libdimension_la_SOURCES = $(nobase_include_HEADERS) \ geometry.c \ gl.c \ inlines.c \ + interior.c \ light.c \ object.c \ perspective.c \ diff --git a/libdimension/dimension.h b/libdimension/dimension.h index 77697da..be0e9bb 100644 --- a/libdimension/dimension.h +++ b/libdimension/dimension.h @@ -71,6 +71,7 @@ typedef void dmnsn_free_fn(void *ptr); #include #include #include +#include #include #include #include diff --git a/libdimension/dimension/interior.h b/libdimension/dimension/interior.h new file mode 100644 index 0000000..0ab4a30 --- /dev/null +++ b/libdimension/dimension/interior.h @@ -0,0 +1,42 @@ +/************************************************************************* + * Copyright (C) 2010 Tavian Barnes * + * * + * This file is part of The Dimension Library. * + * * + * The Dimension Library is free software; you can redistribute it and/ * + * or modify it under the terms of the GNU Lesser General Public License * + * as published by the Free Software Foundation; either version 3 of the * + * License, or (at your option) any later version. * + * * + * The Dimension Library is distributed in the hope that it will be * + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty * + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with this program. If not, see * + * . * + *************************************************************************/ + +/* + * Object interiors. + */ + +#ifndef DIMENSION_INTERIOR_H +#define DIMENSION_INTERIOR_H + +typedef struct dmnsn_interior { + /* Refractive index */ + double ior; + + /* Callbacks */ + dmnsn_free_fn *free_fn; + + /* Generic pointer */ + void *ptr; +} dmnsn_interior; + +dmnsn_interior *dmnsn_new_interior(); +void dmnsn_delete_interior(dmnsn_interior *interior); + +#endif /* DIMENSION_INTERIOR_H */ diff --git a/libdimension/dimension/object.h b/libdimension/dimension/object.h index a415d39..4c1980d 100644 --- a/libdimension/dimension/object.h +++ b/libdimension/dimension/object.h @@ -58,6 +58,9 @@ struct dmnsn_object { /* Surface properties */ dmnsn_texture *texture; + /* Interior properties */ + dmnsn_interior *interior; + /* Transformation matrix */ dmnsn_matrix trans, trans_inv; diff --git a/libdimension/interior.c b/libdimension/interior.c new file mode 100644 index 0000000..a643f70 --- /dev/null +++ b/libdimension/interior.c @@ -0,0 +1,46 @@ +/************************************************************************* + * Copyright (C) 2010 Tavian Barnes * + * * + * This file is part of The Dimension Library. * + * * + * The Dimension Library is free software; you can redistribute it and/ * + * or modify it under the terms of the GNU Lesser General Public License * + * as published by the Free Software Foundation; either version 3 of the * + * License, or (at your option) any later version. * + * * + * The Dimension Library is distributed in the hope that it will be * + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty * + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with this program. If not, see * + * . * + *************************************************************************/ + +#include "dimension.h" +#include /* For malloc */ + +/* Allocate an interior */ +dmnsn_interior * +dmnsn_new_interior() +{ + dmnsn_interior *interior = malloc(sizeof(dmnsn_interior)); + if (interior) { + interior->ior = 1.0; + interior->free_fn = NULL; + } + return interior; +} + +/* Free a interior */ +void +dmnsn_delete_interior(dmnsn_interior *interior) +{ + if (interior) { + if (interior->free_fn) { + (*interior->free_fn)(interior->ptr); + } + free(interior); + } +} diff --git a/libdimension/object.c b/libdimension/object.c index ffb753f..a1b161e 100644 --- a/libdimension/object.c +++ b/libdimension/object.c @@ -45,9 +45,10 @@ dmnsn_new_object() { dmnsn_object *object = malloc(sizeof(dmnsn_object)); if (object) { - object->texture = NULL; - object->trans = dmnsn_identity_matrix(); - object->free_fn = NULL; + object->texture = NULL; + object->interior = NULL; + object->trans = dmnsn_identity_matrix(); + object->free_fn = NULL; } return object; } diff --git a/libdimension/texture.c b/libdimension/texture.c index 649d18e..24ff759 100644 --- a/libdimension/texture.c +++ b/libdimension/texture.c @@ -78,7 +78,7 @@ dmnsn_new_texture() dmnsn_texture *texture = malloc(sizeof(dmnsn_texture)); if (texture) { texture->pigment = NULL; - texture->finish = NULL; + texture->finish = NULL; } return texture; } diff --git a/tests/libdimension/tests.c b/tests/libdimension/tests.c index 15c5967..d8d1dd9 100644 --- a/tests/libdimension/tests.c +++ b/tests/libdimension/tests.c @@ -124,7 +124,19 @@ dmnsn_new_default_scene() return NULL; } - cube->texture->finish = dmnsn_new_reflective_finish(dmnsn_white, dmnsn_white, 1.0); + cube->texture->finish = dmnsn_new_reflective_finish(dmnsn_white, dmnsn_white, + 1.0); + if (!cube->texture->finish) { + dmnsn_delete_scene(scene); + return NULL; + } + + cube->interior = dmnsn_new_interior(); + if (!cube->interior) { + dmnsn_delete_scene(scene); + return NULL; + } + cube->interior->ior = 1.3; cube->trans = dmnsn_rotation_matrix(dmnsn_new_vector(0.75, 0.0, 0.0)); -- cgit v1.2.3