Commit: 49385d8b1b8afee5c821bac2187030ca59cd7735 Author: Antony Riakiotakis Date: Wed Feb 18 15:35:08 2015 +0100 Branches: GPU_data_request https://developer.blender.org/rB49385d8b1b8afee5c821bac2187030ca59cd7735
Also move new gpu object to derived mesh - we can probably do a few abstractions here, but gpuObject creation is a bit derivedmesh type specific (each DM has its own way to calculate vertices needed etc). =================================================================== M source/blender/blenkernel/intern/cdderivedmesh.c M source/blender/gpu/intern/gpu_buffers.c =================================================================== diff --git a/source/blender/blenkernel/intern/cdderivedmesh.c b/source/blender/blenkernel/intern/cdderivedmesh.c index 8224552..8a1aea0 100644 --- a/source/blender/blenkernel/intern/cdderivedmesh.c +++ b/source/blender/blenkernel/intern/cdderivedmesh.c @@ -1664,6 +1664,174 @@ static void cdDM_copy_gpu_data(DerivedMesh *dm, int type, float *varray, int *in } } +/* add a new point to the list of points related to a particular + * vertex */ +#ifdef USE_GPU_POINT_LINK + +static void gpu_drawobject_add_vert_point(GPUDrawObject *gdo, int vert_index, int point_index) +{ + GPUVertPointLink *lnk; + + lnk = &gdo->vert_points[vert_index]; + + /* if first link is in use, add a new link at the end */ + if (lnk->point_index != -1) { + /* get last link */ + for (; lnk->next; lnk = lnk->next) ; + + /* add a new link from the pool */ + lnk = lnk->next = &gdo->vert_points_mem[gdo->vert_points_usage]; + gdo->vert_points_usage++; + } + + lnk->point_index = point_index; +} + +#else + +static void cdDM_drawobject_add_vert_point(GPUDrawObject *gdo, int vert_index, int point_index) +{ + GPUVertPointLink *lnk; + lnk = &gdo->vert_points[vert_index]; + if (lnk->point_index == -1) { + lnk->point_index = point_index; + } +} + +#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, + int base_point_index, + int face_index, + int v1, int v2, int v3) +{ + int i, v[3] = {v1, v2, v3}; + for (i = 0; i < 3; i++) + cdDM_drawobject_add_vert_point(gdo, v[i], base_point_index + i); + gdo->triangle_to_mface[base_point_index / 3] = face_index; +} + +/* 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, MFace *f, int totface, int totmat) +{ + GPUBufferMaterial *mat; + int i, *mat_orig_to_new; + + mat_orig_to_new = MEM_callocN(sizeof(*mat_orig_to_new) * totmat, + "GPUDrawObject.mat_orig_to_new"); + /* allocate the array and space for links */ + gdo->vert_points = MEM_mallocN(sizeof(GPUVertPointLink) * gdo->totvert, + "GPUDrawObject.vert_points"); +#ifdef USE_GPU_POINT_LINK + gdo->vert_points_mem = MEM_callocN(sizeof(GPUVertPointLink) * gdo->tot_triangle_point, + "GPUDrawObject.vert_points_mem"); + gdo->vert_points_usage = 0; +#endif + + /* build a map from the original material indices to the new + * GPUBufferMaterial indices */ + for (i = 0; i < gdo->totmaterial; i++) + mat_orig_to_new[gdo->materials[i].mat_nr] = i; + + /* -1 indicates the link is not yet used */ + for (i = 0; i < gdo->totvert; i++) { +#ifdef USE_GPU_POINT_LINK + gdo->vert_points[i].link = NULL; +#endif + gdo->vert_points[i].point_index = -1; + } + + for (i = 0; i < totface; i++, f++) { + mat = &gdo->materials[mat_orig_to_new[f->mat_nr]]; + + /* add triangle */ + cdDM_drawobject_add_triangle(gdo, mat->start + mat->totpoint, + i, f->v1, f->v2, f->v3); + mat->totpoint += 3; + + /* add second triangle for quads */ + if (f->v4) { + cdDM_drawobject_add_triangle(gdo, mat->start + mat->totpoint, + i, f->v3, f->v4, f->v1); + mat->totpoint += 3; + } + } + + /* map any unused vertices to loose points */ + for (i = 0; i < gdo->totvert; i++) { + if (gdo->vert_points[i].point_index == -1) { + gdo->vert_points[i].point_index = gdo->tot_triangle_point + gdo->tot_loose_point; + gdo->tot_loose_point++; + } + } + + MEM_freeN(mat_orig_to_new); +} + +/* see GPUDrawObject's structure definition for a description of the + * data being initialized here */ +static GPUDrawObject *cdDM_GPUobject_new(DerivedMesh *dm) +{ + GPUDrawObject *gdo; + MFace *mface; + int totmat = dm->totmat; + int *points_per_mat; + int i, curmat, curpoint, totface; + + /* object contains at least one material (default included) so zero means uninitialized dm */ + BLI_assert(totmat != 0); + + mface = dm->getTessFaceArray(dm); + totface = dm->getNumTessFaces(dm); + + /* get the number of points used by each material, treating + * each quad as two triangles */ + points_per_mat = MEM_callocN(sizeof(*points_per_mat) * totmat, "GPU_drawobject_new.mat_orig_to_new"); + for (i = 0; i < totface; i++) + points_per_mat[mface[i].mat_nr] += mface[i].v4 ? 6 : 3; + + /* create the GPUDrawObject */ + gdo = MEM_callocN(sizeof(GPUDrawObject), "GPUDrawObject"); + gdo->totvert = dm->getNumVerts(dm); + gdo->totedge = dm->getNumEdges(dm); + + /* count the number of materials used by this DerivedMesh */ + for (i = 0; i < totmat; i++) { + if (points_per_mat[i] > 0) + gdo->totmaterial++; + } + + /* allocate an array of materials used by this DerivedMesh */ + gdo->materials = MEM_mallocN(sizeof(GPUBufferMaterial) * gdo->totmaterial, + "GPUDrawObject.materials"); + + /* initialize the materials array */ + for (i = 0, curmat = 0, curpoint = 0; i < totmat; i++) { + if (points_per_mat[i] > 0) { + gdo->materials[curmat].start = curpoint; + gdo->materials[curmat].totpoint = 0; + gdo->materials[curmat].mat_nr = i; + + curpoint += points_per_mat[i]; + curmat++; + } + } + + /* store total number of points used for triangles */ + gdo->tot_triangle_point = curpoint; + + gdo->triangle_to_mface = MEM_mallocN(sizeof(int) * (gdo->tot_triangle_point / 3), + "GPUDrawObject.triangle_to_mface"); + + cdDM_drawobject_init_vert_points(gdo, mface, totface, totmat); + MEM_freeN(points_per_mat); + + return gdo; +} + static void cdDM_foreachMappedVert( DerivedMesh *dm, void (*func)(void *userData, int index, const float co[3], const float no_f[3], const short no_s[3]), @@ -1879,6 +2047,7 @@ static CDDerivedMesh *cdDM_create(const char *desc) dm->drawMappedFacesGLSL = cdDM_drawMappedFacesGLSL; dm->drawMappedFacesMat = cdDM_drawMappedFacesMat; dm->copy_gpu_data = cdDM_copy_gpu_data; + dm->gpuObjectNew = cdDM_GPUobject_new; dm->foreachMappedVert = cdDM_foreachMappedVert; dm->foreachMappedEdge = cdDM_foreachMappedEdge; diff --git a/source/blender/gpu/intern/gpu_buffers.c b/source/blender/gpu/intern/gpu_buffers.c index 74365ac..91cdcdf 100644 --- a/source/blender/gpu/intern/gpu_buffers.c +++ b/source/blender/gpu/intern/gpu_buffers.c @@ -403,175 +403,6 @@ void GPU_buffer_free(GPUBuffer *buffer) } - -/* add a new point to the list of points related to a particular - * vertex */ -#ifdef USE_GPU_POINT_LINK - -static void gpu_drawobject_add_vert_point(GPUDrawObject *gdo, int vert_index, int point_index) -{ - GPUVertPointLink *lnk; - - lnk = &gdo->vert_points[vert_index]; - - /* if first link is in use, add a new link at the end */ - if (lnk->point_index != -1) { - /* get last link */ - for (; lnk->next; lnk = lnk->next) ; - - /* add a new link from the pool */ - lnk = lnk->next = &gdo->vert_points_mem[gdo->vert_points_usage]; - gdo->vert_points_usage++; - } - - lnk->point_index = point_index; -} - -#else - -static void gpu_drawobject_add_vert_point(GPUDrawObject *gdo, int vert_index, int point_index) -{ - GPUVertPointLink *lnk; - lnk = &gdo->vert_points[vert_index]; - if (lnk->point_index == -1) { - lnk->point_index = point_index; - } -} - -#endif /* USE_GPU_POINT_LINK */ - -/* update the vert_points and triangle_to_mface fields with a new - * triangle */ -static void gpu_drawobject_add_triangle(GPUDrawObject *gdo, - int base_point_index, - int face_index, - int v1, int v2, int v3) -{ - int i, v[3] = {v1, v2, v3}; - for (i = 0; i < 3; i++) - gpu_drawobject_add_vert_point(gdo, v[i], base_point_index + i); - gdo->triangle_to_mface[base_point_index / 3] = face_index; -} - -/* 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 gpu_drawobject_init_vert_points(GPUDrawObject *gdo, MFace *f, int totface, int totmat) -{ - GPUBufferMaterial *mat; - int i, *mat_orig_to_new; - - mat_orig_to_new = MEM_callocN(sizeof(*mat_orig_to_new) * totmat, - "GPUDrawObject.mat_orig_to_new"); - /* allocate the array and space for links */ - gdo->vert_points = MEM_mallocN(sizeof(GPUVertPointLink) * gdo->totvert, - "GPUDrawObject.vert_points"); -#ifdef USE_GPU_POINT_LINK - gdo->vert_points_mem = MEM_callocN(sizeof(GPUVertPointLink) * gdo->tot_triangle_point, - "GPUDrawObject.vert_points_mem"); - gdo->vert_points_usage = 0; -#endif - - /* build a map from the original material indices to the new - * GPUBufferMaterial indices */ - for (i = 0; i < gdo->totmaterial; i++) - mat_orig_to_new[gdo->materials[i].mat_nr] = i; - - /* -1 indicates the link is not yet used */ - for (i = 0; i < gdo->totvert; i++) { -#ifdef USE_GPU_POINT_LINK - gdo->vert_points[i].link = NULL; -#endif - gdo->vert_points[i].point_index = -1; - } - - for (i = 0; i < totface; i++, f++) { - mat = &gdo->materials[mat_orig_to_new[f->mat_nr]]; - - /* add triangle */ - gpu_drawobject_add_triangle(gdo, mat->start + mat->totpoint, - i, f->v1, f->v2, f->v3); - mat->totpoint += 3; - - /* add second triangle for quads */ - if (f->v4) { - gpu_drawobject_add_triangle(gdo, mat->start + mat->totpoint, - i, f->v3, f->v4, f->v1); - mat->totpoint += 3; - } - } - - /* map any unused vertices to loose points */ - for (i = 0; i < gdo->totvert; i++) { - if (gdo->vert_points[i].point_index == -1) { - gdo->vert_points[i].point_index = gdo->tot_triangle_point + gdo->tot_loose_point; - gdo->tot_loose_point++; - } - } - - MEM_freeN(mat_orig_to_new); -} - -/* see GPUDrawObject's structure definition for a description of the - * data being initialized here */ -static GPUDrawObject *GPU_drawobject_new(DerivedMesh *dm) -{ - GPUDraw @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org http://lists.blender.org/mailman/listinfo/bf-blender-cvs