[Bf-blender-cvs] [790c47b] temp-derivedmesh-looptri: Start move drawing code for cdderivedmesh to indexed/mpoly design. This is WIP mostly to merge some work that gets rid of code we don't really need to port.

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


Commit: 790c47be71a4e00ebc6951d46616d20935ea1110
Author: Antony Riakiotakis
Date:   Wed Jul 15 17:36:59 2015 +0200
Branches: temp-derivedmesh-looptri
https://developer.blender.org/rB790c47be71a4e00ebc6951d46616d20935ea1110

Start move drawing code for cdderivedmesh to indexed/mpoly design.
This is WIP mostly to merge some work that gets rid of code we
don't really need to port.

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

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

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

diff --git a/source/blender/blenkernel/intern/cdderivedmesh.c b/source/blender/blenkernel/intern/cdderivedmesh.c
index 11ca69a..4a727c8 100644
--- a/source/blender/blenkernel/intern/cdderivedmesh.c
+++ b/source/blender/blenkernel/intern/cdderivedmesh.c
@@ -38,6 +38,7 @@
 #include "BLI_edgehash.h"
 #include "BLI_utildefines.h"
 #include "BLI_stackdefines.h"
+#include "BLI_array.h"
 
 #include "BKE_pbvh.h"
 #include "BKE_cdderivedmesh.h"
@@ -1283,9 +1284,9 @@ static void cdDM_buffer_copy_triangles(
 		start = gpumat->counter;
 
 		/* v1 v2 v3 */
-		varray[start++] = findex;
-		varray[start++] = findex + 1;
-		varray[start++] = findex + 2;
+		varray[start++] = lt->tri[0];
+		varray[start++] = lt->tri[1];
+		varray[start++] = lt->tri[2];
 
 		gpumat->counter += 3;
 		findex += 3;
@@ -1296,23 +1297,23 @@ static void cdDM_buffer_copy_vertex(
         DerivedMesh *dm, float *varray)
 {
 	const MVert *mvert;
-	int i, j, start, tottri;
-
+	const MPoly *mpoly;
 	const MLoop *mloop;
-	const MLoopTri *lt;
 
-	mloop = dm->getLoopArray(dm);
+	int i, j, start, totpoly;
+
 	mvert = dm->getVertArray(dm);
-	lt = dm->looptris.array;
-	tottri = dm->looptris.num;
+	mpoly = dm->getPolyArray(dm);
+	mloop = dm->getLoopArray(dm);
+	totpoly = dm->getNumPolys(dm);
 
 	start = 0;
 
-	for (i = 0; i < tottri; i++, lt++) {
-		copy_v3_v3(&varray[start + 0], mvert[mloop[lt->tri[0]].v].co);
-		copy_v3_v3(&varray[start + 3], mvert[mloop[lt->tri[1]].v].co);
-		copy_v3_v3(&varray[start + 6], mvert[mloop[lt->tri[2]].v].co);
-		start += 9;
+	for (i = 0; i < totpoly; i++, mpoly++) {
+		for (j = 0; j < mpoly->totloop; j++) {
+			copy_v3_v3(&varray[start], mvert[mloop[mpoly->loopstart + j].v].co);
+			start += 3;
+		}
 	}
 
 	/* copy loose points */
@@ -1328,98 +1329,94 @@ static void cdDM_buffer_copy_vertex(
 static void cdDM_buffer_copy_normal(
         DerivedMesh *dm, short *varray)
 {
-	int i, tottri;
+	int i, j, totpoly;
 	int start;
 
+	const float **v_coords = NULL;
+	BLI_array_staticdeclare(v_coords, BM_DEFAULT_NGON_STACK_SIZE);
+
 	const float (*nors)[3] = dm->getPolyDataArray(dm, CD_NORMAL);
 	const float (*lnors)[3] = dm->getLoopDataArray(dm, CD_NORMAL);
-	const MVert *mvert = dm->getVertArray(dm);
 
+	const bool normal_loop_face = (nors || lnors) != 0;
+
+	const MVert *mvert;
 	const MPoly *mpoly;
 	const MLoop *mloop;
-	const MLoopTri *lt;
 
+	short f_no_s[3];
+
+	mvert = dm->getVertArray(dm);
 	mpoly = dm->getPolyArray(dm);
 	mloop = dm->getLoopArray(dm);
-	mvert = dm->getVertArray(dm);
-	lt = dm->looptris.array;
-	tottri = dm->looptris.num;
+	totpoly = dm->getNumPolys(dm);
 
 	start = 0;
-	for (i = 0; i < tottri; i++, lt++) {
-		const MPoly *mp = &mpoly[lt->poly];
-		const unsigned int *ltri = lt->tri;
-		const bool smoothnormal = (mp->flag & ME_SMOOTH) != 0;
-
-		if (lnors) {
-			/* Copy loop normals */
-			normal_float_to_short_v3(&varray[start + 0], lnors[ltri[0]]);
-			normal_float_to_short_v3(&varray[start + 4], lnors[ltri[1]]);
-			normal_float_to_short_v3(&varray[start + 8], lnors[ltri[2]]);
-		}
-		else if (smoothnormal) {
-			/* copy vertex normal */
-			copy_v3_v3_short(&varray[start + 0], mvert[mloop[ltri[0]].v].no);
-			copy_v3_v3_short(&varray[start + 4], mvert[mloop[ltri[1]].v].no);
-			copy_v3_v3_short(&varray[start + 8], mvert[mloop[ltri[2]].v].no);
-		}
-		else if (nors) {
-			/* copy cached face normal */
-			short f_no_s[3];
+	for (i = 0; i < totpoly; i++, mpoly++) {
+		const bool smoothnormal = (mpoly->flag & ME_SMOOTH) != 0;
 
-			normal_float_to_short_v3(f_no_s, nors[lt->poly]);
-
-			copy_v3_v3_short(&varray[start + 0], f_no_s);
-			copy_v3_v3_short(&varray[start + 4], f_no_s);
-			copy_v3_v3_short(&varray[start + 8], f_no_s);
-		}
-		else {
+		/* if needed calculate the face normal now */
+		if (!(normal_loop_face || smoothnormal)) {
 			/* calculate face normal */
 			float f_no[3];
-			short f_no_s[3];
 
-			normal_tri_v3(
-			        f_no,
-			        mvert[mloop[ltri[0]].v].co,
-			        mvert[mloop[ltri[1]].v].co,
-			        mvert[mloop[ltri[2]].v].co);
+			for (j = 0; j < mpoly->totloop; j++)
+				BLI_array_append(v_coords, mvert[mloop[mpoly->loopstart + j].v].co);
+			normal_poly_v3(f_no, (const float (*)[3]) v_coords, mpoly->totloop);
 
 			normal_float_to_short_v3(f_no_s, f_no);
-
-			copy_v3_v3_short(&varray[start + 0], f_no_s);
-			copy_v3_v3_short(&varray[start + 4], f_no_s);
-			copy_v3_v3_short(&varray[start + 8], f_no_s);
+			BLI_array_empty(v_coords);
 		}
 
-		start += 12;
+		for (j = 0; j < mpoly->totloop; j++) {
+			if (lnors) {
+				/* Copy loop normals */
+				normal_float_to_short_v3(&varray[start], lnors[mpoly->loopstart + j]);
+			}
+			else if (smoothnormal) {
+				/* copy vertex normal */
+				copy_v3_v3_short(&varray[start], mvert[mloop[mpoly->loopstart + j].v].no);
+			}
+			else if (nors) {
+				/* copy cached face normal */
+				short f_no_s[3];
+
+				normal_float_to_short_v3(f_no_s, nors[i]);
+
+				copy_v3_v3_short(&varray[start], f_no_s);
+			}
+			else {
+				copy_v3_v3_short(&varray[start], f_no_s);
+			}
+			start += 4;
+		}
 	}
+
+	BLI_array_free(v_coords);
 }
 
 static void cdDM_buffer_copy_uv(
         DerivedMesh *dm, float *varray)
 {
-	int i, tottri;
+	int i, j, totpoly;
 	int start;
 
-	const MLoopTri *lt;
+	const MPoly *mpoly;
 	const MLoopUV *mloopuv;
 
 	if ((mloopuv = DM_get_loop_data_layer(dm, CD_MLOOPUV)) == NULL) {
 		return;
 	}
 
-	lt = dm->looptris.array;
-	tottri = dm->looptris.num;
+	mpoly = dm->getPolyArray(dm);
+	totpoly = dm->getNumPolys(dm);
 
 	start = 0;
-	for (i = 0; i < tottri; i++, lt++) {
-		const unsigned int *ltri = lt->tri;
-
-		/* v1 v2 v3 */
-		copy_v2_v2(&varray[start + 0], mloopuv[ltri[0]].uv);
-		copy_v2_v2(&varray[start + 2], mloopuv[ltri[1]].uv);
-		copy_v2_v2(&varray[start + 4], mloopuv[ltri[2]].uv);
-		start += 6;
+	for (i = 0; i < totpoly; i++, mpoly++) {
+		for (j = 0; j < mpoly->totloop; j++) {
+			copy_v2_v2(&varray[start], mloopuv[mpoly->loopstart + j].uv);
+			start += 2;
+		}
 	}
 }
 
@@ -1659,32 +1656,17 @@ static void cdDM_drawobject_add_vert_point(GPUDrawObject *gdo, int vert_index, i
 
 #endif  /* USE_GPU_POINT_LINK */
 
-/* update the vert_points and triangle_to_mface fields with a new
- * triangle */
-static void cdDM_drawobject_add_triangle(
-        GPUDrawObject *gdo,
-        const MLoop *mloop,
-        const MLoopTri *lt,
-        const int loop_index)
-{
-	int i;
-	for (i = 0; i < 3; i++) {
-		cdDM_drawobject_add_vert_point(gdo, mloop[lt->tri[i]].v, loop_index + i);
-	}
-}
-
 /* for each vertex, build a list of points related to it; these lists
  * are stored in an array sized to the number of vertices */
 static void cdDM_drawobject_init_vert_points(
         GPUDrawObject *gdo,
         const MPoly *mpoly, const MLoop *mloop,
-        const MLoopTri *mlooptri, int mlooptri_num,
+        int tot_poly,
         int totmat)
 {
 	GPUBufferMaterial *mat;
 	int i, *mat_orig_to_new;
 	int tot_loops = 0;
-	const MLoopTri *lt;
 
 	mat_orig_to_new = MEM_callocN(sizeof(*mat_orig_to_new) * totmat,
 	                                             "GPUDrawObject.mat_orig_to_new");
@@ -1712,16 +1694,18 @@ static void cdDM_drawobject_init_vert_points(
 		gdo->vert_points[i].point_index = -1;
 	}
 
-	for (i = 0, lt = mlooptri; i < mlooptri_num; i++, lt++) {
-		const MPoly *mp = &mpoly[lt->poly];
+	for (i = 0; i < tot_poly; i++) {
+		int j;
+		const MPoly *mp = &mpoly[i];
 		mat = &gdo->materials[mat_orig_to_new[mp->mat_nr]];
 
 		mat->polys[mat->counter++] = i;
 
-		/* add triangle */
-		cdDM_drawobject_add_triangle(gdo, mloop, lt, tot_loops);
-		mat->totelements += 3;
-		tot_loops += 3;
+		/* assign unique indices to vertices of the mesh */
+		for (j = 0; j < mp->totloop; j++) {
+			cdDM_drawobject_add_vert_point(gdo, mloop[mp->loopstart + j].v, tot_loops + j);
+		}
+		tot_loops += mp->totloop;
 	}
 
 	/* map any unused vertices to loose points */
@@ -1748,10 +1732,9 @@ static GPUDrawObject *cdDM_GPUobject_new(DerivedMesh *dm)
 	GPUDrawObject *gdo;
 	const MPoly *mpoly;
 	const MLoop *mloop;
-	const MLoopTri *looptri;
 	int totmat = dm->totmat;
 	GPUMaterialInfo *mat_info;
-	int i, curmat, totelements, looptri_num, totloops;
+	int i, curmat, totelements, totloops, totpolys;
 
 	/* object contains at least one material (default included) so zero means uninitialized dm */
 	BLI_assert(totmat != 0);
@@ -1759,19 +1742,18 @@ static GPUDrawObject *cdDM_GPUobject_new(DerivedMesh *dm)
 	mpoly = dm->getPolyArray(dm);
 	mloop = dm->getLoopArray(dm);
 
-	looptri = dm->looptris.array;
-	looptri_num = dm->looptris.num;
+	totpolys = dm->getNumPolys(dm);
 
 	/* get the number of points used by each material, treating
 	 * each quad as two triangles */
 	mat_info = MEM_callocN(sizeof(*mat_info) * totmat, "GPU_drawobject_new.mat_orig_to_new");
 
 	/* NOTE: could loop polys instead (faster) */
-	for (i = 0; i < looptri_num; i++) {
-		const int mat_nr = mpoly[looptri[i].poly].mat_nr;
+	for (i = 0; i < totpolys; i++) {
+		const int mat_nr = mpoly[i].mat_nr;
 		mat_info[mat_nr].polys++;
-		mat_info[mat_nr].elements += 3;
-		mat_info[mat_nr].loops += 3;
+		mat_info[mat_nr].elements += 3 * (mpoly[i].totloop - 2);
+		mat_info[mat_nr].loops += mpoly[i].totloop;
 	}
 	/* create the GPUDrawObject */
 	gdo = MEM_callocN(sizeof(GPUDrawObject), "GPUDrawObject");
@@ -1793,7 +1775,7 @@ static GPUDrawObject *cdDM_GPUobject_new(DerivedMesh *dm)
 		if (mat_info[i].elements > 0) {
 			gdo->materials[curmat].start = totelements;
 			/* can set it to points now but used in cdDM_drawobject_init_vert_points as counter */
-			gdo->materials[curmat].totelements = 0;
+			gdo->materials[curmat].totelements = mat_info[i].elements;
 			gdo->materials[curmat].totloops = mat_info[i].loops;
 			gdo->materials[curmat].mat_nr = i;
 			gdo->materials[curmat].totpolys = mat_info[i].polys;
@@ -1810,7 +1792,7 @@ static GPUDrawObject *cdDM_GPUobject_new(DerivedMesh *dm)
 	/* store total number of points used for triangles */
 	gdo->tot_triangle_point = totelements;
 
-	cdDM_drawobject_init_vert_points(gdo, mpoly, mloop, looptri, looptri_num, totmat);
+	cdDM_drawobject_init_vert_points(gdo, mpoly, mloop, totpolys, totmat);
 	MEM_freeN(mat_info);
 
 	return gdo;




More information about the Bf-blender-cvs mailing list