From 70379f85feb3b294742d880a75fabd4452c5ecf3 Mon Sep 17 00:00:00 2001 From: Tavian Barnes Date: Wed, 25 Nov 2009 02:38:41 -0500 Subject: Support scaling and translation transformations. --- dimension/realize.c | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) (limited to 'dimension/realize.c') diff --git a/dimension/realize.c b/dimension/realize.c index 2c5bd81..3b1d327 100644 --- a/dimension/realize.c +++ b/dimension/realize.c @@ -86,6 +86,31 @@ dmnsn_realize_rotation(dmnsn_astnode astnode, dmnsn_object *object) return object; } +static dmnsn_object * +dmnsn_realize_scale(dmnsn_astnode astnode, dmnsn_object *object) +{ + dmnsn_astnode scale_node; + dmnsn_array_get(astnode.children, 0, &scale_node); + dmnsn_vector scale = dmnsn_realize_vector(scale_node); + + object->trans = dmnsn_matrix_mul(dmnsn_scale_matrix(scale), object->trans); + return object; +} + +static dmnsn_object * +dmnsn_realize_translation(dmnsn_astnode astnode, dmnsn_object *object) +{ + dmnsn_astnode trans_node; + dmnsn_array_get(astnode.children, 0, &trans_node); + dmnsn_vector trans = dmnsn_realize_vector(trans_node); + + object->trans = dmnsn_matrix_mul( + dmnsn_translation_matrix(trans), + object->trans + ); + return object; +} + static dmnsn_object * dmnsn_realize_object_modifiers(dmnsn_astnode astnode, dmnsn_object *object) { @@ -98,6 +123,12 @@ dmnsn_realize_object_modifiers(dmnsn_astnode astnode, dmnsn_object *object) case DMNSN_AST_ROTATION: object = dmnsn_realize_rotation(modifier, object); break; + case DMNSN_AST_SCALE: + object = dmnsn_realize_scale(modifier, object); + break; + case DMNSN_AST_TRANSLATION: + object = dmnsn_realize_translation(modifier, object); + break; default: dmnsn_error(DMNSN_SEVERITY_HIGH, "Invalid object modifier."); -- cgit v1.2.3