diff options
author | Ton Roosendaal <ton@blender.org> | 2006-01-04 18:47:16 +0300 |
---|---|---|
committer | Ton Roosendaal <ton@blender.org> | 2006-01-04 18:47:16 +0300 |
commit | ed2b55585d7c28f980d264e9add5079adde9209c (patch) | |
tree | a678bc1eee89b054693e3c3a6cd6b5bbdc4b75db | |
parent | ec01a66a6b21d4bde016533af4004d2bfeba5162 (diff) | |
parent | 4cb838d54f6a84e2717fce580a65d205f3980b03 (diff) |
Wednesday sync orange with bf-blender
Note: has the crazyspace fix!
-rw-r--r-- | source/blender/python/api2_2x/Armature.c | 1 | ||||
-rw-r--r-- | source/blender/python/api2_2x/doc/Lamp.py | 10 | ||||
-rw-r--r-- | source/blender/python/api2_2x/doc/Object.py | 22 | ||||
-rwxr-xr-x | source/blender/src/transform_conversions.c | 147 |
4 files changed, 123 insertions, 57 deletions
diff --git a/source/blender/python/api2_2x/Armature.c b/source/blender/python/api2_2x/Armature.c index a2a3db05bc8..743956a1f61 100644 --- a/source/blender/python/api2_2x/Armature.c +++ b/source/blender/python/api2_2x/Armature.c @@ -465,6 +465,7 @@ static PyObject *Armature_update(BPy_Armature *self) if (!BonesDict_InitBones(self->Bones)) return NULL; self->Bones->editmode_flag = 0; + BLI_freelistN(&self->Bones->editbones); }else{ goto AttributeError; diff --git a/source/blender/python/api2_2x/doc/Lamp.py b/source/blender/python/api2_2x/doc/Lamp.py index 52ec301f994..b1e0754c05c 100644 --- a/source/blender/python/api2_2x/doc/Lamp.py +++ b/source/blender/python/api2_2x/doc/Lamp.py @@ -38,6 +38,16 @@ Example:: - 'Square' - 'NoDiffuse' - 'RayShadow' + +Example:: + from Blender import Lamp, Object + # Change the mode of selected lamp objects. + for ob in Object.GetSelected(): # Loop through the current selection + if ob.getType() == "Lamp": # if this is a lamp. + lamp = ob.getData() # get the lamp data. + if lamp.type == Lamp.Types["Spot"]: # Lamp type is not a flag + lamp.mode &= ~Lamp.Modes["RayShadow"] # Disable RayShadow. + lamp.mode |= Lamp.Modes["Shadows"] # Enable Shadowbuffer shadows """ def New (type = 'Lamp', name = 'LampData'): diff --git a/source/blender/python/api2_2x/doc/Object.py b/source/blender/python/api2_2x/doc/Object.py index dac594d9259..bddf09c92cd 100644 --- a/source/blender/python/api2_2x/doc/Object.py +++ b/source/blender/python/api2_2x/doc/Object.py @@ -91,9 +91,8 @@ def Get (name = None): def GetSelected (): """ - Get the selected objects on visible layers from Blenders current scene. If no objects are selected, an empty - list will be returned. - The active object of the current scene will always be the first object in the list (if selected). + Get the user selection. If no objects are selected, an empty list will be returned. + @return: A list of all selected Objects in the current scene. I{B{Example:}} @@ -104,6 +103,10 @@ def GetSelected (): objects = Blender.Object.GetSelected() print objects + @note: The active object will always be the first object in the list (if selected). + @note: The user selection is made up of selected objects from Blenders current scene. + @note: The user selection is limited to objects on visible layers, + if the users last active 3d view is in localview then the selection will be limited to the objects in that localview. """ @@ -156,19 +159,6 @@ def Duplicate (mesh=0, surface=0, curve=0, text=0, metaball=0, armature=0, lamp= activeObject.LocX += 1 Blender.Redraw() """ -''' -def Join (): - """ - Joins selected objects on visible layers from Blenders current scene. - The active object is used as a base for all other objects of the same type to join into - just like pressing Ctrl+J - - @return: None - @note: Being in edit mode, mesh objects with keys and a large number of verts in the - resulting mesh will all raise a RuntimeError. - @note: The join may be unsucsessfull because of the selection or object types and no error raised. - Checking if the number of selected objects has changed is a way to know the join worked. - """ -''' class Object: """ diff --git a/source/blender/src/transform_conversions.c b/source/blender/src/transform_conversions.c index b47cd8e4585..8708981063a 100755 --- a/source/blender/src/transform_conversions.c +++ b/source/blender/src/transform_conversions.c @@ -1398,6 +1398,8 @@ static void VertsToTransData(TransData *td, EditVert *eve) td->tdmir= NULL; } +/* *********************** CrazySpace correction. Now without doing subsurf optimal ****************** */ + static void make_vertexcos__mapFunc(void *userData, int index, float *co, float *no_f, short *no_s) { float *vec = userData; @@ -1406,73 +1408,136 @@ static void make_vertexcos__mapFunc(void *userData, int index, float *co, float VECCOPY(vec, co); } -static float *get_mapped_editverts(void) +/* hurmf, copy from buttons_editing.c, i have to sort this out what it means... */ +static void modifiers_setOnCage(void *ob_v, void *md_v) { - int needsFree; - DerivedMesh *dm= editmesh_get_derived_cage(&needsFree); + Object *ob = ob_v; + ModifierData *md; + + int i, cageIndex = modifiers_getCageIndex(ob, NULL ); + + for( i = 0, md=ob->modifiers.first; md; ++i, md=md->next ) + if( md == md_v ) { + if( i >= cageIndex ) + md->mode ^= eModifierMode_OnCage; + break; + } +} + + +/* disable subsurf temporal, get mapped cos, and enable it */ +static float *get_crazy_mapped_editverts(void) +{ + DerivedMesh *dm; + ModifierData *md; float *vertexcos; + int needsFree; + int i; - vertexcos= MEM_mallocN(3*sizeof(float)*G.totvert, "vertexcos map"); + for( i = 0, md=G.obedit->modifiers.first; md; ++i, md=md->next ) { + if(md->type==eModifierType_Subsurf) + if(md->mode & eModifierMode_OnCage) + break; + } + if(md) { + /* this call disables subsurf and enables the underlying modifier to deform, apparently */ + modifiers_setOnCage(G.obedit, md); + /* make it all over */ + makeDispListMesh(G.obedit); + } + /* now get the cage */ + dm= editmesh_get_derived_cage(&needsFree); + + vertexcos= MEM_mallocN(3*sizeof(float)*G.totvert, "vertexcos map"); dm->foreachMappedVert(dm, make_vertexcos__mapFunc, vertexcos); if (needsFree) dm->release(dm); + + if(md) { + /* set back the flag, no new cage needs to be built, transform does it */ + modifiers_setOnCage(G.obedit, md); + } + return vertexcos; } -/* helper for below, interpolates or assigns and increments */ -static float *crazy_quat_blend(EditVert *eve, float *quat) +#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) { - if(eve->tmp.fp == NULL) { - eve->tmp.fp = quat; - QUATCOPY(quat+4, quat); - return quat+4; - } - else { - float *q1= eve->tmp.fp; - QuatInterpol(q1, q1, quat, 0.5f); - return quat; - } + float vecu[3], vecv[3]; + float q1[4], q2[4]; + + TAN_MAKE_VEC(vecu, v1, v2); + TAN_MAKE_VEC(vecv, v1, v3); + triatoquat(v1, vecu, vecv, q1); + + TAN_MAKE_VEC(vecu, def1, def2); + TAN_MAKE_VEC(vecv, def1, def3); + triatoquat(def1, vecu, vecv, q2); + + QuatSub(quat, q2, q1); } +#undef TAN_MAKE_VEC static void set_crazyspace_quats(float *mappedcos, float *quats) { EditMesh *em = G.editMesh; EditVert *eve, *prev; EditFace *efa; - float q1[4], q2[4]; - float *v1, *v2, *v3, *quatp; + float *v1, *v2, *v3, *v4; int index= 0; - /* 2 abused locations in vertices */ + /* two abused locations in vertices */ for(eve= em->verts.first; eve; eve= eve->next, index++) { eve->tmp.fp = NULL; eve->prev= (EditVert *)index; } - quatp= quats; + /* 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) { - /* vertex f1 flags were set for transform */ - if( (efa->v1->f1 && efa->v1->tmp.fp==NULL) || - (efa->v2->f1 && efa->v2->tmp.fp==NULL) || - (efa->v3->f1 && efa->v3->tmp.fp==NULL) || - (efa->v4 && efa->v4->f1 && efa->v4->tmp.fp==NULL) ) { + /* retrieve mapped coordinates */ + v1= mappedcos + 3*( (int)(efa->v1->prev) ); + v2= mappedcos + 3*( (int)(efa->v2->prev) ); + v3= mappedcos + 3*( (int)(efa->v3->prev) ); - triatoquat(efa->v1->co, efa->v2->co, efa->v3->co, q1); - - /* retrieve mapped coordinates */ - v1= mappedcos + 3*( (int)(efa->v1->prev) ); - v2= mappedcos + 3*( (int)(efa->v2->prev) ); - v3= mappedcos + 3*( (int)(efa->v3->prev) ); - triatoquat(v1, v2, v3, q2); - - QuatSub(quatp, q2, q1); + if(efa->v2->tmp.fp==NULL && efa->v2->f1) { + set_crazy_vertex_quat(quats, efa->v2->co, efa->v3->co, efa->v1->co, v2, v3, v1); + efa->v2->tmp.fp= quats; + quats+= 4; + } + + if(efa->v4) { + v4= mappedcos + 3*( (int)(efa->v4->prev) ); - if(efa->v1->f1) quatp= crazy_quat_blend(efa->v1, quatp); - if(efa->v2->f1) quatp= crazy_quat_blend(efa->v2, quatp); - if(efa->v3->f1) quatp= crazy_quat_blend(efa->v3, quatp); - if(efa->v4 && efa->v4->f1) quatp= crazy_quat_blend(efa->v4, quatp); + if(efa->v1->tmp.fp==NULL && efa->v1->f1) { + set_crazy_vertex_quat(quats, efa->v1->co, efa->v2->co, efa->v4->co, v1, v2, v4); + efa->v1->tmp.fp= quats; + quats+= 4; + } + if(efa->v3->tmp.fp==NULL && efa->v3->f1) { + set_crazy_vertex_quat(quats, efa->v3->co, efa->v4->co, efa->v2->co, v3, v4, v2); + efa->v3->tmp.fp= quats; + quats+= 4; + } + if(efa->v4->tmp.fp==NULL && efa->v4->f1) { + set_crazy_vertex_quat(quats, efa->v4->co, efa->v1->co, efa->v3->co, v4, v1, v3); + efa->v4->tmp.fp= quats; + quats+= 4; + } + } + else { + if(efa->v1->tmp.fp==NULL && efa->v1->f1) { + set_crazy_vertex_quat(quats, efa->v1->co, efa->v2->co, efa->v3->co, v1, v2, v3); + efa->v1->tmp.fp= quats; + quats+= 4; + } + if(efa->v3->tmp.fp==NULL && efa->v3->f1) { + set_crazy_vertex_quat(quats, efa->v3->co, efa->v1->co, efa->v2->co, v3, v1, v2); + efa->v3->tmp.fp= quats; + quats+= 4; + } } } @@ -1552,9 +1617,9 @@ static void createTransEditVerts(TransInfo *t) if(propmode==0) { if(modifiers_getCageIndex(G.obedit, NULL)>=0) { if(modifiers_isDeformed(G.obedit)) { - mappedcos= get_mapped_editverts(); - /* add one more quaternion, because of crazy_quat_blend */ - quats= MEM_mallocN( (t->total+1)*sizeof(float)*4, "crazy quats"); + /* disable subsurf temporal, get mapped cos, and enable it */ + mappedcos= get_crazy_mapped_editverts(); + quats= MEM_mallocN( (t->total)*sizeof(float)*4, "crazy quats"); set_crazyspace_quats(mappedcos, quats); } } |