t_generror *gen_material(t_imaterial *ret, t_ast *ass, t_ast *r) { t_ast *pos; void *e; pos = eval_ref(r, get_value(ass, "diffuse")); if (!pos) return (new_gerror(ass, ATTR_MISS "material: ", "diffuse")); if ((e = gen_vec3(ret->diffuse.v, pos, r))) return (e); ret->spec_intensity = 999999.9f; ret->reflectivity = 0.0f; ret->transluscence = 0.0f; pos = eval_ref(r, get_value(ass, "ambiant")); if (pos && (e = gen_vec3(ret->ambiant.v, pos, r))) return (e); pos = eval_ref(r, get_value(ass, "spec")); if (pos && (e = gen_scalar(&ret->spec_intensity, pos))) return (e); pos = eval_ref(r, get_value(ass, "reflectivity")); if (pos && (e = gen_scalar(&ret->reflectivity, pos))) return (e); pos = eval_ref(r, get_value(ass, "transluscence")); if (pos && (e = gen_scalar(&ret->transluscence, pos))) return (e); return (0); }
t_generror *gen_trans(t_itrans *ret, t_ast *ass, t_ast *r) { t_ast *pos; void *e; pos = eval_ref(r, get_value(ass, "position")); if (!pos) return (new_gerror(ass, ATTR_MISS "transform: ", "position")); if ((e = gen_vec3(ret->pos.v, pos, r))) return (e); ft_memcpy(ret->rot_axis.v, (float[]){1.0, 0.0, 0.0}, sizeof(ret->rot_axis));
// Compute the multi-step evaluation of the term t. Term* eval(Term* t) { switch (t->kind) { case if_term: return eval_if(as<If>(t)); case succ_term: return eval_succ(as<Succ>(t)); case pred_term: return eval_pred(as<Pred>(t)); case iszero_term: return eval_iszero(as<Iszero>(t)); case app_term: return eval_app(as<App>(t)); case call_term: return eval_call(as<Call>(t)); case ref_term: return eval_ref(as<Ref>(t)); case print_term: return eval_print(as<Print>(t)); case def_term: return eval_def(as<Def>(t)); case prog_term: return eval_prog(as<Prog>(t)); case comma_term: return eval_comma(as<Comma>(t)); default: break; } return t; }
t_generror *gen_vec3(float *a, t_ast *elem, t_ast *root) { int i; t_ast *e; void *tmp; if (!ft_strstr(elem->tag, "|array")) return (new_gerror(elem, "Expected type array, got: ", elem->tag)); if (elem->n_children != 7) return (new_gerror(elem, "Wrong number of elements: ", "3 needed")); i = 1; while (i < elem->n_children) { e = eval_ref(root, elem->children[i]); if ((tmp = gen_scalar(&a[(i - 1) / 2], e))) return (tmp); i += 2; } return (0); }
pos = eval_ref(r, get_value(ass, "transluscence")); if (pos && (e = gen_scalar(&ret->transluscence, pos))) return (e); return (0); } t_generror *gen_trans(t_itrans *ret, t_ast *ass, t_ast *r) { t_ast *pos; void *e; pos = eval_ref(r, get_value(ass, "position")); if (!pos) return (new_gerror(ass, ATTR_MISS "transform: ", "position")); if ((e = gen_vec3(ret->pos.v, pos, r))) return (e); ft_memcpy(ret->rot_axis.v, (float[]){1.0, 0.0, 0.0}, sizeof(ret->rot_axis)); ft_memcpy(ret->scale.v, (float[]){1.0, 1.0, 1.0}, sizeof(ret->scale)); ret->rot_angle = 0.0f; pos = eval_ref(r, get_value(ass, "rot_axis")); if (pos && (e = gen_vec3(ret->rot_axis.v, pos, r))) return (e); pos = eval_ref(r, get_value(ass, "rot_angle")); if (pos && (e = gen_scalar(&ret->rot_angle, pos))) return (e); pos = eval_ref(r, get_value(ass, "scale")); if (pos && (e = gen_vec3(ret->scale.v, pos, r))) return (e); return (0); }