static void bake_displacement(void *handle, ShadeInput *UNUSED(shi), float dist, int x, int y) { BakeShade *bs = handle; float disp; if (R.r.bake_flag & R_BAKE_NORMALIZE) { if (R.r.bake_maxdist) disp = (dist + R.r.bake_maxdist) / (R.r.bake_maxdist * 2); /* alter the range from [-bake_maxdist, bake_maxdist] to [0, 1]*/ else disp = dist; } else { disp = 0.5f + dist; /* alter the range from [-0.5,0.5] to [0,1]*/ } if (bs->displacement_buffer) { float *displacement = bs->displacement_buffer + (bs->rectx * y + x); *displacement = disp; bs->displacement_min = min_ff(bs->displacement_min, disp); bs->displacement_max = max_ff(bs->displacement_max, disp); } if (bs->rect_float && !bs->vcol) { float *col = bs->rect_float + 4 * (bs->rectx * y + x); col[0] = col[1] = col[2] = disp; col[3] = 1.0f; } else { /* Target is char (LDR). */ unsigned char col[4]; col[0] = col[1] = col[2] = FTOCHAR(disp); col[3] = 255; if (bs->vcol) { /* Vertex color baking. Vcol has no useful alpha channel (it exists * but is used only for vertex painting). */ bs->vcol->r = col[0]; bs->vcol->g = col[1]; bs->vcol->b = col[2]; } else { char *imcol = (char *)(bs->rect + bs->rectx * y + x); copy_v4_v4_char((char *)imcol, (char *)col); } } if (bs->rect_mask) { bs->rect_mask[bs->rectx * y + x] = FILTER_MASK_USED; } }
MINLINE void blend_color_add_alpha_byte(unsigned char dst[4], const unsigned char src1[4], const unsigned char src2[4]) { if (src2[3] != 0) { /* straight so just modify alpha channel */ const int t = src2[3]; dst[0] = src1[0]; dst[1] = src1[1]; dst[2] = src1[2]; dst[3] = (unsigned char)min_ii(src1[3] + divide_round_i(t * src2[3], 255), 255); } else { /* no op */ copy_v4_v4_char((char *)dst, (char *)src1); } }
MINLINE void blend_color_add_byte(unsigned char dst[4], const unsigned char src1[4], const unsigned char src2[4]) { if (src2[3] != 0) { /* straight add operation */ const int t = src2[3]; int tmp[3]; tmp[0] = (src1[0] * 255) + (src2[0] * t); tmp[1] = (src1[1] * 255) + (src2[1] * t); tmp[2] = (src1[2] * 255) + (src2[2] * t); dst[0] = (unsigned char)min_ii(divide_round_i(tmp[0], 255), 255); dst[1] = (unsigned char)min_ii(divide_round_i(tmp[1], 255), 255); dst[2] = (unsigned char)min_ii(divide_round_i(tmp[2], 255), 255); dst[3] = src1[3]; } else { /* no op */ copy_v4_v4_char((char *)dst, (char *)src1); } }
MINLINE void blend_color_darken_byte(unsigned char dst[4], const unsigned char src1[4], const unsigned char src2[4]) { if (src2[3] != 0) { /* straight darken operation */ const int t = src2[3]; const int mt = 255 - t; int tmp[3]; tmp[0] = (mt * src1[0]) + (t * min_ii(src1[0], src2[0])); tmp[1] = (mt * src1[1]) + (t * min_ii(src1[1], src2[1])); tmp[2] = (mt * src1[2]) + (t * min_ii(src1[2], src2[2])); dst[0] = (unsigned char)divide_round_i(tmp[0], 255); dst[1] = (unsigned char)divide_round_i(tmp[1], 255); dst[2] = (unsigned char)divide_round_i(tmp[2], 255); dst[3] = src1[3]; } else { /* no op */ copy_v4_v4_char((char *)dst, (char *)src1); } }
static void bake_shade(void *handle, Object *ob, ShadeInput *shi, int UNUSED(quad), int x, int y, float UNUSED(u), float UNUSED(v), float *tvn, float *ttang) { BakeShade *bs = handle; ShadeSample *ssamp = &bs->ssamp; ShadeResult shr; VlakRen *vlr = shi->vlr; shade_input_init_material(shi); if (bs->type == RE_BAKE_AO) { ambient_occlusion(shi); if (R.r.bake_flag & R_BAKE_NORMALIZE) { copy_v3_v3(shr.combined, shi->ao); } else { zero_v3(shr.combined); environment_lighting_apply(shi, &shr); } } 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); /* only do AO for a full bake (and obviously AO bakes) * AO for light bakes is a leftover and might not be needed */ if (ELEM3(bs->type, RE_BAKE_ALL, RE_BAKE_AO, RE_BAKE_LIGHT)) shade_samples_do_AO(ssamp); if (shi->mat->nodetree && shi->mat->use_nodes) { ntreeShaderExecTree(shi->mat->nodetree, shi, &shr); shi->mat = vlr->mat; /* shi->mat is being set in nodetree */ } else shade_material_loop(shi, &shr); if (bs->type == RE_BAKE_NORMALS) { float nor[3]; copy_v3_v3(nor, shi->vn); if (R.r.bake_normal_space == R_BAKE_SPACE_CAMERA) { /* pass */ } else if (R.r.bake_normal_space == R_BAKE_SPACE_TANGENT) { float mat[3][3], imat[3][3]; /* bitangent */ if (tvn && ttang) { copy_v3_v3(mat[0], ttang); cross_v3_v3v3(mat[1], tvn, ttang); mul_v3_fl(mat[1], ttang[3]); copy_v3_v3(mat[2], tvn); } else { copy_v3_v3(mat[0], shi->nmaptang); cross_v3_v3v3(mat[1], shi->nmapnorm, shi->nmaptang); mul_v3_fl(mat[1], shi->nmaptang[3]); copy_v3_v3(mat[2], shi->nmapnorm); } invert_m3_m3(imat, mat); mul_m3_v3(imat, nor); } else if (R.r.bake_normal_space == R_BAKE_SPACE_OBJECT) mul_mat3_m4_v3(ob->imat_ren, nor); /* ob->imat_ren includes viewinv! */ else if (R.r.bake_normal_space == R_BAKE_SPACE_WORLD) mul_mat3_m4_v3(R.viewinv, nor); normalize_v3(nor); /* in case object has scaling */ /* The invert of the red channel is to make * the normal map compliant with the outside world. * It needs to be done because in Blender * the normal used in the renderer points inward. It is generated * this way in calc_vertexnormals(). Should this ever change * this negate must be removed. */ shr.combined[0] = (-nor[0]) / 2.0f + 0.5f; shr.combined[1] = nor[1] / 2.0f + 0.5f; shr.combined[2] = nor[2] / 2.0f + 0.5f; } else if (bs->type == RE_BAKE_TEXTURE) { copy_v3_v3(shr.combined, &shi->r); shr.alpha = shi->alpha; } else if (bs->type == RE_BAKE_SHADOW) { copy_v3_v3(shr.combined, shr.shad); shr.alpha = shi->alpha; } else if (bs->type == RE_BAKE_SPEC_COLOR) { copy_v3_v3(shr.combined, &shi->specr); shr.alpha = 1.0f; } else if (bs->type == RE_BAKE_SPEC_INTENSITY) { copy_v3_fl(shr.combined, shi->spec); shr.alpha = 1.0f; } else if (bs->type == RE_BAKE_MIRROR_COLOR) { copy_v3_v3(shr.combined, &shi->mirr); shr.alpha = 1.0f; } else if (bs->type == RE_BAKE_MIRROR_INTENSITY) { copy_v3_fl(shr.combined, shi->ray_mirror); shr.alpha = 1.0f; } else if (bs->type == RE_BAKE_ALPHA) { copy_v3_fl(shr.combined, shi->alpha); shr.alpha = 1.0f; } else if (bs->type == RE_BAKE_EMIT) { copy_v3_fl(shr.combined, shi->emit); shr.alpha = 1.0f; } else if (bs->type == RE_BAKE_VERTEX_COLORS) { copy_v3_v3(shr.combined, shi->vcol); shr.alpha = shi->vcol[3]; } } if (bs->rect_float && !bs->vcol) { float *col = bs->rect_float + 4 * (bs->rectx * y + x); copy_v3_v3(col, shr.combined); if (bs->type == RE_BAKE_ALL || bs->type == RE_BAKE_TEXTURE || bs->type == RE_BAKE_VERTEX_COLORS) { col[3] = shr.alpha; } else { col[3] = 1.0; } } else { /* Target is char (LDR). */ unsigned char col[4]; if (ELEM(bs->type, RE_BAKE_ALL, RE_BAKE_TEXTURE)) { float rgb[3]; copy_v3_v3(rgb, shr.combined); if (R.scene_color_manage) { /* Vertex colors have no way to specify color space, so they * default to sRGB. */ if (!bs->vcol) IMB_colormanagement_scene_linear_to_colorspace_v3(rgb, bs->rect_colorspace); else linearrgb_to_srgb_v3_v3(rgb, rgb); } rgb_float_to_uchar(col, rgb); } else { rgb_float_to_uchar(col, shr.combined); } if (ELEM3(bs->type, RE_BAKE_ALL, RE_BAKE_TEXTURE, RE_BAKE_VERTEX_COLORS)) { col[3] = FTOCHAR(shr.alpha); } else { col[3] = 255; } if (bs->vcol) { /* Vertex color baking. Vcol has no useful alpha channel (it exists * but is used only for vertex painting). */ bs->vcol->r = col[0]; bs->vcol->g = col[1]; bs->vcol->b = col[2]; } else { unsigned char *imcol = (unsigned char *)(bs->rect + bs->rectx * y + x); copy_v4_v4_char((char *)imcol, (char *)col); } } if (bs->rect_mask) { bs->rect_mask[bs->rectx * y + x] = FILTER_MASK_USED; } if (bs->do_update) { *bs->do_update = true; } }
static void do_versions_theme(const UserDef *userdef, bTheme *btheme) { #define USER_VERSION_ATLEAST(ver, subver) MAIN_VERSION_ATLEAST(userdef, ver, subver) if (!USER_VERSION_ATLEAST(280, 20)) { memcpy(btheme, &U_theme_default, sizeof(*btheme)); } #define FROM_DEFAULT_V4_UCHAR(member) copy_v4_v4_char(btheme->member, U_theme_default.member) if (!USER_VERSION_ATLEAST(280, 25)) { copy_v4_v4_char(btheme->space_action.anim_preview_range, btheme->space_action.anim_active); copy_v4_v4_char(btheme->space_nla.anim_preview_range, btheme->space_nla.anim_active); copy_v4_v4_char(btheme->space_graph.anim_preview_range, btheme->space_action.anim_active); } if (!USER_VERSION_ATLEAST(280, 26)) { FROM_DEFAULT_V4_UCHAR(tui.icon_collection); FROM_DEFAULT_V4_UCHAR(tui.icon_object); FROM_DEFAULT_V4_UCHAR(tui.icon_object_data); FROM_DEFAULT_V4_UCHAR(tui.icon_modifier); FROM_DEFAULT_V4_UCHAR(tui.icon_shading); } if (!USER_VERSION_ATLEAST(280, 27)) { FROM_DEFAULT_V4_UCHAR(space_action.shade2); FROM_DEFAULT_V4_UCHAR(space_action.hilite); FROM_DEFAULT_V4_UCHAR(space_action.group); FROM_DEFAULT_V4_UCHAR(space_action.group_active); FROM_DEFAULT_V4_UCHAR(space_action.strip_select); FROM_DEFAULT_V4_UCHAR(space_action.ds_channel); FROM_DEFAULT_V4_UCHAR(space_action.ds_subchannel); FROM_DEFAULT_V4_UCHAR(space_action.keytype_movehold); FROM_DEFAULT_V4_UCHAR(space_action.keytype_movehold_select); } if (!USER_VERSION_ATLEAST(280, 28)) { FROM_DEFAULT_V4_UCHAR(space_action.ds_ipoline); } if (!USER_VERSION_ATLEAST(280, 29)) { FROM_DEFAULT_V4_UCHAR(space_properties.navigation_bar); } if (!USER_VERSION_ATLEAST(280, 31)) { FROM_DEFAULT_V4_UCHAR(space_clip.list_text); } if (!USER_VERSION_ATLEAST(280, 36)) { FROM_DEFAULT_V4_UCHAR(tui.wcol_state.inner_changed); FROM_DEFAULT_V4_UCHAR(tui.wcol_state.inner_changed_sel); } if (!USER_VERSION_ATLEAST(280, 39)) { FROM_DEFAULT_V4_UCHAR(space_clip.metadatabg); FROM_DEFAULT_V4_UCHAR(space_clip.metadatatext); } if (!USER_VERSION_ATLEAST(280, 40)) { FROM_DEFAULT_V4_UCHAR(space_preferences.navigation_bar); copy_v4_v4_char(btheme->space_preferences.execution_buts, btheme->space_preferences.navigation_bar); } if (!USER_VERSION_ATLEAST(280, 41)) { FROM_DEFAULT_V4_UCHAR(space_view3d.back); } if (!USER_VERSION_ATLEAST(280, 52)) { FROM_DEFAULT_V4_UCHAR(space_info.info_info); } if (!USER_VERSION_ATLEAST(280, 64)) { FROM_DEFAULT_V4_UCHAR(tui.icon_scene); if (btheme->space_view3d.obcenter_dia == 0) { btheme->space_view3d.obcenter_dia = U_theme_default.space_view3d.obcenter_dia; } FROM_DEFAULT_V4_UCHAR(space_graph.text); FROM_DEFAULT_V4_UCHAR(space_action.text); FROM_DEFAULT_V4_UCHAR(space_nla.text); FROM_DEFAULT_V4_UCHAR(space_sequencer.text); FROM_DEFAULT_V4_UCHAR(space_clip.text); FROM_DEFAULT_V4_UCHAR(space_graph.time_scrub_background); FROM_DEFAULT_V4_UCHAR(space_action.time_scrub_background); FROM_DEFAULT_V4_UCHAR(space_nla.time_scrub_background); FROM_DEFAULT_V4_UCHAR(space_sequencer.time_scrub_background); FROM_DEFAULT_V4_UCHAR(space_clip.time_scrub_background); } if (!USER_VERSION_ATLEAST(280, 67)) { FROM_DEFAULT_V4_UCHAR(space_outliner.selected_object); FROM_DEFAULT_V4_UCHAR(space_outliner.active_object); FROM_DEFAULT_V4_UCHAR(space_outliner.edited_object); FROM_DEFAULT_V4_UCHAR(space_outliner.row_alternate); } /** * Include next version bump. */ { } #undef FROM_DEFAULT_V4_UCHAR #undef USER_VERSION_ATLEAST }