Revision: 17722 http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=17722 Author: campbellbarton Date: 2008-12-05 14:00:14 +0100 (Fri, 05 Dec 2008)
Log Message: ----------- Use MEM_*alloc for some of the main arrays rather then MemArena (was waisting too much memory) Modified Paths: -------------- branches/projection-paint/source/blender/src/imagepaint.c Modified: branches/projection-paint/source/blender/src/imagepaint.c =================================================================== --- branches/projection-paint/source/blender/src/imagepaint.c 2008-12-05 11:03:16 UTC (rev 17721) +++ branches/projection-paint/source/blender/src/imagepaint.c 2008-12-05 13:00:14 UTC (rev 17722) @@ -217,10 +217,9 @@ MTFace *dm_mtface_clone; /* other UV layer, use for cloning between layers */ /* projection painting only */ - MemArena *arena; /* use for alocating many pixel structs and link-lists */ - MemArena *arena_mt[BLENDER_MAX_THREADS]; /* Same as above but use for multithreading */ + MemArena *arena_mt[BLENDER_MAX_THREADS];/* for multithreading, the first item is sometimes used for non threaded cases too */ LinkNode **bucketRect; /* screen sized 2D array, each pixel has a linked list of ProjPixel's */ - LinkNode **bucketFaces; /* bucketRect alligned array linkList of faces overlapping each bucket */ + LinkNode **bucketFaces; /* bucketRect aligned array linkList of faces overlapping each bucket */ unsigned char *bucketFlags; /* store if the bucks have been initialized */ #ifndef PROJ_DEBUG_NOSEAMBLEED char *faceSeamFlags; /* store info about faces, if they are initialized etc*/ @@ -871,21 +870,30 @@ #define ISECT_TRUE_P2 3 static int line_isect_y(const float p1[2], const float p2[2], const float y_level, float *x_isect) { - if (y_level==p1[1]) { + float y_diff; + + if (y_level==p1[1]) { /* are we touching the first point? - no interpolation needed */ *x_isect = p1[0]; return ISECT_TRUE_P1; } - if (y_level==p2[1]) { + if (y_level==p2[1]) { /* are we touching the second point? - no interpolation needed */ *x_isect = p2[0]; return ISECT_TRUE_P2; } + y_diff= fabs(p1[1]-p2[1]); /* yuck, horizontal line, we cant do much here */ + + if (y_diff < 0.000001) { + *x_isect = (p1[0]+p2[0]) * 0.5f; + return ISECT_TRUE; + } + if (p1[1] > y_level && p2[1] < y_level) { - *x_isect = (p2[0]*(p1[1]-y_level) + p1[0]*(y_level-p2[1])) / (p1[1]-p2[1]); + *x_isect = (p2[0]*(p1[1]-y_level) + p1[0]*(y_level-p2[1])) / y_diff; /*(p1[1]-p2[1]);*/ return ISECT_TRUE; } else if (p1[1] < y_level && p2[1] > y_level) { - *x_isect = (p2[0]*(y_level-p1[1]) + p1[0]*(p2[1]-y_level)) / (p2[1]-p1[1]); + *x_isect = (p2[0]*(y_level-p1[1]) + p1[0]*(p2[1]-y_level)) / y_diff; /*(p2[1]-p1[1]);*/ return ISECT_TRUE; } else { @@ -895,21 +903,30 @@ static int line_isect_x(const float p1[2], const float p2[2], const float x_level, float *y_isect) { - if (x_level==p1[0]) { + float x_diff; + + if (x_level==p1[0]) { /* are we touching the first point? - no interpolation needed */ *y_isect = p1[1]; return ISECT_TRUE_P1; } - if (x_level==p2[0]) { + if (x_level==p2[0]) { /* are we touching the second point? - no interpolation needed */ *y_isect = p2[1]; return ISECT_TRUE_P2; } + x_diff= fabs(p1[0]-p2[0]); /* yuck, horizontal line, we cant do much here */ + + if (x_diff < 0.000001) { /* yuck, vertical line, we cant do much here */ + *y_isect = (p1[0]+p2[0]) * 0.5f; + return ISECT_TRUE; + } + if (p1[0] > x_level && p2[0] < x_level) { - *y_isect = (p2[1]*(p1[0]-x_level) + p1[1]*(x_level-p2[0])) / (p1[0]-p2[0]); + *y_isect = (p2[1]*(p1[0]-x_level) + p1[1]*(x_level-p2[0])) / x_diff; /*(p1[0]-p2[0]);*/ return ISECT_TRUE; } else if (p1[0] < x_level && p2[0] > x_level) { - *y_isect = (p2[1]*(x_level-p1[0]) + p1[1]*(p2[0]-x_level)) / (p2[0]-p1[0]); + *y_isect = (p2[1]*(x_level-p1[0]) + p1[1]*(p2[0]-x_level)) / x_diff; /*(p2[0]-p1[0]);*/ return ISECT_TRUE; } else { @@ -1811,7 +1828,36 @@ float uv[2]; float bucket_bounds_ss[4][2]; float w[3]; + +//#if 0 + rctf bucket_bounds_expand; + int use_expanded = 0; + bucket_bounds_expand.xmin = bucket_bounds->xmin; + bucket_bounds_expand.ymin = bucket_bounds->ymin; + bucket_bounds_expand.xmax = bucket_bounds->xmax; + bucket_bounds_expand.ymax = bucket_bounds->ymax; + + if (fabs(v1coSS[0]-bucket_bounds_expand.xmin) < 0.1f) {bucket_bounds_expand.xmin -= 0.1f; use_expanded = 1;} + if (fabs(v2coSS[0]-bucket_bounds_expand.xmin) < 0.1f) {bucket_bounds_expand.xmin -= 0.1f; use_expanded = 1;} + if (fabs(v3coSS[0]-bucket_bounds_expand.xmin) < 0.1f) {bucket_bounds_expand.xmin -= 0.1f; use_expanded = 1;} + + if (fabs(v1coSS[1]-bucket_bounds_expand.ymin) < 0.1f) {bucket_bounds_expand.ymin -= 0.1f; use_expanded = 1;} + if (fabs(v2coSS[1]-bucket_bounds_expand.ymin) < 0.1f) {bucket_bounds_expand.ymin -= 0.1f; use_expanded = 1;} + if (fabs(v3coSS[1]-bucket_bounds_expand.ymin) < 0.1f) {bucket_bounds_expand.ymin -= 0.1f; use_expanded = 1;} + + if (fabs(v1coSS[0]-bucket_bounds_expand.xmax) < 0.1f) {bucket_bounds_expand.xmax += 0.1f; use_expanded = 1;} + if (fabs(v2coSS[0]-bucket_bounds_expand.xmax) < 0.1f) {bucket_bounds_expand.xmax += 0.1f; use_expanded = 1;} + if (fabs(v3coSS[0]-bucket_bounds_expand.xmax) < 0.1f) {bucket_bounds_expand.xmax += 0.1f; use_expanded = 1;} + + if (fabs(v1coSS[1]-bucket_bounds_expand.ymax) < 0.1f) {bucket_bounds_expand.ymax += 0.1f; use_expanded = 1;} + if (fabs(v2coSS[1]-bucket_bounds_expand.ymax) < 0.1f) {bucket_bounds_expand.ymax += 0.1f; use_expanded = 1;} + if (fabs(v3coSS[1]-bucket_bounds_expand.ymax) < 0.1f) {bucket_bounds_expand.ymax += 0.1f; use_expanded = 1;} + if ( use_expanded ) { + bucket_bounds = &bucket_bounds_expand; + } +//#endif + /* get the UV space bounding box */ inside_bucket_flag |= BLI_in_rctf(bucket_bounds, v1coSS[0], v1coSS[1]); inside_bucket_flag |= BLI_in_rctf(bucket_bounds, v2coSS[0], v2coSS[1]) << 1; @@ -1950,7 +1996,7 @@ isectVAngles[i] = -atan2(vClipSS_A[0]*vClipSS_B[1] - vClipSS_A[1]*vClipSS_B[0], vClipSS_A[0]*vClipSS_B[0]+vClipSS_A[1]*vClipSS_B[1]); if (flip) isectVAngles[i] = -isectVAngles[i]; - } + } #endif /* end abuse */ #if 0 /* uses a few more cycles then the above loop */ @@ -2002,8 +2048,9 @@ { /* If there are ever any problems, */ float test_uv[4][2]; - if (is_ortho) rect_to_uvspace_ortho(bucket_bounds, v1coSS, v2coSS, v3coSS, uv1co, uv2co, uv3co, test_uv); - else rect_to_uvspace_persp(bucket_bounds, v1coSS, v2coSS, v3coSS, uv1co, uv2co, uv3co, test_uv); + int i; + if (is_ortho) rect_to_uvspace_ortho(bucket_bounds, v1coSS, v2coSS, v3coSS, uv1co, uv2co, uv3co, test_uv, flip); + else rect_to_uvspace_persp(bucket_bounds, v1coSS, v2coSS, v3coSS, uv1co, uv2co, uv3co, test_uv, flip); printf("( [(%f,%f), (%f,%f), (%f,%f), (%f,%f)], ", test_uv[0][0], test_uv[0][1], test_uv[1][0], test_uv[1][1], test_uv[2][0], test_uv[2][1], test_uv[3][0], test_uv[3][1]); printf(" [(%f,%f), (%f,%f), (%f,%f)], ", uv1co[0], uv1co[1], uv2co[0], uv2co[1], uv3co[0], uv3co[1]); @@ -2014,7 +2061,7 @@ } printf("]),\\\n"); } - +} /* # This script creates faces in a blender scene from printed data above. @@ -2060,6 +2107,7 @@ if __name__ == '__main__': main() */ + #endif #undef ISECT_1 @@ -2185,8 +2233,8 @@ uv1co, uv2co, uv3co, uv_clip, &uv_clip_tot ); - + /* sometimes this happens, better just allow for 8 intersectiosn even though there should be max 6 */ /* if (uv_clip_tot>6) { @@ -2241,10 +2289,12 @@ } } +#if 0 else if (has_x_isect) { /* assuming the face is not a bow-tie - we know we cant intersect again on the X */ break; } +#endif } @@ -2618,8 +2668,8 @@ float min[2], max[2], *vCoSS; int bucketMin[2], bucketMax[2]; /* for ps->bucketRect indexing */ int fidx, bucket_x, bucket_y, bucket_index; - int has_x_isect = -1, has_isect = 0; /* for early loop exit */ + MemArena *arena = ps->arena_mt[0]; /* just use the first thread arena since threading has not started yet */ INIT_MINMAX2(min, max); @@ -2641,7 +2691,7 @@ BLI_linklist_prepend_arena( &ps->bucketFaces[ bucket_index ], SET_INT_IN_POINTER(face_index), /* cast to a pointer to shut up the compiler */ - ps->arena + arena ); has_x_isect = has_isect = 1; @@ -2692,15 +2742,8 @@ int a, i; /* generic looping vars */ int image_index = -1, face_index; - /* memory sized to add to arena size */ - int tot_bucketRectMem=0; - int tot_faceSeamFlagsMem=0; - int tot_faceSeamUVMem=0; - int tot_bucketFacesMem=0; - int tot_bucketFlagsMem=0; - int tot_vertFacesMem=0; - int tot_vertFlagsMem=0; - + MemArena *arena; /* at the moment this is just ps->arena_mt[0], but use this to show were not multithreading */ + /* ---- end defines ---- */ /* paint onto the derived mesh @@ -2770,10 +2813,6 @@ /* calculate vert screen coords * run this early so we can calculate the x/y resolution of our bucket rect */ - - /* since we now run this before the memarena is allocated, this will need its own memory */ - /*ps->screenCoords = BLI_memarena_alloc(ps->arena, sizeof(float) * ps->dm_totvert * 4);*/ - INIT_MINMAX2(ps->screenMin, ps->screenMax); ps->screenCoords = MEM_mallocN(sizeof(float) * ps->dm_totvert * 4, "ProjectPaint ScreenVerts"); @@ -2847,58 +2886,18 @@ CLAMP(ps->buckets_x, PROJ_BUCKET_RECT_MIN, PROJ_BUCKET_RECT_MAX); CLAMP(ps->buckets_y, PROJ_BUCKET_RECT_MIN, PROJ_BUCKET_RECT_MAX); - tot_bucketRectMem = sizeof(LinkNode *) * ps->buckets_x * ps->buckets_y; - tot_bucketFacesMem = sizeof(LinkNode *) * ps->buckets_x * ps->buckets_y; + ps->bucketRect = (LinkNode **)MEM_callocN(sizeof(LinkNode *) * ps->buckets_x * ps->buckets_y, "paint-bucketRect"); + ps->bucketFaces= (LinkNode **)MEM_callocN(sizeof(LinkNode *) * ps->buckets_x * ps->buckets_y, "paint-bucketFaces"); - tot_bucketFlagsMem = sizeof(char) * ps->buckets_x * ps->buckets_y; + ps->bucketFlags= (unsigned char *)MEM_callocN(sizeof(char) * ps->buckets_x * ps->buckets_y, "paint-bucketFaces"); #ifndef PROJ_DEBUG_NOSEAMBLEED - if (ps->seam_bleed_px > 0.0f) { /* UV Seams for bleeding */ - tot_vertFacesMem = sizeof(LinkNode *) * ps->dm_totvert; - tot_faceSeamFlagsMem = sizeof(char) * ps->dm_totface; - tot_faceSeamUVMem = sizeof(float) * ps->dm_totface * 8; - } -#endif - - if (ps->do_backfacecull && ps->do_mask_normal) { - tot_vertFlagsMem = sizeof(char) * ps->dm_totvert; - } - - /* BLI_memarena_new uses calloc */ - ps->arena = - BLI_memarena_new( tot_bucketRectMem + - tot_bucketFacesMem + - tot_faceSeamFlagsMem + - tot_faceSeamUVMem + - tot_vertFacesMem + - tot_vertFlagsMem + (1<<16)); - @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org http://lists.blender.org/mailman/listinfo/bf-blender-cvs