Work on RenderLayer and Pass control:

Full log:
http://www.blender3d.org/cms/Render_Passes.829.0.html

In short:
- Passes now have option to be excluded from "Combined".
- RenderLayers allow to override Light (Lamp groups) or Material.
- RenderLayers and Passes are in Outliner now, (ab)using Matt's nice
  'restriction collumns'. :)
This commit is contained in:
Ton Roosendaal 2006-12-07 14:17:38 +00:00
parent 80d1d88ef6
commit 17231f83f3
18 changed files with 467 additions and 222 deletions

View File

@ -1034,10 +1034,6 @@ void ntreeShaderExecTree(bNodeTree *ntree, ShadeInput *shi, ShadeResult *shr)
ntreeExecTree(ntree, &scd, shi->thread); /* threads */
/* better not allow negative for now */
if(shr->spec[0]<0.0f) shr->spec[0]= 0.0f;
if(shr->spec[1]<0.0f) shr->spec[1]= 0.0f;
if(shr->spec[2]<0.0f) shr->spec[2]= 0.0f;
if(shr->combined[0]<0.0f) shr->combined[0]= 0.0f;
if(shr->combined[1]<0.0f) shr->combined[1]= 0.0f;
if(shr->combined[2]<0.0f) shr->combined[2]= 0.0f;

View File

@ -2993,6 +2993,7 @@ static void lib_link_scene(FileData *fd, Main *main)
Base *base, *next;
Editing *ed;
Sequence *seq;
SceneRenderLayer *srl;
int a;
sce= main->scene.first;
@ -3016,8 +3017,7 @@ static void lib_link_scene(FileData *fd, Main *main)
mtex->tex= newlibadr_us(fd, sce->id.lib, mtex->tex);
}
base= sce->base.first;
while(base) {
for(base= sce->base.first; base; base= next) {
next= base->next;
/* base->object= newlibadr_us(fd, sce->id.lib, base->object); */
@ -3032,7 +3032,6 @@ static void lib_link_scene(FileData *fd, Main *main)
if(base==sce->basact) sce->basact= 0;
MEM_freeN(base);
}
base= next;
}
ed= sce->ed;
@ -3057,7 +3056,12 @@ static void lib_link_scene(FileData *fd, Main *main)
if(sce->nodetree)
lib_link_ntree(fd, &sce->id, sce->nodetree);
for(srl= sce->r.layers.first; srl; srl= srl->next) {
srl->mat_override= newlibadr_us(fd, sce->id.lib, srl->mat_override);
srl->light_override= newlibadr_us(fd, sce->id.lib, srl->light_override);
}
sce->id.flag -= LIB_NEEDLINK;
}
@ -6830,17 +6834,22 @@ static void expand_object(FileData *fd, Main *mainvar, Object *ob)
static void expand_scene(FileData *fd, Main *mainvar, Scene *sce)
{
Base *base;
SceneRenderLayer *srl;
base= sce->base.first;
while(base) {
for(base= sce->base.first; base; base= base->next) {
expand_doit(fd, mainvar, base->object);
base= base->next;
}
expand_doit(fd, mainvar, sce->camera);
expand_doit(fd, mainvar, sce->world);
if(sce->nodetree)
expand_nodetree(fd, mainvar, sce->nodetree);
for(srl= sce->r.layers.first; srl; srl= srl->next) {
expand_doit(fd, mainvar, srl->mat_override);
expand_doit(fd, mainvar, srl->light_override);
}
}
static void expand_camera(FileData *fd, Main *mainvar, Camera *ca)

View File

@ -164,7 +164,7 @@ struct ScrArea;
#define BUT_NORMAL (31<<9)
#define BUT_CURVE (32<<9)
#define BUT_TOGDUAL (33<<9)
#define ICONTOGN (34<<9)
#define BUTTYPE (63<<9)

View File

@ -72,6 +72,12 @@ typedef struct TreeElement {
#define TSE_VERSE_GEOM_NODE 17
/*#endif*/
#define TSE_PROXY 18
#define TSE_R_LAYER_BASE 19
#define TSE_R_LAYER 20
#define TSE_R_PASS 21
#define TSE_LINKED_MAT 22
/* NOTE, is used for light group */
#define TSE_LINKED_LAMP 23
/* outliner search flags */
#define OL_FIND 0

View File

@ -115,10 +115,14 @@ typedef struct SceneRenderLayer {
struct SceneRenderLayer *next, *prev;
char name[32];
struct Scene *scene; /* unused still */
struct Material *mat_override;
struct Group *light_override;
unsigned int lay; /* scene->lay itself has priority over this */
short layflag;
short passflag;
int layflag;
int passflag; /* pass_xor has to be after passflag */
int pass_xor;
} SceneRenderLayer;
/* srl->layflag */
@ -128,8 +132,11 @@ typedef struct SceneRenderLayer {
#define SCE_LAY_EDGE 8
#define SCE_LAY_SKY 16
#define SCE_LAY_STRAND 32
/* flags between 32 and 0x8000 are set to 1 already, for future options */
#define SCE_LAY_ALL_Z 0x8000
#define SCE_LAY_XOR 0x10000
#define SCE_LAY_DISABLE 0x20000
/* srl->passflag */
#define SCE_PASS_COMBINED 1
@ -144,6 +151,8 @@ typedef struct SceneRenderLayer {
#define SCE_PASS_VECTOR 512
#define SCE_PASS_REFRACT 1024
#define SCE_PASS_INDEXOB 2048
#define SCE_PASS_RADIO 4096
/* note, passflag is treestore element 'nr' in outliner, short still... */
typedef struct RenderData {
struct AviCodecData *avicodecdata;

View File

@ -70,7 +70,10 @@ typedef struct RenderLayer {
/* copy of RenderData */
char name[RE_MAXNAME];
unsigned int lay;
int layflag, passflag;
int layflag, passflag, pass_xor;
struct Material *mat_override;
struct Group *light_override;
float *rectf; /* 4 float, standard rgba buffer */
float *acolrect; /* 4 float, optional transparent buffer, needs storage for display updates */

View File

@ -48,14 +48,14 @@ typedef struct ShadeResult
float combined[4];
float col[4];
float alpha;
float diff[3]; /* includes ramps, shadow, etc */
float diff_raw[3]; /* pure diffuse, no shadow no ramps */
float diff[3]; /* no ramps, shadow, etc */
float spec[3];
float shad[3];
float ao[3];
float refl[3];
float refr[3];
float nor[3];
float rad[3];
float winspeed[4];
} ShadeResult;
@ -139,8 +139,9 @@ typedef struct ShadeInput
short do_preview; /* for nodes, in previewrender */
short thread, sample; /* sample: ShadeSample array index */
unsigned int lay;
int layflag, passflag;
int layflag, passflag, combinedflag;
struct Group *light_override;
struct Material *mat_override;
} ShadeInput;

View File

@ -3115,28 +3115,45 @@ static void check_non_flat_quads(Render *re)
}
}
static void set_material_lightgroups(Render *re)
static void add_lightgroup(Render *re, Group *group)
{
GroupObject *go, *gol;
/* it's a bit too many loops in loops... but will survive */
for(go= group->gobject.first; go; go= go->next) {
go->lampren= NULL;
if(go->ob && go->ob->type==OB_LAMP) {
for(gol= re->lights.first; gol; gol= gol->next) {
if(gol->ob==go->ob) {
go->lampren= gol->lampren;
break;
}
}
if(go->lampren==NULL)
go->lampren= add_render_lamp(re, go->ob);
}
}
}
static void set_material_lightgroups(Render *re)
{
Material *ma;
/* it's a bit too many loops in loops... but will survive */
/* hola! materials not in use...? */
for(ma= G.main->mat.first; ma; ma=ma->id.next) {
if(ma->group) {
for(go= ma->group->gobject.first; go; go= go->next) {
go->lampren= NULL;
if(go->ob && go->ob->type==OB_LAMP) {
for(gol= re->lights.first; gol; gol= gol->next) {
if(gol->ob==go->ob) {
go->lampren= gol->lampren;
break;
}
}
if(go->lampren==NULL)
go->lampren= add_render_lamp(re, go->ob);
}
}
}
if(ma->group)
add_lightgroup(re, ma->group);
}
}
static void set_renderlayer_lightgroups(Render *re, Scene *sce)
{
SceneRenderLayer *srl;
for(srl= sce->r.layers.first; srl; srl= srl->next) {
if(srl->light_override)
add_lightgroup(re, srl->light_override);
}
}
@ -3367,6 +3384,8 @@ void RE_Database_FromScene(Render *re, Scene *scene, int use_camera_view)
sort_halos(re);
set_material_lightgroups(re);
for(sce= re->scene; sce; sce= sce->set)
set_renderlayer_lightgroups(re, sce);
slurph_opt= 1;

View File

@ -411,6 +411,8 @@ static RenderResult *new_render_result(Render *re, rcti *partrct, int crop, int
if((re->r.scemode & R_SINGLE_LAYER) && nr!=re->r.actlay)
continue;
if(srl->layflag & SCE_LAY_DISABLE)
continue;
rl= MEM_callocN(sizeof(RenderLayer), "new render layer");
BLI_addtail(&rr->layers, rl);
@ -419,6 +421,9 @@ static RenderResult *new_render_result(Render *re, rcti *partrct, int crop, int
rl->lay= srl->lay;
rl->layflag= srl->layflag;
rl->passflag= srl->passflag;
rl->pass_xor= srl->pass_xor;
rl->light_override= srl->light_override;
rl->mat_override= srl->mat_override;
if(rr->exrhandle) {
IMB_exr_add_channel(rr->exrhandle, rl->name, "Combined.R");
@ -484,8 +489,9 @@ static int render_scene_needs_vector(Render *re)
SceneRenderLayer *srl;
for(srl= re->scene->r.layers.first; srl; srl= srl->next)
if(srl->passflag & SCE_PASS_VECTOR)
return 1;
if(!(srl->layflag & SCE_LAY_DISABLE))
if(srl->passflag & SCE_PASS_VECTOR)
return 1;
}
return 0;
}
@ -1788,6 +1794,7 @@ static void do_render_all_options(Render *re)
static int is_rendering_allowed(Render *re)
{
SceneRenderLayer *srl;
/* forbidden combinations */
if(re->r.mode & R_PANORAMA) {
@ -1856,6 +1863,14 @@ static int is_rendering_allowed(Render *re)
return 0;
}
}
/* layer flag tests */
for(srl= re->scene->r.layers.first; srl; srl= srl->next)
if(!(srl->layflag & SCE_LAY_DISABLE))
break;
if(srl==NULL) {
re->error("All RenderLayers are disabled");
return 0;
}
return 1;
}

View File

@ -1601,13 +1601,16 @@ static void traceray(ShadeInput *origshi, short depth, float *start, float *vec,
shi.mask= origshi->mask;
shi.osatex= origshi->osatex;
shi.depth= 1; // only now to indicate tracing
shi.depth= 1; /* only used to indicate tracing */
shi.thread= origshi->thread;
shi.xs= origshi->xs;
shi.ys= origshi->ys;
shi.lay= origshi->lay;
shi.passflag= origshi->passflag;
shi.passflag= SCE_PASS_COMBINED; /* result of tracing needs no pass info */
shi.combinedflag= 0xFFFFFF; /* ray trace does all options */
shi.do_preview= 0;
shi.light_override= origshi->light_override;
shi.mat_override= origshi->mat_override;
memset(&shr, 0, sizeof(ShadeResult));
@ -1838,12 +1841,9 @@ void ray_trace(ShadeInput *shi, ShadeResult *shr)
do_mir= ((shi->mat->mode & MA_RAYMIRROR) && shi->ray_mirror!=0.0f);
vlr= shi->vlr;
/* raytrace likes to separate the spec color */
VECSUB(shr->diff, shr->combined, shr->spec);
if(do_tra) {
float refract[3];
float olddiff[3];
float combined[3];
tracol[3]= shr->alpha;
@ -1856,15 +1856,18 @@ void ray_trace(ShadeInput *shi, ShadeResult *shr)
fb= 1.0f+ shi->mat->filter*(shi->b-1.0f);
/* for refract pass */
VECCOPY(olddiff, shr->diff);
VECCOPY(combined, shr->combined);
shr->diff[0]= f*shr->diff[0] + fr*tracol[0];
shr->diff[1]= f*shr->diff[1] + fr*tracol[1];
shr->diff[2]= f*shr->diff[2] + fr*tracol[2];
combined[0]= f*combined[0] + fr*tracol[0];
combined[1]= f*combined[1] + fr*tracol[1];
combined[2]= f*combined[2] + fr*tracol[2];
if(shi->passflag & SCE_PASS_REFRACT)
VECSUB(shr->refr, shr->diff, olddiff);
VECSUB(shr->refr, combined, shr->combined);
if(shi->combinedflag & SCE_PASS_REFRACT)
VECCOPY(shr->combined, combined);
shr->alpha= tracol[3];
}
@ -1872,6 +1875,11 @@ void ray_trace(ShadeInput *shi, ShadeResult *shr)
i= shi->ray_mirror*fresnel_fac(shi->view, shi->vn, shi->mat->fresnel_mir_i, shi->mat->fresnel_mir);
if(i!=0.0f) {
float diff[3];
/* raytrace mirror likes to separate the spec color */
VECSUB(diff, shr->combined, shr->spec);
fr= i*shi->mirr;
fg= i*shi->mirg;
fb= i*shi->mirb;
@ -1885,23 +1893,27 @@ void ray_trace(ShadeInput *shi, ShadeResult *shr)
if(shi->passflag & SCE_PASS_REFLECT) {
/* mirror pass is not blocked out with spec */
shr->refl[0]= fr*mircol[0] - fr*shr->diff[0];
shr->refl[1]= fg*mircol[1] - fg*shr->diff[1];
shr->refl[2]= fb*mircol[2] - fb*shr->diff[2];
shr->refl[0]= fr*mircol[0] - fr*diff[0];
shr->refl[1]= fg*mircol[1] - fg*diff[1];
shr->refl[2]= fb*mircol[2] - fb*diff[2];
}
f= fr*(1.0f-shr->spec[0]); f1= 1.0f-i;
shr->diff[0]= f*mircol[0] + f1*shr->diff[0];
f= fg*(1.0f-shr->spec[1]); f1= 1.0f-i;
shr->diff[1]= f*mircol[1] + f1*shr->diff[1];
if(shi->combinedflag & SCE_PASS_REFLECT) {
f= fr*(1.0f-shr->spec[0]); f1= 1.0f-i;
diff[0]= f*mircol[0] + f1*diff[0];
f= fg*(1.0f-shr->spec[1]); f1= 1.0f-i;
diff[1]= f*mircol[1] + f1*diff[1];
f= fb*(1.0f-shr->spec[2]); f1= 1.0f-i;
diff[2]= f*mircol[2] + f1*diff[2];
f= fb*(1.0f-shr->spec[2]); f1= 1.0f-i;
shr->diff[2]= f*mircol[2] + f1*shr->diff[2];
/* put back together */
VECADD(shr->combined, diff, shr->spec);
}
}
}
/* put back together */
VECADD(shr->combined, shr->diff, shr->spec);
}
/* color 'shadfac' passes through 'col' with alpha and filter */

View File

@ -378,7 +378,7 @@ static void add_filt_passes(RenderLayer *rl, int curmask, int rectx, int offset,
pixsize= 4;
break;
case SCE_PASS_DIFFUSE:
col= shr->diff_raw;
col= shr->diff;
break;
case SCE_PASS_SPEC:
col= shr->spec;
@ -442,7 +442,7 @@ static void add_passes(RenderLayer *rl, int offset, ShadeInput *shi, ShadeResult
pixsize= 4;
break;
case SCE_PASS_DIFFUSE:
col= shr->diff_raw;
col= shr->diff;
break;
case SCE_PASS_SPEC:
col= shr->spec;

View File

@ -108,7 +108,7 @@ void shade_material_loop(ShadeInput *shi, ShadeResult *shr)
if(shi->passflag & SCE_PASS_SPEC)
VECADDISFAC(shr->spec, shr_t.spec, fac);
if(shi->passflag & SCE_PASS_DIFFUSE)
VECADDISFAC(shr->diff_raw, shr_t.diff_raw, fac);
VECADDISFAC(shr->diff, shr_t.diff, fac);
if(shi->passflag & SCE_PASS_SHADOW)
VECADDISFAC(shr->shad, shr_t.shad, fac);
@ -221,7 +221,9 @@ void shade_input_set_triangle_i(ShadeInput *shi, VlakRen *vlr, short i1, short i
shi->i2= i2;
shi->i3= i3;
shi->mat= vlr->mat;
/* note, shi->mat is set in node shaders */
shi->mat= shi->mat_override?shi->mat_override:vlr->mat;
shi->osatex= (shi->mat->texco & TEXCO_OSA);
shi->mode= shi->mat->mode_l; /* or-ed result for all nodes */
@ -832,7 +834,7 @@ void shade_input_set_shade_texco(ShadeInput *shi)
/* ****************** ShadeSample ************************************** */
/* initialize per part, not per pixel! */
static void shade_input_initialize(ShadeInput *shi, RenderPart *pa, RenderLayer *rl, int sample)
{
@ -844,10 +846,14 @@ static void shade_input_initialize(ShadeInput *shi, RenderPart *pa, RenderLayer
shi->lay= rl->lay;
shi->layflag= rl->layflag;
shi->passflag= rl->passflag;
shi->combinedflag= ~rl->pass_xor;
shi->mat_override= rl->mat_override;
shi->light_override= rl->light_override;
/* note shi.depth==0 means first hit, not raytracing */
}
/* initialize per part, not per pixel! */
void shade_sample_initialize(ShadeSample *ssamp, RenderPart *pa, RenderLayer *rl)
{
int a, tot;
@ -886,6 +892,9 @@ void shade_samples_do_shadow(ShadeSample *ssamp)
if(!(shi->mode & MA_SHADOW) || (shi->mode & MA_SHLESS))
continue;
if(!( (shi->combinedflag | shi->passflag) & SCE_PASS_SHADOW))
continue;
visifac= lamp_get_visibility(lar, shi->co, lv, &lampdist);
if(visifac==0.0f)
continue;

View File

@ -54,6 +54,16 @@
extern struct Render R;
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
static ListBase *get_lights(ShadeInput *shi)
{
if(shi->light_override)
return &shi->light_override->gobject;
else if(shi->mat->group)
return &shi->mat->group->gobject;
else
return &R.lights;
}
#if 0
static void fogcolor(float *colf, float *rco, float *view)
@ -323,13 +333,14 @@ static void spothalo(struct LampRen *lar, ShadeInput *shi, float *intens)
void renderspothalo(ShadeInput *shi, float *col, float alpha)
{
ListBase *lights= get_lights(shi);
GroupObject *go;
LampRen *lar;
float i;
if(alpha==0.0f) return;
for(go=R.lights.first; go; go= go->next) {
for(go=lights->first; go; go= go->next) {
lar= go->lampren;
if(lar->type==LA_SPOT && (lar->mode & LA_HALO) && lar->haint>0) {
@ -1099,7 +1110,7 @@ float lamp_get_visibility(LampRen *lar, float *co, float *lv, float *dist)
}
}
/* function returns diff, spec and raw diff */
/* function returns raw diff, spec and full shadowed diff in the 'shad' pass */
static void shade_one_light(LampRen *lar, ShadeInput *shi, ShadeResult *shr, int passflag)
{
Material *ma= shi->mat;
@ -1226,15 +1237,12 @@ static void shade_one_light(LampRen *lar, ShadeInput *shi, ShadeResult *shr, int
if(lar->mode & LA_ONLYSHADOW) {
shadfac[3]= i*lar->energy*(1.0f-shadfac[3]);
shr->diff[0] -= shadfac[3]*shi->r;
shr->diff[1] -= shadfac[3]*shi->g;
shr->diff[2] -= shadfac[3]*shi->b;
shr->shad[0] -= shadfac[3]*shi->r;
shr->shad[1] -= shadfac[3]*shi->g;
shr->shad[2] -= shadfac[3]*shi->b;
return;
}
if(!(passflag & (SCE_PASS_DIFFUSE|SCE_PASS_SHADOW)))
if(shadfac[3]==0.0f) return;
i*= shadfac[3];
}
}
@ -1244,15 +1252,19 @@ static void shade_one_light(LampRen *lar, ShadeInput *shi, ShadeResult *shr, int
if(!(lar->mode & LA_NO_DIFF)) {
if(i>0.0f) {
if(ma->mode & MA_SHADOW_TRA)
add_to_diffuse(shr->diff, shi, is, i*shadfac[0]*lacol[0], i*shadfac[1]*lacol[1], i*shadfac[2]*lacol[2]);
add_to_diffuse(shr->shad, shi, is, i*shadfac[0]*lacol[0], i*shadfac[1]*lacol[1], i*shadfac[2]*lacol[2]);
else
add_to_diffuse(shr->diff, shi, is, i*lacol[0], i*lacol[1], i*lacol[2]);
add_to_diffuse(shr->shad, shi, is, i*lacol[0], i*lacol[1], i*lacol[2]);
}
if(i_noshad>0.0f && (passflag & (SCE_PASS_DIFFUSE|SCE_PASS_SHADOW))) {
if(ma->mode & MA_SHADOW_TRA)
add_to_diffuse(shr->diff_raw, shi, is, i_noshad*shadfac[0]*lacol[0], i_noshad*shadfac[1]*lacol[1], i_noshad*shadfac[2]*lacol[2]);
if(i_noshad>0.0f) {
if(passflag & (SCE_PASS_DIFFUSE|SCE_PASS_SHADOW)) {
if(ma->mode & MA_SHADOW_TRA)
add_to_diffuse(shr->diff, shi, is, i_noshad*shadfac[0]*lacol[0], i_noshad*shadfac[1]*lacol[1], i_noshad*shadfac[2]*lacol[2]);
else
add_to_diffuse(shr->diff, shi, is, i_noshad*lacol[0], i_noshad*lacol[1], i_noshad*lacol[2]);
}
else
add_to_diffuse(shr->diff_raw, shi, is, i_noshad*lacol[0], i_noshad*lacol[1], i_noshad*lacol[2]);
VECCOPY(shr->diff, shr->shad);
}
}
@ -1323,7 +1335,7 @@ static void shade_lamp_loop_only_shadow(ShadeInput *shi, ShadeResult *shr)
{
if(R.r.mode & R_SHADOW) {
ListBase *lights;
ListBase *lights= get_lights(shi);
LampRen *lar;
GroupObject *go;
float inpr, lv[3];
@ -1332,13 +1344,7 @@ static void shade_lamp_loop_only_shadow(ShadeInput *shi, ShadeResult *shr)
vn= shi->vn;
view= shi->view;
/* lights */
if(shi->mat->group)
lights= &shi->mat->group->gobject;
else
lights= &R.lights;
accum= ir= 0.0f;
for(go=lights->first; go; go= go->next) {
@ -1391,6 +1397,13 @@ static void shade_lamp_loop_only_shadow(ShadeInput *shi, ShadeResult *shr)
}
}
static void wrld_exposure_correct(float *diff)
{
diff[0]= R.wrld.linfac*(1.0f-exp( diff[0]*R.wrld.logfac) );
diff[1]= R.wrld.linfac*(1.0f-exp( diff[1]*R.wrld.logfac) );
diff[2]= R.wrld.linfac*(1.0f-exp( diff[2]*R.wrld.logfac) );
}
void shade_lamp_loop(ShadeInput *shi, ShadeResult *shr)
{
Material *ma= shi->mat;
@ -1456,15 +1469,9 @@ void shade_lamp_loop(ShadeInput *shi, ShadeResult *shr)
/* lighting pass */
if(passflag & (SCE_PASS_COMBINED|SCE_PASS_DIFFUSE|SCE_PASS_SPEC|SCE_PASS_SHADOW)) {
GroupObject *go;
ListBase *lights;
ListBase *lights= get_lights(shi);
LampRen *lar;
/* lights */
if(ma->group)
lights= &ma->group->gobject;
else
lights= &R.lights;
for(go=lights->first; go; go= go->next) {
lar= go->lampren;
if(lar==NULL) continue;
@ -1476,31 +1483,31 @@ void shade_lamp_loop(ShadeInput *shi, ShadeResult *shr)
if(lar->mode & LA_LAYER) if((lar->lay & vlr->lay)==0) continue;
if((lar->lay & shi->lay)==0) continue;
/* accumulates in shr->diff and shr->spec and shr->diff_raw (diffuse without shadow!) */
/* accumulates in shr->diff and shr->spec and shr->shad (diffuse with shadow!) */
shade_one_light(lar, shi, shr, passflag);
}
if(shi->combinedflag & SCE_PASS_SHADOW)
VECCOPY(shr->combined, shr->shad) /* note, no ';' ! */
else
VECCOPY(shr->combined, shr->diff);
/* calculate shadow pass, we use a multiplication mask */
if(passflag & SCE_PASS_SHADOW) {
if(shr->diff_raw[0]!=0.0f) shr->shad[0]= shr->diff[0]/shr->diff_raw[0];
if(shr->diff_raw[1]!=0.0f) shr->shad[1]= shr->diff[1]/shr->diff_raw[1];
if(shr->diff_raw[2]!=0.0f) shr->shad[2]= shr->diff[2]/shr->diff_raw[2];
if(shr->diff[0]!=0.0f) shr->shad[0]= shr->shad[0]/shr->diff[0];
if(shr->diff[1]!=0.0f) shr->shad[1]= shr->shad[1]/shr->diff[1];
if(shr->diff[2]!=0.0f) shr->shad[2]= shr->shad[2]/shr->diff[2];
}
/* exposure correction */
if(R.wrld.exp!=0.0f || R.wrld.range!=1.0f) {
shr->diff[0]= R.wrld.linfac*(1.0f-exp( shr->diff[0]*R.wrld.logfac) );
shr->diff[1]= R.wrld.linfac*(1.0f-exp( shr->diff[1]*R.wrld.logfac) );
shr->diff[2]= R.wrld.linfac*(1.0f-exp( shr->diff[2]*R.wrld.logfac) );
shr->spec[0]= R.wrld.linfac*(1.0f-exp( shr->spec[0]*R.wrld.logfac) );
shr->spec[1]= R.wrld.linfac*(1.0f-exp( shr->spec[1]*R.wrld.logfac) );
shr->spec[2]= R.wrld.linfac*(1.0f-exp( shr->spec[2]*R.wrld.logfac) );
wrld_exposure_correct(shr->diff);
wrld_exposure_correct(shr->spec);
}
}
/* alpha in end, spec can influence it */
if(passflag & (SCE_PASS_COMBINED|SCE_PASS_RGBA)) {
if(passflag & (SCE_PASS_COMBINED)) {
if(ma->fresnel_tra!=0.0f)
shi->alpha*= fresnel_fac(shi->view, shi->vn, ma->fresnel_tra_i, ma->fresnel_tra);
@ -1516,44 +1523,47 @@ void shade_lamp_loop(ShadeInput *shi, ShadeResult *shr)
}
shr->alpha= shi->alpha;
/* now stuff everything in shr->diff: ambient, AO, radio, ramps, exposure */
shr->diff[0]+= shi->ambr + shi->r*shi->amb*shi->rad[0];
shr->diff[1]+= shi->ambg + shi->g*shi->amb*shi->rad[1];
shr->diff[2]+= shi->ambb + shi->b*shi->amb*shi->rad[2];
/* from now stuff everything in shr->combined: ambient, AO, radio, ramps, exposure */
shr->combined[0]+= shi->ambr + shi->r*shi->amb*shi->rad[0];
shr->combined[1]+= shi->ambg + shi->g*shi->amb*shi->rad[1];
shr->combined[2]+= shi->ambb + shi->b*shi->amb*shi->rad[2];
/* add AO in combined? */
if(R.wrld.mode & WO_AMB_OCC) {
float aodiff[3];
ambient_occlusion_to_diffuse(shi, aodiff);
shr->diff[0] += shi->r*aodiff[0];
shr->diff[1] += shi->g*aodiff[1];
shr->diff[2] += shi->b*aodiff[2];
if(shi->combinedflag & SCE_PASS_AO) {
float aodiff[3];
ambient_occlusion_to_diffuse(shi, aodiff);
shr->combined[0] += shi->r*aodiff[0];
shr->combined[1] += shi->g*aodiff[1];
shr->combined[2] += shi->b*aodiff[2];
}
}
if(ma->mode & MA_RAMP_COL) ramp_diffuse_result(shr->diff, shi);
if(ma->mode & MA_RAMP_COL) ramp_diffuse_result(shr->combined, shi);
if(ma->mode & MA_RAMP_SPEC) ramp_spec_result(shr->spec, shr->spec+1, shr->spec+2, shi);
/* refcol is for envmap only */
if(shi->refcol[0]!=0.0f) {
float olddiff[3];
float result[3];
VECCOPY(olddiff, shr->diff);
shr->diff[0]= shi->mirr*shi->refcol[1] + (1.0f - shi->mirr*shi->refcol[0])*shr->diff[0];
shr->diff[1]= shi->mirg*shi->refcol[2] + (1.0f - shi->mirg*shi->refcol[0])*shr->diff[1];
shr->diff[2]= shi->mirb*shi->refcol[3] + (1.0f - shi->mirb*shi->refcol[0])*shr->diff[2];
result[0]= shi->mirr*shi->refcol[1] + (1.0f - shi->mirr*shi->refcol[0])*shr->combined[0];
result[1]= shi->mirg*shi->refcol[2] + (1.0f - shi->mirg*shi->refcol[0])*shr->combined[1];
result[2]= shi->mirb*shi->refcol[3] + (1.0f - shi->mirb*shi->refcol[0])*shr->combined[2];
if(passflag & SCE_PASS_REFLECT)
VECSUB(shr->refl, shr->diff, olddiff);
VECSUB(shr->refl, result, shr->combined);
if(shi->combinedflag & SCE_PASS_REFLECT)
VECCOPY(shr->combined, result);
}
/* and add spec */
if(shi->combinedflag & SCE_PASS_SPEC)
VECADD(shr->combined, shr->combined, shr->spec);
/* XXX SOLVE */
if(passflag & SCE_PASS_COMBINED) {
shr->combined[0]= shr->diff[0]+ shr->spec[0];
shr->combined[1]= shr->diff[1]+ shr->spec[1];
shr->combined[2]= shr->diff[2]+ shr->spec[2];
shr->combined[3]= shr->alpha;
}
shr->combined[3]= shr->alpha;
}

View File

@ -834,9 +834,10 @@ void do_render_panels(unsigned short event)
case B_SET_PASS:
if(G.scene->nodetree) {
ntreeCompositForceHidden(G.scene->nodetree);
allqueue(REDRAWBUTSSCENE, 0);
allqueue(REDRAWNODE, 0);
}
allqueue(REDRAWBUTSSCENE, 0);
allqueue(REDRAWOOPS, 0);
}
}
@ -1167,7 +1168,7 @@ static void render_panel_output(void)
if(G.scene->set) {
uiSetButLock(1, NULL);
uiDefIDPoinBut(block, test_scenepoin_but, ID_SCE, 0, "", 31, 120, 100, 20, &(G.scene->set), "Name of the Set");
uiDefIDPoinBut(block, test_scenepoin_but, ID_SCE, B_NOP, "", 31, 120, 100, 20, &(G.scene->set), "Name of the Set");
uiClearButLock();
uiDefIconBut(block, BUT, B_CLEARSET, ICON_X, 132, 120, 20, 20, 0, 0, 0, 0, 0, "Remove Set link");
}
@ -1273,7 +1274,7 @@ static void render_panel_render(void)
uiDefButS(block, MENU, B_DIFF,str, 565,34,60,20, &G.scene->r.filtertype, 0, 0, 0, 0, "Set sampling filter for antialiasing");
uiDefButF(block, NUM,B_DIFF,"", 627,34,60,20,&G.scene->r.gauss,0.5, 1.5, 10, 2, "Sets the filter size");
uiDefButBitI(block, TOG, R_BORDER, REDRAWVIEWCAM, "Border", 565,13,60,20, &G.scene->r.mode, 0, 0, 0, 0, "Render a small cut-out of the image");
uiDefButBitI(block, TOG, R_BORDER, REDRAWVIEWCAM, "Border", 565,13,122,20, &G.scene->r.mode, 0, 0, 0, 0, "Render a small cut-out of the image");
uiBlockEndAlign(block);
}
@ -1732,6 +1733,7 @@ static void rename_scene_layer_func(void *srl_v, void *unused_v)
}
}
allqueue(REDRAWBUTSSCENE, 0);
allqueue(REDRAWOOPS, 0);
allqueue(REDRAWNODE, 0);
}
@ -1745,7 +1747,10 @@ static char *scene_layer_menu(void)
strcpy(str, "ADD NEW %x32767");
a= strlen(str);
for(nr=0, srl= G.scene->r.layers.first; srl; srl= srl->next, nr++) {
a+= sprintf(str+a, "|%s %%x%d", srl->name, nr);
if(srl->layflag & SCE_LAY_DISABLE)
a+= sprintf(str+a, "|%s %%i%d %%x%d", srl->name, ICON_BLANK1, nr);
else
a+= sprintf(str+a, "|%s %%i%d %%x%d", srl->name, ICON_CHECKBOX_HLT, nr);
}
return str;
@ -1798,53 +1803,55 @@ static void render_panel_layers(void)
/* first, as reminder, the scene layers */
uiDefBut(block, LABEL, 0, "Scene:", 10,170,100,20, NULL, 0, 0, 0, 0, "");
draw_3d_layer_buttons(block, &G.scene->lay, 130, 170, 35, 30);
draw_3d_layer_buttons(block, &G.scene->lay, 130, 170, 35, 30);
/* layer menu, name, delete button */
/* layer disable, menu, name, delete button */
uiBlockBeginAlign(block);
uiDefIconButBitI(block, ICONTOGN, SCE_LAY_DISABLE, B_REDR, ICON_CHECKBOX_HLT-1, 10, 145, 20, 20, &srl->layflag, 0.0, 0.0, 0, 0, "Disable or enable this RenderLayer");
strp= scene_layer_menu();
uiDefButS(block, MENU, B_ADD_RENDERLAYER, strp, 10,130,23,20, &(G.scene->r.actlay), 0, 0, 0, 0, "Choose Active Render Layer");
uiDefButS(block, MENU, B_ADD_RENDERLAYER, strp, 30,145,23,20, &(G.scene->r.actlay), 0, 0, 0, 0, "Choose Active Render Layer");
MEM_freeN(strp);
bt= uiDefBut(block, TEX, REDRAWNODE, "", 33,130,192,20, srl->name, 0.0, 31.0, 0, 0, "");
bt= uiDefBut(block, TEX, REDRAWNODE, "", 53,145,172,20, srl->name, 0.0, 31.0, 0, 0, "");
uiButSetFunc(bt, rename_scene_layer_func, srl, NULL);
uiDefButBitS(block, TOG, R_SINGLE_LAYER, B_NOP, "Single", 230,130,60,20, &G.scene->r.scemode, 0, 0, 0, 0, "Only render this layer");
bt=uiDefIconBut(block, BUT, B_NOP, ICON_X, 285, 130, 25, 20, 0, 0, 0, 0, 0, "Deletes current Render Layer");
uiDefButBitS(block, TOG, R_SINGLE_LAYER, B_NOP, "Single", 230,145,60,20, &G.scene->r.scemode, 0, 0, 0, 0, "Only render this layer");
bt=uiDefIconBut(block, BUT, B_NOP, ICON_X, 285, 145, 25, 20, 0, 0, 0, 0, 0, "Deletes current Render Layer");
uiButSetFunc(bt, delete_scene_layer_func, srl, (void *)(long)G.scene->r.actlay);
uiBlockEndAlign(block);
/* RenderLayer visible-layers */
uiDefBut(block, LABEL, 0, "Layer:", 10,95,100,20, NULL, 0, 0, 0, 0, "");
draw_3d_layer_buttons(block, &srl->lay, 130, 95, 35, 30);
uiDefBut(block, LABEL, 0, "Layer:", 10,110,100,20, NULL, 0, 0, 0, 0, "");
draw_3d_layer_buttons(block, &srl->lay, 130,110, 35, 30);
uiBlockBeginAlign(block);
uiDefButBitS(block, TOG, SCE_LAY_ALL_Z, B_NOP,"AllZ", 10, 70, 40, 20, &srl->layflag, 0, 0, 0, 0, "Fill in Z values for all not-rendered faces, for masking");
uiDefButBitI(block, TOG, SCE_LAY_ALL_Z, B_NOP,"AllZ", 10, 85, 40, 20, &srl->layflag, 0, 0, 0, 0, "Fill in Z values for all not-rendered faces, for masking");
uiBlockBeginAlign(block);
uiDefButBitS(block, TOG, SCE_LAY_SOLID, B_NOP,"Solid", 50, 70, 60, 20, &srl->layflag, 0, 0, 0, 0, "Render Solid faces in this Layer");
uiDefButBitS(block, TOG, SCE_LAY_HALO, B_NOP,"Halo", 110, 70, 55, 20, &srl->layflag, 0, 0, 0, 0, "Render Halos in this Layer (on top of Solid)");
uiDefButBitS(block, TOG, SCE_LAY_ZTRA, B_NOP,"Ztra", 165, 70, 55, 20, &srl->layflag, 0, 0, 0, 0, "Render Z-Transparent faces in this Layer (On top of Solid and Halos)");
uiDefButBitS(block, TOG, SCE_LAY_SKY, B_NOP,"Sky", 220, 70, 40, 20, &srl->layflag, 0, 0, 0, 0, "Render Sky or backbuffer in this Layer");
uiDefButBitS(block, TOG, SCE_LAY_EDGE, B_NOP,"Edge", 260, 70, 50, 20, &srl->layflag, 0, 0, 0, 0, "Render Edge-enhance in this Layer (only works for Solid faces)");
uiDefButBitI(block, TOG, SCE_LAY_SOLID, B_NOP,"Solid", 50, 85, 60, 20, &srl->layflag, 0, 0, 0, 0, "Render Solid faces in this Layer");
uiDefButBitI(block, TOG, SCE_LAY_HALO, B_NOP,"Halo", 110, 85, 55, 20, &srl->layflag, 0, 0, 0, 0, "Render Halos in this Layer (on top of Solid)");
uiDefButBitI(block, TOG, SCE_LAY_ZTRA, B_NOP,"Ztra", 165, 85, 55, 20, &srl->layflag, 0, 0, 0, 0, "Render Z-Transparent faces in this Layer (On top of Solid and Halos)");
uiDefButBitI(block, TOG, SCE_LAY_SKY, B_NOP,"Sky", 220, 85, 40, 20, &srl->layflag, 0, 0, 0, 0, "Render Sky or backbuffer in this Layer");
uiDefButBitI(block, TOG, SCE_LAY_EDGE, B_NOP,"Edge", 260, 85, 50, 20, &srl->layflag, 0, 0, 0, 0, "Render Edge-enhance in this Layer (only works for Solid faces)");
uiDefIDPoinBut(block, test_grouppoin_but, ID_GR, B_SET_PASS, "Light:", 10, 65, 150, 20, &(srl->light_override), "Name of Group to use as Lamps instead");
uiDefIDPoinBut(block, test_matpoin_but, ID_MA, B_SET_PASS, "Mat:", 160, 65, 150, 20, &(srl->mat_override), "Name of Material to use as Lamps instead");
uiBlockEndAlign(block);
uiDefBut(block, LABEL, 0, "Passes:", 10,30,50,20, NULL, 0, 0, 0, 0, "");
uiBlockBeginAlign(block);
uiDefButBitS(block, TOG, SCE_PASS_COMBINED, B_NOP,"Combined", 60, 30, 85, 20, &srl->passflag, 0, 0, 0, 0, "Deliver full combined RGBA buffer");
uiDefButBitS(block, TOG, SCE_PASS_Z, B_SET_PASS,"Z", 145, 30, 25, 20, &srl->passflag, 0, 0, 0, 0, "Deliver Z values pass");
uiDefButBitS(block, TOG, SCE_PASS_VECTOR, B_SET_PASS,"Vec", 170, 30, 40, 20, &srl->passflag, 0, 0, 0, 0, "Deliver Speed Vector pass");
uiDefButBitS(block, TOG, SCE_PASS_NORMAL, B_SET_PASS,"Nor", 210, 30, 40, 20, &srl->passflag, 0, 0, 0, 0, "Deliver Normal pass");
uiDefButBitS(block, TOG, SCE_PASS_INDEXOB, B_SET_PASS,"IndexOb",250, 30, 60, 20, &srl->passflag, 0, 0, 0, 0, "Deliver Object Index pass");
uiDefBut(block, LABEL, 0, "Pass:", 10,30,45,20, NULL, 0, 0, 0, 0, "");
uiDefButBitI(block, TOG, SCE_PASS_COMBINED, B_SET_PASS,"Combined", 55, 30, 90, 20, &srl->passflag, 0, 0, 0, 0, "Deliver full combined RGBA buffer");
uiDefButBitI(block, TOG, SCE_PASS_Z, B_SET_PASS,"Z", 145, 30, 25, 20, &srl->passflag, 0, 0, 0, 0, "Deliver Z values pass");
uiDefButBitI(block, TOG, SCE_PASS_VECTOR, B_SET_PASS,"Vec", 170, 30, 40, 20, &srl->passflag, 0, 0, 0, 0, "Deliver Speed Vector pass");
uiDefButBitI(block, TOG, SCE_PASS_NORMAL, B_SET_PASS,"Nor", 210, 30, 40, 20, &srl->passflag, 0, 0, 0, 0, "Deliver Normal pass");
uiDefButBitI(block, TOG, SCE_PASS_INDEXOB, B_SET_PASS,"IndexOb",250, 30, 60, 20, &srl->passflag, 0, 0, 0, 0, "Deliver Object Index pass");
uiDefButBitS(block, TOG, SCE_PASS_RGBA, B_SET_PASS,"Col", 10, 10, 45, 20, &srl->passflag, 0, 0, 0, 0, "Deliver shade-less Color pass");
uiDefButBitS(block, TOG, SCE_PASS_DIFFUSE, B_SET_PASS,"Diff", 55, 10, 45, 20, &srl->passflag, 0, 0, 0, 0, "Deliver Diffuse pass");
uiDefButBitS(block, TOG, SCE_PASS_SPEC, B_SET_PASS,"Spec", 100, 10, 45, 20, &srl->passflag, 0, 0, 0, 0, "Deliver Specular pass");
uiDefButBitS(block, TOG, SCE_PASS_SHADOW, B_SET_PASS,"Shad", 145, 10, 45, 20, &srl->passflag, 0, 0, 0, 0, "Deliver Shadow pass");
uiDefButBitS(block, TOG, SCE_PASS_AO, B_SET_PASS,"AO", 185, 10, 40, 20, &srl->passflag, 0, 0, 0, 0, "Deliver AO pass");
uiDefButBitS(block, TOG, SCE_PASS_REFLECT, B_SET_PASS,"Refl", 225, 10, 45, 20, &srl->passflag, 0, 0, 0, 0, "Deliver Raytraced Reflection pass");
uiDefButBitS(block, TOG, SCE_PASS_REFRACT, B_SET_PASS,"Refr", 270, 10, 40, 20, &srl->passflag, 0, 0, 0, 0, "Deliver Raytraced Refraction pass");
uiDefButBitI(block, TOG, SCE_PASS_RGBA, B_SET_PASS,"Col", 10, 10, 45, 20, &srl->passflag, 0, 0, 0, 0, "Deliver shade-less Color pass");
uiDefButBitI(block, TOG, SCE_PASS_DIFFUSE, B_SET_PASS,"Diff", 55, 10, 45, 20, &srl->passflag, 0, 0, 0, 0, "Deliver Diffuse pass");
uiDefButBitI(block, BUT_TOGDUAL, SCE_PASS_SPEC, B_SET_PASS,"Spec", 100, 10, 45, 20, &srl->passflag, 0, 0, 0, 0, "Deliver Specular pass");
uiDefButBitI(block, BUT_TOGDUAL, SCE_PASS_SHADOW, B_SET_PASS,"Shad", 145, 10, 45, 20, &srl->passflag, 0, 0, 0, 0, "Deliver Shadow pass");
uiDefButBitI(block, BUT_TOGDUAL, SCE_PASS_AO, B_SET_PASS,"AO", 185, 10, 40, 20, &srl->passflag, 0, 0, 0, 0, "Deliver AO pass");
uiDefButBitI(block, BUT_TOGDUAL, SCE_PASS_REFLECT, B_SET_PASS,"Refl", 225, 10, 45, 20, &srl->passflag, 0, 0, 0, 0, "Deliver Raytraced Reflection pass");
uiDefButBitI(block, BUT_TOGDUAL, SCE_PASS_REFRACT, B_SET_PASS,"Refr", 270, 10, 40, 20, &srl->passflag, 0, 0, 0, 0, "Deliver Raytraced Refraction pass");
}

View File

@ -2821,9 +2821,7 @@ static void material_panel_texture(Material *ma)
for(a= 0; a<MAX_MTEX; a++) {
mtex= ma->mtex[a];
if(mtex && mtex->tex) {
if(ma->septex & (1<<a))
uiDefButBitS(block, TOG, 1<<a, B_MATPRV, " ", -20, 180-18*a, 28, 20, &ma->septex, 0.0, 0.0, 0, 0, "Click to disable or enable this texture channel");
else uiDefIconButBitS(block, TOG, 1<<a, B_MATPRV, ICON_CHECKBOX_HLT, -20, 180-18*a, 28, 20, &ma->septex, 0.0, 0.0, 0, 0, "Click to disable or enable this texture channel");
uiDefIconButBitS(block, ICONTOGN, 1<<a, B_MATPRV, ICON_CHECKBOX_HLT-1, -20, 180-18*a, 28, 20, &ma->septex, 0.0, 0.0, 0, 0, "Click to disable or enable this texture channel");
}
}
uiBlockBeginAlign(block);

View File

@ -1412,7 +1412,7 @@ static void ui_is_but_sel(uiBut *but)
value= ui_get_but_val(but);
if( but->type==TOGN ) true= 0;
if( but->type==TOGN || but->type==ICONTOGN) true= 0;
if( but->bit ) {
lvalue= (int)value;
@ -1434,6 +1434,7 @@ static void ui_is_but_sel(uiBut *but)
case ICONTOG:
if(value!=but->min) push= 1;
break;
case ICONTOGN:
case TOGN:
if(value==0.0) push= 1;
break;
@ -1556,28 +1557,29 @@ static int ui_do_but_TOG(uiBlock *block, uiBut *but, int qual)
}
ui_set_but_val(but, (double)lvalue);
if(but->type==ICONTOG) ui_check_but(but);
if(but->type==ICONTOG || but->type==ICONTOGN) ui_check_but(but);
// no frontbuffer draw for this one
if((but->flag & UI_NO_HILITE)==0) ui_draw_but(but);
if(but->type==BUT_TOGDUAL);
else if((but->flag & UI_NO_HILITE)==0) ui_draw_but(but);
}
else {
if(value==0.0) push= 1;
else push= 0;
if(but->type==TOGN) push= !push;
if(but->type==TOGN || but->type==ICONTOGN) push= !push;
ui_set_but_val(but, (double)push);
if(but->type==ICONTOG) ui_check_but(but);
if(but->type==ICONTOG || but->type==ICONTOGN) ui_check_but(but);
// no frontbuffer draw for this one
if((but->flag & UI_NO_HILITE)==0) ui_draw_but(but);
}
/* end local hack... */
if(but->type==BUT_TOGDUAL && qual) {
if(but->type==BUT_TOGDUAL && qual==LR_CTRLKEY) {
if(but->pointype==SHO)
but->poin -= 2;
else if(but->pointype==INT)
but->poin -= 2;
but->poin -= 4;
}
/* no while loop...this button is used for viewmove */
@ -3843,7 +3845,8 @@ static int ui_do_button(uiBlock *block, uiBut *but, uiEvent *uevent)
case TOG:
case TOGR:
case ICONTOG:
case ICONTOG:
case ICONTOGN:
case TOGN:
case BUT_TOGDUAL:
if(uevent->val) {
@ -5353,6 +5356,7 @@ void ui_check_but(uiBut *but)
break;
case ICONTOG:
case ICONTOGN:
if(but->flag & UI_SELECT) but->iconadd= 1;
else but->iconadd= 0;
break;
@ -5446,7 +5450,13 @@ void ui_check_but(uiBut *but)
strcat(but->drawstr, key_event_to_string((short) ui_get_but_val(but)));
}
break;
case BUT_TOGDUAL:
/* trying to get the dual-icon to left of text... not very nice */
if(but->str[0]) {
strcpy(but->drawstr, " ");
strcpy(but->drawstr+2, but->str);
}
break;
default:
strcpy(but->drawstr, but->str);
@ -5812,6 +5822,10 @@ static uiBut *ui_def_but(uiBlock *block, int type, int retval, char *str, short
if ELEM8(but->type, HSVSLI , NUMSLI, MENU, TEX, LABEL, IDPOIN, BLOCK, BUTM) {
but->flag |= UI_TEXT_LEFT;
}
if(but->type==BUT_TOGDUAL) {
but->flag |= UI_ICON_LEFT;
}
if(but->type==ROUNDBOX)
but->flag |= UI_NO_HILITE;

View File

@ -160,10 +160,9 @@ void uiEmboss(float x1, float y1, float x2, float y2, int sel)
/* icons have been standardized... and this call draws in untransformed coordinates */
#define ICON_HEIGHT 16.0f
static void ui_draw_icon(uiBut *but, BIFIconID icon)
static void ui_draw_icon(uiBut *but, BIFIconID icon, int blend)
{
float xs=0, ys=0, aspect, height;
int blend= 0;
/* this icon doesn't need draw... */
if(icon==ICON_BLANK1) return;
@ -184,7 +183,10 @@ static void ui_draw_icon(uiBut *but, BIFIconID icon)
height= ICON_HEIGHT;
if(but->flag & UI_ICON_LEFT) {
if (but->type==BUTM) {
if (but->type==BUT_TOGDUAL && but->drawstr[0]) {
xs= but->x1-1.0;
}
else if (but->type==BUTM ) {
xs= but->x1+1.0;
}
else if ((but->type==ICONROW) || (but->type==ICONTEXTROW)) {
@ -1455,7 +1457,7 @@ static void ui_draw_text_icon(uiBut *but)
/* check for button text label */
if (but->type == ICONTEXTROW) {
ui_draw_icon(but, (BIFIconID) (but->icon+but->iconadd));
ui_draw_icon(but, (BIFIconID) (but->icon+but->iconadd), 0);
}
else {
@ -1514,9 +1516,8 @@ static void ui_draw_text_icon(uiBut *but)
dualset= BTST( *(((short *)but->poin)+1), but->bitnr);
else if(but->pointype==INT)
dualset= BTST( *(((int *)but->poin)+1), but->bitnr);
if(dualset) {
ui_draw_icon(but, ICON_DOT);
}
ui_draw_icon(but, ICON_DOT, dualset?0:-100);
}
if(but->drawstr[0]!=0) {
@ -1531,7 +1532,7 @@ static void ui_draw_text_icon(uiBut *but)
and offset the text label to accomodate it */
if ( (but->flag & UI_HAS_ICON) && (but->flag & UI_ICON_LEFT) ) {
ui_draw_icon(but, but->icon);
ui_draw_icon(but, but->icon, 0);
if(but->flag & UI_TEXT_LEFT) x= but->x1 + but->aspect*BIF_icon_get_width(but->icon)+5.0;
else x= (but->x1+but->x2-but->strwidth+1)/2.0;
@ -1591,7 +1592,7 @@ static void ui_draw_text_icon(uiBut *but)
}
/* if there's no text label, then check to see if there's an icon only and draw it */
else if( but->flag & UI_HAS_ICON ) {
ui_draw_icon(but, (BIFIconID) (but->icon+but->iconadd));
ui_draw_icon(but, (BIFIconID) (but->icon+but->iconadd), 0);
}
}
}
@ -2368,7 +2369,7 @@ void ui_draw_but(uiBut *but)
case LINK:
case INLINK:
ui_draw_icon(but, but->icon);
ui_draw_icon(but, but->icon, 0);
break;
case ROUNDBOX:

View File

@ -362,6 +362,7 @@ static void outliner_sort(SpaceOops *soops, ListBase *lb)
if(totelem>1) {
struct treesort *tear= MEM_mallocN(totelem*sizeof(struct treesort), "tree sort array");
struct treesort *tp=tear;
int skip= 0;
for(te= lb->first; te; te= te->next, tp++) {
tselem= TREESTORE(te);
@ -371,8 +372,12 @@ static void outliner_sort(SpaceOops *soops, ListBase *lb)
if(tselem->type && tselem->type!=TSE_DEFGROUP) tp->idcode= 0; // dont sort this
tp->id= tselem->id;
}
/* keep beginning of list */
for(tp= tear, skip=0; skip<totelem; skip++, tp++)
if(tp->idcode) break;
qsort(tear, totelem, sizeof(struct treesort), treesort_alpha);
if(skip<totelem)
qsort(tear+skip, totelem-skip, sizeof(struct treesort), treesort_alpha);
lb->first=lb->last= NULL;
tp= tear;
@ -389,9 +394,86 @@ static void outliner_sort(SpaceOops *soops, ListBase *lb)
}
}
/* Prototype, see function below */
static void outliner_add_bone(SpaceOops *soops, ListBase *lb,
ID *id, Bone *curBone, TreeElement *parent, int *a);
/* Prototype, see functions below */
static TreeElement *outliner_add_element(SpaceOops *soops, ListBase *lb, void *idv,
TreeElement *parent, short type, short index);
static void outliner_add_passes(SpaceOops *soops, TreeElement *tenla, ID *id, SceneRenderLayer *srl)
{
TreeStoreElem *tselem= TREESTORE(tenla);
TreeElement *te;
te= outliner_add_element(soops, &tenla->subtree, id, tenla, TSE_R_PASS, SCE_PASS_COMBINED);
te->name= "Combined";
te->directdata= &srl->passflag;
/* save cpu cycles, but we add the first to invoke an open/close triangle */
if(tselem->flag & TSE_CLOSED)
return;
te= outliner_add_element(soops, &tenla->subtree, id, tenla, TSE_R_PASS, SCE_PASS_Z);
te->name= "Z";
te->directdata= &srl->passflag;
te= outliner_add_element(soops, &tenla->subtree, id, tenla, TSE_R_PASS, SCE_PASS_VECTOR);
te->name= "Vector";
te->directdata= &srl->passflag;
te= outliner_add_element(soops, &tenla->subtree, id, tenla, TSE_R_PASS, SCE_PASS_NORMAL);
te->name= "Normal";
te->directdata= &srl->passflag;
te= outliner_add_element(soops, &tenla->subtree, id, tenla, TSE_R_PASS, SCE_PASS_INDEXOB);
te->name= "Index Object";
te->directdata= &srl->passflag;
te= outliner_add_element(soops, &tenla->subtree, id, tenla, TSE_R_PASS, SCE_PASS_RGBA);
te->name= "Color";
te->directdata= &srl->passflag;
te= outliner_add_element(soops, &tenla->subtree, id, tenla, TSE_R_PASS, SCE_PASS_DIFFUSE);
te->name= "Diffuse";
te->directdata= &srl->passflag;
te= outliner_add_element(soops, &tenla->subtree, id, tenla, TSE_R_PASS, SCE_PASS_SPEC);
te->name= "Specular";
te->directdata= &srl->passflag;
te= outliner_add_element(soops, &tenla->subtree, id, tenla, TSE_R_PASS, SCE_PASS_SHADOW);
te->name= "Shadow";
te->directdata= &srl->passflag;
te= outliner_add_element(soops, &tenla->subtree, id, tenla, TSE_R_PASS, SCE_PASS_AO);
te->name= "AO";
te->directdata= &srl->passflag;
te= outliner_add_element(soops, &tenla->subtree, id, tenla, TSE_R_PASS, SCE_PASS_REFRACT);
te->name= "Reflection";
te->directdata= &srl->passflag;
te= outliner_add_element(soops, &tenla->subtree, id, tenla, TSE_R_PASS, SCE_PASS_REFLECT);
te->name= "Refraction";
te->directdata= &srl->passflag;
}
/* special handling of hierarchical non-lib data */
static void outliner_add_bone(SpaceOops *soops, ListBase *lb, ID *id, Bone *curBone,
TreeElement *parent, int *a)
{
TreeElement *te= outliner_add_element(soops, lb, id, parent, TSE_BONE, *a);
(*a)++;
te->name= curBone->name;
te->directdata= curBone;
for(curBone= curBone->childbase.first; curBone; curBone=curBone->next) {
outliner_add_bone(soops, &te->subtree, id, curBone, te, a);
}
}
static TreeElement *outliner_add_element(SpaceOops *soops, ListBase *lb, void *idv,
TreeElement *parent, short type, short index)
@ -428,9 +510,28 @@ static TreeElement *outliner_add_element(SpaceOops *soops, ListBase *lb, void *i
case ID_SCE:
{
Scene *sce= (Scene *)id;
SceneRenderLayer *srl;
TreeElement *tenla= outliner_add_element(soops, &te->subtree, sce, te, TSE_R_LAYER_BASE, 0);
int a;
tenla->name= "RenderLayers";
for(a=0, srl= sce->r.layers.first; srl; srl= srl->next, a++) {
TreeElement *tenlay= outliner_add_element(soops, &tenla->subtree, sce, te, TSE_R_LAYER, a);
tenlay->name= srl->name;
tenlay->directdata= &srl->passflag;
if(srl->light_override)
outliner_add_element(soops, &tenlay->subtree, srl->light_override, tenlay, TSE_LINKED_LAMP, 0);
if(srl->mat_override)
outliner_add_element(soops, &tenlay->subtree, srl->mat_override, tenlay, TSE_LINKED_MAT, 0);
outliner_add_passes(soops, tenlay, &sce->id, srl);
}
outliner_add_element(soops, &te->subtree, sce->world, te, 0, 0);
if(sce->scriptlink.scripts) {
TreeElement *tenla= outliner_add_element(soops, &te->subtree, sce, te, TSE_SCRIPT_BASE, 0);
tenla= outliner_add_element(soops, &te->subtree, sce, te, TSE_SCRIPT_BASE, 0);
int a= 0;
tenla->name= "Scripts";
for (a=0; a<sce->scriptlink.totscript; a++) {
@ -781,22 +882,6 @@ static TreeElement *outliner_add_element(SpaceOops *soops, ListBase *lb, void *i
return te;
}
/* special handling of hierarchical non-lib data */
static void outliner_add_bone(SpaceOops *soops, ListBase *lb, ID *id, Bone *curBone,
TreeElement *parent, int *a)
{
TreeElement *te= outliner_add_element(soops, lb, id, parent, TSE_BONE, *a);
(*a)++;
te->name= curBone->name;
te->directdata= curBone;
for(curBone= curBone->childbase.first; curBone; curBone=curBone->next) {
outliner_add_bone(soops, &te->subtree, id, curBone, te, a);
}
}
static void outliner_make_hierarchy(SpaceOops *soops, ListBase *lb)
{
TreeElement *te, *ten, *tep;
@ -1777,7 +1862,7 @@ static int do_outliner_mouse_event(SpaceOops *soops, TreeElement *te, short even
if(event==LEFTMOUSE) {
if (G.qual & LR_CTRLKEY) {
if(ELEM5(tselem->type, TSE_NLA, TSE_DEFGROUP_BASE, TSE_CONSTRAINT_BASE, TSE_MODIFIER_BASE, TSE_SCRIPT_BASE))
if(ELEM8(tselem->type, TSE_NLA, TSE_DEFGROUP_BASE, TSE_CONSTRAINT_BASE, TSE_MODIFIER_BASE, TSE_SCRIPT_BASE, TSE_POSE_BASE, TSE_R_LAYER_BASE, TSE_R_PASS))
error("Cannot edit builtin name");
else if(tselem->id->lib)
error("Cannot edit Library Data");
@ -1902,11 +1987,13 @@ static TreeElement *outliner_find_id(SpaceOops *soops, ListBase *lb, ID *id)
for(te= lb->first; te; te= te->next) {
tselem= TREESTORE(te);
if(tselem->id==id) return te;
/* only deeper on scene or object */
if( te->idcode==ID_OB || te->idcode==ID_SCE) {
tes= outliner_find_id(soops, &te->subtree, id);
if(tes) return tes;
if(tselem->type==0) {
if(tselem->id==id) return te;
/* only deeper on scene or object */
if( te->idcode==ID_OB || te->idcode==ID_SCE) {
tes= outliner_find_id(soops, &te->subtree, id);
if(tes) return tes;
}
}
}
return NULL;
@ -2686,6 +2773,15 @@ static void tselem_draw_icon(float x, float y, TreeStoreElem *tselem, TreeElemen
BIF_icon_draw(x, y, ICON_WPAINT_DEHLT); break;
case TSE_PROXY:
BIF_icon_draw(x, y, ICON_GHOST); break;
case TSE_R_LAYER_BASE:
BIF_icon_draw(x, y, ICON_RESTRICT_RENDER_OFF); break;
case TSE_R_LAYER:
BIF_icon_draw(x, y, ICON_IMAGE_DEHLT); break;
case TSE_LINKED_LAMP:
BIF_icon_draw(x, y, ICON_LAMP_DEHLT); break;
case TSE_LINKED_MAT:
BIF_icon_draw(x, y, ICON_MATERIAL_DEHLT); break;
#ifdef WITH_VERSE
case ID_VS:
case ID_MS:
@ -2783,7 +2879,9 @@ static void outliner_draw_iconrow(SpaceOops *soops, ListBase *lb, int level, int
(*offsx) += OL_X;
}
outliner_draw_iconrow(soops, &te->subtree, level+1, offsx, ys);
/* this tree element always has same amount of branches, so dont draw */
if(tselem->type!=TSE_R_LAYER)
outliner_draw_iconrow(soops, &te->subtree, level+1, offsx, ys);
}
}
@ -2895,7 +2993,7 @@ static void outliner_draw_tree_element(SpaceOops *soops, TreeElement *te, int st
}
/* open/close icon, only when sublevels, except for scene */
if(te->subtree.first || te->idcode==ID_SCE) {
if(te->subtree.first || (te->idcode==ID_SCE && tselem->type==0)) {
int icon_x;
if((tselem->type==0 && ELEM(te->idcode, ID_OB, ID_SCE)) || ELEM4(te->idcode,ID_VN,ID_VS, ID_MS, ID_SS))
icon_x = startx;
@ -2961,7 +3059,7 @@ static void outliner_draw_tree_element(SpaceOops *soops, TreeElement *te, int st
offsx+= OL_X + BIF_GetStringWidth(G.font, server_buf, 0);
}
#endif
else {
else if(tselem->type!=TSE_R_LAYER) { /* this tree element always has same amount of branches, so dont draw */
int tempx= startx+offsx;
// divider
BIF_ThemeColorShade(TH_BACK, -40);
@ -2969,7 +3067,9 @@ static void outliner_draw_tree_element(SpaceOops *soops, TreeElement *te, int st
glEnable(GL_BLEND);
glPixelTransferf(GL_ALPHA_SCALE, 0.5);
outliner_draw_iconrow(soops, &te->subtree, 0, &tempx, *starty+2);
glPixelTransferf(GL_ALPHA_SCALE, 1.0);
glDisable(GL_BLEND);
}
@ -3178,6 +3278,12 @@ static void restrictbutton_rend_cb(void *poin, void *poin2)
allqueue(REDRAWVIEW3D, 0);
}
static void restrictbutton_r_lay_cb(void *poin, void *poin2)
{
allqueue(REDRAWOOPS, 0);
allqueue(REDRAWBUTSSCENE, 0);
}
static void namebutton_cb(void *tep, void *oldnamep)
{
SpaceOops *soops= curarea->spacedata.first;
@ -3251,7 +3357,10 @@ static void namebutton_cb(void *tep, void *oldnamep)
allqueue(REDRAWVIEW3D, 1);
allqueue(REDRAWBUTSEDIT, 0);
break;
case TSE_R_LAYER:
allqueue(REDRAWOOPS, 0);
allqueue(REDRAWBUTSSCENE, 0);
break;
}
}
}
@ -3292,8 +3401,9 @@ static void outliner_buttons(uiBlock *block, SpaceOops *soops, ListBase *lb)
}
if (!(soops->flag & SO_HIDE_RESTRICTCOLS)) {
/* objects have toggle-able restriction flags */
if(tselem->type==0 && te->idcode==ID_OB) {
/* only objects have toggle-able flags */
ob = (Object *)tselem->id;
uiBlockSetEmboss(block, UI_EMBOSSN);
@ -3313,7 +3423,33 @@ static void outliner_buttons(uiBlock *block, SpaceOops *soops, ListBase *lb)
uiButSetFlag(bt, UI_NO_HILITE);
uiBlockSetEmboss(block, UI_EMBOSS);
}
/* scene render layers and passes have toggle-able flags too! */
else if(tselem->type==TSE_R_LAYER) {
uiBlockSetEmboss(block, UI_EMBOSSN);
bt= uiDefIconButBitI(block, ICONTOGN, SCE_LAY_DISABLE, REDRAWBUTSSCENE, ICON_CHECKBOX_HLT-1,
(int)soops->v2d.mask.xmax-(OL_TOG_RESTRICT_VIEWX+SCROLLB), te->ys, 17, OL_H-1, te->directdata, 0, 0, 0, 0, "Render this RenderLayer");
uiButSetFunc(bt, restrictbutton_r_lay_cb, NULL, NULL);
uiBlockSetEmboss(block, UI_EMBOSS);
}
else if(tselem->type==TSE_R_PASS) {
int *layflag= te->directdata;
uiBlockSetEmboss(block, UI_EMBOSSN);
/* NOTE: tselem->nr is short! */
bt= uiDefIconButBitI(block, ICONTOG, tselem->nr, REDRAWBUTSSCENE, ICON_CHECKBOX_HLT-1,
(int)soops->v2d.mask.xmax-(OL_TOG_RESTRICT_VIEWX+SCROLLB), te->ys, 17, OL_H-1, layflag, 0, 0, 0, 0, "Render this Pass");
uiButSetFunc(bt, restrictbutton_r_lay_cb, NULL, NULL);
layflag++; /* is lay_xor */
if(ELEM6(tselem->nr, SCE_PASS_SPEC, SCE_PASS_SHADOW, SCE_PASS_AO, SCE_PASS_REFLECT, SCE_PASS_REFRACT, SCE_PASS_RADIO))
bt= uiDefIconButBitI(block, TOG, tselem->nr, REDRAWBUTSSCENE, (*layflag & tselem->nr)?ICON_DOT:ICON_BLANK1,
(int)soops->v2d.mask.xmax-(OL_TOG_RESTRICT_SELECTX+SCROLLB), te->ys, 17, OL_H-1, layflag, 0, 0, 0, 0, "Exclude this Pass from Combined");
uiButSetFunc(bt, restrictbutton_r_lay_cb, NULL, NULL);
uiBlockSetEmboss(block, UI_EMBOSS);
}
}