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:
authorBrecht Van Lommel <brechtvanlommel@pandora.be>2011-05-19 15:37:08 +0400
committerBrecht Van Lommel <brechtvanlommel@pandora.be>2011-05-19 15:37:08 +0400
commit525f4e226e1bf42782c0dba7bcf0d9e3bfa9b0d4 (patch)
treebf57987d104bf16ee79149e6da976ce4472bb1fd /source/blender
parent54b97c1d9d4abbd7e8ed64040fb879bd82442ccf (diff)
Fix for preview render, lamp and world now also get localized like material and texture.
Diffstat (limited to 'source/blender')
-rw-r--r--source/blender/editors/render/render_preview.c59
1 files changed, 55 insertions, 4 deletions
diff --git a/source/blender/editors/render/render_preview.c b/source/blender/editors/render/render_preview.c
index ec81f703d61..2404805c17b 100644
--- a/source/blender/editors/render/render_preview.c
+++ b/source/blender/editors/render/render_preview.c
@@ -74,7 +74,9 @@
#include "BKE_main.h"
#include "BKE_material.h"
#include "BKE_node.h"
+#include "BKE_object.h"
#include "BKE_texture.h"
+#include "BKE_world.h"
#include "IMB_imbuf.h"
#include "IMB_imbuf_types.h"
@@ -149,9 +151,11 @@ typedef struct ShaderPreview {
ID *parent;
MTex *slot;
- /* node materials/texture need full copy during preview render, glsl uses it too */
+ /* datablocks with nodes need full copy during preview render, glsl uses it too */
Material *matcopy;
Tex *texcopy;
+ Lamp *lampcopy;
+ World *worldcopy;
float col[4]; /* active object color */
@@ -259,7 +263,7 @@ static Scene *preview_prepare_scene(Scene *scene, ID *id, int id_type, ShaderPre
if(id_type==ID_MA) {
Material *mat= NULL, *origmat= (Material *)id;
- if(id) {
+ if(origmat) {
/* work on a copy */
mat= localize_material(origmat);
sp->matcopy= mat;
@@ -389,7 +393,14 @@ static Scene *preview_prepare_scene(Scene *scene, ID *id, int id_type, ShaderPre
}
}
else if(id_type==ID_LA) {
- Lamp *la= (Lamp *)id;
+ Lamp *la= NULL, *origla= (Lamp *)id;
+
+ /* work on a copy */
+ if(origla) {
+ la= localize_lamp(origla);
+ sp->lampcopy= la;
+ BLI_addtail(&pr_main->lamp, la);
+ }
if(la && la->type==LA_SUN && (la->sun_effect_type & LA_SUN_EFFECT_SKY)) {
sce->lay= 1<<MA_ATMOS;
@@ -411,8 +422,16 @@ static Scene *preview_prepare_scene(Scene *scene, ID *id, int id_type, ShaderPre
}
}
else if(id_type==ID_WO) {
+ World *wrld= NULL, *origwrld= (World *)id;
+
+ if(origwrld) {
+ wrld= localize_world(origwrld);
+ sp->worldcopy= wrld;
+ BLI_addtail(&pr_main->world, wrld);
+ }
+
sce->lay= 1<<MA_SKY;
- sce->world= (World *)id;
+ sce->world= wrld;
}
return sce;
@@ -707,6 +726,38 @@ static void shader_preview_free(void *customdata)
}
MEM_freeN(sp->texcopy);
}
+ if(sp->worldcopy) {
+ struct IDProperty *properties;
+ /* node previews */
+ shader_preview_updatejob(sp);
+
+ /* get rid of copied world */
+ BLI_remlink(&pr_main->world, sp->worldcopy);
+ free_world(sp->worldcopy);
+
+ properties= IDP_GetProperties((ID *)sp->worldcopy, FALSE);
+ if (properties) {
+ IDP_FreeProperty(properties);
+ MEM_freeN(properties);
+ }
+ MEM_freeN(sp->worldcopy);
+ }
+ if(sp->lampcopy) {
+ struct IDProperty *properties;
+ /* node previews */
+ shader_preview_updatejob(sp);
+
+ /* get rid of copied lamp */
+ BLI_remlink(&pr_main->lamp, sp->lampcopy);
+ free_lamp(sp->lampcopy);
+
+ properties= IDP_GetProperties((ID *)sp->lampcopy, FALSE);
+ if (properties) {
+ IDP_FreeProperty(properties);
+ MEM_freeN(properties);
+ }
+ MEM_freeN(sp->lampcopy);
+ }
MEM_freeN(sp);
}