[Bf-blender-cvs] [ab7d30f] opensubdiv-modifier: OpenSubdiv: Fix some bad array subscriptions in drawing code
Sergey Sharybin
noreply at git.blender.org
Fri Jul 17 11:37:21 CEST 2015
Commit: ab7d30f63aa12181e68679f931e36bf34e358a1d
Author: Sergey Sharybin
Date: Fri Jul 17 11:29:35 2015 +0200
Branches: opensubdiv-modifier
https://developer.blender.org/rBab7d30f63aa12181e68679f931e36bf34e358a1d
OpenSubdiv: Fix some bad array subscriptions in drawing code
===================================================================
M intern/opensubdiv/opensubdiv_converter.cc
M intern/opensubdiv/opensubdiv_converter_capi.h
M source/blender/blenkernel/intern/CCGSubSurf.c
M source/blender/blenkernel/intern/CCGSubSurf_intern.h
M source/blender/blenkernel/intern/CCGSubSurf_opensubdiv.c
M source/blender/blenkernel/intern/subsurf_ccg.c
===================================================================
diff --git a/intern/opensubdiv/opensubdiv_converter.cc b/intern/opensubdiv/opensubdiv_converter.cc
index 401e7b3..f5f3547 100644
--- a/intern/opensubdiv/opensubdiv_converter.cc
+++ b/intern/opensubdiv/opensubdiv_converter.cc
@@ -247,6 +247,36 @@ int openSubdiv_topologyRefinerGetSubdivLevel(
return refiner->GetMaxLevel();
}
+int openSubdiv_topologyRefinerGetNumVerts(
+ const OpenSubdiv_TopologyRefinerDescr *topology_refiner)
+{
+ using OpenSubdiv::Far::TopologyLevel;
+ using OpenSubdiv::Far::TopologyRefiner;
+ const TopologyRefiner *refiner = (const TopologyRefiner *)topology_refiner;
+ const TopologyLevel &base_level = refiner->GetLevel(0);
+ return base_level.GetNumVertices();
+}
+
+int openSubdiv_topologyRefinerGetNumEdges(
+ const OpenSubdiv_TopologyRefinerDescr *topology_refiner)
+{
+ using OpenSubdiv::Far::TopologyLevel;
+ using OpenSubdiv::Far::TopologyRefiner;
+ const TopologyRefiner *refiner = (const TopologyRefiner *)topology_refiner;
+ const TopologyLevel &base_level = refiner->GetLevel(0);
+ return base_level.GetNumEdges();
+}
+
+int openSubdiv_topologyRefinerGetNumFaces(
+ const OpenSubdiv_TopologyRefinerDescr *topology_refiner)
+{
+ using OpenSubdiv::Far::TopologyLevel;
+ using OpenSubdiv::Far::TopologyRefiner;
+ const TopologyRefiner *refiner = (const TopologyRefiner *)topology_refiner;
+ const TopologyLevel &base_level = refiner->GetLevel(0);
+ return base_level.GetNumFaces();
+}
+
int openSubdiv_topologyRefnerCompareConverter(
const OpenSubdiv_TopologyRefinerDescr *topology_refiner,
OpenSubdiv_Converter *converter)
diff --git a/intern/opensubdiv/opensubdiv_converter_capi.h b/intern/opensubdiv/opensubdiv_converter_capi.h
index df2fb57..7c96d3d 100644
--- a/intern/opensubdiv/opensubdiv_converter_capi.h
+++ b/intern/opensubdiv/opensubdiv_converter_capi.h
@@ -100,6 +100,15 @@ void openSubdiv_deleteTopologyRefinerDescr(
int openSubdiv_topologyRefinerGetSubdivLevel(
const OpenSubdiv_TopologyRefinerDescr *topology_refiner);
+int openSubdiv_topologyRefinerGetNumVerts(
+ const OpenSubdiv_TopologyRefinerDescr *topology_refiner);
+
+int openSubdiv_topologyRefinerGetNumEdges(
+ const OpenSubdiv_TopologyRefinerDescr *topology_refiner);
+
+int openSubdiv_topologyRefinerGetNumFaces(
+ const OpenSubdiv_TopologyRefinerDescr *topology_refiner);
+
int openSubdiv_topologyRefnerCompareConverter(
const OpenSubdiv_TopologyRefinerDescr *topology_refiner,
OpenSubdiv_Converter *converter);
diff --git a/source/blender/blenkernel/intern/CCGSubSurf.c b/source/blender/blenkernel/intern/CCGSubSurf.c
index 530e9f8..fc6ae9e 100644
--- a/source/blender/blenkernel/intern/CCGSubSurf.c
+++ b/source/blender/blenkernel/intern/CCGSubSurf.c
@@ -1192,15 +1192,39 @@ CCGError ccgSubSurf_stitchFaces(CCGSubSurf *ss, int lvl, CCGFace **effectedF, in
int ccgSubSurf_getNumVerts(const CCGSubSurf *ss)
{
- return ss->vMap->numEntries;
+#ifdef WITH_OPENSUBDIV
+ if (ss->skip_grids) {
+ return ccgSubSurf__getNumOsdBaseVerts(ss);
+ }
+ else
+#endif
+ {
+ return ss->vMap->numEntries;
+ }
}
int ccgSubSurf_getNumEdges(const CCGSubSurf *ss)
{
- return ss->eMap->numEntries;
+#ifdef WITH_OPENSUBDIV
+ if (ss->skip_grids) {
+ return ccgSubSurf__getNumOsdBaseEdges(ss);
+ }
+ else
+#endif
+ {
+ return ss->eMap->numEntries;
+ }
}
int ccgSubSurf_getNumFaces(const CCGSubSurf *ss)
{
- return ss->fMap->numEntries;
+#ifdef WITH_OPENSUBDIV
+ if (ss->skip_grids) {
+ return ccgSubSurf__getNumOsdBaseFaces(ss);
+ }
+ else
+#endif
+ {
+ return ss->fMap->numEntries;
+ }
}
CCGVert *ccgSubSurf_getVert(CCGSubSurf *ss, CCGVertHDL v)
diff --git a/source/blender/blenkernel/intern/CCGSubSurf_intern.h b/source/blender/blenkernel/intern/CCGSubSurf_intern.h
index 95ea914..d80bdcd 100644
--- a/source/blender/blenkernel/intern/CCGSubSurf_intern.h
+++ b/source/blender/blenkernel/intern/CCGSubSurf_intern.h
@@ -303,6 +303,10 @@ void ccgSubSurf__sync_legacy(CCGSubSurf *ss);
void ccgSubSurf__sync_opensubdiv(CCGSubSurf *ss);
+int ccgSubSurf__getNumOsdBaseVerts(const CCGSubSurf *ss);
+int ccgSubSurf__getNumOsdBaseEdges(const CCGSubSurf *ss);
+int ccgSubSurf__getNumOsdBaseFaces(const CCGSubSurf *ss);
+
/* * CCGSubSurf_opensubdiv_converter.c * */
struct OpenSubdiv_Converter;
diff --git a/source/blender/blenkernel/intern/CCGSubSurf_opensubdiv.c b/source/blender/blenkernel/intern/CCGSubSurf_opensubdiv.c
index 65053df..4688eee 100644
--- a/source/blender/blenkernel/intern/CCGSubSurf_opensubdiv.c
+++ b/source/blender/blenkernel/intern/CCGSubSurf_opensubdiv.c
@@ -133,6 +133,9 @@ static bool compare_osd_derivedmesh_topology(CCGSubSurf *ss, DerivedMesh *dm)
if (ss->osd_mesh == NULL && ss->osd_topology_refiner == NULL) {
return true;
}
+ /* TODO(sergey): De-duplicate with topology counter at the bottom of
+ * the file.
+ */
if (ss->osd_topology_refiner != NULL) {
topology_refiner = ss->osd_topology_refiner;
}
@@ -811,8 +814,7 @@ void ccgSubSurf_prepareTopologyRefiner(CCGSubSurf *ss, DerivedMesh *dm)
}
for (vert = 0; vert < num_verts; vert++) {
copy_v3_v3(ss->osd_coarse_coords[vert * 2 + 0], mvert[vert].co);
- /* TODO(sergey): Support proper normals here. */
- zero_v3(ss->osd_coarse_coords[vert * 2 + 1]);
+ normal_short_to_float_v3(ss->osd_coarse_coords[vert * 2 + 1], mvert[vert].no);
}
ss->osd_num_coarse_coords = num_verts;
ss->osd_coarse_coords_invalid = true;
@@ -848,6 +850,34 @@ void ccgSubSurf__sync_opensubdiv(CCGSubSurf *ss)
#endif
}
-#undef OSD_LOG
+static const OpenSubdiv_TopologyRefinerDescr* get_effective_refiner(
+ const CCGSubSurf *ss)
+{
+ if (ss->osd_topology_refiner) {
+ return ss->osd_topology_refiner;
+ }
+ return openSubdiv_getGLMeshTopologyRefiner(ss->osd_mesh);
+}
+
+int ccgSubSurf__getNumOsdBaseVerts(const CCGSubSurf *ss)
+{
+ const OpenSubdiv_TopologyRefinerDescr *topology_refiner =
+ get_effective_refiner(ss);
+ return openSubdiv_topologyRefinerGetNumVerts(topology_refiner);
+}
+
+int ccgSubSurf__getNumOsdBaseEdges(const CCGSubSurf *ss)
+{
+ const OpenSubdiv_TopologyRefinerDescr *topology_refiner =
+ get_effective_refiner(ss);
+ return openSubdiv_topologyRefinerGetNumEdges(topology_refiner);
+}
+
+int ccgSubSurf__getNumOsdBaseFaces(const CCGSubSurf *ss)
+{
+ const OpenSubdiv_TopologyRefinerDescr *topology_refiner =
+ get_effective_refiner(ss);
+ return openSubdiv_topologyRefinerGetNumFaces(topology_refiner);
+}
#endif /* WITH_OPENSUBDIV */
diff --git a/source/blender/blenkernel/intern/subsurf_ccg.c b/source/blender/blenkernel/intern/subsurf_ccg.c
index 1ca5792..0584549 100644
--- a/source/blender/blenkernel/intern/subsurf_ccg.c
+++ b/source/blender/blenkernel/intern/subsurf_ccg.c
@@ -1858,6 +1858,13 @@ static void ccgDM_drawLooseEdges(DerivedMesh *dm)
int totedge = ccgSubSurf_getNumEdges(ss);
int i, j, edgeSize = ccgSubSurf_getEdgeSize(ss);
+#ifdef WITH_OPENSUBDIV
+ if (ccgdm->useGpuBackend) {
+ /* TODO(sergey): Needs implementation. */
+ return;
+ }
+#endif
+
CCG_key_top_level(&key, ss);
for (j = 0; j < totedge; j++) {
@@ -2394,9 +2401,25 @@ static void ccgDM_drawFacesSolid(DerivedMesh *dm, float (*partial_redraw_planes)
#ifdef WITH_OPENSUBDIV
if (ccgdm->useGpuBackend) {
CCGSubSurf *ss = ccgdm->ss;
+ DMFlagMat *faceFlags = ccgdm->faceFlags;
+ int new_matnr;
+ bool draw_smooth;
if (UNLIKELY(ccgSubSurf_prepareGLMesh(ss, setMaterial != NULL) == false)) {
return;
}
+ /* TODO(sergey): Single matierial currently. */
+ if (faceFlags) {
+ draw_smooth = (faceFlags[0].flag & ME_SMOOTH);
+ new_matnr = (faceFlags[0].mat_nr + 1);
+ }
+ else {
+ draw_smooth = true;
+ new_matnr = 1;
+ }
+ if (setMaterial) {
+ setMaterial(new_matnr, NULL);
+ }
+ glShadeModel(draw_smooth ? GL_SMOOTH : GL_FLAT);
ccgSubSurf_drawGLMesh(ss, true, -1, -1);
return;
}
@@ -2436,11 +2459,22 @@ static void ccgDM_drawMappedFacesGLSL(DerivedMesh *dm,
#ifdef WITH_OPENSUBDIV
if (ccgdm->useGpuBackend) {
- int new_matnr = faceFlags[0].mat_nr + 1;
+ int new_matnr;
+ bool draw_smooth;
GPU_draw_update_fvar_offset(dm);
if (UNLIKELY(ccgSubSurf_prepareGLMesh(ss, false) == false)) {
return;
}
+ /* TODO(sergey): Single matierial currently. */
+ if (faceFlags) {
+ draw_smooth = (faceFlags[0].flag & ME_SMOOTH);
+ new_matnr = (faceFlags[0].mat_nr + 1);
+ }
+ else {
+ draw_smooth = true;
+ new_matnr = 1;
+ }
+ glShadeModel(draw_smooth ? GL_SMOOTH : GL_FLAT);
setMaterial(new_matnr, &gattribs);
ccgSubSurf_drawGLMesh(ss, true, -1, -1);
return;
@@ -3318,9 +3352,11 @@ static void ccgDM_release(DerivedMesh *dm)
if (ccgdm->pmap_mem) MEM_freeN(ccgdm->pmap_mem);
MEM_freeN(ccgdm->edgeFlags);
MEM_freeN(ccgdm->faceFlags);
- MEM_freeN(ccgdm->vertMap);
- MEM_freeN(ccgdm->edgeMap);
- MEM_freeN(ccgdm->faceMap);
+ if (ccgdm->useGpuBackend == false) {
+ MEM_freeN(ccgdm->vertMap);
+ MEM_freeN(ccgdm->edgeMap);
+ MEM_freeN(ccgdm->faceMap);
+ }
MEM_freeN(ccgdm);
}
}
@@ -4302,11 +4338,8 @@ static void set_ccgdm_gpu_geometry(CCGDerivedMesh *ccgdm,
DMFlagMat *faceFlags = ccgdm->faceFlags;
for (index = 0; index < totface; index++) {
- CCGFace *f = ccgdm->faceMap[index].face;
- int origIndex = GET_INT_FROM_POINTER(ccgSubSurf_getFaceFaceHandle(f));
-
- faceFlags->flag = mpoly ? mpoly[origIndex].flag : 0;
- faceFlags->mat_nr = mpoly ? mpoly[origIndex].mat_nr : 0;
+ faceFlags->flag = mpoly ? mpoly[index].flag : 0;
+ faceFlags->mat_nr = mpoly ? mpoly[index].mat_nr : 0;
faceFlags++;
}
@@ -4364,6 +4397,8 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss,
ccgdm->reverseFaceMap =
MEM_callocN(sizeof(int) * ccgSubSurf_getNumFinalFaces(ss),
"reverseFaceMap");
+
+ create_ccgdm_maps(ccgdm, ss);
}
else {
DM_from_template(&ccgdm->dm, dm, DM_TYPE_CCGDM,
@@ -4374,7 +4409,6 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss,
}
set_default_ccgdm_callbacks(ccgdm);
- create_ccgdm_maps(ccgdm, ss);
ccgdm->ss = ss;
ccgdm->drawInteriorEdges = drawInteriorEdges;
More information about the Bf-blender-cvs
mailing list