Wednesday sync orange with bf-blender
Note: has the crazyspace fix!
This commit is contained in:
@@ -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;
|
||||
|
||||
|
||||
@@ -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'):
|
||||
|
||||
@@ -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:
|
||||
"""
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user