예제 #1
0
파일: sub_gens.c 프로젝트: nbouteme/rtv1
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);
}
예제 #2
0
파일: sub_gens.c 프로젝트: nbouteme/rtv1
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));
예제 #3
0
파일: eval.cpp 프로젝트: AnilN17/waffle
// 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;
}
예제 #4
0
파일: sub_gens.c 프로젝트: nbouteme/rtv1
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);
}
예제 #5
0
파일: sub_gens.c 프로젝트: nbouteme/rtv1
	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);
}