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:
authorAntony Riakiotakis <kalast@gmail.com>2015-07-15 00:48:38 +0300
committerAntony Riakiotakis <kalast@gmail.com>2015-07-15 00:49:03 +0300
commitdfd383ca00f412118318c92ae249bb5db4c36425 (patch)
tree967e31c833f68b032f0cd66296c243ffb4b4f59c /source/blender/blenkernel
parent9cc1953210486a240f77b7ceafbcd664d1994b57 (diff)
Fix overdrawing and errors with textured and mapped drawing
Diffstat (limited to 'source/blender/blenkernel')
-rw-r--r--source/blender/blenkernel/intern/cdderivedmesh.c42
-rw-r--r--source/blender/blenkernel/intern/subsurf_ccg.c16
2 files changed, 35 insertions, 23 deletions
diff --git a/source/blender/blenkernel/intern/cdderivedmesh.c b/source/blender/blenkernel/intern/cdderivedmesh.c
index 475233206f8..0df2c40f248 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 733cb15ea86..7cb6f35b8c1 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;
}
}
}