GPencil: Invert Paste operator and make Paste to Active default
authorAntonio Vazquez <blendergit@gmail.com>
Mon, 26 Aug 2019 13:46:00 +0000 (15:46 +0200)
committerAntonio Vazquez <blendergit@gmail.com>
Mon, 26 Aug 2019 13:49:16 +0000 (15:49 +0200)
Before there were two options: Paste to original layer called "Paste" and Paste to active   layer called "Paste & Merge"

Now, by default the paste is in active layer and the "Paste & Merge" has been renamed "Paste".

For old "Paste", now is called "Paste by Layer" and it's not the default value anymore.

Note: Minor edits to add icons not present in Differential revision.

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

intern/cycles/device/device_cpu.cpp
intern/cycles/kernel/closure/bsdf_microfacet.h
intern/cycles/kernel/closure/bsdf_microfacet_multi.h
intern/cycles/kernel/svm/svm_color_util.h
intern/cycles/kernel/svm/svm_noise.h
release/scripts/startup/bl_ui/properties_grease_pencil_common.py
release/scripts/startup/bl_ui/space_view3d.py
source/blender/blenloader/intern/readfile.c
source/blender/draw/intern/draw_cache_impl_mesh.c
source/blender/editors/gpencil/gpencil_edit.c
source/blender/windowmanager/intern/wm_files.c

index c2843a61e6d6e874eb5b91f07e87700586af4428..b2d923dfdf005cbb487797714d7078b07c3abf4f 100644 (file)
@@ -114,12 +114,6 @@ template<typename F> class KernelFunctions {
       architecture_name = "SSE2";
       kernel = kernel_sse2;
     }
-#else
-    {
-      /* Dummy to prevent the architecture if below become
-       * conditional when WITH_CYCLES_OPTIMIZED_KERNEL_SSE2
-       * is not defined. */
-    }
 #endif
 
     if (strcmp(architecture_name, logged_architecture) != 0) {
index 2f73434706cd95f64861c6b7252efa5079286b39..7d7ccfa777400eebd3b59a454250c8c275d2bb91 100644 (file)
@@ -303,7 +303,9 @@ ccl_device int bsdf_microfacet_ggx_setup(MicrofacetBsdf *bsdf)
 
 ccl_device int bsdf_microfacet_ggx_fresnel_setup(MicrofacetBsdf *bsdf, const ShaderData *sd)
 {
-  bsdf->extra->cspec0 = saturate3(bsdf->extra->cspec0);
+  bsdf->extra->cspec0.x = saturate(bsdf->extra->cspec0.x);
+  bsdf->extra->cspec0.y = saturate(bsdf->extra->cspec0.y);
+  bsdf->extra->cspec0.z = saturate(bsdf->extra->cspec0.z);
 
   float F0 = fresnel_dielectric_cos(1.0f, bsdf->ior);
   float F = average(interpolate_fresnel_color(sd->I, bsdf->N, bsdf->ior, F0, bsdf->extra->cspec0));
@@ -319,7 +321,9 @@ ccl_device int bsdf_microfacet_ggx_fresnel_setup(MicrofacetBsdf *bsdf, const Sha
 
 ccl_device int bsdf_microfacet_ggx_clearcoat_setup(MicrofacetBsdf *bsdf, const ShaderData *sd)
 {
-  bsdf->extra->cspec0 = saturate3(bsdf->extra->cspec0);
+  bsdf->extra->cspec0.x = saturate(bsdf->extra->cspec0.x);
+  bsdf->extra->cspec0.y = saturate(bsdf->extra->cspec0.y);
+  bsdf->extra->cspec0.z = saturate(bsdf->extra->cspec0.z);
 
   float F0 = fresnel_dielectric_cos(1.0f, bsdf->ior);
   float F = average(interpolate_fresnel_color(sd->I, bsdf->N, bsdf->ior, F0, bsdf->extra->cspec0));
@@ -362,7 +366,9 @@ ccl_device int bsdf_microfacet_ggx_aniso_setup(MicrofacetBsdf *bsdf)
 
 ccl_device int bsdf_microfacet_ggx_aniso_fresnel_setup(MicrofacetBsdf *bsdf, const ShaderData *sd)
 {
-  bsdf->extra->cspec0 = saturate3(bsdf->extra->cspec0);
+  bsdf->extra->cspec0.x = saturate(bsdf->extra->cspec0.x);
+  bsdf->extra->cspec0.y = saturate(bsdf->extra->cspec0.y);
+  bsdf->extra->cspec0.z = saturate(bsdf->extra->cspec0.z);
 
   float F0 = fresnel_dielectric_cos(1.0f, bsdf->ior);
   float F = average(interpolate_fresnel_color(sd->I, bsdf->N, bsdf->ior, F0, bsdf->extra->cspec0));
index 9780dd8741591d94055943b5b35d2dff5e232a88..07be33ee6b591b658a8019179614fb2e2c951969 100644 (file)
@@ -378,8 +378,12 @@ ccl_device int bsdf_microfacet_multi_ggx_common_setup(MicrofacetBsdf *bsdf)
 {
   bsdf->alpha_x = clamp(bsdf->alpha_x, 1e-4f, 1.0f);
   bsdf->alpha_y = clamp(bsdf->alpha_y, 1e-4f, 1.0f);
-  bsdf->extra->color = saturate3(bsdf->extra->color);
-  bsdf->extra->cspec0 = saturate3(bsdf->extra->cspec0);
+  bsdf->extra->color.x = saturate(bsdf->extra->color.x);
+  bsdf->extra->color.y = saturate(bsdf->extra->color.y);
+  bsdf->extra->color.z = saturate(bsdf->extra->color.z);
+  bsdf->extra->cspec0.x = saturate(bsdf->extra->cspec0.x);
+  bsdf->extra->cspec0.y = saturate(bsdf->extra->cspec0.y);
+  bsdf->extra->cspec0.z = saturate(bsdf->extra->cspec0.z);
 
   return SD_BSDF | SD_BSDF_HAS_EVAL | SD_BSDF_NEEDS_LCG;
 }
@@ -564,7 +568,9 @@ ccl_device int bsdf_microfacet_multi_ggx_glass_setup(MicrofacetBsdf *bsdf)
   bsdf->alpha_x = clamp(bsdf->alpha_x, 1e-4f, 1.0f);
   bsdf->alpha_y = bsdf->alpha_x;
   bsdf->ior = max(0.0f, bsdf->ior);
-  bsdf->extra->color = saturate3(bsdf->extra->color);
+  bsdf->extra->color.x = saturate(bsdf->extra->color.x);
+  bsdf->extra->color.y = saturate(bsdf->extra->color.y);
+  bsdf->extra->color.z = saturate(bsdf->extra->color.z);
 
   bsdf->type = CLOSURE_BSDF_MICROFACET_MULTI_GGX_GLASS_ID;
 
@@ -577,8 +583,12 @@ ccl_device int bsdf_microfacet_multi_ggx_glass_fresnel_setup(MicrofacetBsdf *bsd
   bsdf->alpha_x = clamp(bsdf->alpha_x, 1e-4f, 1.0f);
   bsdf->alpha_y = bsdf->alpha_x;
   bsdf->ior = max(0.0f, bsdf->ior);
-  bsdf->extra->color = saturate3(bsdf->extra->color);
-  bsdf->extra->cspec0 = saturate3(bsdf->extra->cspec0);
+  bsdf->extra->color.x = saturate(bsdf->extra->color.x);
+  bsdf->extra->color.y = saturate(bsdf->extra->color.y);
+  bsdf->extra->color.z = saturate(bsdf->extra->color.z);
+  bsdf->extra->cspec0.x = saturate(bsdf->extra->cspec0.x);
+  bsdf->extra->cspec0.y = saturate(bsdf->extra->cspec0.y);
+  bsdf->extra->cspec0.z = saturate(bsdf->extra->cspec0.z);
 
   bsdf->type = CLOSURE_BSDF_MICROFACET_MULTI_GGX_GLASS_FRESNEL_ID;
 
index 0f571eb7253c6f7fc92190d69f3def895b715c4b..3a6a5ba782f551e41dc43f44d7bf8862acb26518 100644 (file)
@@ -255,7 +255,13 @@ ccl_device float3 svm_mix_linear(float t, float3 col1, float3 col2)
 
 ccl_device float3 svm_mix_clamp(float3 col)
 {
-  return saturate3(col);
+  float3 outcol = col;
+
+  outcol.x = saturate(col.x);
+  outcol.y = saturate(col.y);
+  outcol.z = saturate(col.z);
+
+  return outcol;
 }
 
 ccl_device_noinline_cpu float3 svm_mix(NodeMix type, float fac, float3 c1, float3 c2)
index e03ffa2bc9d72ba4f25f075a096fc8c7e8db68af..dd375af27e58a19166e60c88ee0d3166f26e969e 100644 (file)
@@ -181,9 +181,9 @@ ccl_device_inline ssef scale3_sse(const ssef &result)
 }
 #endif
 
+#ifndef __KERNEL_SSE2__
 ccl_device_noinline_cpu float perlin(float x, float y, float z)
 {
-#ifndef __KERNEL_SSE2__
   int X;
   float fx = floorfrac(x, &X);
   int Y;
@@ -217,7 +217,10 @@ ccl_device_noinline_cpu float perlin(float x, float y, float z)
 
   /* can happen for big coordinates, things even out to 0.0 then anyway */
   return (isfinite(r)) ? r : 0.0f;
+}
 #else
+ccl_device_noinline float perlin(float x, float y, float z)
+{
   ssef xyz = ssef(x, y, z, 0.0f);
   ssei XYZ;
 
@@ -255,8 +258,8 @@ ccl_device_noinline_cpu float perlin(float x, float y, float z)
   ssef rinfmask = ((r & infmask) == infmask).m128;  // 0xffffffff if r is inf/-inf/nan else 0
   ssef rfinite = andnot(rinfmask, r);               // 0 if r is inf/-inf/nan else r
   return extract<0>(rfinite);
-#endif
 }
+#endif
 
 /* perlin noise in range 0..1 */
 ccl_device float noise(float3 p)
index 6f089f93f0003202229fcd66d04b801574cb8b7c..46e969b39595c267a3a3a8c31fc1ae50258891c7 100644 (file)
@@ -169,8 +169,8 @@ class GreasePencilStrokeEditPanel:
         layout.label(text="Edit:")
         row = layout.row(align=True)
         row.operator("gpencil.copy", text="Copy")
-        row.operator("gpencil.paste", text="Paste").type = 'COPY'
-        row.operator("gpencil.paste", text="Paste & Merge").type = 'MERGE'
+        row.operator("gpencil.paste", text="Paste").type = 'ACTIVE'
+        row.operator("gpencil.paste", text="Paste by Layer").type = 'LAYER'
 
         col = layout.column(align=True)
         col.operator("gpencil.delete")
@@ -507,8 +507,9 @@ class GPENCIL_MT_pie_tools_more(Menu):
         # gpd = context.gpencil_data
 
         col = pie.column(align=True)
-        col.operator("gpencil.copy", icon='COPYDOWN', text="Copy")
-        col.operator("gpencil.paste", icon='PASTEDOWN', text="Paste")
+        col.operator("gpencil.copy", text="Copy", icon='COPYDOWN')
+        col.operator("gpencil.paste", text="Paste", icon='PASTEDOWN').type = 'ACTIVE'
+        col.operator("gpencil.paste", text="Paste by Layer").type = 'LAYER'
 
         col = pie.column(align=True)
         col.operator("gpencil.select_more", icon='ADD')
index b684e4aa2dd2f6ac6abf8ee5544c27265914cd78..22c1a74b7e460fdf87414f2b48fdff8b630ae929 100644 (file)
@@ -4460,8 +4460,8 @@ class VIEW3D_MT_edit_gpencil(Menu):
         layout.operator("gpencil.duplicate_move", text="Duplicate")
         layout.operator("gpencil.stroke_split", text="Split")
         layout.operator("gpencil.copy", text="Copy", icon='COPYDOWN')
-        layout.operator("gpencil.paste", text="Paste", icon='PASTEDOWN').type = 'COPY'
-        layout.operator("gpencil.paste", text="Paste & Merge").type = 'MERGE'
+        layout.operator("gpencil.paste", text="Paste", icon='PASTEDOWN').type = 'ACTIVE'
+        layout.operator("gpencil.paste", text="Paste by Layer").type = 'LAYER'
 
         layout.separator()
 
@@ -6306,8 +6306,8 @@ class VIEW3D_MT_gpencil_edit_context_menu(Menu):
 
         layout.operator("gpencil.duplicate_move", text="Duplicate")
         layout.operator("gpencil.copy", text="Copy", icon='COPYDOWN')
-        layout.operator("gpencil.paste", text="Paste", icon='PASTEDOWN').type = 'COPY'
-        layout.operator("gpencil.paste", text="Paste & Merge").type = 'MERGE'
+        layout.operator("gpencil.paste", text="Paste", icon='PASTEDOWN').type = 'ACTIVE'
+        layout.operator("gpencil.paste", text="Paste by Layer").type = 'LAYER'
         layout.menu("VIEW3D_MT_gpencil_copy_layer")
         layout.operator("gpencil.frame_duplicate", text="Duplicate Active Frame")
         layout.operator("gpencil.frame_duplicate", text="Duplicate Active Frame All Layers").mode = 'ALL'
index 140e67c86c9e2cce4922292e95b7f1db417c0def..2a036d7f4ea631907bb195108b7ca52b406b4085 100644 (file)
@@ -7859,45 +7859,6 @@ static void lib_link_clipboard_restore(struct IDNameLib_Map *id_map)
   BKE_sequencer_base_recursive_apply(&seqbase_clipboard, lib_link_seq_clipboard_cb, id_map);
 }
 
-static int lib_link_main_data_restore_cb(void *user_data,
-                                         ID *UNUSED(id_self),
-                                         ID **id_pointer,
-                                         int cb_flag)
-{
-  if (cb_flag & IDWALK_CB_PRIVATE || *id_pointer == NULL) {
-    return IDWALK_RET_NOP;
-  }
-
-  /* Special ugly case here, thanks again for those non-IDs IDs... */
-  /* We probably need to add more cases here (hint: nodetrees),
-   * but will wait for changes from D5559 to get in first. */
-  if (GS((*id_pointer)->name) == ID_GR) {
-    Collection *collection = (Collection *)*id_pointer;
-    if (collection->flag & COLLECTION_IS_MASTER) {
-      return IDWALK_RET_NOP;
-    }
-  }
-
-  struct IDNameLib_Map *id_map = user_data;
-
-  /* Note: Handling of usercount here is really bad, defining its own system...
-   * Will have to be refactored at some point, but that is not top priority task for now.
-   * And all usercounts are properly recomputed at the end of the undo management code anyway. */
-  *id_pointer = restore_pointer_by_name(
-      id_map, *id_pointer, (cb_flag & IDWALK_CB_USER_ONE) ? USER_REAL : USER_IGNORE);
-
-  return IDWALK_RET_NOP;
-}
-
-static void lib_link_main_data_restore(struct IDNameLib_Map *id_map, Main *newmain)
-{
-  ID *id;
-  FOREACH_MAIN_ID_BEGIN (newmain, id) {
-    BKE_library_foreach_ID_link(newmain, id, lib_link_main_data_restore_cb, id_map, IDWALK_NOP);
-  }
-  FOREACH_MAIN_ID_END;
-}
-
 static void lib_link_window_scene_data_restore(wmWindow *win, Scene *scene, ViewLayer *view_layer)
 {
   bScreen *screen = BKE_workspace_active_screen_get(win->workspace_hook);
@@ -8217,24 +8178,11 @@ void blo_lib_link_restore(Main *oldmain,
     /* keep cursor location through undo */
     memcpy(&win->scene->cursor, &oldscene->cursor, sizeof(win->scene->cursor));
 
-    /* Note: even though that function seems to redo part of what is done by
-     * `lib_link_workspace_layout_restore()` above, it seems to have a slightly different scope:
-     * while the former updates the whole UI pointers from Main db (going over all layouts of
-     * all workspaces), that one only focuses one current active screen, takes care of
-     * potential local view, and needs window's scene pointer to be final... */
     lib_link_window_scene_data_restore(win, win->scene, cur_view_layer);
 
     BLI_assert(win->screen == NULL);
   }
 
-  /* Restore all ID pointers in Main database itself
-   * (especially IDProperties might point to some worspace of other 'weirdly unchanged' ID
-   * pointers, see T69146).
-   * Note that this will re;ap again a few pointers in workspaces or so,
-   * but since we are remapping final ones already set above,
-   * that is just some minor harmless double-processing. */
-  lib_link_main_data_restore(id_map, newmain);
-
   /* update IDs stored in all possible clipboards */
   lib_link_clipboard_restore(id_map);
 
index 336f0a7528a5e15c580b98c57c03103a8afc49fb..884d39343c61e488ef564e6842b39f12e4323039 100644 (file)
@@ -999,26 +999,6 @@ void DRW_mesh_batch_cache_create_requested(
     }
   }
 
-  /* HACK: if MBC_SURF_PER_MAT is requested and ibo.tris is already available, it won't have it's
-   * index ranges initialized. So discard ibo.tris in order to recreate it.
-   * This needs to happen before saved_elem_ranges is populated. */
-  if ((batch_requested & MBC_SURF_PER_MAT) != 0 && (cache->batch_ready & MBC_SURF_PER_MAT) == 0) {
-    FOREACH_MESH_BUFFER_CACHE(cache, mbuffercache)
-    {
-      GPU_INDEXBUF_DISCARD_SAFE(mbuffercache->ibo.tris);
-    }
-    /* Clear all batches that reference ibo.tris. */
-    GPU_BATCH_CLEAR_SAFE(cache->batch.surface);
-    GPU_BATCH_CLEAR_SAFE(cache->batch.surface_weights);
-    GPU_BATCH_CLEAR_SAFE(cache->batch.edit_mesh_analysis);
-    GPU_BATCH_CLEAR_SAFE(cache->batch.edit_triangles);
-    GPU_BATCH_CLEAR_SAFE(cache->batch.edit_lnor);
-    GPU_BATCH_CLEAR_SAFE(cache->batch.edit_selection_faces);
-
-    cache->batch_ready &= ~(MBC_SURFACE | MBC_SURFACE_WEIGHTS | MBC_EDIT_MESH_ANALYSIS |
-                            MBC_EDIT_TRIANGLES | MBC_EDIT_LNOR | MBC_EDIT_SELECTION_FACES);
-  }
-
   if (batch_requested &
       (MBC_SURFACE | MBC_SURF_PER_MAT | MBC_WIRE_LOOPS_UVS | MBC_EDITUV_FACES_STRECH_AREA |
        MBC_EDITUV_FACES_STRECH_ANGLE | MBC_EDITUV_FACES | MBC_EDITUV_EDGES | MBC_EDITUV_VERTS)) {
index 9fd1d031bb1d65fd4452284f8819dc17894f9a8b..50ee006672900b0e6c5066c639227b448b2d0e70 100644 (file)
@@ -1241,8 +1241,8 @@ static bool gp_strokes_paste_poll(bContext *C)
 }
 
 typedef enum eGP_PasteMode {
-  GP_COPY_ONLY = -1,
-  GP_COPY_MERGE = 1,
+  GP_COPY_BY_LAYER = -1,
+  GP_COPY_TO_ACTIVE = 1,
 } eGP_PasteMode;
 
 static int gp_strokes_paste_exec(bContext *C, wmOperator *op)
@@ -1275,7 +1275,7 @@ static int gp_strokes_paste_exec(bContext *C, wmOperator *op)
     /* no active layer - let's just create one */
     gpl = BKE_gpencil_layer_addnew(gpd, DATA_("GP_Layer"), true);
   }
-  else if ((gpencil_layer_is_editable(gpl) == false) && (type == GP_COPY_MERGE)) {
+  else if ((gpencil_layer_is_editable(gpl) == false) && (type == GP_COPY_TO_ACTIVE)) {
     BKE_report(
         op->reports, RPT_ERROR, "Can not paste strokes when active layer is hidden or locked");
     return OPERATOR_CANCELLED;
@@ -1328,7 +1328,7 @@ static int gp_strokes_paste_exec(bContext *C, wmOperator *op)
   for (bGPDstroke *gps = gp_strokes_copypastebuf.first; gps; gps = gps->next) {
     if (ED_gpencil_stroke_can_use(C, gps)) {
       /* Need to verify if layer exists */
-      if (type != GP_COPY_MERGE) {
+      if (type != GP_COPY_TO_ACTIVE) {
         gpl = BLI_findstring(&gpd->layers, gps->runtime.tmp_layerinfo, offsetof(bGPDlayer, info));
         if (gpl == NULL) {
           /* no layer - use active (only if layer deleted before paste) */
@@ -1379,15 +1379,15 @@ static int gp_strokes_paste_exec(bContext *C, wmOperator *op)
 void GPENCIL_OT_paste(wmOperatorType *ot)
 {
   static const EnumPropertyItem copy_type[] = {
-      {GP_COPY_ONLY, "COPY", 0, "Copy", ""},
-      {GP_COPY_MERGE, "MERGE", 0, "Merge", ""},
+      {GP_COPY_TO_ACTIVE, "ACTIVE", 0, "Paste to Active", ""},
+      {GP_COPY_BY_LAYER, "LAYER", 0, "Paste by Layer", ""},
       {0, NULL, 0, NULL, NULL},
   };
 
   /* identifiers */
   ot->name = "Paste Strokes";
   ot->idname = "GPENCIL_OT_paste";
-  ot->description = "Paste previously copied strokes or copy and merge in active layer";
+  ot->description = "Paste previously copied strokes to active layer or to original layer";
 
   /* callbacks */
   ot->exec = gp_strokes_paste_exec;
@@ -1397,7 +1397,7 @@ void GPENCIL_OT_paste(wmOperatorType *ot)
   ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
 
   /* properties */
-  ot->prop = RNA_def_enum(ot->srna, "type", copy_type, 0, "Type", "");
+  ot->prop = RNA_def_enum(ot->srna, "type", copy_type, GP_COPY_TO_ACTIVE, "Type", "");
 }
 
 /* ******************* Move To Layer ****************************** */
index 9cf14f6d1d6e7b649ae14a6a796dd731caad9fa9..8546290d28195b538922558a3778a1bf640b81a6 100644 (file)
@@ -3038,7 +3038,7 @@ static uiBlock *block_create__close_file_dialog(struct bContext *C, struct ARegi
     BLI_path_extension_replace(filename, sizeof(filename), "");
   }
   else {
-    STRNCPY(filename, IFACE_("Untitled"));
+    BLI_snprintf(filename, sizeof(filename), IFACE_("Untitled"));
   }
 
   /* Title */