- added eModifierTypeFlag_RequiresOriginalData for modifiers that

can only follow deform (for example, they store mesh vertex
   indices)
 - added ModifierType.foreachObjectLink for iterating over Object
   links inside modifier data (used for file load, relinking, etc)
 - switched various modifiers_ functions to take object argument
   instead of ListBase
 - added user editable name field to modifiers
 - bug fix, duplicate and make single user didn't relink object
   pointers in modifier data
 - added modifiers to outliner, needs icon
 - added armature, hook, and softbody modifiers (softbody doesn't
   do anything atm). added conversion of old hooks to modifiers.

NOTE-THE-FIRST: User name field is not initialized on loading 2.38 files
so if you have saved stuff with a cvs blender you will see blank names.

NOTE-THE-SECOND: Since modifiers aren't evaluated yet for non-Mesh
objects, hooks for lattices and curves are broken. Don't updated if
you actually, say, *use* Blender.

NOTE-THE-THIRD: Old hooks used a quirky weighting system during
deformation which can't be extended to modifiers. On the upside,
I doubt anyone relied on the old quirky system and the new system
makes much more sense. (Although the way falloff works is still
quite stupid I think).
This commit is contained in:
2005-08-10 22:05:52 +00:00
parent eb64e304b4
commit 9030e5f686
21 changed files with 555 additions and 483 deletions

View File

@@ -47,8 +47,6 @@ struct bDeformGroup* copy_defgroup (struct bDeformGroup *ingroup);
struct bDeformGroup *get_named_vertexgroup (Object *ob, char *name); struct bDeformGroup *get_named_vertexgroup (Object *ob, char *name);
int get_defgroup_num (struct Object *ob, struct bDeformGroup *dg); int get_defgroup_num (struct Object *ob, struct bDeformGroup *dg);
void hook_object_deform(struct Object *ob, int index, float *vec);
int curve_modifier(struct Object *ob, char mode); int curve_modifier(struct Object *ob, char mode);
void mesh_modifier(struct Object *ob, float (**vertexCos_r)[3]); void mesh_modifier(struct Object *ob, float (**vertexCos_r)[3]);
int lattice_modifier(struct Object *ob, char mode); int lattice_modifier(struct Object *ob, char mode);

View File

@@ -38,7 +38,6 @@ struct ModifierData;
struct DagForest; struct DagForest;
struct DagNode; struct DagNode;
struct Object; struct Object;
struct ListBase;
typedef enum { typedef enum {
/* Should not be used, only for None modifier type */ /* Should not be used, only for None modifier type */
@@ -60,14 +59,19 @@ typedef enum {
eModifierTypeFlag_AcceptsCVs = (1<<1), eModifierTypeFlag_AcceptsCVs = (1<<1),
eModifierTypeFlag_SupportsMapping = (1<<2), eModifierTypeFlag_SupportsMapping = (1<<2),
eModifierTypeFlag_SupportsEditmode = (1<<3), eModifierTypeFlag_SupportsEditmode = (1<<3),
/* For modifiers that support editmode this determines if the /* For modifiers that support editmode this determines if the
* modifier should be enabled by default in editmode. This should * modifier should be enabled by default in editmode. This should
* only be used by modifiers that are relatively speedy and * only be used by modifiers that are relatively speedy and
* also generally used in editmode, otherwise let the user enable * also generally used in editmode, otherwise let the user enable
* it. * it by hand.
*/ */
eModifierTypeFlag_EnableInEditmode = (1<<4), eModifierTypeFlag_EnableInEditmode = (1<<4),
/* For modifiers that require original data and so cannot
* be placed after any non-deformative modifier.
*/
eModifierTypeFlag_RequiresOriginalData = (1<<5),
} ModifierTypeFlag; } ModifierTypeFlag;
typedef struct ModifierTypeInfo { typedef struct ModifierTypeInfo {
@@ -126,6 +130,14 @@ typedef struct ModifierTypeInfo {
*/ */
int (*dependsOnTime)(struct ModifierData *md); int (*dependsOnTime)(struct ModifierData *md);
/* Should call the given _walk_ function on with a pointer to each Object pointer
* that the modifier data stores. This is used for linking on file load and for
* unlinking objects or forwarding object references.
*
* This function is optional.
*/
void (*foreachObjectLink)(struct ModifierData *md, struct Object *ob, void (*walk)(void *userData, Object *ob, Object **obpoin), void *userData);
/* Only for deform types, should apply the deformation /* Only for deform types, should apply the deformation
* to the given vertex array. If the deformer requires information from * to the given vertex array. If the deformer requires information from
* the object it can obtain it from the _derivedData_ argument if non-NULL, * the object it can obtain it from the _derivedData_ argument if non-NULL,
@@ -183,9 +195,10 @@ int modifier_supportsMapping(struct ModifierData *md);
int modifier_couldBeCage (struct ModifierData *md); int modifier_couldBeCage (struct ModifierData *md);
void modifier_setError (struct ModifierData *md, char *format, ...); void modifier_setError (struct ModifierData *md, char *format, ...);
struct ModifierData* modifiers_findByType (struct ListBase *lb, ModifierType type); void modifiers_foreachObjectLink (struct Object *ob, void (*walk)(void *userData, struct Object *ob, struct Object **obpoin), void *userData);
void modifiers_clearErrors (struct ListBase *lb); struct ModifierData* modifiers_findByType (struct Object *ob, ModifierType type);
int modifiers_getCageIndex (struct ListBase *lb, int *lastPossibleCageIndex_r); void modifiers_clearErrors (struct Object *ob);
int modifiers_getCageIndex (struct Object *ob, int *lastPossibleCageIndex_r);
#endif #endif

View File

@@ -1393,7 +1393,7 @@ static void mesh_calc_modifiers(Object *ob, float (*inputVertexCos)[3], DerivedM
DerivedMesh *dm; DerivedMesh *dm;
int numVerts = me->totvert; int numVerts = me->totvert;
modifiers_clearErrors(&ob->modifiers); modifiers_clearErrors(ob);
if (deform_r) *deform_r = NULL; if (deform_r) *deform_r = NULL;
*final_r = NULL; *final_r = NULL;
@@ -1434,6 +1434,10 @@ static void mesh_calc_modifiers(Object *ob, float (*inputVertexCos)[3], DerivedM
if (!(md->mode&(1<<useRenderParams))) continue; if (!(md->mode&(1<<useRenderParams))) continue;
if (mti->type==eModifierTypeType_OnlyDeform && !useDeform) continue; if (mti->type==eModifierTypeType_OnlyDeform && !useDeform) continue;
if ((mti->flags&eModifierTypeFlag_RequiresOriginalData) && dm) {
modifier_setError(md, "Internal error, modifier requires original data (bad stack position).");
continue;
}
if (mti->isDisabled && mti->isDisabled(md)) continue; if (mti->isDisabled && mti->isDisabled(md)) continue;
/* How to apply modifier depends on (a) what we already have as /* How to apply modifier depends on (a) what we already have as
@@ -1521,9 +1525,9 @@ static void editmesh_calc_modifiers(DerivedMesh **cage_r, DerivedMesh **final_r)
ModifierData *md; ModifierData *md;
float (*deformedVerts)[3] = NULL; float (*deformedVerts)[3] = NULL;
DerivedMesh *dm; DerivedMesh *dm;
int i, numVerts, cageIndex = modifiers_getCageIndex(&ob->modifiers, NULL); int i, numVerts, cageIndex = modifiers_getCageIndex(ob, NULL);
modifiers_clearErrors(&ob->modifiers); modifiers_clearErrors(ob);
if (cage_r && cageIndex==-1) { if (cage_r && cageIndex==-1) {
*cage_r = getEditMeshDerivedMesh(em, NULL); *cage_r = getEditMeshDerivedMesh(em, NULL);
@@ -1535,6 +1539,10 @@ static void editmesh_calc_modifiers(DerivedMesh **cage_r, DerivedMesh **final_r)
if (!(md->mode&eModifierMode_Realtime)) continue; if (!(md->mode&eModifierMode_Realtime)) continue;
if (!(md->mode&eModifierMode_Editmode)) continue; if (!(md->mode&eModifierMode_Editmode)) continue;
if ((mti->flags&eModifierTypeFlag_RequiresOriginalData) && dm) {
modifier_setError(md, "Internal error, modifier requires original data (bad stack position).");
continue;
}
if (mti->isDisabled && mti->isDisabled(md)) continue; if (mti->isDisabled && mti->isDisabled(md)) continue;
if (!(mti->flags&eModifierTypeFlag_SupportsEditmode)) continue; if (!(mti->flags&eModifierTypeFlag_SupportsEditmode)) continue;

View File

@@ -156,98 +156,13 @@ int get_defgroup_num (Object *ob, bDeformGroup *dg)
/* *************** HOOK ****************** */ /* *************** HOOK ****************** */
/* vec==NULL: init
vec is supposed to be local coord, deform happens in local space
*/
void hook_object_deform(Object *ob, int index, float *vec)
{
float totforce;
ObHook *hook;
float vect[3], vectot[3];
if(ob->hooks.first==NULL) return;
/* reinitialize if... */
if(vec==NULL) {
totforce= 0.0;
for(hook= ob->hooks.first; hook; hook= hook->next) {
if(hook->parent) {
hook->curindex= 0;
Mat4Invert(ob->imat, ob->obmat);
/* apparently this call goes from right to left... */
Mat4MulSerie(hook->mat, ob->imat, hook->parent->obmat, hook->parentinv, NULL,
NULL, NULL, NULL, NULL);
}
}
return;
}
totforce= 0.0;
vectot[0]= vectot[1]= vectot[2]= 0.0;
for(hook= ob->hooks.first; hook; hook= hook->next) {
if(hook->parent) {
/* is 'index' in hook array? */
while(hook->curindex < hook->totindex-1) {
if( hook->indexar[hook->curindex] < index ) hook->curindex++;
else break;
}
if( hook->indexar[hook->curindex]==index ) {
float fac= hook->force, len;
VecMat4MulVecfl(vect, hook->mat, vec);
if(hook->falloff!=0.0) {
/* hook->cent is in local coords */
len= VecLenf(vec, hook->cent);
if(len > hook->falloff) fac= 0.0;
else if(len>0.0) fac*= sqrt(1.0 - len/hook->falloff);
}
if(fac!=0.0) {
totforce+= fac;
vectot[0]+= fac*vect[0];
vectot[1]+= fac*vect[1];
vectot[2]+= fac*vect[2];
}
}
}
}
/* if totforce < 1.0, we take old position also into account */
if(totforce<1.0) {
vectot[0]+= (1.0-totforce)*vec[0];
vectot[1]+= (1.0-totforce)*vec[1];
vectot[2]+= (1.0-totforce)*vec[2];
}
else VecMulf(vectot, 1.0/totforce);
VECCOPY(vec, vectot);
}
void mesh_modifier(Object *ob, float (**vertexCos_r)[3]) void mesh_modifier(Object *ob, float (**vertexCos_r)[3])
{ {
Mesh *me= ob->data; Mesh *me= ob->data;
float (*vertexCos)[3] = NULL; float (*vertexCos)[3] = NULL;
int a;
do_mesh_key(me); do_mesh_key(me);
/* hooks */
if(ob->hooks.first) {
if (!vertexCos) vertexCos = mesh_getVertexCos(me, NULL);
/* NULL signals initialize */
hook_object_deform(ob, 0, NULL);
for(a=0; a<me->totvert; a++) {
hook_object_deform(ob, a, vertexCos[a]);
}
}
if((ob->softflag & OB_SB_ENABLE) && !(ob->softflag & OB_SB_POSTDEF)) { if((ob->softflag & OB_SB_ENABLE) && !(ob->softflag & OB_SB_POSTDEF)) {
if (!vertexCos) vertexCos = mesh_getVertexCos(me, NULL); if (!vertexCos) vertexCos = mesh_getVertexCos(me, NULL);
sbObjectStep(ob, (float)G.scene->r.cfra, vertexCos); sbObjectStep(ob, (float)G.scene->r.cfra, vertexCos);
@@ -281,15 +196,12 @@ int curve_modifier(Object *ob, char mode)
static ListBase nurb={NULL, NULL}; static ListBase nurb={NULL, NULL};
Curve *cu= ob->data; Curve *cu= ob->data;
Nurb *nu, *newnu; Nurb *nu, *newnu;
BezTriple *bezt; int done= 0;
BPoint *bp;
int a, index, done= 0;
do_curve_key(cu); do_curve_key(cu);
/* conditions if it's needed */ /* conditions if it's needed */
if(ob->hooks.first); if(ob->parent && ob->partype==PARSKEL);
else if(ob->parent && ob->partype==PARSKEL);
else if(ob->parent && ob->parent->type==OB_LATTICE); else if(ob->parent && ob->parent->type==OB_LATTICE);
else return 0; else return 0;
@@ -302,39 +214,6 @@ int curve_modifier(Object *ob, char mode)
BLI_addtail(&nurb, newnu); BLI_addtail(&nurb, newnu);
nu= nu->next; nu= nu->next;
} }
/* hooks */
if(ob->hooks.first) {
done= 1;
/* NULL signals initialize */
hook_object_deform(ob, 0, NULL);
index= 0;
nu= cu->nurb.first;
while(nu) {
if((nu->type & 7)==CU_BEZIER) {
bezt= nu->bezt;
a= nu->pntsu;
while(a--) {
hook_object_deform(ob, index++, bezt->vec[0]);
hook_object_deform(ob, index++, bezt->vec[1]);
hook_object_deform(ob, index++, bezt->vec[2]);
bezt++;
}
}
else {
bp= nu->bp;
a= nu->pntsu*nu->pntsv;
while(a--) {
hook_object_deform(ob, index++, bp->vec);
bp++;
}
}
nu= nu->next;
}
}
} }
else if(mode=='e') { else if(mode=='e') {
/* paste */ /* paste */
@@ -352,14 +231,12 @@ int lattice_modifier(Object *ob, char mode)
{ {
static BPoint *bpoint; static BPoint *bpoint;
Lattice *lt= ob->data; Lattice *lt= ob->data;
BPoint *bp; int done= 0;
int a, index, done= 0;
do_latt_key(lt); do_latt_key(lt);
/* conditions if it's needed */ /* conditions if it's needed */
if(ob->hooks.first); if(ob->parent && ob->partype==PARSKEL);
else if(ob->parent && ob->partype==PARSKEL);
else if((ob->softflag & OB_SB_ENABLE)); else if((ob->softflag & OB_SB_ENABLE));
else return 0; else return 0;
@@ -367,25 +244,9 @@ int lattice_modifier(Object *ob, char mode)
/* copy */ /* copy */
bpoint= MEM_dupallocN(lt->def); bpoint= MEM_dupallocN(lt->def);
/* hooks */
if(ob->hooks.first) {
done= 1;
/* NULL signals initialize */
hook_object_deform(ob, 0, NULL);
index= 0;
bp= lt->def;
a= lt->pntsu*lt->pntsv*lt->pntsw;
while(a--) {
hook_object_deform(ob, index++, bp->vec);
bp++;
}
}
if((ob->softflag & OB_SB_ENABLE)) { if((ob->softflag & OB_SB_ENABLE)) {
sbObjectStep(ob, (float)G.scene->r.cfra, NULL); sbObjectStep(ob, (float)G.scene->r.cfra, NULL);
} }
} }
else { // end else { // end
MEM_freeN(lt->def); MEM_freeN(lt->def);

View File

@@ -352,16 +352,6 @@ struct DagForest *build_dag(struct Scene *sce, short mask)
} }
} }
} }
if (ob->hooks.first) {
ObHook *hook;
for(hook= ob->hooks.first; hook; hook= hook->next) {
if(hook->parent) {
node3 = dag_get_node(dag,hook->parent);
dag_add_relation(dag,node3,node,DAG_RL_OB_DATA);
}
}
}
if (ob->modifiers.first) { if (ob->modifiers.first) {
ModifierData *md; ModifierData *md;

View File

@@ -4,6 +4,7 @@
#include "BLI_blenlib.h" #include "BLI_blenlib.h"
#include "BLI_rand.h" #include "BLI_rand.h"
#include "BLI_arithb.h"
#include "MEM_guardedalloc.h" #include "MEM_guardedalloc.h"
@@ -56,6 +57,13 @@ static int curveModifier_isDisabled(ModifierData *md)
return !cmd->object; return !cmd->object;
} }
static void curveModifier_foreachObjectLink(ModifierData *md, Object *ob, void (*walk)(void *userData, Object *ob, Object **obpoin), void *userData)
{
CurveModifierData *cmd = (CurveModifierData*) md;
walk(userData, ob, &cmd->object);
}
static void curveModifier_updateDepgraph(ModifierData *md, DagForest *forest, Object *ob, DagNode *obNode) static void curveModifier_updateDepgraph(ModifierData *md, DagForest *forest, Object *ob, DagNode *obNode)
{ {
CurveModifierData *cmd = (CurveModifierData*) md; CurveModifierData *cmd = (CurveModifierData*) md;
@@ -98,6 +106,13 @@ static int latticeModifier_isDisabled(ModifierData *md)
return !lmd->object; return !lmd->object;
} }
static void latticeModifier_foreachObjectLink(ModifierData *md, Object *ob, void (*walk)(void *userData, Object *ob, Object **obpoin), void *userData)
{
LatticeModifierData *lmd = (LatticeModifierData*) md;
walk(userData, ob, &lmd->object);
}
static void latticeModifier_updateDepgraph(ModifierData *md, DagForest *forest, Object *ob, DagNode *obNode) static void latticeModifier_updateDepgraph(ModifierData *md, DagForest *forest, Object *ob, DagNode *obNode)
{ {
LatticeModifierData *lmd = (LatticeModifierData*) md; LatticeModifierData *lmd = (LatticeModifierData*) md;
@@ -1007,6 +1022,158 @@ static void waveModifier_deformVertsEM(ModifierData *md, Object *ob, void *editD
waveModifier_deformVerts(md, ob, NULL, vertexCos, numVerts); waveModifier_deformVerts(md, ob, NULL, vertexCos, numVerts);
} }
/* Armature */
static void armatureModifier_copyData(ModifierData *md, ModifierData *target)
{
ArmatureModifierData *amd = (ArmatureModifierData*) md;
ArmatureModifierData *tamd = (ArmatureModifierData*) target;
tamd->object = amd->object;
}
static int armatureModifier_isDisabled(ModifierData *md)
{
ArmatureModifierData *amd = (ArmatureModifierData*) md;
return !amd->object;
}
static void armatureModifier_foreachObjectLink(ModifierData *md, Object *ob, void (*walk)(void *userData, Object *ob, Object **obpoin), void *userData)
{
ArmatureModifierData *amd = (ArmatureModifierData*) md;
walk(userData, ob, &amd->object);
}
static void armatureModifier_updateDepgraph(ModifierData *md, DagForest *forest, Object *ob, DagNode *obNode)
{
ArmatureModifierData *amd = (ArmatureModifierData*) md;
if (amd->object) {
DagNode *curNode = dag_get_node(forest, amd->object);
dag_add_relation(forest, curNode, obNode, DAG_RL_DATA_DATA|DAG_RL_OB_DATA);
}
}
static void armatureModifier_deformVerts(ModifierData *md, Object *ob, void *derivedData, float (*vertexCos)[3], int numVerts)
{
ArmatureModifierData *amd = (ArmatureModifierData*) md;
armature_deform_verts(amd->object, ob, vertexCos, numVerts);
}
static void armatureModifier_deformVertsEM(ModifierData *md, Object *ob, void *editData, void *derivedData, float (*vertexCos)[3], int numVerts)
{
ArmatureModifierData *amd = (ArmatureModifierData*) md;
armature_deform_verts(amd->object, ob, vertexCos, numVerts);
}
/* Hook */
static void hookModifier_initData(ModifierData *md)
{
HookModifierData *hmd = (HookModifierData*) md;
hmd->force= 1.0;
}
static void hookModifier_copyData(ModifierData *md, ModifierData *target)
{
HookModifierData *hmd = (HookModifierData*) md;
HookModifierData *thmd = (HookModifierData*) target;
VECCOPY(thmd->cent, hmd->cent);
thmd->falloff = hmd->falloff;
thmd->force = hmd->force;
thmd->object = hmd->object;
thmd->totindex = hmd->totindex;
thmd->indexar = MEM_dupallocN(hmd->indexar);
memcpy(thmd->parentinv, hmd->parentinv, sizeof(hmd->parentinv));
}
static void hookModifier_freeData(ModifierData *md)
{
HookModifierData *hmd = (HookModifierData*) md;
if (hmd->indexar) MEM_freeN(hmd->indexar);
}
static int hookModifier_isDisabled(ModifierData *md)
{
HookModifierData *hmd = (HookModifierData*) md;
return !hmd->object;
}
static void hookModifier_foreachObjectLink(ModifierData *md, Object *ob, void (*walk)(void *userData, Object *ob, Object **obpoin), void *userData)
{
HookModifierData *hmd = (HookModifierData*) md;
walk(userData, ob, &hmd->object);
}
static void hookModifier_updateDepgraph(ModifierData *md, DagForest *forest, Object *ob, DagNode *obNode)
{
HookModifierData *hmd = (HookModifierData*) md;
if (hmd->object) {
DagNode *curNode = dag_get_node(forest, hmd->object);
dag_add_relation(forest, curNode, obNode, DAG_RL_OB_DATA);
}
}
static void hookModifier_deformVerts(ModifierData *md, Object *ob, void *derivedData, float (*vertexCos)[3], int numVerts)
{
HookModifierData *hmd = (HookModifierData*) md;
float vec[3], mat[4][4];
int i;
Mat4Invert(ob->imat, ob->obmat);
Mat4MulSerie(mat, ob->imat, hmd->object->obmat, hmd->parentinv, NULL, NULL, NULL, NULL, NULL);
for (i=0; i<hmd->totindex; i++) {
float *co = vertexCos[hmd->indexar[i]];
float fac = hmd->force;
if(hmd->falloff!=0.0) {
float len= VecLenf(co, hmd->cent);
if(len > hmd->falloff) fac = 0.0;
else if(len>0.0) fac *= sqrt(1.0 - len/hmd->falloff);
}
if(fac!=0.0) {
VecMat4MulVecfl(vec, mat, co);
VecLerpf(co, co, vec, fac);
}
}
}
static void hookModifier_deformVertsEM(ModifierData *md, Object *ob, void *editData, void *derivedData, float (*vertexCos)[3], int numVerts)
{
HookModifierData *hmd = (HookModifierData*) md;
hookModifier_deformVerts(md, ob, derivedData, vertexCos, numVerts);
}
/* Softbody */
static void softbodyModifier_deformVerts(ModifierData *md, Object *ob, void *derivedData, float (*vertexCos)[3], int numVerts)
{
SoftbodyModifierData *hmd = (SoftbodyModifierData*) md;
// sbObjectStep(ob, (float)G.scene->r.cfra, vertexCos);
}
static void softbodyModifier_deformVertsEM(ModifierData *md, Object *ob, void *editData, void *derivedData, float (*vertexCos)[3], int numVerts)
{
SoftbodyModifierData *hmd = (SoftbodyModifierData*) md;
// sbObjectStep(ob, (float)G.scene->r.cfra, vertexCos);
}
/***/ /***/
@@ -1044,6 +1211,7 @@ ModifierTypeInfo *modifierType_getInfo(ModifierType type)
mti->flags = eModifierTypeFlag_AcceptsCVs | eModifierTypeFlag_SupportsEditmode; mti->flags = eModifierTypeFlag_AcceptsCVs | eModifierTypeFlag_SupportsEditmode;
mti->copyData = curveModifier_copyData; mti->copyData = curveModifier_copyData;
mti->isDisabled = curveModifier_isDisabled; mti->isDisabled = curveModifier_isDisabled;
mti->foreachObjectLink = curveModifier_foreachObjectLink;
mti->updateDepgraph = curveModifier_updateDepgraph; mti->updateDepgraph = curveModifier_updateDepgraph;
mti->deformVerts = curveModifier_deformVerts; mti->deformVerts = curveModifier_deformVerts;
mti->deformVertsEM = curveModifier_deformVertsEM; mti->deformVertsEM = curveModifier_deformVertsEM;
@@ -1053,6 +1221,7 @@ ModifierTypeInfo *modifierType_getInfo(ModifierType type)
mti->flags = eModifierTypeFlag_AcceptsCVs | eModifierTypeFlag_SupportsEditmode; mti->flags = eModifierTypeFlag_AcceptsCVs | eModifierTypeFlag_SupportsEditmode;
mti->copyData = latticeModifier_copyData; mti->copyData = latticeModifier_copyData;
mti->isDisabled = latticeModifier_isDisabled; mti->isDisabled = latticeModifier_isDisabled;
mti->foreachObjectLink = latticeModifier_foreachObjectLink;
mti->updateDepgraph = latticeModifier_updateDepgraph; mti->updateDepgraph = latticeModifier_updateDepgraph;
mti->deformVerts = latticeModifier_deformVerts; mti->deformVerts = latticeModifier_deformVerts;
mti->deformVertsEM = latticeModifier_deformVertsEM; mti->deformVertsEM = latticeModifier_deformVertsEM;
@@ -1097,6 +1266,34 @@ ModifierTypeInfo *modifierType_getInfo(ModifierType type)
mti->deformVerts = waveModifier_deformVerts; mti->deformVerts = waveModifier_deformVerts;
mti->deformVertsEM = waveModifier_deformVertsEM; mti->deformVertsEM = waveModifier_deformVertsEM;
mti = INIT_TYPE(Armature);
mti->type = eModifierTypeType_OnlyDeform;
mti->flags = eModifierTypeFlag_AcceptsCVs | eModifierTypeFlag_SupportsEditmode;
mti->copyData = armatureModifier_copyData;
mti->isDisabled = armatureModifier_isDisabled;
mti->foreachObjectLink = armatureModifier_foreachObjectLink;
mti->updateDepgraph = armatureModifier_updateDepgraph;
mti->deformVerts = armatureModifier_deformVerts;
mti->deformVertsEM = armatureModifier_deformVertsEM;
mti = INIT_TYPE(Hook);
mti->type = eModifierTypeType_OnlyDeform;
mti->flags = eModifierTypeFlag_AcceptsCVs | eModifierTypeFlag_SupportsEditmode | eModifierTypeFlag_RequiresOriginalData;
mti->initData = hookModifier_initData;
mti->copyData = hookModifier_copyData;
mti->freeData = hookModifier_freeData;
mti->isDisabled = hookModifier_isDisabled;
mti->foreachObjectLink = hookModifier_foreachObjectLink;
mti->updateDepgraph = hookModifier_updateDepgraph;
mti->deformVerts = hookModifier_deformVerts;
mti->deformVertsEM = hookModifier_deformVertsEM;
mti = INIT_TYPE(Softbody);
mti->type = eModifierTypeType_OnlyDeform;
mti->flags = eModifierTypeFlag_AcceptsCVs | eModifierTypeFlag_SupportsEditmode;
mti->deformVerts = softbodyModifier_deformVerts;
mti->deformVertsEM = softbodyModifier_deformVertsEM;
typeArrInit = 0; typeArrInit = 0;
#undef INIT_TYPE #undef INIT_TYPE
} }
@@ -1108,11 +1305,15 @@ ModifierTypeInfo *modifierType_getInfo(ModifierType type)
} }
} }
/***/
ModifierData *modifier_new(int type) ModifierData *modifier_new(int type)
{ {
ModifierTypeInfo *mti = modifierType_getInfo(type); ModifierTypeInfo *mti = modifierType_getInfo(type);
ModifierData *md = MEM_callocN(mti->structSize, mti->structName); ModifierData *md = MEM_callocN(mti->structSize, mti->structName);
strcpy(md->name, mti->name);
md->type = type; md->type = type;
md->mode = eModifierMode_Realtime|eModifierMode_Render|eModifierMode_Expanded; md->mode = eModifierMode_Realtime|eModifierMode_Render|eModifierMode_Expanded;
@@ -1150,9 +1351,9 @@ int modifier_supportsMapping(ModifierData *md)
(mti->flags&eModifierTypeFlag_SupportsMapping))) ); (mti->flags&eModifierTypeFlag_SupportsMapping))) );
} }
ModifierData *modifiers_findByType(struct ListBase *lb, ModifierType type) ModifierData *modifiers_findByType(Object *ob, ModifierType type)
{ {
ModifierData *md = lb->first; ModifierData *md = ob->modifiers.first;
for (; md; md=md->next) for (; md; md=md->next)
if (md->type==type) if (md->type==type)
@@ -1161,18 +1362,32 @@ ModifierData *modifiers_findByType(struct ListBase *lb, ModifierType type)
return md; return md;
} }
void modifiers_clearErrors(struct ListBase *lb) void modifiers_clearErrors(Object *ob)
{ {
ModifierData *md = lb->first; ModifierData *md = ob->modifiers.first;
int qRedraw = 0;
for (; md; md=md->next) { for (; md; md=md->next) {
if (md->error) { if (md->error) {
MEM_freeN(md->error); MEM_freeN(md->error);
md->error = NULL; md->error = NULL;
allqueue(REDRAWBUTSEDIT, 0); qRedraw = 1;
} }
} }
if (qRedraw) allqueue(REDRAWBUTSEDIT, 0);
}
void modifiers_foreachObjectLink(Object *ob, void (*walk)(void *userData, Object *ob, Object **obpoin), void *userData)
{
ModifierData *md = ob->modifiers.first;
for (; md; md=md->next) {
ModifierTypeInfo *mti = modifierType_getInfo(md->type);
if (mti->foreachObjectLink) mti->foreachObjectLink(md, ob, walk, userData);
}
} }
void modifier_copyData(ModifierData *md, ModifierData *target) void modifier_copyData(ModifierData *md, ModifierData *target)
@@ -1212,9 +1427,9 @@ void modifier_setError(ModifierData *md, char *format, ...)
allqueue(REDRAWBUTSEDIT, 0); allqueue(REDRAWBUTSEDIT, 0);
} }
int modifiers_getCageIndex(ListBase *lb, int *lastPossibleCageIndex_r) int modifiers_getCageIndex(Object *ob, int *lastPossibleCageIndex_r)
{ {
ModifierData *md = lb->first; ModifierData *md = ob->modifiers.first;
int i, cageIndex = -1; int i, cageIndex = -1;
/* Find the last modifier acting on the cage. */ /* Find the last modifier acting on the cage. */

View File

@@ -149,29 +149,6 @@ void update_base_layer(Object *ob)
} }
} }
static void free_hooks(ListBase *lb)
{
while(lb->first) {
ObHook *hook= lb->first;
if(hook->indexar) MEM_freeN(hook->indexar);
BLI_remlink(lb, hook);
MEM_freeN(hook);
}
}
static void copy_hooks(ListBase *new, ListBase *old)
{
ObHook *hook, *hookn;
new->first= new->last= NULL;
for(hook= old->first; hook; hook= hook->next) {
hookn= MEM_dupallocN(hook);
hookn->indexar= MEM_dupallocN(hookn->indexar);
BLI_addtail(new, hookn);
}
}
void object_free_modifiers(Object *ob) void object_free_modifiers(Object *ob)
{ {
while (ob->modifiers.first) { while (ob->modifiers.first) {
@@ -233,8 +210,6 @@ void free_object(Object *ob)
free_constraint_channels(&ob->constraintChannels); free_constraint_channels(&ob->constraintChannels);
free_nlastrips(&ob->nlastrips); free_nlastrips(&ob->nlastrips);
free_hooks(&ob->hooks);
freedisplist(&ob->disp); freedisplist(&ob->disp);
BPY_free_scriptlink(&ob->scriptlink); BPY_free_scriptlink(&ob->scriptlink);
@@ -243,6 +218,15 @@ void free_object(Object *ob)
if(ob->soft) sbFree(ob->soft); if(ob->soft) sbFree(ob->soft);
} }
static void unlink_object__unlinkModifierLinks(void *userData, Object *ob, Object **obpoin)
{
Object *unlinkOb = userData;
if (*obpoin==unlinkOb) {
*obpoin = NULL;
ob->recalc |= OB_RECALC;
}
}
void unlink_object(Object *ob) void unlink_object(Object *ob)
{ {
Object *obt; Object *obt;
@@ -252,10 +236,8 @@ void unlink_object(Object *ob)
Scene *sce; Scene *sce;
Curve *cu; Curve *cu;
Tex *tex; Tex *tex;
ObHook *hook;
Group *group; Group *group;
bConstraint *con; bConstraint *con;
ModifierData *md;
int a; int a;
char *str; char *str;
@@ -277,30 +259,7 @@ void unlink_object(Object *ob)
obt->recalc |= OB_RECALC_OB; obt->recalc |= OB_RECALC_OB;
} }
for(hook=obt->hooks.first; hook; hook= hook->next) { modifiers_foreachObjectLink(obt, unlink_object__unlinkModifierLinks, ob);
if(hook->parent==ob) {
hook->parent= NULL;
obt->recalc |= OB_RECALC;
}
}
for (md=obt->modifiers.first; md; md=md->next) {
if (md->type==eModifierType_Curve) {
CurveModifierData *cmd = (CurveModifierData*) md;
if (cmd->object==ob) {
cmd->object = NULL;
obt->recalc |= OB_RECALC;
}
} else if (md->type==eModifierType_Lattice) {
LatticeModifierData *lmd = (LatticeModifierData*) md;
if (lmd->object==ob) {
lmd->object = NULL;
obt->recalc |= OB_RECALC;
}
}
}
if ELEM(obt->type, OB_CURVE, OB_FONT) { if ELEM(obt->type, OB_CURVE, OB_FONT) {
cu= obt->data; cu= obt->data;
@@ -860,8 +819,6 @@ Object *copy_object(Object *ob)
copy_nlastrips(&obn->nlastrips, &ob->nlastrips); copy_nlastrips(&obn->nlastrips, &ob->nlastrips);
copy_constraints (&obn->constraints, &ob->constraints); copy_constraints (&obn->constraints, &ob->constraints);
copy_hooks( &obn->hooks, &ob->hooks);
actcon = clone_constraint_channels (&obn->constraintChannels, &ob->constraintChannels, ob->activecon); actcon = clone_constraint_channels (&obn->constraintChannels, &ob->constraintChannels, ob->activecon);
/* If the active constraint channel was in this list, update it */ /* If the active constraint channel was in this list, update it */
if (actcon) if (actcon)

View File

@@ -745,7 +745,6 @@ static int object_has_edges(Object *ob)
/* helper call */ /* helper call */
static void set_body_point(Object *ob, BodyPoint *bp, float *vec) static void set_body_point(Object *ob, BodyPoint *bp, float *vec)
{ {
VECCOPY(bp->pos, vec); VECCOPY(bp->pos, vec);
Mat4MulVecfl(ob->obmat, bp->pos); // yep, sofbody is global coords Mat4MulVecfl(ob->obmat, bp->pos); // yep, sofbody is global coords
VECCOPY(bp->origS, bp->pos); VECCOPY(bp->origS, bp->pos);

View File

@@ -2119,22 +2119,15 @@ static void direct_link_mesh(FileData *fd, Mesh *mesh)
/* ************ READ OBJECT ***************** */ /* ************ READ OBJECT ***************** */
static void lib_link_modifiers__linkModifiers(void *userData, Object *ob, Object **obpoin)
{
FileData *fd = userData;
*obpoin = newlibadr(fd, ob->id.lib, *obpoin);
}
static void lib_link_modifiers(FileData *fd, Object *ob) static void lib_link_modifiers(FileData *fd, Object *ob)
{ {
ModifierData *md; modifiers_foreachObjectLink(ob, lib_link_modifiers__linkModifiers, fd);
for (md=ob->modifiers.first; md; md=md->next) {
if (md->type==eModifierType_Lattice) {
LatticeModifierData *lmd = (LatticeModifierData*) md;
lmd->object = newlibadr(fd, ob->id.lib, lmd->object);
}
else if (md->type==eModifierType_Curve) {
CurveModifierData *cmd = (CurveModifierData*) md;
cmd->object = newlibadr(fd, ob->id.lib, cmd->object);
}
}
} }
static void lib_link_object(FileData *fd, Main *main) static void lib_link_object(FileData *fd, Main *main)
@@ -2143,7 +2136,6 @@ static void lib_link_object(FileData *fd, Main *main)
bSensor *sens; bSensor *sens;
bController *cont; bController *cont;
bActuator *act; bActuator *act;
ObHook *hook;
void *poin; void *poin;
int warn=0, a; int warn=0, a;
@@ -2265,11 +2257,6 @@ static void lib_link_object(FileData *fd, Main *main)
} }
lib_link_scriptlink(fd, &ob->id, &ob->scriptlink); lib_link_scriptlink(fd, &ob->id, &ob->scriptlink);
for(hook= ob->hooks.first; hook; hook= hook->next) {
hook->parent= newlibadr(fd, ob->id.lib, hook->parent);
}
lib_link_modifiers(fd, ob); lib_link_modifiers(fd, ob);
} }
ob= ob->id.next; ob= ob->id.next;
@@ -2310,6 +2297,16 @@ static void direct_link_modifiers(FileData *fd, ListBase *lb)
SubsurfModifierData *smd = (SubsurfModifierData*) md; SubsurfModifierData *smd = (SubsurfModifierData*) md;
smd->emCache = smd->mCache = 0; smd->emCache = smd->mCache = 0;
} else if (md->type==eModifierType_Hook) {
HookModifierData *hmd = (HookModifierData*) md;
hmd->indexar= newdataadr(fd, hmd->indexar);
if(fd->flags & FD_FLAGS_SWITCH_ENDIAN) {
int a;
for(a=0; a<hmd->totindex; a++) {
SWITCH_INT(hmd->indexar[a]);
}
}
} }
} }
} }
@@ -4785,6 +4782,24 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
where_is_armature(arm); where_is_armature(arm);
} }
for(ob= main->object.first; ob; ob= ob->id.next) { for(ob= main->object.first; ob; ob= ob->id.next) {
while (ob->hooks.first) {
ObHook *hook = ob->hooks.first;
HookModifierData *hmd = (HookModifierData*) modifier_new(eModifierType_Hook);
VECCOPY(hmd->cent, hook->cent);
hmd->falloff = hook->falloff;
hmd->force = hook->force;
hmd->indexar = hook->indexar;
hmd->object = hook->parent;
memcpy(hmd->parentinv, hook->parentinv, sizeof(hmd->parentinv));
hmd->totindex = hook->totindex;
BLI_addtail(&ob->modifiers, hmd);
BLI_remlink(&ob->hooks, hook);
MEM_freeN(hook);
}
// btw. armature_rebuild_pose is further only called on leave editmode // btw. armature_rebuild_pose is further only called on leave editmode
if(ob->type==OB_ARMATURE) { if(ob->type==OB_ARMATURE) {
if(ob->pose) { if(ob->pose) {

View File

@@ -664,13 +664,18 @@ static void write_modifiers(WriteData *wd, ListBase *modbase)
ModifierTypeInfo *mti = modifierType_getInfo(md->type); ModifierTypeInfo *mti = modifierType_getInfo(md->type);
writestruct(wd, DATA, mti->structName, 1, md); writestruct(wd, DATA, mti->structName, 1, md);
if (md->type==eModifierType_Hook) {
HookModifierData *hmd = (HookModifierData*) md;
writedata(wd, DATA, sizeof(int)*hmd->totindex, hmd->indexar);
}
} }
} }
static void write_objects(WriteData *wd, ListBase *idbase) static void write_objects(WriteData *wd, ListBase *idbase)
{ {
Object *ob; Object *ob;
ObHook *hook;
int a; int a;
ob= idbase->first; ob= idbase->first;
@@ -705,11 +710,6 @@ static void write_objects(WriteData *wd, ListBase *idbase)
} }
} }
for(hook= ob->hooks.first; hook; hook= hook->next) {
writestruct(wd, DATA, "ObHook", 1, hook);
writedata(wd, DATA, sizeof(int)*hook->totindex, hook->indexar);
}
write_modifiers(wd, &ob->modifiers); write_modifiers(wd, &ob->modifiers);
} }
ob= ob->id.next; ob= ob->id.next;

View File

@@ -60,11 +60,12 @@ typedef struct TreeElement {
#define TSE_EBONE 6 #define TSE_EBONE 6
#define TSE_CONSTRAINT_BASE 7 #define TSE_CONSTRAINT_BASE 7
#define TSE_CONSTRAINT 8 #define TSE_CONSTRAINT 8
#define TSE_HOOKS_BASE 9 #define TSE_MODIFIER_BASE 9
#define TSE_HOOK 10 #define TSE_MODIFIER 10
#define TSE_SCRIPT_BASE 11 #define TSE_MODIFIER_OB 11
#define TSE_POSE_BASE 12 #define TSE_SCRIPT_BASE 12
#define TSE_POSE_CHANNEL 13 #define TSE_POSE_BASE 13
#define TSE_POSE_CHANNEL 14
/* button events */ /* button events */
#define OL_NAMEBUTTON 1 #define OL_NAMEBUTTON 1

View File

@@ -215,10 +215,8 @@ void test_idbutton_cb(void *namev, void *arg2_unused);
/* *********************** */ /* *********************** */
#define B_ANIMBUTS 1500 #define B_ANIMBUTS 1500
#define B_RECALCPATH 1401 #define B_RECALCPATH 1401
#define B_TRACKBUTS 1402 #define B_TRACKBUTS 1402
#define B_DEL_HOOK 1403
#define B_CLR_HOOK 1404
#define B_PRINTSPEED 1413 #define B_PRINTSPEED 1413
#define B_PRINTLEN 1414 #define B_PRINTLEN 1414

View File

@@ -14,6 +14,9 @@ typedef enum ModifierType {
eModifierType_Mirror, eModifierType_Mirror,
eModifierType_Decimate, eModifierType_Decimate,
eModifierType_Wave, eModifierType_Wave,
eModifierType_Armature,
eModifierType_Hook,
eModifierType_Softbody,
NUM_MODIFIER_TYPES NUM_MODIFIER_TYPES
} ModifierType; } ModifierType;
@@ -23,7 +26,6 @@ typedef enum ModifierType {
* for render calc. * for render calc.
*/ */
typedef enum ModifierMode { typedef enum ModifierMode {
eModifierMode_Disabled = 0,
eModifierMode_Realtime = (1<<0), eModifierMode_Realtime = (1<<0),
eModifierMode_Render = (1<<1), eModifierMode_Render = (1<<1),
eModifierMode_Editmode = (1<<2), eModifierMode_Editmode = (1<<2),
@@ -35,6 +37,7 @@ typedef struct ModifierData {
struct ModifierData *next, *prev; struct ModifierData *next, *prev;
int type, mode; int type, mode;
char name[32];
char *error; char *error;
} ModifierData; } ModifierData;
@@ -95,4 +98,27 @@ typedef struct WaveModifierData {
float timeoffs, lifetime; float timeoffs, lifetime;
} WaveModifierData; } WaveModifierData;
typedef struct ArmatureModifierData {
ModifierData modifier;
struct Object *object;
} ArmatureModifierData;
typedef struct HookModifierData {
ModifierData modifier;
struct Object *object;
float parentinv[4][4]; /* matrix making current transform unmodified */
float cent[3]; /* visualization of hook */
float falloff; /* if not zero, falloff is distance where influence zero */
int *indexar;
int totindex;
float force;
} HookModifierData;
typedef struct SoftbodyModifierData {
ModifierData modifier;
} SoftbodyModifierData;
#endif #endif

View File

@@ -511,11 +511,13 @@ void do_modifier_panels(unsigned short event)
switch(event) { switch(event) {
case B_MODIFIER_REDRAW: case B_MODIFIER_REDRAW:
allqueue(REDRAWBUTSEDIT, 0); allqueue(REDRAWBUTSEDIT, 0);
allqueue(REDRAWOOPS, 0);
break; break;
case B_MODIFIER_RECALC: case B_MODIFIER_RECALC:
allqueue(REDRAWBUTSEDIT, 0); allqueue(REDRAWBUTSEDIT, 0);
allqueue(REDRAWVIEW3D, 0); allqueue(REDRAWVIEW3D, 0);
allqueue(REDRAWOOPS, 0);
DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA); DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
break; break;
} }
@@ -590,6 +592,17 @@ static void modifiers_moveDown(void *ob_v, void *md_v)
ModifierData *md = md_v; ModifierData *md = md_v;
if (md->next) { if (md->next) {
ModifierTypeInfo *mti = modifierType_getInfo(md->type);
if (mti->flags&eModifierTypeFlag_RequiresOriginalData) {
ModifierTypeInfo *nmti = modifierType_getInfo(md->next->type);
if (nmti->type!=eModifierTypeType_OnlyDeform) {
error("Cannot move beyond a non-deforming modifier.");
return;
}
}
BLI_remlink(&ob->modifiers, md); BLI_remlink(&ob->modifiers, md);
BLI_insertlink(&ob->modifiers, md->next, md); BLI_insertlink(&ob->modifiers, md->next, md);
} }
@@ -629,6 +642,23 @@ static void modifier_testCurveObj(char *name, ID **idpp)
*idpp= 0; *idpp= 0;
} }
static void modifier_testArmatureObj(char *name, ID **idpp)
{
ID *id;
for (id= G.main->object.first; id; id= id->next) {
if( strcmp(name, id->name+2)==0 ) {
if (((Object *)id)->type != OB_ARMATURE) {
error ("Armature deform object must be an armature");
break;
}
*idpp= id;
return;
}
}
*idpp= 0;
}
static void modifiers_applyModifier(void *obv, void *mdv) static void modifiers_applyModifier(void *obv, void *mdv)
{ {
Object *ob = obv; Object *ob = obv;
@@ -718,6 +748,19 @@ static void modifiers_setSubsurfIncremental(void *ob_v, void *md_v)
} }
} }
static void modifiers_clearHookOffset(void *ob_v, void *md_v)
{
Object *ob = ob_v;
ModifierData *md = md_v;
HookModifierData *hmd = (HookModifierData*) md;
if (hmd->object) {
Mat4Invert(hmd->object->imat, hmd->object->obmat);
Mat4MulSerie(hmd->parentinv, hmd->object->imat, ob->obmat, NULL, NULL, NULL, NULL, NULL, NULL);
BIF_undo_push("Clear hook");
}
}
static void draw_modifier(uiBlock *block, Object *ob, ModifierData *md, int *xco, int *yco, int index, int cageIndex, int lastCageIndex) static void draw_modifier(uiBlock *block, Object *ob, ModifierData *md, int *xco, int *yco, int index, int cageIndex, int lastCageIndex)
{ {
ModifierTypeInfo *mti = modifierType_getInfo(md->type); ModifierTypeInfo *mti = modifierType_getInfo(md->type);
@@ -737,7 +780,14 @@ static void draw_modifier(uiBlock *block, Object *ob, ModifierData *md, int *xco
uiRoundBox(x+4+10, y-18, x+width+10, y+6, 5.0); uiRoundBox(x+4+10, y-18, x+width+10, y+6, 5.0);
BIF_ThemeColor(color); BIF_ThemeColor(color);
uiDefBut(block, LABEL, B_NOP, mti->name, x+5, y-1, 100, 19, NULL, 0.0, 0.0, 0.0, 0.0, ""); uiBlockBeginAlign(block);
uiDefBut(block, TEX, B_MODIFIER_REDRAW, "", x+10, y-1, width-120-60-10, 19, md->name, 0.0, sizeof(md->name)-1, 0.0, 0.0, "Modifier name");
uiDefIconButBitI(block, TOG, eModifierMode_Render, B_MODIFIER_RECALC, ICON_SCENE, x+width-120-60, y-1, 19, 19,&md->mode, 0, 0, 1, 0, "Enable modifier during rendering");
uiDefIconButBitI(block, TOG, eModifierMode_Realtime, B_MODIFIER_RECALC, VICON_VIEW3D, x+width-120-60+20, y-1, 19, 19,&md->mode, 0, 0, 1, 0, "Enable modifier during interactive display");
if (mti->flags&eModifierTypeFlag_SupportsEditmode) {
uiDefIconButBitI(block, TOG, eModifierMode_Editmode, B_MODIFIER_RECALC, VICON_EDIT, x+width-120-60+40, y-1, 19, 19,&md->mode, 0, 0, 1, 0, "Enable modifier during Editmode (only if enabled for display)");
}
uiBlockEndAlign(block);
uiBlockSetEmboss(block, UI_EMBOSSR); uiBlockSetEmboss(block, UI_EMBOSSR);
@@ -756,7 +806,7 @@ static void draw_modifier(uiBlock *block, Object *ob, ModifierData *md, int *xco
icon = ICON_BLANK1; icon = ICON_BLANK1;
} }
uiBlockSetCol(block, color); uiBlockSetCol(block, color);
but = uiDefIconBut(block, BUT, B_MODIFIER_RECALC, icon, x+width-120, y, 16, 16, NULL, 0.0, 0.0, 0.0, 0.0, "Apply modifier to editing cage during Editmode"); but = uiDefIconBut(block, BUT, B_MODIFIER_RECALC, icon, x+width-105, y, 16, 16, NULL, 0.0, 0.0, 0.0, 0.0, "Apply modifier to editing cage during Editmode");
uiButSetFunc(but, modifiers_setOnCage, ob, md); uiButSetFunc(but, modifiers_setOnCage, ob, md);
uiBlockSetCol(block, TH_AUTO); uiBlockSetCol(block, TH_AUTO);
} }
@@ -778,14 +828,6 @@ static void draw_modifier(uiBlock *block, Object *ob, ModifierData *md, int *xco
BIF_ThemeColor(color); BIF_ThemeColor(color);
uiBlockSetEmboss(block, UI_EMBOSS); uiBlockSetEmboss(block, UI_EMBOSS);
uiBlockBeginAlign(block);
uiDefIconButBitI(block, TOG, eModifierMode_Render, B_MODIFIER_RECALC, ICON_SCENE, x+width-120-90, y, 19, 19,&md->mode, 0, 0, 1, 0, "Enable modifier during rendering");
uiDefIconButBitI(block, TOG, eModifierMode_Realtime, B_MODIFIER_RECALC, VICON_VIEW3D, x+width-120-90+20, y, 19, 19,&md->mode, 0, 0, 1, 0, "Enable modifier during interactive display");
if (mti->flags&eModifierTypeFlag_SupportsEditmode) {
uiDefIconButBitI(block, TOG, eModifierMode_Editmode, B_MODIFIER_RECALC, VICON_EDIT, x+width-120-90+40, y, 19, 19,&md->mode, 0, 0, 1, 0, "Enable modifier during Editmode (only if enabled for display)");
}
uiBlockEndAlign(block);
if (!(md->mode&eModifierMode_Expanded)) { if (!(md->mode&eModifierMode_Expanded)) {
y -= 18; y -= 18;
} else { } else {
@@ -798,17 +840,23 @@ static void draw_modifier(uiBlock *block, Object *ob, ModifierData *md, int *xco
if (md->type==eModifierType_Subsurf) { if (md->type==eModifierType_Subsurf) {
height = 86; height = 86;
} else if (md->type==eModifierType_Lattice) { } else if (md->type==eModifierType_Lattice) {
height = 86; height = 46;
} else if (md->type==eModifierType_Curve) { } else if (md->type==eModifierType_Curve) {
height = 86; height = 46;
} else if (md->type==eModifierType_Build) { } else if (md->type==eModifierType_Build) {
height = 86; height = 86;
} else if (md->type==eModifierType_Mirror) { } else if (md->type==eModifierType_Mirror) {
height = 86; height = 46;
} else if (md->type==eModifierType_Decimate) { } else if (md->type==eModifierType_Decimate) {
height = 66; height = 46;
} else if (md->type==eModifierType_Wave) { } else if (md->type==eModifierType_Wave) {
height = 200; height = 200;
} else if (md->type==eModifierType_Armature) {
height = 46;
} else if (md->type==eModifierType_Hook) {
height = 86;
} else if (md->type==eModifierType_Softbody) {
height = 46;
} }
BIF_ThemeColor(color); BIF_ThemeColor(color);
@@ -845,10 +893,10 @@ static void draw_modifier(uiBlock *block, Object *ob, ModifierData *md, int *xco
uiDefButBitS(block, TOG, eSubsurfModifierFlag_DebugIncr, B_MODIFIER_RECALC, "Debug", lx+90, cy,70,19,&smd->flags, 0, 0, 0, 0, "Visualize the subsurf incremental calculation, for debugging effect of other modifiers"); uiDefButBitS(block, TOG, eSubsurfModifierFlag_DebugIncr, B_MODIFIER_RECALC, "Debug", lx+90, cy,70,19,&smd->flags, 0, 0, 0, 0, "Visualize the subsurf incremental calculation, for debugging effect of other modifiers");
} else if (md->type==eModifierType_Lattice) { } else if (md->type==eModifierType_Lattice) {
LatticeModifierData *lmd = (LatticeModifierData*) md; LatticeModifierData *lmd = (LatticeModifierData*) md;
uiDefIDPoinBut(block, modifier_testLatticeObj, B_CHANGEDEP, "Ob:", lx, (cy-=19), 120,19, &lmd->object, "Lattice object to deform with"); uiDefIDPoinBut(block, modifier_testLatticeObj, B_CHANGEDEP, "Ob: ", lx, (cy-=19), 120,19, &lmd->object, "Lattice object to deform with");
} else if (md->type==eModifierType_Curve) { } else if (md->type==eModifierType_Curve) {
CurveModifierData *cmd = (CurveModifierData*) md; CurveModifierData *cmd = (CurveModifierData*) md;
uiDefIDPoinBut(block, modifier_testCurveObj, B_CHANGEDEP, "Ob:", lx, (cy-=19), 120,19, &cmd->object, "Curve object to deform with"); uiDefIDPoinBut(block, modifier_testCurveObj, B_CHANGEDEP, "Ob: ", lx, (cy-=19), 120,19, &cmd->object, "Curve object to deform with");
} else if (md->type==eModifierType_Build) { } else if (md->type==eModifierType_Build) {
BuildModifierData *bmd = (BuildModifierData*) md; BuildModifierData *bmd = (BuildModifierData*) md;
uiDefButF(block, NUM, B_MODIFIER_RECALC, "Start:", lx, (cy-=19), 160,19, &bmd->start, 1.0, 9000.0, 100, 0, "Specify the start frame of the effect"); uiDefButF(block, NUM, B_MODIFIER_RECALC, "Start:", lx, (cy-=19), 160,19, &bmd->start, 1.0, 9000.0, 100, 0, "Specify the start frame of the effect");
@@ -883,6 +931,18 @@ static void draw_modifier(uiBlock *block, Object *ob, ModifierData *md, int *xco
uiDefButF(block, NUMSLI, B_MODIFIER_RECALC, "Heigth:", lx,(cy-=19),220,19, &wmd->height, -2.0, 2.0, 0, 0, "Specify the amplitude of the wave"); uiDefButF(block, NUMSLI, B_MODIFIER_RECALC, "Heigth:", lx,(cy-=19),220,19, &wmd->height, -2.0, 2.0, 0, 0, "Specify the amplitude of the wave");
uiDefButF(block, NUMSLI, B_MODIFIER_RECALC, "Width:", lx,(cy-=19),220,19, &wmd->width, 0.0, 5.0, 0, 0, "Specify the width of the wave"); uiDefButF(block, NUMSLI, B_MODIFIER_RECALC, "Width:", lx,(cy-=19),220,19, &wmd->width, 0.0, 5.0, 0, 0, "Specify the width of the wave");
uiDefButF(block, NUMSLI, B_MODIFIER_RECALC, "Narrow:", lx,(cy-=19),220,19, &wmd->narrow, 0.0, 10.0, 0, 0, "Specify how narrow the wave follows"); uiDefButF(block, NUMSLI, B_MODIFIER_RECALC, "Narrow:", lx,(cy-=19),220,19, &wmd->narrow, 0.0, 10.0, 0, 0, "Specify how narrow the wave follows");
} else if (md->type==eModifierType_Armature) {
ArmatureModifierData *amd = (ArmatureModifierData*) md;
uiDefIDPoinBut(block, modifier_testArmatureObj, B_CHANGEDEP, "Ob: ", lx, (cy-=19), 120,19, &amd->object, "Armature object to deform with");
} else if (md->type==eModifierType_Hook) {
HookModifierData *hmd = (HookModifierData*) md;
uiDefButF(block, NUM, B_MODIFIER_RECALC, "Falloff: ", lx, (cy-=19), 160,19, &hmd->falloff, 0.0, 100.0, 100, 0, "If not zero, the distance from hook where influence ends");
uiDefButF(block, NUMSLI, B_MODIFIER_RECALC, "Force: ", lx, (cy-=19), 160,19, &hmd->force, 0.0, 1.0, 100, 0, "Set relative force of hook");
uiDefIDPoinBut(block, test_obpoin_but, B_CHANGEDEP, "Ob: ", lx, (cy-=19), 160,19, &hmd->object, "Parent Object for hook, also recalculates and clears offset");
but = uiDefBut(block, BUT, B_MODIFIER_RECALC, "Clear offset", lx, (cy-=19), 160,19, NULL, 0.0, 0.0, 0, 0, "Recalculate and clear offset (transform) of hook");
uiButSetFunc(but, modifiers_clearHookOffset, ob, md);
} else if (md->type==eModifierType_Softbody) {
uiDefBut(block, LABEL, 1, "See Softbody panel.", lx, (cy-=19), 160,19, NULL, 0.0, 0.0, 0, 0, "");
} }
uiBlockEndAlign(block); uiBlockEndAlign(block);
@@ -913,9 +973,8 @@ static void editing_panel_modifiers(Object *ob)
ModifierData *md; ModifierData *md;
uiBlock *block; uiBlock *block;
char str[64]; char str[64];
int xco, yco, i, lastCageIndex, cageIndex = modifiers_getCageIndex(&ob->modifiers, &lastCageIndex); int xco, yco, i, lastCageIndex, cageIndex = modifiers_getCageIndex(ob, &lastCageIndex);
// XXX ofsx should probably be changed in other panels here
block= uiNewBlock(&curarea->uiblocks, "editing_panel_modifiers", UI_EMBOSS, UI_HELV, curarea->win); block= uiNewBlock(&curarea->uiblocks, "editing_panel_modifiers", UI_EMBOSS, UI_HELV, curarea->win);
if( uiNewPanel(curarea, block, "Modifiers", "Editing", 640, 0, 318, 204)==0) return; if( uiNewPanel(curarea, block, "Modifiers", "Editing", 640, 0, 318, 204)==0) return;

View File

@@ -1032,60 +1032,6 @@ static void object_panel_draw(Object *ob)
} }
static void object_panel_hooks(Object *ob)
{
uiBlock *block;
ObHook *hook;
int tothook=0, nr, active;
char *cp;
block= uiNewBlock(&curarea->uiblocks, "object_panel_hooks", UI_EMBOSS, UI_HELV, curarea->win);
uiNewPanelTabbed("Draw", "Object");
if(uiNewPanel(curarea, block, "Hooks", "Object", 320, 0, 318, 204)==0) return;
if(ob->hooks.first==NULL) {
uiDefBut(block, LABEL, 0, "Add hooks in Editmode", 10,180,300,19, NULL, 0, 0, 0, 0, "");
return;
}
/* build menu */
for(hook= ob->hooks.first; hook; hook= hook->next) tothook++;
cp= MEM_callocN(32*tothook+32, "temp string");
strcpy(cp, "Active Hook %t|");
for(hook= ob->hooks.first; hook; hook= hook->next) {
strcat(cp, hook->name);
strcat(cp, " |");
}
/* active is stored in first hook */
hook= ob->hooks.first;
if(hook->active<1 || hook->active > tothook) hook->active= 1;
active= hook->active;
uiBlockBeginAlign(block);
uiDefButS(block, MENU, B_REDR, cp, 10,180,150,19, &hook->active, 0, 0, 0, 0, "Set active hook");
MEM_freeN(cp);
for(nr=1, hook= ob->hooks.first; hook; hook= hook->next, nr++) {
if(nr==active) break;
}
if(hook==NULL) printf("error in object_panel_hooks\n");
uiDefBut(block, TEX, B_REDR, "Name: ", 160,180,150,19, hook->name, 0, 31, 0, 0, "Set name of hook");
uiBlockBeginAlign(block);
uiDefButF(block, NUM, B_MAKEDISP, "Falloff: ", 160,140,150,19, &hook->falloff, 0.0, 100.0, 100, 0, "If not zero, the distance from hook where influence ends");
uiDefButF(block, NUMSLI, B_MAKEDISP, "Force: ", 160,120,150,19, &hook->force, 0.0, 1.0, 100, 0, "Set relative force of hook");
uiBlockEndAlign(block);
uiDefIDPoinBut(block, test_obpoin_but, B_CLR_HOOK, "Parent:", 10, 120, 150, 19, &hook->parent, "Parent Object for hook, also recalculates and clears offset");
uiBlockBeginAlign(block);
uiDefBut(block, BUT, B_DEL_HOOK, "Delete", 10,80,150,19, NULL, 0.0, 0.0, 0, 0, "Delete hook");
uiDefBut(block, BUT, B_CLR_HOOK, "Clear offset", 160,80,150,19, NULL, 0.0, 0.0, 0, 0, "Recalculate and clear offset (transform) of hook");
}
static void softbody_bake(Object *ob) static void softbody_bake(Object *ob)
{ {
SoftBody *sb= ob->soft; SoftBody *sb= ob->soft;
@@ -1139,7 +1085,6 @@ static void softbody_bake(Object *ob)
void do_object_panels(unsigned short event) void do_object_panels(unsigned short event)
{ {
Object *ob; Object *ob;
ObHook *hook;
Effect *eff; Effect *eff;
ob= OBACT; ob= OBACT;
@@ -1150,42 +1095,6 @@ void do_object_panels(unsigned short event)
DAG_object_flush_update(G.scene, ob, OB_RECALC_OB); DAG_object_flush_update(G.scene, ob, OB_RECALC_OB);
allqueue(REDRAWVIEW3D, 0); allqueue(REDRAWVIEW3D, 0);
break; break;
case B_DEL_HOOK:
hook= ob->hooks.first;
if(hook) {
int active= hook->active, nr;
for(nr=1, hook=ob->hooks.first; hook; hook=hook->next, nr++) {
if(active==nr) break;
}
if(hook) {
BLI_remlink(&ob->hooks, hook);
if(hook->indexar) MEM_freeN(hook->indexar);
MEM_freeN(hook);
}
freedisplist(&ob->disp);
BIF_undo_push("Delete hook");
allqueue(REDRAWVIEW3D, 0);
allqueue(REDRAWBUTSOBJECT, 0);
}
break;
case B_CLR_HOOK:
hook= ob->hooks.first;
if(hook) {
int active= hook->active, nr;
for(nr=1, hook=ob->hooks.first; hook; hook=hook->next, nr++) {
if(active==nr) break;
}
if(hook && hook->parent) {
Mat4Invert(hook->parent->imat, hook->parent->obmat);
/* apparently this call goes from right to left... */
Mat4MulSerie(hook->parentinv, hook->parent->imat, ob->obmat, NULL,
NULL, NULL, NULL, NULL, NULL);
DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
BIF_undo_push("Clear hook");
allqueue(REDRAWVIEW3D, 0);
}
}
break;
case B_RECALCPATH: case B_RECALCPATH:
DAG_object_flush_update(G.scene, OBACT, OB_RECALC_DATA); DAG_object_flush_update(G.scene, OBACT, OB_RECALC_DATA);
allqueue(REDRAWVIEW3D, 0); allqueue(REDRAWVIEW3D, 0);
@@ -1782,7 +1691,6 @@ void object_panels()
object_panel_anim(ob); object_panel_anim(ob);
object_panel_draw(ob); object_panel_draw(ob);
object_panel_hooks(ob);
object_panel_constraint(); object_panel_constraint();
if(ob->type==OB_MESH) { if(ob->type==OB_MESH) {
object_panel_effects(ob); object_panel_effects(ob);

View File

@@ -58,6 +58,7 @@
#include "DNA_mesh_types.h" #include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h" #include "DNA_meshdata_types.h"
#include "DNA_meta_types.h" #include "DNA_meta_types.h"
#include "DNA_modifier_types.h"
#include "DNA_object_types.h" #include "DNA_object_types.h"
#include "DNA_object_force.h" #include "DNA_object_force.h"
#include "DNA_space_types.h" #include "DNA_space_types.h"
@@ -3387,27 +3388,30 @@ static void drawWireExtra(Object *ob)
/* should be called in view space */ /* should be called in view space */
static void draw_hooks(Object *ob) static void draw_hooks(Object *ob)
{ {
ObHook *hook; ModifierData *md;
float vec[3]; float vec[3];
for(hook= ob->hooks.first; hook; hook= hook->next) { for (md=ob->modifiers.first; md; md=md->next) {
if (md->type==eModifierType_Hook) {
VecMat4MulVecfl(vec, ob->obmat, hook->cent); HookModifierData *hmd = (HookModifierData*) md;
if(hook->parent) {
setlinestyle(3); VecMat4MulVecfl(vec, ob->obmat, hmd->cent);
glBegin(GL_LINES);
glVertex3fv(hook->parent->obmat[3]); if(hmd->object) {
glVertex3fv(vec); setlinestyle(3);
glEnd(); glBegin(GL_LINES);
setlinestyle(0); glVertex3fv(hmd->object->obmat[3]);
glVertex3fv(vec);
glEnd();
setlinestyle(0);
}
glPointSize(3.0);
bglBegin(GL_POINTS);
bglVertex3fv(vec);
bglEnd();
glPointSize(1.0);
} }
glPointSize(3.0);
bglBegin(GL_POINTS);
bglVertex3fv(vec);
bglEnd();
glPointSize(1.0);
} }
} }
@@ -3782,7 +3786,7 @@ void draw_object(Base *base)
ListBase *list; ListBase *list;
/* draw hook center and offset line */ /* draw hook center and offset line */
if(ob->hooks.first && ob!=G.obedit) draw_hooks(ob); if(ob!=G.obedit) draw_hooks(ob);
/* help lines and so */ /* help lines and so */
if(ob!=G.obedit && ob->parent && (ob->parent->lay & G.vd->lay)) { if(ob!=G.obedit && ob->parent && (ob->parent->lay & G.vd->lay)) {

View File

@@ -1995,7 +1995,7 @@ static void add_verts_to_closest_dgroup(Object *ob, Object *par)
mesh = (Mesh*)ob->data; mesh = (Mesh*)ob->data;
/* Is subsurf on? Lets use the verts on the limit surface then */ /* Is subsurf on? Lets use the verts on the limit surface then */
if (modifiers_findByType(&ob->modifiers, eModifierType_Subsurf)) { if (modifiers_findByType(ob, eModifierType_Subsurf)) {
subverts = MEM_mallocN(3*mesh->totvert*sizeof(float), "subverts"); subverts = MEM_mallocN(3*mesh->totvert*sizeof(float), "subverts");
subsurf_calculate_limit_positions(mesh, (void *)subverts); /* (ton) made void*, dunno how to cast */ subsurf_calculate_limit_positions(mesh, (void *)subverts); /* (ton) made void*, dunno how to cast */
} }

View File

@@ -695,7 +695,7 @@ short seg_intersect(EditEdge *e, CutCurve *c, int len)
int i; int i;
short isect=0; short isect=0;
/* Get screen coords of verts (v->xs and v->ys clip if off screen */ /* Get screen coords of verts */
VECCOPY(co, e->v1->co); VECCOPY(co, e->v1->co);
co[3]= 1.0; co[3]= 1.0;
Mat4MulVec4fl(G.obedit->obmat, co); Mat4MulVec4fl(G.obedit->obmat, co);

View File

@@ -1077,8 +1077,6 @@ void fill_mesh(void)
ok= BLI_edgefill(0); ok= BLI_edgefill(0);
/* printf("time: %d\n",(clock()-tijd)/1000); */
if(ok) { if(ok) {
efa= fillfacebase.first; efa= fillfacebase.first;
while(efa) { while(efa) {
@@ -1087,7 +1085,6 @@ void fill_mesh(void)
efa= efa->next; efa= efa->next;
} }
} }
/* else printf("fill error\n"); */
BLI_end_edgefill(); BLI_end_edgefill();
@@ -4436,8 +4433,6 @@ int EdgeSlide(short immediate, float imperc)
tempsv->origvert.no[0] = ev->no[0]; tempsv->origvert.no[0] = ev->no[0];
tempsv->origvert.no[1] = ev->no[1]; tempsv->origvert.no[1] = ev->no[1];
tempsv->origvert.no[2] = ev->no[2]; tempsv->origvert.no[2] = ev->no[2];
tempsv->origvert.xs = ev->xs;
tempsv->origvert.ys = ev->ys;
// i is total edges that vert is on // i is total edges that vert is on
// j is total selected edges that vert is on // j is total selected edges that vert is on

View File

@@ -307,16 +307,16 @@ static int return_editmesh_indexar(int **indexar, float *cent)
return totvert; return totvert;
} }
static void select_editmesh_hook(ObHook *hook) static void select_editmesh_hook(HookModifierData *hmd)
{ {
EditMesh *em = G.editMesh; EditMesh *em = G.editMesh;
EditVert *eve; EditVert *eve;
int index=0, nr=0; int index=0, nr=0;
for(eve= em->verts.first; eve; eve= eve->next, nr++) { for(eve= em->verts.first; eve; eve= eve->next, nr++) {
if(nr==hook->indexar[index]) { if(nr==hmd->indexar[index]) {
eve->f |= SELECT; eve->f |= SELECT;
if(index < hook->totindex-1) index++; if(index < hmd->totindex-1) index++;
} }
} }
EM_select_flush(); EM_select_flush();
@@ -361,7 +361,7 @@ static int return_editlattice_indexar(int **indexar, float *cent)
return totvert; return totvert;
} }
static void select_editlattice_hook(ObHook *hook) static void select_editlattice_hook(HookModifierData *hmd)
{ {
BPoint *bp; BPoint *bp;
int index=0, nr=0, a; int index=0, nr=0, a;
@@ -370,9 +370,9 @@ static void select_editlattice_hook(ObHook *hook)
a= editLatt->pntsu*editLatt->pntsv*editLatt->pntsw; a= editLatt->pntsu*editLatt->pntsv*editLatt->pntsw;
bp= editLatt->def; bp= editLatt->def;
while(a--) { while(a--) {
if(hook->indexar[index]==nr) { if(hmd->indexar[index]==nr) {
bp->f1 |= SELECT; bp->f1 |= SELECT;
if(index < hook->totindex-1) index++; if(index < hmd->totindex-1) index++;
} }
nr++; nr++;
bp++; bp++;
@@ -455,7 +455,7 @@ static int return_editcurve_indexar(int **indexar, float *cent)
return totvert; return totvert;
} }
static void select_editcurve_hook(ObHook *hook) static void select_editcurve_hook(HookModifierData *hmd)
{ {
extern ListBase editNurb; extern ListBase editNurb;
Nurb *nu; Nurb *nu;
@@ -468,19 +468,19 @@ static void select_editcurve_hook(ObHook *hook)
bezt= nu->bezt; bezt= nu->bezt;
a= nu->pntsu; a= nu->pntsu;
while(a--) { while(a--) {
if(nr == hook->indexar[index]) { if(nr == hmd->indexar[index]) {
bezt->f1 |= SELECT; bezt->f1 |= SELECT;
if(index<hook->totindex-1) index++; if(index<hmd->totindex-1) index++;
} }
nr++; nr++;
if(nr == hook->indexar[index]) { if(nr == hmd->indexar[index]) {
bezt->f2 |= SELECT; bezt->f2 |= SELECT;
if(index<hook->totindex-1) index++; if(index<hmd->totindex-1) index++;
} }
nr++; nr++;
if(nr == hook->indexar[index]) { if(nr == hmd->indexar[index]) {
bezt->f3 |= SELECT; bezt->f3 |= SELECT;
if(index<hook->totindex-1) index++; if(index<hmd->totindex-1) index++;
} }
nr++; nr++;
@@ -491,9 +491,9 @@ static void select_editcurve_hook(ObHook *hook)
bp= nu->bp; bp= nu->bp;
a= nu->pntsu*nu->pntsv; a= nu->pntsu*nu->pntsv;
while(a--) { while(a--) {
if(nr == hook->indexar[index]) { if(nr == hmd->indexar[index]) {
bp->f1 |= SELECT; bp->f1 |= SELECT;
if(index<hook->totindex-1) index++; if(index<hmd->totindex-1) index++;
} }
nr++; nr++;
bp++; bp++;
@@ -504,14 +504,15 @@ static void select_editcurve_hook(ObHook *hook)
void add_hook(void) void add_hook(void)
{ {
ModifierData *md = NULL;
HookModifierData *hmd = NULL;
Object *ob=NULL; Object *ob=NULL;
ObHook *hook=NULL;
float cent[3]; float cent[3];
int tot=0, *indexar, mode; int tot=0, *indexar, mode;
if(G.obedit==NULL) return; if(G.obedit==NULL) return;
if(G.obedit->hooks.first) if(modifiers_findByType(G.obedit, eModifierType_Hook))
mode= pupmenu("Hooks %t|Add Hook, To New Empty %x1|Add Hook, To Selected Object %x2|Remove... %x3|Reassign... %x4|Select... %x5|Clear Offset...%x6"); mode= pupmenu("Hooks %t|Add Hook, To New Empty %x1|Add Hook, To Selected Object %x2|Remove... %x3|Reassign... %x4|Select... %x5|Clear Offset...%x6");
else else
mode= pupmenu("Hooks %t|Add, New Empty %x1|Add, To Selected Object %x2"); mode= pupmenu("Hooks %t|Add, New Empty %x1|Add, To Selected Object %x2");
@@ -541,7 +542,10 @@ void add_hook(void)
char *cp; char *cp;
// make pupmenu with hooks // make pupmenu with hooks
for(hook= G.obedit->hooks.first; hook; hook= hook->next) maxlen+=32; for(md=G.obedit->modifiers.first; md; md= md->next) {
if (md->type==eModifierType_Hook)
maxlen+=32;
}
if(maxlen==0) { if(maxlen==0) {
error("Object has no hooks yet"); error("Object has no hooks yet");
@@ -554,9 +558,11 @@ void add_hook(void)
else if(mode==5) strcpy(cp, "Select %t|"); else if(mode==5) strcpy(cp, "Select %t|");
else if(mode==6) strcpy(cp, "Clear Offset %t|"); else if(mode==6) strcpy(cp, "Clear Offset %t|");
for(hook= G.obedit->hooks.first; hook; hook= hook->next) { for(md=G.obedit->modifiers.first; md; md= md->next) {
strcat(cp, hook->name); if (md->type==eModifierType_Hook) {
strcat(cp, " |"); strcat(cp, md->name);
strcat(cp, " |");
}
} }
nr= pupmenu(cp); nr= pupmenu(cp);
@@ -565,10 +571,15 @@ void add_hook(void)
if(nr<1) return; if(nr<1) return;
a= 1; a= 1;
for(hook= G.obedit->hooks.first; hook; hook= hook->next, a++) { for(md=G.obedit->modifiers.first; md; md=md->next) {
if(a==nr) break; if (md->type==eModifierType_Hook) {
if(a==nr) break;
a++;
}
} }
ob= hook->parent;
hmd = (HookModifierData*) md;
ob= hmd->object;
} }
/* do it, new hooks or reassign */ /* do it, new hooks or reassign */
@@ -611,17 +622,16 @@ void add_hook(void)
/* new hook */ /* new hook */
if(mode==1 || mode==2) { if(mode==1 || mode==2) {
hook= MEM_callocN(sizeof(ObHook), "new hook"); hmd = (HookModifierData*) modifier_new(eModifierType_Hook);
BLI_addtail(&G.obedit->hooks, hook); BLI_addtail(&G.obedit->modifiers, &hmd); // XXX, ordering
strncpy(hook->name, ob->id.name+2, 30); sprintf("Hook-%s", hmd->modifier.name, ob->id.name+2);
hook->force= 1.0;
} }
else MEM_freeN(hook->indexar); // reassign, hook was set else if (hmd->indexar) MEM_freeN(hmd->indexar); // reassign, hook was set
hook->parent= ob; hmd->object= ob;
hook->indexar= indexar; hmd->indexar= indexar;
VECCOPY(hook->cent, cent); VECCOPY(hmd->cent, cent);
hook->totindex= tot; hmd->totindex= tot;
if(mode==1 || mode==2) { if(mode==1 || mode==2) {
/* matrix calculus */ /* matrix calculus */
@@ -632,28 +642,27 @@ void add_hook(void)
Mat4Invert(ob->imat, ob->obmat); Mat4Invert(ob->imat, ob->obmat);
/* apparently this call goes from right to left... */ /* apparently this call goes from right to left... */
Mat4MulSerie(hook->parentinv, ob->imat, G.obedit->obmat, NULL, Mat4MulSerie(hmd->parentinv, ob->imat, G.obedit->obmat, NULL,
NULL, NULL, NULL, NULL, NULL); NULL, NULL, NULL, NULL, NULL);
} }
} }
} }
else if(mode==3) { // remove else if(mode==3) { // remove
BLI_remlink(&G.obedit->hooks, hook); BLI_remlink(&G.obedit->modifiers, md);
MEM_freeN(hook->indexar); modifier_free(md);
MEM_freeN(hook);
} }
else if(mode==5) { // select else if(mode==5) { // select
if(G.obedit->type==OB_MESH) select_editmesh_hook(hook); if(G.obedit->type==OB_MESH) select_editmesh_hook(hmd);
else if(G.obedit->type==OB_LATTICE) select_editlattice_hook(hook); else if(G.obedit->type==OB_LATTICE) select_editlattice_hook(hmd);
else if(G.obedit->type==OB_CURVE) select_editcurve_hook(hook); else if(G.obedit->type==OB_CURVE) select_editcurve_hook(hmd);
else if(G.obedit->type==OB_SURF) select_editcurve_hook(hook); else if(G.obedit->type==OB_SURF) select_editcurve_hook(hmd);
} }
else if(mode==6) { // clear offset else if(mode==6) { // clear offset
where_is_object(ob); // ob is hook->parent where_is_object(ob); // ob is hook->parent
Mat4Invert(ob->imat, ob->obmat); Mat4Invert(ob->imat, ob->obmat);
/* this call goes from right to left... */ /* this call goes from right to left... */
Mat4MulSerie(hook->parentinv, ob->imat, G.obedit->obmat, NULL, Mat4MulSerie(hmd->parentinv, ob->imat, G.obedit->obmat, NULL,
NULL, NULL, NULL, NULL, NULL); NULL, NULL, NULL, NULL, NULL);
} }
@@ -2318,7 +2327,7 @@ void convertmenu(void)
*/ */
void flip_subdivison(Object *ob, int level) void flip_subdivison(Object *ob, int level)
{ {
ModifierData *md = modifiers_findByType(&ob->modifiers, eModifierType_Subsurf); ModifierData *md = modifiers_findByType(ob, eModifierType_Subsurf);
if (md) { if (md) {
SubsurfModifierData *smd = (SubsurfModifierData*) md; SubsurfModifierData *smd = (SubsurfModifierData*) md;
@@ -2464,6 +2473,8 @@ static void copymenu_modifiers(Object *ob)
for (i=eModifierType_None+1; i<NUM_MODIFIER_TYPES; i++) { for (i=eModifierType_None+1; i<NUM_MODIFIER_TYPES; i++) {
ModifierTypeInfo *mti = modifierType_getInfo(i); ModifierTypeInfo *mti = modifierType_getInfo(i);
if (i==eModifierType_Hook) continue;
if ( (mti->flags&eModifierTypeFlag_AcceptsCVs) || if ( (mti->flags&eModifierTypeFlag_AcceptsCVs) ||
(ob->type==OB_MESH && (mti->flags&eModifierTypeFlag_AcceptsMesh))) { (ob->type==OB_MESH && (mti->flags&eModifierTypeFlag_AcceptsMesh))) {
sprintf(str+strlen(str), "|%s%%x%d", mti->name, i); sprintf(str+strlen(str), "|%s%%x%d", mti->name, i);
@@ -2485,15 +2496,17 @@ static void copymenu_modifiers(Object *ob)
object_free_modifiers(base->object); object_free_modifiers(base->object);
for (md=ob->modifiers.first; md; md=md->next) { for (md=ob->modifiers.first; md; md=md->next) {
ModifierData *nmd = modifier_new(md->type); if (md->type!=eModifierType_Hook) {
modifier_copyData(md, nmd); ModifierData *nmd = modifier_new(md->type);
BLI_addtail(&base->object->modifiers, nmd); modifier_copyData(md, nmd);
BLI_addtail(&base->object->modifiers, nmd);
}
} }
} else { } else {
ModifierData *md = modifiers_findByType(&ob->modifiers, event); ModifierData *md = modifiers_findByType(ob, event);
if (md) { if (md) {
ModifierData *tmd = modifiers_findByType(&base->object->modifiers, event); ModifierData *tmd = modifiers_findByType(base->object, event);
if (!tmd) { if (!tmd) {
tmd = modifier_new(event); tmd = modifier_new(event);
@@ -2727,10 +2740,10 @@ void copy_attr(short event)
} }
else if(event==21){ else if(event==21){
if (base->object->type==OB_MESH) { if (base->object->type==OB_MESH) {
ModifierData *md = modifiers_findByType(&ob->modifiers, eModifierType_Subsurf); ModifierData *md = modifiers_findByType(ob, eModifierType_Subsurf);
if (md) { if (md) {
ModifierData *tmd = modifiers_findByType(&base->object->modifiers, eModifierType_Subsurf); ModifierData *tmd = modifiers_findByType(base->object, eModifierType_Subsurf);
if (!tmd) { if (!tmd) {
tmd = modifier_new(eModifierType_Subsurf); tmd = modifier_new(eModifierType_Subsurf);
@@ -3444,6 +3457,10 @@ void rightmouse_transform(void)
/* ************************************** */ /* ************************************** */
static void single_object_users__forwardModifierLinks(void *userData, Object *ob, Object **obpoin)
{
ID_NEW(*obpoin);
}
void single_object_users(int flag) void single_object_users(int flag)
{ {
Base *base; Base *base;
@@ -3485,17 +3502,10 @@ void single_object_users(int flag)
relink_constraints(&chan->constraints); relink_constraints(&chan->constraints);
} }
} }
if(base->object->hooks.first) { modifiers_foreachObjectLink(base->object, single_object_users__forwardModifierLinks, NULL);
ObHook *hook= base->object->hooks.first;
while(hook) {
ID_NEW(hook->parent);
hook= hook->next;
}
}
ID_NEW(ob->parent); ID_NEW(ob->parent);
ID_NEW(ob->track); ID_NEW(ob->track);
} }
} }
base= base->next; base= base->next;
@@ -4012,7 +4022,10 @@ void make_local(void)
BIF_undo_push("Make local"); BIF_undo_push("Make local");
} }
static void adduplicate__forwardModifierLinks(void *userData, Object *ob, Object **obpoin)
{
ID_NEW(*obpoin);
}
void adduplicate(int noTrans) void adduplicate(int noTrans)
/* dtrans is 3 x 3xfloat dloc, drot en dsize */ /* dtrans is 3 x 3xfloat dloc, drot en dsize */
{ {
@@ -4206,7 +4219,6 @@ void adduplicate(int noTrans)
base= FIRSTBASE; base= FIRSTBASE;
while(base) { while(base) {
if TESTBASELIB(base) { if TESTBASELIB(base) {
relink_constraints(&base->object->constraints); relink_constraints(&base->object->constraints);
if (base->object->pose){ if (base->object->pose){
bPoseChannel *chan; bPoseChannel *chan;
@@ -4214,13 +4226,7 @@ void adduplicate(int noTrans)
relink_constraints(&chan->constraints); relink_constraints(&chan->constraints);
} }
} }
if(base->object->hooks.first) { modifiers_foreachObjectLink(base->object, adduplicate__forwardModifierLinks, NULL);
ObHook *hook= base->object->hooks.first;
while(hook) {
ID_NEW(hook->parent);
hook= hook->next;
}
}
ID_NEW(base->object->parent); ID_NEW(base->object->parent);
ID_NEW(base->object->track); ID_NEW(base->object->track);

View File

@@ -47,6 +47,7 @@
#include "DNA_material_types.h" #include "DNA_material_types.h"
#include "DNA_mesh_types.h" #include "DNA_mesh_types.h"
#include "DNA_meta_types.h" #include "DNA_meta_types.h"
#include "DNA_modifier_types.h"
#include "DNA_nla_types.h" #include "DNA_nla_types.h"
#include "DNA_object_types.h" #include "DNA_object_types.h"
#include "DNA_oops_types.h" #include "DNA_oops_types.h"
@@ -65,6 +66,7 @@
#include "BKE_library.h" #include "BKE_library.h"
#include "BKE_main.h" #include "BKE_main.h"
#include "BKE_material.h" #include "BKE_material.h"
#include "BKE_modifier.h"
#include "BKE_screen.h" #include "BKE_screen.h"
#include "BKE_utildefines.h" #include "BKE_utildefines.h"
@@ -367,7 +369,6 @@ static void outliner_sort(SpaceOops *soops, ListBase *lb)
static void outliner_add_bone(SpaceOops *soops, ListBase *lb, static void outliner_add_bone(SpaceOops *soops, ListBase *lb,
ID *id, Bone *curBone, TreeElement *parent, int *a); ID *id, Bone *curBone, TreeElement *parent, int *a);
static TreeElement *outliner_add_element(SpaceOops *soops, ListBase *lb, void *idv, static TreeElement *outliner_add_element(SpaceOops *soops, ListBase *lb, void *idv,
TreeElement *parent, short type, short index) TreeElement *parent, short type, short index)
{ {
@@ -502,16 +503,25 @@ static TreeElement *outliner_add_element(SpaceOops *soops, ListBase *lb, void *i
} }
} }
if(ob->hooks.first) { if(ob->modifiers.first) {
ObHook *hook; ModifierData *md;
TreeElement *ten; TreeElement *temod = outliner_add_element(soops, &te->subtree, ob, te, TSE_MODIFIER_BASE, 0);
TreeElement *tenla= outliner_add_element(soops, &te->subtree, ob, te, TSE_HOOKS_BASE, 0); int index;
int a= 0;
for (index=0,md=ob->modifiers.first; md; index++,md=md->next) {
tenla->name= "Hooks"; ModifierTypeInfo *mti = modifierType_getInfo(md->type);
for(hook=ob->hooks.first; hook; hook= hook->next, a++) { TreeElement *te = outliner_add_element(soops, &temod->subtree, ob, temod, TSE_MODIFIER, index);
ten= outliner_add_element(soops, &tenla->subtree, hook->parent, tenla, TSE_HOOK, a); if(te) te->name= md->name;
if(ten) ten->name= hook->name;
if (md->type==eModifierType_Lattice) {
outliner_add_element(soops, &te->subtree, ((LatticeModifierData*) md)->object, te, TSE_MODIFIER_OB, 0);
} else if (md->type==eModifierType_Curve) {
outliner_add_element(soops, &te->subtree, ((CurveModifierData*) md)->object, te, TSE_MODIFIER_OB, 0);
} else if (md->type==eModifierType_Armature) {
outliner_add_element(soops, &te->subtree, ((ArmatureModifierData*) md)->object, te, TSE_MODIFIER_OB, 0);
} else if (md->type==eModifierType_Hook) {
outliner_add_element(soops, &te->subtree, ((HookModifierData*) md)->object, te, TSE_MODIFIER_OB, 0);
}
} }
} }
if(ob->defbase.first) { if(ob->defbase.first) {
@@ -1298,6 +1308,14 @@ static int tree_element_active_ebone(TreeElement *te, TreeStoreElem *tselem, int
return 0; return 0;
} }
static int tree_element_active_modifier(TreeElement *te, TreeStoreElem *tselem, int set)
{
if(set) {
extern_set_butspace(F9KEY);
}
return 0;
}
static int tree_element_active_text(SpaceOops *soops, TreeElement *te, int set) static int tree_element_active_text(SpaceOops *soops, TreeElement *te, int set)
{ {
@@ -1369,7 +1387,9 @@ static int tree_element_type_active(SpaceOops *soops, TreeElement *te, TreeStore
return tree_element_active_bone(te, tselem, set); return tree_element_active_bone(te, tselem, set);
case TSE_EBONE: case TSE_EBONE:
return tree_element_active_ebone(te, tselem, set); return tree_element_active_ebone(te, tselem, set);
case TSE_HOOK: // actually object case TSE_MODIFIER:
return tree_element_active_modifier(te, tselem, set);
case TSE_MODIFIER_OB:
if(set) tree_element_active_object(soops, te); if(set) tree_element_active_object(soops, te);
else if(tselem->id==(ID *)OBACT) return 1; else if(tselem->id==(ID *)OBACT) return 1;
break; break;
@@ -1417,7 +1437,7 @@ static int do_outliner_mouse_event(SpaceOops *soops, TreeElement *te, short even
/* activate a name button? */ /* activate a name button? */
if(G.qual & LR_CTRLKEY) { if(G.qual & LR_CTRLKEY) {
if(ELEM5(tselem->type, TSE_NLA, TSE_DEFGROUP_BASE, TSE_CONSTRAINT_BASE, TSE_HOOKS_BASE, TSE_SCRIPT_BASE)) if(ELEM5(tselem->type, TSE_NLA, TSE_DEFGROUP_BASE, TSE_CONSTRAINT_BASE, TSE_MODIFIER_BASE, TSE_SCRIPT_BASE))
error("Cannot edit builtin name"); error("Cannot edit builtin name");
else { else {
tselem->flag |= TSE_TEXTBUT; tselem->flag |= TSE_TEXTBUT;
@@ -1903,9 +1923,9 @@ static void tselem_draw_icon(float x, float y, TreeStoreElem *tselem)
BIF_draw_icon(x, y, ICON_WPAINT_DEHLT); break; BIF_draw_icon(x, y, ICON_WPAINT_DEHLT); break;
case TSE_CONSTRAINT_BASE: case TSE_CONSTRAINT_BASE:
BIF_draw_icon(x, y, ICON_CONSTRAINT); break; BIF_draw_icon(x, y, ICON_CONSTRAINT); break;
case TSE_HOOKS_BASE: case TSE_MODIFIER_BASE:
BIF_draw_icon(x, y, ICON_HOOK); break; BIF_draw_icon(x, y, ICON_HOOK); break;
case TSE_HOOK: case TSE_MODIFIER_OB:
BIF_draw_icon(x, y, ICON_OBJECT); break; BIF_draw_icon(x, y, ICON_OBJECT); break;
case TSE_SCRIPT_BASE: case TSE_SCRIPT_BASE:
BIF_draw_icon(x, y, ICON_TEXT); break; BIF_draw_icon(x, y, ICON_TEXT); break;
@@ -2326,15 +2346,14 @@ static void outliner_buttons(uiBlock *block, SpaceOops *soops, ListBase *lb)
tselem= TREESTORE(te); tselem= TREESTORE(te);
if(tselem->flag & TSE_TEXTBUT) { if(tselem->flag & TSE_TEXTBUT) {
if(tselem->type==TSE_EBONE) { if(tselem->type==TSE_EBONE) len = sizeof(((EditBone*) 0)->name);
len= 32; else if (tselem->type==TSE_MODIFIER) len = sizeof(((ModifierData*) 0)->name);
} else len= sizeof(((ID*) 0)->name)-2;
else len= 19;
dx= BIF_GetStringWidth(G.font, te->name, 0); dx= BIF_GetStringWidth(G.font, te->name, 0);
if(dx<50) dx= 50; if(dx<50) dx= 50;
bt= uiDefBut(block, TEX, OL_NAMEBUTTON, "", te->xs+2*OL_X-4, te->ys, dx+10, OL_H-1, te->name, 1.0, (float)len, 0, 0, ""); bt= uiDefBut(block, TEX, OL_NAMEBUTTON, "", te->xs+2*OL_X-4, te->ys, dx+10, OL_H-1, te->name, 1.0, (float)len-1, 0, 0, "");
uiButSetFunc(bt, namebutton_cb, soops, NULL); uiButSetFunc(bt, namebutton_cb, soops, NULL);
// signal for button to open // signal for button to open