Changeset View
Changeset View
Standalone View
Standalone View
source/blender/render/intern/multires_bake.cc
| Show First 20 Lines • Show All 54 Lines • ▼ Show 20 Lines | |||||
| using MInitBakeData = void *(*)(MultiresBakeRender *bkr, ImBuf *ibuf); | using MInitBakeData = void *(*)(MultiresBakeRender *bkr, ImBuf *ibuf); | ||||
| using MFreeBakeData = void (*)(void *bake_data); | using MFreeBakeData = void (*)(void *bake_data); | ||||
| struct MultiresBakeResult { | struct MultiresBakeResult { | ||||
| float height_min, height_max; | float height_min, height_max; | ||||
| }; | }; | ||||
| struct MResolvePixelData { | struct MResolvePixelData { | ||||
| MVert *mvert; | const float (*vert_positions)[3]; | ||||
campbellbarton: `vert_positions` especially since this deals with different kinds of data (image/uv/tangents). | |||||
| 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->vert_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 = static_cast<MLoopUV *>(dm->getLoopDataArray(dm, CD_MLOOPUV)); | MLoopUV *mloopuv = static_cast<MLoopUV *>(dm->getLoopDataArray(dm, CD_MLOOPUV)); | ||||
| float *pvtangent = nullptr; | float *pvtangent = nullptr; | ||||
| 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 = nullptr; | void *bake_data = nullptr; | ||||
| 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(temp_mesh->vert_positions_for_write().data(), | ||||
| dm->getVertArray(dm), | positions, | ||||
| temp_mesh->totvert * sizeof(MVert)); | temp_mesh->totvert * sizeof(float[3])); | ||||
| 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, | ||||
| nullptr, | nullptr, | ||||
| 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 = static_cast<const int *>( | handle->data.material_indices = static_cast<const int *>( | ||||
| CustomData_get_layer_named(&dm->polyData, CD_PROP_INT32, "material_index")); | CustomData_get_layer_named(&dm->polyData, CD_PROP_INT32, "material_index")); | ||||
| handle->data.mvert = mvert; | handle->data.vert_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 92 Lines • Show Last 20 Lines | |||||
vert_positions especially since this deals with different kinds of data (image/uv/tangents).
Side-note that MResolvePixelData has a few other members that are named ambiguously (precomputed_normals could be named poly_normals_precomputed for e.g.).