Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2017-06-28 06:33:55 +0300
committerCampbell Barton <ideasman42@gmail.com>2017-06-28 06:36:55 +0300
commite78c0840f2eef95f5a3f85dd0222b533f8fe1699 (patch)
tree3920b47b1588dbdfec1ab8ecf4a57d5ac71c037b /source/blender/draw/engines/eevee/eevee_materials.c
parentfc3d0da2fd36d41d79932db3d9ea7e428127a7b8 (diff)
DwM: create eevee materials before the mesh
To know which custom-data layers will be needed in the mesh. No functional change yet.
Diffstat (limited to 'source/blender/draw/engines/eevee/eevee_materials.c')
-rw-r--r--source/blender/draw/engines/eevee/eevee_materials.c30
1 files changed, 21 insertions, 9 deletions
diff --git a/source/blender/draw/engines/eevee/eevee_materials.c b/source/blender/draw/engines/eevee/eevee_materials.c
index 7bc45bf62e3..c23918d5c2d 100644
--- a/source/blender/draw/engines/eevee/eevee_materials.c
+++ b/source/blender/draw/engines/eevee/eevee_materials.c
@@ -30,6 +30,7 @@
#include "BLI_dynstr.h"
#include "BLI_ghash.h"
+#include "BLI_alloca.h"
#include "BKE_particle.h"
@@ -571,9 +572,11 @@ void EEVEE_materials_cache_populate(EEVEE_Data *vedata, EEVEE_SceneLayerData *sl
ADD_SHGROUP_CALL(depth_shgrp, ob, geom);
ADD_SHGROUP_CALL(depth_clip_shgrp, ob, geom);
- /* Get per-material split surface */
- struct Gwn_Batch **mat_geom = DRW_cache_object_surface_material_get(ob);
- if (mat_geom) {
+ /* First get materials for this mesh. */
+ if (ELEM(ob->type, OB_MESH)) {
+ const int materials_len = MAX2(1, (is_sculpt_mode ? 1 : ob->totcol));
+ struct DRWShadingGroup **shgrp_array = BLI_array_alloca(shgrp_array, materials_len);
+
bool use_flat_nor = false;
if (is_default_mode_shader) {
@@ -582,7 +585,7 @@ void EEVEE_materials_cache_populate(EEVEE_Data *vedata, EEVEE_SceneLayerData *sl
}
}
- for (int i = 0; i < MAX2(1, (is_sculpt_mode ? 1 : ob->totcol)); ++i) {
+ for (int i = 0; i < materials_len; ++i) {
DRWShadingGroup *shgrp = NULL;
Material *ma = give_current_material(ob, i + 1);
@@ -594,13 +597,15 @@ void EEVEE_materials_cache_populate(EEVEE_Data *vedata, EEVEE_SceneLayerData *sl
float *spec_p = &ma->spec;
float *rough_p = &ma->gloss_mir;
+ const bool use_gpumat = (ma->use_nodes && ma->nodetree);
+
shgrp = BLI_ghash_lookup(material_hash, (const void *)ma);
if (shgrp) {
- ADD_SHGROUP_CALL(shgrp, ob, mat_geom[i]);
+ shgrp_array[i] = shgrp; /* ADD_SHGROUP_CALL below */
continue;
}
- if (ma->use_nodes && ma->nodetree) {
+ if (use_gpumat) {
Scene *scene = draw_ctx->scene;
struct GPUMaterial *gpumat = EEVEE_material_mesh_get(scene, ma,
stl->effects->use_ao, stl->effects->use_bent_normals);
@@ -610,8 +615,7 @@ void EEVEE_materials_cache_populate(EEVEE_Data *vedata, EEVEE_SceneLayerData *sl
add_standard_uniforms(shgrp, sldata, vedata);
BLI_ghash_insert(material_hash, ma, shgrp);
-
- ADD_SHGROUP_CALL(shgrp, ob, mat_geom[i]);
+ shgrp_array[i] = shgrp; /* ADD_SHGROUP_CALL below */
}
else {
/* Shader failed : pink color */
@@ -634,7 +638,15 @@ void EEVEE_materials_cache_populate(EEVEE_Data *vedata, EEVEE_SceneLayerData *sl
BLI_ghash_insert(material_hash, ma, shgrp);
- ADD_SHGROUP_CALL(shgrp, ob, mat_geom[i]);
+ shgrp_array[i] = shgrp; /* ADD_SHGROUP_CALL below */
+ }
+ }
+
+ /* Get per-material split surface */
+ struct Gwn_Batch **mat_geom = DRW_cache_object_surface_material_get(ob);
+ if (mat_geom) {
+ for (int i = 0; i < materials_len; ++i) {
+ ADD_SHGROUP_CALL(shgrp_array[i], ob, mat_geom[i]);
}
}
}