Revision: 15137
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=15137
Author:   campbellbarton
Date:     2008-06-05 20:26:34 +0200 (Thu, 05 Jun 2008)

Log Message:
-----------
Apricot feature, thats fit for trunk.
Baking would split non-planer quads in an unpredictable way, which is fine for 
rending but game engines often use a fixed order (0,1,2), (0,2,3) or (1,2,3) 
(1,3,0).
Added an option to use a fixed order when baking.

Modified Paths:
--------------
    trunk/blender/source/blender/makesdna/DNA_scene_types.h
    trunk/blender/source/blender/render/intern/include/render_types.h
    trunk/blender/source/blender/render/intern/source/convertblender.c
    trunk/blender/source/blender/src/buttons_scene.c

Modified: trunk/blender/source/blender/makesdna/DNA_scene_types.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_scene_types.h     2008-06-05 
14:49:12 UTC (rev 15136)
+++ trunk/blender/source/blender/makesdna/DNA_scene_types.h     2008-06-05 
18:26:34 UTC (rev 15137)
@@ -274,7 +274,7 @@
        
        /* Bake Render options */
        short bake_osa, bake_filter, bake_mode, bake_flag;
-       short bake_normal_space, bpad;
+       short bake_normal_space, bake_quad_split;
        float bake_maxdist, bake_biasdist, bake_pad;
        
        /* yafray: global panel params. TODO: move elsewhere */

Modified: trunk/blender/source/blender/render/intern/include/render_types.h
===================================================================
--- trunk/blender/source/blender/render/intern/include/render_types.h   
2008-06-05 14:49:12 UTC (rev 15136)
+++ trunk/blender/source/blender/render/intern/include/render_types.h   
2008-06-05 18:26:34 UTC (rev 15137)
@@ -499,6 +499,7 @@
 #define R_NEED_TANGENT 32
 #define R_SKIP_MULTIRES        64
 #define R_BAKE_TRACE   128
+#define R_BAKING               256
 
 /* vlakren->flag (vlak = face in dutch) char!!! */
 #define R_SMOOTH               1

Modified: trunk/blender/source/blender/render/intern/source/convertblender.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/convertblender.c  
2008-06-05 14:49:12 UTC (rev 15136)
+++ trunk/blender/source/blender/render/intern/source/convertblender.c  
2008-06-05 18:26:34 UTC (rev 15137)
@@ -3935,7 +3935,7 @@
        }
 }
 
-static void check_non_flat_quads(ObjectRen *obr)
+static void check_non_flat_quads(ObjectRen *obr, int quad_flip)
 {
        VlakRen *vlr, *vlr1;
        VertRen *v1, *v2, *v3, *v4;
@@ -3997,20 +3997,27 @@
                                xn= nor[0]*vlr->n[0] + nor[1]*vlr->n[1] + 
nor[2]*vlr->n[2];
 
                                if(ABS(xn) < 0.999995 ) {       // checked on 
noisy fractal grid
+                                       
                                        float d1, d2;
 
                                        vlr1= RE_vlakren_copy(obr, vlr);
                                        vlr1->flag |= R_FACE_SPLIT;
                                        
-                                       /* split direction based on vnorms */
-                                       CalcNormFloat(vlr->v1->co, vlr->v2->co, 
vlr->v3->co, nor);
-                                       d1= nor[0]*vlr->v1->n[0] + 
nor[1]*vlr->v1->n[1] + nor[2]*vlr->v1->n[2];
+                                       if (quad_flip==0) { /* nonzero 
quad_flip is used to force dividing one way */
+                                               /* split direction based on 
vnorms */
+                                               CalcNormFloat(vlr->v1->co, 
vlr->v2->co, vlr->v3->co, nor);
+                                               d1= nor[0]*vlr->v1->n[0] + 
nor[1]*vlr->v1->n[1] + nor[2]*vlr->v1->n[2];
 
-                                       CalcNormFloat(vlr->v2->co, vlr->v3->co, 
vlr->v4->co, nor);
-                                       d2= nor[0]*vlr->v2->n[0] + 
nor[1]*vlr->v2->n[1] + nor[2]*vlr->v2->n[2];
+                                               CalcNormFloat(vlr->v2->co, 
vlr->v3->co, vlr->v4->co, nor);
+                                               d2= nor[0]*vlr->v2->n[0] + 
nor[1]*vlr->v2->n[1] + nor[2]*vlr->v2->n[2];
                                        
-                                       if( fabs(d1) < fabs(d2) ) vlr->flag |= 
R_DIVIDE_24;
-                                       else vlr->flag &= ~R_DIVIDE_24;
+                                               if( fabs(d1) < fabs(d2) ) 
vlr->flag |= R_DIVIDE_24;
+                                               else vlr->flag &= ~R_DIVIDE_24;
+                                       } else if (quad_flip==1) {
+                                               vlr->flag &= ~R_DIVIDE_24;
+                                       } else { /* quad_flip == 3 */
+                                               vlr->flag |= R_DIVIDE_24;
+                                       }
                                        
                                        /* new vertex pointers */
                                        if (vlr->flag & R_DIVIDE_24) {
@@ -4064,8 +4071,14 @@
                        ob->smoothresh= 0.0;
                        if((re->r.mode & R_RAYTRACE) && (re->r.mode & 
R_SHADOW)) 
                                set_phong_threshold(obr);
-
-                       check_non_flat_quads(obr);
+                       
+                       if (re->flag & R_BAKING) {
+                               /* Baking lets us define a quad split order */
+                               check_non_flat_quads(obr, 
re->r.bake_quad_split);
+                       } else {
+                               check_non_flat_quads(obr, 0);
+                       }
+                       
                        set_fullsample_flag(re, obr);
 
                        /* compute bounding boxes for clipping */
@@ -5421,6 +5434,7 @@
        RE_init_threadcount(re);
        
        re->flag |= R_GLOB_NOPUNOFLIP;
+       re->flag |= R_BAKING;
        re->excludeob= actob;
        if(type == RE_BAKE_LIGHT)
                re->flag |= R_SKIP_MULTIRES;

Modified: trunk/blender/source/blender/src/buttons_scene.c
===================================================================
--- trunk/blender/source/blender/src/buttons_scene.c    2008-06-05 14:49:12 UTC 
(rev 15136)
+++ trunk/blender/source/blender/src/buttons_scene.c    2008-06-05 18:26:34 UTC 
(rev 15137)
@@ -2150,6 +2150,10 @@
                                 "Normalized displacement value to fit the 
'Dist' range"
                );
        }
+       
+       uiDefButS(block, MENU, B_NOP, "Quad Split Order%t|Quad Split 
Auto%x0|Quad Split A (0,1,2) (0,2,3)%x1|Quad Split B (1,2,3) (1,3,0)%x2", 
+               10,30,190,20, &G.scene->r.bake_quad_split, 0, 0, 0, 0, "Method 
to divide quads (use A or B for external applications that use a fixed order)");
+       
 #if 0  
        uiBlockBeginAlign(block);
        uiDefButBitS(block, TOG, R_BAKE_OSA, B_DIFF, "OSA",             
10,120,190,20, &G.scene->r.bake_flag, 0, 0, 0, 0, "Enables Oversampling 
(Anti-aliasing)");


_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to