[Bf-blender-cvs] [4cac468] temp-derivedmesh-looptri: Textured and GLSL drawing for cddm except from tangent layer now ported correctly to new display paradigm

Antony Riakiotakis noreply at git.blender.org
Wed Jul 15 19:44:33 CEST 2015


Commit: 4cac468e09d3dc3e575abedac441509283c421dd
Author: Antony Riakiotakis
Date:   Wed Jul 15 19:29:57 2015 +0200
Branches: temp-derivedmesh-looptri
https://developer.blender.org/rB4cac468e09d3dc3e575abedac441509283c421dd

Textured and GLSL drawing for cddm except from tangent layer
now ported correctly to new display paradigm

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

M	source/blender/blenkernel/intern/cdderivedmesh.c

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

diff --git a/source/blender/blenkernel/intern/cdderivedmesh.c b/source/blender/blenkernel/intern/cdderivedmesh.c
index bfb5e1e..d5c5984 100644
--- a/source/blender/blenkernel/intern/cdderivedmesh.c
+++ b/source/blender/blenkernel/intern/cdderivedmesh.c
@@ -488,9 +488,8 @@ static void cdDM_drawFacesTex_common(
 {
 	CDDerivedMesh *cddm = (CDDerivedMesh *) dm;
 	const MPoly *mpoly = cddm->mpoly;
-	const MLoopTri *looptri = dm->looptris.array;
-	const  MLoopCol *mloopcol;
 	MTexPoly *mtexpoly = DM_get_poly_data_layer(dm, CD_MTEXPOLY);
+	const  MLoopCol *mloopcol;
 	int i;
 	int colType, start_element, tot_drawn;
 	bool use_tface = (uvflag & DM_DRAW_USE_ACTIVE_UV) != 0;
@@ -546,7 +545,7 @@ static void cdDM_drawFacesTex_common(
 	/* lastFlag = 0; */ /* UNUSED */
 	for (mat_index = 0; mat_index < dm->drawObject->totmaterial; mat_index++) {
 		GPUBufferMaterial *bufmat = dm->drawObject->materials + mat_index;
-		next_actualFace = looptri[bufmat->polys[0]].poly;
+		next_actualFace = bufmat->polys[0];
 		totpoly = bufmat->totpolys;
 
 		tot_element = 0;
@@ -554,12 +553,12 @@ static void cdDM_drawFacesTex_common(
 		start_element = 0;
 
 		for (i = 0; i < totpoly; i++) {
-			int actualFace =  looptri[bufmat->polys[i]].poly;
+			int actualFace = bufmat->polys[i];
 			DMDrawOption draw_option = DM_DRAW_OPTION_NORMAL;
 			int flush = 0;
 
 			if (i != totpoly - 1)
-				next_actualFace = looptri[bufmat->polys[i + 1]].poly;
+				next_actualFace = bufmat->polys[i + 1];
 
 			if (drawParams) {
 				draw_option = drawParams(use_tface && mtexpoly ? &mtexpoly[actualFace] : NULL, (mloopcol != NULL), mpoly[actualFace].mat_nr);
@@ -591,11 +590,11 @@ static void cdDM_drawFacesTex_common(
 				flush |= compareDrawOptions(userData, actualFace, next_actualFace) == 0;
 			}
 
-			tot_element += 3;
+			tot_element += (mpoly[actualFace].totloop - 2) * 3;
 
 			if (flush) {
 				if (draw_option != DM_DRAW_OPTION_SKIP)
-					tot_drawn += 3;
+					tot_drawn += (mpoly[actualFace].totloop - 2) * 3;
 
 				if (tot_drawn) {
 					if (mloopcol && draw_option != DM_DRAW_OPTION_NO_MCOL)
@@ -609,7 +608,7 @@ static void cdDM_drawFacesTex_common(
 				start_element = tot_element;
 			}
 			else {
-				tot_drawn += 3;
+				tot_drawn += (mpoly[actualFace].totloop - 2) * 3;
 			}
 		}
 	}
@@ -846,6 +845,7 @@ static void cdDM_drawMappedFacesGLSL(
 	/* MTFace *tf = dm->getTessFaceDataArray(dm, CD_MTFACE); */ /* UNUSED */
 	const float (*nors)[3] = dm->getPolyDataArray(dm, CD_NORMAL);
 	const float (*lnors)[3] = dm->getLoopDataArray(dm, CD_NORMAL);
+	const int totpoly = dm->getNumPolys(dm);
 	int a, b, matnr, new_matnr;
 	bool do_draw;
 	int orig;
@@ -1010,7 +1010,6 @@ static void cdDM_drawMappedFacesGLSL(
 
 		/* part two, generate and fill the arrays with the data */
 		if (max_element_size > 0) {
-			const MLoopTri *lt = dm->looptris.array;
 			buffer = GPU_buffer_alloc(max_element_size * dm->drawObject->tot_loop_verts, false);
 
 			if (buffer == NULL) {
@@ -1026,39 +1025,35 @@ static void cdDM_drawMappedFacesGLSL(
 				return;
 			}
 
-			for (a = 0; a < dm->looptris.num; a++, lt++) {
-				const MPoly *mp = &mpoly[lt->poly];
-				int i = mat_orig_to_new[mp->mat_nr];
+			for (a = 0; a < totpoly; a++, mpoly++) {
+				int j;
+				int i = mat_orig_to_new[mpoly->mat_nr];
 				offset = tot_loops * max_element_size;
 
 				if (matconv[i].numdata != 0) {
-					const unsigned int *ltri = lt->tri;
-					const unsigned int  vtri[3] = {mloop[ltri[0]].v, mloop[ltri[1]].v, mloop[ltri[2]].v};
-
 					if (matconv[i].attribs.totorco && matconv[i].attribs.orco.array) {
-						copy_v3_v3((float *)&varray[offset], (float *)matconv[i].attribs.orco.array[vtri[0]]);
-						copy_v3_v3((float *)&varray[offset + max_element_size], (float *)matconv[i].attribs.orco.array[vtri[1]]);
-						copy_v3_v3((float *)&varray[offset + max_element_size * 2], (float *)matconv[i].attribs.orco.array[vtri[2]]);
+						for (j = 0; j < mpoly->totloop; j++)
+							copy_v3_v3((float *)&varray[offset + j * max_element_size],
+							           (float *)matconv[i].attribs.orco.array[mloop[mpoly->loopstart + j].v]);
 						offset += sizeof(float) * 3;
 					}
 					for (b = 0; b < matconv[i].attribs.tottface; b++) {
 						if (matconv[i].attribs.tface[b].array) {
 							const MLoopUV *mloopuv = matconv[i].attribs.tface[b].array;
-							copy_v2_v2((float *)&varray[offset], mloopuv[ltri[0]].uv);
-							copy_v2_v2((float *)&varray[offset + max_element_size], mloopuv[ltri[1]].uv);
-							copy_v2_v2((float *)&varray[offset + max_element_size * 2], mloopuv[ltri[2]].uv);
+							for (j = 0; j < mpoly->totloop; j++)
+								copy_v2_v2((float *)&varray[offset + j * max_element_size], mloopuv[mpoly->loopstart + j].uv);
 							offset += sizeof(float) * 2;
 						}
 					}
 					for (b = 0; b < matconv[i].attribs.totmcol; b++) {
 						if (matconv[i].attribs.mcol[b].array) {
 							const MLoopCol *mloopcol = matconv[i].attribs.mcol[b].array;
-							copy_v4_v4_char((char *)&varray[offset], &mloopcol[ltri[0]].r);
-							copy_v4_v4_char((char *)&varray[offset + max_element_size], &mloopcol[ltri[1]].r);
-							copy_v4_v4_char((char *)&varray[offset + max_element_size * 2], &mloopcol[ltri[2]].r);
+							for (j = 0; j < mpoly->totloop; j++)
+								copy_v4_v4_char((char *)&varray[offset + j * max_element_size], &mloopcol[mpoly->loopstart + j].r);
 							offset += sizeof(unsigned char) * 4;
 						}
 					}
+					/* TODO, handle tangents */
 					if (matconv[i].attribs.tottang && matconv[i].attribs.tang.array) {
 						const float *tang = matconv[i].attribs.tang.array[i * 4 + 0];
 						copy_v4_v4((float *)&varray[offset], tang);
@@ -1070,7 +1065,7 @@ static void cdDM_drawMappedFacesGLSL(
 					}
 				}
 
-				tot_loops += 3;
+				tot_loops += mpoly->totloop;
 			}
 			GPU_buffer_unlock(buffer);
 		}




More information about the Bf-blender-cvs mailing list