Changeset View
Changeset View
Standalone View
Standalone View
source/blender/editors/object/object_bake_api.c
| Show First 20 Lines • Show All 699 Lines • ▼ Show 20 Lines | else { | ||||
| return 0; | return 0; | ||||
| } | } | ||||
| BKE_image_release_ibuf(bk_image->image, ibuf, lock); | BKE_image_release_ibuf(bk_image->image, ibuf, lock); | ||||
| } | } | ||||
| return tot_size; | return tot_size; | ||||
| } | } | ||||
| /* create new mesh with edit mode changes and modifiers applied */ | /* create new mesh with edit mode changes and modifiers applied */ | ||||
| static Mesh *bake_mesh_new_from_object(Depsgraph *depsgraph, Main *bmain, Scene *scene, Object *ob) | static Mesh *bake_mesh_new_from_object(Main *bmain, Object *object) | ||||
| { | { | ||||
| bool apply_modifiers = (ob->type != OB_MESH); | Mesh *me = BKE_mesh_new_from_object(bmain, object); | ||||
| Mesh *me = BKE_mesh_new_from_object(depsgraph, bmain, scene, ob, apply_modifiers, false); | |||||
| if (me->flag & ME_AUTOSMOOTH) { | if (me->flag & ME_AUTOSMOOTH) { | ||||
| BKE_mesh_split_faces(me, true); | BKE_mesh_split_faces(me, true); | ||||
| } | } | ||||
| return me; | return me; | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 179 Lines • ▼ Show 20 Lines | if (pass_type == SCE_PASS_NORMAL && normal_space == R_BAKE_SPACE_TANGENT && | ||||
| } | } | ||||
| } | } | ||||
| /* Make sure depsgraph is up to date. */ | /* Make sure depsgraph is up to date. */ | ||||
| BKE_scene_graph_update_tagged(depsgraph, bmain); | BKE_scene_graph_update_tagged(depsgraph, bmain); | ||||
| ob_low_eval = DEG_get_evaluated_object(depsgraph, ob_low); | ob_low_eval = DEG_get_evaluated_object(depsgraph, ob_low); | ||||
| /* get the mesh as it arrives in the renderer */ | /* get the mesh as it arrives in the renderer */ | ||||
| me_low = bake_mesh_new_from_object(depsgraph, bmain, scene, ob_low_eval); | me_low = bake_mesh_new_from_object(bmain, ob_low_eval); | ||||
| /* populate the pixel array with the face data */ | /* populate the pixel array with the face data */ | ||||
| if ((is_selected_to_active && (ob_cage == NULL) && is_cage) == false) { | if ((is_selected_to_active && (ob_cage == NULL) && is_cage) == false) { | ||||
| RE_bake_pixels_populate(me_low, pixel_array_low, num_pixels, &bake_images, uv_layer); | RE_bake_pixels_populate(me_low, pixel_array_low, num_pixels, &bake_images, uv_layer); | ||||
| } | } | ||||
| /* else populate the pixel array with the 'cage' mesh (the smooth version of the mesh) */ | /* else populate the pixel array with the 'cage' mesh (the smooth version of the mesh) */ | ||||
| if (is_selected_to_active) { | if (is_selected_to_active) { | ||||
| CollectionPointerLink *link; | CollectionPointerLink *link; | ||||
| int i = 0; | int i = 0; | ||||
| /* prepare cage mesh */ | /* prepare cage mesh */ | ||||
| if (ob_cage) { | if (ob_cage) { | ||||
| me_cage = bake_mesh_new_from_object(depsgraph, bmain, scene, ob_cage_eval); | me_cage = bake_mesh_new_from_object(bmain, ob_cage_eval); | ||||
| if ((me_low->totpoly != me_cage->totpoly) || (me_low->totloop != me_cage->totloop)) { | if ((me_low->totpoly != me_cage->totpoly) || (me_low->totloop != me_cage->totloop)) { | ||||
| BKE_report(reports, | BKE_report(reports, | ||||
| RPT_ERROR, | RPT_ERROR, | ||||
| "Invalid cage object, the cage mesh must have the same number " | "Invalid cage object, the cage mesh must have the same number " | ||||
| "of faces as the active object"); | "of faces as the active object"); | ||||
| goto cleanup; | goto cleanup; | ||||
| } | } | ||||
| } | } | ||||
| Show All 12 Lines | else if (is_cage) { | ||||
| if (md->type == eModifierType_EdgeSplit) { | if (md->type == eModifierType_EdgeSplit) { | ||||
| BLI_remlink(&ob_low_eval->modifiers, md); | BLI_remlink(&ob_low_eval->modifiers, md); | ||||
| modifier_free(md); | modifier_free(md); | ||||
| } | } | ||||
| md = md_next; | md = md_next; | ||||
| } | } | ||||
| me_cage = bake_mesh_new_from_object(depsgraph, bmain, scene, ob_low_eval); | me_cage = bake_mesh_new_from_object(bmain, ob_low_eval); | ||||
| RE_bake_pixels_populate(me_cage, pixel_array_low, num_pixels, &bake_images, uv_layer); | RE_bake_pixels_populate(me_cage, pixel_array_low, num_pixels, &bake_images, uv_layer); | ||||
| } | } | ||||
| highpoly = MEM_callocN(sizeof(BakeHighPolyData) * tot_highpoly, "bake high poly objects"); | highpoly = MEM_callocN(sizeof(BakeHighPolyData) * tot_highpoly, "bake high poly objects"); | ||||
| /* populate highpoly array */ | /* populate highpoly array */ | ||||
| for (link = selected_objects->first; link; link = link->next) { | for (link = selected_objects->first; link; link = link->next) { | ||||
| Object *ob_iter = link->ptr.data; | Object *ob_iter = link->ptr.data; | ||||
| if (ob_iter == ob_low) { | if (ob_iter == ob_low) { | ||||
| continue; | continue; | ||||
| } | } | ||||
| /* initialize highpoly_data */ | /* initialize highpoly_data */ | ||||
| highpoly[i].ob = ob_iter; | highpoly[i].ob = ob_iter; | ||||
| highpoly[i].ob_eval = DEG_get_evaluated_object(depsgraph, ob_iter); | highpoly[i].ob_eval = DEG_get_evaluated_object(depsgraph, ob_iter); | ||||
| highpoly[i].ob_eval->restrictflag &= ~OB_RESTRICT_RENDER; | highpoly[i].ob_eval->restrictflag &= ~OB_RESTRICT_RENDER; | ||||
| highpoly[i].ob_eval->base_flag |= (BASE_VISIBLE | BASE_ENABLED_RENDER); | highpoly[i].ob_eval->base_flag |= (BASE_VISIBLE | BASE_ENABLED_RENDER); | ||||
| highpoly[i].me = bake_mesh_new_from_object(depsgraph, bmain, scene, highpoly[i].ob_eval); | highpoly[i].me = bake_mesh_new_from_object(bmain, highpoly[i].ob_eval); | ||||
| /* lowpoly to highpoly transformation matrix */ | /* lowpoly to highpoly transformation matrix */ | ||||
| copy_m4_m4(highpoly[i].obmat, highpoly[i].ob->obmat); | copy_m4_m4(highpoly[i].obmat, highpoly[i].ob->obmat); | ||||
| invert_m4_m4(highpoly[i].imat, highpoly[i].obmat); | invert_m4_m4(highpoly[i].imat, highpoly[i].obmat); | ||||
| highpoly[i].is_flip_object = is_negative_m4(highpoly[i].ob->obmat); | highpoly[i].is_flip_object = is_negative_m4(highpoly[i].ob->obmat); | ||||
| i++; | i++; | ||||
| ▲ Show 20 Lines • Show All 106 Lines • ▼ Show 20 Lines | switch (normal_space) { | ||||
| md = modifiers_findByType(ob_low_eval, eModifierType_Multires); | md = modifiers_findByType(ob_low_eval, eModifierType_Multires); | ||||
| if (md) { | if (md) { | ||||
| mode = md->mode; | mode = md->mode; | ||||
| md->mode &= ~eModifierMode_Render; | md->mode &= ~eModifierMode_Render; | ||||
| } | } | ||||
| /* Evaluate modifiers again. */ | /* Evaluate modifiers again. */ | ||||
| me_nores = BKE_mesh_new_from_object(depsgraph, bmain, scene, ob_low_eval, true, false); | me_nores = BKE_mesh_new_from_object(bmain, ob_low_eval); | ||||
| RE_bake_pixels_populate(me_nores, pixel_array_low, num_pixels, &bake_images, uv_layer); | RE_bake_pixels_populate(me_nores, pixel_array_low, num_pixels, &bake_images, uv_layer); | ||||
| RE_bake_normal_world_to_tangent(pixel_array_low, | RE_bake_normal_world_to_tangent(pixel_array_low, | ||||
| num_pixels, | num_pixels, | ||||
| depth, | depth, | ||||
| result, | result, | ||||
| me_nores, | me_nores, | ||||
| normal_swizzle, | normal_swizzle, | ||||
| ▲ Show 20 Lines • Show All 722 Lines • Show Last 20 Lines | |||||