Changeset View
Changeset View
Standalone View
Standalone View
source/blender/blenkernel/intern/subsurf_ccg.c
| Show First 20 Lines • Show All 2,293 Lines • ▼ Show 20 Lines | static void ccgDM_drawMappedFacesGLSL(DerivedMesh *dm, | ||||
| do_draw = 0; | do_draw = 0; | ||||
| matnr = -1; | matnr = -1; | ||||
| #define PASSATTRIB(dx, dy, vert) { \ | #define PASSATTRIB(dx, dy, vert) { \ | ||||
| if (attribs.totorco) \ | if (attribs.totorco) \ | ||||
| index = getFaceIndex(ss, f, S, x + dx, y + dy, edgeSize, gridSize); \ | index = getFaceIndex(ss, f, S, x + dx, y + dy, edgeSize, gridSize); \ | ||||
| else \ | else \ | ||||
| index = 0; \ | index = 0; \ | ||||
| DM_draw_attrib_vertex(&attribs, a, index, vert); \ | DM_draw_attrib_vertex(&attribs, a, index, vert, (a * 4) + vert); \ | ||||
| } (void)0 | } (void)0 | ||||
| totface = ccgSubSurf_getNumFaces(ss); | totface = ccgSubSurf_getNumFaces(ss); | ||||
| for (a = 0, i = 0; i < totface; i++) { | for (a = 0, i = 0; i < totface; i++) { | ||||
| CCGFace *f = ccgdm->faceMap[i].face; | CCGFace *f = ccgdm->faceMap[i].face; | ||||
| short (*ln)[4][3] = NULL; | short (*ln)[4][3] = NULL; | ||||
| int S, x, y, drawSmooth; | int S, x, y, drawSmooth; | ||||
| int index = GET_INT_FROM_POINTER(ccgSubSurf_getFaceFaceHandle(f)); | int index = GET_INT_FROM_POINTER(ccgSubSurf_getFaceFaceHandle(f)); | ||||
| ▲ Show 20 Lines • Show All 110 Lines • ▼ Show 20 Lines | for (S = 0; S < numVerts; S++) { | ||||
| PASSATTRIB(0, 1, 1); | PASSATTRIB(0, 1, 1); | ||||
| glVertex3fv(dco); | glVertex3fv(dco); | ||||
| PASSATTRIB(1, 1, 2); | PASSATTRIB(1, 1, 2); | ||||
| glVertex3fv(cco); | glVertex3fv(cco); | ||||
| PASSATTRIB(1, 0, 3); | PASSATTRIB(1, 0, 3); | ||||
| glVertex3fv(bco); | glVertex3fv(bco); | ||||
| PASSATTRIB(0, 0, 0); | PASSATTRIB(0, 0, 0); | ||||
| glVertex3fv(aco); | glVertex3fv(aco); | ||||
| a++; | a++; | ||||
| } | } | ||||
| } | } | ||||
| glEnd(); | glEnd(); | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| Show All 27 Lines | static void ccgDM_drawMappedFacesMat(DerivedMesh *dm, | ||||
| matnr = -1; | matnr = -1; | ||||
| #define PASSATTRIB(dx, dy, vert) { \ | #define PASSATTRIB(dx, dy, vert) { \ | ||||
| if (attribs.totorco) \ | if (attribs.totorco) \ | ||||
| index = getFaceIndex(ss, f, S, x + dx, y + dy, edgeSize, gridSize); \ | index = getFaceIndex(ss, f, S, x + dx, y + dy, edgeSize, gridSize); \ | ||||
| else \ | else \ | ||||
| index = 0; \ | index = 0; \ | ||||
| DM_draw_attrib_vertex(&attribs, a, index, vert); \ | DM_draw_attrib_vertex(&attribs, a, index, vert, (a * 4) + vert); \ | ||||
| } (void)0 | } (void)0 | ||||
| totface = ccgSubSurf_getNumFaces(ss); | totface = ccgSubSurf_getNumFaces(ss); | ||||
| for (a = 0, i = 0; i < totface; i++) { | for (a = 0, i = 0; i < totface; i++) { | ||||
| CCGFace *f = ccgdm->faceMap[i].face; | CCGFace *f = ccgdm->faceMap[i].face; | ||||
| short (*ln)[4][3] = NULL; | short (*ln)[4][3] = NULL; | ||||
| int S, x, y, drawSmooth; | int S, x, y, drawSmooth; | ||||
| int index = GET_INT_FROM_POINTER(ccgSubSurf_getFaceFaceHandle(f)); | int index = GET_INT_FROM_POINTER(ccgSubSurf_getFaceFaceHandle(f)); | ||||
| ▲ Show 20 Lines • Show All 132 Lines • ▼ Show 20 Lines | static void ccgDM_drawFacesTex_common(DerivedMesh *dm, | ||||
| DMSetDrawOptionsTex drawParams, | DMSetDrawOptionsTex drawParams, | ||||
| DMSetDrawOptionsMappedTex drawParamsMapped, | DMSetDrawOptionsMappedTex drawParamsMapped, | ||||
| DMCompareDrawOptions compareDrawOptions, | DMCompareDrawOptions compareDrawOptions, | ||||
| void *userData, DMDrawFlag flag) | void *userData, DMDrawFlag flag) | ||||
| { | { | ||||
| CCGDerivedMesh *ccgdm = (CCGDerivedMesh *) dm; | CCGDerivedMesh *ccgdm = (CCGDerivedMesh *) dm; | ||||
| CCGSubSurf *ss = ccgdm->ss; | CCGSubSurf *ss = ccgdm->ss; | ||||
| CCGKey key; | CCGKey key; | ||||
| int colType = CD_TEXTURE_MCOL; | int colType = CD_TEXTURE_MLOOPCOL; | ||||
| MCol *mcol = dm->getTessFaceDataArray(dm, colType); | MCol *mcol = dm->getTessFaceDataArray(dm, colType); | ||||
| MTFace *tf = DM_get_tessface_data_layer(dm, CD_MTFACE); | MTFace *tf = DM_get_tessface_data_layer(dm, CD_MTFACE); | ||||
| DMFlagMat *faceFlags = ccgdm->faceFlags; | DMFlagMat *faceFlags = ccgdm->faceFlags; | ||||
| DMDrawOption draw_option; | DMDrawOption draw_option; | ||||
| int i, totpoly; | int i, totpoly; | ||||
| bool flush; | bool flush; | ||||
| bool use_tface = (flag & DM_DRAW_USE_ACTIVE_UV) != 0; | bool use_tface = (flag & DM_DRAW_USE_ACTIVE_UV) != 0; | ||||
| unsigned int next_actualFace; | unsigned int next_actualFace; | ||||
| ▲ Show 20 Lines • Show All 163 Lines • ▼ Show 20 Lines | static void ccgDM_drawMappedFaces(DerivedMesh *dm, | ||||
| DMSetDrawOptions setDrawOptions, | DMSetDrawOptions setDrawOptions, | ||||
| DMSetMaterial setMaterial, | DMSetMaterial setMaterial, | ||||
| DMCompareDrawOptions compareDrawOptions, | DMCompareDrawOptions compareDrawOptions, | ||||
| void *userData, DMDrawFlag flag) | void *userData, DMDrawFlag flag) | ||||
| { | { | ||||
| CCGDerivedMesh *ccgdm = (CCGDerivedMesh *) dm; | CCGDerivedMesh *ccgdm = (CCGDerivedMesh *) dm; | ||||
| CCGSubSurf *ss = ccgdm->ss; | CCGSubSurf *ss = ccgdm->ss; | ||||
| CCGKey key; | CCGKey key; | ||||
| MCol *mcol = NULL; | MLoopCol *mloopcol = NULL; | ||||
| short (*lnors)[4][3] = dm->getTessFaceDataArray(dm, CD_TESSLOOPNORMAL); | short (*lnors)[4][3] = dm->getTessFaceDataArray(dm, CD_TESSLOOPNORMAL); | ||||
| int i, gridSize = ccgSubSurf_getGridSize(ss); | int i, gridSize = ccgSubSurf_getGridSize(ss); | ||||
| DMFlagMat *faceFlags = ccgdm->faceFlags; | DMFlagMat *faceFlags = ccgdm->faceFlags; | ||||
| int useColors = flag & DM_DRAW_USE_COLORS; | int useColors = flag & DM_DRAW_USE_COLORS; | ||||
| int gridFaces = gridSize - 1, totface; | int gridFaces = gridSize - 1, totface; | ||||
| int prev_mat_nr = -1; | int prev_mat_nr = -1; | ||||
| CCG_key_top_level(&key, ss); | CCG_key_top_level(&key, ss); | ||||
| /* currently unused -- each original face is handled separately */ | /* currently unused -- each original face is handled separately */ | ||||
| (void)compareDrawOptions; | (void)compareDrawOptions; | ||||
| if (useColors) { | if (useColors) { | ||||
| mcol = dm->getTessFaceDataArray(dm, CD_PREVIEW_MCOL); | mloopcol = dm->getLoopDataArray(dm, CD_PREVIEW_MLOOPCOL); | ||||
| if (!mcol) | if (!mloopcol) | ||||
| mcol = dm->getTessFaceDataArray(dm, CD_MCOL); | mloopcol = dm->getLoopDataArray(dm, CD_MLOOPCOL); | ||||
| } | } | ||||
| totface = ccgSubSurf_getNumFaces(ss); | totface = ccgSubSurf_getNumFaces(ss); | ||||
| for (i = 0; i < totface; i++) { | for (i = 0; i < totface; i++) { | ||||
| CCGFace *f = ccgdm->faceMap[i].face; | CCGFace *f = ccgdm->faceMap[i].face; | ||||
| int S, x, y, numVerts = ccgSubSurf_getFaceNumVerts(f); | int S, x, y, numVerts = ccgSubSurf_getFaceNumVerts(f); | ||||
| int drawSmooth, index = ccgDM_getFaceMapIndex(ss, f); | int drawSmooth, index = ccgDM_getFaceMapIndex(ss, f); | ||||
| int origIndex; | int origIndex; | ||||
| unsigned char *cp = NULL; | unsigned char *cp = NULL; | ||||
| short (*ln)[4][3] = NULL; | short (*ln)[4][3] = NULL; | ||||
| origIndex = GET_INT_FROM_POINTER(ccgSubSurf_getFaceFaceHandle(f)); | origIndex = GET_INT_FROM_POINTER(ccgSubSurf_getFaceFaceHandle(f)); | ||||
| if (flag & DM_DRAW_ALWAYS_SMOOTH) drawSmooth = 1; | if (flag & DM_DRAW_ALWAYS_SMOOTH) drawSmooth = 1; | ||||
| else if (faceFlags) drawSmooth = (lnors || (faceFlags[origIndex].flag & ME_SMOOTH)); | else if (faceFlags) drawSmooth = (lnors || (faceFlags[origIndex].flag & ME_SMOOTH)); | ||||
| else drawSmooth = 1; | else drawSmooth = 1; | ||||
| if (mcol) { | if (mloopcol) { | ||||
| cp = (unsigned char *)mcol; | cp = (unsigned char *)mloopcol; | ||||
| mcol += gridFaces * gridFaces * numVerts * 4; | mloopcol += gridFaces * gridFaces * numVerts * 4; | ||||
| } | } | ||||
| if (lnors) { | if (lnors) { | ||||
| ln = lnors; | ln = lnors; | ||||
| lnors += gridFaces * gridFaces * numVerts; | lnors += gridFaces * gridFaces * numVerts; | ||||
| } | } | ||||
| { | { | ||||
| ▲ Show 20 Lines • Show All 714 Lines • ▼ Show 20 Lines | if (grid_pbvh) { | ||||
| numGrids = ccgDM_getNumGrids(dm); | numGrids = ccgDM_getNumGrids(dm); | ||||
| ob->sculpt->pbvh = ccgdm->pbvh = BKE_pbvh_new(); | ob->sculpt->pbvh = ccgdm->pbvh = BKE_pbvh_new(); | ||||
| BKE_pbvh_build_grids(ccgdm->pbvh, ccgdm->gridData, | BKE_pbvh_build_grids(ccgdm->pbvh, ccgdm->gridData, | ||||
| numGrids, &key, (void **) ccgdm->gridFaces, ccgdm->gridFlagMats, ccgdm->gridHidden); | numGrids, &key, (void **) ccgdm->gridFaces, ccgdm->gridFlagMats, ccgdm->gridHidden); | ||||
| } | } | ||||
| else if (ob->type == OB_MESH) { | else if (ob->type == OB_MESH) { | ||||
| Mesh *me = ob->data; | Mesh *me = ob->data; | ||||
| const int looptris_num = poly_to_tri_count(me->totpoly, me->totloop); | |||||
| MLoopTri *looptri; | |||||
| looptri = MEM_mallocN(sizeof(*looptri) * looptris_num, __func__); | |||||
| ob->sculpt->pbvh = ccgdm->pbvh = BKE_pbvh_new(); | ob->sculpt->pbvh = ccgdm->pbvh = BKE_pbvh_new(); | ||||
| BLI_assert(!(me->mface == NULL && me->mpoly != NULL)); /* BMESH ONLY complain if mpoly is valid but not mface */ | BLI_assert(!(me->mface == NULL && me->mpoly != NULL)); /* BMESH ONLY complain if mpoly is valid but not mface */ | ||||
| BKE_pbvh_build_mesh(ccgdm->pbvh, me->mface, me->mvert, | BKE_pbvh_build_mesh(ccgdm->pbvh, me->mpoly, me->mloop, me->mvert, me->totvert, &me->vdata, | ||||
| me->totface, me->totvert, &me->vdata); | looptri, looptris_num); | ||||
| } | } | ||||
| if (ccgdm->pbvh) | if (ccgdm->pbvh) | ||||
| pbvh_show_diffuse_color_set(ccgdm->pbvh, ob->sculpt->show_diffuse_color); | pbvh_show_diffuse_color_set(ccgdm->pbvh, ob->sculpt->show_diffuse_color); | ||||
| return ccgdm->pbvh; | return ccgdm->pbvh; | ||||
| } | } | ||||
| static void ccgDM_recalcTessellation(DerivedMesh *UNUSED(dm)) | static void ccgDM_recalcTessellation(DerivedMesh *UNUSED(dm)) | ||||
| { | { | ||||
| /* Nothing to do: CCG handles creating its own tessfaces */ | /* Nothing to do: CCG handles creating its own tessfaces */ | ||||
| } | } | ||||
| static void ccgDM_recalcLooptri(DerivedMesh *UNUSED(dm)) | |||||
| { | |||||
| /* Nothing to do: CCG handles creating its own tessfaces */ | |||||
| } | |||||
| static void ccgDM_calcNormals(DerivedMesh *dm) | static void ccgDM_calcNormals(DerivedMesh *dm) | ||||
| { | { | ||||
| /* Nothing to do: CCG calculates normals during drawing */ | /* Nothing to do: CCG calculates normals during drawing */ | ||||
| dm->dirty &= ~DM_DIRTY_NORMALS; | dm->dirty &= ~DM_DIRTY_NORMALS; | ||||
| } | } | ||||
| static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss, | static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss, | ||||
| int drawInteriorEdges, | int drawInteriorEdges, | ||||
| ▲ Show 20 Lines • Show All 101 Lines • ▼ Show 20 Lines | #endif | ||||
| ccgdm->dm.getGridHidden = ccgDM_getGridHidden; | ccgdm->dm.getGridHidden = ccgDM_getGridHidden; | ||||
| ccgdm->dm.getPolyMap = ccgDM_getPolyMap; | ccgdm->dm.getPolyMap = ccgDM_getPolyMap; | ||||
| ccgdm->dm.getPBVH = ccgDM_getPBVH; | ccgdm->dm.getPBVH = ccgDM_getPBVH; | ||||
| ccgdm->dm.calcNormals = ccgDM_calcNormals; | ccgdm->dm.calcNormals = ccgDM_calcNormals; | ||||
| ccgdm->dm.calcLoopNormals = CDDM_calc_loop_normals; | ccgdm->dm.calcLoopNormals = CDDM_calc_loop_normals; | ||||
| ccgdm->dm.calcLoopNormalsSpaceArray = CDDM_calc_loop_normals_spacearr; | ccgdm->dm.calcLoopNormalsSpaceArray = CDDM_calc_loop_normals_spacearr; | ||||
| ccgdm->dm.recalcTessellation = ccgDM_recalcTessellation; | ccgdm->dm.recalcTessellation = ccgDM_recalcTessellation; | ||||
| ccgdm->dm.recalcLooptri = ccgDM_recalcLooptri; | |||||
| ccgdm->dm.getVertCos = ccgdm_getVertCos; | ccgdm->dm.getVertCos = ccgdm_getVertCos; | ||||
| ccgdm->dm.foreachMappedVert = ccgDM_foreachMappedVert; | ccgdm->dm.foreachMappedVert = ccgDM_foreachMappedVert; | ||||
| ccgdm->dm.foreachMappedEdge = ccgDM_foreachMappedEdge; | ccgdm->dm.foreachMappedEdge = ccgDM_foreachMappedEdge; | ||||
| ccgdm->dm.foreachMappedLoop = ccgDM_foreachMappedLoop; | ccgdm->dm.foreachMappedLoop = ccgDM_foreachMappedLoop; | ||||
| ccgdm->dm.foreachMappedFaceCenter = ccgDM_foreachMappedFaceCenter; | ccgdm->dm.foreachMappedFaceCenter = ccgDM_foreachMappedFaceCenter; | ||||
| ccgdm->dm.drawVerts = ccgDM_drawVerts; | ccgdm->dm.drawVerts = ccgDM_drawVerts; | ||||
| ▲ Show 20 Lines • Show All 489 Lines • Show Last 20 Lines | |||||