Changeset View
Changeset View
Standalone View
Standalone View
source/blender/blenkernel/intern/subsurf_ccg.c
| Show First 20 Lines • Show All 70 Lines • ▼ Show 20 Lines | |||||
| #ifndef USE_DYNSIZE | #ifndef USE_DYNSIZE | ||||
| # include "BLI_array.h" | # include "BLI_array.h" | ||||
| #endif | #endif | ||||
| #include "GPU_draw.h" | #include "GPU_draw.h" | ||||
| #include "GPU_glew.h" | #include "GPU_glew.h" | ||||
| #include "GPU_buffers.h" | #include "GPU_buffers.h" | ||||
| #include "GPU_legacy_stubs.h" | |||||
| #include "GPU_shader.h" | #include "GPU_shader.h" | ||||
| #include "GPU_basic_shader.h" | #include "GPU_basic_shader.h" | ||||
| #include "CCGSubSurf.h" | #include "CCGSubSurf.h" | ||||
| #ifdef WITH_OPENSUBDIV | #ifdef WITH_OPENSUBDIV | ||||
| # include "opensubdiv_capi.h" | # include "opensubdiv_capi.h" | ||||
| #endif | #endif | ||||
| ▲ Show 20 Lines • Show All 1,662 Lines • ▼ Show 20 Lines | static void ccgDM_drawVerts(DerivedMesh *dm) | ||||
| CCGDerivedMesh *ccgdm = (CCGDerivedMesh *) dm; | CCGDerivedMesh *ccgdm = (CCGDerivedMesh *) dm; | ||||
| CCGSubSurf *ss = ccgdm->ss; | CCGSubSurf *ss = ccgdm->ss; | ||||
| int edgeSize = ccgSubSurf_getEdgeSize(ss); | int edgeSize = ccgSubSurf_getEdgeSize(ss); | ||||
| int gridSize = ccgSubSurf_getGridSize(ss); | int gridSize = ccgSubSurf_getGridSize(ss); | ||||
| CCGVertIterator vi; | CCGVertIterator vi; | ||||
| CCGEdgeIterator ei; | CCGEdgeIterator ei; | ||||
| CCGFaceIterator fi; | CCGFaceIterator fi; | ||||
| glBegin(GL_POINTS); | oldBegin(GL_POINTS); | ||||
| for (ccgSubSurf_initVertIterator(ss, &vi); !ccgVertIterator_isStopped(&vi); ccgVertIterator_next(&vi)) { | for (ccgSubSurf_initVertIterator(ss, &vi); !ccgVertIterator_isStopped(&vi); ccgVertIterator_next(&vi)) { | ||||
| CCGVert *v = ccgVertIterator_getCurrent(&vi); | CCGVert *v = ccgVertIterator_getCurrent(&vi); | ||||
| glVertex3fv(ccgSubSurf_getVertData(ss, v)); | oldVertex3fv(ccgSubSurf_getVertData(ss, v)); | ||||
| } | } | ||||
| for (ccgSubSurf_initEdgeIterator(ss, &ei); !ccgEdgeIterator_isStopped(&ei); ccgEdgeIterator_next(&ei)) { | for (ccgSubSurf_initEdgeIterator(ss, &ei); !ccgEdgeIterator_isStopped(&ei); ccgEdgeIterator_next(&ei)) { | ||||
| CCGEdge *e = ccgEdgeIterator_getCurrent(&ei); | CCGEdge *e = ccgEdgeIterator_getCurrent(&ei); | ||||
| int x; | int x; | ||||
| for (x = 1; x < edgeSize - 1; x++) | for (x = 1; x < edgeSize - 1; x++) | ||||
| glVertex3fv(ccgSubSurf_getEdgeData(ss, e, x)); | oldVertex3fv(ccgSubSurf_getEdgeData(ss, e, x)); | ||||
| } | } | ||||
| for (ccgSubSurf_initFaceIterator(ss, &fi); !ccgFaceIterator_isStopped(&fi); ccgFaceIterator_next(&fi)) { | for (ccgSubSurf_initFaceIterator(ss, &fi); !ccgFaceIterator_isStopped(&fi); ccgFaceIterator_next(&fi)) { | ||||
| CCGFace *f = ccgFaceIterator_getCurrent(&fi); | CCGFace *f = ccgFaceIterator_getCurrent(&fi); | ||||
| int x, y, S, numVerts = ccgSubSurf_getFaceNumVerts(f); | int x, y, S, numVerts = ccgSubSurf_getFaceNumVerts(f); | ||||
| glVertex3fv(ccgSubSurf_getFaceCenterData(f)); | oldVertex3fv(ccgSubSurf_getFaceCenterData(f)); | ||||
| for (S = 0; S < numVerts; S++) | for (S = 0; S < numVerts; S++) | ||||
| for (x = 1; x < gridSize - 1; x++) | for (x = 1; x < gridSize - 1; x++) | ||||
| glVertex3fv(ccgSubSurf_getFaceGridEdgeData(ss, f, S, x)); | oldVertex3fv(ccgSubSurf_getFaceGridEdgeData(ss, f, S, x)); | ||||
| for (S = 0; S < numVerts; S++) | for (S = 0; S < numVerts; S++) | ||||
| for (y = 1; y < gridSize - 1; y++) | for (y = 1; y < gridSize - 1; y++) | ||||
| for (x = 1; x < gridSize - 1; x++) | for (x = 1; x < gridSize - 1; x++) | ||||
| glVertex3fv(ccgSubSurf_getFaceGridData(ss, f, S, x, y)); | oldVertex3fv(ccgSubSurf_getFaceGridData(ss, f, S, x, y)); | ||||
| } | } | ||||
| glEnd(); | oldEnd(); | ||||
| } | } | ||||
| static void ccgdm_pbvh_update(CCGDerivedMesh *ccgdm) | static void ccgdm_pbvh_update(CCGDerivedMesh *ccgdm) | ||||
| { | { | ||||
| if (ccgdm->pbvh && ccgDM_use_grid_pbvh(ccgdm)) { | if (ccgdm->pbvh && ccgDM_use_grid_pbvh(ccgdm)) { | ||||
| CCGFace **faces; | CCGFace **faces; | ||||
| int totface; | int totface; | ||||
| Show All 29 Lines | #if 0 | ||||
| if (!(G.f & G_BACKBUFSEL)) { | if (!(G.f & G_BACKBUFSEL)) { | ||||
| CCGSubSurf *ss = ccgdm->ss; | CCGSubSurf *ss = ccgdm->ss; | ||||
| ccgSubSurf_getUseAgeCounts(ss, &useAging, NULL, NULL, NULL); | ccgSubSurf_getUseAgeCounts(ss, &useAging, NULL, NULL, NULL); | ||||
| /* it needs some way to upload this to VBO now */ | /* it needs some way to upload this to VBO now */ | ||||
| if (useAging) { | if (useAging) { | ||||
| int ageCol = 255 - ccgSubSurf_getEdgeAge(ss, e) * 4; | int ageCol = 255 - ccgSubSurf_getEdgeAge(ss, e) * 4; | ||||
| glColor3ub(0, ageCol > 0 ? ageCol : 0, 0); | oldColor3ub(0, ageCol > 0 ? ageCol : 0, 0); | ||||
| } | } | ||||
| } | } | ||||
| #endif | #endif | ||||
| GPU_edge_setup(dm); | GPU_edge_setup(dm); | ||||
| gdo = dm->drawObject; | gdo = dm->drawObject; | ||||
| if (gdo->edges && gdo->points) { | if (gdo->edges && gdo->points) { | ||||
| if (drawAllEdges && drawLooseEdges) { | if (drawAllEdges && drawLooseEdges) { | ||||
| ▲ Show 20 Lines • Show All 58 Lines • ▼ Show 20 Lines | static void ccgDM_glNormalFast(float *a, float *b, float *c, float *d) | ||||
| float b_dX = d[0] - b[0], b_dY = d[1] - b[1], b_dZ = d[2] - b[2]; | float b_dX = d[0] - b[0], b_dY = d[1] - b[1], b_dZ = d[2] - b[2]; | ||||
| float no[3]; | float no[3]; | ||||
| no[0] = b_dY * a_cZ - b_dZ * a_cY; | no[0] = b_dY * a_cZ - b_dZ * a_cY; | ||||
| no[1] = b_dZ * a_cX - b_dX * a_cZ; | no[1] = b_dZ * a_cX - b_dX * a_cZ; | ||||
| no[2] = b_dX * a_cY - b_dY * a_cX; | no[2] = b_dX * a_cY - b_dY * a_cX; | ||||
| /* don't normalize, GL_NORMALIZE is enabled */ | /* don't normalize, GL_NORMALIZE is enabled */ | ||||
| glNormal3fv(no); | oldNormal3fv(no); | ||||
| } | } | ||||
| /* Only used by non-editmesh types */ | /* Only used by non-editmesh types */ | ||||
| static void ccgDM_buffer_copy_normal( | static void ccgDM_buffer_copy_normal( | ||||
| DerivedMesh *dm, short *varray) | DerivedMesh *dm, short *varray) | ||||
| { | { | ||||
| CCGDerivedMesh *ccgdm = (CCGDerivedMesh *) dm; | CCGDerivedMesh *ccgdm = (CCGDerivedMesh *) dm; | ||||
| CCGSubSurf *ss = ccgdm->ss; | CCGSubSurf *ss = ccgdm->ss; | ||||
| ▲ Show 20 Lines • Show All 753 Lines • ▼ Show 20 Lines | for (i = 0; i < num_base_faces; ++i) { | ||||
| else { | else { | ||||
| new_draw_smooth = true; | new_draw_smooth = true; | ||||
| new_matnr = 1; | new_matnr = 1; | ||||
| } | } | ||||
| if (new_draw_smooth != draw_smooth || new_matnr != mat_nr) { | if (new_draw_smooth != draw_smooth || new_matnr != mat_nr) { | ||||
| if (num_draw_patches != 0) { | if (num_draw_patches != 0) { | ||||
| bool do_draw = setMaterial(mat_nr, NULL); | bool do_draw = setMaterial(mat_nr, NULL); | ||||
| if (do_draw) { | if (do_draw) { | ||||
| glShadeModel(draw_smooth ? GL_SMOOTH : GL_FLAT); | oldShadeModel(draw_smooth ? GL_SMOOTH : GL_FLAT); | ||||
| ccgSubSurf_drawGLMesh(ss, | ccgSubSurf_drawGLMesh(ss, | ||||
| true, | true, | ||||
| start_draw_patch, | start_draw_patch, | ||||
| num_draw_patches); | num_draw_patches); | ||||
| } | } | ||||
| } | } | ||||
| start_draw_patch = current_patch; | start_draw_patch = current_patch; | ||||
| num_draw_patches = num_patches; | num_draw_patches = num_patches; | ||||
| mat_nr = new_matnr; | mat_nr = new_matnr; | ||||
| draw_smooth = new_draw_smooth; | draw_smooth = new_draw_smooth; | ||||
| } | } | ||||
| else { | else { | ||||
| num_draw_patches += num_patches; | num_draw_patches += num_patches; | ||||
| } | } | ||||
| current_patch += num_patches; | current_patch += num_patches; | ||||
| } | } | ||||
| if (num_draw_patches != 0) { | if (num_draw_patches != 0) { | ||||
| bool do_draw = setMaterial(mat_nr, NULL); | bool do_draw = setMaterial(mat_nr, NULL); | ||||
| if (do_draw) { | if (do_draw) { | ||||
| glShadeModel(draw_smooth ? GL_SMOOTH : GL_FLAT); | oldShadeModel(draw_smooth ? GL_SMOOTH : GL_FLAT); | ||||
| ccgSubSurf_drawGLMesh(ss, | ccgSubSurf_drawGLMesh(ss, | ||||
| true, | true, | ||||
| start_draw_patch, | start_draw_patch, | ||||
| num_draw_patches); | num_draw_patches); | ||||
| } | } | ||||
| } | } | ||||
| glShadeModel(GL_SMOOTH); | oldShadeModel(GL_SMOOTH); | ||||
| return; | return; | ||||
| } | } | ||||
| #endif | #endif | ||||
| GPU_vertex_setup(dm); | GPU_vertex_setup(dm); | ||||
| GPU_normal_setup(dm); | GPU_normal_setup(dm); | ||||
| GPU_triangle_setup(dm); | GPU_triangle_setup(dm); | ||||
| for (a = 0; a < dm->drawObject->totmaterial; a++) { | for (a = 0; a < dm->drawObject->totmaterial; a++) { | ||||
| ▲ Show 20 Lines • Show All 62 Lines • ▼ Show 20 Lines | for (i = 0; i < num_base_faces; ++i) { | ||||
| else { | else { | ||||
| new_draw_smooth = true; | new_draw_smooth = true; | ||||
| new_matnr = 1; | new_matnr = 1; | ||||
| } | } | ||||
| if (new_draw_smooth != draw_smooth || new_matnr != mat_nr) { | if (new_draw_smooth != draw_smooth || new_matnr != mat_nr) { | ||||
| if (num_draw_patches != 0) { | if (num_draw_patches != 0) { | ||||
| bool do_draw = setMaterial(mat_nr, &gattribs); | bool do_draw = setMaterial(mat_nr, &gattribs); | ||||
| if (do_draw) { | if (do_draw) { | ||||
| glShadeModel(draw_smooth ? GL_SMOOTH : GL_FLAT); | oldShadeModel(draw_smooth ? GL_SMOOTH : GL_FLAT); | ||||
| ccgSubSurf_drawGLMesh(ss, | ccgSubSurf_drawGLMesh(ss, | ||||
| true, | true, | ||||
| start_draw_patch, | start_draw_patch, | ||||
| num_draw_patches); | num_draw_patches); | ||||
| } | } | ||||
| } | } | ||||
| start_draw_patch = current_patch; | start_draw_patch = current_patch; | ||||
| num_draw_patches = num_patches; | num_draw_patches = num_patches; | ||||
| mat_nr = new_matnr; | mat_nr = new_matnr; | ||||
| draw_smooth = new_draw_smooth; | draw_smooth = new_draw_smooth; | ||||
| } | } | ||||
| else { | else { | ||||
| num_draw_patches += num_patches; | num_draw_patches += num_patches; | ||||
| } | } | ||||
| current_patch += num_patches; | current_patch += num_patches; | ||||
| } | } | ||||
| if (num_draw_patches != 0) { | if (num_draw_patches != 0) { | ||||
| bool do_draw = setMaterial(mat_nr, &gattribs); | bool do_draw = setMaterial(mat_nr, &gattribs); | ||||
| if (do_draw) { | if (do_draw) { | ||||
| glShadeModel(draw_smooth ? GL_SMOOTH : GL_FLAT); | oldShadeModel(draw_smooth ? GL_SMOOTH : GL_FLAT); | ||||
| ccgSubSurf_drawGLMesh(ss, | ccgSubSurf_drawGLMesh(ss, | ||||
| true, | true, | ||||
| start_draw_patch, | start_draw_patch, | ||||
| num_draw_patches); | num_draw_patches); | ||||
| } | } | ||||
| } | } | ||||
| glShadeModel(GL_SMOOTH); | oldShadeModel(GL_SMOOTH); | ||||
| return; | return; | ||||
| } | } | ||||
| #endif | #endif | ||||
| CCG_key_top_level(&key, ss); | CCG_key_top_level(&key, ss); | ||||
| ccgdm_pbvh_update(ccgdm); | ccgdm_pbvh_update(ccgdm); | ||||
| if (setDrawOptions != NULL) { | if (setDrawOptions != NULL) { | ||||
| ▲ Show 20 Lines • Show All 45 Lines • ▼ Show 20 Lines | for (a = 0, i = 0; i < totpoly; i++) { | ||||
| if (!do_draw || (setDrawOptions && (origIndex != ORIGINDEX_NONE) && | if (!do_draw || (setDrawOptions && (origIndex != ORIGINDEX_NONE) && | ||||
| (setDrawOptions(userData, origIndex) == DM_DRAW_OPTION_SKIP))) | (setDrawOptions(userData, origIndex) == DM_DRAW_OPTION_SKIP))) | ||||
| { | { | ||||
| a += gridFaces * gridFaces * numVerts; | a += gridFaces * gridFaces * numVerts; | ||||
| continue; | continue; | ||||
| } | } | ||||
| glShadeModel(drawSmooth ? GL_SMOOTH : GL_FLAT); | oldShadeModel(drawSmooth ? GL_SMOOTH : GL_FLAT); | ||||
| for (S = 0; S < numVerts; S++) { | for (S = 0; S < numVerts; S++) { | ||||
| CCGElem *faceGridData = ccgSubSurf_getFaceGridDataArray(ss, f, S); | CCGElem *faceGridData = ccgSubSurf_getFaceGridDataArray(ss, f, S); | ||||
| CCGElem *vda, *vdb; | CCGElem *vda, *vdb; | ||||
| if (ln) { | if (ln) { | ||||
| glBegin(GL_QUADS); | oldBegin(GL_QUADS); | ||||
| for (y = 0; y < gridFaces; y++) { | for (y = 0; y < gridFaces; y++) { | ||||
| for (x = 0; x < gridFaces; x++) { | for (x = 0; x < gridFaces; x++) { | ||||
| float *aco = CCG_grid_elem_co(&key, faceGridData, x, y); | float *aco = CCG_grid_elem_co(&key, faceGridData, x, y); | ||||
| float *bco = CCG_grid_elem_co(&key, faceGridData, x + 1, y); | float *bco = CCG_grid_elem_co(&key, faceGridData, x + 1, y); | ||||
| float *cco = CCG_grid_elem_co(&key, faceGridData, x + 1, y + 1); | float *cco = CCG_grid_elem_co(&key, faceGridData, x + 1, y + 1); | ||||
| float *dco = CCG_grid_elem_co(&key, faceGridData, x, y + 1); | float *dco = CCG_grid_elem_co(&key, faceGridData, x, y + 1); | ||||
| PASSATTRIB(0, 1, 1); | PASSATTRIB(0, 1, 1); | ||||
| glNormal3fv(ln[1]); | oldNormal3fv(ln[1]); | ||||
| glVertex3fv(dco); | oldVertex3fv(dco); | ||||
| PASSATTRIB(1, 1, 2); | PASSATTRIB(1, 1, 2); | ||||
| glNormal3fv(ln[2]); | oldNormal3fv(ln[2]); | ||||
| glVertex3fv(cco); | oldVertex3fv(cco); | ||||
| PASSATTRIB(1, 0, 3); | PASSATTRIB(1, 0, 3); | ||||
| glNormal3fv(ln[3]); | oldNormal3fv(ln[3]); | ||||
| glVertex3fv(bco); | oldVertex3fv(bco); | ||||
| PASSATTRIB(0, 0, 0); | PASSATTRIB(0, 0, 0); | ||||
| glNormal3fv(ln[0]); | oldNormal3fv(ln[0]); | ||||
| glVertex3fv(aco); | oldVertex3fv(aco); | ||||
| ln += 4; | ln += 4; | ||||
| a++; | a++; | ||||
| } | } | ||||
| } | } | ||||
| glEnd(); | oldEnd(); | ||||
| } | } | ||||
| else if (drawSmooth) { | else if (drawSmooth) { | ||||
| for (y = 0; y < gridFaces; y++) { | for (y = 0; y < gridFaces; y++) { | ||||
| glBegin(GL_QUAD_STRIP); | oldBegin(GL_QUAD_STRIP); | ||||
| for (x = 0; x < gridFaces; x++) { | for (x = 0; x < gridFaces; x++) { | ||||
| vda = CCG_grid_elem(&key, faceGridData, x, y + 0); | vda = CCG_grid_elem(&key, faceGridData, x, y + 0); | ||||
| vdb = CCG_grid_elem(&key, faceGridData, x, y + 1); | vdb = CCG_grid_elem(&key, faceGridData, x, y + 1); | ||||
| PASSATTRIB(0, 0, 0); | PASSATTRIB(0, 0, 0); | ||||
| glNormal3fv(CCG_elem_no(&key, vda)); | oldNormal3fv(CCG_elem_no(&key, vda)); | ||||
| glVertex3fv(CCG_elem_co(&key, vda)); | oldVertex3fv(CCG_elem_co(&key, vda)); | ||||
| PASSATTRIB(0, 1, 1); | PASSATTRIB(0, 1, 1); | ||||
| glNormal3fv(CCG_elem_no(&key, vdb)); | oldNormal3fv(CCG_elem_no(&key, vdb)); | ||||
| glVertex3fv(CCG_elem_co(&key, vdb)); | oldVertex3fv(CCG_elem_co(&key, vdb)); | ||||
| if (x != gridFaces - 1) | if (x != gridFaces - 1) | ||||
| a++; | a++; | ||||
| } | } | ||||
| vda = CCG_grid_elem(&key, faceGridData, x, y + 0); | vda = CCG_grid_elem(&key, faceGridData, x, y + 0); | ||||
| vdb = CCG_grid_elem(&key, faceGridData, x, y + 1); | vdb = CCG_grid_elem(&key, faceGridData, x, y + 1); | ||||
| PASSATTRIB(0, 0, 3); | PASSATTRIB(0, 0, 3); | ||||
| glNormal3fv(CCG_elem_no(&key, vda)); | oldNormal3fv(CCG_elem_no(&key, vda)); | ||||
| glVertex3fv(CCG_elem_co(&key, vda)); | oldVertex3fv(CCG_elem_co(&key, vda)); | ||||
| PASSATTRIB(0, 1, 2); | PASSATTRIB(0, 1, 2); | ||||
| glNormal3fv(CCG_elem_no(&key, vdb)); | oldNormal3fv(CCG_elem_no(&key, vdb)); | ||||
| glVertex3fv(CCG_elem_co(&key, vdb)); | oldVertex3fv(CCG_elem_co(&key, vdb)); | ||||
| glEnd(); | oldEnd(); | ||||
| a++; | a++; | ||||
| } | } | ||||
| } | } | ||||
| else { | else { | ||||
| glBegin(GL_QUADS); | oldBegin(GL_QUADS); | ||||
| for (y = 0; y < gridFaces; y++) { | for (y = 0; y < gridFaces; y++) { | ||||
| for (x = 0; x < gridFaces; x++) { | for (x = 0; x < gridFaces; x++) { | ||||
| float *aco = CCG_grid_elem_co(&key, faceGridData, x, y); | float *aco = CCG_grid_elem_co(&key, faceGridData, x, y); | ||||
| float *bco = CCG_grid_elem_co(&key, faceGridData, x + 1, y); | float *bco = CCG_grid_elem_co(&key, faceGridData, x + 1, y); | ||||
| float *cco = CCG_grid_elem_co(&key, faceGridData, x + 1, y + 1); | float *cco = CCG_grid_elem_co(&key, faceGridData, x + 1, y + 1); | ||||
| float *dco = CCG_grid_elem_co(&key, faceGridData, x, y + 1); | float *dco = CCG_grid_elem_co(&key, faceGridData, x, y + 1); | ||||
| ccgDM_glNormalFast(aco, bco, cco, dco); | ccgDM_glNormalFast(aco, bco, cco, dco); | ||||
| PASSATTRIB(0, 1, 1); | PASSATTRIB(0, 1, 1); | ||||
| glVertex3fv(dco); | oldVertex3fv(dco); | ||||
| PASSATTRIB(1, 1, 2); | PASSATTRIB(1, 1, 2); | ||||
| glVertex3fv(cco); | oldVertex3fv(cco); | ||||
| PASSATTRIB(1, 0, 3); | PASSATTRIB(1, 0, 3); | ||||
| glVertex3fv(bco); | oldVertex3fv(bco); | ||||
| PASSATTRIB(0, 0, 0); | PASSATTRIB(0, 0, 0); | ||||
| glVertex3fv(aco); | oldVertex3fv(aco); | ||||
| a++; | a++; | ||||
| } | } | ||||
| } | } | ||||
| glEnd(); | oldEnd(); | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| glShadeModel(GL_SMOOTH); | oldShadeModel(GL_SMOOTH); | ||||
| #undef PASSATTRIB | #undef PASSATTRIB | ||||
| } | } | ||||
| else { | else { | ||||
| GPUMaterialConv *matconv; | GPUMaterialConv *matconv; | ||||
| size_t offset; | size_t offset; | ||||
| int *mat_orig_to_new; | int *mat_orig_to_new; | ||||
| int tot_active_mat; | int tot_active_mat; | ||||
| GPUBuffer *buffer = NULL; | GPUBuffer *buffer = NULL; | ||||
| ▲ Show 20 Lines • Show All 247 Lines • ▼ Show 20 Lines | for (i = 0; i < num_base_faces; ++i) { | ||||
| } | } | ||||
| else { | else { | ||||
| new_draw_smooth = true; | new_draw_smooth = true; | ||||
| new_matnr = 1; | new_matnr = 1; | ||||
| } | } | ||||
| if (new_draw_smooth != draw_smooth || new_matnr != mat_nr) { | if (new_draw_smooth != draw_smooth || new_matnr != mat_nr) { | ||||
| if (num_draw_patches != 0) { | if (num_draw_patches != 0) { | ||||
| setMaterial(userData, mat_nr, &gattribs); | setMaterial(userData, mat_nr, &gattribs); | ||||
| glShadeModel(draw_smooth ? GL_SMOOTH : GL_FLAT); | oldShadeModel(draw_smooth ? GL_SMOOTH : GL_FLAT); | ||||
| ccgSubSurf_drawGLMesh(ss, | ccgSubSurf_drawGLMesh(ss, | ||||
| true, | true, | ||||
| start_draw_patch, | start_draw_patch, | ||||
| num_draw_patches); | num_draw_patches); | ||||
| } | } | ||||
| start_draw_patch = current_patch; | start_draw_patch = current_patch; | ||||
| num_draw_patches = num_patches; | num_draw_patches = num_patches; | ||||
| mat_nr = new_matnr; | mat_nr = new_matnr; | ||||
| draw_smooth = new_draw_smooth; | draw_smooth = new_draw_smooth; | ||||
| } | } | ||||
| else { | else { | ||||
| num_draw_patches += num_patches; | num_draw_patches += num_patches; | ||||
| } | } | ||||
| current_patch += num_patches; | current_patch += num_patches; | ||||
| } | } | ||||
| if (num_draw_patches != 0) { | if (num_draw_patches != 0) { | ||||
| setMaterial(userData, mat_nr, &gattribs); | setMaterial(userData, mat_nr, &gattribs); | ||||
| glShadeModel(draw_smooth ? GL_SMOOTH : GL_FLAT); | oldShadeModel(draw_smooth ? GL_SMOOTH : GL_FLAT); | ||||
| ccgSubSurf_drawGLMesh(ss, | ccgSubSurf_drawGLMesh(ss, | ||||
| true, | true, | ||||
| start_draw_patch, | start_draw_patch, | ||||
| num_draw_patches); | num_draw_patches); | ||||
| } | } | ||||
| glShadeModel(GL_SMOOTH); | oldShadeModel(GL_SMOOTH); | ||||
| return; | return; | ||||
| } | } | ||||
| #endif | #endif | ||||
| CCG_key_top_level(&key, ss); | CCG_key_top_level(&key, ss); | ||||
| ccgdm_pbvh_update(ccgdm); | ccgdm_pbvh_update(ccgdm); | ||||
| matnr = -1; | matnr = -1; | ||||
| ▲ Show 20 Lines • Show All 41 Lines • ▼ Show 20 Lines | for (a = 0, i = 0; i < totface; i++) { | ||||
| /* face hiding */ | /* face hiding */ | ||||
| if ((setFace && (origIndex != ORIGINDEX_NONE) && !setFace(userData, origIndex))) { | if ((setFace && (origIndex != ORIGINDEX_NONE) && !setFace(userData, origIndex))) { | ||||
| a += gridFaces * gridFaces * numVerts; | a += gridFaces * gridFaces * numVerts; | ||||
| continue; | continue; | ||||
| } | } | ||||
| /* draw face*/ | /* draw face*/ | ||||
| glShadeModel(drawSmooth ? GL_SMOOTH : GL_FLAT); | oldShadeModel(drawSmooth ? GL_SMOOTH : GL_FLAT); | ||||
| for (S = 0; S < numVerts; S++) { | for (S = 0; S < numVerts; S++) { | ||||
| CCGElem *faceGridData = ccgSubSurf_getFaceGridDataArray(ss, f, S); | CCGElem *faceGridData = ccgSubSurf_getFaceGridDataArray(ss, f, S); | ||||
| CCGElem *vda, *vdb; | CCGElem *vda, *vdb; | ||||
| if (ln) { | if (ln) { | ||||
| glBegin(GL_QUADS); | oldBegin(GL_QUADS); | ||||
| for (y = 0; y < gridFaces; y++) { | for (y = 0; y < gridFaces; y++) { | ||||
| for (x = 0; x < gridFaces; x++) { | for (x = 0; x < gridFaces; x++) { | ||||
| float *aco = CCG_grid_elem_co(&key, faceGridData, x, y + 0); | float *aco = CCG_grid_elem_co(&key, faceGridData, x, y + 0); | ||||
| float *bco = CCG_grid_elem_co(&key, faceGridData, x + 1, y + 0); | float *bco = CCG_grid_elem_co(&key, faceGridData, x + 1, y + 0); | ||||
| float *cco = CCG_grid_elem_co(&key, faceGridData, x + 1, y + 1); | float *cco = CCG_grid_elem_co(&key, faceGridData, x + 1, y + 1); | ||||
| float *dco = CCG_grid_elem_co(&key, faceGridData, x, y + 1); | float *dco = CCG_grid_elem_co(&key, faceGridData, x, y + 1); | ||||
| PASSATTRIB(0, 1, 1); | PASSATTRIB(0, 1, 1); | ||||
| glNormal3fv(ln[1]); | oldNormal3fv(ln[1]); | ||||
| glVertex3fv(dco); | oldVertex3fv(dco); | ||||
| PASSATTRIB(1, 1, 2); | PASSATTRIB(1, 1, 2); | ||||
| glNormal3fv(ln[2]); | oldNormal3fv(ln[2]); | ||||
| glVertex3fv(cco); | oldVertex3fv(cco); | ||||
| PASSATTRIB(1, 0, 3); | PASSATTRIB(1, 0, 3); | ||||
| glNormal3fv(ln[3]); | oldNormal3fv(ln[3]); | ||||
| glVertex3fv(bco); | oldVertex3fv(bco); | ||||
| PASSATTRIB(0, 0, 0); | PASSATTRIB(0, 0, 0); | ||||
| glNormal3fv(ln[0]); | oldNormal3fv(ln[0]); | ||||
| glVertex3fv(aco); | oldVertex3fv(aco); | ||||
| ln += 4; | ln += 4; | ||||
| a++; | a++; | ||||
| } | } | ||||
| } | } | ||||
| glEnd(); | oldEnd(); | ||||
| } | } | ||||
| else if (drawSmooth) { | else if (drawSmooth) { | ||||
| for (y = 0; y < gridFaces; y++) { | for (y = 0; y < gridFaces; y++) { | ||||
| glBegin(GL_QUAD_STRIP); | oldBegin(GL_QUAD_STRIP); | ||||
| for (x = 0; x < gridFaces; x++) { | for (x = 0; x < gridFaces; x++) { | ||||
| vda = CCG_grid_elem(&key, faceGridData, x, y); | vda = CCG_grid_elem(&key, faceGridData, x, y); | ||||
| vdb = CCG_grid_elem(&key, faceGridData, x, y + 1); | vdb = CCG_grid_elem(&key, faceGridData, x, y + 1); | ||||
| PASSATTRIB(0, 0, 0); | PASSATTRIB(0, 0, 0); | ||||
| glNormal3fv(CCG_elem_no(&key, vda)); | oldNormal3fv(CCG_elem_no(&key, vda)); | ||||
| glVertex3fv(CCG_elem_co(&key, vda)); | oldVertex3fv(CCG_elem_co(&key, vda)); | ||||
| PASSATTRIB(0, 1, 1); | PASSATTRIB(0, 1, 1); | ||||
| glNormal3fv(CCG_elem_no(&key, vdb)); | oldNormal3fv(CCG_elem_no(&key, vdb)); | ||||
| glVertex3fv(CCG_elem_co(&key, vdb)); | oldVertex3fv(CCG_elem_co(&key, vdb)); | ||||
| if (x != gridFaces - 1) | if (x != gridFaces - 1) | ||||
| a++; | a++; | ||||
| } | } | ||||
| vda = CCG_grid_elem(&key, faceGridData, x, y + 0); | vda = CCG_grid_elem(&key, faceGridData, x, y + 0); | ||||
| vdb = CCG_grid_elem(&key, faceGridData, x, y + 1); | vdb = CCG_grid_elem(&key, faceGridData, x, y + 1); | ||||
| PASSATTRIB(0, 0, 3); | PASSATTRIB(0, 0, 3); | ||||
| glNormal3fv(CCG_elem_no(&key, vda)); | oldNormal3fv(CCG_elem_no(&key, vda)); | ||||
| glVertex3fv(CCG_elem_co(&key, vda)); | oldVertex3fv(CCG_elem_co(&key, vda)); | ||||
| PASSATTRIB(0, 1, 2); | PASSATTRIB(0, 1, 2); | ||||
| glNormal3fv(CCG_elem_no(&key, vdb)); | oldNormal3fv(CCG_elem_no(&key, vdb)); | ||||
| glVertex3fv(CCG_elem_co(&key, vdb)); | oldVertex3fv(CCG_elem_co(&key, vdb)); | ||||
| glEnd(); | oldEnd(); | ||||
| a++; | a++; | ||||
| } | } | ||||
| } | } | ||||
| else { | else { | ||||
| glBegin(GL_QUADS); | oldBegin(GL_QUADS); | ||||
| for (y = 0; y < gridFaces; y++) { | for (y = 0; y < gridFaces; y++) { | ||||
| for (x = 0; x < gridFaces; x++) { | for (x = 0; x < gridFaces; x++) { | ||||
| float *aco = CCG_grid_elem_co(&key, faceGridData, x, y + 0); | float *aco = CCG_grid_elem_co(&key, faceGridData, x, y + 0); | ||||
| float *bco = CCG_grid_elem_co(&key, faceGridData, x + 1, y + 0); | float *bco = CCG_grid_elem_co(&key, faceGridData, x + 1, y + 0); | ||||
| float *cco = CCG_grid_elem_co(&key, faceGridData, x + 1, y + 1); | float *cco = CCG_grid_elem_co(&key, faceGridData, x + 1, y + 1); | ||||
| float *dco = CCG_grid_elem_co(&key, faceGridData, x, y + 1); | float *dco = CCG_grid_elem_co(&key, faceGridData, x, y + 1); | ||||
| ccgDM_glNormalFast(aco, bco, cco, dco); | ccgDM_glNormalFast(aco, bco, cco, dco); | ||||
| PASSATTRIB(0, 1, 1); | PASSATTRIB(0, 1, 1); | ||||
| glVertex3fv(dco); | oldVertex3fv(dco); | ||||
| PASSATTRIB(1, 1, 2); | PASSATTRIB(1, 1, 2); | ||||
| glVertex3fv(cco); | oldVertex3fv(cco); | ||||
| PASSATTRIB(1, 0, 3); | PASSATTRIB(1, 0, 3); | ||||
| glVertex3fv(bco); | oldVertex3fv(bco); | ||||
| PASSATTRIB(0, 0, 0); | PASSATTRIB(0, 0, 0); | ||||
| glVertex3fv(aco); | oldVertex3fv(aco); | ||||
| a++; | a++; | ||||
| } | } | ||||
| } | } | ||||
| glEnd(); | oldEnd(); | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| glShadeModel(GL_SMOOTH); | oldShadeModel(GL_SMOOTH); | ||||
| #undef PASSATTRIB | #undef PASSATTRIB | ||||
| } | } | ||||
| static void ccgDM_drawFacesTex_common(DerivedMesh *dm, | 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) | ||||
| ▲ Show 20 Lines • Show All 84 Lines • ▼ Show 20 Lines | for (i = 0; i < num_base_faces; ++i) { | ||||
| current_patch += num_patches; | current_patch += num_patches; | ||||
| if (flush) { | if (flush) { | ||||
| if (draw_option != DM_DRAW_OPTION_SKIP) { | if (draw_option != DM_DRAW_OPTION_SKIP) { | ||||
| num_draw_patches += num_patches; | num_draw_patches += num_patches; | ||||
| } | } | ||||
| if (num_draw_patches != 0) { | if (num_draw_patches != 0) { | ||||
| glShadeModel(draw_smooth ? GL_SMOOTH : GL_FLAT); | oldShadeModel(draw_smooth ? GL_SMOOTH : GL_FLAT); | ||||
| ccgSubSurf_drawGLMesh(ss, | ccgSubSurf_drawGLMesh(ss, | ||||
| true, | true, | ||||
| start_draw_patch, | start_draw_patch, | ||||
| num_draw_patches); | num_draw_patches); | ||||
| } | } | ||||
| start_draw_patch = current_patch; | start_draw_patch = current_patch; | ||||
| num_draw_patches = 0; | num_draw_patches = 0; | ||||
| } | } | ||||
| else { | else { | ||||
| num_draw_patches += num_patches; | num_draw_patches += num_patches; | ||||
| } | } | ||||
| } | } | ||||
| glShadeModel(GL_SMOOTH); | oldShadeModel(GL_SMOOTH); | ||||
| return; | return; | ||||
| } | } | ||||
| #endif | #endif | ||||
| CCG_key_top_level(&key, ss); | CCG_key_top_level(&key, ss); | ||||
| ccgdm_pbvh_update(ccgdm); | ccgdm_pbvh_update(ccgdm); | ||||
| GPU_vertex_setup(dm); | GPU_vertex_setup(dm); | ||||
| ▲ Show 20 Lines • Show All 127 Lines • ▼ Show 20 Lines | if (ccgdm->useGpuBackend) { | ||||
| if (setDrawOptions == NULL) { | if (setDrawOptions == NULL) { | ||||
| /* TODO(sergey): This is for cases when vertex colors or weights | /* TODO(sergey): This is for cases when vertex colors or weights | ||||
| * are visualising. Currently we don't have CD layers for this data | * are visualising. Currently we don't have CD layers for this data | ||||
| * and here we only make it so there's no garbage displayed. | * and here we only make it so there's no garbage displayed. | ||||
| * | * | ||||
| * In the future we'll either need to have CD for this data or pass | * In the future we'll either need to have CD for this data or pass | ||||
| * this data as face-varying or vertex-varying data in OSD mesh. | * this data as face-varying or vertex-varying data in OSD mesh. | ||||
| */ | */ | ||||
| glColor3f(0.8f, 0.8f, 0.8f); | oldColor3f(0.8f, 0.8f, 0.8f); | ||||
| } | } | ||||
| if (UNLIKELY(ccgSubSurf_prepareGLMesh(ss, true, -1) == false)) { | if (UNLIKELY(ccgSubSurf_prepareGLMesh(ss, true, -1) == false)) { | ||||
| return; | return; | ||||
| } | } | ||||
| if (faceFlags) { | if (faceFlags) { | ||||
| draw_smooth = (faceFlags[0].flag & ME_SMOOTH); | draw_smooth = (faceFlags[0].flag & ME_SMOOTH); | ||||
| new_matnr = (faceFlags[0].mat_nr + 1); | new_matnr = (faceFlags[0].mat_nr + 1); | ||||
| } | } | ||||
| else { | else { | ||||
| draw_smooth = true; | draw_smooth = true; | ||||
| new_matnr = 1; | new_matnr = 1; | ||||
| } | } | ||||
| if (setMaterial) { | if (setMaterial) { | ||||
| setMaterial(new_matnr, NULL); | setMaterial(new_matnr, NULL); | ||||
| } | } | ||||
| if (setDrawOptions) { | if (setDrawOptions) { | ||||
| if (setDrawOptions(userData, 0) == DM_DRAW_OPTION_SKIP) { | if (setDrawOptions(userData, 0) == DM_DRAW_OPTION_SKIP) { | ||||
| do_draw = false; | do_draw = false; | ||||
| } | } | ||||
| } | } | ||||
| if (do_draw) { | if (do_draw) { | ||||
| glShadeModel(draw_smooth ? GL_SMOOTH : GL_FLAT); | oldShadeModel(draw_smooth ? GL_SMOOTH : GL_FLAT); | ||||
| ccgSubSurf_drawGLMesh(ss, true, -1, -1); | ccgSubSurf_drawGLMesh(ss, true, -1, -1); | ||||
| glShadeModel(GL_SMOOTH); | oldShadeModel(GL_SMOOTH); | ||||
| } | } | ||||
| return; | return; | ||||
| } | } | ||||
| #endif | #endif | ||||
| 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 */ | ||||
| ▲ Show 20 Lines • Show All 49 Lines • ▼ Show 20 Lines | if (lnors) { | ||||
| if (draw_option == DM_DRAW_OPTION_STIPPLE) { | if (draw_option == DM_DRAW_OPTION_STIPPLE) { | ||||
| GPU_basic_shader_bind(GPU_SHADER_STIPPLE | GPU_SHADER_USE_COLOR); | GPU_basic_shader_bind(GPU_SHADER_STIPPLE | GPU_SHADER_USE_COLOR); | ||||
| GPU_basic_shader_stipple(GPU_SHADER_STIPPLE_QUARTTONE); | GPU_basic_shader_stipple(GPU_SHADER_STIPPLE_QUARTTONE); | ||||
| } | } | ||||
| for (S = 0; S < numVerts; S++) { | for (S = 0; S < numVerts; S++) { | ||||
| CCGElem *faceGridData = ccgSubSurf_getFaceGridDataArray(ss, f, S); | CCGElem *faceGridData = ccgSubSurf_getFaceGridDataArray(ss, f, S); | ||||
| if (ln) { | if (ln) { | ||||
| glBegin(GL_QUADS); | oldBegin(GL_QUADS); | ||||
| for (y = 0; y < gridFaces; y++) { | for (y = 0; y < gridFaces; y++) { | ||||
| for (x = 0; x < gridFaces; x++) { | for (x = 0; x < gridFaces; x++) { | ||||
| float *a = CCG_grid_elem_co(&key, faceGridData, x, y + 0); | float *a = CCG_grid_elem_co(&key, faceGridData, x, y + 0); | ||||
| float *b = CCG_grid_elem_co(&key, faceGridData, x + 1, y + 0); | float *b = CCG_grid_elem_co(&key, faceGridData, x + 1, y + 0); | ||||
| float *c = CCG_grid_elem_co(&key, faceGridData, x + 1, y + 1); | float *c = CCG_grid_elem_co(&key, faceGridData, x + 1, y + 1); | ||||
| float *d = CCG_grid_elem_co(&key, faceGridData, x, y + 1); | float *d = CCG_grid_elem_co(&key, faceGridData, x, y + 1); | ||||
| if (cp) glColor3ubv(&cp[4]); | if (cp) oldColor3ubv(&cp[4]); | ||||
| glNormal3fv(ln[1]); | oldNormal3fv(ln[1]); | ||||
| glVertex3fv(d); | oldVertex3fv(d); | ||||
| if (cp) glColor3ubv(&cp[8]); | if (cp) oldColor3ubv(&cp[8]); | ||||
| glNormal3fv(ln[2]); | oldNormal3fv(ln[2]); | ||||
| glVertex3fv(c); | oldVertex3fv(c); | ||||
| if (cp) glColor3ubv(&cp[12]); | if (cp) oldColor3ubv(&cp[12]); | ||||
| glNormal3fv(ln[3]); | oldNormal3fv(ln[3]); | ||||
| glVertex3fv(b); | oldVertex3fv(b); | ||||
| if (cp) glColor3ubv(&cp[0]); | if (cp) oldColor3ubv(&cp[0]); | ||||
| glNormal3fv(ln[0]); | oldNormal3fv(ln[0]); | ||||
| glVertex3fv(a); | oldVertex3fv(a); | ||||
| if (cp) cp += 16; | if (cp) cp += 16; | ||||
| ln += 4; | ln += 4; | ||||
| } | } | ||||
| } | } | ||||
| glEnd(); | oldEnd(); | ||||
| } | } | ||||
| else if (drawSmooth) { | else if (drawSmooth) { | ||||
| for (y = 0; y < gridFaces; y++) { | for (y = 0; y < gridFaces; y++) { | ||||
| CCGElem *a, *b; | CCGElem *a, *b; | ||||
| glBegin(GL_QUAD_STRIP); | oldBegin(GL_QUAD_STRIP); | ||||
| for (x = 0; x < gridFaces; x++) { | for (x = 0; x < gridFaces; x++) { | ||||
| a = CCG_grid_elem(&key, faceGridData, x, y + 0); | a = CCG_grid_elem(&key, faceGridData, x, y + 0); | ||||
| b = CCG_grid_elem(&key, faceGridData, x, y + 1); | b = CCG_grid_elem(&key, faceGridData, x, y + 1); | ||||
| if (cp) glColor3ubv(&cp[0]); | if (cp) oldColor3ubv(&cp[0]); | ||||
| glNormal3fv(CCG_elem_no(&key, a)); | oldNormal3fv(CCG_elem_no(&key, a)); | ||||
| glVertex3fv(CCG_elem_co(&key, a)); | oldVertex3fv(CCG_elem_co(&key, a)); | ||||
| if (cp) glColor3ubv(&cp[4]); | if (cp) oldColor3ubv(&cp[4]); | ||||
| glNormal3fv(CCG_elem_no(&key, b)); | oldNormal3fv(CCG_elem_no(&key, b)); | ||||
| glVertex3fv(CCG_elem_co(&key, b)); | oldVertex3fv(CCG_elem_co(&key, b)); | ||||
| if (x != gridFaces - 1) { | if (x != gridFaces - 1) { | ||||
| if (cp) cp += 16; | if (cp) cp += 16; | ||||
| } | } | ||||
| } | } | ||||
| a = CCG_grid_elem(&key, faceGridData, x, y + 0); | a = CCG_grid_elem(&key, faceGridData, x, y + 0); | ||||
| b = CCG_grid_elem(&key, faceGridData, x, y + 1); | b = CCG_grid_elem(&key, faceGridData, x, y + 1); | ||||
| if (cp) glColor3ubv(&cp[12]); | if (cp) oldColor3ubv(&cp[12]); | ||||
| glNormal3fv(CCG_elem_no(&key, a)); | oldNormal3fv(CCG_elem_no(&key, a)); | ||||
| glVertex3fv(CCG_elem_co(&key, a)); | oldVertex3fv(CCG_elem_co(&key, a)); | ||||
| if (cp) glColor3ubv(&cp[8]); | if (cp) oldColor3ubv(&cp[8]); | ||||
| glNormal3fv(CCG_elem_no(&key, b)); | oldNormal3fv(CCG_elem_no(&key, b)); | ||||
| glVertex3fv(CCG_elem_co(&key, b)); | oldVertex3fv(CCG_elem_co(&key, b)); | ||||
| if (cp) cp += 16; | if (cp) cp += 16; | ||||
| glEnd(); | oldEnd(); | ||||
| } | } | ||||
| } | } | ||||
| else { | else { | ||||
| glBegin(GL_QUADS); | oldBegin(GL_QUADS); | ||||
| for (y = 0; y < gridFaces; y++) { | for (y = 0; y < gridFaces; y++) { | ||||
| for (x = 0; x < gridFaces; x++) { | for (x = 0; x < gridFaces; x++) { | ||||
| float *a = CCG_grid_elem_co(&key, faceGridData, x, y + 0); | float *a = CCG_grid_elem_co(&key, faceGridData, x, y + 0); | ||||
| float *b = CCG_grid_elem_co(&key, faceGridData, x + 1, y + 0); | float *b = CCG_grid_elem_co(&key, faceGridData, x + 1, y + 0); | ||||
| float *c = CCG_grid_elem_co(&key, faceGridData, x + 1, y + 1); | float *c = CCG_grid_elem_co(&key, faceGridData, x + 1, y + 1); | ||||
| float *d = CCG_grid_elem_co(&key, faceGridData, x, y + 1); | float *d = CCG_grid_elem_co(&key, faceGridData, x, y + 1); | ||||
| ccgDM_glNormalFast(a, b, c, d); | ccgDM_glNormalFast(a, b, c, d); | ||||
| if (cp) glColor3ubv(&cp[4]); | if (cp) oldColor3ubv(&cp[4]); | ||||
| glVertex3fv(d); | oldVertex3fv(d); | ||||
| if (cp) glColor3ubv(&cp[8]); | if (cp) oldColor3ubv(&cp[8]); | ||||
| glVertex3fv(c); | oldVertex3fv(c); | ||||
| if (cp) glColor3ubv(&cp[12]); | if (cp) oldColor3ubv(&cp[12]); | ||||
| glVertex3fv(b); | oldVertex3fv(b); | ||||
| if (cp) glColor3ubv(&cp[0]); | if (cp) oldColor3ubv(&cp[0]); | ||||
| glVertex3fv(a); | oldVertex3fv(a); | ||||
| if (cp) cp += 16; | if (cp) cp += 16; | ||||
| } | } | ||||
| } | } | ||||
| glEnd(); | oldEnd(); | ||||
| } | } | ||||
| } | } | ||||
| if (draw_option == DM_DRAW_OPTION_STIPPLE) | if (draw_option == DM_DRAW_OPTION_STIPPLE) | ||||
| GPU_basic_shader_bind(GPU_SHADER_USE_COLOR); | GPU_basic_shader_bind(GPU_SHADER_USE_COLOR); | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| Show All 23 Lines | #endif | ||||
| CCG_key_top_level(&key, ss); | CCG_key_top_level(&key, ss); | ||||
| ccgSubSurf_getUseAgeCounts(ss, &useAging, NULL, NULL, NULL); | ccgSubSurf_getUseAgeCounts(ss, &useAging, NULL, NULL, NULL); | ||||
| for (ccgSubSurf_initEdgeIterator(ss, &ei); !ccgEdgeIterator_isStopped(&ei); ccgEdgeIterator_next(&ei)) { | for (ccgSubSurf_initEdgeIterator(ss, &ei); !ccgEdgeIterator_isStopped(&ei); ccgEdgeIterator_next(&ei)) { | ||||
| CCGEdge *e = ccgEdgeIterator_getCurrent(&ei); | CCGEdge *e = ccgEdgeIterator_getCurrent(&ei); | ||||
| CCGElem *edgeData = ccgSubSurf_getEdgeDataArray(ss, e); | CCGElem *edgeData = ccgSubSurf_getEdgeDataArray(ss, e); | ||||
| int index = ccgDM_getEdgeMapIndex(ss, e); | int index = ccgDM_getEdgeMapIndex(ss, e); | ||||
| glBegin(GL_LINE_STRIP); | oldBegin(GL_LINE_STRIP); | ||||
| if (index != -1 && (!setDrawOptions || (setDrawOptions(userData, index) != DM_DRAW_OPTION_SKIP))) { | if (index != -1 && (!setDrawOptions || (setDrawOptions(userData, index) != DM_DRAW_OPTION_SKIP))) { | ||||
| if (useAging && !(G.f & G_BACKBUFSEL)) { | if (useAging && !(G.f & G_BACKBUFSEL)) { | ||||
| int ageCol = 255 - ccgSubSurf_getEdgeAge(ss, e) * 4; | int ageCol = 255 - ccgSubSurf_getEdgeAge(ss, e) * 4; | ||||
| glColor3ub(0, ageCol > 0 ? ageCol : 0, 0); | oldColor3ub(0, ageCol > 0 ? ageCol : 0, 0); | ||||
| } | } | ||||
| for (i = 0; i < edgeSize - 1; i++) { | for (i = 0; i < edgeSize - 1; i++) { | ||||
| glVertex3fv(CCG_elem_offset_co(&key, edgeData, i)); | oldVertex3fv(CCG_elem_offset_co(&key, edgeData, i)); | ||||
| glVertex3fv(CCG_elem_offset_co(&key, edgeData, i + 1)); | oldVertex3fv(CCG_elem_offset_co(&key, edgeData, i + 1)); | ||||
| } | } | ||||
| } | } | ||||
| glEnd(); | oldEnd(); | ||||
| } | } | ||||
| } | } | ||||
| static void ccgDM_drawMappedEdgesInterp(DerivedMesh *dm, | static void ccgDM_drawMappedEdgesInterp(DerivedMesh *dm, | ||||
| DMSetDrawOptions setDrawOptions, | DMSetDrawOptions setDrawOptions, | ||||
| DMSetDrawInterpOptions setDrawInterpOptions, | DMSetDrawInterpOptions setDrawInterpOptions, | ||||
| void *userData) | void *userData) | ||||
| { | { | ||||
| Show All 13 Lines | #endif | ||||
| CCG_key_top_level(&key, ss); | CCG_key_top_level(&key, ss); | ||||
| ccgSubSurf_getUseAgeCounts(ss, &useAging, NULL, NULL, NULL); | ccgSubSurf_getUseAgeCounts(ss, &useAging, NULL, NULL, NULL); | ||||
| for (ccgSubSurf_initEdgeIterator(ss, &ei); !ccgEdgeIterator_isStopped(&ei); ccgEdgeIterator_next(&ei)) { | for (ccgSubSurf_initEdgeIterator(ss, &ei); !ccgEdgeIterator_isStopped(&ei); ccgEdgeIterator_next(&ei)) { | ||||
| CCGEdge *e = ccgEdgeIterator_getCurrent(&ei); | CCGEdge *e = ccgEdgeIterator_getCurrent(&ei); | ||||
| CCGElem *edgeData = ccgSubSurf_getEdgeDataArray(ss, e); | CCGElem *edgeData = ccgSubSurf_getEdgeDataArray(ss, e); | ||||
| int index = ccgDM_getEdgeMapIndex(ss, e); | int index = ccgDM_getEdgeMapIndex(ss, e); | ||||
| glBegin(GL_LINE_STRIP); | oldBegin(GL_LINE_STRIP); | ||||
| if (index != -1 && (!setDrawOptions || (setDrawOptions(userData, index) != DM_DRAW_OPTION_SKIP))) { | if (index != -1 && (!setDrawOptions || (setDrawOptions(userData, index) != DM_DRAW_OPTION_SKIP))) { | ||||
| for (i = 0; i < edgeSize; i++) { | for (i = 0; i < edgeSize; i++) { | ||||
| setDrawInterpOptions(userData, index, (float) i / (edgeSize - 1)); | setDrawInterpOptions(userData, index, (float) i / (edgeSize - 1)); | ||||
| if (useAging && !(G.f & G_BACKBUFSEL)) { | if (useAging && !(G.f & G_BACKBUFSEL)) { | ||||
| int ageCol = 255 - ccgSubSurf_getEdgeAge(ss, e) * 4; | int ageCol = 255 - ccgSubSurf_getEdgeAge(ss, e) * 4; | ||||
| glColor3ub(0, ageCol > 0 ? ageCol : 0, 0); | oldColor3ub(0, ageCol > 0 ? ageCol : 0, 0); | ||||
| } | } | ||||
| glVertex3fv(CCG_elem_offset_co(&key, edgeData, i)); | oldVertex3fv(CCG_elem_offset_co(&key, edgeData, i)); | ||||
| } | } | ||||
| } | } | ||||
| glEnd(); | oldEnd(); | ||||
| } | } | ||||
| } | } | ||||
| static void ccgDM_foreachMappedFaceCenter( | static void ccgDM_foreachMappedFaceCenter( | ||||
| DerivedMesh *dm, | DerivedMesh *dm, | ||||
| void (*func)(void *userData, int index, const float co[3], const float no[3]), | void (*func)(void *userData, int index, const float co[3], const float no[3]), | ||||
| void *userData, | void *userData, | ||||
| DMForeachFlag flag) | DMForeachFlag flag) | ||||
| ▲ Show 20 Lines • Show All 1,286 Lines • Show Last 20 Lines | |||||