static void edge_normal_compare(EditEdge *eed, EditFace *efa1) { EditFace *efa2; float cent1[3], cent2[3]; float inp; efa2 = eed->tmp.f; if(efa1==efa2) return; inp= efa1->n[0]*efa2->n[0] + efa1->n[1]*efa2->n[1] + efa1->n[2]*efa2->n[2]; if(inp<0.999f && inp >-0.999f) eed->f2= 1; if(efa1->v4) cent_quad_v3(cent1, efa1->v1->co, efa1->v2->co, efa1->v3->co, efa1->v4->co); else cent_tri_v3(cent1, efa1->v1->co, efa1->v2->co, efa1->v3->co); if(efa2->v4) cent_quad_v3(cent2, efa2->v1->co, efa2->v2->co, efa2->v3->co, efa2->v4->co); else cent_tri_v3(cent2, efa2->v1->co, efa2->v2->co, efa2->v3->co); sub_v3_v3v3(cent1, cent2, cent1); normalize_v3(cent1); inp= cent1[0]*efa1->n[0] + cent1[1]*efa1->n[1] + cent1[2]*efa1->n[2]; if(inp < -0.001f) eed->f1= 1; }
static void occ_face(const OccFace *face, float co[3], float normal[3], float *area) { ObjectInstanceRen *obi; VlakRen *vlr; float v1[3], v2[3], v3[3], v4[3]; obi = &R.objectinstance[face->obi]; vlr = RE_findOrAddVlak(obi->obr, face->facenr); if (co) { if (vlr->v4) mid_v3_v3v3(co, vlr->v1->co, vlr->v3->co); else cent_tri_v3(co, vlr->v1->co, vlr->v2->co, vlr->v3->co); if (obi->flag & R_TRANSFORMED) mul_m4_v3(obi->mat, co); } if (normal) { normal[0] = -vlr->n[0]; normal[1] = -vlr->n[1]; normal[2] = -vlr->n[2]; if (obi->flag & R_TRANSFORMED) mul_m3_v3(obi->nmat, normal); } if (area) { copy_v3_v3(v1, vlr->v1->co); copy_v3_v3(v2, vlr->v2->co); copy_v3_v3(v3, vlr->v3->co); if (vlr->v4) copy_v3_v3(v4, vlr->v4->co); if (obi->flag & R_TRANSFORMED) { mul_m4_v3(obi->mat, v1); mul_m4_v3(obi->mat, v2); mul_m4_v3(obi->mat, v3); if (vlr->v4) mul_m4_v3(obi->mat, v4); } /* todo: correct area for instances */ if (vlr->v4) *area = area_quad_v3(v1, v2, v3, v4); else *area = area_tri_v3(v1, v2, v3); } }
EditFace *addfacelist(EditMesh *em, EditVert *v1, EditVert *v2, EditVert *v3, EditVert *v4, EditFace *example, EditFace *exampleEdges) { EditFace *efa; EditEdge *e1, *e2=0, *e3=0, *e4=0; /* added sanity check... seems to happen for some tools, or for enter editmode for corrupted meshes */ if(v1==v4 || v2==v4 || v3==v4) v4= NULL; /* add face to list and do the edges */ if(exampleEdges) { e1= addedgelist(em, v1, v2, exampleEdges->e1); e2= addedgelist(em, v2, v3, exampleEdges->e2); if(v4) e3= addedgelist(em, v3, v4, exampleEdges->e3); else e3= addedgelist(em, v3, v1, exampleEdges->e3); if(v4) e4= addedgelist(em, v4, v1, exampleEdges->e4); } else { e1= addedgelist(em, v1, v2, NULL); e2= addedgelist(em, v2, v3, NULL); if(v4) e3= addedgelist(em, v3, v4, NULL); else e3= addedgelist(em, v3, v1, NULL); if(v4) e4= addedgelist(em, v4, v1, NULL); } if(v1==v2 || v2==v3 || v1==v3) return NULL; if(e2==0) return NULL; efa= (EditFace *)callocface(em, sizeof(EditFace), 1); efa->v1= v1; efa->v2= v2; efa->v3= v3; efa->v4= v4; efa->e1= e1; efa->e2= e2; efa->e3= e3; efa->e4= e4; if(example) { efa->mat_nr= example->mat_nr; efa->flag= example->flag; CustomData_em_copy_data(&em->fdata, &em->fdata, example->data, &efa->data); CustomData_em_validate_data(&em->fdata, efa->data, efa->v4 ? 4 : 3); } else { efa->mat_nr= em->mat_nr; CustomData_em_set_default(&em->fdata, &efa->data); } BLI_addtail(&em->faces, efa); em->totface++; if(efa->v4) { normal_quad_v3( efa->n,efa->v1->co, efa->v2->co, efa->v3->co, efa->v4->co); cent_quad_v3(efa->cent, efa->v1->co, efa->v2->co, efa->v3->co, efa->v4->co); } else { normal_tri_v3( efa->n,efa->v1->co, efa->v2->co, efa->v3->co); cent_tri_v3(efa->cent, efa->v1->co, efa->v2->co, efa->v3->co); } return efa; }