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:
authorTon Roosendaal <ton@blender.org>2004-11-17 20:15:36 +0300
committerTon Roosendaal <ton@blender.org>2004-11-17 20:15:36 +0300
commitcefd1b2729b68d07d4a76338bd3ae39740c52b80 (patch)
tree0a57779bb0dd0ba9a3f712d41d4c627f51dbd137
parent32c95ccae440ac4b4996706743469e4101eac932 (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.c6
-rw-r--r--source/blender/renderconverter/intern/convertBlenderScene.c80
-rw-r--r--source/blender/src/toolbox.c2
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},