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
This commit is contained in:
Ton Roosendaal
2004-11-17 17:15:36 +00:00
parent 32c95ccae4
commit cefd1b2729
3 changed files with 60 additions and 28 deletions

View File

@@ -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;

View File

@@ -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++);

View File

@@ -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},