diff options
author | Nick Samarin <nicks1987@bigmir.net> | 2011-05-17 00:30:59 +0400 |
---|---|---|
committer | Nick Samarin <nicks1987@bigmir.net> | 2011-05-17 00:30:59 +0400 |
commit | a918040902bdeb7c9793168710871e4a3b7777a3 (patch) | |
tree | 7380f00bce5448d777d09f4be4d7127e8eecec49 /source/blender/editors/util | |
parent | daeca2f8262884c436c5678225704b594ce5347b (diff) | |
parent | 99ee18c684da65ba774175c0b57a086e8222464a (diff) |
synched with trunk at revision 36569
Diffstat (limited to 'source/blender/editors/util')
-rw-r--r-- | source/blender/editors/util/CMakeLists.txt | 2 | ||||
-rw-r--r-- | source/blender/editors/util/SConscript | 1 | ||||
-rw-r--r-- | source/blender/editors/util/crazyspace.c | 439 | ||||
-rw-r--r-- | source/blender/editors/util/ed_util.c | 34 | ||||
-rw-r--r-- | source/blender/editors/util/editmode_undo.c | 12 | ||||
-rw-r--r-- | source/blender/editors/util/numinput.c | 13 | ||||
-rw-r--r-- | source/blender/editors/util/undo.c | 42 | ||||
-rw-r--r-- | source/blender/editors/util/util_intern.h | 7 |
8 files changed, 528 insertions, 22 deletions
diff --git a/source/blender/editors/util/CMakeLists.txt b/source/blender/editors/util/CMakeLists.txt index 221a65620dd..3b7fc7c7b86 100644 --- a/source/blender/editors/util/CMakeLists.txt +++ b/source/blender/editors/util/CMakeLists.txt @@ -22,6 +22,7 @@ set(INC ../include ../../blenkernel + ../../blenloader ../../blenlib ../../../../extern/recastnavigation/Recast/Include ../../makesdna @@ -36,6 +37,7 @@ set(SRC numinput.c undo.c navmesh_conversion.cpp + crazyspace.c util_intern.h # general includes diff --git a/source/blender/editors/util/SConscript b/source/blender/editors/util/SConscript index ab48dd79e20..0ee64fbf9f2 100644 --- a/source/blender/editors/util/SConscript +++ b/source/blender/editors/util/SConscript @@ -7,5 +7,6 @@ incs = '../include ../../blenlib ../../blenkernel ../../makesdna ../../imbuf' incs += ' ../../windowmanager #/intern/guardedalloc #/extern/glew/include' incs += ' ../../makesrna' incs += ' #extern/recastnavigation/Recast/Include' +incs += ' ../../blenloader' env.BlenderLib ( 'bf_editors_util', sources, Split(incs), [], libtype=['core','player'], priority=[130,210] ) diff --git a/source/blender/editors/util/crazyspace.c b/source/blender/editors/util/crazyspace.c new file mode 100644 index 00000000000..9560924941d --- /dev/null +++ b/source/blender/editors/util/crazyspace.c @@ -0,0 +1,439 @@ +/* + * $Id$ + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * The Original Code is Copyright (C) 2005 Blender Foundation. + * All rights reserved. + * + * + * Contributor(s): Blender Foundation, + * Sergey Sharybin + * + * ***** END GPL LICENSE BLOCK ***** + */ + +/** \file blender/editors/util/crazyspace.c + * \ingroup edutil + */ + + +#include "MEM_guardedalloc.h" + +#include "DNA_scene_types.h" +#include "DNA_object_types.h" +#include "DNA_modifier_types.h" +#include "DNA_meshdata_types.h" + +#include "BKE_DerivedMesh.h" +#include "BKE_modifier.h" +#include "BKE_multires.h" +#include "BKE_mesh.h" + +#include "BLI_utildefines.h" +#include "BLI_math.h" +#include "BLI_editVert.h" + +#include "ED_util.h" + +typedef struct { + float *vertexcos; + short *flags; +} MappedUserData; + +#define TAN_MAKE_VEC(a, b, c) a[0]= b[0] + 0.2f*(b[0]-c[0]); a[1]= b[1] + 0.2f*(b[1]-c[1]); a[2]= b[2] + 0.2f*(b[2]-c[2]) +static void set_crazy_vertex_quat(float *quat, float *v1, float *v2, float *v3, float *def1, float *def2, float *def3) +{ + float vecu[3], vecv[3]; + float q1[4], q2[4]; + + TAN_MAKE_VEC(vecu, v1, v2); + TAN_MAKE_VEC(vecv, v1, v3); + tri_to_quat( q1,v1, vecu, vecv); + + TAN_MAKE_VEC(vecu, def1, def2); + TAN_MAKE_VEC(vecv, def1, def3); + tri_to_quat( q2,def1, vecu, vecv); + + sub_qt_qtqt(quat, q2, q1); +} +#undef TAN_MAKE_VEC + +static void make_vertexcos__mapFunc(void *userData, int index, float *co, float *UNUSED(no_f), short *UNUSED(no_s)) +{ + MappedUserData *mappedData= (MappedUserData*)userData; + float *vec = mappedData->vertexcos; + + vec+= 3*index; + if(!mappedData->flags[index]) { + /* we need coord from prototype vertex, not it clones or images, + suppose they stored in the beginning of vertex array stored in DM */ + VECCOPY(vec, co); + mappedData->flags[index]= 1; + } +} + +static int modifiers_disable_subsurf_temporary(Object *ob) +{ + ModifierData *md; + int disabled = 0; + + for(md=ob->modifiers.first; md; md=md->next) + if(md->type==eModifierType_Subsurf) + if(md->mode & eModifierMode_OnCage) { + md->mode ^= eModifierMode_DisableTemporary; + disabled= 1; + } + + return disabled; +} + +/* disable subsurf temporal, get mapped cos, and enable it */ +float *crazyspace_get_mapped_editverts(Scene *scene, Object *obedit) +{ + Mesh *me= obedit->data; + DerivedMesh *dm; + float *vertexcos; + int nverts= me->edit_mesh->totvert; + short *flags; + MappedUserData userData; + + /* disable subsurf temporal, get mapped cos, and enable it */ + if(modifiers_disable_subsurf_temporary(obedit)) { + /* need to make new derivemesh */ + makeDerivedMesh(scene, obedit, me->edit_mesh, CD_MASK_BAREMESH); + } + + /* now get the cage */ + dm= editmesh_get_derived_cage(scene, obedit, me->edit_mesh, CD_MASK_BAREMESH); + + vertexcos= MEM_callocN(3*sizeof(float)*nverts, "vertexcos map"); + flags= MEM_callocN(sizeof(short)*nverts, "vertexcos flags"); + + userData.vertexcos= vertexcos; + userData.flags= flags; + dm->foreachMappedVert(dm, make_vertexcos__mapFunc, &userData); + + dm->release(dm); + + /* set back the flag, no new cage needs to be built, transform does it */ + modifiers_disable_subsurf_temporary(obedit); + + MEM_freeN(flags); + + return vertexcos; +} + +void crazyspace_set_quats_editmesh(EditMesh *em, float *origcos, float *mappedcos, float *quats) +{ + EditVert *eve, *prev; + EditFace *efa; + float *v1, *v2, *v3, *v4, *co1, *co2, *co3, *co4; + intptr_t index= 0; + + /* two abused locations in vertices */ + for(eve= em->verts.first; eve; eve= eve->next, index++) { + eve->tmp.p = NULL; + eve->prev= (EditVert *)index; + } + + /* first store two sets of tangent vectors in vertices, we derive it just from the face-edges */ + for(efa= em->faces.first; efa; efa= efa->next) { + + /* retrieve mapped coordinates */ + v1= mappedcos + 3*(intptr_t)(efa->v1->prev); + v2= mappedcos + 3*(intptr_t)(efa->v2->prev); + v3= mappedcos + 3*(intptr_t)(efa->v3->prev); + + co1= (origcos)? origcos + 3*(intptr_t)(efa->v1->prev): efa->v1->co; + co2= (origcos)? origcos + 3*(intptr_t)(efa->v2->prev): efa->v2->co; + co3= (origcos)? origcos + 3*(intptr_t)(efa->v3->prev): efa->v3->co; + + if(efa->v2->tmp.p==NULL && efa->v2->f1) { + set_crazy_vertex_quat(quats, co2, co3, co1, v2, v3, v1); + efa->v2->tmp.p= (void*)quats; + quats+= 4; + } + + if(efa->v4) { + v4= mappedcos + 3*(intptr_t)(efa->v4->prev); + co4= (origcos)? origcos + 3*(intptr_t)(efa->v4->prev): efa->v4->co; + + if(efa->v1->tmp.p==NULL && efa->v1->f1) { + set_crazy_vertex_quat(quats, co1, co2, co4, v1, v2, v4); + efa->v1->tmp.p= (void*)quats; + quats+= 4; + } + if(efa->v3->tmp.p==NULL && efa->v3->f1) { + set_crazy_vertex_quat(quats, co3, co4, co2, v3, v4, v2); + efa->v3->tmp.p= (void*)quats; + quats+= 4; + } + if(efa->v4->tmp.p==NULL && efa->v4->f1) { + set_crazy_vertex_quat(quats, co4, co1, co3, v4, v1, v3); + efa->v4->tmp.p= (void*)quats; + quats+= 4; + } + } + else { + if(efa->v1->tmp.p==NULL && efa->v1->f1) { + set_crazy_vertex_quat(quats, co1, co2, co3, v1, v2, v3); + efa->v1->tmp.p= (void*)quats; + quats+= 4; + } + if(efa->v3->tmp.p==NULL && efa->v3->f1) { + set_crazy_vertex_quat(quats, co3, co1, co2, v3, v1, v2); + efa->v3->tmp.p= (void*)quats; + quats+= 4; + } + } + } + + /* restore abused prev pointer */ + for(prev= NULL, eve= em->verts.first; eve; prev= eve, eve= eve->next) + eve->prev= prev; + +} + +void crazyspace_set_quats_mesh(Mesh *me, float *origcos, float *mappedcos, float *quats) +{ + int i; + MVert *mvert; + MFace *mface; + float *v1, *v2, *v3, *v4, *co1, *co2, *co3, *co4; + + mvert= me->mvert; + for(i=0; i<me->totvert; i++, mvert++) + mvert->flag&= ~ME_VERT_TMP_TAG; + + /* first store two sets of tangent vectors in vertices, we derive it just from the face-edges */ + mvert= me->mvert; + mface= me->mface; + for(i=0; i<me->totface; i++, mface++) { + + /* retrieve mapped coordinates */ + v1= mappedcos + 3*mface->v1; + v2= mappedcos + 3*mface->v2; + v3= mappedcos + 3*mface->v3; + + co1= (origcos)? origcos + 3*mface->v1: mvert[mface->v1].co; + co2= (origcos)? origcos + 3*mface->v2: mvert[mface->v2].co; + co3= (origcos)? origcos + 3*mface->v3: mvert[mface->v3].co; + + if((mvert[mface->v2].flag&ME_VERT_TMP_TAG)==0) { + set_crazy_vertex_quat(&quats[mface->v2*4], co2, co3, co1, v2, v3, v1); + mvert[mface->v2].flag|= ME_VERT_TMP_TAG; + } + + if(mface->v4) { + v4= mappedcos + 3*mface->v4; + co4= (origcos)? origcos + 3*mface->v4: mvert[mface->v4].co; + + if((mvert[mface->v1].flag&ME_VERT_TMP_TAG)==0) { + set_crazy_vertex_quat(&quats[mface->v1*4], co1, co2, co4, v1, v2, v4); + mvert[mface->v1].flag|= ME_VERT_TMP_TAG; + } + if((mvert[mface->v3].flag&ME_VERT_TMP_TAG)==0) { + set_crazy_vertex_quat(&quats[mface->v3*4], co3, co4, co2, v3, v4, v2); + mvert[mface->v3].flag|= ME_VERT_TMP_TAG; + } + if((mvert[mface->v4].flag&ME_VERT_TMP_TAG)==0) { + set_crazy_vertex_quat(&quats[mface->v4*4], co4, co1, co3, v4, v1, v3); + mvert[mface->v4].flag|= ME_VERT_TMP_TAG; + } + } + else { + if((mvert[mface->v1].flag&ME_VERT_TMP_TAG)==0) { + set_crazy_vertex_quat(&quats[mface->v1*4], co1, co2, co3, v1, v2, v3); + mvert[mface->v1].flag|= ME_VERT_TMP_TAG; + } + if((mvert[mface->v3].flag&ME_VERT_TMP_TAG)==0) { + set_crazy_vertex_quat(&quats[mface->v3*4], co3, co1, co2, v3, v1, v2); + mvert[mface->v3].flag|= ME_VERT_TMP_TAG; + } + } + } +} + +int editmesh_get_first_deform_matrices(Scene *scene, Object *ob, EditMesh *em, float (**deformmats)[3][3], float (**deformcos)[3]) +{ + ModifierData *md; + DerivedMesh *dm; + int i, a, numleft = 0, numVerts = 0; + int cageIndex = modifiers_getCageIndex(scene, ob, NULL, 1); + float (*defmats)[3][3] = NULL, (*deformedVerts)[3] = NULL; + + modifiers_clearErrors(ob); + + dm = NULL; + md = modifiers_getVirtualModifierList(ob); + + /* compute the deformation matrices and coordinates for the first + modifiers with on cage editing that are enabled and support computing + deform matrices */ + for(i = 0; md && i <= cageIndex; i++, md = md->next) { + ModifierTypeInfo *mti = modifierType_getInfo(md->type); + + if(!editmesh_modifier_is_enabled(scene, md, dm)) + continue; + + if(mti->type==eModifierTypeType_OnlyDeform && mti->deformMatricesEM) { + if(!defmats) { + dm= editmesh_get_derived(em, NULL); + deformedVerts= editmesh_get_vertex_cos(em, &numVerts); + defmats= MEM_callocN(sizeof(*defmats)*numVerts, "defmats"); + + for(a=0; a<numVerts; a++) + unit_m3(defmats[a]); + } + + mti->deformMatricesEM(md, ob, em, dm, deformedVerts, defmats, + numVerts); + } + else + break; + } + + for(; md && i <= cageIndex; md = md->next, i++) + if(editmesh_modifier_is_enabled(scene, md, dm) && modifier_isCorrectableDeformed(md)) + numleft++; + + if(dm) + dm->release(dm); + + *deformmats= defmats; + *deformcos= deformedVerts; + + return numleft; +} + +int sculpt_get_first_deform_matrices(Scene *scene, Object *ob, float (**deformmats)[3][3], float (**deformcos)[3]) +{ + ModifierData *md; + DerivedMesh *dm; + int a, numVerts= 0; + float (*defmats)[3][3]= NULL, (*deformedVerts)[3]= NULL; + MultiresModifierData *mmd= get_multires_modifier(scene, ob, 0); + int has_multires = mmd != NULL && mmd->sculptlvl > 0; + int numleft= 0; + + if(has_multires) { + *deformmats= NULL; + *deformcos= NULL; + return numleft; + } + + dm= NULL; + md= modifiers_getVirtualModifierList(ob); + + for(; md; md= md->next) { + ModifierTypeInfo *mti= modifierType_getInfo(md->type); + + if(!modifier_isEnabled(scene, md, eModifierMode_Realtime)) continue; + + if(mti->type==eModifierTypeType_OnlyDeform) { + if(!defmats) { + Mesh *me= (Mesh*)ob->data; + dm= mesh_create_derived(me, ob, NULL); + deformedVerts= mesh_getVertexCos(me, &numVerts); + defmats= MEM_callocN(sizeof(*defmats)*numVerts, "defmats"); + + for(a=0; a<numVerts; a++) + unit_m3(defmats[a]); + } + + if(mti->deformMatrices) mti->deformMatrices(md, ob, dm, deformedVerts, defmats, numVerts); + else break; + } + } + + for(; md; md= md->next) { + ModifierTypeInfo *mti= modifierType_getInfo(md->type); + + if(!modifier_isEnabled(scene, md, eModifierMode_Realtime)) continue; + + if(mti->type==eModifierTypeType_OnlyDeform) + numleft++; + } + + if(dm) + dm->release(dm); + + *deformmats= defmats; + *deformcos= deformedVerts; + + return numleft; +} + +void crazyspace_build_sculpt(Scene *scene, Object *ob, float (**deformmats)[3][3], float (**deformcos)[3]) +{ + int totleft= sculpt_get_first_deform_matrices(scene, ob, deformmats, deformcos); + + if(totleft) { + /* there are deformation modifier which doesn't support deformation matricies + calculation. Need additional crazyspace correction */ + + float (*deformedVerts)[3]= *deformcos; + float (*origVerts)[3]= MEM_dupallocN(deformedVerts); + float *quats= NULL; + int i, deformed= 0; + ModifierData *md= modifiers_getVirtualModifierList(ob); + Mesh *me= (Mesh*)ob->data; + + for(; md; md= md->next) { + ModifierTypeInfo *mti= modifierType_getInfo(md->type); + + if(!modifier_isEnabled(scene, md, eModifierMode_Realtime)) continue; + + if(mti->type==eModifierTypeType_OnlyDeform) { + /* skip leading modifiers which have been already + handled in sculpt_get_first_deform_matrices */ + if(mti->deformMatrices && !deformed) + continue; + + mti->deformVerts(md, ob, NULL, deformedVerts, me->totvert, 0, 0); + deformed= 1; + } + } + + quats= MEM_mallocN(me->totvert*sizeof(float)*4, "crazy quats"); + + crazyspace_set_quats_mesh(me, (float*)origVerts, (float*)deformedVerts, quats); + + for(i=0; i<me->totvert; i++) { + float qmat[3][3], tmat[3][3]; + + quat_to_mat3(qmat, &quats[i*4]); + mul_m3_m3m3(tmat, qmat, (*deformmats)[i]); + copy_m3_m3((*deformmats)[i], tmat); + } + + MEM_freeN(origVerts); + MEM_freeN(quats); + } + + if(!*deformmats) { + int a, numVerts; + Mesh *me= (Mesh*)ob->data; + + *deformcos= mesh_getVertexCos(me, &numVerts); + *deformmats= MEM_callocN(sizeof(*(*deformmats))*numVerts, "defmats"); + + for(a=0; a<numVerts; a++) + unit_m3((*deformmats)[a]); + } +} diff --git a/source/blender/editors/util/ed_util.c b/source/blender/editors/util/ed_util.c index 081bda60ba2..705fb83264c 100644 --- a/source/blender/editors/util/ed_util.c +++ b/source/blender/editors/util/ed_util.c @@ -1,4 +1,4 @@ -/** +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -26,6 +26,11 @@ * ***** END GPL LICENSE BLOCK ***** */ +/** \file blender/editors/util/ed_util.c + * \ingroup edutil + */ + + #include <stdlib.h> #include <string.h> #include <math.h> @@ -52,6 +57,7 @@ #include "ED_util.h" #include "UI_interface.h" +#include "UI_resources.h" #include "WM_types.h" #include "RNA_access.h" @@ -151,13 +157,13 @@ void apply_keyb_grid(int shift, int ctrl, float *val, float fac1, float fac2, fl ctrl= !ctrl; if(ctrl && shift) { - if(fac3!= 0.0) *val= fac3*floor(*val/fac3 +.5); + if(fac3 != 0.0f) *val= fac3*floorf(*val/fac3 +0.5f); } else if(ctrl) { - if(fac2!= 0.0) *val= fac2*floor(*val/fac2 +.5); + if(fac2 != 0.0f) *val= fac2*floorf(*val/fac2 +0.5f); } else { - if(fac1!= 0.0) *val= fac1*floor(*val/fac1 +.5); + if(fac1 != 0.0f) *val= fac1*floorf(*val/fac1 +0.5f); } } @@ -179,11 +185,11 @@ void unpack_menu(bContext *C, const char *opname, const char *id_name, const cha uiLayout *layout; char line[FILE_MAXDIR + FILE_MAXFILE + 100]; - pup= uiPupMenuBegin(C, "Unpack file", ICON_NULL); + pup= uiPupMenuBegin(C, "Unpack file", ICON_NONE); layout= uiPupMenuLayout(pup); sprintf(line, "Remove Pack"); - props_ptr= uiItemFullO(layout, opname, line, ICON_NULL, NULL, WM_OP_EXEC_DEFAULT, UI_ITEM_O_RETURN_PROPS); + props_ptr= uiItemFullO(layout, opname, line, ICON_NONE, NULL, WM_OP_EXEC_DEFAULT, UI_ITEM_O_RETURN_PROPS); RNA_enum_set(&props_ptr, "method", PF_REMOVE); RNA_string_set(&props_ptr, "id", id_name); @@ -197,7 +203,7 @@ void unpack_menu(bContext *C, const char *opname, const char *id_name, const cha switch(checkPackedFile(local_name, pf)) { case PF_NOFILE: sprintf(line, "Create %s", local_name); - props_ptr= uiItemFullO(layout, opname, line, ICON_NULL, NULL, WM_OP_EXEC_DEFAULT, UI_ITEM_O_RETURN_PROPS); + props_ptr= uiItemFullO(layout, opname, line, ICON_NONE, NULL, WM_OP_EXEC_DEFAULT, UI_ITEM_O_RETURN_PROPS); RNA_enum_set(&props_ptr, "method", PF_WRITE_LOCAL); RNA_string_set(&props_ptr, "id", id_name); @@ -205,7 +211,7 @@ void unpack_menu(bContext *C, const char *opname, const char *id_name, const cha case PF_EQUAL: sprintf(line, "Use %s (identical)", local_name); //uiItemEnumO(layout, opname, line, 0, "method", PF_USE_LOCAL); - props_ptr= uiItemFullO(layout, opname, line, ICON_NULL, NULL, WM_OP_EXEC_DEFAULT, UI_ITEM_O_RETURN_PROPS); + props_ptr= uiItemFullO(layout, opname, line, ICON_NONE, NULL, WM_OP_EXEC_DEFAULT, UI_ITEM_O_RETURN_PROPS); RNA_enum_set(&props_ptr, "method", PF_USE_LOCAL); RNA_string_set(&props_ptr, "id", id_name); @@ -213,13 +219,13 @@ void unpack_menu(bContext *C, const char *opname, const char *id_name, const cha case PF_DIFFERS: sprintf(line, "Use %s (differs)", local_name); //uiItemEnumO(layout, opname, line, 0, "method", PF_USE_LOCAL); - props_ptr= uiItemFullO(layout, opname, line, ICON_NULL, NULL, WM_OP_EXEC_DEFAULT, UI_ITEM_O_RETURN_PROPS); + props_ptr= uiItemFullO(layout, opname, line, ICON_NONE, NULL, WM_OP_EXEC_DEFAULT, UI_ITEM_O_RETURN_PROPS); RNA_enum_set(&props_ptr, "method", PF_USE_LOCAL); RNA_string_set(&props_ptr, "id", id_name); sprintf(line, "Overwrite %s", local_name); //uiItemEnumO(layout, opname, line, 0, "method", PF_WRITE_LOCAL); - props_ptr= uiItemFullO(layout, opname, line, ICON_NULL, NULL, WM_OP_EXEC_DEFAULT, UI_ITEM_O_RETURN_PROPS); + props_ptr= uiItemFullO(layout, opname, line, ICON_NONE, NULL, WM_OP_EXEC_DEFAULT, UI_ITEM_O_RETURN_PROPS); RNA_enum_set(&props_ptr, "method", PF_WRITE_LOCAL); RNA_string_set(&props_ptr, "id", id_name); break; @@ -231,27 +237,27 @@ void unpack_menu(bContext *C, const char *opname, const char *id_name, const cha case PF_NOFILE: sprintf(line, "Create %s", abs_name); //uiItemEnumO(layout, opname, line, 0, "method", PF_WRITE_ORIGINAL); - props_ptr= uiItemFullO(layout, opname, line, ICON_NULL, NULL, WM_OP_EXEC_DEFAULT, UI_ITEM_O_RETURN_PROPS); + props_ptr= uiItemFullO(layout, opname, line, ICON_NONE, NULL, WM_OP_EXEC_DEFAULT, UI_ITEM_O_RETURN_PROPS); RNA_enum_set(&props_ptr, "method", PF_WRITE_ORIGINAL); RNA_string_set(&props_ptr, "id", id_name); break; case PF_EQUAL: sprintf(line, "Use %s (identical)", abs_name); //uiItemEnumO(layout, opname, line, 0, "method", PF_USE_ORIGINAL); - props_ptr= uiItemFullO(layout, opname, line, ICON_NULL, NULL, WM_OP_EXEC_DEFAULT, UI_ITEM_O_RETURN_PROPS); + props_ptr= uiItemFullO(layout, opname, line, ICON_NONE, NULL, WM_OP_EXEC_DEFAULT, UI_ITEM_O_RETURN_PROPS); RNA_enum_set(&props_ptr, "method", PF_USE_ORIGINAL); RNA_string_set(&props_ptr, "id", id_name); break; case PF_DIFFERS: sprintf(line, "Use %s (differs)", abs_name); //uiItemEnumO(layout, opname, line, 0, "method", PF_USE_ORIGINAL); - props_ptr= uiItemFullO(layout, opname, line, ICON_NULL, NULL, WM_OP_EXEC_DEFAULT, UI_ITEM_O_RETURN_PROPS); + props_ptr= uiItemFullO(layout, opname, line, ICON_NONE, NULL, WM_OP_EXEC_DEFAULT, UI_ITEM_O_RETURN_PROPS); RNA_enum_set(&props_ptr, "method", PF_USE_ORIGINAL); RNA_string_set(&props_ptr, "id", id_name); sprintf(line, "Overwrite %s", abs_name); //uiItemEnumO(layout, opname, line, 0, "method", PF_WRITE_ORIGINAL); - props_ptr= uiItemFullO(layout, opname, line, ICON_NULL, NULL, WM_OP_EXEC_DEFAULT, UI_ITEM_O_RETURN_PROPS); + props_ptr= uiItemFullO(layout, opname, line, ICON_NONE, NULL, WM_OP_EXEC_DEFAULT, UI_ITEM_O_RETURN_PROPS); RNA_enum_set(&props_ptr, "method", PF_WRITE_ORIGINAL); RNA_string_set(&props_ptr, "id", id_name); break; diff --git a/source/blender/editors/util/editmode_undo.c b/source/blender/editors/util/editmode_undo.c index 85f343e3311..732e5087af2 100644 --- a/source/blender/editors/util/editmode_undo.c +++ b/source/blender/editors/util/editmode_undo.c @@ -1,4 +1,4 @@ -/** +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -27,6 +27,11 @@ * ***** END GPL LICENSE BLOCK ***** */ +/** \file blender/editors/util/editmode_undo.c + * \ingroup edutil + */ + + #include <stdlib.h> #include <string.h> @@ -46,11 +51,14 @@ #include "BKE_depsgraph.h" #include "BKE_global.h" +#include "ED_util.h" #include "ED_mesh.h" #include "UI_interface.h" #include "UI_resources.h" +#include "util_intern.h" + /* ***************** generic editmode undo system ********************* */ /* @@ -75,7 +83,7 @@ void undo_editmode_menu(void) // history menu /* ********************************************************************* */ /* ****** XXX ***** */ -void error(const char *UNUSED(arg)) {} +static void error(const char *UNUSED(arg)) {} /* ****** XXX ***** */ diff --git a/source/blender/editors/util/numinput.c b/source/blender/editors/util/numinput.c index ccdbe7dfd4e..1b58a1e2a58 100644 --- a/source/blender/editors/util/numinput.c +++ b/source/blender/editors/util/numinput.c @@ -1,4 +1,4 @@ -/** +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -27,6 +27,11 @@ * ***** END GPL LICENSE BLOCK ***** */ +/** \file blender/editors/util/numinput.c + * \ingroup edutil + */ + + #include <math.h> /* fabs */ #include <stdio.h> /* for sprintf */ @@ -80,7 +85,7 @@ void outputNumInput(NumInput *n, char *str) else inv[0] = 0; - if( n->val[i] > 1e10 || n->val[i] < -1e10 ) + if( n->val[i] > 1e10f || n->val[i] < -1e10f ) sprintf(&str[j*20], "%s%.4e%c", inv, n->val[i], cur); else switch (n->ctrl[i]) { @@ -276,7 +281,7 @@ char handleNumInput(NumInput *n, wmEvent *event) if (!n->ctrl[idx]) n->ctrl[idx] = 1; - if (fabs(n->val[idx]) > 9999999.0f); + if (fabsf(n->val[idx]) > 9999999.0f); else if (n->ctrl[idx] == 1) { n->val[idx] *= 10; n->val[idx] += Val; @@ -298,7 +303,7 @@ char handleNumInput(NumInput *n, wmEvent *event) } } - printf("%f\n", n->val[idx]); + // printf("%f\n", n->val[idx]); /* REDRAW SINCE NUMBERS HAVE CHANGED */ return 1; diff --git a/source/blender/editors/util/undo.c b/source/blender/editors/util/undo.c index 0158719b2fb..60f551afa6e 100644 --- a/source/blender/editors/util/undo.c +++ b/source/blender/editors/util/undo.c @@ -1,4 +1,4 @@ -/** +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -27,6 +27,11 @@ * ***** END GPL LICENSE BLOCK ***** */ +/** \file blender/editors/util/undo.c + * \ingroup edutil + */ + + #include <stdlib.h> #include <string.h> @@ -60,9 +65,13 @@ #include "WM_api.h" #include "WM_types.h" +#include "RNA_access.h" +#include "RNA_define.h" #include "util_intern.h" +#define MAXUNDONAME 64 /* XXX, make common define */ + /* ***************** generic undo system ********************* */ void ED_undo_push(bContext *C, const char *str) @@ -71,6 +80,9 @@ void ED_undo_push(bContext *C, const char *str) Object *obedit= CTX_data_edit_object(C); Object *obact= CTX_data_active_object(C); + if (G.f & G_DEBUG) + printf("undo push %s\n", str); + if(obedit) { if (U.undosteps == 0) return; @@ -252,11 +264,20 @@ static int ed_undo_exec(bContext *C, wmOperator *UNUSED(op)) return ed_undo_step(C, 1, NULL); } +static int ed_undo_push_exec(bContext *C, wmOperator *op) +{ + char str[MAXUNDONAME]; + RNA_string_get(op->ptr, "message", str); + ED_undo_push(C, str); + return OPERATOR_FINISHED; +} + static int ed_redo_exec(bContext *C, wmOperator *UNUSED(op)) { return ed_undo_step(C, -1, NULL); } +#if 0 /* UNUSED */ void ED_undo_menu(bContext *C) { Object *obedit= CTX_data_edit_object(C); @@ -281,6 +302,7 @@ void ED_undo_menu(bContext *C) } } } +#endif /* ********************** */ @@ -296,6 +318,19 @@ void ED_OT_undo(wmOperatorType *ot) ot->poll= ED_operator_screenactive; } +void ED_OT_undo_push(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Undo Push"; + ot->description= "Add an undo state (internal use only)"; + ot->idname= "ED_OT_undo_push"; + + /* api callbacks */ + ot->exec= ed_undo_push_exec; + + RNA_def_string(ot->srna, "message", "Add an undo step *function may be moved*", MAXUNDONAME, "Undo Message", ""); +} + void ED_OT_redo(wmOperatorType *ot) { /* identifiers */ @@ -327,6 +362,11 @@ int ED_undo_operator_repeat(bContext *C, struct wmOperator *op) if (G.f & G_DEBUG) printf("redo_cb: operator redo %s\n", op->type->name); ED_undo_pop_op(C, op); + + if(op->type->check) { + op->type->check(C, op); /* ignore return value since its running again anyway */ + } + retval= WM_operator_repeat(C, op); if((retval & OPERATOR_FINISHED)==0) { if (G.f & G_DEBUG) diff --git a/source/blender/editors/util/util_intern.h b/source/blender/editors/util/util_intern.h index b5750c55c87..9ecfb07d535 100644 --- a/source/blender/editors/util/util_intern.h +++ b/source/blender/editors/util/util_intern.h @@ -1,4 +1,4 @@ -/** +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -26,6 +26,11 @@ * ***** END GPL LICENSE BLOCK ***** */ +/** \file blender/editors/util/util_intern.h + * \ingroup edutil + */ + + #ifndef ED_UTIL_INTERN_H #define ED_UTIL_INTERN_H |