summaryrefslogtreecommitdiffstats
path: root/dimension/realize.c
diff options
context:
space:
mode:
Diffstat (limited to 'dimension/realize.c')
-rw-r--r--dimension/realize.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/dimension/realize.c b/dimension/realize.c
index b5f6e50..18de230 100644
--- a/dimension/realize.c
+++ b/dimension/realize.c
@@ -917,6 +917,22 @@ dmnsn_realize_sphere(dmnsn_astnode astnode)
}
static dmnsn_object *
+dmnsn_realize_torus(dmnsn_astnode astnode)
+{
+ dmnsn_assert(astnode.type == DMNSN_AST_TORUS, "Expected a torus.");
+
+ dmnsn_astnode major, minor;
+ dmnsn_array_get(astnode.children, 0, &major);
+ dmnsn_array_get(astnode.children, 1, &minor);
+
+ double R = dmnsn_realize_float(major);
+ double r = dmnsn_realize_float(minor);
+
+ dmnsn_object *torus = dmnsn_new_torus(R, r);
+ return torus;
+}
+
+static dmnsn_object *
dmnsn_realize_plane(dmnsn_astnode astnode)
{
dmnsn_assert(astnode.type == DMNSN_AST_PLANE, "Expected a plane.");
@@ -1064,6 +1080,9 @@ dmnsn_realize_object(dmnsn_astnode astnode, dmnsn_array *lights)
case DMNSN_AST_SPHERE:
object = dmnsn_realize_sphere(onode);
break;
+ case DMNSN_AST_TORUS:
+ object = dmnsn_realize_torus(onode);
+ break;
case DMNSN_AST_UNION:
object = dmnsn_realize_union(onode, modifiers, lights);
break;