diff options
author | Ton Roosendaal <ton@blender.org> | 2004-11-17 20:15:36 +0300 |
---|---|---|
committer | Ton Roosendaal <ton@blender.org> | 2004-11-17 20:15:36 +0300 |
commit | cefd1b2729b68d07d4a76338bd3ae39740c52b80 (patch) | |
tree | 0a57779bb0dd0ba9a3f712d41d4c627f51dbd137 | |
parent | 32c95ccae440ac4b4996706743469e4101eac932 (diff) |
Three bugfixes from tracker;
- Nurbs objects didnt render ray-transp. Was caused by 1) wrong normal calc
and 2) quads with vertices on same locations. Solved it with nice code that
checks illegal quads and turns them into triangles
- Made 'physics engine' variable SUMO default
- Typo in toolbox fix; cyclic isn't F but C
-rw-r--r-- | source/blender/blenloader/intern/readfile.c | 6 | ||||
-rw-r--r-- | source/blender/renderconverter/intern/convertBlenderScene.c | 80 | ||||
-rw-r--r-- | source/blender/src/toolbox.c | 2 |
3 files changed, 60 insertions, 28 deletions
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index 8d1c663d9c9..c67a0282bf1 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -4555,9 +4555,15 @@ static void do_versions(Main *main) } if(main->versionfile <= 234) { Scene *sce; + World *wo; bScreen *sc; int set_zbuf_sel=0; + // force sumo engine to be active + for (wo = main->world.first; wo; wo= wo->id.next) { + if(wo->physicsEngine==0) wo->physicsEngine = 2; + } + for (sce= main->scene.first; sce; sce= sce->id.next) { if(sce->selectmode==0) { sce->selectmode= SCE_SELECT_VERTEX; diff --git a/source/blender/renderconverter/intern/convertBlenderScene.c b/source/blender/renderconverter/intern/convertBlenderScene.c index 9cf0cb837ef..c7282fc46d8 100644 --- a/source/blender/renderconverter/intern/convertBlenderScene.c +++ b/source/blender/renderconverter/intern/convertBlenderScene.c @@ -36,6 +36,7 @@ #define DL_CYCLIC_U 1 #define DL_CYCLIC_V 2 + #include <math.h> #include <stdlib.h> #include <stdio.h> @@ -159,7 +160,7 @@ static void displace_render_vert(ShadeInput *shi, VertRen *vr, float *scale); /* ------------------------------------------------------------------------- */ #define UVTOINDEX(u,v) (startvlak + (u) * sizev + (v)) -#define GETNORMAL(face,normal) CalcNormFloat4(face->v4->co, face->v3->co, face->v2->co, face->v1->co, normal) +#define GETNORMAL(face,normal) CalcNormFloat4(face->v1->co, face->v2->co, face->v3->co, face->v4->co, normal) /* NOTE THAT U/V COORDINATES ARE SOMETIMES SWAPPED !! @@ -1799,7 +1800,6 @@ static void init_render_surf(Object *ob) int sizeu, sizev; VlakRen *vlr1, *vlr2, *vlr3; float n2[3], vn[3]; - int index; #endif cu= ob->data; @@ -1961,12 +1961,6 @@ static void init_render_surf(Object *ob) /* process generic surface */ for(u = 0; u < sizeu - 1; u++) { - -/* DL_SURFINDEX(dl->flag & DL_CYCLIC_U, dl->flag & DL_CYCLIC_V, dl->nr, dl->parts); - DL_SURFINDEX(0, 0, dl->nr, dl->parts); -*/ - - /* ^ ()----p4----p3----() @@ -1998,7 +1992,7 @@ static void init_render_surf(Object *ob) // if(flen!=0.0) { vlr= RE_findOrAddVlak(R.totvlak++); vlr->ob= ob; - vlr->v1= v1; vlr->v2= v2; vlr->v3= v3; vlr->v4= v4; + vlr->v1= v4; vlr->v2= v3; vlr->v3= v2; vlr->v4= v1; // note, displists for nurbs are again opposite, tsk tsk VECCOPY(vlr->n, n1); vlr->lay= ob->lay; vlr->mat= matar[ dl->col]; @@ -2024,8 +2018,6 @@ static void init_render_surf(Object *ob) for (v = 0; v < sizev; v++) { /* optimize! :*/ - index = startvlak + v; - // vlr= RE_findOrAddVlak(index + (sizeu-1) * sizev); vlr= RE_findOrAddVlak(UVTOINDEX(sizeu - 1, v)); GETNORMAL(vlr, n1); vlr1= RE_findOrAddVlak(UVTOINDEX(0, v)); @@ -2041,12 +2033,9 @@ static void init_render_surf(Object *ob) for (u = 0; u < sizeu; u++) { /* optimize! :*/ - index = startvlak + u * sizev; - //vlr= RE_findOrAddVlak(index); vlr= RE_findOrAddVlak(UVTOINDEX(u, 0)); GETNORMAL(vlr, n1); vlr1= RE_findOrAddVlak(UVTOINDEX(u, sizev-1)); - // vlr1= RE_findOrAddVlak(index + (sizev - 1)); GETNORMAL(vlr1, n2); VecAddf(vlr1->v2->n, vlr1->v2->n, n1); VecAddf(vlr1->v3->n, vlr1->v3->n, n1); @@ -2071,7 +2060,7 @@ static void init_render_surf(Object *ob) normals of the surrounding faces to all of the duplicates of [] */ - if (dl->flag & DL_CYCLIC_U && dl->flag & DL_CYCLIC_V) + if ((dl->flag & DL_CYCLIC_U) && (dl->flag & DL_CYCLIC_V)) { vlr= RE_findOrAddVlak(UVTOINDEX(sizeu - 1, sizev - 1)); /* (m,n) */ GETNORMAL(vlr, n1); @@ -2755,34 +2744,71 @@ static void set_fullsample_flag(void) } } +/* 10 times larger than normal epsilon, test it on default nurbs sphere with ray_transp */ +#define FLT_EPSILON 1.19209290e-06F + + static void check_non_flat_quads(void) { VlakRen *vlr, *vlr1; + VertRen *v1, *v2, *v3, *v4; float nor[3], xn, flen; int a; for(a=R.totvlak-1; a>=0; a--) { vlr= RE_findOrAddVlak(a); - /* Face is divided along edge with the least gradient */ - /* Flagged with R_DIVIDE_24 if divide is from vert 2 to 4 */ - /* 4---3 4---3 */ - /* |\ 1| or |1 /| */ - /* |0\ | |/ 0| */ - /* 1---2 1---2 0 = orig face, 1 = new face */ - - /* test if rendering as a quad or triangle */ - if(vlr->v4) { - - if(vlr->mat->mode & MA_WIRE); + /* test if rendering as a quad or triangle, skip wire */ + if(vlr->v4 && (vlr->mat->mode & MA_WIRE)==0) { + + /* check if quad is actually triangle */ + v1= vlr->v1; + v2= vlr->v2; + v3= vlr->v3; + v4= vlr->v4; + VECSUB(nor, v1->co, v2->co); + if( ABS(nor[0])<FLT_EPSILON && ABS(nor[1])<FLT_EPSILON && ABS(nor[2])<FLT_EPSILON ) { + vlr->v1= v2; + vlr->v2= v3; + vlr->v3= v4; + vlr->v4= NULL; + } else { + VECSUB(nor, v2->co, v3->co); + if( ABS(nor[0])<FLT_EPSILON && ABS(nor[1])<FLT_EPSILON && ABS(nor[2])<FLT_EPSILON ) { + vlr->v2= v3; + vlr->v3= v4; + vlr->v4= NULL; + } + else { + VECSUB(nor, v3->co, v4->co); + if( ABS(nor[0])<FLT_EPSILON && ABS(nor[1])<FLT_EPSILON && ABS(nor[2])<FLT_EPSILON ) { + vlr->v4= NULL; + } + else { + VECSUB(nor, v4->co, v1->co); + if( ABS(nor[0])<FLT_EPSILON && ABS(nor[1])<FLT_EPSILON && ABS(nor[2])<FLT_EPSILON ) { + vlr->v4= NULL; + } + } + } + } + + if(vlr->v4) { + + /* Face is divided along edge with the least gradient */ + /* Flagged with R_DIVIDE_24 if divide is from vert 2 to 4 */ + /* 4---3 4---3 */ + /* |\ 1| or |1 /| */ + /* |0\ | |/ 0| */ + /* 1---2 1---2 0 = orig face, 1 = new face */ /* render normals are inverted in render! we calculate normal of single tria here */ flen= CalcNormFloat(vlr->v4->co, vlr->v3->co, vlr->v1->co, nor); if(flen==0.0) CalcNormFloat(vlr->v4->co, vlr->v2->co, vlr->v1->co, nor); xn= nor[0]*vlr->n[0] + nor[1]*vlr->n[1] + nor[2]*vlr->n[2]; - if(fabs(xn) < 0.99995 ) { // checked on noisy fractal grid + if(ABS(xn) < 0.99995 ) { // checked on noisy fractal grid float d1, d2; vlr1= RE_findOrAddVlak(R.totvlak++); diff --git a/source/blender/src/toolbox.c b/source/blender/src/toolbox.c index 659bba0c32b..65ae77e2a42 100644 --- a/source/blender/src/toolbox.c +++ b/source/blender/src/toolbox.c @@ -1692,7 +1692,7 @@ static TBitem tb_curve_edit[]= { { 0, "Extrude|E", 'e', NULL}, { 0, "Duplicate|Shift D", 'D', NULL}, { 0, "Make Segment|F", 'f', NULL}, -{ 0, "Toggle Cyclic|F", 'c', NULL}, +{ 0, "Toggle Cyclic|C", 'c', NULL}, { 0, "Delete...|X", 'x', NULL}, { 0, "SEPR", 0, NULL}, { 0, "Control Points", 0, tb_curve_edit_cv}, |