Commit: dfd383ca00f412118318c92ae249bb5db4c36425
Author: Antony Riakiotakis
Date:   Tue Jul 14 23:48:38 2015 +0200
Branches: master
https://developer.blender.org/rBdfd383ca00f412118318c92ae249bb5db4c36425

Fix overdrawing and errors with textured and mapped drawing

===================================================================

M       source/blender/blenkernel/intern/cdderivedmesh.c
M       source/blender/blenkernel/intern/subsurf_ccg.c
M       source/blender/gpu/intern/gpu_draw.c

===================================================================

diff --git a/source/blender/blenkernel/intern/cdderivedmesh.c 
b/source/blender/blenkernel/intern/cdderivedmesh.c
index 4752332..0df2c40 100644
--- a/source/blender/blenkernel/intern/cdderivedmesh.c
+++ b/source/blender/blenkernel/intern/cdderivedmesh.c
@@ -474,7 +474,7 @@ static void cdDM_drawFacesTex_common(DerivedMesh *dm,
        MTexPoly *mtexpoly = DM_get_poly_data_layer(dm, CD_MTEXPOLY);
        MCol *mcol;
        int i, orig;
-       int colType, start_element;
+       int colType, start_element, tot_drawn;
        bool use_tface = (uvflag & DM_DRAW_USE_ACTIVE_UV) != 0;
        int totpoly;
        int next_actualFace;
@@ -536,7 +536,8 @@ static void cdDM_drawFacesTex_common(DerivedMesh *dm,
                totpoly = bufmat->totpolys;
 
                tot_element = 0;
-               start_element = bufmat->start;
+               tot_drawn = 0;
+               start_element = 0;
 
                for (i = 0; i < totpoly; i++) {
                        int actualFace = bufmat->polys[i];
@@ -584,23 +585,25 @@ static void cdDM_drawFacesTex_common(DerivedMesh *dm,
                                flush |= compareDrawOptions(userData, 
actualFace, next_actualFace) == 0;
                        }
 
+                       tot_element += mf[actualFace].v4 ? 6 : 3;
+
                        if (flush) {
                                if (draw_option != DM_DRAW_OPTION_SKIP)
-                                       tot_element += mf[actualFace].v4 ? 6 : 
3;
+                                       tot_drawn += mf[actualFace].v4 ? 6 : 3;
 
-                               if (tot_element) {
+                               if (tot_drawn) {
                                        if (mcol && draw_option != 
DM_DRAW_OPTION_NO_MCOL)
                                                GPU_color_switch(1);
                                        else
                                                GPU_color_switch(0);
 
-                                       
GPU_buffer_draw_elements(dm->drawObject->triangles, GL_TRIANGLES, 
start_element, tot_element);
+                                       
GPU_buffer_draw_elements(dm->drawObject->triangles, GL_TRIANGLES, bufmat->start 
+ start_element, tot_drawn);
+                                       tot_drawn = 0;
                                }
-
                                start_element = tot_element;
                        }
                        else {
-                               tot_element += mf[actualFace].v4 ? 6 : 3;
+                               tot_drawn += mf[actualFace].v4 ? 6 : 3;
                        }
                }
        }
@@ -757,7 +760,7 @@ static void cdDM_drawMappedFaces(DerivedMesh *dm,
                }
        }
        else { /* use OpenGL VBOs or Vertex Arrays instead for better, faster 
rendering */
-               int start_element = 0, tot_element;
+               int start_element = 0, tot_element, tot_drawn;
                int totpoly;
                int tottri;
                int mat_index;
@@ -770,14 +773,14 @@ static void cdDM_drawMappedFaces(DerivedMesh *dm,
                }
                glShadeModel(GL_SMOOTH);
                
-               tottri = dm->drawObject->tot_triangle_point / 3;
+               tottri = dm->drawObject->tot_triangle_point;
 
                if (tottri == 0) {
                        /* avoid buffer problems in following code */
                }
                else if (setDrawOptions == NULL) {
                        /* just draw the entire face array */
-                       GPU_buffer_draw_elements(dm->drawObject->triangles, 
GL_TRIANGLES, 0, 3 * tottri);
+                       GPU_buffer_draw_elements(dm->drawObject->triangles, 
GL_TRIANGLES, 0, tottri);
                }
                else {                  
                        for (mat_index = 0; mat_index < 
dm->drawObject->totmaterial; mat_index++) {
@@ -787,7 +790,8 @@ static void cdDM_drawMappedFaces(DerivedMesh *dm,
                                totpoly = bufmat->totpolys;
 
                                tot_element = 0;
-                               start_element = bufmat->start;
+                               tot_drawn = 0;
+                               start_element = 0;
 
                                if (setMaterial)
                                        draw_option = 
setMaterial(bufmat->mat_nr + 1, NULL);
@@ -813,8 +817,8 @@ static void cdDM_drawMappedFaces(DerivedMesh *dm,
                                                }
 
                                                /* Goal is to draw as long of a 
contiguous triangle
-                                        * array as possible, so draw when we 
hit either an
-                                        * invisible triangle or at the end of 
the array */
+                                                * array as possible, so draw 
when we hit either an
+                                                * invisible triangle or at the 
end of the array */
 
                                                /* flush buffer if current 
triangle isn't drawable or it's last triangle... */
                                                flush = (ELEM(draw_option, 
DM_DRAW_OPTION_SKIP, DM_DRAW_OPTION_STIPPLE)) || (i == totpoly - 1);
@@ -823,12 +827,16 @@ static void cdDM_drawMappedFaces(DerivedMesh *dm,
                                                        flush |= 
compareDrawOptions(userData, actualFace, next_actualFace) == 0;
                                                }
 
+                                               tot_element += 
mf[actualFace].v4 ? 6 : 3;
+
                                                if (flush) {
                                                        if (!ELEM(draw_option, 
DM_DRAW_OPTION_SKIP, DM_DRAW_OPTION_STIPPLE))
-                                                               tot_element += 
mf[actualFace].v4 ? 6 : 3;
+                                                               tot_drawn += 
mf[actualFace].v4 ? 6 : 3;
 
-                                                       if (tot_element)
-                                                               
GPU_buffer_draw_elements(dm->drawObject->triangles, GL_TRIANGLES, 
start_element, tot_element);
+                                                       if (tot_drawn) {
+                                                               
GPU_buffer_draw_elements(dm->drawObject->triangles, GL_TRIANGLES, bufmat->start 
+ start_element, tot_drawn);
+                                                               tot_drawn = 0;
+                                                       }
 
                                                        start_element = 
tot_element;
 
@@ -836,7 +844,7 @@ static void cdDM_drawMappedFaces(DerivedMesh *dm,
                                                                
glDisable(GL_POLYGON_STIPPLE);
                                                }
                                                else {
-                                                       tot_element += 
mf[actualFace].v4 ? 6 : 3;
+                                                       tot_drawn += 
mf[actualFace].v4 ? 6 : 3;
                                                }
                                        }
 
diff --git a/source/blender/blenkernel/intern/subsurf_ccg.c 
b/source/blender/blenkernel/intern/subsurf_ccg.c
index 733cb15..7cb6f35 100644
--- a/source/blender/blenkernel/intern/subsurf_ccg.c
+++ b/source/blender/blenkernel/intern/subsurf_ccg.c
@@ -2622,7 +2622,7 @@ static void ccgDM_drawFacesTex_common(DerivedMesh *dm,
        unsigned int next_actualFace;
        unsigned int gridFaces = ccgSubSurf_getGridSize(ss) - 1;
        int mat_index;
-       int tot_element, start_element;
+       int tot_element, start_element, tot_drawn;
 
        CCG_key_top_level(&key, ss);
        ccgdm_pbvh_update(ccgdm);
@@ -2657,7 +2657,8 @@ static void ccgDM_drawFacesTex_common(DerivedMesh *dm,
                totpoly = bufmat->totpolys;
 
                tot_element = 0;
-               start_element = bufmat->start;
+               tot_drawn = 0;
+               start_element = 0;
 
                for (i = 0; i < totpoly; i++) {
                        int polyindex = bufmat->polys[i];
@@ -2703,23 +2704,26 @@ static void ccgDM_drawFacesTex_common(DerivedMesh *dm,
                                flush |= compareDrawOptions(userData, 
actualFace, next_actualFace) == 0;
                        }
 
+                       tot_element += facequads * 6;
+
                        if (flush) {
                                if (draw_option != DM_DRAW_OPTION_SKIP)
-                                       tot_element += facequads * 6;
+                                       tot_drawn += facequads * 6;
 
-                               if (tot_element) {
+                               if (tot_drawn) {
                                        if (mcol && draw_option != 
DM_DRAW_OPTION_NO_MCOL)
                                                GPU_color_switch(1);
                                        else
                                                GPU_color_switch(0);
 
-                                       
GPU_buffer_draw_elements(dm->drawObject->triangles, GL_TRIANGLES, 
start_element, tot_element);
+                                       
GPU_buffer_draw_elements(dm->drawObject->triangles, GL_TRIANGLES, bufmat->start 
+ start_element, tot_drawn);
+                                       tot_drawn = 0;
                                }
 
                                start_element = tot_element;
                        }
                        else {
-                               tot_element += facequads * 6;
+                               tot_drawn += facequads * 6;
                        }
                }
        }
diff --git a/source/blender/gpu/intern/gpu_draw.c 
b/source/blender/gpu/intern/gpu_draw.c
index a925d44..4e2af56 100644
--- a/source/blender/gpu/intern/gpu_draw.c
+++ b/source/blender/gpu/intern/gpu_draw.c
@@ -1634,13 +1634,13 @@ void GPU_begin_object_materials(View3D *v3d, 
RegionView3D *rv3d, Scene *scene, O
        GPU_disable_material();
 }
 
-int GPU_get_particle_info(GPUParticleInfo *pi)
+static int GPU_get_particle_info(GPUParticleInfo *pi)
 {
        ParticleData *p;
        DupliObject *dob = GMS.dob;
        int ind;
-       if(dob->particle_system) {
-               if(dob->persistent_id[0] < dob->particle_system->totpart)
+       if (dob->particle_system) {
+               if (dob->persistent_id[0] < dob->particle_system->totpart)
                        ind = dob->persistent_id[0];
                else {
                        ind = dob->particle_system->child[dob->persistent_id[0] 
- dob->particle_system->totpart].parent;

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

Reply via email to