Adding initial SimpleModifier (bend,taper,twist)
authorAndre Susano Pinto <andresusanopinto@gmail.com>
Tue, 24 Jun 2008 12:04:27 +0000 (12:04 +0000)
committerAndre Susano Pinto <andresusanopinto@gmail.com>
Tue, 24 Jun 2008 12:04:27 +0000 (12:04 +0000)
(I might only touch this code again late on the week :S, so here is a tmp commit)

source/blender/blenkernel/BKE_simple_deform.h [new file with mode: 0644]
source/blender/blenkernel/intern/modifier.c
source/blender/blenkernel/intern/simple_deform.c [new file with mode: 0644]
source/blender/makesdna/DNA_modifier_types.h
source/blender/src/buttons_editing.c

diff --git a/source/blender/blenkernel/BKE_simple_deform.h b/source/blender/blenkernel/BKE_simple_deform.h
new file mode 100644 (file)
index 0000000..b2737a2
--- /dev/null
@@ -0,0 +1,40 @@
+/**
+ * BKE_shrinkwrap.h
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) Blender Foundation.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): none yet.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+#ifndef BKE_SIMPLE_DEFORM_H
+#define BKE_SIMPLE_DEFORM_H
+
+struct Object;
+struct DerivedMesh;
+struct SimpleDeformModifierData;
+
+/* struct DerivedMesh *simpledeformModifier_do(struct SimpleDeformModifierData *smd, struct Object *ob, struct DerivedMesh *dm, int useRenderParams, int isFinalCalc); */
+void SimpleDeformModifier_do(SimpleDeformModifierData *smd, float (*vertexCos)[3], int numVerts);
+
+#endif
+
index c5d98dd96557aff2121ea2378c0f97a664bfa8e5..4266b55903009b1ce3cbc6eee1c21347e16482e1 100644 (file)
@@ -7279,6 +7279,50 @@ static void shrinkwrapModifier_updateDepgraph(ModifierData *md, DagForest *fores
                dag_add_relation(forest, dag_get_node(forest, smd->cutPlane), obNode, DAG_RL_OB_DATA | DAG_RL_DATA_DATA, "Shrinkwrap Modifier");
 }
 
+/* SimpleDeform */
+static void simpledeformModifier_initData(ModifierData *md)
+{
+       SimpleDeformModifierData *smd = (SimpleDeformModifierData*) md;
+
+       smd->mode = 0;
+       smd->origin = 0;
+       smd->factor[0] = 1.0;
+}
+
+static void simpledeformModifier_copyData(ModifierData *md, ModifierData *target)
+{
+       SimpleDeformModifierData *smd  = (SimpleDeformModifierData*)md;
+       SimpleDeformModifierData *tsmd = (SimpleDeformModifierData*)target;
+
+       tsmd->mode      = smd->mode;
+       tsmd->origin= smd->origin;
+       memcpy(tsmd->factor, smd->factor, sizeof(tsmd->factor));
+}
+
+static void simpledeformModifier_deformVerts(ModifierData *md, Object *ob, DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts)
+{
+       SimpleDeformModifier_do((SimpleDeformModifierData*)md, vertexCos, numVerts);
+}
+
+static void simpledeformModifier_deformVertsEM(ModifierData *md, Object *ob, EditMesh *editData, DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts)
+{
+       SimpleDeformModifier_do((SimpleDeformModifierData*)md, vertexCos, numVerts);
+}
+
+static void simpledeformModifier_foreachObjectLink(ModifierData *md, Object *ob, void (*walk)(void *userData, Object *ob, Object **obpoin), void *userData)
+{
+       SimpleDeformModifierData *smd  = (SimpleDeformModifierData*)md;
+       walk(userData, ob, &smd->origin);
+}
+
+static void simpledeformModifier_updateDepgraph(ModifierData *md, DagForest *forest, Object *ob, DagNode *obNode)
+{
+       SimpleDeformModifierData *smd  = (SimpleDeformModifierData*)md;
+
+       if (smd->origin)
+               dag_add_relation(forest, dag_get_node(forest, smd->origin), obNode, DAG_RL_OB_DATA, "SimpleDeform Modifier");
+}
+
 
 /***/
 
@@ -7615,6 +7659,19 @@ ModifierTypeInfo *modifierType_getInfo(ModifierType type)
                mti->applyModifierEM = shrinkwrapModifier_applyModifierEM;
                mti->updateDepgraph = shrinkwrapModifier_updateDepgraph;
 
+               mti = INIT_TYPE(SimpleDeform);
+               mti->type = eModifierTypeType_OnlyDeform;
+               mti->flags = eModifierTypeFlag_AcceptsMesh
+                               | eModifierTypeFlag_SupportsEditmode
+                               | eModifierTypeFlag_EnableInEditmode;
+               mti->initData = simpledeformModifier_initData;
+               mti->copyData = simpledeformModifier_copyData;
+               mti->deformVerts = simpledeformModifier_deformVerts;
+               mti->deformVertsEM = simpledeformModifier_deformVertsEM;
+               mti->foreachObjectLink = simpledeformModifier_foreachObjectLink;
+               mti->updateDepgraph = simpledeformModifier_updateDepgraph;
+
+
                typeArrInit = 0;
 #undef INIT_TYPE
        }
diff --git a/source/blender/blenkernel/intern/simple_deform.c b/source/blender/blenkernel/intern/simple_deform.c
new file mode 100644 (file)
index 0000000..e78e73a
--- /dev/null
@@ -0,0 +1,118 @@
+/**
+ * deform_simple.c
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) Blender Foundation.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): AndrĂ© Pinto
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+#include "DNA_object_types.h"
+#include "DNA_modifier_types.h"
+#include "DNA_meshdata_types.h"
+
+#include "BKE_simple_deform.h"
+#include "BKE_DerivedMesh.h"
+#include "BLI_arithb.h"
+
+#include <string.h>
+#include <math.h>
+
+
+static void simpleDeform_tapper(const float factor, float *co)
+{
+       float x = co[0], y = co[1], z = co[2];
+
+       co[0] = x*(1.0f + z*factor);
+       co[1] = y;
+       co[2] = z;
+}
+
+
+static void simpleDeform_twist(const float factor, float *co)
+{
+       float x = co[0], y = co[1], z = co[2];
+
+       float theta = z*factor;
+       float sint = sin(theta);
+       float cost = cos(theta);
+
+       co[0] = x*cost - y*sint;
+       co[1] = x*sint + y*cost;
+       co[2] = z;
+}
+
+static void simpleDeform_bend(const float factor, float *co)
+{
+       float x = co[0], y = co[1], z = co[2];
+
+       float x0 = 0.0f;
+       float theta = (x - x0)*factor;
+       float sint = sin(theta);
+       float cost = cos(theta);
+
+       co[0] = -sint*(y-1.0f/factor) + x0;
+       co[1] =  cost*(y-1.0f/factor) + 1.0f/factor;
+       co[2] =  z;
+}
+
+static void simpleDeform_shear(const float factor, float *co)
+{
+       float x = co[0], y = co[1], z = co[2];
+
+       co[0] = x + factor;
+       co[1] = y;
+       co[2] = z;
+}
+
+/* simple deform modifier */
+void SimpleDeformModifier_do(SimpleDeformModifierData *smd, float (*vertexCos)[3], int numVerts)
+{
+       float (*ob2mod)[4] = NULL, (*mod2ob)[4] = NULL;
+       if(smd->origin)
+       {
+               Mat4Invert(smd->origin->imat, smd->origin->obmat);      //inverse is outdated
+
+               ob2mod = smd->origin->imat;
+               mod2ob = smd->origin->obmat;
+       }
+
+
+       for(; numVerts; numVerts--, vertexCos++)
+       {
+               if(ob2mod)
+                       Mat4MulVecfl(ob2mod, *vertexCos);
+
+               switch(smd->mode)
+               {
+                       case 0: simpleDeform_tapper     (smd->factor[0], *vertexCos); break;
+                       case 1: simpleDeform_twist      (smd->factor[0], *vertexCos); break;
+                       case 2: simpleDeform_bend       (smd->factor[0], *vertexCos); break;
+                       case 3: simpleDeform_shear      (smd->factor[0], *vertexCos); break;
+               }
+
+               if(mod2ob)
+                       Mat4MulVecfl(mod2ob, *vertexCos);
+       }
+}
+
+
index c960a78aefab1630e25fd724399054ee92810d2f..d938979d1ec26dfdf9a1a16d336161cb5f82a6f8 100644 (file)
@@ -36,6 +36,7 @@ typedef enum ModifierType {
        eModifierType_Collision,
        eModifierType_Bevel,
        eModifierType_Shrinkwrap,
+       eModifierType_SimpleDeform,
        NUM_MODIFIER_TYPES
 } ModifierType;
 
@@ -518,4 +519,14 @@ typedef struct ShrinkwrapModifierData {
 #define MOD_SHRINKWRAP_CULL_TARGET_FRONTFACE   (1<<3)
 #define MOD_SHRINKWRAP_CULL_TARGET_BACKFACE            (1<<4)
 
+typedef struct SimpleDeformModifierData {
+       ModifierData modifier;
+
+       struct Object *origin;  /* object to control the origin of modifier space coordinates */
+       float factor[4];                /* factors to control simple deforms */
+       char mode;
+       char pad[7];
+
+} SimpleDeformModifierData;
+
 #endif
index bdf22dfe8d8c01cf25962db3821a527b38c7c9b5..011da0524e2c55569239dea79a2f71414d94d07a 100644 (file)
@@ -1831,6 +1831,8 @@ static void draw_modifier(uiBlock *block, Object *ob, ModifierData *md, int *xco
                        height = 86;
                        if (smd->shrinkType == MOD_SHRINKWRAP_NORMAL)
                                height += 19*7;
+               } else if (md->type==eModifierType_SimpleDeform) {
+                               height += 19*2;
                }
                                                        /* roundbox 4 free variables: corner-rounding, nop, roundbox type, shade */
                uiDefBut(block, ROUNDBOX, 0, "", x-10, y-height-2, width, height-2, NULL, 5.0, 0.0, 12, 40, ""); 
@@ -2474,8 +2476,16 @@ static void draw_modifier(uiBlock *block, Object *ob, ModifierData *md, int *xco
                        uiDefIDPoinBut(block, modifier_testMeshObj, ID_OB, B_CHANGEDEP, "Ob: ", lx, (cy-=19), buttonWidth,19, &smd->target, "Target to shrink to");
                        uiDefButF(block, NUM, B_MODIFIER_RECALC, "Offset:",     lx,(cy-=19),buttonWidth,19, &smd->keptDist, 0.0f, 100.0f, 1.0f, 0, "Specify distance to kept from the target");
                        uiBlockEndAlign(block);
+               } else if (md->type==eModifierType_SimpleDeform) {
+                       SimpleDeformModifierData *smd = (SimpleDeformModifierData*) md;
+                       char simpledeform_typemenu[]="Deform type%t|Taper %x0|Twist %x1|Bend %x2|Shear %x3";
+
+                       uiDefButS(block, MENU, B_MODIFIER_RECALC, simpledeform_typemenu, lx,(cy-=19),buttonWidth,19, &smd->mode, 0, 0, 0, 0, "Selects type of deform");
+                       uiDefIDPoinBut(block, test_obpoin_but, ID_OB, B_CHANGEDEP, "Ob: ",      lx, (cy-=19), buttonWidth,19, &smd->origin, "Origin of modifier space coordinates");
+                       uiDefButF(block, NUM, B_MODIFIER_RECALC, "Factor:",     lx,(cy-=19),buttonWidth,19, &smd->factor[0], -1000.0f, 1000.0f, 1.0f, 0, "Deform Factor");
                }
 
+
                uiBlockEndAlign(block);
 
                y-=height;