diff options
author | IRIE Shinsuke <irieshinsuke@yahoo.co.jp> | 2014-04-27 20:08:10 +0400 |
---|---|---|
committer | IRIE Shinsuke <irieshinsuke@yahoo.co.jp> | 2014-04-27 20:20:36 +0400 |
commit | 1973b17fce65a4dfececb45b19abec37898c1ab5 (patch) | |
tree | 36f730d98d31f4fb993bcfca57f6e8af36a48dcc /source/blender/gpu/intern/gpu_material.c | |
parent | a2489e29f6233b407c577a7bbf6400a9b160117d (diff) |
View3D: Tweak GLSL preview, use only lamps enabled in active render layer and material light group.
This change makes lighting in GLSL preview more accurate, though it still
doesn't support material's "Exclusive" option.
Technical note: Changes in view3d_draw.c are not essential, these avoid
preparing unused shadow buffers.
Reviewers: brecht
Reviewed By: brecht
Differential Revision: https://developer.blender.org/D457
Diffstat (limited to 'source/blender/gpu/intern/gpu_material.c')
-rw-r--r-- | source/blender/gpu/intern/gpu_material.c | 18 |
1 files changed, 17 insertions, 1 deletions
diff --git a/source/blender/gpu/intern/gpu_material.c b/source/blender/gpu/intern/gpu_material.c index 0f05a7f0cda..4b070a4568a 100644 --- a/source/blender/gpu/intern/gpu_material.c +++ b/source/blender/gpu/intern/gpu_material.c @@ -58,6 +58,7 @@ #include "BKE_node.h" #include "BKE_scene.h" #include "BKE_texture.h" +#include "BKE_group.h" #include "IMB_imbuf_types.h" @@ -259,18 +260,33 @@ void GPU_material_free(Material *ma) BLI_freelistN(&ma->gpumaterial); } +bool GPU_lamp_override_visible(GPULamp *lamp, SceneRenderLayer *srl, Material *ma) +{ + if (srl && srl->light_override) + return BKE_group_object_exists(srl->light_override, lamp->ob); + else if (ma && ma->group) + return BKE_group_object_exists(ma->group, lamp->ob); + else + return true; +} + void GPU_material_bind(GPUMaterial *material, int oblay, int viewlay, double time, int mipmap, float viewmat[4][4], float viewinv[4][4]) { if (material->pass) { LinkData *nlink; GPULamp *lamp; GPUShader *shader = GPU_pass_shader(material->pass); + SceneRenderLayer *srl = BLI_findlink(&material->scene->r.layers, material->scene->r.actlay); + + if (srl) + viewlay &= srl->lay; /* handle layer lamps */ for (nlink=material->lamps.first; nlink; nlink=nlink->next) { lamp= nlink->data; - if (!lamp->hide && (lamp->lay & viewlay) && (!(lamp->mode & LA_LAYER) || (lamp->lay & oblay))) { + if (!lamp->hide && (lamp->lay & viewlay) && (!(lamp->mode & LA_LAYER) || (lamp->lay & oblay)) + && GPU_lamp_override_visible(lamp, srl, material->ma)) { lamp->dynenergy = lamp->energy; copy_v3_v3(lamp->dyncol, lamp->col); } |