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 }
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(); }
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; }