Changeset View
Changeset View
Standalone View
Standalone View
source/blender/modifiers/intern/MOD_uvproject.cc
| Show First 20 Lines • Show All 126 Lines • ▼ Show 20 Lines | static Mesh *uvprojectModifier_do(UVProjectModifierData *umd, | ||||
| CustomData_validate_layer_name(&mesh->ldata, CD_MLOOPUV, umd->uvlayer_name, uvname); | CustomData_validate_layer_name(&mesh->ldata, CD_MLOOPUV, umd->uvlayer_name, uvname); | ||||
| /* calculate a projection matrix and normal for each projector */ | /* calculate a projection matrix and normal for each projector */ | ||||
| for (i = 0; i < projectors_num; i++) { | for (i = 0; i < projectors_num; i++) { | ||||
| float tmpmat[4][4]; | float tmpmat[4][4]; | ||||
| float offsetmat[4][4]; | float offsetmat[4][4]; | ||||
| Camera *cam = nullptr; | Camera *cam = nullptr; | ||||
| /* calculate projection matrix */ | /* calculate projection matrix */ | ||||
| invert_m4_m4(projectors[i].projmat, projectors[i].ob->obmat); | invert_m4_m4(projectors[i].projmat, projectors[i].ob->object_to_world); | ||||
| projectors[i].uci = nullptr; | projectors[i].uci = nullptr; | ||||
| if (projectors[i].ob->type == OB_CAMERA) { | if (projectors[i].ob->type == OB_CAMERA) { | ||||
| cam = (Camera *)projectors[i].ob->data; | cam = (Camera *)projectors[i].ob->data; | ||||
| if (cam->type == CAM_PANO) { | if (cam->type == CAM_PANO) { | ||||
| projectors[i].uci = BLI_uvproject_camera_info(projectors[i].ob, nullptr, aspx, aspy); | projectors[i].uci = BLI_uvproject_camera_info(projectors[i].ob, nullptr, aspx, aspy); | ||||
| BLI_uvproject_camera_info_scale( | BLI_uvproject_camera_info_scale( | ||||
| Show All 29 Lines | for (i = 0; i < projectors_num; i++) { | ||||
| offsetmat[3][0] = offsetmat[3][1] = offsetmat[3][2] = 0.5; | offsetmat[3][0] = offsetmat[3][1] = offsetmat[3][2] = 0.5; | ||||
| mul_m4_m4m4(projectors[i].projmat, offsetmat, tmpmat); | mul_m4_m4m4(projectors[i].projmat, offsetmat, tmpmat); | ||||
| /* Calculate world-space projector normal (for best projector test). */ | /* Calculate world-space projector normal (for best projector test). */ | ||||
| projectors[i].normal[0] = 0; | projectors[i].normal[0] = 0; | ||||
| projectors[i].normal[1] = 0; | projectors[i].normal[1] = 0; | ||||
| projectors[i].normal[2] = 1; | projectors[i].normal[2] = 1; | ||||
| mul_mat3_m4_v3(projectors[i].ob->obmat, projectors[i].normal); | mul_mat3_m4_v3(projectors[i].ob->object_to_world, projectors[i].normal); | ||||
| } | } | ||||
| polys_num = mesh->totpoly; | polys_num = mesh->totpoly; | ||||
| loops_num = mesh->totloop; | loops_num = mesh->totloop; | ||||
| /* make sure we are not modifying the original UV map */ | /* make sure we are not modifying the original UV map */ | ||||
| MLoopUV *mloop_uv = static_cast<MLoopUV *>( | MLoopUV *mloop_uv = static_cast<MLoopUV *>( | ||||
| CustomData_duplicate_referenced_layer_named(&mesh->ldata, CD_MLOOPUV, uvname, loops_num)); | CustomData_duplicate_referenced_layer_named(&mesh->ldata, CD_MLOOPUV, uvname, loops_num)); | ||||
| coords = BKE_mesh_vert_coords_alloc(mesh, &verts_num); | coords = BKE_mesh_vert_coords_alloc(mesh, &verts_num); | ||||
| /* Convert coords to world-space. */ | /* Convert coords to world-space. */ | ||||
| for (i = 0, co = coords; i < verts_num; i++, co++) { | for (i = 0, co = coords; i < verts_num; i++, co++) { | ||||
| mul_m4_v3(ob->obmat, *co); | mul_m4_v3(ob->object_to_world, *co); | ||||
| } | } | ||||
| /* if only one projector, project coords to UVs */ | /* if only one projector, project coords to UVs */ | ||||
| if (projectors_num == 1 && projectors[0].uci == nullptr) { | if (projectors_num == 1 && projectors[0].uci == nullptr) { | ||||
| for (i = 0, co = coords; i < verts_num; i++, co++) { | for (i = 0, co = coords; i < verts_num; i++, co++) { | ||||
| mul_project_m4_v3(projectors[0].projmat, *co); | mul_project_m4_v3(projectors[0].projmat, *co); | ||||
| } | } | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 179 Lines • Show Last 20 Lines | |||||