Wednesday sync orange with bf-blender

Note: has the crazyspace fix!
This commit is contained in:
2006-01-04 15:47:16 +00:00
4 changed files with 123 additions and 57 deletions

View File

@@ -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;

View File

@@ -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'):

View File

@@ -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:
"""

View File

@@ -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;
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);
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;
}
/* 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);
if(efa->v4) {
v4= mappedcos + 3*( (int)(efa->v4->prev) );
QuatSub(quatp, q2, q1);
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);
}
}