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(Main *bmain, Object *object) | static Mesh *bake_mesh_new_from_object(Object *object) | ||||
| { | { | ||||
| Mesh *me = BKE_mesh_new_from_object(bmain, object); | Mesh *me = BKE_object_to_mesh(object); | ||||
| 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(bmain, ob_low_eval); | me_low = bake_mesh_new_from_object(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(bmain, ob_cage_eval); | me_cage = bake_mesh_new_from_object(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(bmain, ob_low_eval); | me_cage = BKE_object_to_mesh(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(bmain, highpoly[i].ob_eval); | highpoly[i].me = BKE_object_to_mesh(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(bmain, ob_low_eval); | me_nores = BKE_object_to_mesh(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, | ||||
| ob_low_eval->obmat); | ob_low_eval->obmat); | ||||
| BKE_id_free(bmain, me_nores); | BKE_object_to_mesh_clear(ob_low_eval); | ||||
| if (md) { | if (md) { | ||||
| md->mode = mode; | md->mode = mode; | ||||
| } | } | ||||
| } | } | ||||
| break; | break; | ||||
| } | } | ||||
| default: | default: | ||||
| ▲ Show 20 Lines • Show All 107 Lines • ▼ Show 20 Lines | static int bake(Render *re, | ||||
| } | } | ||||
| cleanup: | cleanup: | ||||
| if (highpoly) { | if (highpoly) { | ||||
| int i; | int i; | ||||
| for (i = 0; i < tot_highpoly; i++) { | for (i = 0; i < tot_highpoly; i++) { | ||||
| if (highpoly[i].me) { | if (highpoly[i].me) { | ||||
| BKE_id_free(bmain, highpoly[i].me); | BKE_object_to_mesh_clear(highpoly[i].ob_eval); | ||||
| } | } | ||||
| } | } | ||||
| MEM_freeN(highpoly); | MEM_freeN(highpoly); | ||||
| } | } | ||||
| if (mmd_low) { | if (mmd_low) { | ||||
| mmd_low->flags = mmd_flags_low; | mmd_low->flags = mmd_flags_low; | ||||
| } | } | ||||
| Show All 14 Lines | if (bake_images.lookup) { | ||||
| MEM_freeN(bake_images.lookup); | MEM_freeN(bake_images.lookup); | ||||
| } | } | ||||
| if (result) { | if (result) { | ||||
| MEM_freeN(result); | MEM_freeN(result); | ||||
| } | } | ||||
| if (me_low) { | if (me_low) { | ||||
| BKE_id_free(bmain, me_low); | BKE_object_to_mesh_clear(ob_low_eval); | ||||
| } | } | ||||
| if (me_cage) { | if (me_cage) { | ||||
| BKE_id_free(bmain, me_cage); | BKE_object_to_mesh_clear(ob_cage_eval); | ||||
| } | } | ||||
| DEG_graph_free(depsgraph); | DEG_graph_free(depsgraph); | ||||
| return op_result; | return op_result; | ||||
| } | } | ||||
| static void bake_init_api_data(wmOperator *op, bContext *C, BakeAPIRender *bkr) | static void bake_init_api_data(wmOperator *op, bContext *C, BakeAPIRender *bkr) | ||||
| ▲ Show 20 Lines • Show All 553 Lines • Show Last 20 Lines | |||||