Commit: 1a0ef58bdf25008e0921f4b8debb762f564bebd8
Author: Nicholas Bishop
Date:   Mon Jan 26 17:01:25 2015 +0100
Branches: master
https://developer.blender.org/rB1a0ef58bdf25008e0921f4b8debb762f564bebd8

Code cleanup: break up project_paint_begin() into smaller functions

This initialization function was massive with lots of local variables,
quite hard to follow. Splitting up doesn't make it perfectly clear,
but a bit better.

The changes are mostly quite mechanical splitting apart code, plus a
few new temporary structs for passing data without too many confusing
args. No intentional changes to functionality.

Reviewed By: psy-fi

Differential Revision: https://developer.blender.org/D1035

===================================================================

M       source/blender/editors/sculpt_paint/paint_image_proj.c

===================================================================

diff --git a/source/blender/editors/sculpt_paint/paint_image_proj.c 
b/source/blender/editors/sculpt_paint/paint_image_proj.c
index fd1ca1b..1538e9e 100644
--- a/source/blender/editors/sculpt_paint/paint_image_proj.c
+++ b/source/blender/editors/sculpt_paint/paint_image_proj.c
@@ -3000,145 +3000,9 @@ static void 
project_paint_delayed_face_init(ProjPaintState *ps, const MFace *mf,
 #endif
 }
 
-/* run once per stroke before projection painting */
-static void project_paint_begin(ProjPaintState *ps)
+/* when using subsurf or multires, mface arrays are thrown away, we need to 
keep a copy */
+static void proj_paint_state_non_cddm_init(ProjPaintState *ps)
 {
-       /* Viewport vars */
-       float mat[3][3];
-
-       float no[3];
-
-       float *projScreenCo; /* Note, we could have 4D vectors are only needed 
for */
-       float projMargin;
-
-       /* Image Vars - keep track of images we have used */
-       LinkNode *image_LinkList = NULL;
-       LinkNode *node;
-
-       ProjPaintImage *projIma;
-       Image *tpage_last = NULL, *tpage;
-       TexPaintSlot *slot_last = NULL, *slot = NULL;
-       TexPaintSlot *slot_last_clone = NULL, *slot_clone;
-
-       /* Face vars */
-       MPoly *mpoly_orig;
-       MFace *mf;
-       MTFace **tf;
-       MTFace *tf_base;
-
-       MTFace **tf_clone;
-       MTFace *tf_clone_base = NULL;
-
-       int a, i; /* generic looping vars */
-       int image_index = -1, face_index;
-
-       /* double lookup */
-       const int *index_mf_to_mpoly = NULL;
-       const int *index_mp_to_orig  = NULL;
-
-       MVert *mv;
-
-       MemArena *arena; /* at the moment this is just ps->arena_mt[0], but use 
this to show were not multithreading */
-
-       const int diameter = 2 * BKE_brush_size_get(ps->scene, ps->brush);
-
-       bool reset_threads = false;
-
-       /* ---- end defines ---- */
-
-       if (ps->source == PROJ_SRC_VIEW)
-               ED_view3d_clipping_local(ps->rv3d, ps->ob->obmat);  /* faster 
clipping lookups */
-
-       ps->do_face_sel = ((((Mesh *)ps->ob->data)->editflag & 
ME_EDIT_PAINT_FACE_SEL) != 0);
-
-       /* paint onto the derived mesh */
-
-       /* Workaround for subsurf selection, try the display mesh first */
-       if (ps->source == PROJ_SRC_IMAGE_CAM) {
-               /* using render mesh, assume only camera was rendered from */
-               ps->dm = mesh_create_derived_render(ps->scene, ps->ob, 
ps->scene->customdata_mask | CD_MASK_MTFACE);
-               ps->dm_release = true;
-       }
-       else if (ps->ob->derivedFinal &&
-                CustomData_has_layer(&ps->ob->derivedFinal->faceData, 
CD_MTFACE) &&
-                (ps->do_face_sel == false || 
CustomData_has_layer(&ps->ob->derivedFinal->polyData, CD_ORIGINDEX)))
-       {
-               ps->dm = ps->ob->derivedFinal;
-               ps->dm_release = false;
-       }
-       else {
-               ps->dm = mesh_get_derived_final(
-                            ps->scene, ps->ob,
-                            ps->scene->customdata_mask | CD_MASK_MTFACE | 
(ps->do_face_sel ? CD_ORIGINDEX : 0));
-               ps->dm_release = true;
-       }
-
-       if (!CustomData_has_layer(&ps->dm->faceData, CD_MTFACE)) {
-
-               if (ps->dm_release)
-                       ps->dm->release(ps->dm);
-
-               ps->dm = NULL;
-               return;
-       }
-
-       DM_update_materials(ps->dm, ps->ob);
-
-       ps->dm_totvert = ps->dm->getNumVerts(ps->dm);
-       ps->dm_totface = ps->dm->getNumTessFaces(ps->dm);
-
-       ps->dm_mvert = ps->dm->getVertArray(ps->dm);
-       ps->dm_mface = ps->dm->getTessFaceArray(ps->dm);
-       ps->dm_mtface = MEM_mallocN(ps->dm_totface * sizeof(MTFace *), 
"proj_paint_mtfaces");
-
-       if (ps->do_face_sel) {
-               index_mf_to_mpoly = ps->dm->getTessFaceDataArray(ps->dm, 
CD_ORIGINDEX);
-               index_mp_to_orig  = ps->dm->getPolyDataArray(ps->dm, 
CD_ORIGINDEX);
-               if (index_mf_to_mpoly == NULL) {
-                       index_mp_to_orig = NULL;
-               }
-               else {
-                       mpoly_orig = ((Mesh *)ps->ob->data)->mpoly;
-               }
-       }
-       else {
-               mpoly_orig = NULL;
-       }
-
-       /* use clone mtface? */
-       if (ps->do_layer_clone) {
-               ps->dm_mtface_clone = MEM_mallocN(ps->dm_totface * 
sizeof(MTFace *), "proj_paint_mtfaces");
-       }
-
-       if (ps->do_layer_stencil || ps->do_stencil_brush) {
-               //int layer_num = 
CustomData_get_stencil_layer(&ps->dm->faceData, CD_MTFACE);
-               int layer_num = CustomData_get_stencil_layer(&((Mesh 
*)ps->ob->data)->pdata, CD_MTEXPOLY);
-               if (layer_num != -1)
-                       ps->dm_mtface_stencil = 
CustomData_get_layer_n(&ps->dm->faceData, CD_MTFACE, layer_num);
-
-               if (ps->dm_mtface_stencil == NULL) {
-                       /* get active instead */
-                       ps->dm_mtface_stencil = 
CustomData_get_layer(&ps->dm->faceData, CD_MTFACE);
-               }
-
-               if (ps->do_stencil_brush)
-                       tf_base = ps->dm_mtface_stencil;
-       }
-       
-       if (ps->do_layer_clone) {
-               int layer_num = CustomData_get_clone_layer(&((Mesh 
*)ps->ob->data)->pdata, CD_MTEXPOLY);
-
-               if (layer_num != -1)
-                       tf_clone_base = 
CustomData_get_layer_n(&ps->dm->faceData, CD_MTFACE, layer_num);
-
-               if (tf_clone_base == NULL) {
-                       /* get active instead */
-                       tf_clone_base = CustomData_get_layer(&ps->dm->faceData, 
CD_MTFACE);
-               }
-               
-       }
-
-       /* when using subsurf or multires, mface arrays are thrown away, we 
need to keep a copy */
        if (ps->dm->type != DM_TYPE_CDDM) {
                ps->dm_mvert = MEM_dupallocN(ps->dm_mvert);
                ps->dm_mface = MEM_dupallocN(ps->dm_mface);
@@ -3149,97 +3013,105 @@ static void project_paint_begin(ProjPaintState *ps)
                ps->dm_mtface_stencil = MEM_dupallocN(ps->dm_mtface_stencil);
 #endif
        }
+}
+
+static void proj_paint_state_viewport_init(ProjPaintState *ps)
+{
+       float mat[3][3];
+       float viewmat[4][4];
+       float viewinv[4][4];
 
        ps->viewDir[0] = 0.0f;
        ps->viewDir[1] = 0.0f;
        ps->viewDir[2] = 1.0f;
 
-       {
-               float viewmat[4][4];
-               float viewinv[4][4];
+       invert_m4_m4(ps->ob->imat, ps->ob->obmat);
 
-               invert_m4_m4(ps->ob->imat, ps->ob->obmat);
+       if (ELEM(ps->source, PROJ_SRC_VIEW, PROJ_SRC_VIEW_FILL)) {
+               /* normal drawing */
+               ps->winx = ps->ar->winx;
+               ps->winy = ps->ar->winy;
 
-               if (ELEM(ps->source, PROJ_SRC_VIEW, PROJ_SRC_VIEW_FILL)) {
-                       /* normal drawing */
-                       ps->winx = ps->ar->winx;
-                       ps->winy = ps->ar->winy;
+               copy_m4_m4(viewmat, ps->rv3d->viewmat);
+               copy_m4_m4(viewinv, ps->rv3d->viewinv);
 
-                       copy_m4_m4(viewmat, ps->rv3d->viewmat);
-                       copy_m4_m4(viewinv, ps->rv3d->viewinv);
+               ED_view3d_ob_project_mat_get(ps->rv3d, ps->ob, ps->projectMat);
 
-                       ED_view3d_ob_project_mat_get(ps->rv3d, ps->ob, 
ps->projectMat);
+               ps->is_ortho = ED_view3d_clip_range_get(ps->v3d, ps->rv3d, 
&ps->clipsta, &ps->clipend, true);
+       }
+       else {
+               /* re-projection */
+               float winmat[4][4];
+               float vmat[4][4];
 
-                       ps->is_ortho = ED_view3d_clip_range_get(ps->v3d, 
ps->rv3d, &ps->clipsta, &ps->clipend, true);
-               }
-               else {
-                       /* re-projection */
-                       float winmat[4][4];
-                       float vmat[4][4];
+               ps->winx = ps->reproject_ibuf->x;
+               ps->winy = ps->reproject_ibuf->y;
 
-                       ps->winx = ps->reproject_ibuf->x;
-                       ps->winy = ps->reproject_ibuf->y;
+               if (ps->source == PROJ_SRC_IMAGE_VIEW) {
+                       /* image stores camera data, tricky */
+                       IDProperty *idgroup = 
IDP_GetProperties(&ps->reproject_image->id, 0);
+                       IDProperty *view_data = 
IDP_GetPropertyFromGroup(idgroup, PROJ_VIEW_DATA_ID);
 
-                       if (ps->source == PROJ_SRC_IMAGE_VIEW) {
-                               /* image stores camera data, tricky */
-                               IDProperty *idgroup = 
IDP_GetProperties(&ps->reproject_image->id, 0);
-                               IDProperty *view_data = 
IDP_GetPropertyFromGroup(idgroup, PROJ_VIEW_DATA_ID);
+                       const float *array = (float *)IDP_Array(view_data);
 
-                               const float *array = (float 
*)IDP_Array(view_data);
+                       /* use image array, written when creating image */
+                       memcpy(winmat, array, sizeof(winmat)); array += 
sizeof(winmat) / sizeof(float);
+                       memcpy(viewmat, array, sizeof(viewmat)); array += 
sizeof(viewmat) / sizeof(float);
+                       ps->clipsta = array[0];
+                       ps->clipend = array[1];
+                       ps->is_ortho = array[2] ? 1 : 0;
 
-                               /* use image array, written when creating image 
*/
-                               memcpy(winmat, array, sizeof(winmat)); array += 
sizeof(winmat) / sizeof(float);
-                               memcpy(viewmat, array, sizeof(viewmat)); array 
+= sizeof(viewmat) / sizeof(float);
-                               ps->clipsta = array[0];
-                               ps->clipend = array[1];
-                               ps->is_ortho = array[2] ? 1 : 0;
+                       invert_m4_m4(viewinv, viewmat);
+               }
+               else if (ps->source == PROJ_SRC_IMAGE_CAM) {
+                       Object *cam_ob = ps->scene->camera;
+                       CameraParams params;
 
-                               invert_m4_m4(viewinv, viewmat);
-                       }
-                       else if (ps->source == PROJ_SRC_IMAGE_CAM) {
-                               Object *cam_ob = ps->scene->camera;
-                               CameraParams params;
-
-                               /* viewmat & viewinv */
-                               copy_m4_m4(viewinv, cam_ob->obmat);
-                               normalize_m4(viewinv);
-                               invert_m4_m4(viewmat, viewinv);
-
-                               /* window matrix, clipping and ortho */
-                               BKE_camera_params_init(&params);
-                               BKE_camera_params_from_object(&params, cam_ob);
-                               BKE_camera_params_compute_viewplane(&params, 
ps->winx, ps->winy, 1.0f, 1.0f);
-                               BKE_camera_params_compute_matrix(&params);
-
-                               copy_m4_m4(winmat, params.winmat);
-                               ps->clipsta = params.clipsta;
-                               ps->clipend = params.clipend;
-                               ps->is_ortho = params.is_ortho;
-                       }
+                       /* viewmat & viewinv */
+                       copy_m4_m4(viewinv, cam_ob->obmat);
+                       normalize_m4(viewinv);
+                       invert_m4_m4(viewmat, viewinv);
+
+                       /* window matrix, clipping and ortho */
+                       BKE_camera_params_init(&params);
+                       BKE_camera_params_from_object(&params, cam_ob);
+                       BKE_camera_params_compute_viewplane(&params, ps->winx, 
ps->winy, 1.0f, 1.0f);
+                       BKE_camera_params_compute_matrix(&params);
 
-                       /* same as #ED_view3d_ob_project_mat_get */
-                       mul_m4_m4m4(vmat, viewmat, ps->ob->obmat);
-                       mul_m4_m4m4(ps->projectMat, winmat, vmat);
+                       copy_m4_m4(winmat, params.winmat);
+                       ps->clipsta = params.clipsta;
+                       ps->clipend = params.clipend;
+                       ps->is_ortho = params.is_ortho;
                }
 
+               /* same as #ED_view3d_ob_project_mat_get */
+               mul_m4_m4m4(vmat, viewmat, ps->ob->obmat);
+               mul_m4_m4m4(ps->projectMat, winmat, vmat);
+       }
+
 
-               /* viewDir - object relative */
-               invert_m4_m4(ps->ob->imat, ps->ob->obmat);
-               copy_m3_m4(mat, viewinv);
-               mul_m3_v3(mat, ps->viewDir);
-               copy_m3_m4(mat, ps->ob->imat);
-               mul_m3_v3(mat, ps->viewDir);
-               normalize_v3(ps->viewDir);
+       /* viewDir - object relative */
+       invert_m4_m4(ps->ob->imat, ps->ob->obmat);
+       copy_m3_m4(mat, viewinv);
+       mul_m3_v3(mat, ps->viewDir);
+       copy_m3_m4(mat, ps->ob->imat);
+       mul_m3_v3(mat, ps->viewDir);
+       normalize_v3(ps->viewDir);
 
-               /* viewPos - object relative */
-               copy_v3_v3(ps->viewPos, viewinv[3]);
-               copy_m3_m4(mat, ps->ob->imat);
-               mul_m3_v3(mat, ps->viewPos);
-               add_v3_v3(ps->viewPos, ps->ob->imat[3]);
-       }
+       /* viewPos - object relative */
+       copy_v3_v3(ps->viewPos, viewin

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to