static unsigned int calc_vol(struct _asset_file *f, uint16_t tri[3], idx_t *out)
{
	unsigned int i;
	vec3_t s[3];
	idx_t surf[3];
	idx_t esurf[3];
	vec3_t a, b, c, d;

	for(i = 0; i < 3; i++) {
		surf[i] = tri[i];
	}

	for(i = 0; i < 3; i++) {
		s[i][0] = f->f_verts[tri[i]].v_vert[0];
		s[i][1] = f->f_verts[tri[i]].v_vert[1];
		s[i][2] = f->f_verts[tri[i]].v_vert[2];
	}

	for(i = 0; i < 3; i++) {
		esurf[i] = tri[i] + f->f_hdr->h_verts;
	}

	/* don't cast shadows for triangles not facing light */
	v_sub(a, s[1], s[0]);
	v_sub(b, s[2], s[0]);
	v_cross_product(c, a, b);
	v_normalize(c);
	for(i = 0; i < 3; i++)
		d[i] = f->f_lightpos[i];
	v_normalize(d);
	if ( v_dot_product(c, d) < 0 )
		return 0;

#if SHADOW_CAPS
	emit_tri(&out, esurf[2], esurf[1], esurf[0]);
	emit_tri(&out, surf[0], surf[1], surf[2]);
#endif

	for(i = 0; i < 3; i++) {
		unsigned int a, b;

		a = (i % 3);
		b = ((i + 1) % 3);

		emit_tri(&out, surf[a], esurf[a], surf[b]);
		emit_tri(&out, surf[b], esurf[a], esurf[b]);
	}

#if SHADOW_CAPS
	return 8;
#else
	return 6;
#endif
}
Beispiel #2
0
static void trick_emit(int seq, struct theory_tree *tt)
{
	int ids[3];
	fprintf(pout, "\n(* tricks for L%d *)\n", seq);
	if(tt->lt && tt->eq && tt->gt)
	{
		ids[0] = emit_tt(seq, tt->lt);
		ids[1] = emit_tt(seq, tt->eq);
		ids[2] = emit_tt(seq, tt->gt);
	}
	tt->env->mem[tt->env->n-1].neg = !tt->env->mem[tt->env->n-1].neg;
	fprintf(pout, "Lemma trick_%d:", seq);
	litlist_print(tt->env, 0, "->", pout);
	fprintf(pout, ".\n");
	if(tt->lt && tt->eq && tt->gt)
		emit_tri(seq, ids, tt->env->n, !tt->env->mem[tt->env->n-1].neg);
	else
		emit_tactic();
}
Beispiel #3
0
static int emit_tt(int seq, struct theory_tree *tt)
{
	int myid = tid++;
	int ids[3];
	if(tt->lt && tt->eq && tt->gt)
	{
		ids[0] = emit_tt(seq, tt->lt);
		ids[1] = emit_tt(seq, tt->eq);
		ids[2] = emit_tt(seq, tt->gt);
	}
	tt->env->mem[tt->env->n-1].neg = !tt->env->mem[tt->env->n-1].neg;
	fprintf(pout, "Lemma trick_%d_%d:", seq, myid);
	litlist_print(tt->env, 0, "->", pout);
	fprintf(pout, ".\n");
	if(tt->lt && tt->eq && tt->gt)
		emit_tri(seq, ids, tt->env->n, !tt->env->mem[tt->env->n-1].neg);
	else
		emit_tactic();
	return myid;
}