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)
This commit is contained in:
Ton Roosendaal 2006-01-29 13:10:20 +00:00
parent abe7e7bc72
commit 2d12365f7c
3 changed files with 4388 additions and 4159 deletions

@ -241,6 +241,9 @@ typedef struct Material {
#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
/* pr_back */
#define MA_DARK 1

File diff suppressed because it is too large Load Diff

@ -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,33 +281,43 @@ static Scene *preview_prepare_scene(RenderInfo *ri, ID *id, int pr_method)
}
}
}
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(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;
}
/* 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) {
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);
}
}
}
}
}
static void previewrender_progress(RenderResult *rr, rcti *unused)
{
RenderLayer *rl;
@ -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);
}