diff options
Diffstat (limited to 'source/blender/blenkernel/intern/cdderivedmesh.c')
-rw-r--r-- | source/blender/blenkernel/intern/cdderivedmesh.c | 97 |
1 files changed, 42 insertions, 55 deletions
diff --git a/source/blender/blenkernel/intern/cdderivedmesh.c b/source/blender/blenkernel/intern/cdderivedmesh.c index a1bf255c239..2554151c99d 100644 --- a/source/blender/blenkernel/intern/cdderivedmesh.c +++ b/source/blender/blenkernel/intern/cdderivedmesh.c @@ -869,59 +869,7 @@ static void cdDM_drawMappedFacesTex(DerivedMesh *dm, static void cddm_draw_attrib_vertex(DMVertexAttribs *attribs, const MVert *mvert, int a, int index, int vert, const short (*lnor)[3], const bool smoothnormal) { - const float zero[4] = {0.0f, 0.0f, 0.0f, 0.0f}; - int b; - - /* orco texture coordinates */ - if (attribs->totorco) { - /*const*/ float (*array)[3] = attribs->orco.array; - const float *orco = (array) ? array[index] : zero; - - if (attribs->orco.gl_texco) - glTexCoord3fv(orco); - else - glVertexAttrib3fvARB(attribs->orco.gl_index, orco); - } - - /* uv texture coordinates */ - for (b = 0; b < attribs->tottface; b++) { - const float *uv; - - if (attribs->tface[b].array) { - MTFace *tf = &attribs->tface[b].array[a]; - uv = tf->uv[vert]; - } - else { - uv = zero; - } - - if (attribs->tface[b].gl_texco) - glTexCoord2fv(uv); - else - glVertexAttrib2fvARB(attribs->tface[b].gl_index, uv); - } - - /* vertex colors */ - for (b = 0; b < attribs->totmcol; b++) { - GLubyte col[4]; - - if (attribs->mcol[b].array) { - MCol *cp = &attribs->mcol[b].array[a * 4 + vert]; - col[0] = cp->b; col[1] = cp->g; col[2] = cp->r; col[3] = cp->a; - } - else { - col[0] = 0; col[1] = 0; col[2] = 0; col[3] = 0; - } - - glVertexAttrib4ubvARB(attribs->mcol[b].gl_index, col); - } - - /* tangent for normal mapping */ - if (attribs->tottang) { - /*const*/ float (*array)[4] = attribs->tang.array; - const float *tang = (array) ? array[a * 4 + vert] : zero; - glVertexAttrib4fvARB(attribs->tang.gl_index, tang); - } + DM_draw_attrib_vertex(attribs, a, index, vert); /* vertex normal */ if (lnor) { @@ -1592,6 +1540,7 @@ static CDDerivedMesh *cdDM_create(const char *desc) dm->calcNormals = CDDM_calc_normals; dm->calcLoopNormals = CDDM_calc_loop_normals; + dm->calcLoopNormalsSpaceArray = CDDM_calc_loop_normals_spacearr; dm->recalcTessellation = CDDM_recalc_tessellation; dm->getVertCos = cdDM_getVertCos; @@ -2208,7 +2157,15 @@ void CDDM_calc_normals(DerivedMesh *dm) #endif -void CDDM_calc_loop_normals(DerivedMesh *dm, const float split_angle) +void CDDM_calc_loop_normals(DerivedMesh *dm, const bool use_split_normals, const float split_angle) +{ + CDDM_calc_loop_normals_spacearr(dm, use_split_normals, split_angle, NULL); +} + +/* #define DEBUG_CLNORS */ + +void CDDM_calc_loop_normals_spacearr( + DerivedMesh *dm, const bool use_split_normals, const float split_angle, MLoopNorSpaceArray *r_lnors_spacearr) { MVert *mverts = dm->getVertArray(dm); MEdge *medges = dm->getEdgeArray(dm); @@ -2218,6 +2175,7 @@ void CDDM_calc_loop_normals(DerivedMesh *dm, const float split_angle) CustomData *ldata, *pdata; float (*lnors)[3]; + short (*clnor_data)[2]; float (*pnors)[3]; const int numVerts = dm->getNumVerts(dm); @@ -2245,8 +2203,37 @@ void CDDM_calc_loop_normals(DerivedMesh *dm, const float split_angle) dm->dirty &= ~DM_DIRTY_NORMALS; + clnor_data = CustomData_get_layer(ldata, CD_CUSTOMLOOPNORMAL); + BKE_mesh_normals_loop_split(mverts, numVerts, medges, numEdges, mloops, lnors, numLoops, - mpolys, pnors, numPolys, split_angle); + mpolys, (const float (*)[3])pnors, numPolys, + use_split_normals, split_angle, + r_lnors_spacearr, clnor_data, NULL); +#ifdef DEBUG_CLNORS + if (r_lnors_spacearr) { + int i; + for (i = 0; i < numLoops; i++) { + if (r_lnors_spacearr->lspacearr[i]->ref_alpha != 0.0f) { + LinkNode *loops = r_lnors_spacearr->lspacearr[i]->loops; + printf("Loop %d uses lnor space %p:\n", i, r_lnors_spacearr->lspacearr[i]); + print_v3("\tfinal lnor", lnors[i]); + print_v3("\tauto lnor", r_lnors_spacearr->lspacearr[i]->vec_lnor); + print_v3("\tref_vec", r_lnors_spacearr->lspacearr[i]->vec_ref); + printf("\talpha: %f\n\tbeta: %f\n\tloops: %p\n", r_lnors_spacearr->lspacearr[i]->ref_alpha, + r_lnors_spacearr->lspacearr[i]->ref_beta, r_lnors_spacearr->lspacearr[i]->loops); + printf("\t\t(shared with loops"); + while (loops) { + printf(" %d", GET_INT_FROM_POINTER(loops->link)); + loops = loops->next; + } + printf(")\n"); + } + else { + printf("Loop %d has no lnor space\n", i); + } + } + } +#endif } |