forked from bartvdbraak/blender
Added shadow baking
This commit is contained in:
parent
f2407fec55
commit
49abcc980c
@ -2048,7 +2048,7 @@ static int RenderData_setIValueAttrClamp( BPy_RenderData *self, PyObject *value,
|
||||
break;
|
||||
case EXPP_RENDER_ATTR_BAKEMODE:
|
||||
min = RE_BAKE_LIGHT;
|
||||
max = RE_BAKE_DISPLACEMENT;
|
||||
max = RE_BAKE_SHADOW;
|
||||
size = 'h';
|
||||
param = &self->renderContext->bake_mode;
|
||||
break;
|
||||
@ -3781,6 +3781,7 @@ static PyObject *M_Render_BakeModesDict( void )
|
||||
PyConstant_Insert( d, "NORMALS", PyInt_FromLong( RE_BAKE_NORMALS ) );
|
||||
PyConstant_Insert( d, "TEXTURE", PyInt_FromLong( RE_BAKE_TEXTURE ) );
|
||||
PyConstant_Insert( d, "DISPLACEMENT", PyInt_FromLong( RE_BAKE_DISPLACEMENT ) );
|
||||
PyConstant_Insert( d, "SHADOW", PyInt_FromLong( RE_BAKE_SHADOW ) );
|
||||
}
|
||||
return M;
|
||||
}
|
||||
|
@ -220,6 +220,8 @@ void RE_zbuf_accumulate_vecblur(struct NodeBlurData *nbd, int xsize, int ysize,
|
||||
#define RE_BAKE_NORMALS 3
|
||||
#define RE_BAKE_TEXTURE 4
|
||||
#define RE_BAKE_DISPLACEMENT 5
|
||||
#define RE_BAKE_SHADOW 6
|
||||
|
||||
void RE_Database_Baking(struct Render *re, struct Scene *scene, int type, struct Object *actob);
|
||||
|
||||
void RE_DataBase_GetView(struct Render *re, float mat[][4]);
|
||||
|
@ -5419,6 +5419,7 @@ void RE_Database_FromScene_Vectors(Render *re, Scene *sce)
|
||||
RE_BAKE_AO: for baking, no lamps, but all objects
|
||||
RE_BAKE_TEXTURE:for baking, no lamps, only selected objects
|
||||
RE_BAKE_DISPLACEMENT:for baking, no lamps, only selected objects
|
||||
RE_BAKE_SHADOW: for baking, only shadows, but all objects
|
||||
*/
|
||||
void RE_Database_Baking(Render *re, Scene *scene, int type, Object *actob)
|
||||
{
|
||||
@ -5449,6 +5450,10 @@ void RE_Database_Baking(Render *re, Scene *scene, int type, Object *actob)
|
||||
re->r.mode &= ~R_RAYTRACE;
|
||||
}
|
||||
|
||||
if(!actob && (type==RE_BAKE_SHADOW)) {
|
||||
re->r.mode |= R_SHADOW;
|
||||
}
|
||||
|
||||
/* setup render stuff */
|
||||
re->memArena = BLI_memarena_new(BLI_MEMARENA_STD_BUFSIZE);
|
||||
|
||||
@ -5486,7 +5491,7 @@ void RE_Database_Baking(Render *re, Scene *scene, int type, Object *actob)
|
||||
set_node_shader_lamp_loop(shade_material_loop);
|
||||
|
||||
/* MAKE RENDER DATA */
|
||||
nolamps= !ELEM(type, RE_BAKE_LIGHT, RE_BAKE_ALL);
|
||||
nolamps= !ELEM3(type, RE_BAKE_LIGHT, RE_BAKE_ALL, RE_BAKE_SHADOW);
|
||||
onlyselected= ELEM3(type, RE_BAKE_NORMALS, RE_BAKE_TEXTURE, RE_BAKE_DISPLACEMENT);
|
||||
|
||||
database_init_objects(re, lay, nolamps, onlyselected, actob, 0);
|
||||
|
@ -2017,9 +2017,12 @@ static void bake_shade(void *handle, Object *ob, ShadeInput *shi, int quad, int
|
||||
ambient_occlusion_to_diffuse(shi, shr.combined);
|
||||
}
|
||||
else {
|
||||
if (bs->type==RE_BAKE_SHADOW) /* Why do shadows set the color anyhow?, ignore material color for baking */
|
||||
shi->r = shi->g = shi->b = 1.0f;
|
||||
|
||||
shade_input_set_shade_texco(shi);
|
||||
|
||||
if(!ELEM(bs->type, RE_BAKE_NORMALS, RE_BAKE_TEXTURE))
|
||||
if(!ELEM3(bs->type, RE_BAKE_NORMALS, RE_BAKE_TEXTURE, RE_BAKE_SHADOW))
|
||||
shade_samples_do_AO(ssamp);
|
||||
|
||||
if(shi->mat->nodetree && shi->mat->use_nodes) {
|
||||
@ -2070,6 +2073,10 @@ static void bake_shade(void *handle, Object *ob, ShadeInput *shi, int quad, int
|
||||
shr.combined[2]= shi->b;
|
||||
shr.alpha = shi->alpha;
|
||||
}
|
||||
else if(bs->type==RE_BAKE_SHADOW) {
|
||||
VECCOPY(shr.combined, shr.shad);
|
||||
shr.alpha = shi->alpha;
|
||||
}
|
||||
}
|
||||
|
||||
if(bs->rect_float) {
|
||||
@ -2505,7 +2512,12 @@ int RE_bake_shade_all_selected(Render *re, int type, Object *actob)
|
||||
memset(&handles[a], 0, sizeof(BakeShade));
|
||||
|
||||
handles[a].ssamp.shi[0].lay= re->scene->lay;
|
||||
handles[a].ssamp.shi[0].passflag= SCE_PASS_COMBINED;
|
||||
|
||||
if (type==RE_BAKE_SHADOW) {
|
||||
handles[a].ssamp.shi[0].passflag= SCE_PASS_SHADOW;
|
||||
} else {
|
||||
handles[a].ssamp.shi[0].passflag= SCE_PASS_COMBINED;
|
||||
}
|
||||
handles[a].ssamp.shi[0].combinedflag= ~(SCE_PASS_SPEC);
|
||||
handles[a].ssamp.shi[0].thread= a;
|
||||
handles[a].ssamp.tot= 1;
|
||||
|
@ -2152,7 +2152,7 @@ static void render_panel_bake(void)
|
||||
}
|
||||
|
||||
uiDefButS(block, MENU, B_NOP, "Quad Split Order%t|Quad Split Auto%x0|Quad Split A (0,1,2) (0,2,3)%x1|Quad Split B (1,2,3) (1,3,0)%x2",
|
||||
10,30,190,20, &G.scene->r.bake_quad_split, 0, 0, 0, 0, "Method to divide quads (use A or B for external applications that use a fixed order)");
|
||||
10,10,190,20, &G.scene->r.bake_quad_split, 0, 0, 0, 0, "Method to divide quads (use A or B for external applications that use a fixed order)");
|
||||
|
||||
#if 0
|
||||
uiBlockBeginAlign(block);
|
||||
@ -2165,14 +2165,15 @@ static void render_panel_bake(void)
|
||||
uiBlockBeginAlign(block);
|
||||
uiDefButS(block, ROW,B_REDR,"Full Render", 210,170,120,20,&G.scene->r.bake_mode, 1.0, RE_BAKE_ALL, 0, 0, "");
|
||||
uiDefButS(block, ROW,B_REDR,"Ambient Occlusion",210,150,120,20,&G.scene->r.bake_mode, 1.0, RE_BAKE_AO, 0, 0, "");
|
||||
uiDefButS(block, ROW,B_REDR,"Normals", 210,130,120,20,&G.scene->r.bake_mode, 1.0, RE_BAKE_NORMALS, 0, 0, "");
|
||||
uiDefButS(block, ROW,B_REDR,"Textures", 210,110,120,20,&G.scene->r.bake_mode, 1.0, RE_BAKE_TEXTURE, 0, 0, "");
|
||||
uiDefButS(block, ROW,B_REDR,"Displacement", 210,90,120,20,&G.scene->r.bake_mode, 1.0, RE_BAKE_DISPLACEMENT, 0, 0, "");
|
||||
uiDefButS(block, ROW,B_REDR,"Shadow", 210,130,120,20,&G.scene->r.bake_mode, 1.0, RE_BAKE_SHADOW, 0, 0, "");
|
||||
uiDefButS(block, ROW,B_REDR,"Normals", 210,110,120,20,&G.scene->r.bake_mode, 1.0, RE_BAKE_NORMALS, 0, 0, "");
|
||||
uiDefButS(block, ROW,B_REDR,"Textures", 210,90,120,20,&G.scene->r.bake_mode, 1.0, RE_BAKE_TEXTURE, 0, 0, "");
|
||||
uiDefButS(block, ROW,B_REDR,"Displacement", 210,70,120,20,&G.scene->r.bake_mode, 1.0, RE_BAKE_DISPLACEMENT, 0, 0, "");
|
||||
uiBlockEndAlign(block);
|
||||
|
||||
uiDefButBitS(block, TOG, R_BAKE_CLEAR, B_DIFF, "Clear", 210,60,120,20,&G.scene->r.bake_flag, 0.0, 0, 0, 0, "Clear Images before baking");
|
||||
uiDefButBitS(block, TOG, R_BAKE_CLEAR, B_DIFF, "Clear", 210,40,120,20,&G.scene->r.bake_flag, 0.0, 0, 0, 0, "Clear Images before baking");
|
||||
|
||||
uiDefButS(block, NUM, B_DIFF,"Margin:", 210,30,120,20,&G.scene->r.bake_filter, 0.0, 32.0, 0, 0, "Amount of pixels to extend the baked result with, as post process filter");
|
||||
uiDefButS(block, NUM, B_DIFF,"Margin:", 210,10,120,20,&G.scene->r.bake_filter, 0.0, 32.0, 0, 0, "Amount of pixels to extend the baked result with, as post process filter");
|
||||
}
|
||||
|
||||
static void render_panel_simplify(void)
|
||||
|
@ -1026,7 +1026,7 @@ void objects_bake_render_menu(void)
|
||||
{
|
||||
short event;
|
||||
|
||||
event= pupmenu("Bake Selected Meshes %t|Full Render %x1|Ambient Occlusion %x2|Normals %x3|Texture Only %x4|Displacement %x5");
|
||||
event= pupmenu("Bake Selected Meshes %t|Full Render %x1|Ambient Occlusion %x2|Normals %x3|Texture Only %x4|Displacement %x5|Shadow %x6");
|
||||
if (event < 1) return;
|
||||
objects_bake_render_ui(event);
|
||||
}
|
||||
@ -1062,7 +1062,8 @@ void objects_bake_render(short event, char **error_msg)
|
||||
else if(event==2) event= RE_BAKE_AO;
|
||||
else if(event==3) event= RE_BAKE_NORMALS;
|
||||
else if(event==4) event= RE_BAKE_TEXTURE;
|
||||
else event= RE_BAKE_DISPLACEMENT;
|
||||
else if(event==5) event= RE_BAKE_DISPLACEMENT;
|
||||
else event= RE_BAKE_SHADOW;
|
||||
|
||||
if(event==RE_BAKE_AO) {
|
||||
if(G.scene->world==NULL) {
|
||||
|
Loading…
Reference in New Issue
Block a user