Cleanup: rename IDP_FreeProperty_ex to IDP_FreePropertyContent_ex
[blender.git] / source / blender / editors / render / render_preview.c
index 9b31b63edaea3bd795e2ff8226eb88406abbb644..76b88b8df2218d4b17ce1c2c78af8a5d67d4f95f 100644 (file)
@@ -131,14 +131,16 @@ ImBuf *get_brush_icon(Brush *brush)
           }
         }
 
-        if (brush->icon_imbuf)
+        if (brush->icon_imbuf) {
           BKE_icon_changed(BKE_icon_id_ensure(&brush->id));
+        }
       }
     }
   }
 
-  if (!(brush->icon_imbuf))
+  if (!(brush->icon_imbuf)) {
     brush->id.icon_id = 0;
+  }
 
   return brush->icon_imbuf;
 }
@@ -234,17 +236,20 @@ static bool check_engine_supports_preview(Scene *scene)
 
 void ED_preview_free_dbase(void)
 {
-  if (G_pr_main)
+  if (G_pr_main) {
     BKE_main_free(G_pr_main);
+  }
 
-  if (G_pr_main_grease_pencil)
+  if (G_pr_main_grease_pencil) {
     BKE_main_free(G_pr_main_grease_pencil);
+  }
 }
 
 static Scene *preview_get_scene(Main *pr_main)
 {
-  if (pr_main == NULL)
+  if (pr_main == NULL) {
     return NULL;
+  }
 
   return pr_main->scenes.first;
 }
@@ -265,7 +270,7 @@ static const char *preview_collection_name(const char pr_type)
     case MA_FLUID:
       return "Fluid";
     case MA_SPHERE_A:
-      return "World Shader Ball";
+      return "World Sphere";
     case MA_LAMP:
       return "Lamp";
     case MA_SKY:
@@ -326,28 +331,22 @@ static World *preview_get_localized_world(ShaderPreview *sp, World *world)
   return sp->worldcopy;
 }
 
-static ID *duplicate_ids(ID *id, Depsgraph *depsgraph)
+static ID *duplicate_ids(ID *id)
 {
   if (id == NULL) {
     /* Non-ID preview render. */
     return NULL;
   }
 
-  ID *id_eval = id;
-
-  if (depsgraph) {
-    id_eval = DEG_get_evaluated_id(depsgraph, id);
-  }
-
   switch (GS(id->name)) {
     case ID_MA:
-      return (ID *)BKE_material_localize((Material *)id_eval);
+      return (ID *)BKE_material_localize((Material *)id);
     case ID_TE:
-      return (ID *)BKE_texture_localize((Tex *)id_eval);
+      return (ID *)BKE_texture_localize((Tex *)id);
     case ID_LA:
-      return (ID *)BKE_light_localize((Light *)id_eval);
+      return (ID *)BKE_light_localize((Light *)id);
     case ID_WO:
-      return (ID *)BKE_world_localize((World *)id_eval);
+      return (ID *)BKE_world_localize((World *)id);
     case ID_IM:
     case ID_BR:
     case ID_SCR:
@@ -397,10 +396,12 @@ static Scene *preview_prepare_scene(
       sce->r.tiley = sce->r.ysch / 4;
     }
 
-    if ((id && sp->pr_method == PR_ICON_RENDER) && id_type != ID_WO)
+    if ((id && sp->pr_method == PR_ICON_RENDER) && id_type != ID_WO) {
       sce->r.alphamode = R_ALPHAPREMUL;
-    else
+    }
+    else {
       sce->r.alphamode = R_ADDSKY;
+    }
 
     sce->r.cfra = scene->r.cfra;
 
@@ -436,7 +437,14 @@ static Scene *preview_prepare_scene(
           sce->world->horb = 0.05f;
         }
 
-        set_preview_visibility(sce, view_layer, mat->pr_type, sp->pr_method);
+        if (sp->pr_method == PR_ICON_RENDER && sp->pr_main == G_pr_main_grease_pencil) {
+          /* For grease pencil, always use sphere for icon renders. */
+          set_preview_visibility(sce, view_layer, MA_SPHERE_A, sp->pr_method);
+        }
+        else {
+          /* Use specified preview shape for both preview panel and icon previews. */
+          set_preview_visibility(sce, view_layer, mat->pr_type, sp->pr_method);
+        }
 
         if (sp->pr_method != PR_ICON_RENDER) {
           if (mat->nodetree && sp->pr_method == PR_NODE_RENDER) {
@@ -448,7 +456,7 @@ static Scene *preview_prepare_scene(
         }
       }
       else {
-        sce->r.mode &= ~(R_OSA);
+        sce->display.render_aa = SCE_DISPLAY_AA_OFF;
       }
 
       for (Base *base = view_layer->object_bases.first; base; base = base->next) {
@@ -461,8 +469,9 @@ static Scene *preview_prepare_scene(
             Material ***matar = give_matarar(base->object);
             int actcol = max_ii(base->object->actcol - 1, 0);
 
-            if (matar && actcol < base->object->totcol)
+            if (matar && actcol < base->object->totcol) {
               (*matar)[actcol] = mat;
+            }
           }
           else if (base->object->type == OB_LAMP) {
             base->flag |= BASE_VISIBLE;
@@ -510,8 +519,9 @@ static Scene *preview_prepare_scene(
 
       for (Base *base = view_layer->object_bases.first; base; base = base->next) {
         if (base->object->id.name[2] == 'p') {
-          if (base->object->type == OB_LAMP)
+          if (base->object->type == OB_LAMP) {
             base->object->data = la;
+          }
         }
       }
 
@@ -562,10 +572,12 @@ static bool ed_preview_draw_rect(ScrArea *sa, int split, int first, rcti *rect,
   int newy = BLI_rcti_size_y(rect);
   bool ok = false;
 
-  if (!split || first)
+  if (!split || first) {
     sprintf(name, "Preview %p", (void *)sa);
-  else
+  }
+  else {
     sprintf(name, "SecondPreview %p", (void *)sa);
+  }
 
   if (split) {
     if (first) {
@@ -581,8 +593,9 @@ static bool ed_preview_draw_rect(ScrArea *sa, int split, int first, rcti *rect,
   /* test if something rendered ok */
   re = RE_GetRender(name);
 
-  if (re == NULL)
+  if (re == NULL) {
     return false;
+  }
 
   RE_AcquireResultImageViews(re, &rres);
 
@@ -609,8 +622,9 @@ static bool ed_preview_draw_rect(ScrArea *sa, int split, int first, rcti *rect,
         float fy = rect->ymin;
 
         /* material preview only needs monoscopy (view 0) */
-        if (re)
+        if (re) {
           RE_AcquiredResultGet32(re, &rres, (unsigned int *)rect_byte, 0);
+        }
 
         IMMDrawPixelsTexState state = immDrawPixelsTexSetup(GPU_SHADER_2D_IMAGE_COLOR);
         immDrawPixelsTex(&state,
@@ -662,11 +676,13 @@ void ED_preview_draw(const bContext *C, void *idp, void *parentp, void *slotp, r
       ok = ed_preview_draw_rect(sa, 1, 1, rect, &newrect);
       ok &= ed_preview_draw_rect(sa, 1, 0, rect, &newrect);
     }
-    else
+    else {
       ok = ed_preview_draw_rect(sa, 0, 0, rect, &newrect);
+    }
 
-    if (ok)
+    if (ok) {
       *rect = newrect;
+    }
 
     /* start a new preview render job if signaled through sbuts->preview,
      * if no render result was found and no preview render job is running,
@@ -712,26 +728,30 @@ static void shader_preview_updatejob(void *spv)
       if (GS(sp->id->name) == ID_MA) {
         Material *mat = (Material *)sp->id;
 
-        if (sp->matcopy && mat->nodetree && sp->matcopy->nodetree)
+        if (sp->matcopy && mat->nodetree && sp->matcopy->nodetree) {
           ntreeLocalSync(sp->matcopy->nodetree, mat->nodetree);
+        }
       }
       else if (GS(sp->id->name) == ID_TE) {
         Tex *tex = (Tex *)sp->id;
 
-        if (sp->texcopy && tex->nodetree && sp->texcopy->nodetree)
+        if (sp->texcopy && tex->nodetree && sp->texcopy->nodetree) {
           ntreeLocalSync(sp->texcopy->nodetree, tex->nodetree);
+        }
       }
       else if (GS(sp->id->name) == ID_WO) {
         World *wrld = (World *)sp->id;
 
-        if (sp->worldcopy && wrld->nodetree && sp->worldcopy->nodetree)
+        if (sp->worldcopy && wrld->nodetree && sp->worldcopy->nodetree) {
           ntreeLocalSync(sp->worldcopy->nodetree, wrld->nodetree);
+        }
       }
       else if (GS(sp->id->name) == ID_LA) {
         Light *la = (Light *)sp->id;
 
-        if (sp->lampcopy && la->nodetree && sp->lampcopy->nodetree)
+        if (sp->lampcopy && la->nodetree && sp->lampcopy->nodetree) {
           ntreeLocalSync(sp->lampcopy->nodetree, la->nodetree);
+        }
       }
     }
   }
@@ -801,18 +821,15 @@ static void shader_preview_render(ShaderPreview *sp, ID *id, int split, int firs
   char name[32];
   int sizex;
   Main *pr_main = sp->pr_main;
-  ID *id_eval = id;
-
-  if (sp->depsgraph) {
-    id_eval = DEG_get_evaluated_id(sp->depsgraph, id);
-  }
 
   /* in case of split preview, use border render */
   if (split) {
-    if (first)
+    if (first) {
       sizex = sp->sizex / 2;
-    else
+    }
+    else {
       sizex = sp->sizex - sp->sizex / 2;
+    }
   }
   else {
     sizex = sp->sizex;
@@ -827,19 +844,23 @@ static void shader_preview_render(ShaderPreview *sp, ID *id, int split, int firs
   }
 
   /* get the stuff from the builtin preview dbase */
-  sce = preview_prepare_scene(sp->bmain, sp->scene, id_eval, idtype, sp);
-  if (sce == NULL)
+  sce = preview_prepare_scene(sp->bmain, sp->scene, id, idtype, sp);
+  if (sce == NULL) {
     return;
+  }
 
-  if (!split || first)
+  if (!split || first) {
     sprintf(name, "Preview %p", sp->owner);
-  else
+  }
+  else {
     sprintf(name, "SecondPreview %p", sp->owner);
+  }
   re = RE_GetRender(name);
 
   /* full refreshed render from first tile */
-  if (re == NULL)
+  if (re == NULL) {
     re = RE_NewRender(name);
+  }
 
   /* sce->r gets copied in RE_InitState! */
   sce->r.scemode &= ~(R_MATNODE_PREVIEW | R_TEXNODE_PREVIEW);
@@ -847,17 +868,19 @@ static void shader_preview_render(ShaderPreview *sp, ID *id, int split, int firs
 
   if (sp->pr_method == PR_ICON_RENDER) {
     sce->r.scemode |= R_NO_IMAGE_LOAD;
-    sce->r.mode |= R_OSA;
+    sce->display.render_aa = SCE_DISPLAY_AA_SAMPLES_8;
   }
   else if (sp->pr_method == PR_NODE_RENDER) {
-    if (idtype == ID_MA)
+    if (idtype == ID_MA) {
       sce->r.scemode |= R_MATNODE_PREVIEW;
-    else if (idtype == ID_TE)
+    }
+    else if (idtype == ID_TE) {
       sce->r.scemode |= R_TEXNODE_PREVIEW;
-    sce->r.mode &= ~R_OSA;
+    }
+    sce->display.render_aa = SCE_DISPLAY_AA_OFF;
   }
   else { /* PR_BUTS_RENDER */
-    sce->r.mode |= R_OSA;
+    sce->display.render_aa = SCE_DISPLAY_AA_SAMPLES_8;
   }
 
   /* callbacs are cleared on GetRender() */
@@ -869,8 +892,9 @@ static void shader_preview_render(ShaderPreview *sp, ID *id, int split, int firs
 
   /* lens adjust */
   oldlens = ((Camera *)sce->camera->data)->lens;
-  if (sizex > sp->sizey)
+  if (sizex > sp->sizey) {
     ((Camera *)sce->camera->data)->lens *= (float)sp->sizey / (float)sizex;
+  }
 
   /* entire cycle for render engine */
   if (idtype == ID_TE) {
@@ -887,8 +911,9 @@ static void shader_preview_render(ShaderPreview *sp, ID *id, int split, int firs
   if (sp->pr_method == PR_ICON_RENDER) {
     // char *rct= (char *)(sp->pr_rect + 32*16 + 16);
 
-    if (sp->pr_rect)
+    if (sp->pr_rect) {
       RE_ResultGet32(re, sp->pr_rect);
+    }
   }
 
   /* unassign the pointers, reset vars */
@@ -914,8 +939,9 @@ static void shader_preview_startjob(void *customdata, short *stop, short *do_upd
     shader_preview_render(sp, sp->id, 1, 1);
     shader_preview_render(sp, sp->parent, 1, 0);
   }
-  else
+  else {
     shader_preview_render(sp, sp->id, 0, 0);
+  }
 
   *do_update = true;
 }
@@ -950,7 +976,7 @@ static void shader_preview_free(void *customdata)
     /* get rid of copied ID */
     properties = IDP_GetProperties(sp->id_copy, false);
     if (properties) {
-      IDP_FreeProperty_ex(properties, false);
+      IDP_FreePropertyContent_ex(properties, false);
       MEM_freeN(properties);
     }
     switch (GS(sp->id_copy->name)) {
@@ -986,14 +1012,16 @@ static void icon_copy_rect(ImBuf *ibuf, unsigned int w, unsigned int h, unsigned
   short ex, ey, dx, dy;
 
   /* paranoia test */
-  if (ibuf == NULL || (ibuf->rect == NULL && ibuf->rect_float == NULL))
+  if (ibuf == NULL || (ibuf->rect == NULL && ibuf->rect_float == NULL)) {
     return;
+  }
 
   /* waste of cpu cyles... but the imbuf API has no other way to scale fast (ton) */
   ima = IMB_dupImBuf(ibuf);
 
-  if (!ima)
+  if (!ima) {
     return;
+  }
 
   if (ima->x > ima->y) {
     scaledx = (float)w;
@@ -1013,8 +1041,9 @@ static void icon_copy_rect(ImBuf *ibuf, unsigned int w, unsigned int h, unsigned
   IMB_scalefastImBuf(ima, ex, ey);
 
   /* if needed, convert to 32 bits */
-  if (ima->rect == NULL)
+  if (ima->rect == NULL) {
     IMB_rect_from_float(ima);
+  }
 
   srect = ima->rect;
   drect = rect;
@@ -1033,8 +1062,9 @@ static void set_alpha(char *cp, int sizex, int sizey, char alpha)
 {
   int a, size = sizex * sizey;
 
-  for (a = 0; a < size; a++, cp += 4)
+  for (a = 0; a < size; a++, cp += 4) {
     cp[3] = alpha;
+  }
 }
 
 static void icon_preview_startjob(void *customdata, short *stop, short *do_update)
@@ -1070,8 +1100,9 @@ static void icon_preview_startjob(void *customdata, short *stop, short *do_updat
       ImageUser iuser = {NULL};
 
       /* ima->ok is zero when Image cannot load */
-      if (ima == NULL || ima->ok == 0)
+      if (ima == NULL || ima->ok == 0) {
         return;
+      }
 
       /* setup dummy image user */
       iuser.ok = iuser.framenr = 1;
@@ -1099,8 +1130,9 @@ static void icon_preview_startjob(void *customdata, short *stop, short *do_updat
 
       memset(sp->pr_rect, 0x88, sp->sizex * sp->sizey * sizeof(unsigned int));
 
-      if (!(br->icon_imbuf) || !(br->icon_imbuf->rect))
+      if (!(br->icon_imbuf) || !(br->icon_imbuf->rect)) {
         return;
+      }
 
       icon_copy_rect(br->icon_imbuf, sp->sizex, sp->sizey, sp->pr_rect);
 
@@ -1135,10 +1167,12 @@ static void common_preview_startjob(void *customdata,
 {
   ShaderPreview *sp = customdata;
 
-  if (ELEM(sp->pr_method, PR_ICON_RENDER, PR_ICON_DEFERRED))
+  if (ELEM(sp->pr_method, PR_ICON_RENDER, PR_ICON_DEFERRED)) {
     icon_preview_startjob(customdata, stop, do_update);
-  else
+  }
+  else {
     shader_preview_startjob(customdata, stop, do_update);
+  }
 }
 
 /* exported functions */
@@ -1228,8 +1262,9 @@ static void icon_preview_endjob(void *customdata)
 
   if (ip->id) {
 
-    if (GS(ip->id->name) == ID_BR)
+    if (GS(ip->id->name) == ID_BR) {
       WM_main_add_notifier(NC_BRUSH | NA_EDITED, ip->id);
+    }
 #if 0
     if (GS(ip->id->name) == ID_MA) {
       Material *ma = (Material *)ip->id;
@@ -1288,7 +1323,7 @@ void ED_preview_icon_render(
   ip.scene = scene;
   ip.owner = BKE_previewimg_id_ensure(id);
   ip.id = id;
-  ip.id_copy = duplicate_ids(id, NULL);
+  ip.id_copy = duplicate_ids(id);
 
   icon_preview_add_size(&ip, rect, sizex, sizey);
 
@@ -1319,8 +1354,9 @@ void ED_preview_icon_job(
 
   /* render all resolutions from suspended job too */
   old_ip = WM_jobs_customdata_get(wm_job);
-  if (old_ip)
+  if (old_ip) {
     BLI_movelisttolist(&ip->sizes, &old_ip->sizes);
+  }
 
   /* customdata for preview thread */
   ip->bmain = CTX_data_main(C);
@@ -1328,11 +1364,12 @@ void ED_preview_icon_job(
   ip->depsgraph = CTX_data_depsgraph(C);
   ip->owner = owner;
   ip->id = id;
-  ip->id_copy = duplicate_ids(id, ip->depsgraph);
+  ip->id_copy = duplicate_ids(id);
 
   icon_preview_add_size(ip, rect, sizex, sizey);
 
-  /* Special threading hack: warn main code that this preview is being rendered and cannot be freed... */
+  /* Special threading hack:
+   * warn main code that this preview is being rendered and cannot be freed... */
   {
     PreviewImage *prv_img = owner;
     if (prv_img->tag & PRV_TAG_DEFFERED) {
@@ -1363,7 +1400,8 @@ void ED_preview_shader_job(const bContext *C,
   Scene *scene = CTX_data_scene(C);
   short id_type = GS(id->name);
 
-  /* Use workspace render only for buttons Window, since the other previews are related to the datablock. */
+  /* Use workspace render only for buttons Window,
+   * since the other previews are related to the datablock. */
 
   if (!check_engine_supports_preview(scene)) {
     return;
@@ -1392,7 +1430,7 @@ void ED_preview_shader_job(const bContext *C,
   sp->sizey = sizey;
   sp->pr_method = method;
   sp->id = id;
-  sp->id_copy = duplicate_ids(id, sp->depsgraph);
+  sp->id_copy = duplicate_ids(id);
   sp->own_id_copy = true;
   sp->parent = parent;
   sp->slot = slot;
@@ -1431,6 +1469,7 @@ void ED_preview_shader_job(const bContext *C,
 
 void ED_preview_kill_jobs(wmWindowManager *wm, Main *UNUSED(bmain))
 {
-  if (wm)
+  if (wm) {
     WM_jobs_kill(wm, NULL, common_preview_startjob);
+  }
 }