Changeset View
Changeset View
Standalone View
Standalone View
source/blender/render/intern/multires_bake.c
| Show First 20 Lines • Show All 54 Lines • ▼ Show 20 Lines | |||||
| typedef void *(*MInitBakeData)(MultiresBakeRender *bkr, ImBuf *ibuf); | typedef void *(*MInitBakeData)(MultiresBakeRender *bkr, ImBuf *ibuf); | ||||
| typedef void (*MFreeBakeData)(void *bake_data); | typedef void (*MFreeBakeData)(void *bake_data); | ||||
| typedef struct MultiresBakeResult { | typedef struct MultiresBakeResult { | ||||
| float height_min, height_max; | float height_min, height_max; | ||||
| } MultiresBakeResult; | } MultiresBakeResult; | ||||
| typedef struct { | typedef struct { | ||||
| MVert *mvert; | const float (*positions)[3]; | ||||
| const float (*vert_normals)[3]; | const float (*vert_normals)[3]; | ||||
| MPoly *mpoly; | MPoly *mpoly; | ||||
| const int *material_indices; | const int *material_indices; | ||||
| MLoop *mloop; | MLoop *mloop; | ||||
| MLoopUV *mloopuv; | MLoopUV *mloopuv; | ||||
| float uv_offset[2]; | float uv_offset[2]; | ||||
| const MLoopTri *mlooptri; | const MLoopTri *mlooptri; | ||||
| float *pvtangent; | float *pvtangent; | ||||
| ▲ Show 20 Lines • Show All 48 Lines • ▼ Show 20 Lines | |||||
| const int vi = data->mloop[data->mlooptri[tri_num].tri[vert_index]].v; | const int vi = data->mloop[data->mlooptri[tri_num].tri[vert_index]].v; | ||||
| copy_v3_v3(r_normal, data->vert_normals[vi]); | copy_v3_v3(r_normal, data->vert_normals[vi]); | ||||
| } | } | ||||
| else { | else { | ||||
| if (data->precomputed_normals) { | if (data->precomputed_normals) { | ||||
| copy_v3_v3(r_normal, data->precomputed_normals[poly_index]); | copy_v3_v3(r_normal, data->precomputed_normals[poly_index]); | ||||
| } | } | ||||
| else { | else { | ||||
| BKE_mesh_calc_poly_normal(mp, &data->mloop[mp->loopstart], data->mvert, r_normal); | BKE_mesh_calc_poly_normal(mp, &data->mloop[mp->loopstart], data->positions, r_normal); | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| static void init_bake_rast(MBakeRast *bake_rast, | static void init_bake_rast(MBakeRast *bake_rast, | ||||
| const ImBuf *ibuf, | const ImBuf *ibuf, | ||||
| const MResolvePixelData *data, | const MResolvePixelData *data, | ||||
| MFlushPixel flush_pixel, | MFlushPixel flush_pixel, | ||||
| ▲ Show 20 Lines • Show All 184 Lines • ▼ Show 20 Lines | |||||
| int tot_tri = dm->getNumLoopTri(dm); | int tot_tri = dm->getNumLoopTri(dm); | ||||
| if (tot_tri < 1) { | if (tot_tri < 1) { | ||||
| return; | return; | ||||
| } | } | ||||
| MultiresBakeThread *handles; | MultiresBakeThread *handles; | ||||
| MultiresBakeQueue queue; | MultiresBakeQueue queue; | ||||
| MVert *mvert = dm->getVertArray(dm); | const float(*positions)[3] = (float(*)[3])dm->getVertArray(dm); | ||||
| MPoly *mpoly = dm->getPolyArray(dm); | MPoly *mpoly = dm->getPolyArray(dm); | ||||
| MLoop *mloop = dm->getLoopArray(dm); | MLoop *mloop = dm->getLoopArray(dm); | ||||
| MLoopUV *mloopuv = dm->getLoopDataArray(dm, CD_MLOOPUV); | MLoopUV *mloopuv = dm->getLoopDataArray(dm, CD_MLOOPUV); | ||||
| float *pvtangent = NULL; | float *pvtangent = NULL; | ||||
| ListBase threads; | ListBase threads; | ||||
| int i, tot_thread = bkr->threads > 0 ? bkr->threads : BLI_system_thread_count(); | int i, tot_thread = bkr->threads > 0 ? bkr->threads : BLI_system_thread_count(); | ||||
| void *bake_data = NULL; | void *bake_data = NULL; | ||||
| Mesh *temp_mesh = BKE_mesh_new_nomain( | Mesh *temp_mesh = BKE_mesh_new_nomain( | ||||
| dm->getNumVerts(dm), dm->getNumEdges(dm), 0, dm->getNumLoops(dm), dm->getNumPolys(dm)); | dm->getNumVerts(dm), dm->getNumEdges(dm), 0, dm->getNumLoops(dm), dm->getNumPolys(dm)); | ||||
| memcpy(BKE_mesh_verts_for_write(temp_mesh), | memcpy( | ||||
| dm->getVertArray(dm), | BKE_mesh_positions_for_write(temp_mesh), positions, temp_mesh->totvert * sizeof(float[3])); | ||||
| temp_mesh->totvert * sizeof(MVert)); | |||||
| memcpy(BKE_mesh_edges_for_write(temp_mesh), | memcpy(BKE_mesh_edges_for_write(temp_mesh), | ||||
| dm->getEdgeArray(dm), | dm->getEdgeArray(dm), | ||||
| temp_mesh->totedge * sizeof(MEdge)); | temp_mesh->totedge * sizeof(MEdge)); | ||||
| memcpy(BKE_mesh_polys_for_write(temp_mesh), | memcpy(BKE_mesh_polys_for_write(temp_mesh), | ||||
| dm->getPolyArray(dm), | dm->getPolyArray(dm), | ||||
| temp_mesh->totpoly * sizeof(MPoly)); | temp_mesh->totpoly * sizeof(MPoly)); | ||||
| memcpy(BKE_mesh_loops_for_write(temp_mesh), | memcpy(BKE_mesh_loops_for_write(temp_mesh), | ||||
| dm->getLoopArray(dm), | dm->getLoopArray(dm), | ||||
| temp_mesh->totloop * sizeof(MLoop)); | temp_mesh->totloop * sizeof(MLoop)); | ||||
| const float(*vert_normals)[3] = BKE_mesh_vertex_normals_ensure(temp_mesh); | const float(*vert_normals)[3] = BKE_mesh_vertex_normals_ensure(temp_mesh); | ||||
| const float(*poly_normals)[3] = BKE_mesh_poly_normals_ensure(temp_mesh); | const float(*poly_normals)[3] = BKE_mesh_poly_normals_ensure(temp_mesh); | ||||
| if (require_tangent) { | if (require_tangent) { | ||||
| if (CustomData_get_layer_index(&dm->loopData, CD_TANGENT) == -1) { | if (CustomData_get_layer_index(&dm->loopData, CD_TANGENT) == -1) { | ||||
| BKE_mesh_calc_loop_tangent_ex( | BKE_mesh_calc_loop_tangent_ex( | ||||
| dm->getVertArray(dm), | positions, | ||||
| dm->getPolyArray(dm), | dm->getPolyArray(dm), | ||||
| dm->getNumPolys(dm), | dm->getNumPolys(dm), | ||||
| dm->getLoopArray(dm), | dm->getLoopArray(dm), | ||||
| dm->getLoopTriArray(dm), | dm->getLoopTriArray(dm), | ||||
| dm->getNumLoopTri(dm), | dm->getNumLoopTri(dm), | ||||
| &dm->loopData, | &dm->loopData, | ||||
| true, | true, | ||||
| NULL, | NULL, | ||||
| Show All 35 Lines | |||||
| handle->bkr = bkr; | handle->bkr = bkr; | ||||
| handle->image = ima; | handle->image = ima; | ||||
| handle->queue = &queue; | handle->queue = &queue; | ||||
| handle->data.mpoly = mpoly; | handle->data.mpoly = mpoly; | ||||
| handle->data.material_indices = CustomData_get_layer_named( | handle->data.material_indices = CustomData_get_layer_named( | ||||
| &dm->polyData, CD_PROP_INT32, "material_index"); | &dm->polyData, CD_PROP_INT32, "material_index"); | ||||
| handle->data.mvert = mvert; | handle->data.positions = positions; | ||||
| handle->data.vert_normals = vert_normals; | handle->data.vert_normals = vert_normals; | ||||
| handle->data.mloopuv = mloopuv; | handle->data.mloopuv = mloopuv; | ||||
| BKE_image_get_tile_uv(ima, tile->tile_number, handle->data.uv_offset); | BKE_image_get_tile_uv(ima, tile->tile_number, handle->data.uv_offset); | ||||
| handle->data.mlooptri = mlooptri; | handle->data.mlooptri = mlooptri; | ||||
| handle->data.mloop = mloop; | handle->data.mloop = mloop; | ||||
| handle->data.pvtangent = pvtangent; | handle->data.pvtangent = pvtangent; | ||||
| handle->data.precomputed_normals = poly_normals; /* don't strictly need this */ | handle->data.precomputed_normals = poly_normals; /* don't strictly need this */ | ||||
| handle->data.w = ibuf->x; | handle->data.w = ibuf->x; | ||||
| ▲ Show 20 Lines • Show All 102 Lines • ▼ Show 20 Lines | |||||
| hidm->getGridKey(hidm, &key); | hidm->getGridKey(hidm, &key); | ||||
| if (lvl == 0) { | if (lvl == 0) { | ||||
| MPoly *mpoly; | MPoly *mpoly; | ||||
| face_side = (grid_size << 1) - 1; | face_side = (grid_size << 1) - 1; | ||||
| mpoly = lodm->getPolyArray(lodm) + poly_index; | mpoly = lodm->getPolyArray(lodm) + poly_index; | ||||
| g_index = grid_offset[poly_index]; | g_index = grid_offset[poly_index]; | ||||
| S = mdisp_rot_face_to_crn(lodm->getVertArray(lodm), | S = mdisp_rot_face_to_crn(mpoly, | ||||
| mpoly, | |||||
| lodm->getLoopArray(lodm), | lodm->getLoopArray(lodm), | ||||
| lt, | lt, | ||||
| face_side, | face_side, | ||||
| u * (face_side - 1), | u * (face_side - 1), | ||||
| v * (face_side - 1), | v * (face_side - 1), | ||||
| &crn_x, | &crn_x, | ||||
| &crn_y); | &crn_y); | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 92 Lines • Show Last 20 Lines | |||||