diff options
author | Ton Roosendaal <ton@blender.org> | 2006-01-29 16:10:20 +0300 |
---|---|---|
committer | Ton Roosendaal <ton@blender.org> | 2006-01-29 16:10:20 +0300 |
commit | 2d12365f7c18aa280af51665ddca130052c838a6 (patch) | |
tree | 0e162478fdb385c72f5d4b0c9c5526889d5574b8 /source/blender/src/previewrender.c | |
parent | abe7e7bc726d180b84b9ff720766a093fe4b6f41 (diff) |
Previewrender (buttons) now supports Lamp, Texture and Sky previews
again. One exception I didn't solve yet... for the Stucci texture.
In a next commit I will add the preview.blend, so people can play with it!
The rules for preview.blend are pretty primitive still... might become
a bit more advanced later. Here's what it uses now:
- If Object has name starting with 'p' it will get the to-be-previewed
Material or Lamp assigned
- If Object has name starting with 't' its Material gets the texture
assigned for Texture previews
The layer codes for current preview options are in DNA_material_types.h;
#define MA_SPHERE 0
#define MA_CUBE 1
#define MA_FLAT 2
#define MA_MONKEY 3
#define MA_SPHERE_A 4
#define MA_TEXTURE 5
#define MA_LAMP 6
#define MA_SKY 7
(SPHERE_A is sphere with alpha for icons)
Diffstat (limited to 'source/blender/src/previewrender.c')
-rw-r--r-- | source/blender/src/previewrender.c | 79 |
1 files changed, 47 insertions, 32 deletions
diff --git a/source/blender/src/previewrender.c b/source/blender/src/previewrender.c index 0109d0d146c..6335bf03ec3 100644 --- a/source/blender/src/previewrender.c +++ b/source/blender/src/previewrender.c @@ -250,7 +250,9 @@ void BIF_preview_free_dbase(void) free_main(pr_main); } -static Scene *preview_prepare_scene(RenderInfo *ri, ID *id, int pr_method) +/* call this with an ID pointer to initialize preview scene */ +/* call this with ID NULL to restore assigned ID pointers in preview scene */ +static Scene *preview_prepare_scene(RenderInfo *ri, int id_type, ID *id, int pr_method) { Scene *sce; Base *base; @@ -259,18 +261,19 @@ static Scene *preview_prepare_scene(RenderInfo *ri, ID *id, int pr_method) sce= pr_main->scene.first; if(sce) { - if(GS(id->name)==ID_MA) { + if(id_type==ID_MA) { Material *mat= (Material *)id; - if(pr_method==PR_ICON_RENDER) { - sce->lay= 1<<MA_SPHERE_A; - } - else { - sce->lay= 1<<mat->pr_type; - if(mat->nodetree) - ntreeInitPreview(mat->nodetree, ri->pr_rectx, ri->pr_recty); - } - + if(id) { + if(pr_method==PR_ICON_RENDER) { + sce->lay= 1<<MA_SPHERE_A; + } + else { + sce->lay= 1<<mat->pr_type; + if(mat->nodetree) + ntreeInitPreview(mat->nodetree, ri->pr_rectx, ri->pr_recty); + } + } for(base= sce->base.first; base; base= base->next) { if(base->object->id.name[2]=='p') { if(ELEM4(base->object->type, OB_MESH, OB_CURVE, OB_SURF, OB_MBALL)) @@ -278,31 +281,41 @@ static Scene *preview_prepare_scene(RenderInfo *ri, ID *id, int pr_method) } } } - return sce; - } - - return NULL; -} - -/* prevent pointer from being 'hanging' in preview dbase */ -static void preview_exit_scene(RenderInfo *ri, ID *id) -{ - Scene *sce; - Base *base; - - if(pr_main==NULL) return; - - sce= pr_main->scene.first; - if(sce) { - if(GS(id->name)==ID_MA) { + else if(id_type==ID_TE) { + Tex *tex= (Tex *)id; + + sce->lay= 1<<MA_TEXTURE; + + for(base= sce->base.first; base; base= base->next) { + if(base->object->id.name[2]=='t') { + Material *mat= give_current_material(base->object, base->object->actcol); + if(mat && mat->mtex[0]) { + mat->mtex[0]->tex= tex; + } + } + } + } + else if(id_type==ID_LA) { + Lamp *la= (Lamp *)id; + + sce->lay= 1<<MA_LAMP; + for(base= sce->base.first; base; base= base->next) { if(base->object->id.name[2]=='p') { - if(ELEM4(base->object->type, OB_MESH, OB_CURVE, OB_SURF, OB_MBALL)) - assign_material(base->object, NULL, base->object->actcol); + if(base->object->type==OB_LAMP) + base->object->data= la; } } } + else if(id_type==ID_WO) { + sce->lay= 1<<MA_SKY; + sce->world= (World *)id; + } + + return sce; } + + return NULL; } static void previewrender_progress(RenderResult *rr, rcti *unused) @@ -345,7 +358,7 @@ void BIF_previewrender(struct ID *id, struct RenderInfo *ri, struct ScrArea *are } /* get the stuff from the builtin preview dbase */ - sce= preview_prepare_scene(ri, id, pr_method); + sce= preview_prepare_scene(ri, GS(id->name), id, pr_method); if(sce==NULL) return; /* just create new render always now */ @@ -384,6 +397,7 @@ void BIF_previewrender(struct ID *id, struct RenderInfo *ri, struct ScrArea *are RE_ResultGet32(re, ri->rect); if(GS(id->name)==ID_MA && ((Material *)id)->use_nodes) allqueue(REDRAWNODE, 0); + allqueue(REDRAWBUTSSHADING, 0); } else { if(pr_method==PR_DRAW_RENDER && qtest()) { @@ -391,7 +405,8 @@ void BIF_previewrender(struct ID *id, struct RenderInfo *ri, struct ScrArea *are } } } - preview_exit_scene(ri, id); + /* unassign the pointer */ + preview_prepare_scene(ri, GS(id->name), NULL, 0); RE_FreeRender(re); } |