[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