Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohnny Matthews <johnny.matthews@gmail.com>2005-07-19 19:37:18 +0400
committerJohnny Matthews <johnny.matthews@gmail.com>2005-07-19 19:37:18 +0400
commitb344db3670fe2a82e0503d4cc2494386ede41fa3 (patch)
tree42c45a4d877f4c8544885571f96ca9949b839a69 /source/blender
parent8d2d045079d7f9de0cd3e7760cdac80393bba308 (diff)
First step towards restoring / improving subdivide 'beauty'.
Beauty button now is Beauty and Short. Works as follows Beauty on: If a face is selected, only subdivide the longest 2 sides Beauty & Short on: If a face is selected, only subdivide the shortest 2 sides 1 problem atm is when more than 2 sides are equal. Must add code to check for this and disable beauty on that face. Use with caution! :) Also restoring selection needs to be tweaked here. Side Note: for most accurate subdividing, use edge mode and select only the edges you wish to cut rather than relying on beauty.
Diffstat (limited to 'source/blender')
-rw-r--r--source/blender/include/blendef.h1
-rw-r--r--source/blender/src/buttons_editing.c4
-rw-r--r--source/blender/src/editmesh_tools.c75
3 files changed, 77 insertions, 3 deletions
diff --git a/source/blender/include/blendef.h b/source/blender/include/blendef.h
index 05683697b05..bd512516d55 100644
--- a/source/blender/include/blendef.h
+++ b/source/blender/include/blendef.h
@@ -383,6 +383,7 @@
#define B_KEEPORIG 2
#define B_BEAUTY 4
#define B_SMOOTH 8
+#define B_BEAUTY_SHORT 16
#define B_KNIFE 0x80
#define B_PERCENTSUBD 0x40
diff --git a/source/blender/src/buttons_editing.c b/source/blender/src/buttons_editing.c
index 4a14fbbd21f..f437752a677 100644
--- a/source/blender/src/buttons_editing.c
+++ b/source/blender/src/buttons_editing.c
@@ -2167,7 +2167,9 @@ static void editing_panel_mesh_tools(Object *ob, Mesh *me)
if(uiNewPanel(curarea, block, "Mesh Tools", "Editing", 640, 0, 318, 204)==0) return;
uiBlockBeginAlign(block);
- uiDefButS(block, TOG|BIT|2, 0, "Beauty", 10,195,80,19, &editbutflag, 0, 0, 0, 0, "Causes 'Subdivide' to split faces in halves instead of quarters");
+ uiDefButS(block, TOG|BIT|2, 0, "Beauty", 10,195,40,19, &editbutflag, 0, 0, 0, 0, "Causes 'Subdivide' to split faces in halves instead of quarters using Long Edges Unless short is selected");
+ uiDefButS(block, TOG|BIT|4, 0, "Short", 50,195,40,19, &editbutflag, 0, 0, 0, 0, "Causes 'Subdivide' to split faces in halves instead of quarters using Short Edges");
+
uiDefBut(block, BUT,B_SUBDIV,"Subdivide", 90,195,80,19, 0, 0, 0, 0, 0, "Splits selected faces into halves or quarters");
uiDefBut(block, BUT,B_FRACSUBDIV, "Fract Subd", 170,195,85,19, 0, 0, 0, 0, 0, "Subdivides selected faces with a random factor");
diff --git a/source/blender/src/editmesh_tools.c b/source/blender/src/editmesh_tools.c
index c1123185a33..5f7b7e25bbe 100644
--- a/source/blender/src/editmesh_tools.c
+++ b/source/blender/src/editmesh_tools.c
@@ -1105,6 +1105,7 @@ void fill_mesh(void)
/*--------------Edge Based Subdivide------------------*/
#define EDGENEW 2
+#define FACENEW 2
#define EDGEINNER 4
static void alter_co(float* co,EditEdge *edge,float rad,int beauty)
@@ -2026,10 +2027,11 @@ void esubdivideflag(int flag, float rad, int beauty, int numcuts, int seltype)
{
EditMesh *em = G.editMesh;
EditFace *ef;
- EditEdge *eed, *cedge;
+ EditEdge *eed, *cedge, *sort[4];
EditVert **templist;
struct GHash *gh;
- int i,edgecount,facetype;
+ int i,j,edgecount,facetype,hold;
+ float length[4];
//Set faces f1 to 0 cause we need it later
@@ -2046,6 +2048,71 @@ void esubdivideflag(int flag, float rad, int beauty, int numcuts, int seltype)
// We store an array of verts for each edge that is subdivided,
// we put this array as a value in a ghash which is keyed by the EditEdge*
+ // Now for beauty subdivide deselect edges based on length
+ if(beauty & B_BEAUTY){
+ for(ef = em->faces.first;ef;ef = ef->next){
+ if(!ef->v4){
+ continue;
+ }
+ if(ef->f & SELECT){
+ length[0] = VecLenf(ef->e1->v1->co,ef->e1->v2->co);
+ length[1] = VecLenf(ef->e2->v1->co,ef->e2->v2->co);
+ length[2] = VecLenf(ef->e3->v1->co,ef->e3->v2->co);
+ length[3] = VecLenf(ef->e4->v1->co,ef->e4->v2->co);
+ sort[0] = ef->e1;
+ sort[1] = ef->e2;
+ sort[2] = ef->e3;
+ sort[3] = ef->e4;
+
+
+ // Beauty Short Edges
+ if(beauty & B_BEAUTY_SHORT){
+ for(j=0;j<2;j++){
+ hold = -1;
+ for(i=0;i<4;i++){
+ if(length[i] < 0){
+ continue;
+ } else if(hold == -1){
+ hold = i;
+ } else {
+ if(length[hold] < length[i]){
+ hold = i;
+ }
+ }
+ }
+ sort[hold]->f &= ~SELECT;
+ sort[hold]->f2 |= EDGENEW;
+ length[hold] = -1;
+ }
+ }
+
+ // Beauty Long Edges
+ else {
+ for(j=0;j<2;j++){
+ hold = -1;
+ for(i=0;i<4;i++){
+ if(length[i] < 0){
+ continue;
+ } else if(hold == -1){
+ hold = i;
+ } else {
+ if(length[hold] > length[i]){
+ hold = i;
+ }
+ }
+ }
+ sort[hold]->f &= ~SELECT;
+ sort[hold]->f2 |= EDGENEW;
+ length[hold] = -1;
+ }
+ }
+ }
+ }
+ }
+
+
+
+
gh = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp);
// If we are knifing, We only need the selected edges that were cut, so deselect if it was not cut
@@ -2080,6 +2147,10 @@ void esubdivideflag(int flag, float rad, int beauty, int numcuts, int seltype)
}
}
vertexnormals(0);
+
+
+
+
// Now for each face in the mesh we need to figure out How many edges were cut
// and which filling method to use for that face
for(ef = em->faces.first;ef;ef = ef->next){