Commit: 711d1f7591adb07456380ceaef61c5e3d4666e19 Author: Pablo Dobarro Date: Tue May 21 00:45:41 2019 +0200 Branches: sculpt-mode-features https://developer.blender.org/rB711d1f7591adb07456380ceaef61c5e3d4666e19
Merge branch 'master' into sculpt-mode-features =================================================================== =================================================================== diff --cc build_files/cmake/macros.cmake index 90f07e7edc7,10b293c64b4..098792d4be6 --- a/build_files/cmake/macros.cmake +++ b/build_files/cmake/macros.cmake @@@ -271,20 -271,40 +271,40 @@@ function(blender_add_lib_nolis endfunction() function(blender_add_lib - name - sources - includes - includes_sys - library_deps - ) + name + sources + includes + includes_sys + library_deps + ) - add_cc_flags_custom_test(${name} PARENT_SCOPE) + add_cc_flags_custom_test(${name} PARENT_SCOPE) - blender_add_lib__impl(${name} "${sources}" "${includes}" "${includes_sys}" "${library_deps}") + blender_add_lib__impl(${name} "${sources}" "${includes}" "${includes_sys}" "${library_deps}") - set_property(GLOBAL APPEND PROPERTY BLENDER_LINK_LIBS ${name}) + set_property(GLOBAL APPEND PROPERTY BLENDER_LINK_LIBS ${name}) endfunction() + # Ninja only: assign 'heavy pool' to some targets that are especially RAM-consuming to build. + function(setup_heavy_lib_pool) + if(WITH_NINJA_POOL_JOBS AND NINJA_MAX_NUM_PARALLEL_COMPILE_HEAVY_JOBS) + if(WITH_CYCLES) + list(APPEND _HEAVY_LIBS "cycles_device" "cycles_kernel") + endif() + if(WITH_LIBMV) + list(APPEND _HEAVY_LIBS "bf_intern_libmv") + endif() + if(WITH_OPENVDB) + list(APPEND _HEAVY_LIBS "bf_intern_openvdb") + endif() + + foreach(TARGET ${_HEAVY_LIBS}) + if(TARGET ${TARGET}) + set_property(TARGET ${TARGET} PROPERTY JOB_POOL_COMPILE compile_heavy_job_pool) + endif() + endforeach() + endif() + endfunction() function(SETUP_LIBDIRS) diff --cc source/blender/blenkernel/intern/editmesh.c index 130f4ae88f1,264054266eb..b8234ccc5bb --- a/source/blender/blenkernel/intern/editmesh.c +++ b/source/blender/blenkernel/intern/editmesh.c @@@ -248,3 -248,13 +248,13 @@@ void BKE_editmesh_lnorspace_update(BMEd BM_lnorspace_update(bm); } + + /* If autosmooth not already set, set it */ + void BKE_editmesh_ensure_autosmooth(BMEditMesh *em) + { + Mesh *me = em->ob->data; + if (!(me->flag & ME_AUTOSMOOTH)) { + me->flag |= ME_AUTOSMOOTH; - BKE_editmesh_lnorspace_update (em); ++ BKE_editmesh_lnorspace_update(em); + } + } diff --cc source/blender/draw/engines/workbench/shaders/workbench_prepass_frag.glsl index 4b65acac9d1,af9f1d14f4a..eb4ccd66f54 --- a/source/blender/draw/engines/workbench/shaders/workbench_prepass_frag.glsl +++ b/source/blender/draw/engines/workbench/shaders/workbench_prepass_frag.glsl @@@ -6,9 -6,7 +6,8 @@@ uniform float materialRoughness uniform sampler2D image; uniform float ImageTransparencyCutoff = 0.1; - uniform bool imageSrgb; uniform bool imageNearest; +uniform bool useVertexPaint; #ifdef NORMAL_VIEWPORT_PASS_ENABLED in vec3 normal_viewport; diff --cc source/blender/editors/object/object_edit.c index e079afc5253,a542911f4d4..a70a48a2c5a --- a/source/blender/editors/object/object_edit.c +++ b/source/blender/editors/object/object_edit.c @@@ -1790,245 -1779,5 +1790,246 @@@ void OBJECT_OT_link_to_collection(wmOpe "Name", "Name of the newly added collection"); RNA_def_property_flag(prop, PROP_SKIP_SAVE); + ot->prop = prop; } + +static int remesh_exec(bContext *C, wmOperator *op) +{ + bool linked_data = false; + + Object *ob = CTX_data_active_object(C); + Main *bmain = CTX_data_main(C); + + ID *data; + data = ob->data; + if (data && ID_IS_LINKED(data)) { + linked_data = true; + return OPERATOR_CANCELLED; + } + + if (ID_REAL_USERS(data) != 1) { + BKE_report(op->reports, RPT_ERROR, "Remesh cannot run on mesh data with multiple users"); + return OPERATOR_CANCELLED; + } + + if (BKE_object_is_in_editmode(ob)) { + BKE_report(op->reports, RPT_ERROR, "Remesh cannot run from edit mode"); + return OPERATOR_CANCELLED; + } + + if (ob->type == OB_MESH) { + Mesh *mesh = ob->data; + Mesh *newMesh; + + if (mesh->voxel_size <= 0.0f) { + return OPERATOR_CANCELLED; + } + + if (ob->mode == OB_MODE_SCULPT) { + Depsgraph *depsgraph = CTX_data_depsgraph(C); + struct Scene *scene = CTX_data_scene(C); + Sculpt *sd = CTX_data_tool_settings(C)->sculpt; + BKE_sculpt_update_mesh_elements(depsgraph, scene, sd, ob, true, true); + PBVH *pbvh; + PBVHNode **nodes; + int totnode; + pbvh = ob->sculpt->pbvh; + BKE_pbvh_search_gather(pbvh, NULL, NULL, &nodes, &totnode); + sculpt_undo_push_begin("voxel remesh"); + sculpt_undo_push_node(ob, nodes[0], SCULPT_UNDO_REMESH); + } + + struct OpenVDBLevelSet *level_set; + struct OpenVDBTransform *xform = OpenVDBTransform_create(); + OpenVDBTransform_create_linear_transform(xform, (double)mesh->voxel_size); + level_set = BKE_remesh_voxel_ovdb_mesh_to_level_set_create(mesh, xform); + newMesh = BKE_remesh_voxel_ovdb_volume_to_mesh_nomain(level_set, 0.0, 0.0, false); + OpenVDBLevelSet_free(level_set); + OpenVDBTransform_free(xform); + + Mesh *objMesh_copy; + if (mesh->flag & ME_REMESH_REPROJECT_VERTEX_PAINT || + mesh->flag & ME_REMESH_REPROJECT_PAINT_MASK) { + objMesh_copy = BKE_mesh_new_nomain_from_template(mesh, mesh->totvert, 0, 0, 0, 0); + CustomData_copy( + &mesh->vdata, &objMesh_copy->vdata, CD_MASK_MESH.vmask, CD_DUPLICATE, mesh->totvert); + for (int i = 0; i < mesh->totvert; i++) { + copy_v3_v3(objMesh_copy->mvert[i].co, mesh->mvert[i].co); + } + } + + BKE_mesh_nomain_to_mesh(newMesh, mesh, ob, &CD_MASK_EVERYTHING, true); + + BKE_remesh_voxel_init_empty_vertex_color_layer(mesh); + + if (mesh->flag & ME_REMESH_REPROJECT_VERTEX_PAINT || + mesh->flag & ME_REMESH_REPROJECT_PAINT_MASK) { + BKE_remesh_voxel_reproject(mesh, objMesh_copy, mesh->flag); + BKE_mesh_free(objMesh_copy); + } + + if (mesh->flag & ME_REMESH_SMOOTH_NORMALS) { + BKE_mesh_smooth_flag_set(ob, true); + } + + if (ob->mode == OB_MODE_SCULPT) { + sculpt_undo_push_end(); + } + + BKE_mesh_batch_cache_dirty_tag(ob->data, BKE_MESH_BATCH_DIRTY_ALL); + DEG_relations_tag_update(bmain); + DEG_id_tag_update(&ob->id, ID_RECALC_GEOMETRY); + WM_event_add_notifier(C, NC_GEOM | ND_DATA, ob->data); + + BKE_mesh_free(newMesh); + return OPERATOR_FINISHED; + } + + return OPERATOR_CANCELLED; +} + +void OBJECT_OT_remesh(wmOperatorType *ot) +{ + /* identifiers */ + ot->name = "Voxel remesh"; + ot->description = "Run OpenVDB voxel remesher"; + ot->idname = "OBJECT_OT_remesh"; + + /* api callbacks */ + ot->poll = object_mode_set_poll; + ot->exec = remesh_exec; + + ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_INTERNAL; +} + +#define GET_CD_DATA(me, data) ((me)->edit_mesh ? &(me)->edit_mesh->bm->data : &(me)->data) +static int vertex_to_loop_colors_exec(bContext *C, wmOperator *op) +{ + bool linked_data = false; + + Object *ob = CTX_data_active_object(C); + + ID *data; + data = ob->data; + if (data && ID_IS_LINKED(data)) { + linked_data = true; + return OPERATOR_CANCELLED; + } + + if (ob->type == OB_MESH) { + Mesh *mesh = ob->data; + CustomData *ldata = GET_CD_DATA(mesh, ldata); + const int n = CustomData_get_active_layer(ldata, CD_MLOOPCOL); + if (n == -1) { + return OPERATOR_CANCELLED; + } + MLoopCol *loopcols = CustomData_get_layer_n(&mesh->ldata, CD_MLOOPCOL, n); + MVertCol *vertcols = CustomData_get_layer(&mesh->vdata, CD_MVERTCOL); + MLoop *loops = CustomData_get_layer(&mesh->ldata, CD_MLOOP); + MPoly *polys = CustomData_get_layer(&mesh->pdata, CD_MPOLY); + + for (int i = 0; i < mesh->totpoly; i++) { + MPoly *c_poly = &polys[i]; + for (int j = 0; j < c_poly->totloop; j++) { + int loop_index = c_poly->loopstart + j; + MLoop *c_loop = &loops[c_poly->loopstart + j]; + loopcols[loop_index].r = vertcols[c_loop->v].r; + loopcols[loop_index].g = vertcols[c_loop->v].g; + loopcols[loop_index].b = vertcols[c_loop->v].b; + loopcols[loop_index].a = vertcols[c_loop->v].a; + } + } + + DEG_id_tag_update(&ob->id, ID_RECALC_GEOMETRY); + WM_event_add_notifier(C, NC_GEOM | ND_DATA, ob->data); + + return OPERATOR_FINISHED; + } + return OPERATOR_CANCELLED; +} + +void OBJECT_OT_vertex_to_loop_colors(wmOperatorType *ot) +{ + /* identifiers */ + ot->name = "Vertex color to loop color"; + ot->description = "Copy the vertex color to a regular color layer"; + ot->idname = "OBJECT_OT_vertex_to_loop_colors"; + + /* api callbacks */ + ot->poll = object_mode_set_poll; + ot->exec = vertex_to_loop_colors_exec; + + ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; +} + +static int loop_to_vertex_colors_exec(bContext *C, wmOperator *op) +{ + bool linked_data = false; + + Object *ob = CTX_data_active_object(C); + + ID *data; + data = ob->data; + if (data && ID_IS_LINKED(data)) { + linked_data = true; + return OPERATOR_CANCELLED; + } + + if (ob->type == OB_MESH) { + Mesh *mesh = ob->data; + CustomData *ldata = GET_CD_DATA(mesh, ldata); + const int n = CustomData_get_active_layer(ldata, CD_MLOOPCOL); + if (n == -1) { + return OPERATOR_CANCELLED; + } + MLoopCol *loopcols = CustomData_get_layer_n(&mesh->ldata, CD_MLOOPCOL, n); + MVertCol *vertcols; + if (!CustomData_has_layer(&mesh->vdata, CD_MVERTCOL)) { + vertcols = CustomData_add_layer_named( + &mesh->vdata, CD_MVERTCOL, CD_CALLOC, NULL, mesh->totvert, "vcols"); + for (int i = 0; i < mesh->totvert; i++) { + ob->sculpt->vcol[i].r = 255; + ob->sculpt->vcol[i].g = 255; + ob->sculpt->vcol[i].b = 255; + ob->sculpt->vcol[i].a = 255; + } + } + else { + vertcols = CustomData_get_layer(&mesh->vdata, CD_MVERTCOL); + } + MLoop *loops = CustomData_get_layer(&mesh->ldata, CD_MLOOP); + MPoly *polys = CustomData_get_layer(&mesh->pdata, CD_MPOLY); + + for (int i = 0; i < mesh->totpoly; i++) { + MPoly *c_poly = &polys[i]; + for (int j = 0; j < c_poly @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org https://lists.blender.org/mailman/listinfo/bf-blender-cvs