diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2011-12-13 15:58:59 +0400 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2011-12-13 15:58:59 +0400 |
commit | b865c0314f4bd2ead240accff1d06234f614acd2 (patch) | |
tree | 61026809a1b3bebb7b2f0614912d4e37267da897 /source/blender | |
parent | 3717a4a9e1ef159ce9b75738cd40122bbd01671b (diff) | |
parent | 5466befb38cf4ba21e4cf97f0318aaa7f2b10938 (diff) |
Merging r42533 through r42601 from trunk into soc-2011-tomato
Diffstat (limited to 'source/blender')
49 files changed, 446 insertions, 205 deletions
diff --git a/source/blender/blenkernel/BKE_DerivedMesh.h b/source/blender/blenkernel/BKE_DerivedMesh.h index 429d5e84785..5f451ce7821 100644 --- a/source/blender/blenkernel/BKE_DerivedMesh.h +++ b/source/blender/blenkernel/BKE_DerivedMesh.h @@ -94,6 +94,7 @@ struct DerivedMesh { BVHCache bvhCache; struct GPUDrawObject *drawObject; DerivedMeshType type; + float auto_bump_scale; /* Misc. Queries */ @@ -578,6 +579,7 @@ void DM_vertex_attributes_from_gpu(DerivedMesh *dm, struct GPUVertexAttribs *gattribs, DMVertexAttribs *attribs); void DM_add_tangent_layer(DerivedMesh *dm); +void DM_calc_auto_bump_scale(DerivedMesh *dm); /* Set object's bounding box based on DerivedMesh min/max data */ void DM_set_object_boundbox(struct Object *ob, DerivedMesh *dm); diff --git a/source/blender/blenkernel/BKE_blender.h b/source/blender/blenkernel/BKE_blender.h index 257a550edb4..1e679d6fe4b 100644 --- a/source/blender/blenkernel/BKE_blender.h +++ b/source/blender/blenkernel/BKE_blender.h @@ -42,7 +42,7 @@ extern "C" { * and keep comment above the defines. * Use STRINGIFY() rather than defining with quotes */ #define BLENDER_VERSION 260 -#define BLENDER_SUBVERSION 7 +#define BLENDER_SUBVERSION 8 #define BLENDER_MINVERSION 250 #define BLENDER_MINSUBVERSION 0 diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c index 4b91911a6ab..0087b91c615 100644 --- a/source/blender/blenkernel/intern/DerivedMesh.c +++ b/source/blender/blenkernel/intern/DerivedMesh.c @@ -184,6 +184,7 @@ void DM_init(DerivedMesh *dm, DerivedMeshType type, DM_init_funcs(dm); dm->needsFree = 1; + dm->auto_bump_scale = -1.0f; } void DM_from_template(DerivedMesh *dm, DerivedMesh *source, DerivedMeshType type, @@ -1831,6 +1832,159 @@ void DM_add_tangent_layer(DerivedMesh *dm) MEM_freeN(vtangents); } +void DM_calc_auto_bump_scale(DerivedMesh *dm) +{ + /* int totvert= dm->getNumVerts(dm); */ /* UNUSED */ + int totface= dm->getNumFaces(dm); + + MVert * mvert = dm->getVertArray(dm); + MFace * mface = dm->getFaceArray(dm); + MTFace * mtface = dm->getFaceDataArray(dm, CD_MTFACE); + + if(mtface) + { + double dsum = 0.0; + int nr_accumulated = 0; + int f; + + for ( f=0; f<totface; f++ ) + { + { + float * verts[4], * tex_coords[4]; + const int nr_verts = mface[f].v4!=0 ? 4 : 3; + int i, is_degenerate; + + verts[0]=mvert[mface[f].v1].co; verts[1]=mvert[mface[f].v2].co; verts[2]=mvert[mface[f].v3].co; + tex_coords[0]=mtface[f].uv[0]; tex_coords[1]=mtface[f].uv[1]; tex_coords[2]=mtface[f].uv[2]; + if(nr_verts==4) + { + verts[3]=mvert[mface[f].v4].co; + tex_coords[3]=mtface[f].uv[3]; + } + + // discard degenerate faces + is_degenerate = 0; + if( equals_v3v3(verts[0], verts[1]) || equals_v3v3(verts[0], verts[2]) || equals_v3v3(verts[1], verts[2]) || + equals_v2v2(tex_coords[0], tex_coords[1]) || equals_v2v2(tex_coords[0], tex_coords[2]) || equals_v2v2(tex_coords[1], tex_coords[2]) ) + { + is_degenerate = 1; + } + + // verify last vertex as well if this is a quad + if ( is_degenerate==0 && nr_verts==4 ) + { + if( equals_v3v3(verts[3], verts[0]) || equals_v3v3(verts[3], verts[1]) || equals_v3v3(verts[3], verts[2]) || + equals_v2v2(tex_coords[3], tex_coords[0]) || equals_v2v2(tex_coords[3], tex_coords[1]) || equals_v2v2(tex_coords[3], tex_coords[2]) ) + { + is_degenerate = 1; + } + + // verify the winding is consistent + if ( is_degenerate==0 ) + { + float prev_edge[2]; + int is_signed = 0; + sub_v2_v2v2(prev_edge, tex_coords[0], tex_coords[3]); + + i = 0; + while ( is_degenerate==0 && i<4 ) + { + float cur_edge[2], signed_area; + sub_v2_v2v2(cur_edge, tex_coords[(i+1)&0x3], tex_coords[i]); + signed_area = prev_edge[0]*cur_edge[1] - prev_edge[1]*cur_edge[0]; + if ( i==0 ) is_signed = signed_area<0.0f ? 1 : 0; + else if((is_signed!=0)!=(signed_area<0.0f)) is_degenerate=1; + + if ( is_degenerate==0 ) + { + copy_v2_v2(prev_edge, cur_edge); + ++i; + } + } + } + } + + // proceed if not a degenerate face + if ( is_degenerate==0 ) + { + int nr_tris_to_pile=0; + // quads split at shortest diagonal + int offs = 0; // initial triangulation is 0,1,2 and 0, 2, 3 + if ( nr_verts==4 ) + { + float pos_len_diag0, pos_len_diag1; + float vtmp[3]; + sub_v3_v3v3(vtmp, verts[2], verts[0]); + pos_len_diag0 = dot_v3v3(vtmp, vtmp); + sub_v3_v3v3(vtmp, verts[3], verts[1]); + pos_len_diag1 = dot_v3v3(vtmp, vtmp); + + if(pos_len_diag1<pos_len_diag0) + offs=1; // alter split + else if(pos_len_diag0==pos_len_diag1) // do UV check instead + { + float tex_len_diag0, tex_len_diag1; + + sub_v2_v2v2(vtmp, tex_coords[2], tex_coords[0]); + tex_len_diag0 = dot_v2v2(vtmp, vtmp); + sub_v2_v2v2(vtmp, tex_coords[3], tex_coords[1]); + tex_len_diag1 = dot_v2v2(vtmp, vtmp); + + if(tex_len_diag1<tex_len_diag0) + { + offs=1; // alter split + } + } + } + nr_tris_to_pile = nr_verts-2 ; + if ( nr_tris_to_pile==1 || nr_tris_to_pile==2 ) + { + const int indices[] = {offs+0, offs+1, offs+2, offs+0, offs+2, (offs+3)&0x3 }; + int t; + for ( t=0; t<nr_tris_to_pile; t++ ) + { + float f2x_area_uv; + float * p0 = verts[indices[t*3+0]]; + float * p1 = verts[indices[t*3+1]]; + float * p2 = verts[indices[t*3+2]]; + + float edge_t0[2], edge_t1[2]; + sub_v2_v2v2(edge_t0, tex_coords[indices[t*3+1]], tex_coords[indices[t*3+0]]); + sub_v2_v2v2(edge_t1, tex_coords[indices[t*3+2]], tex_coords[indices[t*3+0]]); + + f2x_area_uv = fabsf(edge_t0[0]*edge_t1[1] - edge_t0[1]*edge_t1[0]); + if ( f2x_area_uv>FLT_EPSILON ) + { + float norm[3], v0[3], v1[3], f2x_surf_area, fsurf_ratio; + sub_v3_v3v3(v0, p1, p0); + sub_v3_v3v3(v1, p2, p0); + cross_v3_v3v3(norm, v0, v1); + + f2x_surf_area = len_v3(norm); + fsurf_ratio = f2x_surf_area/f2x_area_uv; // tri area divided by texture area + + ++nr_accumulated; + dsum += (double)(fsurf_ratio); + } + } + } + } + } + } + + // finalize + { + const float avg_area_ratio = (nr_accumulated>0) ? ((float)(dsum / nr_accumulated)) : 1.0f; + const float use_as_render_bump_scale = sqrtf(avg_area_ratio); // use width of average surface ratio as your bump scale + dm->auto_bump_scale = use_as_render_bump_scale; + } + } + else + { + dm->auto_bump_scale = 1.0f; + } +} + void DM_vertex_attributes_from_gpu(DerivedMesh *dm, GPUVertexAttribs *gattribs, DMVertexAttribs *attribs) { CustomData *vdata, *fdata, *tfdata = NULL; @@ -1851,6 +2005,15 @@ void DM_vertex_attributes_from_gpu(DerivedMesh *dm, GPUVertexAttribs *gattribs, else tfdata = fdata; + /* calc auto bump scale if necessary */ +#if 0 + if(dm->auto_bump_scale<=0.0f) + DM_calc_auto_bump_scale(dm); +#else + dm->auto_bump_scale = 1.0f; // will revert this after release +#endif + + /* add a tangent layer if necessary */ for(b = 0; b < gattribs->totlayer; b++) if(gattribs->layer[b].type == CD_TANGENT) diff --git a/source/blender/blenkernel/intern/brush.c b/source/blender/blenkernel/intern/brush.c index 7fac273ef77..2bf80fb7ecc 100644 --- a/source/blender/blenkernel/intern/brush.c +++ b/source/blender/blenkernel/intern/brush.c @@ -384,6 +384,7 @@ void brush_reset_sculpt(Brush *br) br->sub_col[1] = 1.000000; break; case SCULPT_TOOL_ROTATE: + br->alpha = 1.0; break; case SCULPT_TOOL_SMOOTH: br->flag &= ~BRUSH_SPACE_ATTEN; diff --git a/source/blender/blenkernel/intern/editderivedmesh.c b/source/blender/blenkernel/intern/editderivedmesh.c index 8eccfd4d3f0..bb1d20f0187 100644 --- a/source/blender/blenkernel/intern/editderivedmesh.c +++ b/source/blender/blenkernel/intern/editderivedmesh.c @@ -273,7 +273,7 @@ static void emDM_drawMappedFaces( { EditMeshDerivedMesh *emdm= (EditMeshDerivedMesh*) dm; EditFace *efa; - int i, draw; + int i, draw, flush; const int skip_normals= !glIsEnabled(GL_LIGHTING); /* could be passed as an arg */ /* GL_ZERO is used to detect if drawing has started or not */ @@ -352,7 +352,11 @@ static void emDM_drawMappedFaces( } } - if (draw==2) { + flush= (draw==2); + if (!skip_normals && !flush && efa->next) + flush|= efa->mat_nr != efa->next->mat_nr; + + if (flush) { glEnd(); poly_prev= GL_ZERO; /* force glBegin */ @@ -419,8 +423,11 @@ static void emDM_drawMappedFaces( } } + flush= (draw==2); + if (!skip_normals && !flush && efa->next) + flush|= efa->mat_nr != efa->next->mat_nr; - if (draw==2) { + if (flush) { glEnd(); poly_prev= GL_ZERO; /* force glBegin */ diff --git a/source/blender/blenkernel/intern/mesh_validate.c b/source/blender/blenkernel/intern/mesh_validate.c index 774565bb4bd..5a53d953f1b 100644 --- a/source/blender/blenkernel/intern/mesh_validate.c +++ b/source/blender/blenkernel/intern/mesh_validate.c @@ -325,8 +325,8 @@ int BKE_mesh_validate_arrays( Mesh *me, if (dverts) { MDeformVert *dv; for(i=0, dv= dverts; i<totvert; i++, dv++) { - MDeformWeight *dw= dv->dw; - unsigned int j= 0; + MDeformWeight *dw; + unsigned int j; for(j=0, dw= dv->dw; j < dv->totweight; j++, dw++) { /* note, greater then max defgroups is accounted for in our code, but not < 0 */ @@ -337,6 +337,13 @@ int BKE_mesh_validate_arrays( Mesh *me, vert_weights_fixed= TRUE; } } + else if (dw->weight < 0.0f || dw->weight > 1.0f) { + PRINT(" vertex deform %u, group %d has weight: %f\n", i, dw->def_nr, dw->weight); + if (do_fixes) { + CLAMP(dw->weight, 0.0f, 1.0f); + vert_weights_fixed= TRUE; + } + } if (dw->def_nr < 0) { PRINT(" vertex deform %u, has invalid group %d\n", i, dw->def_nr); diff --git a/source/blender/blenkernel/intern/tracking.c b/source/blender/blenkernel/intern/tracking.c index 1936a2fbfb2..65b10805ac6 100644 --- a/source/blender/blenkernel/intern/tracking.c +++ b/source/blender/blenkernel/intern/tracking.c @@ -48,6 +48,7 @@ #include "BLI_ghash.h" #include "BLI_path_util.h" #include "BLI_string.h" +#include "BLI_threads.h" #include "BKE_global.h" #include "BKE_tracking.h" @@ -881,6 +882,8 @@ MovieTrackingContext *BKE_tracking_context_new(MovieClip *clip, MovieClipUser *u context->clip= clip; context->user= *user; + BLI_begin_threaded_malloc(); + return context; } @@ -907,6 +910,8 @@ static void track_context_free(void *customdata) void BKE_tracking_context_free(MovieTrackingContext *context) { + BLI_end_threaded_malloc(); + tracks_map_free(context->tracks_map, track_context_free); MEM_freeN(context); diff --git a/source/blender/blenlib/BLI_fileops.h b/source/blender/blenlib/BLI_fileops.h index 712429716a6..2e8f1a5512e 100644 --- a/source/blender/blenlib/BLI_fileops.h +++ b/source/blender/blenlib/BLI_fileops.h @@ -56,6 +56,7 @@ int BLI_create_symlink(const char *path, const char *to); struct direntry; int BLI_is_dir(const char *path); +int BLI_is_file(const char *path); void BLI_dir_create_recursive(const char *dir); double BLI_dir_free_space(const char *dir); char *BLI_current_working_dir(char *dir, const int maxlen); diff --git a/source/blender/blenlib/intern/storage.c b/source/blender/blenlib/intern/storage.c index 1ef254d355f..001b191155d 100644 --- a/source/blender/blenlib/intern/storage.c +++ b/source/blender/blenlib/intern/storage.c @@ -471,6 +471,12 @@ int BLI_is_dir(const char *file) return S_ISDIR(BLI_exists(file)); } +int BLI_is_file(const char *path) +{ + int mode= BLI_exists(path); + return (mode && !S_ISDIR(mode)); +} + LinkNode *BLI_file_read_as_lines(const char *name) { FILE *fp= fopen(name, "r"); diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index 6479c3ee04d..340582ba627 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -12676,6 +12676,16 @@ static void do_versions(FileData *fd, Library *lib, Main *main) } } + if (main->versionfile < 260 || (main->versionfile == 260 && main->subversionfile < 8)) + { + Brush *brush; + + for (brush= main->brush.first; brush; brush= brush->id.next) { + if (brush->sculpt_tool == SCULPT_TOOL_ROTATE) + brush->alpha= 1.0f; + } + } + /* put compatibility code here until next subversion bump */ { MovieClip *clip; diff --git a/source/blender/editors/animation/keyingsets.c b/source/blender/editors/animation/keyingsets.c index 3b65e777200..682b40affc2 100644 --- a/source/blender/editors/animation/keyingsets.c +++ b/source/blender/editors/animation/keyingsets.c @@ -798,7 +798,7 @@ void ANIM_keying_sets_menu_setup (bContext *C, const char title[], const char op for (ks= builtin_keyingsets.first; ks; ks=ks->next, i--) { /* only show KeyingSet if context is suitable */ if (ANIM_keyingset_context_ok_poll(C, ks)) - uiItemEnumO_value(layout, ks->name, ICON_NONE, op_name, "type", i); + uiItemIntO(layout, ks->name, ICON_NONE, op_name, "type", i); } uiPupMenuEnd(C, pup); diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c index aee23626787..6ebfddff5c1 100644 --- a/source/blender/editors/interface/interface_handlers.c +++ b/source/blender/editors/interface/interface_handlers.c @@ -5492,6 +5492,11 @@ wmOperator *uiContextActiveOperator(const struct bContext *C) ARegion *ar_ctx= CTX_wm_region(C); uiBlock *block; + /* background mode */ + if (ar_ctx == NULL) { + return NULL; + } + /* scan active regions ui */ for(block=ar_ctx->uiblocks.first; block; block=block->next) { if (block->ui_operator) { diff --git a/source/blender/editors/interface/interface_ops.c b/source/blender/editors/interface/interface_ops.c index 2a75c2a26c1..b50df29918d 100644 --- a/source/blender/editors/interface/interface_ops.c +++ b/source/blender/editors/interface/interface_ops.c @@ -458,11 +458,16 @@ static int reports_to_text_exec(bContext *C, wmOperator *UNUSED(op)) * - otherwise, up to info (which is what users normally see) */ str = BKE_reports_string(reports, (G.f & G_DEBUG)? RPT_DEBUG : RPT_INFO); - - write_text(txt, str); - MEM_freeN(str); - - return OPERATOR_FINISHED; + + if (str) { + write_text(txt, str); + MEM_freeN(str); + + return OPERATOR_FINISHED; + } + else { + return OPERATOR_CANCELLED; + } } static void UI_OT_reports_to_textblock(wmOperatorType *ot) diff --git a/source/blender/editors/interface/interface_regions.c b/source/blender/editors/interface/interface_regions.c index 58c3c0130b8..b89a80bb0d7 100644 --- a/source/blender/editors/interface/interface_regions.c +++ b/source/blender/editors/interface/interface_regions.c @@ -2481,22 +2481,14 @@ void uiPupMenuOkee(bContext *C, const char *opname, const char *str, ...) va_end(ap); } +/* note, only call this is the file exists, + * the case where the file does not exist so can be saved without a + * popup must be checked for already, since saving from here + * will free the operator which will break invoke(). + * The operator state for this is implicitly OPERATOR_RUNNING_MODAL */ void uiPupMenuSaveOver(bContext *C, wmOperator *op, const char *filename) { - size_t len= strlen(filename); - - if(len==0) - return; - - if(filename[len-1]=='/' || filename[len-1]=='\\') { - uiPupMenuError(C, "Cannot overwrite a directory"); - WM_operator_free(op); - return; - } - if(BLI_exists(filename)==0) - operator_cb(C, op, 1); - else - confirm_operator(C, op, "Save Over", filename); + confirm_operator(C, op, "Save Over", filename); } void uiPupMenuNotice(bContext *C, const char *str, ...) diff --git a/source/blender/editors/mesh/editmesh_mods.c b/source/blender/editors/mesh/editmesh_mods.c index b1754fa2f2e..a6e6a041090 100644 --- a/source/blender/editors/mesh/editmesh_mods.c +++ b/source/blender/editors/mesh/editmesh_mods.c @@ -873,12 +873,10 @@ static int similar_face_select_exec(bContext *C, wmOperator *op) /* here was an edge-mode only select flush case, has to be generalized */ EM_selectmode_flush(em); WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data); - BKE_mesh_end_editmesh(me, em); - return OPERATOR_FINISHED; } BKE_mesh_end_editmesh(me, em); - return OPERATOR_CANCELLED; + return OPERATOR_FINISHED; } /* ***************************************************** */ @@ -1092,12 +1090,10 @@ static int similar_edge_select_exec(bContext *C, wmOperator *op) /* here was an edge-mode only select flush case, has to be generalized */ EM_selectmode_flush(em); WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data); - BKE_mesh_end_editmesh(me, em); - return OPERATOR_FINISHED; } - + BKE_mesh_end_editmesh(me, em); - return OPERATOR_CANCELLED; + return OPERATOR_FINISHED; } /* ********************************* */ @@ -1135,7 +1131,7 @@ static int similar_vert_select_exec(bContext *C, wmOperator *op) if (!ok || !deselcount) { /* no data selected OR no more data to select*/ BKE_mesh_end_editmesh(me, em); - return 0; + return OPERATOR_CANCELLED; } if(mode == SIMVERT_FACE) { @@ -1166,7 +1162,7 @@ static int similar_vert_select_exec(bContext *C, wmOperator *op) deselcount--; if (!deselcount) {/*have we selected all posible faces?, if so return*/ BKE_mesh_end_editmesh(me, em); - return selcount; + return OPERATOR_FINISHED; } } } @@ -1184,7 +1180,7 @@ static int similar_vert_select_exec(bContext *C, wmOperator *op) deselcount--; if (!deselcount) {/*have we selected all posible faces?, if so return*/ BKE_mesh_end_editmesh(me, em); - return selcount; + return OPERATOR_FINISHED; } } } @@ -1198,7 +1194,7 @@ static int similar_vert_select_exec(bContext *C, wmOperator *op) if (!base_dvert || base_dvert->totweight == 0) { BKE_mesh_end_editmesh(me, em); - return selcount; + return OPERATOR_FINISHED; } for(eve= em->verts.first; eve; eve= eve->next) { @@ -1216,7 +1212,7 @@ static int similar_vert_select_exec(bContext *C, wmOperator *op) deselcount--; if (!deselcount) { /*have we selected all posible faces?, if so return*/ BKE_mesh_end_editmesh(me, em); - return selcount; + return OPERATOR_FINISHED; } break; } @@ -1230,12 +1226,10 @@ static int similar_vert_select_exec(bContext *C, wmOperator *op) if(selcount) { WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data); - BKE_mesh_end_editmesh(me, em); - return OPERATOR_FINISHED; } BKE_mesh_end_editmesh(me, em); - return OPERATOR_CANCELLED; + return OPERATOR_FINISHED; } static int select_similar_exec(bContext *C, wmOperator *op) diff --git a/source/blender/editors/mesh/editmesh_tools.c b/source/blender/editors/mesh/editmesh_tools.c index df81f80ade8..2e5fc515330 100644 --- a/source/blender/editors/mesh/editmesh_tools.c +++ b/source/blender/editors/mesh/editmesh_tools.c @@ -7510,10 +7510,11 @@ static int select_axis_exec(bContext *C, wmOperator *op) EditSelection *ese = em->selected.last; - if(ese==NULL) + if (ese==NULL || ese->type != EDITVERT) { + BKE_report(op->reports, RPT_WARNING, "This operator requires an active vertex (last selected)"); return OPERATOR_CANCELLED; - - if(ese->type==EDITVERT) { + } + else { EditVert *ev; EditVert *act_vert= (EditVert*)ese->data; float value= act_vert->co[axis]; diff --git a/source/blender/editors/object/object_add.c b/source/blender/editors/object/object_add.c index 855b67b71bc..8c60a4d5868 100644 --- a/source/blender/editors/object/object_add.c +++ b/source/blender/editors/object/object_add.c @@ -893,7 +893,7 @@ static int object_delete_exec(bContext *C, wmOperator *op) { Main *bmain= CTX_data_main(C); Scene *scene= CTX_data_scene(C); - const short use_global= RNA_boolean_get(op->ptr, "global"); + const short use_global= RNA_boolean_get(op->ptr, "use_global"); /* int islamp= 0; */ /* UNUSED */ if(CTX_data_edit_object(C)) @@ -951,7 +951,7 @@ void OBJECT_OT_delete(wmOperatorType *ot) /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; - RNA_def_boolean(ot->srna, "global", 0, "Delete Globally", "Remove object from all scenes"); + RNA_def_boolean(ot->srna, "use_global", 0, "Delete Globally", "Remove object from all scenes"); } /**************************** Copy Utilities ******************************/ diff --git a/source/blender/editors/object/object_hook.c b/source/blender/editors/object/object_hook.c index 2a827091fde..773974d0cc0 100644 --- a/source/blender/editors/object/object_hook.c +++ b/source/blender/editors/object/object_hook.c @@ -608,7 +608,9 @@ void OBJECT_OT_hook_remove(wmOperatorType *ot) ot->poll= hook_op_edit_poll; /* flags */ - ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + /* this operator removes modifier which isn't stored in local undo stack, + so redoing it from redo panel gives totally weird results */ + ot->flag= /*OPTYPE_REGISTER|*/OPTYPE_UNDO; /* properties */ prop= RNA_def_enum(ot->srna, "modifier", DummyRNA_NULL_items, 0, "Modifier", "Modifier number to remove"); @@ -794,7 +796,9 @@ void OBJECT_OT_hook_assign(wmOperatorType *ot) ot->poll= hook_op_edit_poll; /* flags */ - ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + /* this operator changes data stored in modifier which doesn't get pushed to undo stack, + so redoing it from redo panel gives totally weird results */ + ot->flag= /*OPTYPE_REGISTER|*/OPTYPE_UNDO; /* properties */ prop= RNA_def_enum(ot->srna, "modifier", DummyRNA_NULL_items, 0, "Modifier", "Modifier number to assign to"); diff --git a/source/blender/editors/object/object_ops.c b/source/blender/editors/object/object_ops.c index b7fe2d70b37..3b4a5ed976e 100644 --- a/source/blender/editors/object/object_ops.c +++ b/source/blender/editors/object/object_ops.c @@ -338,9 +338,9 @@ void ED_keymap_object(wmKeyConfig *keyconf) WM_keymap_add_item(keymap, "OBJECT_OT_move_to_layer", MKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "OBJECT_OT_delete", XKEY, KM_PRESS, 0, 0); - RNA_boolean_set(WM_keymap_add_item(keymap, "OBJECT_OT_delete", XKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "global", TRUE); + RNA_boolean_set(WM_keymap_add_item(keymap, "OBJECT_OT_delete", XKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "use_global", TRUE); WM_keymap_add_item(keymap, "OBJECT_OT_delete", DELKEY, KM_PRESS, 0, 0); - RNA_boolean_set(WM_keymap_add_item(keymap, "OBJECT_OT_delete", DELKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "global", TRUE); + RNA_boolean_set(WM_keymap_add_item(keymap, "OBJECT_OT_delete", DELKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "use_global", TRUE); WM_keymap_add_menu(keymap, "INFO_MT_add", AKEY, KM_PRESS, KM_SHIFT, 0); diff --git a/source/blender/editors/sculpt_paint/paint_vertex.c b/source/blender/editors/sculpt_paint/paint_vertex.c index fa791665eb8..52d1cf0b012 100644 --- a/source/blender/editors/sculpt_paint/paint_vertex.c +++ b/source/blender/editors/sculpt_paint/paint_vertex.c @@ -1763,10 +1763,13 @@ static int set_wpaint(bContext *C, wmOperator *UNUSED(op)) /* toggle */ /* for switching to/from mode */ static int paint_poll_test(bContext *C) { + Object *ob= CTX_data_active_object(C); if(CTX_data_edit_object(C)) return 0; if(CTX_data_active_object(C)==NULL) return 0; + if(!ob->data || ((ID *)ob->data)->lib) + return 0; return 1; } diff --git a/source/blender/editors/sculpt_paint/sculpt.c b/source/blender/editors/sculpt_paint/sculpt.c index a63a9256055..b84fea29e62 100644 --- a/source/blender/editors/sculpt_paint/sculpt.c +++ b/source/blender/editors/sculpt_paint/sculpt.c @@ -648,9 +648,11 @@ static float brush_strength(Sculpt *sd, StrokeCache *cache, float feather) return feather; case SCULPT_TOOL_GRAB: - case SCULPT_TOOL_ROTATE: return feather; + case SCULPT_TOOL_ROTATE: + return alpha*pressure*feather; + default: return 0; } @@ -1502,13 +1504,20 @@ static void do_rotate_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnod float bstrength= ss->cache->bstrength; float an[3]; int n; - float m[3][3]; + float m[4][4], rot[4][4], lmat[4][4], ilmat[4][4]; static const int flip[8] = { 1, -1, -1, 1, -1, 1, 1, -1 }; float angle = ss->cache->vertex_rotation * flip[ss->cache->mirror_symmetry_pass]; calc_sculpt_normal(sd, ob, an, nodes, totnode); - axis_angle_to_mat3(m, an, angle); + unit_m4(m); + unit_m4(lmat); + + copy_v3_v3(lmat[3], ss->cache->location); + invert_m4_m4(ilmat, lmat); + axis_angle_to_mat4(rot, an, angle); + + mul_serie_m4(m, lmat, rot, ilmat, NULL, NULL, NULL, NULL, NULL); #pragma omp parallel for schedule(guided) if (sd->flags & SCULPT_USE_OPENMP) for(n=0; n<totnode; n++) { @@ -1532,7 +1541,7 @@ static void do_rotate_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnod const float fade = bstrength*tex_strength(ss, brush, origco[vd.i], test.dist, an, origno[vd.i], NULL); - mul_v3_m3v3(proxy[vd.i], m, origco[vd.i]); + mul_v3_m4v3(proxy[vd.i], m, origco[vd.i]); sub_v3_v3(proxy[vd.i], origco[vd.i]); mul_v3_fl(proxy[vd.i], fade); @@ -3160,7 +3169,7 @@ static void sculpt_update_cache_variants(bContext *C, Sculpt *sd, Object *ob, st dx = cache->mouse[0] - cache->initial_mouse[0]; dy = cache->mouse[1] - cache->initial_mouse[1]; - cache->vertex_rotation = -atan2(dx, dy); + cache->vertex_rotation = -atan2(dx, dy) * cache->bstrength; sd->draw_anchored = 1; copy_v2_v2(sd->anchored_initial_mouse, cache->initial_mouse); diff --git a/source/blender/editors/space_clip/clip_toolbar.c b/source/blender/editors/space_clip/clip_toolbar.c index fe09c5cd829..941c12df4aa 100644 --- a/source/blender/editors/space_clip/clip_toolbar.c +++ b/source/blender/editors/space_clip/clip_toolbar.c @@ -212,6 +212,7 @@ static void clip_panel_operator_redo_operator(const bContext *C, Panel *pa, wmOp } } +/* TODO de-duplicate redo panel functions - campbell */ static void clip_panel_operator_redo(const bContext *C, Panel *pa) { wmOperator *op= WM_operator_last_redo(C); @@ -224,7 +225,7 @@ static void clip_panel_operator_redo(const bContext *C, Panel *pa) block= uiLayoutGetBlock(pa->layout); - if(ED_undo_valid(C, op->type->name)==0) + if (!WM_operator_check_ui_enabled(C, op->type->name)) uiLayoutSetEnabled(pa->layout, 0); /* note, blockfunc is a default but->func, use Handle func to allow button callbacks too */ diff --git a/source/blender/editors/space_file/file_ops.c b/source/blender/editors/space_file/file_ops.c index 69c192b077b..daa2031bb5f 100644 --- a/source/blender/editors/space_file/file_ops.c +++ b/source/blender/editors/space_file/file_ops.c @@ -715,7 +715,7 @@ int file_draw_check_exists(SpaceFile *sfile) if(RNA_boolean_get(sfile->op->ptr, "check_existing")) { char filepath[FILE_MAX]; BLI_join_dirfile(filepath, sizeof(filepath), sfile->params->dir, sfile->params->file); - if(BLI_exists(filepath) && !BLI_is_dir(filepath)) { + if(BLI_is_file(filepath)) { return TRUE; } } @@ -1143,8 +1143,8 @@ int file_directory_exec(bContext *C, wmOperator *UNUSED(unused)) BLI_dir_create_recursive(sfile->params->dir); } - /* special case, user may have pasted a fulepath into the directory */ - if(BLI_exists(sfile->params->dir) && BLI_is_dir(sfile->params->dir) == 0) { + /* special case, user may have pasted a filepath into the directory */ + if(BLI_is_file(sfile->params->dir)) { char path[sizeof(sfile->params->dir)]; BLI_strncpy(path, sfile->params->dir, sizeof(path)); BLI_split_dirfile(path, sfile->params->dir, sfile->params->file, sizeof(sfile->params->dir), sizeof(sfile->params->file)); diff --git a/source/blender/editors/space_node/node_edit.c b/source/blender/editors/space_node/node_edit.c index 4074e35f860..e5a216d42b0 100644 --- a/source/blender/editors/space_node/node_edit.c +++ b/source/blender/editors/space_node/node_edit.c @@ -483,6 +483,7 @@ void node_tree_from_ID(ID *id, bNodeTree **ntree, bNodeTree **edittree, int *tre } else { *ntree= NULL; + *edittree= NULL; if(treetype) *treetype= 0; } } diff --git a/source/blender/editors/space_view3d/drawmesh.c b/source/blender/editors/space_view3d/drawmesh.c index e83591b73f5..6dd362b827f 100644 --- a/source/blender/editors/space_view3d/drawmesh.c +++ b/source/blender/editors/space_view3d/drawmesh.c @@ -513,7 +513,7 @@ static int draw_tface_mapped__set_draw(void *userData, int index) static int draw_em_tf_mapped__set_draw(void *userData, int index) { - struct {DerivedMesh *dm; EditMesh *em; short has_mcol; short has_mtface;} *data = userData; + struct {EditMesh *em; short has_mcol; short has_mtface; MFace *mf; MTFace *tf;} *data = userData; EditMesh *em = data->em; EditFace *efa= EM_get_face_for_index(index); MTFace *tface; @@ -631,14 +631,12 @@ static void draw_mesh_text(Scene *scene, Object *ob, int glsl) static int compareDrawOptions(void *userData, int cur_index, int next_index) { - DerivedMesh *dm= (DerivedMesh*) userData; - MFace *mf = DM_get_face_data_layer(dm, CD_MFACE); - MTFace *tf = DM_get_face_data_layer(dm, CD_MTFACE); + struct { MFace *mf; MTFace *tf; } *data = userData; - if(mf && mf[cur_index].mat_nr != mf[next_index].mat_nr) + if(data->mf && data->mf[cur_index].mat_nr != data->mf[next_index].mat_nr) return 0; - if(tf && tf[cur_index].tpage != tf[next_index].tpage) + if(data->tf && data->tf[cur_index].tpage != data->tf[next_index].tpage) return 0; return 1; @@ -646,14 +644,12 @@ static int compareDrawOptions(void *userData, int cur_index, int next_index) static int compareDrawOptionsEm(void *userData, int cur_index, int next_index) { - struct {DerivedMesh *dm; EditMesh *em; short has_mcol; short has_mtface;} *data= userData; - MFace *mf = DM_get_face_data_layer(data->dm, CD_MFACE); - MTFace *tf = DM_get_face_data_layer(data->dm, CD_MTFACE); + struct {EditMesh *em; short has_mcol; short has_mtface; MFace *mf; MTFace *tf;} *data= userData; - if(mf && mf[cur_index].mat_nr != mf[next_index].mat_nr) + if(data->mf && data->mf[cur_index].mat_nr != data->mf[next_index].mat_nr) return 0; - if(tf && tf[cur_index].tpage != tf[next_index].tpage) + if(data->tf && data->tf[cur_index].tpage != data->tf[next_index].tpage) return 0; return 1; @@ -673,12 +669,13 @@ void draw_mesh_textured_old(Scene *scene, View3D *v3d, RegionView3D *rv3d, Objec glColor4f(1.0f,1.0f,1.0f,1.0f); if(ob->mode & OB_MODE_EDIT) { - struct {DerivedMesh *dm; EditMesh *em; short has_mcol; short has_mtface;} data; + struct {EditMesh *em; short has_mcol; short has_mtface; MFace *mf; MTFace *tf;} data; - data.dm = dm; data.em= me->edit_mesh; data.has_mcol= CustomData_has_layer(&me->edit_mesh->fdata, CD_MCOL); data.has_mtface= CustomData_has_layer(&me->edit_mesh->fdata, CD_MTFACE); + data.mf= DM_get_face_data_layer(dm, CD_MFACE); + data.tf= DM_get_face_data_layer(dm, CD_MTFACE); dm->drawMappedFacesTex(dm, draw_em_tf_mapped__set_draw, compareDrawOptionsEm, &data); } @@ -696,10 +693,15 @@ void draw_mesh_textured_old(Scene *scene, View3D *v3d, RegionView3D *rv3d, Objec dm->drawFacesTex(dm, draw_tface__set_draw_legacy, NULL, NULL); } else { + struct { MFace *mf; MTFace *tf; } userData; + if(!CustomData_has_layer(&dm->faceData,CD_TEXTURE_MCOL)) add_tface_color_layer(dm); - dm->drawFacesTex(dm, draw_tface__set_draw, compareDrawOptions, dm); + userData.mf = DM_get_face_data_layer(dm, CD_MFACE); + userData.tf = DM_get_face_data_layer(dm, CD_MTFACE); + + dm->drawFacesTex(dm, draw_tface__set_draw, compareDrawOptions, &userData); } } diff --git a/source/blender/editors/space_view3d/drawobject.c b/source/blender/editors/space_view3d/drawobject.c index b6d3a07f0e3..cf210e67bdf 100644 --- a/source/blender/editors/space_view3d/drawobject.c +++ b/source/blender/editors/space_view3d/drawobject.c @@ -2381,7 +2381,7 @@ static void draw_dm_edges_sharp(DerivedMesh *dm) * return 2 for the active face so it renders with stipple enabled */ static int draw_dm_faces_sel__setDrawOptions(void *userData, int index, int *UNUSED(drawSmooth_r)) { - struct { DerivedMesh *dm; unsigned char *cols[3]; EditFace *efa_act; } * data = userData; + struct { unsigned char *cols[3]; EditFace *efa_act; int *orig_index; } * data = userData; EditFace *efa = EM_get_face_for_index(index); unsigned char *col; @@ -2401,17 +2401,16 @@ static int draw_dm_faces_sel__setDrawOptions(void *userData, int index, int *UNU static int draw_dm_faces_sel__compareDrawOptions(void *userData, int index, int next_index) { - struct { DerivedMesh *dm; unsigned char *cols[3]; EditFace *efa_act; } *data = userData; - int *orig_index= DM_get_face_data_layer(data->dm, CD_ORIGINDEX); + struct { unsigned char *cols[3]; EditFace *efa_act; int *orig_index; } *data = userData; EditFace *efa; EditFace *next_efa; unsigned char *col, *next_col; - if(!orig_index) + if(!data->orig_index) return 0; - efa= EM_get_face_for_index(orig_index[index]); - next_efa= EM_get_face_for_index(orig_index[next_index]); + efa= EM_get_face_for_index(data->orig_index[index]); + next_efa= EM_get_face_for_index(data->orig_index[next_index]); if(efa == next_efa) return 1; @@ -2431,12 +2430,12 @@ static int draw_dm_faces_sel__compareDrawOptions(void *userData, int index, int /* also draws the active face */ static void draw_dm_faces_sel(DerivedMesh *dm, unsigned char *baseCol, unsigned char *selCol, unsigned char *actCol, EditFace *efa_act) { - struct { DerivedMesh *dm; unsigned char *cols[3]; EditFace *efa_act; } data; - data.dm= dm; + struct { unsigned char *cols[3]; EditFace *efa_act; int *orig_index; } data; data.cols[0] = baseCol; data.cols[1] = selCol; data.cols[2] = actCol; data.efa_act = efa_act; + data.orig_index = DM_get_face_data_layer(dm, CD_ORIGINDEX); dm->drawMappedFaces(dm, draw_dm_faces_sel__setDrawOptions, GPU_enable_material, draw_dm_faces_sel__compareDrawOptions, &data, 0); } diff --git a/source/blender/editors/space_view3d/view3d_toolbar.c b/source/blender/editors/space_view3d/view3d_toolbar.c index 5d65202d7df..49b1b3f723e 100644 --- a/source/blender/editors/space_view3d/view3d_toolbar.c +++ b/source/blender/editors/space_view3d/view3d_toolbar.c @@ -96,6 +96,7 @@ static void view3d_panel_operator_redo_operator(const bContext *C, Panel *pa, wm } } +/* TODO de-duplicate redo panel functions - campbell */ static void view3d_panel_operator_redo(const bContext *C, Panel *pa) { wmOperator *op= WM_operator_last_redo(C); @@ -108,7 +109,7 @@ static void view3d_panel_operator_redo(const bContext *C, Panel *pa) block= uiLayoutGetBlock(pa->layout); - if(ED_undo_valid(C, op->type->name)==0) + if (!WM_operator_check_ui_enabled(C, op->type->name)) uiLayoutSetEnabled(pa->layout, 0); /* note, blockfunc is a default but->func, use Handle func to allow button callbacks too */ diff --git a/source/blender/editors/transform/transform_conversions.c b/source/blender/editors/transform/transform_conversions.c index 96eb60272c1..264ca803135 100644 --- a/source/blender/editors/transform/transform_conversions.c +++ b/source/blender/editors/transform/transform_conversions.c @@ -294,7 +294,8 @@ static void createTransTexspace(TransInfo *t) /* ********************* edge (for crease) ***** */ -static void createTransEdge(TransInfo *t) { +static void createTransEdge(TransInfo *t) +{ EditMesh *em = ((Mesh *)t->obedit->data)->edit_mesh; TransData *td = NULL; EditEdge *eed; @@ -1919,8 +1920,8 @@ static void get_face_center(float *cent, EditMesh *em, EditVert *eve) } } -//way to overwrite what data is edited with transform -//static void VertsToTransData(TransData *td, EditVert *eve, BakeKey *key) +/* way to overwrite what data is edited with transform + * static void VertsToTransData(TransData *td, EditVert *eve, BakeKey *key) */ static void VertsToTransData(TransInfo *t, TransData *td, EditMesh *em, EditVert *eve) { td->flag = 0; @@ -1952,33 +1953,6 @@ static void VertsToTransData(TransInfo *t, TransData *td, EditMesh *em, EditVert } } -#if 0 -static void createTransBMeshVerts(TransInfo *t, BME_Mesh *bm, BME_TransData_Head *td) { - BME_Vert *v; - BME_TransData *vtd; - TransData *tob; - int i; - - tob = t->data = MEM_callocN(td->len*sizeof(TransData), "TransObData(Bevel tool)"); - - for (i=0,v=bm->verts.first;v;v=v->next) { - if ( (vtd = BME_get_transdata(td,v)) ) { - tob->loc = vtd->loc; - tob->val = &vtd->factor; - copy_v3_v3(tob->iloc,vtd->co); - copy_v3_v3(tob->center,vtd->org); - copy_v3_v3(tob->axismtx[0],vtd->vec); - tob->axismtx[1][0] = vtd->max ? *vtd->max : 0; - tob++; - i++; - } - } - /* since td is a memarena, it can hold more transdata than actual elements - * (i.e. we can't depend on td->len to determine the number of actual elements) */ - t->total = i; -} -#endif - static void createTransEditVerts(bContext *C, TransInfo *t) { ToolSettings *ts = CTX_data_tool_settings(C); diff --git a/source/blender/editors/util/undo.c b/source/blender/editors/util/undo.c index f0055bd6008..3ec99ca7508 100644 --- a/source/blender/editors/util/undo.c +++ b/source/blender/editors/util/undo.c @@ -126,8 +126,8 @@ static int ed_undo_step(bContext *C, int step, const char *undoname) ScrArea *sa= CTX_wm_area(C); /* undo during jobs are running can easily lead to freeing data using by jobs, - or they can just lead to freezing job in some other cases */ - if(WM_jobs_has_running(CTX_wm_manager(C))) { + * or they can just lead to freezing job in some other cases */ + if (WM_jobs_test(CTX_wm_manager(C), CTX_data_scene(C))) { return OPERATOR_CANCELLED; } @@ -341,13 +341,24 @@ int ED_undo_operator_repeat(bContext *C, struct wmOperator *op) int ret= 0; if(op) { + wmWindowManager *wm= CTX_wm_manager(C); + struct Scene *scene= CTX_data_scene(C); + ARegion *ar= CTX_wm_region(C); ARegion *ar1= BKE_area_find_region_type(CTX_wm_area(C), RGN_TYPE_WINDOW); if(ar1) CTX_wm_region_set(C, ar1); - if(WM_operator_repeat_check(C, op) && WM_operator_poll(C, op->type)) { + if ( (WM_operator_repeat_check(C, op)) && + (WM_operator_poll(C, op->type)) && + /* note, undo/redo cant run if there are jobs active, + * check for screen jobs only so jobs like material/texture/world preview + * (which copy their data), wont stop redo, see [#29579]], + * + * note, - WM_operator_check_ui_enabled() jobs test _must_ stay in sync with this */ + (WM_jobs_test(wm, scene) == 0)) + { int retval; if (G.f & G_DEBUG) diff --git a/source/blender/gpu/GPU_material.h b/source/blender/gpu/GPU_material.h index 418bea5fe9c..5689f02d2d7 100644 --- a/source/blender/gpu/GPU_material.h +++ b/source/blender/gpu/GPU_material.h @@ -83,7 +83,8 @@ typedef enum GPUBuiltin { GPU_INVERSE_OBJECT_MATRIX = 8, GPU_VIEW_POSITION = 16, GPU_VIEW_NORMAL = 32, - GPU_OBCOLOR = 64 + GPU_OBCOLOR = 64, + GPU_AUTO_BUMPSCALE = 128 } GPUBuiltin; typedef enum GPUBlendMode { @@ -129,7 +130,7 @@ void GPU_material_free(struct Material *ma); void GPU_materials_free(void); void GPU_material_bind(GPUMaterial *material, int oblay, int viewlay, double time, int mipmap); -void GPU_material_bind_uniforms(GPUMaterial *material, float obmat[][4], float viewmat[][4], float viewinv[][4], float obcol[4]); +void GPU_material_bind_uniforms(GPUMaterial *material, float obmat[][4], float viewmat[][4], float viewinv[][4], float obcol[4], float autobumpscale); void GPU_material_unbind(GPUMaterial *material); int GPU_material_bound(GPUMaterial *material); @@ -162,6 +163,7 @@ typedef enum GPUDynamicType { GPU_DYNAMIC_OBJECT_VIEWIMAT = 3, GPU_DYNAMIC_OBJECT_IMAT = 4, GPU_DYNAMIC_OBJECT_COLOR = 5, + GPU_DYNAMIC_OBJECT_AUTOBUMPSCALE = 15, GPU_DYNAMIC_LAMP_FIRST = 6, GPU_DYNAMIC_LAMP_DYNVEC = 6, GPU_DYNAMIC_LAMP_DYNCO = 7, diff --git a/source/blender/gpu/intern/gpu_codegen.c b/source/blender/gpu/intern/gpu_codegen.c index 185f9eb185e..05c459b703d 100644 --- a/source/blender/gpu/intern/gpu_codegen.c +++ b/source/blender/gpu/intern/gpu_codegen.c @@ -344,6 +344,8 @@ const char *GPU_builtin_name(GPUBuiltin builtin) return "varnormal"; else if(builtin == GPU_OBCOLOR) return "unfobcolor"; + else if(builtin == GPU_AUTO_BUMPSCALE) + return "unfobautobumpscale"; else return ""; } diff --git a/source/blender/gpu/intern/gpu_draw.c b/source/blender/gpu/intern/gpu_draw.c index 3cd3cde8aad..4af0cceb4e0 100644 --- a/source/blender/gpu/intern/gpu_draw.c +++ b/source/blender/gpu/intern/gpu_draw.c @@ -60,6 +60,7 @@ #include "BKE_node.h" #include "BKE_object.h" #include "BKE_scene.h" +#include "BKE_DerivedMesh.h" #include "BLI_threads.h" #include "BLI_blenlib.h" @@ -1155,11 +1156,14 @@ int GPU_enable_material(int nr, void *attribs) if(gattribs && GMS.gmatbuf[nr]) { /* bind glsl material and get attributes */ Material *mat = GMS.gmatbuf[nr]; + float auto_bump_scale; gpumat = GPU_material_from_blender(GMS.gscene, mat); GPU_material_vertex_attributes(gpumat, gattribs); GPU_material_bind(gpumat, GMS.gob->lay, GMS.glay, 1.0, !(GMS.gob->mode & OB_MODE_TEXTURE_PAINT)); - GPU_material_bind_uniforms(gpumat, GMS.gob->obmat, GMS.gviewmat, GMS.gviewinv, GMS.gob->col); + + auto_bump_scale = GMS.gob->derivedFinal != NULL ? GMS.gob->derivedFinal->auto_bump_scale : 1.0f; + GPU_material_bind_uniforms(gpumat, GMS.gob->obmat, GMS.gviewmat, GMS.gviewinv, GMS.gob->col, auto_bump_scale); GMS.gboundmat= mat; /* for glsl use alpha blend mode, unless it's set to solid and diff --git a/source/blender/gpu/intern/gpu_material.c b/source/blender/gpu/intern/gpu_material.c index 397c0e32c69..2d8487deb71 100644 --- a/source/blender/gpu/intern/gpu_material.c +++ b/source/blender/gpu/intern/gpu_material.c @@ -94,7 +94,7 @@ struct GPUMaterial { /* for passing uniforms */ int viewmatloc, invviewmatloc; int obmatloc, invobmatloc; - int obcolloc; + int obcolloc, obautobumpscaleloc; ListBase lamps; }; @@ -212,7 +212,8 @@ static int GPU_material_construct_end(GPUMaterial *material) material->invobmatloc = GPU_shader_get_uniform(shader, GPU_builtin_name(GPU_INVERSE_OBJECT_MATRIX)); if(material->builtins & GPU_OBCOLOR) material->obcolloc = GPU_shader_get_uniform(shader, GPU_builtin_name(GPU_OBCOLOR)); - + if(material->builtins & GPU_AUTO_BUMPSCALE) + material->obautobumpscaleloc = GPU_shader_get_uniform(shader, GPU_builtin_name(GPU_AUTO_BUMPSCALE)); return 1; } @@ -273,7 +274,7 @@ void GPU_material_bind(GPUMaterial *material, int oblay, int viewlay, double tim } } -void GPU_material_bind_uniforms(GPUMaterial *material, float obmat[][4], float viewmat[][4], float viewinv[][4], float obcol[4]) +void GPU_material_bind_uniforms(GPUMaterial *material, float obmat[][4], float viewmat[][4], float viewinv[][4], float obcol[4], float autobumpscale) { if(material->pass) { GPUShader *shader = GPU_pass_shader(material->pass); @@ -300,7 +301,9 @@ void GPU_material_bind_uniforms(GPUMaterial *material, float obmat[][4], float v CLAMP(col[3], 0.0f, 1.0f); GPU_shader_uniform_vector(shader, material->obcolloc, 4, 1, col); } - + if(material->builtins & GPU_AUTO_BUMPSCALE) { + GPU_shader_uniform_vector(shader, material->obautobumpscaleloc, 1, 1, &autobumpscale); + } /* update lamps */ for(nlink=material->lamps.first; nlink; nlink=nlink->next) { lamp= nlink->data; @@ -1087,8 +1090,7 @@ static void do_material_tex(GPUShadeInput *shi) /* ntap bumpmap image */ int iBumpSpace; float ima_x, ima_y; - float hScale = 0.1f; // compatibility adjustment factor for all bumpspace types - float hScaleTex = 13.0f; // factor for scaling texspace bumps + float hScale; float imag_tspace_dimension_x = 1024.0f; // only used for texture space variant float aspect = 1.0f; @@ -1096,16 +1098,35 @@ static void do_material_tex(GPUShadeInput *shi) GPUNodeLink *surf_pos = GPU_builtin(GPU_VIEW_POSITION); GPUNodeLink *vR1, *vR2; GPUNodeLink *dBs, *dBt, *fDet; - + + hScale = 0.1; // compatibility adjustment factor for all bumpspace types if( mtex->texflag & MTEX_BUMP_TEXTURESPACE ) - hScale = hScaleTex; + hScale = 13.0f; // factor for scaling texspace bumps + else if(found_deriv_map!=0) + hScale = 1.0f; + + // resolve texture resolution + if( (mtex->texflag & MTEX_BUMP_TEXTURESPACE) || found_deriv_map ) { + ImBuf *ibuf= BKE_image_get_ibuf(tex->ima, &tex->iuser); + ima_x= 512.0f; ima_y= 512.f; // prevent calling textureSize, glsl 1.3 only + if(ibuf) { + ima_x= ibuf->x; + ima_y= ibuf->y; + aspect = ((float) ima_y) / ima_x; + } + } // The negate on norfac is done because the // normal in the renderer points inward which corresponds // to inverting the bump map. Should this ever change // this negate must be removed. norfac = -hScale * mtex->norfac; + if(found_deriv_map) norfac /= sqrtf(ima_x*ima_y); + tnorfac = GPU_uniform(&norfac); + + if(found_deriv_map) + GPU_link(mat, "math_multiply", tnorfac, GPU_builtin(GPU_AUTO_BUMPSCALE), &tnorfac); if(GPU_link_changed(stencil)) GPU_link(mat, "math_multiply", tnorfac, stencil, &tnorfac); @@ -1152,17 +1173,6 @@ static void do_material_tex(GPUShadeInput *shi) iBumpSpacePrev = iBumpSpace; } - - // resolve texture resolution - if( (mtex->texflag & MTEX_BUMP_TEXTURESPACE) || found_deriv_map ) { - ImBuf *ibuf= BKE_image_get_ibuf(tex->ima, &tex->iuser); - ima_x= 512.0f; ima_y= 512.f; // prevent calling textureSize, glsl 1.3 only - if(ibuf) { - ima_x= ibuf->x; - ima_y= ibuf->y; - aspect = ((float) ima_y) / ima_x; - } - } if(found_deriv_map) { @@ -1703,6 +1713,7 @@ GPUShaderExport *GPU_shader_export(struct Scene *scene, struct Material *ma) { GPU_OBJECT_MATRIX, GPU_DYNAMIC_OBJECT_MAT, GPU_DATA_16F }, { GPU_INVERSE_OBJECT_MATRIX, GPU_DYNAMIC_OBJECT_IMAT, GPU_DATA_16F }, { GPU_OBCOLOR, GPU_DYNAMIC_OBJECT_COLOR, GPU_DATA_4F }, + { GPU_AUTO_BUMPSCALE, GPU_DYNAMIC_OBJECT_AUTOBUMPSCALE, GPU_DATA_1F }, { 0 } }; diff --git a/source/blender/makesdna/DNA_curve_types.h b/source/blender/makesdna/DNA_curve_types.h index 8214a32e9fb..545829911e5 100644 --- a/source/blender/makesdna/DNA_curve_types.h +++ b/source/blender/makesdna/DNA_curve_types.h @@ -255,7 +255,7 @@ typedef struct Curve { #define CU_STRETCH 128 #define CU_OFFS_PATHDIST 256 #define CU_FAST 512 /* Font: no filling inside editmode */ -#define CU_RETOPO 1024 +/* #define CU_RETOPO 1024 */ /* DEPRECATED */ #define CU_DS_EXPAND 2048 #define CU_PATH_RADIUS 4096 /* make use of the path radius if this is enabled (default for new curves) */ #define CU_DEFORM_FILL 8192 /* fill 2d curve after deformation */ diff --git a/source/blender/makesdna/DNA_meshdata_types.h b/source/blender/makesdna/DNA_meshdata_types.h index d772324cd72..66e1333bf66 100644 --- a/source/blender/makesdna/DNA_meshdata_types.h +++ b/source/blender/makesdna/DNA_meshdata_types.h @@ -94,7 +94,7 @@ typedef struct MSticky { typedef struct MSelect { int index; - int type; + int type; /* EDITVERT/EDITEDGE/EDITFACE */ } MSelect; typedef struct MTFace { @@ -196,11 +196,6 @@ typedef struct MRecast{ #define ME_SHARP (1<<9) /* only reason this flag remains a 'short' */ /* puno = vertexnormal (mface) */ -/* render assumes flips to be ordered like this */ -#define ME_FLIPV1 1 -#define ME_FLIPV2 2 -#define ME_FLIPV3 4 -#define ME_FLIPV4 8 #define ME_PROJXY 16 #define ME_PROJXZ 32 #define ME_PROJYZ 64 @@ -216,11 +211,6 @@ typedef struct MRecast{ #define ME_SMOOTH 1 #define ME_FACE_SEL 2 /* flag ME_HIDE==16 is used here too */ -/* mselect->type */ -#define ME_VSEl 0 -#define ME_ESEl 1 -#define ME_FSEL 2 - /* mtface->flag */ #define TF_SELECT 1 /* use MFace hide flag (after 2.43), should be able to reuse after 2.44 */ #define TF_ACTIVE 2 /* deprecated! */ diff --git a/source/blender/makesdna/DNA_object_force.h b/source/blender/makesdna/DNA_object_force.h index d45a8f83f76..61fc44d94ff 100644 --- a/source/blender/makesdna/DNA_object_force.h +++ b/source/blender/makesdna/DNA_object_force.h @@ -421,8 +421,8 @@ typedef struct SoftBody { #define OB_SB_SELF 512 #define OB_SB_FACECOLL 1024 #define OB_SB_EDGECOLL 2048 -#define OB_SB_COLLFINAL 4096 /* deprecated */ -#define OB_SB_BIG_UI 8192 +/* #define OB_SB_COLLFINAL 4096 */ /* deprecated */ +/* #define OB_SB_BIG_UI 8192 */ /* deprecated */ #define OB_SB_AERO_ANGLE 16384 /* sb->solverflags */ diff --git a/source/blender/makesdna/DNA_space_types.h b/source/blender/makesdna/DNA_space_types.h index 6bcea71b5e9..29967dfc1bd 100644 --- a/source/blender/makesdna/DNA_space_types.h +++ b/source/blender/makesdna/DNA_space_types.h @@ -553,23 +553,6 @@ typedef struct SpaceClip { #define BUTS_CONSTRAINT 13 #define BUTS_EFFECTS 14 -/* sbuts->tab new (deprecated) */ -#define TAB_SHADING_MAT 0 -#define TAB_SHADING_TEX 1 -#define TAB_SHADING_RAD 2 -#define TAB_SHADING_WORLD 3 -#define TAB_SHADING_LAMP 4 - -#define TAB_OBJECT_OBJECT 0 -#define TAB_OBJECT_PHYSICS 1 -#define TAB_OBJECT_PARTICLE 2 - -#define TAB_SCENE_RENDER 0 -#define TAB_SCENE_WORLD 1 -#define TAB_SCENE_ANIM 2 -#define TAB_SCENE_SOUND 3 -#define TAB_SCENE_SEQUENCER 4 - /* buts->mainb new */ #define BCONTEXT_RENDER 0 #define BCONTEXT_SCENE 1 @@ -684,7 +667,7 @@ enum FileSortTypeE { /* Selection Flags in filesel: struct direntry, unsigned char selflag */ -#define ACTIVE_FILE (1<<1) +/* #define ACTIVE_FILE (1<<1) */ /* UNUSED */ #define HILITED_FILE (1<<2) #define SELECTED_FILE (1<<3) #define EDITING_FILE (1<<4) diff --git a/source/blender/makesdna/DNA_texture_types.h b/source/blender/makesdna/DNA_texture_types.h index cb545d2ee73..8f7db2a570f 100644 --- a/source/blender/makesdna/DNA_texture_types.h +++ b/source/blender/makesdna/DNA_texture_types.h @@ -510,7 +510,7 @@ typedef struct ColorMapping { #define MTEX_BLEND_SAT 11 #define MTEX_BLEND_VAL 12 #define MTEX_BLEND_COLOR 13 -#define MTEX_NUM_BLENDTYPES 14 +/* free for use */ #define MTEX_SOFT_LIGHT 15 #define MTEX_LIN_LIGHT 16 diff --git a/source/blender/makesrna/intern/rna_access.c b/source/blender/makesrna/intern/rna_access.c index a31984dfc29..02b1fa300fb 100644 --- a/source/blender/makesrna/intern/rna_access.c +++ b/source/blender/makesrna/intern/rna_access.c @@ -469,7 +469,7 @@ static const char *rna_ensure_property_description(PropertyRNA *prop) } #ifdef WITH_INTERNATIONAL - if((U.transopts&USER_DOTRANSLATE) && (U.transopts&USER_TR_TOOLTIPS)) + if(description && (U.transopts&USER_DOTRANSLATE) && (U.transopts&USER_TR_TOOLTIPS)) description= BLF_gettext(description); #endif diff --git a/source/blender/makesrna/intern/rna_actuator.c b/source/blender/makesrna/intern/rna_actuator.c index 392aa6a7f5a..612c34d1c92 100644 --- a/source/blender/makesrna/intern/rna_actuator.c +++ b/source/blender/makesrna/intern/rna_actuator.c @@ -1404,7 +1404,7 @@ static void rna_def_scene_actuator(BlenderRNA *brna) prop= RNA_def_property(srna, "mode", PROP_ENUM, PROP_NONE); RNA_def_property_enum_sdna(prop, NULL, "type"); RNA_def_property_enum_items(prop, prop_type_items); - RNA_def_property_ui_text(prop, "Scene", ""); + RNA_def_property_ui_text(prop, "Mode", ""); RNA_def_property_update(prop, NC_LOGIC, NULL); //XXX filter only camera objects diff --git a/source/blender/makesrna/intern/rna_fcurve.c b/source/blender/makesrna/intern/rna_fcurve.c index 56f1efe3fed..98c6b269b5f 100644 --- a/source/blender/makesrna/intern/rna_fcurve.c +++ b/source/blender/makesrna/intern/rna_fcurve.c @@ -1080,7 +1080,7 @@ static void rna_def_fmodifier(BlenderRNA *brna) prop= RNA_def_property(srna, "blend_out", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "blendout"); RNA_def_property_float_funcs(prop, NULL, NULL, "rna_FModifier_blending_range"); - RNA_def_property_ui_text(prop, "Blend Out", "Number of frames from start frame for influence to fade out"); + RNA_def_property_ui_text(prop, "Blend Out", "Number of frames from end frame for influence to fade out"); RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME_PROP, NULL); /* influence */ diff --git a/source/blender/makesrna/intern/rna_main_api.c b/source/blender/makesrna/intern/rna_main_api.c index 1809a5313c5..a62da4c3f7e 100644 --- a/source/blender/makesrna/intern/rna_main_api.c +++ b/source/blender/makesrna/intern/rna_main_api.c @@ -572,7 +572,7 @@ void rna_Main_armatures_tag(Main *bmain, int value) { tag_main_lb(&bmain->armatu void rna_Main_actions_tag(Main *bmain, int value) { tag_main_lb(&bmain->action, value); } void rna_Main_particles_tag(Main *bmain, int value) { tag_main_lb(&bmain->particle, value); } void rna_Main_gpencil_tag(Main *bmain, int value) { tag_main_lb(&bmain->gpencil, value); } -void rna_Main_movieclips_tag(Main *bmain, int value) { tag_main_lb(&bmain->text, value); } +void rna_Main_movieclips_tag(Main *bmain, int value) { tag_main_lb(&bmain->movieclip, value); } static int rna_Main_cameras_is_updated_get(PointerRNA *ptr) { return DAG_id_type_tagged(ptr->data, ID_CA); } static int rna_Main_scenes_is_updated_get(PointerRNA *ptr) { return DAG_id_type_tagged(ptr->data, ID_SCE); } diff --git a/source/blender/makesrna/intern/rna_object.c b/source/blender/makesrna/intern/rna_object.c index f7df7c3928e..f920cfb5aec 100644 --- a/source/blender/makesrna/intern/rna_object.c +++ b/source/blender/makesrna/intern/rna_object.c @@ -2072,6 +2072,8 @@ static void rna_def_object(BlenderRNA *brna) prop= RNA_def_property(srna, "delta_scale", PROP_FLOAT, PROP_XYZ); RNA_def_property_float_sdna(prop, NULL, "dscale"); + RNA_def_property_ui_range(prop, -FLT_MAX, FLT_MAX, 1, 3); + RNA_def_property_float_array_default(prop, default_scale); RNA_def_property_ui_text(prop, "Delta Scale", "Extra scaling added to the scale of the object"); RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, "rna_Object_internal_update"); diff --git a/source/blender/modifiers/intern/MOD_hook.c b/source/blender/modifiers/intern/MOD_hook.c index 9e48c5d29e2..b5cf289f4ce 100644 --- a/source/blender/modifiers/intern/MOD_hook.c +++ b/source/blender/modifiers/intern/MOD_hook.c @@ -185,22 +185,20 @@ static void deformVerts_do(HookModifierData *hmd, Object *ob, DerivedMesh *dm, const float fac_orig= hmd->force; float fac; const int *origindex_ar; - - /* if DerivedMesh is present and has original index data, - * use it - */ + + /* if DerivedMesh is present and has original index data, use it */ if(dm && (origindex_ar= dm->getVertDataArray(dm, CD_ORIGINDEX))) { for(i= 0, index_pt= hmd->indexar; i < hmd->totindex; i++, index_pt++) { if(*index_pt < numVerts) { int j; - + for(j = 0; j < numVerts; j++) { if(origindex_ar[j] == *index_pt) { float *co = vertexCos[j]; if((fac= hook_falloff(hmd->cent, co, falloff_squared, fac_orig))) { if(dvert) fac *= defvert_find_weight(dvert+j, defgrp_index); - + if(fac) { mul_v3_m4v3(vec, mat, co); interp_v3_v3v3(co, co, vec, fac); @@ -218,7 +216,7 @@ static void deformVerts_do(HookModifierData *hmd, Object *ob, DerivedMesh *dm, if((fac= hook_falloff(hmd->cent, co, falloff_squared, fac_orig))) { if(dvert) fac *= defvert_find_weight(dvert+(*index_pt), defgrp_index); - + if(fac) { mul_v3_m4v3(vec, mat, co); interp_v3_v3v3(co, co, vec, fac); @@ -230,11 +228,11 @@ static void deformVerts_do(HookModifierData *hmd, Object *ob, DerivedMesh *dm, } else if(dvert) { /* vertex group hook */ const float fac_orig= hmd->force; - + for(i = 0; i < max_dvert; i++, dvert++) { float fac; float *co = vertexCos[i]; - + if((fac= hook_falloff(hmd->cent, co, falloff_squared, fac_orig))) { fac *= defvert_find_weight(dvert, defgrp_index); if(fac) { @@ -251,12 +249,8 @@ static void deformVerts(ModifierData *md, Object *ob, DerivedMesh *derivedData, int UNUSED(useRenderParams), int UNUSED(isFinalCalc)) { HookModifierData *hmd = (HookModifierData*) md; - DerivedMesh *dm = get_dm(ob, NULL, derivedData, NULL, 0); - - deformVerts_do(hmd, ob, dm, vertexCos, numVerts); - - if(derivedData != dm) - dm->release(dm); + + deformVerts_do(hmd, ob, derivedData, vertexCos, numVerts); } static void deformVertsEM(ModifierData *md, Object *ob, struct EditMesh *editData, diff --git a/source/blender/python/intern/gpu.c b/source/blender/python/intern/gpu.c index 57ce7b59067..0da63297077 100644 --- a/source/blender/python/intern/gpu.c +++ b/source/blender/python/intern/gpu.c @@ -87,6 +87,7 @@ PyInit_gpu(void) PY_MODULE_ADD_CONSTANT(m, GPU_DYNAMIC_OBJECT_VIEWIMAT); PY_MODULE_ADD_CONSTANT(m, GPU_DYNAMIC_OBJECT_IMAT); PY_MODULE_ADD_CONSTANT(m, GPU_DYNAMIC_OBJECT_COLOR); + PY_MODULE_ADD_CONSTANT(m, GPU_DYNAMIC_OBJECT_AUTOBUMPSCALE); PY_MODULE_ADD_CONSTANT(m, GPU_DYNAMIC_LAMP_DYNVEC); PY_MODULE_ADD_CONSTANT(m, GPU_DYNAMIC_LAMP_DYNCO); PY_MODULE_ADD_CONSTANT(m, GPU_DYNAMIC_LAMP_DYNIMAT); diff --git a/source/blender/render/intern/source/render_texture.c b/source/blender/render/intern/source/render_texture.c index ae48b0f777f..fe9312e37d5 100644 --- a/source/blender/render/intern/source/render_texture.c +++ b/source/blender/render/intern/source/render_texture.c @@ -1932,11 +1932,13 @@ static int ntap_bump_compute(NTapBump *ntap_bump, ShadeInput *shi, MTex *mtex, T float *nvec = texres->nor; texres->nor = NULL; - if( mtex->texflag & MTEX_BUMP_TEXTURESPACE ) { - if(tex->ima) - Hscale *= 13.0f; // appears to be a sensible default value - } else - Hscale *= 0.1f; // factor 0.1 proved to look like the previous bump code + if(found_deriv_map==0) { + if( mtex->texflag & MTEX_BUMP_TEXTURESPACE ) { + if(tex->ima) + Hscale *= 13.0f; // appears to be a sensible default value + } else + Hscale *= 0.1f; // factor 0.1 proved to look like the previous bump code + } if( !ntap_bump->init_done ) { copy_v3_v3(ntap_bump->vNacc, shi->vn); @@ -1958,15 +1960,21 @@ static int ntap_bump_compute(NTapBump *ntap_bump, ShadeInput *shi, MTex *mtex, T } if(found_deriv_map) { - float dBdu, dBdv; + float dBdu, dBdv, auto_bump = 1.0f; float s = 1; // negate this if flipped texture coordinate texco_mapping(shi, tex, mtex, co, dx, dy, texvec, dxt, dyt); rgbnor = multitex_mtex(shi, mtex, texvec, dxt, dyt, texres); + + if(shi->obr->ob->derivedFinal) + { + auto_bump = shi->obr->ob->derivedFinal->auto_bump_scale; + auto_bump /= sqrtf((float) (dimx*dimy)); + } // this variant using a derivative map is described here // http://mmikkelsen3d.blogspot.com/2011/07/derivative-maps.html - dBdu = Hscale*dimx*(2*texres->tr-1); - dBdv = Hscale*dimy*(2*texres->tg-1); + dBdu = auto_bump*Hscale*dimx*(2*texres->tr-1); + dBdv = auto_bump*Hscale*dimy*(2*texres->tg-1); dHdx = dBdu*dxt[0] + s * dBdv*dxt[1]; dHdy = dBdu*dyt[0] + s * dBdv*dyt[1]; diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h index 2c0e22337c0..61c3da36203 100644 --- a/source/blender/windowmanager/WM_api.h +++ b/source/blender/windowmanager/WM_api.h @@ -191,6 +191,7 @@ struct wmOperatorTypeMacro *WM_operatortype_macro_define(struct wmOperatorType * int WM_operator_poll (struct bContext *C, struct wmOperatorType *ot); int WM_operator_poll_context(struct bContext *C, struct wmOperatorType *ot, int context); int WM_operator_call (struct bContext *C, struct wmOperator *op); +int WM_operator_call_notest(struct bContext *C, struct wmOperator *op); int WM_operator_repeat (struct bContext *C, struct wmOperator *op); int WM_operator_repeat_check(const struct bContext *C, struct wmOperator *op); int WM_operator_name_call (struct bContext *C, const char *opstring, int context, struct PointerRNA *properties); @@ -206,6 +207,7 @@ void WM_operator_properties_gesture_border(struct wmOperatorType *ot, int exten void WM_operator_properties_gesture_straightline(struct wmOperatorType *ot, int cursor); void WM_operator_properties_select_all(struct wmOperatorType *ot); +int WM_operator_check_ui_enabled(const struct bContext *C, const char *idname); wmOperator *WM_operator_last_redo(const struct bContext *C); /* MOVE THIS SOMEWHERE ELSE */ diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c index 9d8f68115cf..1593f14a76c 100644 --- a/source/blender/windowmanager/intern/wm_event_system.c +++ b/source/blender/windowmanager/intern/wm_event_system.c @@ -597,12 +597,36 @@ static int wm_operator_exec(bContext *C, wmOperator *op, int repeat) } -/* for running operators with frozen context (modal handlers, menus) */ +/* simply calls exec with basic checks */ +static int wm_operator_exec_notest(bContext *C, wmOperator *op) +{ + int retval= OPERATOR_CANCELLED; + + if(op==NULL || op->type==NULL || op->type->exec==NULL) + return retval; + + retval= op->type->exec(C, op); + OPERATOR_RETVAL_CHECK(retval); + + return retval; +} + +/* for running operators with frozen context (modal handlers, menus) + * + * warning: do not use this within an operator to call its self! [#29537] */ int WM_operator_call(bContext *C, wmOperator *op) { return wm_operator_exec(C, op, 0); } +/* this is intended to be used when an invoke operator wants to call exec on its self + * and is basically like running op->type->exec() directly, no poll checks no freeing, + * since we assume whoever called invokle will take care of that */ +int WM_operator_call_notest(bContext *C, wmOperator *op) +{ + return wm_operator_exec_notest(C, op); +} + /* do this operator again, put here so it can share above code */ int WM_operator_repeat(bContext *C, wmOperator *op) { diff --git a/source/blender/windowmanager/intern/wm_operators.c b/source/blender/windowmanager/intern/wm_operators.c index fa6521b3ec0..004b71307df 100644 --- a/source/blender/windowmanager/intern/wm_operators.c +++ b/source/blender/windowmanager/intern/wm_operators.c @@ -802,7 +802,7 @@ int WM_operator_confirm(bContext *C, wmOperator *op, wmEvent *UNUSED(event)) int WM_operator_filesel(bContext *C, wmOperator *op, wmEvent *UNUSED(event)) { if (RNA_property_is_set(op->ptr, "filepath")) { - return WM_operator_call(C, op); + return WM_operator_call_notest(C, op); /* call exec direct */ } else { WM_event_add_fileselect(C, op); @@ -907,6 +907,15 @@ int WM_operator_winactive(bContext *C) return 1; } +/* return FALSE, if the UI should be disabled */ +int WM_operator_check_ui_enabled(const bContext *C, const char *idname) +{ + wmWindowManager *wm= CTX_wm_manager(C); + Scene *scene= CTX_data_scene(C); + + return !(ED_undo_valid(C, idname)==0 || WM_jobs_test(wm, scene)); +} + wmOperator *WM_operator_last_redo(const bContext *C) { wmWindowManager *wm= CTX_wm_manager(C); @@ -940,7 +949,7 @@ static uiBlock *wm_block_create_redo(bContext *C, ARegion *ar, void *arg_op) uiBlockSetHandleFunc(block, ED_undo_operator_repeat_cb_evt, arg_op); layout= uiBlockLayout(block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL, 0, 0, width, UI_UNIT_Y, style); - if(ED_undo_valid(C, op->type->name)==0) + if (!WM_operator_check_ui_enabled(C, op->type->name)) uiLayoutSetEnabled(layout, 0); if(op->type->flag & OPTYPE_MACRO) { @@ -1628,7 +1637,7 @@ static void WM_OT_open_mainfile(wmOperatorType *ot) static int wm_link_append_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event)) { if(RNA_property_is_set(op->ptr, "filepath")) { - return WM_operator_call(C, op); + return WM_operator_call_notest(C, op); } else { /* XXX TODO solve where to get last linked library from */ @@ -1994,6 +2003,7 @@ static int wm_save_mainfile_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED( { char name[FILE_MAX]; int check_existing=1; + int ret; /* cancel if no active window */ if (CTX_wm_window(C) == NULL) @@ -2018,16 +2028,20 @@ static int wm_save_mainfile_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED( check_existing = 0; if (G.save_over) { - if (check_existing) + if (check_existing && BLI_exists(name)) { uiPupMenuSaveOver(C, op, name); + ret= OPERATOR_RUNNING_MODAL; + } else { - wm_save_as_mainfile_exec(C, op); + ret= wm_save_as_mainfile_exec(C, op); } - } else { + } + else { WM_event_add_fileselect(C, op); + ret= OPERATOR_RUNNING_MODAL; } - return OPERATOR_RUNNING_MODAL; + return ret; } static void WM_OT_save_mainfile(wmOperatorType *ot) |