Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJiri Hnidek <jiri.hnidek@tul.cz>2005-10-30 21:42:50 +0300
committerJiri Hnidek <jiri.hnidek@tul.cz>2005-10-30 21:42:50 +0300
commit0fda3609a644c95827b7f16336feae42c48fc102 (patch)
treeb410a90a2cbd4569ac2d517b4c2a6c8fbfc92c60 /source/blender/src/editmesh_add.c
parent9cce3710ae84a5fba09333abcf2cb1cdcaaa948b (diff)
- bug fix: normal of new added face is calculated without mistakes now
- direction of face normal doesn't depend on user's view to scene anymore, it is influenced only by direction of face normals in nieghborhood
Diffstat (limited to 'source/blender/src/editmesh_add.c')
-rw-r--r--source/blender/src/editmesh_add.c101
1 files changed, 58 insertions, 43 deletions
diff --git a/source/blender/src/editmesh_add.c b/source/blender/src/editmesh_add.c
index efd89d55f86..5cdf35870e5 100644
--- a/source/blender/src/editmesh_add.c
+++ b/source/blender/src/editmesh_add.c
@@ -458,13 +458,21 @@ static void fix_new_face(EditFace *eface)
struct EditVert *ev1=NULL, *ev2=NULL;
short smooth=0; /* "total smoothnes" of faces in neighbourhood */
short coef; /* "weight" of smoothness */
- short count=0; /* number of edges with same direction as edit_face */
- short vi[2][2]; /* vertex indexes */
+ short count=0; /* number of edges with same direction as eface */
+ short vi00, vi01, vi10, vi11; /* vertex indexes */
efa = em->faces.first;
while(efa) {
+
+ if(efa==eface) {
+ efa = efa->next;
+ continue;
+ }
+
coef = 0;
+ ev1 = ev2 = eed = NULL;
+
if(efa->v1==v1 || efa->v2==v1 || efa->v3==v1 || efa->v4==v1) {
ev1 = v1;
coef++;
@@ -492,32 +500,54 @@ static void fix_new_face(EditFace *eface)
else
smooth -= coef;
+ /* try to find edge using vertexes ev1 and ev2 */
if((ev1) && (ev2) && (ev1!=ev2)) eed = findedgelist(ev1, ev2);
- /* has bordering edge of efa same direction as edge of edit_face ? */
+ /* has bordering edge of efa same direction as edge of eface ? */
if(eed) {
- if(eed->v1==v1) vi[0][0] = 1;
- else if(eed->v1==v2) vi[0][0] = 2;
- else if(eed->v1==v3) vi[0][0] = 3;
- else if(eed->v1==v4) vi[0][0] = 0;
-
- if(eed->v2==v1) vi[0][1] = 1;
- else if(eed->v2==v2) vi[0][1] = 2;
- else if(eed->v2==v3) vi[0][1] = 3;
- else if(eed->v2==v4) vi[0][1] = 4;
-
- if(eed->v1==efa->v1) vi[1][0] = 1;
- else if(eed->v1==efa->v2) vi[1][0] = 2;
- else if(eed->v1==efa->v3) vi[1][0] = 3;
- else if(eed->v1==efa->v4) vi[1][0] = 0;
-
- if(eed->v2==efa->v1) vi[1][1] = 1;
- else if(eed->v2==efa->v2) vi[1][1] = 2;
- else if(eed->v2==efa->v3) vi[1][1] = 3;
- else if(eed->v2==efa->v4) vi[1][1] = 4;
-
- if((vi[0][0]>vi[0][1]) && (vi[1][0]>vi[1][1])) count++;
- else if((vi[0][0]<vi[0][1]) && (vi[1][0]<vi[1][1])) count++;
+ if(eed->v1==v1) vi00 = 1;
+ else if(eed->v1==v2) vi00 = 2;
+ else if(eed->v1==v3) vi00 = 3;
+ else if(v4 && eed->v1==v4) vi00 = 4;
+
+ if(eed->v2==v1) vi01 = 1;
+ else if(eed->v2==v2) vi01 = 2;
+ else if(eed->v2==v3) vi01 = 3;
+ else if(v4 && eed->v2==v4) vi01 = 4;
+
+ if(v4) {
+ if(vi01==1 && vi00==4) vi00 = 0;
+ if(vi01==4 && vi00==1) vi01 = 0;
+ }
+ else {
+ if(vi01==1 && vi00==3) vi00 = 0;
+ if(vi01==3 && vi00==1) vi01 = 0;
+ }
+
+ if(eed->v1==efa->v1) vi10 = 1;
+ else if(eed->v1==efa->v2) vi10 = 2;
+ else if(eed->v1==efa->v3) vi10 = 3;
+ else if(efa->v4 && eed->v1==efa->v4) vi10 = 4;
+
+ if(eed->v2==efa->v1) vi11 = 1;
+ else if(eed->v2==efa->v2) vi11 = 2;
+ else if(eed->v2==efa->v3) vi11 = 3;
+ else if(efa->v4 && eed->v2==efa->v4) vi11 = 4;
+
+ if(efa->v4) {
+ if(vi11==1 && vi10==4) vi10 = 0;
+ if(vi11==4 && vi10==1) vi11 = 0;
+ }
+ else {
+ if(vi11==1 && vi10==3) vi10 = 0;
+ if(vi11==3 && vi10==1) vi11 = 0;
+ }
+
+ if(((vi00>vi01) && (vi10>vi11)) ||
+ ((vi00<vi01) && (vi10<vi11)))
+ count++;
+ else
+ count--;
}
efa = efa->next;
@@ -529,15 +559,8 @@ static void fix_new_face(EditFace *eface)
else
eface->flag &= ~ME_SMOOTH;
- /* set up order of vertexes and edges according "face normals" in neighbourhood */
- if(v4 && count>=2) {
- printf("\tflip QUAT\n");
- flipface(eface);
- }
- else if(count>1) {
- printf("\tflip TRIANGLE\n");
- flipface(eface);
- }
+ /* flip face, when too much "face normals" in neighbourhood is different */
+ if(count > 0) flipface(eface);
}
void addedgeface_mesh(void)
@@ -627,16 +650,8 @@ void addedgeface_mesh(void)
else error("The selected vertices already form a face");
}
- if(efa) { // now we're calculating direction of normal
- float inp;
- /* dot product view mat with normal, should give info! */
-
+ if(efa) {
EM_select_face(efa, 1);
- CalcNormFloat(efa->v1->co, efa->v2->co, efa->v3->co, efa->n);
-
- inp= efa->n[0]*G.vd->viewmat[0][2] + efa->n[1]*G.vd->viewmat[1][2] + efa->n[2]*G.vd->viewmat[2][2];
-
- if(inp < 0.0) flipface(efa);
fix_new_face(efa);