[Bf-blender-cvs] [3a0c13b] opensubdiv-modifier: Corrected base vertices counting
Sergey Sharybin
noreply at git.blender.org
Fri May 2 11:11:05 CEST 2014
Commit: 3a0c13badf2893daf0055afadd9978cc89a6c44e
Author: Sergey Sharybin
Date: Fri May 2 04:44:46 2014 +0600
https://developer.blender.org/rB3a0c13badf2893daf0055afadd9978cc89a6c44e
Corrected base vertices counting
Since ptex faces change we don't need to tessellate non-quads
manually hence we shouldn't allocate extra vertices. It's all
up to OpenSubdiv now.
===================================================================
M source/blender/blenkernel/intern/CCGSubSurf.c
===================================================================
diff --git a/source/blender/blenkernel/intern/CCGSubSurf.c b/source/blender/blenkernel/intern/CCGSubSurf.c
index aefbf97..2239a94 100644
--- a/source/blender/blenkernel/intern/CCGSubSurf.c
+++ b/source/blender/blenkernel/intern/CCGSubSurf.c
@@ -2366,27 +2366,6 @@ static bool opensubdiv_initEvaluator(CCGSubSurf *ss)
return openSubdiv_finishEvaluatorDescr(ss->osd_evaluator, ss->subdivLevels) != 0;
}
-static int opensubdiv_countBaseVerts(CCGSubSurf *ss)
-{
- int i, num_basis_verts = ss->vMap->numEntries;
- /* For every NGon and triangle we add a vertex to the
- * face median point and subdivide each of face edges.
- *
- * TODO(sergey): re-use additional vertices when having
- * two adjacent tris or ngons.
- */
- for (i = 0; i < ss->fMap->curSize; i++) {
- CCGFace *face = (CCGFace *) ss->fMap->buckets[i];
- for (; face; face = face->next) {
- if (face->numVerts != 4) {
- num_basis_verts += 1 + face->numVerts;
- }
- }
- }
- return num_basis_verts;
-}
-
-
static bool opensubdiv_ensureEvaluator(CCGSubSurf *ss)
{
bool evaluator_needs_init = false;
@@ -2407,7 +2386,7 @@ static bool opensubdiv_ensureEvaluator(CCGSubSurf *ss)
ss->osd_evaluator = NULL;
}
if (ss->osd_evaluator == NULL) {
- int num_basis_verts = opensubdiv_countBaseVerts(ss);
+ int num_basis_verts = ss->vMap->numEntries;
OSD_LOG("Allocating new evaluator, %d verts\n", num_basis_verts);
ss->osd_evaluator =
openSubdiv_createEvaluatorDescr(num_basis_verts);
@@ -2425,11 +2404,7 @@ static void opensubdiv_updateCoarsePositions(CCGSubSurf *ss)
{
float (*positions)[3];
int vertDataSize = ss->meshIFC.vertDataSize;
- /* TODO(sergey): De-duplicate this call with evaluator init routines.
- * No actual need to re-calculate ngons/tris count here, we just need
- * to cache this value somewhere.
- */
- int num_basis_verts = opensubdiv_countBaseVerts(ss);
+ int num_basis_verts = ss->vMap->numEntries;
int i;
positions = MEM_mallocN(3 * sizeof(float) * num_basis_verts, "OpenSubdiv coarse points");
@@ -2444,43 +2419,6 @@ static void opensubdiv_updateCoarsePositions(CCGSubSurf *ss)
}
}
- /* Only iterate faces if we've got tris and/or ngons. */
- if (num_basis_verts != ss->vMap->numEntries) {
- int index = ss->vMap->numEntries;
- for (i = 0; i < ss->fMap->curSize; i++) {
- CCGFace *face = (CCGFace *) ss->fMap->buckets[i];
- for (; face; face = face->next) {
- if (face->numVerts != 4) {
- CCGVert **all_verts = FACE_getVerts(face);
- int S;
- /* Calculate median point of the face. */
- float median_acc[3] = {0.0f, 0.0f, 0.0f};
- for (S = 0; S < face->numVerts; S++) {
- add_v3_v3(median_acc, VERT_getCo(all_verts[S], 0));
- }
- mul_v3_v3fl(positions[index++], median_acc, 1.0f / (float) face->numVerts);
- OSD_LOG("Point %d (face median) has value %f %f %f\n",
- index - 1,
- positions[index - 1][0],
- positions[index - 1][1],
- positions[index - 1][2]);
- /* Calculate median points of all edges. */
- for (S = 0; S < face->numVerts; S++) {
- interp_v3_v3v3(positions[index++],
- positions[all_verts[S]->osd_index],
- positions[all_verts[(S + 1) % face->numVerts]->osd_index],
- 0.5f);
- OSD_LOG("Point %d (edge %d median) has value %f %f %f\n",
- index - 1, S,
- positions[index - 1][0],
- positions[index - 1][1],
- positions[index - 1][2]);
- }
- }
- }
- }
- }
-
openSubdiv_setEvaluatorCoarsePositions(ss->osd_evaluator,
(float *) positions,
num_basis_verts);
More information about the Bf-blender-cvs
mailing list