[Bf-blender-cvs] [b0b63e6ab40] temp-T90576-asset-browser-drop-on-material-slot: Fixed crash when object has no uvs.

Jeroen Bakker noreply at git.blender.org
Wed Aug 11 11:10:52 CEST 2021


Commit: b0b63e6ab401ecb69d98270014141bce0d9de894
Author: Jeroen Bakker
Date:   Wed Aug 11 10:53:17 2021 +0200
Branches: temp-T90576-asset-browser-drop-on-material-slot
https://developer.blender.org/rBb0b63e6ab401ecb69d98270014141bce0d9de894

Fixed crash when object has no uvs.

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

M	source/blender/draw/engines/basic/basic_engine.c

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

diff --git a/source/blender/draw/engines/basic/basic_engine.c b/source/blender/draw/engines/basic/basic_engine.c
index 6f6dc898d1c..a5c4e9bf79b 100644
--- a/source/blender/draw/engines/basic/basic_engine.c
+++ b/source/blender/draw/engines/basic/basic_engine.c
@@ -28,6 +28,8 @@
 #include "BKE_paint.h"
 #include "BKE_particle.h"
 
+#include "BLI_alloca.h"
+
 #include "DNA_particle_types.h"
 
 #include "GPU_shader.h"
@@ -158,6 +160,23 @@ static void basic_cache_init(void *vedata)
   }
 }
 
+static bool basic_object_type_has_material_slots(Object *ob)
+{
+  return ELEM(
+      ob->type, OB_MESH, OB_CURVE, OB_SURF, OB_FONT, OB_MBALL, OB_HAIR, OB_POINTCLOUD, OB_VOLUME);
+}
+
+/* TODO(fclem): DRW_cache_object_surface_material_get needs a refactor to allow passing NULL
+ * instead of gpumat_array. Avoiding all this boilerplate code. */
+static struct GPUBatch **basic_object_surface_material_get(Object *ob)
+{
+  const int materials_len = DRW_cache_object_material_count_get(ob);
+  struct GPUMaterial **gpumat_array = BLI_array_alloca(gpumat_array, materials_len);
+  memset(gpumat_array, 0, sizeof(*gpumat_array) * materials_len);
+
+  return DRW_cache_object_surface_material_get(ob, gpumat_array, materials_len);
+}
+
 static void basic_cache_populate(void *vedata, Object *ob)
 {
   BASIC_StorageList *stl = ((BASIC_Data *)vedata)->stl;
@@ -214,8 +233,8 @@ static void basic_cache_populate(void *vedata, Object *ob)
     DRW_shgroup_call_sculpt(shgrp, ob, false, false);
   }
   else {
-    if (stl->g_data->use_material_slot_selection) {
-      struct GPUBatch **geoms = DRW_cache_mesh_surface_texpaint_get(ob);
+    if (stl->g_data->use_material_slot_selection && basic_object_type_has_material_slots(ob)) {
+      struct GPUBatch **geoms = basic_object_surface_material_get(ob);
       if (geoms) {
         const int materials_len = DRW_cache_object_material_count_get(ob);
         for (int i = 0; i < materials_len; i++) {



More information about the Bf-blender-cvs mailing list