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:
authorDaniel Dunbar <daniel@zuster.org>2005-07-23 23:03:43 +0400
committerDaniel Dunbar <daniel@zuster.org>2005-07-23 23:03:43 +0400
commitfb651ddb4a47d86312a4afafaa48e1bf4e48447f (patch)
treed6e2e742f5aa1b8a4997705536e6fef828509ec0 /source/blender/src/editmesh_lib.c
parent948f27c0d888bbfe0f10c4350b4269166568b40d (diff)
- change mesh_calc_normals to set vertices with len(no)==0
to normalised coordinate (convention in blender, helps with halo) - removed vertexnormals(), vertexnormals_mesh() - removed CTX_NO_NOR_RECALC (always assume already calculated) - change NMesh.c to call mesh_calc_normals - chance load_editMesh to call mesh_calc_normals after done converting instead of using editmesh normals - update recalc_editnormals to also calc vertex normals (whats 4 more adds and a sqrt among friends) Its hard to believe, but it just might be the case that there are only two places mesh normals are calculated now (renderer and kernel)
Diffstat (limited to 'source/blender/src/editmesh_lib.c')
-rw-r--r--source/blender/src/editmesh_lib.c160
1 files changed, 14 insertions, 146 deletions
diff --git a/source/blender/src/editmesh_lib.c b/source/blender/src/editmesh_lib.c
index 58879a39fbd..677aa070788 100644
--- a/source/blender/src/editmesh_lib.c
+++ b/source/blender/src/editmesh_lib.c
@@ -1306,149 +1306,6 @@ static int check_vnormal_flip(float *n, float *vnorm)
}
-void vertexnormals(int testflip)
-{
- EditMesh *em = G.editMesh;
- Mesh *me;
- EditVert *eve;
- EditFace *efa;
- float n1[3], n2[3], n3[3], n4[3], co[4], *temp;
- float xn, yn, zn;
- float len, area;
-
- if(G.obedit && G.obedit->type==OB_MESH) {
- me= G.obedit->data;
- if((me->flag & ME_TWOSIDED)==0) testflip= 0;
- }
-
- if(G.totvert==0) return;
-
- if(G.totface==0) {
- /* fake vertex normals for 'halo puno'! */
- eve= em->verts.first;
- while(eve) {
- VECCOPY(eve->no, eve->co);
- Normalise( (float *)eve->no);
- eve= eve->next;
- }
- return;
- }
-
- /* clear normals, clear flag */
- eve= em->verts.first;
- while(eve) {
- eve->no[0]= eve->no[1]= eve->no[2]= 0.0;
- eve->f2= 0;
- eve= eve->next;
- }
-
- /* check for vertices being shared by both solid and smooth face,
- these get vertexnormal of smooth face normal only */
- for(efa= em->faces.first; efa; efa= efa->next) {
- if(efa->flag & ME_SMOOTH) {
- efa->v1->f2 |= 1; efa->v2->f2 |= 1; efa->v3->f2 |= 1;
- if(efa->v4) efa->v4->f2 |= 1;
- }
- else {
- efa->v1->f2 |= 2; efa->v2->f2 |= 2; efa->v3->f2 |= 2;
- if(efa->v4) efa->v4->f2 |= 2;
- }
- }
-
- /* calculate cosine angles and add to vertex normal */
- for(efa= em->faces.first; efa; efa= efa->next) {
- VecSubf(n1, efa->v2->co, efa->v1->co);
- VecSubf(n2, efa->v3->co, efa->v2->co);
- Normalise(n1);
- Normalise(n2);
-
- if(efa->v4==0) {
- VecSubf(n3, efa->v1->co, efa->v3->co);
- Normalise(n3);
-
- //area= AreaT3Dfl(efa->v1->co, efa->v2->co, efa->v3->co);
- //if(area!=0.0) area=1.0/area;
- //area= sqrt(area);
- area= 1.0;
-
- co[0]= area*saacos(-n3[0]*n1[0]-n3[1]*n1[1]-n3[2]*n1[2]);
- co[1]= area*saacos(-n1[0]*n2[0]-n1[1]*n2[1]-n1[2]*n2[2]);
- co[2]= area*saacos(-n2[0]*n3[0]-n2[1]*n3[1]-n2[2]*n3[2]);
-
- }
- else {
- VecSubf(n3, efa->v4->co, efa->v3->co);
- VecSubf(n4, efa->v1->co, efa->v4->co);
- Normalise(n3);
- Normalise(n4);
-
- //area= AreaQ3Dfl(efa->v1->co, efa->v2->co, efa->v3->co, efa->v4->co);
- //if(area!=0.0) area=1.0/area;
- //area= sqrt(area);
- area= 1.0;
-
- co[0]= area*saacos(-n4[0]*n1[0]-n4[1]*n1[1]-n4[2]*n1[2]);
- co[1]= area*saacos(-n1[0]*n2[0]-n1[1]*n2[1]-n1[2]*n2[2]);
- co[2]= area*saacos(-n2[0]*n3[0]-n2[1]*n3[1]-n2[2]*n3[2]);
- co[3]= area*saacos(-n3[0]*n4[0]-n3[1]*n4[1]-n3[2]*n4[2]);
- }
-
- if(efa->v1->f2!=3 || (efa->flag & ME_SMOOTH)) {
- temp= efa->v1->no;
- if(testflip && check_vnormal_flip(efa->n, temp) ) co[0]= -co[0];
- temp[0]+= co[0]*efa->n[0];
- temp[1]+= co[0]*efa->n[1];
- temp[2]+= co[0]*efa->n[2];
- }
-
- if(efa->v2->f2!=3 || (efa->flag & ME_SMOOTH)) {
- temp= efa->v2->no;
- if(testflip && check_vnormal_flip(efa->n, temp) ) co[1]= -co[1];
- temp[0]+= co[1]*efa->n[0];
- temp[1]+= co[1]*efa->n[1];
- temp[2]+= co[1]*efa->n[2];
- }
-
- if(efa->v3->f2!=3 || (efa->flag & ME_SMOOTH)) {
- temp= efa->v3->no;
- if(testflip && check_vnormal_flip(efa->n, temp) ) co[2]= -co[2];
- temp[0]+= co[2]*efa->n[0];
- temp[1]+= co[2]*efa->n[1];
- temp[2]+= co[2]*efa->n[2];
- }
-
- if(efa->v4 && (efa->v4->f2!=3 || (efa->flag & ME_SMOOTH))) {
- temp= efa->v4->no;
- if(testflip && check_vnormal_flip(efa->n, temp) ) co[3]= -co[3];
- temp[0]+= co[3]*efa->n[0];
- temp[1]+= co[3]*efa->n[1];
- temp[2]+= co[3]*efa->n[2];
- }
- }
-
- /* normalise vertex normals */
- eve= em->verts.first;
- while(eve) {
- len= Normalise(eve->no);
- if(len==0.0) {
- VECCOPY(eve->no, eve->co);
- Normalise( eve->no);
- }
- eve= eve->next;
- }
-
- /* vertex normal flip-flags for shade (render) */
- efa= em->faces.first;
- while(efa) {
- /* projection for cubemap! */
- xn= fabs(efa->n[0]);
- yn= fabs(efa->n[1]);
- zn= fabs(efa->n[2]);
-
- efa= efa->next;
- }
-}
-
void flipface(EditFace *efa)
{
if(efa->v4) {
@@ -1491,18 +1348,29 @@ void recalc_editnormals(void)
{
EditMesh *em = G.editMesh;
EditFace *efa;
+ EditVert *eve;
- efa= em->faces.first;
- while(efa) {
+ for(eve= em->verts.first; eve; eve=eve->next) {
+ eve->no[0] = eve->no[1] = eve->no[2] = 0.0;
+ }
+
+ for(efa= em->faces.first; efa; efa=efa->next) {
if(efa->v4) {
CalcNormFloat4(efa->v1->co, efa->v2->co, efa->v3->co, efa->v4->co, efa->n);
CalcCent4f(efa->cent, efa->v1->co, efa->v2->co, efa->v3->co, efa->v4->co);
+ VecAddf(efa->v4->no, efa->v4->no, efa->n);
}
else {
CalcNormFloat(efa->v1->co, efa->v2->co, efa->v3->co, efa->n);
CalcCent3f(efa->cent, efa->v1->co, efa->v2->co, efa->v3->co);
}
- efa= efa->next;
+ VecAddf(efa->v1->no, efa->v1->no, efa->n);
+ VecAddf(efa->v2->no, efa->v2->no, efa->n);
+ VecAddf(efa->v3->no, efa->v3->no, efa->n);
+ }
+
+ for(eve= em->verts.first; eve; eve=eve->next) {
+ Normalise(eve->no);
}
}